xref: /wlan-driver/qcacld-3.0/core/mac/src/include/utils_api.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2011-2019 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef __UTILSAPI_H
21*5113495bSYour Name #define __UTILSAPI_H
22*5113495bSYour Name 
23*5113495bSYour Name #include "qdf_types.h"
24*5113495bSYour Name #include <sir_common.h>
25*5113495bSYour Name #include "ani_global.h"
26*5113495bSYour Name #include "sys_wrapper.h"
27*5113495bSYour Name #include "wlan_vdev_mlme_main.h"
28*5113495bSYour Name #include "wlan_vdev_mlme_api.h"
29*5113495bSYour Name 
30*5113495bSYour Name /**
31*5113495bSYour Name  * sir_swap_u16()
32*5113495bSYour Name  *
33*5113495bSYour Name  * FUNCTION:
34*5113495bSYour Name  * This function is called to swap two U8s of an uint16_t value
35*5113495bSYour Name  *
36*5113495bSYour Name  * LOGIC:
37*5113495bSYour Name  *
38*5113495bSYour Name  * ASSUMPTIONS:
39*5113495bSYour Name  * None.
40*5113495bSYour Name  *
41*5113495bSYour Name  * NOTE:
42*5113495bSYour Name  *
43*5113495bSYour Name  * @param  val    uint16_t value to be uint8_t swapped
44*5113495bSYour Name  * @return        Swapped uint16_t value
45*5113495bSYour Name  */
46*5113495bSYour Name 
sir_swap_u16(uint16_t val)47*5113495bSYour Name static inline uint16_t sir_swap_u16(uint16_t val)
48*5113495bSYour Name {
49*5113495bSYour Name 	return ((val & 0x00FF) << 8) | ((val & 0xFF00) >> 8);
50*5113495bSYour Name } /*** end sir_swap_u16() ***/
51*5113495bSYour Name 
52*5113495bSYour Name /**
53*5113495bSYour Name  * sir_swap_u16if_needed()
54*5113495bSYour Name  *
55*5113495bSYour Name  * FUNCTION:
56*5113495bSYour Name  * This function is called to swap two U8s of an uint16_t value depending
57*5113495bSYour Name  * on endianness of the target processor/compiler the software is
58*5113495bSYour Name  * running on
59*5113495bSYour Name  *
60*5113495bSYour Name  * LOGIC:
61*5113495bSYour Name  *
62*5113495bSYour Name  * ASSUMPTIONS:
63*5113495bSYour Name  * None.
64*5113495bSYour Name  *
65*5113495bSYour Name  * NOTE:
66*5113495bSYour Name  *
67*5113495bSYour Name  * @param  val    uint16_t value to be uint8_t swapped
68*5113495bSYour Name  * @return        Swapped uint16_t value
69*5113495bSYour Name  */
70*5113495bSYour Name 
sir_swap_u16if_needed(uint16_t val)71*5113495bSYour Name static inline uint16_t sir_swap_u16if_needed(uint16_t val)
72*5113495bSYour Name {
73*5113495bSYour Name #ifndef ANI_LITTLE_BYTE_ENDIAN
74*5113495bSYour Name 	return sir_swap_u16(val);
75*5113495bSYour Name #else
76*5113495bSYour Name 	return val;
77*5113495bSYour Name #endif
78*5113495bSYour Name } /*** end sir_swap_u16if_needed() ***/
79*5113495bSYour Name 
80*5113495bSYour Name /**
81*5113495bSYour Name  * sir_swap_u32()
82*5113495bSYour Name  *
83*5113495bSYour Name  * FUNCTION:
84*5113495bSYour Name  * This function is called to swap four U8s of an uint32_t value
85*5113495bSYour Name  *
86*5113495bSYour Name  * LOGIC:
87*5113495bSYour Name  *
88*5113495bSYour Name  * ASSUMPTIONS:
89*5113495bSYour Name  * None.
90*5113495bSYour Name  *
91*5113495bSYour Name  * NOTE:
92*5113495bSYour Name  *
93*5113495bSYour Name  * @param  val    uint32_t value to be uint8_t swapped
94*5113495bSYour Name  * @return        Swapped uint32_t value
95*5113495bSYour Name  */
96*5113495bSYour Name 
sir_swap_u32(uint32_t val)97*5113495bSYour Name static inline uint32_t sir_swap_u32(uint32_t val)
98*5113495bSYour Name {
99*5113495bSYour Name 	return (val << 24) |
100*5113495bSYour Name 		(val >> 24) |
101*5113495bSYour Name 		((val & 0x0000FF00) << 8) | ((val & 0x00FF0000) >> 8);
102*5113495bSYour Name } /*** end sir_swap_u32() ***/
103*5113495bSYour Name 
104*5113495bSYour Name /**
105*5113495bSYour Name  * sir_swap_u32if_needed()
106*5113495bSYour Name  *
107*5113495bSYour Name  * FUNCTION:
108*5113495bSYour Name  * This function is called to swap U8s of an uint32_t value depending
109*5113495bSYour Name  * on endianness of the target processor/compiler the software is
110*5113495bSYour Name  * running on
111*5113495bSYour Name  *
112*5113495bSYour Name  * LOGIC:
113*5113495bSYour Name  *
114*5113495bSYour Name  * ASSUMPTIONS:
115*5113495bSYour Name  * None.
116*5113495bSYour Name  *
117*5113495bSYour Name  * NOTE:
118*5113495bSYour Name  *
119*5113495bSYour Name  * @param  val    uint32_t value to be uint8_t swapped
120*5113495bSYour Name  * @return        Swapped uint32_t value
121*5113495bSYour Name  */
122*5113495bSYour Name 
sir_swap_u32if_needed(uint32_t val)123*5113495bSYour Name static inline uint32_t sir_swap_u32if_needed(uint32_t val)
124*5113495bSYour Name {
125*5113495bSYour Name #ifndef ANI_LITTLE_BYTE_ENDIAN
126*5113495bSYour Name 	return sir_swap_u32(val);
127*5113495bSYour Name #else
128*5113495bSYour Name 	return val;
129*5113495bSYour Name #endif
130*5113495bSYour Name } /*** end sir_swap_u32if_needed() ***/
131*5113495bSYour Name 
132*5113495bSYour Name /**
133*5113495bSYour Name  * sir_swap_u32_buf
134*5113495bSYour Name  *
135*5113495bSYour Name  * FUNCTION:
136*5113495bSYour Name  * It swaps N dwords into the same buffer
137*5113495bSYour Name  *
138*5113495bSYour Name  * LOGIC:
139*5113495bSYour Name  *
140*5113495bSYour Name  * ASSUMPTIONS:
141*5113495bSYour Name  * None.
142*5113495bSYour Name  *
143*5113495bSYour Name  * NOTE:
144*5113495bSYour Name  *
145*5113495bSYour Name  * @param  ptr address of uint32_t array
146*5113495bSYour Name  * @return void
147*5113495bSYour Name  *
148*5113495bSYour Name  */
149*5113495bSYour Name 
150*5113495bSYour Name /**
151*5113495bSYour Name  * sir_read_u32_n
152*5113495bSYour Name  *
153*5113495bSYour Name  * FUNCTION:
154*5113495bSYour Name  * It reads a 32 bit number from the byte array in network byte order
155*5113495bSYour Name  * i.e. the least significant byte first
156*5113495bSYour Name  *
157*5113495bSYour Name  * LOGIC:
158*5113495bSYour Name  *
159*5113495bSYour Name  * ASSUMPTIONS:
160*5113495bSYour Name  * None.
161*5113495bSYour Name  *
162*5113495bSYour Name  * NOTE:
163*5113495bSYour Name  *
164*5113495bSYour Name  * @param  ptr address of  byte array
165*5113495bSYour Name  * @return 32 bit value
166*5113495bSYour Name  */
167*5113495bSYour Name 
sir_read_u32_n(uint8_t * ptr)168*5113495bSYour Name static inline uint32_t sir_read_u32_n(uint8_t *ptr)
169*5113495bSYour Name {
170*5113495bSYour Name 	return (*(ptr) << 24) |
171*5113495bSYour Name 		(*(ptr + 1) << 16) | (*(ptr + 2) << 8) | (*(ptr + 3));
172*5113495bSYour Name }
173*5113495bSYour Name 
174*5113495bSYour Name /**
175*5113495bSYour Name  * sir_read_u16
176*5113495bSYour Name  *
177*5113495bSYour Name  * FUNCTION:
178*5113495bSYour Name  * It reads a 16 bit number from the byte array in NON-network byte order
179*5113495bSYour Name  * i.e. the least significant byte first
180*5113495bSYour Name  *
181*5113495bSYour Name  * LOGIC:
182*5113495bSYour Name  *
183*5113495bSYour Name  * ASSUMPTIONS:
184*5113495bSYour Name  * None.
185*5113495bSYour Name  *
186*5113495bSYour Name  * NOTE:
187*5113495bSYour Name  *
188*5113495bSYour Name  * @param  ptr address of  byte array
189*5113495bSYour Name  * @return 16 bit value
190*5113495bSYour Name  */
191*5113495bSYour Name 
sir_read_u16(uint8_t * ptr)192*5113495bSYour Name static inline uint16_t sir_read_u16(uint8_t *ptr)
193*5113495bSYour Name {
194*5113495bSYour Name 	return (*ptr) | (*(ptr + 1) << 8);
195*5113495bSYour Name }
196*5113495bSYour Name 
197*5113495bSYour Name /**
198*5113495bSYour Name  * sir_read_u32
199*5113495bSYour Name  *
200*5113495bSYour Name  * FUNCTION:
201*5113495bSYour Name  * It reads a 32 bit number from the byte array in NON-network byte order
202*5113495bSYour Name  * i.e. the least significant byte first
203*5113495bSYour Name  *
204*5113495bSYour Name  * LOGIC:
205*5113495bSYour Name  *
206*5113495bSYour Name  * ASSUMPTIONS:
207*5113495bSYour Name  * None.
208*5113495bSYour Name  *
209*5113495bSYour Name  * NOTE:
210*5113495bSYour Name  *
211*5113495bSYour Name  * @param  ptr address of  byte array
212*5113495bSYour Name  * @return 32 bit value
213*5113495bSYour Name  */
214*5113495bSYour Name 
sir_read_u32(uint8_t * ptr)215*5113495bSYour Name static inline uint32_t sir_read_u32(uint8_t *ptr)
216*5113495bSYour Name {
217*5113495bSYour Name 	return (*(ptr)) |
218*5113495bSYour Name 		(*(ptr + 1) << 8) | (*(ptr + 2) << 16) | (*(ptr + 3) << 24);
219*5113495bSYour Name }
220*5113495bSYour Name 
221*5113495bSYour Name /* / Copy a MAC address from 'from' to 'to' */
sir_copy_mac_addr(uint8_t to[],uint8_t from[])222*5113495bSYour Name static inline void sir_copy_mac_addr(uint8_t to[], uint8_t from[])
223*5113495bSYour Name {
224*5113495bSYour Name #if defined(_X86_)
225*5113495bSYour Name 	uint32_t align = (0x3 & ((uint32_t) to | (uint32_t) from));
226*5113495bSYour Name 
227*5113495bSYour Name 	if (align == 0) {
228*5113495bSYour Name 		*((uint16_t *) &(to[4])) = *((uint16_t *) &(from[4]));
229*5113495bSYour Name 		*((uint32_t *) to) = *((uint32_t *) from);
230*5113495bSYour Name 	} else if (align == 2) {
231*5113495bSYour Name 		*((uint16_t *) &to[4]) = *((uint16_t *) &from[4]);
232*5113495bSYour Name 		*((uint16_t *) &to[2]) = *((uint16_t *) &from[2]);
233*5113495bSYour Name 		*((uint16_t *) &to[0]) = *((uint16_t *) &from[0]);
234*5113495bSYour Name 	} else {
235*5113495bSYour Name 		to[5] = from[5];
236*5113495bSYour Name 		to[4] = from[4];
237*5113495bSYour Name 		to[3] = from[3];
238*5113495bSYour Name 		to[2] = from[2];
239*5113495bSYour Name 		to[1] = from[1];
240*5113495bSYour Name 		to[0] = from[0];
241*5113495bSYour Name 	}
242*5113495bSYour Name #else
243*5113495bSYour Name 	to[0] = from[0];
244*5113495bSYour Name 	to[1] = from[1];
245*5113495bSYour Name 	to[2] = from[2];
246*5113495bSYour Name 	to[3] = from[3];
247*5113495bSYour Name 	to[4] = from[4];
248*5113495bSYour Name 	to[5] = from[5];
249*5113495bSYour Name #endif
250*5113495bSYour Name }
251*5113495bSYour Name 
sir_compare_mac_addr(uint8_t addr1[],uint8_t addr2[])252*5113495bSYour Name static inline uint8_t sir_compare_mac_addr(uint8_t addr1[], uint8_t addr2[])
253*5113495bSYour Name {
254*5113495bSYour Name #if defined(_X86_)
255*5113495bSYour Name 	uint32_t align = (0x3 & ((uint32_t) addr1 | (uint32_t) addr2));
256*5113495bSYour Name 
257*5113495bSYour Name 	if (align == 0) {
258*5113495bSYour Name 		return (*((uint16_t *) &(addr1[4])) ==
259*5113495bSYour Name 			 *((uint16_t *) &(addr2[4])))
260*5113495bSYour Name 			&& (*((uint32_t *) addr1) == *((uint32_t *) addr2));
261*5113495bSYour Name 	} else if (align == 2) {
262*5113495bSYour Name 		return (*((uint16_t *) &addr1[4]) ==
263*5113495bSYour Name 			 *((uint16_t *) &addr2[4]))
264*5113495bSYour Name 			&& (*((uint16_t *) &addr1[2]) ==
265*5113495bSYour Name 			    *((uint16_t *) &addr2[2]))
266*5113495bSYour Name 			&& (*((uint16_t *) &addr1[0]) ==
267*5113495bSYour Name 			    *((uint16_t *) &addr2[0]));
268*5113495bSYour Name 	} else {
269*5113495bSYour Name 		return (addr1[5] == addr2[5]) &&
270*5113495bSYour Name 			(addr1[4] == addr2[4]) &&
271*5113495bSYour Name 			(addr1[3] == addr2[3]) &&
272*5113495bSYour Name 			(addr1[2] == addr2[2]) &&
273*5113495bSYour Name 			(addr1[1] == addr2[1]) && (addr1[0] == addr2[0]);
274*5113495bSYour Name 	}
275*5113495bSYour Name #else
276*5113495bSYour Name 	return (addr1[0] == addr2[0]) &&
277*5113495bSYour Name 		(addr1[1] == addr2[1]) &&
278*5113495bSYour Name 		(addr1[2] == addr2[2]) &&
279*5113495bSYour Name 		(addr1[3] == addr2[3]) &&
280*5113495bSYour Name 		(addr1[4] == addr2[4]) && (addr1[5] == addr2[5]);
281*5113495bSYour Name #endif
282*5113495bSYour Name }
283*5113495bSYour Name 
284*5113495bSYour Name /*
285*5113495bSYour Name  * converts uint16_t CW value to 4 bit value to be inserted in IE
286*5113495bSYour Name  */
convert_cw(uint16_t cw)287*5113495bSYour Name static inline uint8_t convert_cw(uint16_t cw)
288*5113495bSYour Name {
289*5113495bSYour Name 	uint8_t val = 0;
290*5113495bSYour Name 
291*5113495bSYour Name 	while (cw > 0) {
292*5113495bSYour Name 		val++;
293*5113495bSYour Name 		cw >>= 1;
294*5113495bSYour Name 	}
295*5113495bSYour Name 	if (val > 15)
296*5113495bSYour Name 		return 0xF;
297*5113495bSYour Name 	return val;
298*5113495bSYour Name }
299*5113495bSYour Name 
300*5113495bSYour Name /* The user priority to AC mapping is such:
301*5113495bSYour Name  *   UP(1, 2) ---> AC_BK(1)
302*5113495bSYour Name  *   UP(0, 3) ---> AC_BE(0)
303*5113495bSYour Name  *   UP(4, 5) ---> AC_VI(2)
304*5113495bSYour Name  *   UP(6, 7) ---> AC_VO(3)
305*5113495bSYour Name  */
306*5113495bSYour Name #define WLAN_UP_TO_AC_MAP            0x33220110
307*5113495bSYour Name #define upToAc(up)                ((WLAN_UP_TO_AC_MAP >> ((up) << 2)) & 0x03)
308*5113495bSYour Name 
309*5113495bSYour Name #endif /* __UTILSAPI_H */
310