xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlan/mlan_main.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /** @file mlan_main.h
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  *  @brief This file defines the private and adapter data
4*4882a593Smuzhiyun  *  structures and declares global function prototypes used
5*4882a593Smuzhiyun  *  in MLAN module.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *  Copyright 2008-2022 NXP
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  *  This software file (the File) is distributed by NXP
11*4882a593Smuzhiyun  *  under the terms of the GNU General Public License Version 2, June 1991
12*4882a593Smuzhiyun  *  (the License).  You may use, redistribute and/or modify the File in
13*4882a593Smuzhiyun  *  accordance with the terms and conditions of the License, a copy of which
14*4882a593Smuzhiyun  *  is available by writing to the Free Software Foundation, Inc.,
15*4882a593Smuzhiyun  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
16*4882a593Smuzhiyun  *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
19*4882a593Smuzhiyun  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
20*4882a593Smuzhiyun  *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
21*4882a593Smuzhiyun  *  this warranty disclaimer.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  */
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun /******************************************************
26*4882a593Smuzhiyun Change log:
27*4882a593Smuzhiyun     10/13/2008: initial version
28*4882a593Smuzhiyun ******************************************************/
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifndef _MLAN_MAIN_H_
31*4882a593Smuzhiyun #define _MLAN_MAIN_H_
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
34*4882a593Smuzhiyun extern t_void (*print_callback)(t_pvoid pmoal_handle, t_u32 level,
35*4882a593Smuzhiyun 				char *pformat, IN...);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun extern mlan_status (*get_sys_time_callback)(t_void *pmoal_handle, t_u32 *psec,
38*4882a593Smuzhiyun 					    t_u32 *pusec);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun extern t_u32 mlan_drvdbg;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #ifdef DEBUG_LEVEL2
43*4882a593Smuzhiyun #define PRINTM_MINFO(msg...)                                                   \
44*4882a593Smuzhiyun 	do {                                                                   \
45*4882a593Smuzhiyun 		if ((mlan_drvdbg & MINFO) && (print_callback))                 \
46*4882a593Smuzhiyun 			print_callback(MNULL, MINFO, msg);                     \
47*4882a593Smuzhiyun 	} while (0)
48*4882a593Smuzhiyun #define PRINTM_MWARN(msg...)                                                   \
49*4882a593Smuzhiyun 	do {                                                                   \
50*4882a593Smuzhiyun 		if ((mlan_drvdbg & MWARN) && (print_callback))                 \
51*4882a593Smuzhiyun 			print_callback(MNULL, MWARN, msg);                     \
52*4882a593Smuzhiyun 	} while (0)
53*4882a593Smuzhiyun #define PRINTM_MENTRY(msg...)                                                  \
54*4882a593Smuzhiyun 	do {                                                                   \
55*4882a593Smuzhiyun 		if ((mlan_drvdbg & MENTRY) && (print_callback))                \
56*4882a593Smuzhiyun 			print_callback(MNULL, MENTRY, msg);                    \
57*4882a593Smuzhiyun 	} while (0)
58*4882a593Smuzhiyun #define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
59*4882a593Smuzhiyun 	do {                                                                   \
60*4882a593Smuzhiyun 		if ((level & mlan_drvdbg) && (get_sys_time_callback))          \
61*4882a593Smuzhiyun 			get_sys_time_callback(MNULL, psec, pusec);             \
62*4882a593Smuzhiyun 	} while (0)
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /** Hexdump for level-2 debugging */
65*4882a593Smuzhiyun #define HEXDUMP(x, y, z)                                                       \
66*4882a593Smuzhiyun 	do {                                                                   \
67*4882a593Smuzhiyun 		if ((mlan_drvdbg & (MHEX_DUMP | MINFO)) && (print_callback))   \
68*4882a593Smuzhiyun 			print_callback(MNULL, MHEX_DUMP | MINFO, x, y, z);     \
69*4882a593Smuzhiyun 	} while (0)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #else
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun #define PRINTM_MINFO(msg...)                                                   \
74*4882a593Smuzhiyun 	do {                                                                   \
75*4882a593Smuzhiyun 	} while (0)
76*4882a593Smuzhiyun #define PRINTM_MWARN(msg...)                                                   \
77*4882a593Smuzhiyun 	do {                                                                   \
78*4882a593Smuzhiyun 	} while (0)
79*4882a593Smuzhiyun #define PRINTM_MENTRY(msg...)                                                  \
80*4882a593Smuzhiyun 	do {                                                                   \
81*4882a593Smuzhiyun 	} while (0)
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
84*4882a593Smuzhiyun 	do {                                                                   \
85*4882a593Smuzhiyun 		if ((level & mlan_drvdbg) && (get_sys_time_callback) &&        \
86*4882a593Smuzhiyun 		    (level != MINFO) && (level != MWARN))                      \
87*4882a593Smuzhiyun 			get_sys_time_callback(MNULL, psec, pusec);             \
88*4882a593Smuzhiyun 	} while (0)
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /** Hexdump for debugging */
91*4882a593Smuzhiyun #define HEXDUMP(x, y, z)                                                       \
92*4882a593Smuzhiyun 	do {                                                                   \
93*4882a593Smuzhiyun 	} while (0)
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #endif /* DEBUG_LEVEL2 */
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #define PRINTM_MFW_D(msg...)                                                   \
98*4882a593Smuzhiyun 	do {                                                                   \
99*4882a593Smuzhiyun 		if ((mlan_drvdbg & MFW_D) && (print_callback))                 \
100*4882a593Smuzhiyun 			print_callback(MNULL, MFW_D, msg);                     \
101*4882a593Smuzhiyun 	} while (0)
102*4882a593Smuzhiyun #define PRINTM_MCMD_D(msg...)                                                  \
103*4882a593Smuzhiyun 	do {                                                                   \
104*4882a593Smuzhiyun 		if ((mlan_drvdbg & MCMD_D) && (print_callback))                \
105*4882a593Smuzhiyun 			print_callback(MNULL, MCMD_D, msg);                    \
106*4882a593Smuzhiyun 	} while (0)
107*4882a593Smuzhiyun #define PRINTM_MDAT_D(msg...)                                                  \
108*4882a593Smuzhiyun 	do {                                                                   \
109*4882a593Smuzhiyun 		if ((mlan_drvdbg & MDAT_D) && (print_callback))                \
110*4882a593Smuzhiyun 			print_callback(MNULL, MDAT_D, msg);                    \
111*4882a593Smuzhiyun 	} while (0)
112*4882a593Smuzhiyun #define PRINTM_MIF_D(msg...)                                                   \
113*4882a593Smuzhiyun 	do {                                                                   \
114*4882a593Smuzhiyun 		if ((mlan_drvdbg & MIF_D) && (print_callback))                 \
115*4882a593Smuzhiyun 			print_callback(MNULL, MIF_D, msg);                     \
116*4882a593Smuzhiyun 	} while (0)
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define PRINTM_MIOCTL(msg...)                                                  \
119*4882a593Smuzhiyun 	do {                                                                   \
120*4882a593Smuzhiyun 		if ((mlan_drvdbg & MIOCTL) && (print_callback))                \
121*4882a593Smuzhiyun 			print_callback(MNULL, MIOCTL, msg);                    \
122*4882a593Smuzhiyun 	} while (0)
123*4882a593Smuzhiyun #define PRINTM_MINTR(msg...)                                                   \
124*4882a593Smuzhiyun 	do {                                                                   \
125*4882a593Smuzhiyun 		if ((mlan_drvdbg & MINTR) && (print_callback))                 \
126*4882a593Smuzhiyun 			print_callback(MNULL, MINTR, msg);                     \
127*4882a593Smuzhiyun 	} while (0)
128*4882a593Smuzhiyun #define PRINTM_MEVENT(msg...)                                                  \
129*4882a593Smuzhiyun 	do {                                                                   \
130*4882a593Smuzhiyun 		if ((mlan_drvdbg & MEVENT) && (print_callback))                \
131*4882a593Smuzhiyun 			print_callback(MNULL, MEVENT, msg);                    \
132*4882a593Smuzhiyun 	} while (0)
133*4882a593Smuzhiyun #define PRINTM_MCMND(msg...)                                                   \
134*4882a593Smuzhiyun 	do {                                                                   \
135*4882a593Smuzhiyun 		if ((mlan_drvdbg & MCMND) && (print_callback))                 \
136*4882a593Smuzhiyun 			print_callback(MNULL, MCMND, msg);                     \
137*4882a593Smuzhiyun 	} while (0)
138*4882a593Smuzhiyun #define PRINTM_MDATA(msg...)                                                   \
139*4882a593Smuzhiyun 	do {                                                                   \
140*4882a593Smuzhiyun 		if ((mlan_drvdbg & MDATA) && (print_callback))                 \
141*4882a593Smuzhiyun 			print_callback(MNULL, MDATA, msg);                     \
142*4882a593Smuzhiyun 	} while (0)
143*4882a593Smuzhiyun #define PRINTM_MERROR(msg...)                                                  \
144*4882a593Smuzhiyun 	do {                                                                   \
145*4882a593Smuzhiyun 		if ((mlan_drvdbg & MERROR) && (print_callback))                \
146*4882a593Smuzhiyun 			print_callback(MNULL, MERROR, msg);                    \
147*4882a593Smuzhiyun 	} while (0)
148*4882a593Smuzhiyun #define PRINTM_MFATAL(msg...)                                                  \
149*4882a593Smuzhiyun 	do {                                                                   \
150*4882a593Smuzhiyun 		if ((mlan_drvdbg & MFATAL) && (print_callback))                \
151*4882a593Smuzhiyun 			print_callback(MNULL, MFATAL, msg);                    \
152*4882a593Smuzhiyun 	} while (0)
153*4882a593Smuzhiyun #define PRINTM_MMSG(msg...)                                                    \
154*4882a593Smuzhiyun 	do {                                                                   \
155*4882a593Smuzhiyun 		if ((mlan_drvdbg & MMSG) && (print_callback))                  \
156*4882a593Smuzhiyun 			print_callback(MNULL, MMSG, msg);                      \
157*4882a593Smuzhiyun 	} while (0)
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define PRINTM(level, msg...) PRINTM_##level((char *)msg)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /** Log debug message */
162*4882a593Smuzhiyun #ifdef __GNUC__
163*4882a593Smuzhiyun #define PRINTM_NETINTF(level, pmpriv)                                          \
164*4882a593Smuzhiyun 	do {                                                                   \
165*4882a593Smuzhiyun 		if ((mlan_drvdbg & level) && pmpriv &&                         \
166*4882a593Smuzhiyun 		    pmpriv->adapter->callbacks.moal_print_netintf)             \
167*4882a593Smuzhiyun 			pmpriv->adapter->callbacks.moal_print_netintf(         \
168*4882a593Smuzhiyun 				pmpriv->adapter->pmoal_handle,                 \
169*4882a593Smuzhiyun 				pmpriv->bss_index, level);                     \
170*4882a593Smuzhiyun 	} while (0)
171*4882a593Smuzhiyun #endif /* __GNUC__ */
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun /** Max hex dump data length */
174*4882a593Smuzhiyun #define MAX_DATA_DUMP_LEN 64
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun /** Debug hexdump for level-1 debugging */
177*4882a593Smuzhiyun #define DBG_HEXDUMP(level, x, y, z)                                            \
178*4882a593Smuzhiyun 	do {                                                                   \
179*4882a593Smuzhiyun 		if ((mlan_drvdbg & level) && print_callback)                   \
180*4882a593Smuzhiyun 			print_callback(MNULL, MHEX_DUMP | level, x, y, z);     \
181*4882a593Smuzhiyun 	} while (0)
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #else /* DEBUG_LEVEL1 */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define PRINTM(level, msg...)                                                  \
186*4882a593Smuzhiyun 	do {                                                                   \
187*4882a593Smuzhiyun 	} while (0)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #define PRINTM_NETINTF(level, pmpriv)                                          \
190*4882a593Smuzhiyun 	do {                                                                   \
191*4882a593Smuzhiyun 	} while (0)
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun /** Debug hexdump for level-1 debugging */
194*4882a593Smuzhiyun #define DBG_HEXDUMP(level, x, y, z)                                            \
195*4882a593Smuzhiyun 	do {                                                                   \
196*4882a593Smuzhiyun 	} while (0)
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /** Hexdump for debugging */
199*4882a593Smuzhiyun #define HEXDUMP(x, y, z)                                                       \
200*4882a593Smuzhiyun 	do {                                                                   \
201*4882a593Smuzhiyun 	} while (0)
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun #define PRINTM_GET_SYS_TIME(level, psec, pusec)                                \
204*4882a593Smuzhiyun 	do {                                                                   \
205*4882a593Smuzhiyun 	} while (0)
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #endif /* DEBUG_LEVEL1 */
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun /* Reason Code 3: STA is leaving (or has left) IBSS or ESS */
210*4882a593Smuzhiyun #define DEF_DEAUTH_REASON_CODE (0x3)
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun /** Log entry point for debugging */
213*4882a593Smuzhiyun #define ENTER()                                                                \
214*4882a593Smuzhiyun 	do {                                                                   \
215*4882a593Smuzhiyun 		PRINTM(MENTRY, "Enter: %s\n", __func__);                       \
216*4882a593Smuzhiyun 	} while (0)
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun /** Log exit point for debugging */
219*4882a593Smuzhiyun #define LEAVE()                                                                \
220*4882a593Smuzhiyun 	do {                                                                   \
221*4882a593Smuzhiyun 		PRINTM(MENTRY, "Leave: %s\n", __func__);                       \
222*4882a593Smuzhiyun 	} while (0)
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun /** Find minimum */
225*4882a593Smuzhiyun #ifndef MIN
226*4882a593Smuzhiyun #define MIN(a, b) ((a) < (b) ? (a) : (b))
227*4882a593Smuzhiyun #endif
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun /** Find maximum */
230*4882a593Smuzhiyun #ifndef MAX
231*4882a593Smuzhiyun #define MAX(a, b) ((a) > (b) ? (a) : (b))
232*4882a593Smuzhiyun #endif
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun #ifdef memset
235*4882a593Smuzhiyun #undef memset
236*4882a593Smuzhiyun #endif
237*4882a593Smuzhiyun /** Memset routine */
238*4882a593Smuzhiyun #define memset(adapter, s, c, len)                                             \
239*4882a593Smuzhiyun 	(adapter->callbacks.moal_memset(adapter->pmoal_handle, s, c, len))
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun #ifdef memmove
242*4882a593Smuzhiyun #undef memmove
243*4882a593Smuzhiyun #endif
244*4882a593Smuzhiyun /** Memmove routine */
245*4882a593Smuzhiyun #define memmove(adapter, dest, src, len)                                       \
246*4882a593Smuzhiyun 	(adapter->callbacks.moal_memmove(adapter->pmoal_handle, dest, src, len))
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun #ifdef memcpy
249*4882a593Smuzhiyun #undef memcpy
250*4882a593Smuzhiyun #endif
251*4882a593Smuzhiyun /** Memcpy routine */
252*4882a593Smuzhiyun #define memcpy(adapter, to, from, len)                                         \
253*4882a593Smuzhiyun 	(adapter->callbacks.moal_memcpy(adapter->pmoal_handle, to, from, len))
254*4882a593Smuzhiyun /* memcpy_ext rountine */
255*4882a593Smuzhiyun #define memcpy_ext(adapter, to, from, len, size)                               \
256*4882a593Smuzhiyun 	(adapter->callbacks.moal_memcpy_ext(adapter->pmoal_handle, to, from,   \
257*4882a593Smuzhiyun 					    len, size))
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun #ifdef memcmp
260*4882a593Smuzhiyun #undef memcmp
261*4882a593Smuzhiyun #endif
262*4882a593Smuzhiyun /** Memcmp routine */
263*4882a593Smuzhiyun #define memcmp(adapter, s1, s2, len)                                           \
264*4882a593Smuzhiyun 	(adapter->callbacks.moal_memcmp(adapter->pmoal_handle, s1, s2, len))
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun /** Find number of elements */
267*4882a593Smuzhiyun #ifndef NELEMENTS
268*4882a593Smuzhiyun #define NELEMENTS(x) (sizeof(x) / sizeof(x[0]))
269*4882a593Smuzhiyun #endif
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /** SWAP: swap t_u8 */
272*4882a593Smuzhiyun #define SWAP_U8(a, b)                                                          \
273*4882a593Smuzhiyun 	{                                                                      \
274*4882a593Smuzhiyun 		t_u8 t;                                                        \
275*4882a593Smuzhiyun 		t = a;                                                         \
276*4882a593Smuzhiyun 		a = b;                                                         \
277*4882a593Smuzhiyun 		b = t;                                                         \
278*4882a593Smuzhiyun 	}
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun /** SWAP: swap t_u8 */
281*4882a593Smuzhiyun #define SWAP_U16(a, b)                                                         \
282*4882a593Smuzhiyun 	{                                                                      \
283*4882a593Smuzhiyun 		t_u16 t;                                                       \
284*4882a593Smuzhiyun 		t = a;                                                         \
285*4882a593Smuzhiyun 		a = b;                                                         \
286*4882a593Smuzhiyun 		b = t;                                                         \
287*4882a593Smuzhiyun 	}
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /** 16 bits byte swap */
290*4882a593Smuzhiyun #define swap_byte_16(x)                                                        \
291*4882a593Smuzhiyun 	((t_u16)((((t_u16)(x)&0x00ffU) << 8) | (((t_u16)(x)&0xff00U) >> 8)))
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /** 32 bits byte swap */
294*4882a593Smuzhiyun #define swap_byte_32(x)                                                        \
295*4882a593Smuzhiyun 	((t_u32)((((t_u32)(x)&0x000000ffUL) << 24) |                           \
296*4882a593Smuzhiyun 		 (((t_u32)(x)&0x0000ff00UL) << 8) |                            \
297*4882a593Smuzhiyun 		 (((t_u32)(x)&0x00ff0000UL) >> 8) |                            \
298*4882a593Smuzhiyun 		 (((t_u32)(x)&0xff000000UL) >> 24)))
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun /** 64 bits byte swap */
301*4882a593Smuzhiyun #define swap_byte_64(x)                                                        \
302*4882a593Smuzhiyun 	((t_u64)((t_u64)(((t_u64)(x)&0x00000000000000ffULL) << 56) |           \
303*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x000000000000ff00ULL) << 40) |           \
304*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x0000000000ff0000ULL) << 24) |           \
305*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x00000000ff000000ULL) << 8) |            \
306*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x000000ff00000000ULL) >> 8) |            \
307*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x0000ff0000000000ULL) >> 24) |           \
308*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0x00ff000000000000ULL) >> 40) |           \
309*4882a593Smuzhiyun 		 (t_u64)(((t_u64)(x)&0xff00000000000000ULL) >> 56)))
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun #ifdef BIG_ENDIAN_SUPPORT
312*4882a593Smuzhiyun /** Convert ulong n/w to host */
313*4882a593Smuzhiyun #define mlan_ntohl(x) x
314*4882a593Smuzhiyun /** Convert host ulong to n/w */
315*4882a593Smuzhiyun #define mlan_htonl(x) x
316*4882a593Smuzhiyun /** Convert n/w to host */
317*4882a593Smuzhiyun #define mlan_ntohs(x) x
318*4882a593Smuzhiyun /** Convert host to n/w */
319*4882a593Smuzhiyun #define mlan_htons(x) x
320*4882a593Smuzhiyun /** Convert from 16 bit little endian format to CPU format */
321*4882a593Smuzhiyun #define wlan_le16_to_cpu(x) swap_byte_16(x)
322*4882a593Smuzhiyun /** Convert from 32 bit little endian format to CPU format */
323*4882a593Smuzhiyun #define wlan_le32_to_cpu(x) swap_byte_32(x)
324*4882a593Smuzhiyun /** Convert from 64 bit little endian format to CPU format */
325*4882a593Smuzhiyun #define wlan_le64_to_cpu(x) swap_byte_64(x)
326*4882a593Smuzhiyun /** Convert to 16 bit little endian format from CPU format */
327*4882a593Smuzhiyun #define wlan_cpu_to_le16(x) swap_byte_16(x)
328*4882a593Smuzhiyun /** Convert to 32 bit little endian format from CPU format */
329*4882a593Smuzhiyun #define wlan_cpu_to_le32(x) swap_byte_32(x)
330*4882a593Smuzhiyun /** Convert to 64 bit little endian format from CPU format */
331*4882a593Smuzhiyun #define wlan_cpu_to_le64(x) swap_byte_64(x)
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /** Convert TxPD to little endian format from CPU format */
334*4882a593Smuzhiyun #define endian_convert_TxPD(x)                                                 \
335*4882a593Smuzhiyun 	{                                                                      \
336*4882a593Smuzhiyun 		(x)->tx_pkt_length = wlan_cpu_to_le16((x)->tx_pkt_length);     \
337*4882a593Smuzhiyun 		(x)->tx_pkt_offset = wlan_cpu_to_le16((x)->tx_pkt_offset);     \
338*4882a593Smuzhiyun 		(x)->tx_pkt_type = wlan_cpu_to_le16((x)->tx_pkt_type);         \
339*4882a593Smuzhiyun 		(x)->tx_control = wlan_cpu_to_le32((x)->tx_control);           \
340*4882a593Smuzhiyun 		(x)->tx_control_1 = wlan_cpu_to_le32((x)->tx_control_1);       \
341*4882a593Smuzhiyun 	}
342*4882a593Smuzhiyun /** Convert RxPD from little endian format to CPU format */
343*4882a593Smuzhiyun #define endian_convert_RxPD(x)                                                 \
344*4882a593Smuzhiyun 	{                                                                      \
345*4882a593Smuzhiyun 		(x)->rx_pkt_length = wlan_le16_to_cpu((x)->rx_pkt_length);     \
346*4882a593Smuzhiyun 		(x)->rx_pkt_offset = wlan_le16_to_cpu((x)->rx_pkt_offset);     \
347*4882a593Smuzhiyun 		(x)->rx_pkt_type = wlan_le16_to_cpu((x)->rx_pkt_type);         \
348*4882a593Smuzhiyun 		(x)->seq_num = wlan_le16_to_cpu((x)->seq_num);                 \
349*4882a593Smuzhiyun 		(x)->rx_info = wlan_le32_to_cpu((x)->rx_info);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun /** Convert RxPD extra header from little endian format to CPU format */
353*4882a593Smuzhiyun #define endian_convert_RxPD_extra_header(x)                                    \
354*4882a593Smuzhiyun 	do {                                                                   \
355*4882a593Smuzhiyun 		(x)->channel_flags = wlan_le16_to_cpu((x)->channel_flags);     \
356*4882a593Smuzhiyun 		(x)->vht_sig1 = wlan_le32_to_cpu((x)->vht_sig1);               \
357*4882a593Smuzhiyun 		(x)->vht_sig2 = wlan_le32_to_cpu((x)->vht_sig2);               \
358*4882a593Smuzhiyun 	} while (0)
359*4882a593Smuzhiyun #else
360*4882a593Smuzhiyun /** Convert ulong n/w to host */
361*4882a593Smuzhiyun #define mlan_ntohl(x) swap_byte_32(x)
362*4882a593Smuzhiyun /** Convert host ulong to n/w */
363*4882a593Smuzhiyun #define mlan_htonl(x) swap_byte_32(x)
364*4882a593Smuzhiyun /** Convert n/w to host */
365*4882a593Smuzhiyun #define mlan_ntohs(x) swap_byte_16(x)
366*4882a593Smuzhiyun /** Convert host to n/w */
367*4882a593Smuzhiyun #define mlan_htons(x) swap_byte_16(x)
368*4882a593Smuzhiyun /** Do nothing */
369*4882a593Smuzhiyun #define wlan_le16_to_cpu(x) x
370*4882a593Smuzhiyun /** Do nothing */
371*4882a593Smuzhiyun #define wlan_le32_to_cpu(x) x
372*4882a593Smuzhiyun /** Do nothing */
373*4882a593Smuzhiyun #define wlan_le64_to_cpu(x) x
374*4882a593Smuzhiyun /** Do nothing */
375*4882a593Smuzhiyun #define wlan_cpu_to_le16(x) x
376*4882a593Smuzhiyun /** Do nothing */
377*4882a593Smuzhiyun #define wlan_cpu_to_le32(x) x
378*4882a593Smuzhiyun /** Do nothing */
379*4882a593Smuzhiyun #define wlan_cpu_to_le64(x) x
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /** Convert TxPD to little endian format from CPU format */
382*4882a593Smuzhiyun #define endian_convert_TxPD(x)                                                 \
383*4882a593Smuzhiyun 	do {                                                                   \
384*4882a593Smuzhiyun 	} while (0)
385*4882a593Smuzhiyun /** Convert RxPD from little endian format to CPU format */
386*4882a593Smuzhiyun #define endian_convert_RxPD(x)                                                 \
387*4882a593Smuzhiyun 	do {                                                                   \
388*4882a593Smuzhiyun 	} while (0)
389*4882a593Smuzhiyun /** Convert RxPD extra header from little endian format to CPU format */
390*4882a593Smuzhiyun #define endian_convert_RxPD_extra_header(x)                                    \
391*4882a593Smuzhiyun 	do {                                                                   \
392*4882a593Smuzhiyun 	} while (0)
393*4882a593Smuzhiyun #endif /* BIG_ENDIAN_SUPPORT */
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun /** Global moal_assert_callback */
396*4882a593Smuzhiyun extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun /** Assertion */
399*4882a593Smuzhiyun #define MASSERT(cond)                                                          \
400*4882a593Smuzhiyun 	do {                                                                   \
401*4882a593Smuzhiyun 		if (!(cond)) {                                                 \
402*4882a593Smuzhiyun 			PRINTM(MFATAL, "ASSERT: %s: %i\n", __func__,           \
403*4882a593Smuzhiyun 			       __LINE__);                                      \
404*4882a593Smuzhiyun 			if (assert_callback) {                                 \
405*4882a593Smuzhiyun 				assert_callback(MNULL, (t_ptr)(cond));         \
406*4882a593Smuzhiyun 			} else {                                               \
407*4882a593Smuzhiyun 				do {                                           \
408*4882a593Smuzhiyun 				} while (1);                                   \
409*4882a593Smuzhiyun 			}                                                      \
410*4882a593Smuzhiyun 		}                                                              \
411*4882a593Smuzhiyun 	} while (0)
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun /** Maximum event buffer size */
414*4882a593Smuzhiyun #define MAX_EVENT_SIZE (3 * 1024)
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun #ifdef STA_SUPPORT
417*4882a593Smuzhiyun /** Maximum buffer size for ARP filter */
418*4882a593Smuzhiyun #define ARP_FILTER_MAX_BUF_SIZE 68
419*4882a593Smuzhiyun #endif /* STA_SUPPORT */
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun /** 60 seconds */
422*4882a593Smuzhiyun #define MRVDRV_TIMER_60S 60000
423*4882a593Smuzhiyun /** 10 seconds */
424*4882a593Smuzhiyun #define MRVDRV_TIMER_10S 10000
425*4882a593Smuzhiyun /** 5 seconds */
426*4882a593Smuzhiyun #define MRVDRV_TIMER_5S 5000
427*4882a593Smuzhiyun /** 3 seconds */
428*4882a593Smuzhiyun #define MRVDRV_TIMER_3S 3000
429*4882a593Smuzhiyun /** 1 second */
430*4882a593Smuzhiyun #define MRVDRV_TIMER_1S 1000
431*4882a593Smuzhiyun 
432*4882a593Smuzhiyun /** Maximum size of multicast list */
433*4882a593Smuzhiyun #define MRVDRV_MAX_MULTICAST_LIST_SIZE 32
434*4882a593Smuzhiyun /** Maximum size of channel */
435*4882a593Smuzhiyun #define MRVDRV_MAX_CHANNEL_SIZE 14
436*4882a593Smuzhiyun /** Maximum length of SSID */
437*4882a593Smuzhiyun #define MRVDRV_MAX_SSID_LENGTH 32
438*4882a593Smuzhiyun /** WEP list macros & data structures */
439*4882a593Smuzhiyun /** Size of key buffer in bytes */
440*4882a593Smuzhiyun #define MRVL_KEY_BUFFER_SIZE_IN_BYTE 16
441*4882a593Smuzhiyun /** Maximum length of WPA key */
442*4882a593Smuzhiyun #define MRVL_MAX_KEY_WPA_KEY_LENGTH 32
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun /** Default listen interval */
445*4882a593Smuzhiyun #define MLAN_DEFAULT_LISTEN_INTERVAL 20
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun /** Maximum number of region codes */
448*4882a593Smuzhiyun #define MRVDRV_MAX_REGION_CODE 9
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun /** Maximum number of CFP codes for BG */
451*4882a593Smuzhiyun #define MRVDRV_MAX_CFP_CODE_BG 0
452*4882a593Smuzhiyun /** Maximum number of CFP codes for A */
453*4882a593Smuzhiyun #define MRVDRV_MAX_CFP_CODE_A 5
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun /** high rx pending packets */
456*4882a593Smuzhiyun #define HIGH_RX_PENDING 1000
457*4882a593Smuzhiyun /** low rx pending packets */
458*4882a593Smuzhiyun #define LOW_RX_PENDING 800
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun /** Default region code */
461*4882a593Smuzhiyun #define MRVDRV_DEFAULT_REGION_CODE 0x10
462*4882a593Smuzhiyun /** Default country code */
463*4882a593Smuzhiyun #define MRVDRV_DEFAULT_COUNTRY_CODE "US"
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun /** Japan country code */
466*4882a593Smuzhiyun #define COUNTRY_CODE_JP_40 0x40
467*4882a593Smuzhiyun /** Japan special country code */
468*4882a593Smuzhiyun #define COUNTRY_CODE_JP_FF 0xFF
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun /** Default factor for calculating beacon average */
471*4882a593Smuzhiyun #define DEFAULT_BCN_AVG_FACTOR 8
472*4882a593Smuzhiyun /** Default factor for calculating data average */
473*4882a593Smuzhiyun #define DEFAULT_DATA_AVG_FACTOR 8
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun /** The first valid channel for use */
476*4882a593Smuzhiyun #define FIRST_VALID_CHANNEL 0xff
477*4882a593Smuzhiyun /** Default Ad-Hoc channel */
478*4882a593Smuzhiyun #define DEFAULT_AD_HOC_CHANNEL 6
479*4882a593Smuzhiyun /** Default Ad-Hoc channel A */
480*4882a593Smuzhiyun #define DEFAULT_AD_HOC_CHANNEL_A 36
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun /** Number of WEP keys */
483*4882a593Smuzhiyun #define MRVL_NUM_WEP_KEY (4)
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun /** Default multiple DTIM */
486*4882a593Smuzhiyun #define MRVDRV_DEFAULT_MULTIPLE_DTIM 1
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun /** Default beacon missing timeout */
489*4882a593Smuzhiyun #define DEFAULT_BCN_MISS_TIMEOUT 10
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun /** Maximum buffer space for beacons retrieved from scan responses */
492*4882a593Smuzhiyun #define MAX_SCAN_BEACON_BUFFER 102400
493*4882a593Smuzhiyun /** Default buffer space for beacons retrieved from scan responses */
494*4882a593Smuzhiyun #define DEFAULT_SCAN_BEACON_BUFFER 4096
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun /**
497*4882a593Smuzhiyun  * @brief Buffer pad space for newly allocated beacons/probe responses
498*4882a593Smuzhiyun  *
499*4882a593Smuzhiyun  * Beacons are typically 6 bytes longer than an equivalent probe response.
500*4882a593Smuzhiyun  *  For each scan response stored, allocate an extra byte pad at the end to
501*4882a593Smuzhiyun  *  allow easy expansion to store a beacon in the same memory a probe response
502*4882a593Smuzhiyun  *  previously contained
503*4882a593Smuzhiyun  */
504*4882a593Smuzhiyun #define SCAN_BEACON_ENTRY_PAD 6
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun /** Scan time specified in the channel TLV
507*4882a593Smuzhiyun  *  for each channel for passive scans
508*4882a593Smuzhiyun  */
509*4882a593Smuzhiyun #define MRVDRV_PASSIVE_SCAN_CHAN_TIME 200
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun /** Scan time specified in the channel TLV
512*4882a593Smuzhiyun  *  for each channel for active scans
513*4882a593Smuzhiyun  */
514*4882a593Smuzhiyun #define MRVDRV_ACTIVE_SCAN_CHAN_TIME 200
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun /** Scan time specified in the channel TLV
517*4882a593Smuzhiyun  *  for each channel for specific scans
518*4882a593Smuzhiyun  */
519*4882a593Smuzhiyun #define MRVDRV_SPECIFIC_SCAN_CHAN_TIME 110
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun /**
522*4882a593Smuzhiyun  * Max total scan time in milliseconds
523*4882a593Smuzhiyun  * The total scan time should be less than scan command timeout value (20s)
524*4882a593Smuzhiyun  */
525*4882a593Smuzhiyun #define MRVDRV_MAX_TOTAL_SCAN_TIME (MRVDRV_TIMER_10S * 2 - MRVDRV_TIMER_1S)
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /** Offset for GTK as it has version to skip past for GTK */
528*4882a593Smuzhiyun #define RSN_GTK_OUI_OFFSET 2
529*4882a593Smuzhiyun 
530*4882a593Smuzhiyun /** If OUI is not found */
531*4882a593Smuzhiyun #define MLAN_OUI_NOT_PRESENT 0
532*4882a593Smuzhiyun /** If OUI is found */
533*4882a593Smuzhiyun #define MLAN_OUI_PRESENT 1
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun /** Is cmd_resp, event or data packet received? */
536*4882a593Smuzhiyun #define IS_CARD_RX_RCVD(adapter)                                               \
537*4882a593Smuzhiyun 	(adapter->cmd_resp_received || adapter->event_received ||              \
538*4882a593Smuzhiyun 	 adapter->data_received)
539*4882a593Smuzhiyun #ifdef USB
540*4882a593Smuzhiyun /** Type length */
541*4882a593Smuzhiyun #define MLAN_TYPE_LEN 4
542*4882a593Smuzhiyun /** Type Command */
543*4882a593Smuzhiyun #define MLAN_USB_TYPE_CMD 0xF00DFACE
544*4882a593Smuzhiyun /** Type VDLL */
545*4882a593Smuzhiyun #define MLAN_USB_TYPE_VDLL 0xF00DC0DE
546*4882a593Smuzhiyun /** Type Data */
547*4882a593Smuzhiyun #define MLAN_USB_TYPE_DATA 0xBEADC0DE
548*4882a593Smuzhiyun /** Type Event */
549*4882a593Smuzhiyun #define MLAN_USB_TYPE_EVENT 0xBEEFFACE
550*4882a593Smuzhiyun #endif /* USB */
551*4882a593Smuzhiyun /** Type command */
552*4882a593Smuzhiyun #define MLAN_TYPE_CMD 1
553*4882a593Smuzhiyun /** Type data */
554*4882a593Smuzhiyun #define MLAN_TYPE_DATA 0
555*4882a593Smuzhiyun /** Type event */
556*4882a593Smuzhiyun #define MLAN_TYPE_EVENT 3
557*4882a593Smuzhiyun /** Type vdll */
558*4882a593Smuzhiyun #define MLAN_TYPE_VDLL 4
559*4882a593Smuzhiyun #ifdef SDIO
560*4882a593Smuzhiyun /** Type single port aggr data */
561*4882a593Smuzhiyun #define MLAN_TYPE_SPA_DATA 10
562*4882a593Smuzhiyun /** OFFSET of 512 block number */
563*4882a593Smuzhiyun #define OFFSET_OF_BLOCK_NUMBER 15
564*4882a593Smuzhiyun /** OFFSET of SDIO Header */
565*4882a593Smuzhiyun #define OFFSET_OF_SDIO_HEADER 28
566*4882a593Smuzhiyun /** sdio max rx size for cmd53, 255 * 256, reserve 1 block for DMA alignment */
567*4882a593Smuzhiyun #define SDIO_CMD53_MAX_SIZE 65280
568*4882a593Smuzhiyun #define MAX_SUPPORT_AMSDU_SIZE 4096
569*4882a593Smuzhiyun /** Maximum numbfer of registers to read for multiple port */
570*4882a593Smuzhiyun #if defined(SD8887) || defined(SD8997) || defined(SD8977) ||                   \
571*4882a593Smuzhiyun 	defined(SD8987) || defined(SD9098) || defined(SD9097) ||               \
572*4882a593Smuzhiyun 	defined(SDNW62X) || defined(SD8978) || defined(SD9177)
573*4882a593Smuzhiyun #define MAX_MP_REGS 196
574*4882a593Smuzhiyun #else
575*4882a593Smuzhiyun /* upto 0xB7 */
576*4882a593Smuzhiyun #define MAX_MP_REGS 184
577*4882a593Smuzhiyun #endif
578*4882a593Smuzhiyun /** Maximum port */
579*4882a593Smuzhiyun #define MAX_PORT 32
580*4882a593Smuzhiyun /** Maximum port 16 */
581*4882a593Smuzhiyun #define MAX_PORT_16 (16)
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun /** max MP REGS */
584*4882a593Smuzhiyun #define MAX_MP_REGS_MAX (196)
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun /** Multi port TX aggregation buffer size */
587*4882a593Smuzhiyun #define SDIO_MP_TX_AGGR_DEF_BUF_SIZE (65280) /* 64K - 256 */
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun /** Multi port RX aggregation buffer size */
590*4882a593Smuzhiyun #define SDIO_MP_RX_AGGR_DEF_BUF_SIZE (65280) /* 64K - 256 */
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun #endif /* SDIO */
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun /** Minimum BA threshold */
595*4882a593Smuzhiyun #define MIN_BA_THRESHOLD 16
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun /** High threshold at which to start drop packets */
598*4882a593Smuzhiyun #define RX_HIGH_THRESHOLD 1024
599*4882a593Smuzhiyun /** Low threshold to allow Rx BA */
600*4882a593Smuzhiyun #define RX_LOW_THRESHOLD 128
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun #define MFG_CMD_SET_TEST_MODE 1
603*4882a593Smuzhiyun #define MFG_CMD_UNSET_TEST_MODE 0
604*4882a593Smuzhiyun #define MFG_CMD_TX_ANT 0x1004
605*4882a593Smuzhiyun #define MFG_CMD_RX_ANT 0x1005
606*4882a593Smuzhiyun #define MFG_CMD_TX_CONT 0x1009
607*4882a593Smuzhiyun #define MFG_CMD_RF_CHAN 0x100A
608*4882a593Smuzhiyun #define MFG_CMD_CLR_RX_ERR 0x1010
609*4882a593Smuzhiyun #define MFG_CMD_TX_FRAME 0x1021
610*4882a593Smuzhiyun #define MFG_CMD_RF_BAND_AG 0x1034
611*4882a593Smuzhiyun #define MFG_CMD_RF_CHANNELBW 0x1044
612*4882a593Smuzhiyun #define MFG_CMD_RADIO_MODE_CFG 0x1211
613*4882a593Smuzhiyun #define MFG_CMD_CONFIG_MAC_HE_TB_TX 0x110A
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun /** Debug command number */
616*4882a593Smuzhiyun #define DBG_CMD_NUM 10
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun /** Info for debug purpose */
619*4882a593Smuzhiyun typedef struct _wlan_dbg {
620*4882a593Smuzhiyun 	/** Number of host to card command failures */
621*4882a593Smuzhiyun 	t_u32 num_cmd_host_to_card_failure;
622*4882a593Smuzhiyun 	/** Number of host to card sleep confirm failures */
623*4882a593Smuzhiyun 	t_u32 num_cmd_sleep_cfm_host_to_card_failure;
624*4882a593Smuzhiyun 	/** Number of host to card Tx failures */
625*4882a593Smuzhiyun 	t_u32 num_tx_host_to_card_failure;
626*4882a593Smuzhiyun 	/** Number of card to host command/event failures */
627*4882a593Smuzhiyun 	t_u32 num_cmdevt_card_to_host_failure;
628*4882a593Smuzhiyun 	/** Number of card to host Rx failures */
629*4882a593Smuzhiyun 	t_u32 num_rx_card_to_host_failure;
630*4882a593Smuzhiyun 	/** Number of interrupt read failures */
631*4882a593Smuzhiyun 	t_u32 num_int_read_failure;
632*4882a593Smuzhiyun 	/** Last interrupt status */
633*4882a593Smuzhiyun 	t_u32 last_int_status;
634*4882a593Smuzhiyun 	/** Number of allocate buffer failure */
635*4882a593Smuzhiyun 	t_u32 num_alloc_buffer_failure;
636*4882a593Smuzhiyun 	/** Number of pkt dropped */
637*4882a593Smuzhiyun 	t_u32 num_pkt_dropped;
638*4882a593Smuzhiyun 	/** Number of deauthentication events */
639*4882a593Smuzhiyun 	t_u32 num_event_deauth;
640*4882a593Smuzhiyun 	/** Number of disassosiation events */
641*4882a593Smuzhiyun 	t_u32 num_event_disassoc;
642*4882a593Smuzhiyun 	/** Number of link lost events */
643*4882a593Smuzhiyun 	t_u32 num_event_link_lost;
644*4882a593Smuzhiyun 	/** Number of deauthentication commands */
645*4882a593Smuzhiyun 	t_u32 num_cmd_deauth;
646*4882a593Smuzhiyun 	/** Number of association comamnd successes */
647*4882a593Smuzhiyun 	t_u32 num_cmd_assoc_success;
648*4882a593Smuzhiyun 	/** Number of association command failures */
649*4882a593Smuzhiyun 	t_u32 num_cmd_assoc_failure;
650*4882a593Smuzhiyun 	/** Number of consecutive association command failures */
651*4882a593Smuzhiyun 	t_u32 num_cons_assoc_failure;
652*4882a593Smuzhiyun 
653*4882a593Smuzhiyun 	/** Timeout command ID */
654*4882a593Smuzhiyun 	t_u16 timeout_cmd_id;
655*4882a593Smuzhiyun 	/** Timeout command action */
656*4882a593Smuzhiyun 	t_u16 timeout_cmd_act;
657*4882a593Smuzhiyun 	/** List of last command IDs */
658*4882a593Smuzhiyun 	t_u16 last_cmd_id[DBG_CMD_NUM];
659*4882a593Smuzhiyun 	/** List of last command actions */
660*4882a593Smuzhiyun 	t_u16 last_cmd_act[DBG_CMD_NUM];
661*4882a593Smuzhiyun 	/** Last command index */
662*4882a593Smuzhiyun 	t_u16 last_cmd_index;
663*4882a593Smuzhiyun 	/** List of last command response IDs */
664*4882a593Smuzhiyun 	t_u16 last_cmd_resp_id[DBG_CMD_NUM];
665*4882a593Smuzhiyun 	/** Last command response index */
666*4882a593Smuzhiyun 	t_u16 last_cmd_resp_index;
667*4882a593Smuzhiyun 	/** List of last events */
668*4882a593Smuzhiyun 	t_u16 last_event[DBG_CMD_NUM];
669*4882a593Smuzhiyun 	/** Last event index */
670*4882a593Smuzhiyun 	t_u16 last_event_index;
671*4882a593Smuzhiyun 	/** Number of no free command node */
672*4882a593Smuzhiyun 	t_u16 num_no_cmd_node;
673*4882a593Smuzhiyun } wlan_dbg;
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun /** Hardware status codes */
676*4882a593Smuzhiyun typedef enum _WLAN_HARDWARE_STATUS {
677*4882a593Smuzhiyun 	WlanHardwareStatusReady,
678*4882a593Smuzhiyun 	WlanHardwareStatusGetHwSpec,
679*4882a593Smuzhiyun 	WlanHardwareStatusGetHwSpecdone,
680*4882a593Smuzhiyun 	WlanHardwareStatusInitializing,
681*4882a593Smuzhiyun 	WlanHardwareStatusInitdone,
682*4882a593Smuzhiyun 	WlanHardwareStatusReset,
683*4882a593Smuzhiyun 	WlanHardwareStatusClosing,
684*4882a593Smuzhiyun 	WlanHardwareStatusNotReady
685*4882a593Smuzhiyun } WLAN_HARDWARE_STATUS;
686*4882a593Smuzhiyun 
687*4882a593Smuzhiyun /** WLAN_802_11_POWER_MODE */
688*4882a593Smuzhiyun typedef enum _WLAN_802_11_POWER_MODE {
689*4882a593Smuzhiyun 	Wlan802_11PowerModeCAM,
690*4882a593Smuzhiyun 	Wlan802_11PowerModePSP
691*4882a593Smuzhiyun } WLAN_802_11_POWER_MODE;
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun /** tx param */
694*4882a593Smuzhiyun typedef struct _mlan_tx_param {
695*4882a593Smuzhiyun 	/** next packet length */
696*4882a593Smuzhiyun 	t_u32 next_pkt_len;
697*4882a593Smuzhiyun } mlan_tx_param;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun /** PS_STATE */
700*4882a593Smuzhiyun typedef enum _PS_STATE {
701*4882a593Smuzhiyun 	PS_STATE_AWAKE,
702*4882a593Smuzhiyun 	PS_STATE_PRE_SLEEP,
703*4882a593Smuzhiyun 	PS_STATE_SLEEP_CFM,
704*4882a593Smuzhiyun 	PS_STATE_SLEEP
705*4882a593Smuzhiyun } PS_STATE;
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun /** Minimum flush timer for win size of 1 is 50 ms */
708*4882a593Smuzhiyun #define MIN_FLUSH_TIMER_MS 50
709*4882a593Smuzhiyun /** Minimum flush timer for win size of 1 is 15 ms */
710*4882a593Smuzhiyun #define MIN_FLUSH_TIMER_15_MS 15
711*4882a593Smuzhiyun 
712*4882a593Smuzhiyun /** Tx BA stream table */
713*4882a593Smuzhiyun typedef struct _TxBAStreamTbl TxBAStreamTbl;
714*4882a593Smuzhiyun 
715*4882a593Smuzhiyun /** Add BA parameter data structure */
716*4882a593Smuzhiyun typedef struct {
717*4882a593Smuzhiyun 	/** Window size for initiator */
718*4882a593Smuzhiyun 	t_u32 tx_win_size;
719*4882a593Smuzhiyun 	/** Window size for receiver */
720*4882a593Smuzhiyun 	t_u32 rx_win_size;
721*4882a593Smuzhiyun 	/** Block ack timeout */
722*4882a593Smuzhiyun 	t_u32 timeout;
723*4882a593Smuzhiyun 	/** amsdu support for ADDBA request */
724*4882a593Smuzhiyun 	t_u8 tx_amsdu;
725*4882a593Smuzhiyun 	/** amsdu support for ADDBA response */
726*4882a593Smuzhiyun 	t_u8 rx_amsdu;
727*4882a593Smuzhiyun } add_ba_param_t;
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun /** Tx aggregation data structure */
730*4882a593Smuzhiyun typedef struct _txAggr_t {
731*4882a593Smuzhiyun 	/** AMPDU user */
732*4882a593Smuzhiyun 	t_u8 ampdu_user;
733*4882a593Smuzhiyun 	/** AMPDU AP */
734*4882a593Smuzhiyun 	t_u8 ampdu_ap;
735*4882a593Smuzhiyun 	/** AMSDU */
736*4882a593Smuzhiyun 	t_u8 amsdu;
737*4882a593Smuzhiyun } tx_aggr_t;
738*4882a593Smuzhiyun 
739*4882a593Smuzhiyun /** del ba threshold */
740*4882a593Smuzhiyun #define DEL_BA_THRESHOLD 10
741*4882a593Smuzhiyun /** BA stream status */
742*4882a593Smuzhiyun typedef enum _baStatus_e {
743*4882a593Smuzhiyun 	BA_STREAM_NOT_SETUP = 0,
744*4882a593Smuzhiyun 	BA_STREAM_SETUP_INPROGRESS,
745*4882a593Smuzhiyun 	BA_STREAM_SETUP_COMPLETE
746*4882a593Smuzhiyun } baStatus_e;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun /** RA list table */
749*4882a593Smuzhiyun typedef struct _raListTbl raListTbl, *praListTbl;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun /** RA list table */
752*4882a593Smuzhiyun struct _raListTbl {
753*4882a593Smuzhiyun 	/** Pointer to previous node */
754*4882a593Smuzhiyun 	raListTbl *pprev;
755*4882a593Smuzhiyun 	/** Pointer to next node */
756*4882a593Smuzhiyun 	raListTbl *pnext;
757*4882a593Smuzhiyun 	/** Buffer list head */
758*4882a593Smuzhiyun 	mlan_list_head buf_head;
759*4882a593Smuzhiyun 	/** RA list buffer */
760*4882a593Smuzhiyun 	t_u8 ra[MLAN_MAC_ADDR_LENGTH];
761*4882a593Smuzhiyun 	/** total packets in RA list */
762*4882a593Smuzhiyun 	t_u16 total_pkts;
763*4882a593Smuzhiyun 	/** packets received */
764*4882a593Smuzhiyun 	t_u16 packet_count;
765*4882a593Smuzhiyun 	/** packet count threshold to setup BA */
766*4882a593Smuzhiyun 	t_u8 ba_packet_threshold;
767*4882a593Smuzhiyun 	/** is 11n enabled */
768*4882a593Smuzhiyun 	t_u8 is_wmm_enabled;
769*4882a593Smuzhiyun 	/** max amsdu size */
770*4882a593Smuzhiyun 	t_u16 max_amsdu;
771*4882a593Smuzhiyun 	/** BA stream status */
772*4882a593Smuzhiyun 	baStatus_e ba_status;
773*4882a593Smuzhiyun 	/** del ba count */
774*4882a593Smuzhiyun 	t_u8 del_ba_count;
775*4882a593Smuzhiyun 	/** amsdu in ampdu flag */
776*4882a593Smuzhiyun 	t_u8 amsdu_in_ampdu;
777*4882a593Smuzhiyun 	/** tdls flag */
778*4882a593Smuzhiyun 	t_u8 is_tdls_link;
779*4882a593Smuzhiyun 	/** tx_pause flag */
780*4882a593Smuzhiyun 	t_u8 tx_pause;
781*4882a593Smuzhiyun };
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun /** TID table */
784*4882a593Smuzhiyun typedef struct _tidTbl {
785*4882a593Smuzhiyun 	/** RA list head */
786*4882a593Smuzhiyun 	mlan_list_head ra_list;
787*4882a593Smuzhiyun 	/** Current RA list */
788*4882a593Smuzhiyun 	raListTbl *ra_list_curr;
789*4882a593Smuzhiyun } tid_tbl_t;
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun /** Highest priority setting for a packet (uses voice AC) */
792*4882a593Smuzhiyun #define WMM_HIGHEST_PRIORITY 7
793*4882a593Smuzhiyun /** Highest priority TID  */
794*4882a593Smuzhiyun #define HIGH_PRIO_TID 7
795*4882a593Smuzhiyun /** Lowest priority TID  */
796*4882a593Smuzhiyun #define LOW_PRIO_TID 0
797*4882a593Smuzhiyun /** No packet priority (< lowest) */
798*4882a593Smuzhiyun #define NO_PKT_PRIO_TID -1
799*4882a593Smuzhiyun 
800*4882a593Smuzhiyun /** Max driver packet delay in msec */
801*4882a593Smuzhiyun #define WMM_DRV_DELAY_MAX 510
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun /** Struct of WMM DESC */
804*4882a593Smuzhiyun typedef struct _wmm_desc {
805*4882a593Smuzhiyun 	/** TID table */
806*4882a593Smuzhiyun 	tid_tbl_t tid_tbl_ptr[MAX_NUM_TID];
807*4882a593Smuzhiyun 	/** Packets out */
808*4882a593Smuzhiyun 	t_u32 packets_out[MAX_NUM_TID];
809*4882a593Smuzhiyun 	/** Packets queued */
810*4882a593Smuzhiyun 	t_u32 pkts_queued[MAX_NUM_TID];
811*4882a593Smuzhiyun 	/** Packets paused */
812*4882a593Smuzhiyun 	t_u32 pkts_paused[MAX_NUM_TID];
813*4882a593Smuzhiyun 	/** Spin lock to protect ra_list */
814*4882a593Smuzhiyun 	t_void *ra_list_spinlock;
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 	/** AC status */
817*4882a593Smuzhiyun 	WmmAcStatus_t ac_status[MAX_AC_QUEUES];
818*4882a593Smuzhiyun 	/** AC downgraded values */
819*4882a593Smuzhiyun 	mlan_wmm_ac_e ac_down_graded_vals[MAX_AC_QUEUES];
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	/** Max driver packet delay sent to the firmware for expiry eval */
822*4882a593Smuzhiyun 	t_u32 drv_pkt_delay_max;
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun 	/** WMM queue priority table */
825*4882a593Smuzhiyun 	t_u8 queue_priority[MAX_AC_QUEUES];
826*4882a593Smuzhiyun 	/** User priority packet transmission control */
827*4882a593Smuzhiyun 	t_u32 user_pri_pkt_tx_ctrl[WMM_HIGHEST_PRIORITY + 1]; /* UP: 0 to 7 */
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	/** Number of transmit packets queued */
830*4882a593Smuzhiyun 	mlan_scalar tx_pkts_queued;
831*4882a593Smuzhiyun 	/** Tracks highest priority with a packet queued */
832*4882a593Smuzhiyun 	mlan_scalar highest_queued_prio;
833*4882a593Smuzhiyun } wmm_desc_t;
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun /** Security structure */
836*4882a593Smuzhiyun typedef struct _wlan_802_11_security_t {
837*4882a593Smuzhiyun 	/** WPA enabled flag */
838*4882a593Smuzhiyun 	t_u8 wpa_enabled;
839*4882a593Smuzhiyun 	/** E-Supplicant enabled flag */
840*4882a593Smuzhiyun 	t_u8 ewpa_enabled;
841*4882a593Smuzhiyun 	/** WPA2 enabled flag */
842*4882a593Smuzhiyun 	t_u8 wpa2_enabled;
843*4882a593Smuzhiyun 	/** WAPI enabled flag */
844*4882a593Smuzhiyun 	t_u8 wapi_enabled;
845*4882a593Smuzhiyun 	/** WAPI key on flag */
846*4882a593Smuzhiyun 	t_u8 wapi_key_on;
847*4882a593Smuzhiyun 	/** WEP status */
848*4882a593Smuzhiyun 	WLAN_802_11_WEP_STATUS wep_status;
849*4882a593Smuzhiyun 	/** Authentication mode */
850*4882a593Smuzhiyun 	t_u32 authentication_mode;
851*4882a593Smuzhiyun 	/** Encryption mode */
852*4882a593Smuzhiyun 	t_u32 encryption_mode;
853*4882a593Smuzhiyun 	/** Hotspot OSEN enabled */
854*4882a593Smuzhiyun 	t_u8 osen_enabled;
855*4882a593Smuzhiyun } wlan_802_11_security_t;
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun /** Current Basic Service Set State Structure */
858*4882a593Smuzhiyun typedef struct {
859*4882a593Smuzhiyun 	/** BSS descriptor */
860*4882a593Smuzhiyun 	BSSDescriptor_t bss_descriptor;
861*4882a593Smuzhiyun 	/** WMM enable? */
862*4882a593Smuzhiyun 	t_u8 wmm_enabled;
863*4882a593Smuzhiyun 	/** Uapsd enable?*/
864*4882a593Smuzhiyun 	t_u8 wmm_uapsd_enabled;
865*4882a593Smuzhiyun 	/** Band */
866*4882a593Smuzhiyun 	t_u16 band;
867*4882a593Smuzhiyun 	/** Number of rates supported */
868*4882a593Smuzhiyun 	t_u32 num_of_rates;
869*4882a593Smuzhiyun 	/** Supported rates*/
870*4882a593Smuzhiyun 	t_u8 data_rates[WLAN_SUPPORTED_RATES];
871*4882a593Smuzhiyun 	/** Host MLME flag*/
872*4882a593Smuzhiyun 	t_u8 host_mlme;
873*4882a593Smuzhiyun 	mlan_802_11_mac_addr prev_bssid;
874*4882a593Smuzhiyun 	t_u8 use_mfp;
875*4882a593Smuzhiyun } current_bss_params_t;
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun /** Sleep_params */
878*4882a593Smuzhiyun typedef struct _sleep_params_t {
879*4882a593Smuzhiyun 	/** Sleep parameter error */
880*4882a593Smuzhiyun 	t_u16 sp_error;
881*4882a593Smuzhiyun 	/** Sleep parameter offset */
882*4882a593Smuzhiyun 	t_u16 sp_offset;
883*4882a593Smuzhiyun 	/** Sleep parameter stable time */
884*4882a593Smuzhiyun 	t_u16 sp_stable_time;
885*4882a593Smuzhiyun 	/** Sleep parameter calibration control */
886*4882a593Smuzhiyun 	t_u8 sp_cal_control;
887*4882a593Smuzhiyun 	/** Sleep parameter external sleep clock */
888*4882a593Smuzhiyun 	t_u8 sp_ext_sleep_clk;
889*4882a593Smuzhiyun 	/** Sleep parameter reserved */
890*4882a593Smuzhiyun 	t_u16 sp_reserved;
891*4882a593Smuzhiyun } sleep_params_t;
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun /** Sleep_period */
894*4882a593Smuzhiyun typedef struct sleep_period_t {
895*4882a593Smuzhiyun 	/** Sleep period */
896*4882a593Smuzhiyun 	t_u16 period;
897*4882a593Smuzhiyun 	/** Reserved */
898*4882a593Smuzhiyun 	t_u16 reserved;
899*4882a593Smuzhiyun } sleep_period_t;
900*4882a593Smuzhiyun 
901*4882a593Smuzhiyun /** mrvl_wep_key_t */
902*4882a593Smuzhiyun typedef struct _mrvl_wep_key_t {
903*4882a593Smuzhiyun 	/** Length */
904*4882a593Smuzhiyun 	t_u32 length;
905*4882a593Smuzhiyun 	/** WEP key index */
906*4882a593Smuzhiyun 	t_u32 key_index;
907*4882a593Smuzhiyun 	/** WEP key length */
908*4882a593Smuzhiyun 	t_u32 key_length;
909*4882a593Smuzhiyun 	/** WEP keys */
910*4882a593Smuzhiyun 	t_u8 key_material[MRVL_KEY_BUFFER_SIZE_IN_BYTE];
911*4882a593Smuzhiyun } mrvl_wep_key_t;
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun /** Maximum number of region channel */
914*4882a593Smuzhiyun #define MAX_REGION_CHANNEL_NUM 2
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun /** Region-band mapping table */
917*4882a593Smuzhiyun typedef struct _region_chan_t {
918*4882a593Smuzhiyun 	/** TRUE if this entry is valid */
919*4882a593Smuzhiyun 	t_u8 valid;
920*4882a593Smuzhiyun 	/** Region code for US, Japan ... */
921*4882a593Smuzhiyun 	t_u8 region;
922*4882a593Smuzhiyun 	/** Band B/G/A, used for BAND_CONFIG cmd */
923*4882a593Smuzhiyun 	t_u16 band;
924*4882a593Smuzhiyun 	/** Actual No. of elements in the array below */
925*4882a593Smuzhiyun 	t_u8 num_cfp;
926*4882a593Smuzhiyun 	/** chan-freq-txpower mapping table */
927*4882a593Smuzhiyun 	chan_freq_power_t *pcfp;
928*4882a593Smuzhiyun } region_chan_t;
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun /** State of 11d */
931*4882a593Smuzhiyun typedef enum _state_11d_t {
932*4882a593Smuzhiyun 	DISABLE_11D = 0,
933*4882a593Smuzhiyun 	ENABLE_11D = 1,
934*4882a593Smuzhiyun } state_11d_t;
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun #define DEFAULT_11D_STATE DISABLE_11D
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun /** Domain regulatory information */
939*4882a593Smuzhiyun typedef struct _wlan_802_11d_domain_reg {
940*4882a593Smuzhiyun 	/** dfs_region */
941*4882a593Smuzhiyun 	t_u8 dfs_region;
942*4882a593Smuzhiyun 	/** Country Code */
943*4882a593Smuzhiyun 	t_u8 country_code[COUNTRY_CODE_LEN];
944*4882a593Smuzhiyun 	/** band that channels in sub_band belong to */
945*4882a593Smuzhiyun 	t_u16 band;
946*4882a593Smuzhiyun 	/** No. of subband in below */
947*4882a593Smuzhiyun 	t_u8 no_of_sub_band;
948*4882a593Smuzhiyun 	/** Subband data to send/last sent */
949*4882a593Smuzhiyun 	IEEEtypes_SubbandSet_t sub_band[MRVDRV_MAX_SUBBAND_802_11D];
950*4882a593Smuzhiyun } wlan_802_11d_domain_reg_t;
951*4882a593Smuzhiyun 
952*4882a593Smuzhiyun /** Data for state machine */
953*4882a593Smuzhiyun typedef struct _wlan_802_11d_state {
954*4882a593Smuzhiyun 	/** True for enabling 11D */
955*4882a593Smuzhiyun 	state_11d_t enable_11d;
956*4882a593Smuzhiyun 	/** True for user enabling 11D */
957*4882a593Smuzhiyun 	state_11d_t user_enable_11d;
958*4882a593Smuzhiyun } wlan_802_11d_state_t;
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun /** 802.11h State information kept in the 'mlan_private' driver structure */
961*4882a593Smuzhiyun typedef struct {
962*4882a593Smuzhiyun 	/** Indicate 11h is enabled from host */
963*4882a593Smuzhiyun 	t_bool is_11h_host;
964*4882a593Smuzhiyun 	/** Indicates whether 11h is enabled in the driver */
965*4882a593Smuzhiyun 	t_bool is_11h_enabled;
966*4882a593Smuzhiyun 	/** Indicates whether 11h is active in the firmware */
967*4882a593Smuzhiyun 	t_bool is_11h_active;
968*4882a593Smuzhiyun 	/** Master device using automatic channel select */
969*4882a593Smuzhiyun 	t_bool adhoc_auto_sel_chan;
970*4882a593Smuzhiyun 	/** Set when driver receives a STOP TX event from fw */
971*4882a593Smuzhiyun 	t_bool tx_disabled;
972*4882a593Smuzhiyun 	/** Channel that ChanSwAnn was received for, non-zero = active */
973*4882a593Smuzhiyun 	t_u8 dfs_slave_csa_chan;
974*4882a593Smuzhiyun 	/** Expiry for above variable, seconds in system time */
975*4882a593Smuzhiyun 	t_u32 dfs_slave_csa_expire_at_sec;
976*4882a593Smuzhiyun } wlan_11h_interface_state_t;
977*4882a593Smuzhiyun 
978*4882a593Smuzhiyun #if defined(UAP_SUPPORT)
979*4882a593Smuzhiyun /** UAP get info callback state kept in the 'mlan_private' driver structure */
980*4882a593Smuzhiyun typedef struct {
981*4882a593Smuzhiyun 	/** UAP internal callback after wlan_uap_get_channel */
982*4882a593Smuzhiyun 	/**  (parameter is really pointer to mlan_private)   */
983*4882a593Smuzhiyun 	mlan_status (*get_chan_callback)(t_void *);
984*4882a593Smuzhiyun 	/** current ioctl_req (to be completed in callback) */
985*4882a593Smuzhiyun 	pmlan_ioctl_req pioctl_req_curr;
986*4882a593Smuzhiyun 	/** band config from MrvlIEtypes_channel_band_t */
987*4882a593Smuzhiyun 	Band_Config_t bandcfg;
988*4882a593Smuzhiyun 	/** channel from MrvlIEtypes_channel_band_t */
989*4882a593Smuzhiyun 	t_u8 channel;
990*4882a593Smuzhiyun 	/** beacon period (in msec) from MrvlIEtypes_beacon_period_t */
991*4882a593Smuzhiyun 	t_u16 beacon_period;
992*4882a593Smuzhiyun 	/** dtim period (no unit) from MrvlIEtypes_dtim_period_t */
993*4882a593Smuzhiyun 	t_u8 dtim_period;
994*4882a593Smuzhiyun } wlan_uap_get_info_cb_t;
995*4882a593Smuzhiyun #endif
996*4882a593Smuzhiyun 
997*4882a593Smuzhiyun /** Data structure for WPS information */
998*4882a593Smuzhiyun typedef struct {
999*4882a593Smuzhiyun 	/** WPS IE */
1000*4882a593Smuzhiyun 	IEEEtypes_VendorSpecific_t wps_ie;
1001*4882a593Smuzhiyun 	/** Session enable flag */
1002*4882a593Smuzhiyun 	t_u8 session_enable;
1003*4882a593Smuzhiyun } wps_t;
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun /** mlan_operations data structure */
1006*4882a593Smuzhiyun typedef struct _mlan_operations {
1007*4882a593Smuzhiyun 	/** cmd init handler */
1008*4882a593Smuzhiyun 	mlan_status (*init_cmd)(t_void *priv, t_u8 first_bss);
1009*4882a593Smuzhiyun 	/** ioctl handler */
1010*4882a593Smuzhiyun 	mlan_status (*ioctl)(t_void *adapter, pmlan_ioctl_req pioctl_req);
1011*4882a593Smuzhiyun 	/** cmd handler */
1012*4882a593Smuzhiyun 	mlan_status (*prepare_cmd)(t_void *priv, t_u16 cmd_no, t_u16 cmd_action,
1013*4882a593Smuzhiyun 				   t_u32 cmd_oid, t_void *pioctl_buf,
1014*4882a593Smuzhiyun 				   t_void *pdata_buf, t_void *pcmd_buf);
1015*4882a593Smuzhiyun 	/** cmdresp handler */
1016*4882a593Smuzhiyun 	mlan_status (*process_cmdresp)(t_void *priv, t_u16 cmdresp_no,
1017*4882a593Smuzhiyun 				       t_void *pcmd_buf, t_void *pioctl);
1018*4882a593Smuzhiyun 	/** rx handler */
1019*4882a593Smuzhiyun 	mlan_status (*process_rx_packet)(t_void *adapter, pmlan_buffer pmbuf);
1020*4882a593Smuzhiyun 	/** event handler */
1021*4882a593Smuzhiyun 	mlan_status (*process_event)(t_void *priv);
1022*4882a593Smuzhiyun 	/** txpd handler */
1023*4882a593Smuzhiyun 	t_void *(*process_txpd)(t_void *priv, pmlan_buffer pmbuf);
1024*4882a593Smuzhiyun 	/** BSS role */
1025*4882a593Smuzhiyun 	mlan_bss_role bss_role;
1026*4882a593Smuzhiyun } mlan_operations, *pmlan_operations;
1027*4882a593Smuzhiyun 
1028*4882a593Smuzhiyun /** Private structure for MLAN */
1029*4882a593Smuzhiyun typedef struct _mlan_private {
1030*4882a593Smuzhiyun 	/** Pointer to mlan_adapter */
1031*4882a593Smuzhiyun 	struct _mlan_adapter *adapter;
1032*4882a593Smuzhiyun 	/** BSS index */
1033*4882a593Smuzhiyun 	t_u8 bss_index;
1034*4882a593Smuzhiyun 	/** BSS type */
1035*4882a593Smuzhiyun 	t_u8 bss_type;
1036*4882a593Smuzhiyun 	/** BSS role */
1037*4882a593Smuzhiyun 	t_u8 bss_role;
1038*4882a593Smuzhiyun 	/** BSS virtual flag */
1039*4882a593Smuzhiyun 	t_u8 bss_virtual;
1040*4882a593Smuzhiyun 	/** BSS Priority */
1041*4882a593Smuzhiyun 	t_u8 bss_priority;
1042*4882a593Smuzhiyun 	/** BSS number */
1043*4882a593Smuzhiyun 	t_u8 bss_num;
1044*4882a593Smuzhiyun 	/** Frame type */
1045*4882a593Smuzhiyun 	t_u8 frame_type;
1046*4882a593Smuzhiyun 	/** MAC address information */
1047*4882a593Smuzhiyun 	t_u8 curr_addr[MLAN_MAC_ADDR_LENGTH];
1048*4882a593Smuzhiyun 	/** Media connection status */
1049*4882a593Smuzhiyun 	t_bool media_connected;
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 	/** Current packet filter */
1052*4882a593Smuzhiyun 	t_u32 curr_pkt_filter;
1053*4882a593Smuzhiyun 	/** Infrastructure mode */
1054*4882a593Smuzhiyun 	t_u32 bss_mode;
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun 	/** Tx packet control */
1057*4882a593Smuzhiyun 	t_u32 pkt_tx_ctrl;
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	/** Tx power level */
1060*4882a593Smuzhiyun 	t_s16 tx_power_level;
1061*4882a593Smuzhiyun 	/** Maximum Tx power level */
1062*4882a593Smuzhiyun 	t_s8 max_tx_power_level;
1063*4882a593Smuzhiyun 	/** Minimum Tx power level */
1064*4882a593Smuzhiyun 	t_s8 min_tx_power_level;
1065*4882a593Smuzhiyun 	/** Tx rate */
1066*4882a593Smuzhiyun 	t_u8 tx_rate;
1067*4882a593Smuzhiyun 	t_u8 tx_rate_info;
1068*4882a593Smuzhiyun 	/*HE tx tone mode and DCM info*/
1069*4882a593Smuzhiyun 	t_u8 ext_tx_rate_info;
1070*4882a593Smuzhiyun 	/*HE rx tone mode and DCM info*/
1071*4882a593Smuzhiyun 	t_u8 rxpd_rx_info;
1072*4882a593Smuzhiyun 	/** rxpd_htinfo */
1073*4882a593Smuzhiyun 	t_u8 rxpd_rate_info;
1074*4882a593Smuzhiyun 	/** max amsdu size */
1075*4882a593Smuzhiyun 	t_u16 max_amsdu;
1076*4882a593Smuzhiyun 	/** amsdu disable flag */
1077*4882a593Smuzhiyun 	t_u8 amsdu_disable;
1078*4882a593Smuzhiyun 	/** 802.11n Device Capabilities for 2.4GHz */
1079*4882a593Smuzhiyun 	t_u32 usr_dot_11n_dev_cap_bg;
1080*4882a593Smuzhiyun 	/** 802.11n Device Capabilities for 5GHz */
1081*4882a593Smuzhiyun 	t_u32 usr_dot_11n_dev_cap_a;
1082*4882a593Smuzhiyun 	/** MIMO abstraction of MCSs supported by device */
1083*4882a593Smuzhiyun 	t_u8 usr_dev_mcs_support;
1084*4882a593Smuzhiyun #ifdef UAP_SUPPORT
1085*4882a593Smuzhiyun 	/** UAP 11n flag */
1086*4882a593Smuzhiyun 	t_u8 is_11n_enabled;
1087*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
1088*4882a593Smuzhiyun 	/** UAP 11ac flag */
1089*4882a593Smuzhiyun 	t_u8 is_11ac_enabled;
1090*4882a593Smuzhiyun 	/** UAP 11ax flag */
1091*4882a593Smuzhiyun 	t_u8 is_11ax_enabled;
1092*4882a593Smuzhiyun 	/** tx vht_info */
1093*4882a593Smuzhiyun 	t_u8 tx_vhtinfo;
1094*4882a593Smuzhiyun 	/** rxpd_vhtinfo */
1095*4882a593Smuzhiyun 	t_u8 rxpd_vhtinfo;
1096*4882a593Smuzhiyun 	/** 802.11ac Device Capabilities for 2.4GHz */
1097*4882a593Smuzhiyun 	t_u32 usr_dot_11ac_dev_cap_bg;
1098*4882a593Smuzhiyun 	/** 802.11ac Device Capabilities for 5GHz */
1099*4882a593Smuzhiyun 	t_u32 usr_dot_11ac_dev_cap_a;
1100*4882a593Smuzhiyun 	/** MIMO abstraction of MCSs supported by device */
1101*4882a593Smuzhiyun 	t_u32 usr_dot_11ac_mcs_support;
1102*4882a593Smuzhiyun 	/** user dot 11ac_BW */
1103*4882a593Smuzhiyun 	t_u8 usr_dot_11ac_bw;
1104*4882a593Smuzhiyun 	/** user dot 11ac_opermode_BW */
1105*4882a593Smuzhiyun 	t_u8 usr_dot_11ac_opermode_bw;
1106*4882a593Smuzhiyun 	/** user dot 11ac_opermode_nss */
1107*4882a593Smuzhiyun 	t_u8 usr_dot_11ac_opermode_nss;
1108*4882a593Smuzhiyun 	/** length of hw he capability */
1109*4882a593Smuzhiyun 	t_u8 user_hecap_len;
1110*4882a593Smuzhiyun 	/** user configured 802.11ax HE capability */
1111*4882a593Smuzhiyun 	t_u8 user_he_cap[54];
1112*4882a593Smuzhiyun 	/** length of hw he capability */
1113*4882a593Smuzhiyun 	t_u8 user_2g_hecap_len;
1114*4882a593Smuzhiyun 	/** user configured 802.11ax HE capability */
1115*4882a593Smuzhiyun 	t_u8 user_2g_he_cap[54];
1116*4882a593Smuzhiyun 	/**  dropped pkts */
1117*4882a593Smuzhiyun 	t_u32 num_drop_pkts;
1118*4882a593Smuzhiyun #ifdef UAP_SUPPORT
1119*4882a593Smuzhiyun 	/** packet forward control */
1120*4882a593Smuzhiyun 	t_u8 pkt_fwd;
1121*4882a593Smuzhiyun #endif
1122*4882a593Smuzhiyun 	/** TX beamforming capability */
1123*4882a593Smuzhiyun 	t_u32 tx_bf_cap;
1124*4882a593Smuzhiyun 	/** Rx PD rate */
1125*4882a593Smuzhiyun 	t_u8 rxpd_rate;
1126*4882a593Smuzhiyun 	/** Bitmap rates */
1127*4882a593Smuzhiyun 	t_u16 bitmap_rates[MAX_BITMAP_RATES_SIZE];
1128*4882a593Smuzhiyun 	/** Data rate */
1129*4882a593Smuzhiyun 	t_u32 data_rate;
1130*4882a593Smuzhiyun 	/** Automatic data rate flag */
1131*4882a593Smuzhiyun 	t_u8 is_data_rate_auto;
1132*4882a593Smuzhiyun 	/** Factor for calculating beacon average */
1133*4882a593Smuzhiyun 	t_u16 bcn_avg_factor;
1134*4882a593Smuzhiyun 	/** Factor for calculating data average */
1135*4882a593Smuzhiyun 	t_u16 data_avg_factor;
1136*4882a593Smuzhiyun 	/** SNR */
1137*4882a593Smuzhiyun 	t_s8 snr;
1138*4882a593Smuzhiyun 	/** Noise Floor */
1139*4882a593Smuzhiyun 	t_s8 nf;
1140*4882a593Smuzhiyun 	/** Last data RSSI */
1141*4882a593Smuzhiyun 	t_s16 data_rssi_last;
1142*4882a593Smuzhiyun 	/** Last data Noise Floor */
1143*4882a593Smuzhiyun 	t_s16 data_nf_last;
1144*4882a593Smuzhiyun 	/** Average data RSSI */
1145*4882a593Smuzhiyun 	t_s16 data_rssi_avg;
1146*4882a593Smuzhiyun 	/** Averag data Noise Floor */
1147*4882a593Smuzhiyun 	t_s16 data_nf_avg;
1148*4882a593Smuzhiyun 	/** Last beacon RSSI */
1149*4882a593Smuzhiyun 	t_s16 bcn_rssi_last;
1150*4882a593Smuzhiyun 	/** Last beacon Noise Floor */
1151*4882a593Smuzhiyun 	t_s16 bcn_nf_last;
1152*4882a593Smuzhiyun 	/** Average beacon RSSI */
1153*4882a593Smuzhiyun 	t_s16 bcn_rssi_avg;
1154*4882a593Smuzhiyun 	/** Average beacon Noise Floor */
1155*4882a593Smuzhiyun 	t_s16 bcn_nf_avg;
1156*4882a593Smuzhiyun 	/** Attempted BSS descriptor */
1157*4882a593Smuzhiyun 	BSSDescriptor_t *pattempted_bss_desc;
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 	/** GTK rekey data*/
1160*4882a593Smuzhiyun 	mlan_ds_misc_gtk_rekey_data gtk_rekey;
1161*4882a593Smuzhiyun 
1162*4882a593Smuzhiyun 	/** Current SSID/BSSID related parameters*/
1163*4882a593Smuzhiyun 	current_bss_params_t curr_bss_params;
1164*4882a593Smuzhiyun 	/** current channel flags */
1165*4882a593Smuzhiyun 	t_u32 curr_chan_flags;
1166*4882a593Smuzhiyun 	/** User selected bands */
1167*4882a593Smuzhiyun 	t_u16 config_bands;
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	/** Beacon period */
1170*4882a593Smuzhiyun 	t_u16 beacon_period;
1171*4882a593Smuzhiyun 	/** Listen interval */
1172*4882a593Smuzhiyun 	t_u16 listen_interval;
1173*4882a593Smuzhiyun 	/** ATIM window */
1174*4882a593Smuzhiyun 	t_u16 atim_window;
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun 	/** AdHoc channel */
1177*4882a593Smuzhiyun 	t_u8 adhoc_channel;
1178*4882a593Smuzhiyun 	/** AdHoc link sensed flag */
1179*4882a593Smuzhiyun 	t_u8 adhoc_is_link_sensed;
1180*4882a593Smuzhiyun 	/** AdHoc operating state */
1181*4882a593Smuzhiyun 	t_u8 adhoc_state;
1182*4882a593Smuzhiyun #if defined(STA_SUPPORT)
1183*4882a593Smuzhiyun 	/** AdHoc operating state backup */
1184*4882a593Smuzhiyun 	t_u8 adhoc_state_prev;
1185*4882a593Smuzhiyun 	/** AdHoc previous ssid used for Start */
1186*4882a593Smuzhiyun 	mlan_802_11_ssid adhoc_last_start_ssid;
1187*4882a593Smuzhiyun #endif
1188*4882a593Smuzhiyun 	mlan_ds_11h_chan_rep_req chan_rep_req;
1189*4882a593Smuzhiyun 	/** FSM variable for 11d support */
1190*4882a593Smuzhiyun 	wlan_802_11d_state_t state_11d;
1191*4882a593Smuzhiyun 	/** FSM variable for 11h support */
1192*4882a593Smuzhiyun 	wlan_11h_interface_state_t intf_state_11h;
1193*4882a593Smuzhiyun #ifdef UAP_SUPPORT
1194*4882a593Smuzhiyun 	/** Whether UAP interface has started */
1195*4882a593Smuzhiyun 	t_bool uap_bss_started;
1196*4882a593Smuzhiyun 	/** Whether UAP interface start from hostapd */
1197*4882a593Smuzhiyun 	t_bool uap_host_based;
1198*4882a593Smuzhiyun 	/**UAP operating channel*/
1199*4882a593Smuzhiyun 	t_u8 uap_channel;
1200*4882a593Smuzhiyun 	/**UAP bandwidth*/
1201*4882a593Smuzhiyun 	t_u8 uap_bandwidth;
1202*4882a593Smuzhiyun 	/** state variable for UAP Get Info callback */
1203*4882a593Smuzhiyun 	wlan_uap_get_info_cb_t uap_state_chan_cb;
1204*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
1205*4882a593Smuzhiyun 
1206*4882a593Smuzhiyun 	/** Security related */
1207*4882a593Smuzhiyun 	/** Encryption parameter */
1208*4882a593Smuzhiyun 	wlan_802_11_security_t sec_info;
1209*4882a593Smuzhiyun 	/** WEP keys */
1210*4882a593Smuzhiyun 	mrvl_wep_key_t wep_key[MRVL_NUM_WEP_KEY];
1211*4882a593Smuzhiyun 	/** Current WEP key index */
1212*4882a593Smuzhiyun 	t_u16 wep_key_curr_index;
1213*4882a593Smuzhiyun 	/** EWPA query 0: disable, 1: enable */
1214*4882a593Smuzhiyun 	t_u8 ewpa_query;
1215*4882a593Smuzhiyun 	/** Encryption Key*/
1216*4882a593Smuzhiyun 	t_u8 wpa_ie[256];
1217*4882a593Smuzhiyun 	/** WPA IE length */
1218*4882a593Smuzhiyun 	t_u8 wpa_ie_len;
1219*4882a593Smuzhiyun 	/** GTK set flag */
1220*4882a593Smuzhiyun 	t_u8 wpa_is_gtk_set;
1221*4882a593Smuzhiyun 	/** AES key material */
1222*4882a593Smuzhiyun 	mlan_ds_encrypt_key aes_key;
1223*4882a593Smuzhiyun #if defined(STA_SUPPORT)
1224*4882a593Smuzhiyun 	/* Mgmt Frame Protection config */
1225*4882a593Smuzhiyun 	mlan_ds_misc_pmfcfg pmfcfg;
1226*4882a593Smuzhiyun #endif
1227*4882a593Smuzhiyun 	/** WAPI IE */
1228*4882a593Smuzhiyun 	t_u8 wapi_ie[256];
1229*4882a593Smuzhiyun 	/** WAPI IE length */
1230*4882a593Smuzhiyun 	t_u8 wapi_ie_len;
1231*4882a593Smuzhiyun 	/** OSEN IE */
1232*4882a593Smuzhiyun 	t_u8 osen_ie[256];
1233*4882a593Smuzhiyun 	/** OSEN IE length */
1234*4882a593Smuzhiyun 	t_u8 osen_ie_len;
1235*4882a593Smuzhiyun 	/** Pointer to the station table */
1236*4882a593Smuzhiyun 	mlan_list_head sta_list;
1237*4882a593Smuzhiyun 	/** tdls pending queue */
1238*4882a593Smuzhiyun 	mlan_list_head tdls_pending_txq;
1239*4882a593Smuzhiyun 	t_u16 tdls_idle_time;
1240*4882a593Smuzhiyun 
1241*4882a593Smuzhiyun 	/** MGMT IE */
1242*4882a593Smuzhiyun 	custom_ie mgmt_ie[MAX_MGMT_IE_INDEX];
1243*4882a593Smuzhiyun 	/** mgmt frame passthru mask */
1244*4882a593Smuzhiyun 	t_u32 mgmt_frame_passthru_mask;
1245*4882a593Smuzhiyun 	/** WMM required */
1246*4882a593Smuzhiyun 	t_u8 wmm_required;
1247*4882a593Smuzhiyun 	/** WMM enabled */
1248*4882a593Smuzhiyun 	t_u8 wmm_enabled;
1249*4882a593Smuzhiyun 	/** WMM qos info */
1250*4882a593Smuzhiyun 	t_u8 wmm_qosinfo;
1251*4882a593Smuzhiyun 	/** saved WMM qos info */
1252*4882a593Smuzhiyun 	t_u8 saved_wmm_qosinfo;
1253*4882a593Smuzhiyun 	/**host tdls uapsd support*/
1254*4882a593Smuzhiyun 	t_u8 host_tdls_uapsd_support;
1255*4882a593Smuzhiyun 	/**host tdls channel switch support*/
1256*4882a593Smuzhiyun 	t_u8 host_tdls_cs_support;
1257*4882a593Smuzhiyun 	/**supported channel IE len*/
1258*4882a593Smuzhiyun 	t_u8 chan_supp_len;
1259*4882a593Smuzhiyun 	/**save channel support IE*/
1260*4882a593Smuzhiyun 	t_u8 chan_supp[MAX_IE_SIZE];
1261*4882a593Smuzhiyun 	/**supported regulatory classl IE len*/
1262*4882a593Smuzhiyun 	t_u8 supp_regulatory_class_len;
1263*4882a593Smuzhiyun 	/**save support channel regulatory class IE*/
1264*4882a593Smuzhiyun 	t_u8 supp_regulatory_class[MAX_IE_SIZE];
1265*4882a593Smuzhiyun 	/**tdls cs off channel*/
1266*4882a593Smuzhiyun 	t_u8 tdls_cs_channel;
1267*4882a593Smuzhiyun 	/** WMM related variable*/
1268*4882a593Smuzhiyun 	wmm_desc_t wmm;
1269*4882a593Smuzhiyun 
1270*4882a593Smuzhiyun 	/** Pointer to the Transmit BA stream table*/
1271*4882a593Smuzhiyun 	mlan_list_head tx_ba_stream_tbl_ptr;
1272*4882a593Smuzhiyun 	/** Pointer to the priorities for AMSDU/AMPDU table*/
1273*4882a593Smuzhiyun 	tx_aggr_t aggr_prio_tbl[MAX_NUM_TID];
1274*4882a593Smuzhiyun 	/** Pointer to the priorities for AMSDU/AMPDU table*/
1275*4882a593Smuzhiyun 	t_u8 addba_reject[MAX_NUM_TID];
1276*4882a593Smuzhiyun 	/** Pointer to the priorities for AMSDU/AMPDU table*/
1277*4882a593Smuzhiyun 	t_u8 ibss_ampdu[MAX_NUM_TID];
1278*4882a593Smuzhiyun 	/** Pointer to the priorities for AMSDU/AMPDU table*/
1279*4882a593Smuzhiyun 	t_u8 ibss_addba_reject[MAX_NUM_TID];
1280*4882a593Smuzhiyun 	/** Struct to store ADDBA parameters */
1281*4882a593Smuzhiyun 	add_ba_param_t add_ba_param;
1282*4882a593Smuzhiyun 	/**  user rx_win_size */
1283*4882a593Smuzhiyun 	t_u32 user_rxwinsize;
1284*4882a593Smuzhiyun 	/** last rx_seq */
1285*4882a593Smuzhiyun 	t_u16 rx_seq[MAX_NUM_TID];
1286*4882a593Smuzhiyun 	/** Pointer to the Receive Reordering table*/
1287*4882a593Smuzhiyun 	mlan_list_head rx_reorder_tbl_ptr;
1288*4882a593Smuzhiyun 	/** Lock for Rx packets */
1289*4882a593Smuzhiyun 	t_void *rx_pkt_lock;
1290*4882a593Smuzhiyun 
1291*4882a593Smuzhiyun #ifdef STA_SUPPORT
1292*4882a593Smuzhiyun 	/** Buffer to store the association response for application retrieval
1293*4882a593Smuzhiyun 	 */
1294*4882a593Smuzhiyun 	t_u8 assoc_rsp_buf[MRVDRV_ASSOC_RSP_BUF_SIZE];
1295*4882a593Smuzhiyun 	/** Length of the data stored in assoc_rsp_buf */
1296*4882a593Smuzhiyun 	t_u32 assoc_rsp_size;
1297*4882a593Smuzhiyun 	/** Buffer to store the association req IEs */
1298*4882a593Smuzhiyun 	t_u8 assoc_req_buf[MRVDRV_ASSOC_RSP_BUF_SIZE];
1299*4882a593Smuzhiyun 	/** Length of the data stored in assoc_rsp_buf */
1300*4882a593Smuzhiyun 	t_u32 assoc_req_size;
1301*4882a593Smuzhiyun 	/** Generic IEEE IEs passed from the application to be inserted into the
1302*4882a593Smuzhiyun 	 *    association request to firmware
1303*4882a593Smuzhiyun 	 */
1304*4882a593Smuzhiyun 	t_u8 gen_ie_buf[MRVDRV_GENIE_BUF_SIZE];
1305*4882a593Smuzhiyun 	/** Length of the data stored in gen_ie_buf */
1306*4882a593Smuzhiyun 	t_u8 gen_ie_buf_len;
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun 	/** disconnect reason code*/
1309*4882a593Smuzhiyun 	t_u16 disconnect_reason_code;
1310*4882a593Smuzhiyun 	t_u8 *pcurr_bcn_buf;
1311*4882a593Smuzhiyun 	t_u32 curr_bcn_size;
1312*4882a593Smuzhiyun 	t_void *curr_bcn_buf_lock;
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun 	/** WPS */
1315*4882a593Smuzhiyun 	wps_t wps;
1316*4882a593Smuzhiyun #endif /* STA_SUPPORT */
1317*4882a593Smuzhiyun 
1318*4882a593Smuzhiyun 	/** function table */
1319*4882a593Smuzhiyun 	mlan_operations ops;
1320*4882a593Smuzhiyun 	/** tx pause flag */
1321*4882a593Smuzhiyun 	t_u8 tx_pause;
1322*4882a593Smuzhiyun 	/** Port Control mode */
1323*4882a593Smuzhiyun 	t_u8 port_ctrl_mode;
1324*4882a593Smuzhiyun 
1325*4882a593Smuzhiyun 	/** Port open flag */
1326*4882a593Smuzhiyun 	t_u8 port_open;
1327*4882a593Smuzhiyun 
1328*4882a593Smuzhiyun 	/** Port open flag state at time of association attempt */
1329*4882a593Smuzhiyun 	t_u8 prior_port_status;
1330*4882a593Smuzhiyun 	/** Bypass TX queue */
1331*4882a593Smuzhiyun 	mlan_list_head bypass_txq;
1332*4882a593Smuzhiyun 	/** IP address operation */
1333*4882a593Smuzhiyun 	t_u32 op_code;
1334*4882a593Smuzhiyun 	/** IP address */
1335*4882a593Smuzhiyun 	t_u8 ip_addr[IPADDR_LEN];
1336*4882a593Smuzhiyun 	t_u32 hotspot_cfg;
1337*4882a593Smuzhiyun #ifdef STA_SUPPORT
1338*4882a593Smuzhiyun 	ExtCap_t ext_cap;
1339*4882a593Smuzhiyun 	ExtCap_t def_ext_cap;
1340*4882a593Smuzhiyun #endif
1341*4882a593Smuzhiyun 	/** interface header len */
1342*4882a593Smuzhiyun 	t_u8 intf_hr_len;
1343*4882a593Smuzhiyun #ifdef USB
1344*4882a593Smuzhiyun 	/** USB data port */
1345*4882a593Smuzhiyun 	t_u32 port;
1346*4882a593Smuzhiyun #endif
1347*4882a593Smuzhiyun 	/** Control TX AMPDU on infra link */
1348*4882a593Smuzhiyun 	t_u8 txaggrctrl;
1349*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
1350*4882a593Smuzhiyun 	t_void *psapriv;
1351*4882a593Smuzhiyun #endif
1352*4882a593Smuzhiyun 	/** rx per packet info */
1353*4882a593Smuzhiyun 	t_u8 rx_pkt_info;
1354*4882a593Smuzhiyun 	/** received amsdu count*/
1355*4882a593Smuzhiyun 	t_u32 amsdu_rx_cnt;
1356*4882a593Smuzhiyun 	/** received msdu count in amsdu*/
1357*4882a593Smuzhiyun 	t_u32 msdu_in_rx_amsdu_cnt;
1358*4882a593Smuzhiyun 	/** tx amsdu count*/
1359*4882a593Smuzhiyun 	t_u32 amsdu_tx_cnt;
1360*4882a593Smuzhiyun 	/** tx msdu count in amsdu*/
1361*4882a593Smuzhiyun 	t_u32 msdu_in_tx_amsdu_cnt;
1362*4882a593Smuzhiyun 	/** channel load info for current channel */
1363*4882a593Smuzhiyun 	t_u16 ch_load_param;
1364*4882a593Smuzhiyun 	/** Noise floor value for current channel */
1365*4882a593Smuzhiyun 	t_s16 noise;
1366*4882a593Smuzhiyun 	/** rx quality info */
1367*4882a593Smuzhiyun 	t_u16 rx_quality;
1368*4882a593Smuzhiyun } mlan_private, *pmlan_private;
1369*4882a593Smuzhiyun 
1370*4882a593Smuzhiyun typedef struct _assoc_logger {
1371*4882a593Smuzhiyun 	/** vendor specific */
1372*4882a593Smuzhiyun 	t_u8 oui[3];
1373*4882a593Smuzhiyun 	t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
1374*4882a593Smuzhiyun 	t_u8 ssid[MLAN_MAX_SSID_LENGTH];
1375*4882a593Smuzhiyun 	t_s32 rssi;
1376*4882a593Smuzhiyun 	t_u32 channel;
1377*4882a593Smuzhiyun } assoc_logger_data;
1378*4882a593Smuzhiyun 
1379*4882a593Smuzhiyun /** Tx BA stream table */
1380*4882a593Smuzhiyun struct _TxBAStreamTbl {
1381*4882a593Smuzhiyun 	/** TxBAStreamTbl previous node */
1382*4882a593Smuzhiyun 	TxBAStreamTbl *pprev;
1383*4882a593Smuzhiyun 	/** TxBAStreamTbl next node */
1384*4882a593Smuzhiyun 	TxBAStreamTbl *pnext;
1385*4882a593Smuzhiyun 	/** TID */
1386*4882a593Smuzhiyun 	int tid;
1387*4882a593Smuzhiyun 	/** RA */
1388*4882a593Smuzhiyun 	t_u8 ra[MLAN_MAC_ADDR_LENGTH];
1389*4882a593Smuzhiyun 	/** BA stream status */
1390*4882a593Smuzhiyun 	baStatus_e ba_status;
1391*4882a593Smuzhiyun 	t_u8 amsdu;
1392*4882a593Smuzhiyun };
1393*4882a593Smuzhiyun 
1394*4882a593Smuzhiyun /** RX reorder table */
1395*4882a593Smuzhiyun typedef struct _RxReorderTbl RxReorderTbl;
1396*4882a593Smuzhiyun 
1397*4882a593Smuzhiyun typedef struct {
1398*4882a593Smuzhiyun 	/** Timer for flushing */
1399*4882a593Smuzhiyun 	t_void *timer;
1400*4882a593Smuzhiyun 	/** Timer set flag */
1401*4882a593Smuzhiyun 	t_u8 timer_is_set;
1402*4882a593Smuzhiyun 	/** RxReorderTbl ptr */
1403*4882a593Smuzhiyun 	RxReorderTbl *ptr;
1404*4882a593Smuzhiyun 	/** Priv pointer */
1405*4882a593Smuzhiyun 	mlan_private *priv;
1406*4882a593Smuzhiyun } reorder_tmr_cnxt_t;
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun /** RX reorder table */
1409*4882a593Smuzhiyun struct _RxReorderTbl {
1410*4882a593Smuzhiyun 	/** RxReorderTbl previous node */
1411*4882a593Smuzhiyun 	RxReorderTbl *pprev;
1412*4882a593Smuzhiyun 	/** RxReorderTbl next node */
1413*4882a593Smuzhiyun 	RxReorderTbl *pnext;
1414*4882a593Smuzhiyun 	/** TID */
1415*4882a593Smuzhiyun 	int tid;
1416*4882a593Smuzhiyun 	/** TA */
1417*4882a593Smuzhiyun 	t_u8 ta[MLAN_MAC_ADDR_LENGTH];
1418*4882a593Smuzhiyun 	/** Start window */
1419*4882a593Smuzhiyun 	int start_win;
1420*4882a593Smuzhiyun 	/** last_seq */
1421*4882a593Smuzhiyun 	int last_seq;
1422*4882a593Smuzhiyun 	/** Window size */
1423*4882a593Smuzhiyun 	int win_size;
1424*4882a593Smuzhiyun 	/** Pointer to pointer to RxReorderTbl */
1425*4882a593Smuzhiyun 	t_void **rx_reorder_ptr;
1426*4882a593Smuzhiyun 	/** Timer context */
1427*4882a593Smuzhiyun 	reorder_tmr_cnxt_t timer_context;
1428*4882a593Smuzhiyun 	/** BA stream status */
1429*4882a593Smuzhiyun 	baStatus_e ba_status;
1430*4882a593Smuzhiyun 	t_u8 amsdu;
1431*4882a593Smuzhiyun 	/** no packet drop flag for rx_reorder_tbl */
1432*4882a593Smuzhiyun 	t_u8 force_no_drop;
1433*4882a593Smuzhiyun 	/** flag for check start win */
1434*4882a593Smuzhiyun 	t_u8 check_start_win;
1435*4882a593Smuzhiyun 	/** pkt receive after BA setup */
1436*4882a593Smuzhiyun 	t_u8 pkt_count;
1437*4882a593Smuzhiyun 	/** flush data flag */
1438*4882a593Smuzhiyun 	t_u8 flush_data;
1439*4882a593Smuzhiyun };
1440*4882a593Smuzhiyun 
1441*4882a593Smuzhiyun /** BSS priority node */
1442*4882a593Smuzhiyun typedef struct _mlan_bssprio_node mlan_bssprio_node;
1443*4882a593Smuzhiyun 
1444*4882a593Smuzhiyun /** BSS priority node */
1445*4882a593Smuzhiyun struct _mlan_bssprio_node {
1446*4882a593Smuzhiyun 	/** Pointer to previous node */
1447*4882a593Smuzhiyun 	mlan_bssprio_node *pprev;
1448*4882a593Smuzhiyun 	/** Pointer to next node */
1449*4882a593Smuzhiyun 	mlan_bssprio_node *pnext;
1450*4882a593Smuzhiyun 	/** Pointer to priv */
1451*4882a593Smuzhiyun 	pmlan_private priv;
1452*4882a593Smuzhiyun };
1453*4882a593Smuzhiyun 
1454*4882a593Smuzhiyun /** BSS priority table */
1455*4882a593Smuzhiyun typedef struct _mlan_bssprio_tbl mlan_bssprio_tbl;
1456*4882a593Smuzhiyun 
1457*4882a593Smuzhiyun /** BSS priority table */
1458*4882a593Smuzhiyun struct _mlan_bssprio_tbl {
1459*4882a593Smuzhiyun 	/** BSS priority list head */
1460*4882a593Smuzhiyun 	mlan_list_head bssprio_head;
1461*4882a593Smuzhiyun 	/** Current priority node */
1462*4882a593Smuzhiyun 	mlan_bssprio_node *bssprio_cur;
1463*4882a593Smuzhiyun };
1464*4882a593Smuzhiyun 
1465*4882a593Smuzhiyun /** cmd_ctrl_node */
1466*4882a593Smuzhiyun typedef struct _cmd_ctrl_node cmd_ctrl_node;
1467*4882a593Smuzhiyun 
1468*4882a593Smuzhiyun /** _cmd_ctrl_node */
1469*4882a593Smuzhiyun struct _cmd_ctrl_node {
1470*4882a593Smuzhiyun 	/** Pointer to previous node */
1471*4882a593Smuzhiyun 	cmd_ctrl_node *pprev;
1472*4882a593Smuzhiyun 	/** Pointer to next node */
1473*4882a593Smuzhiyun 	cmd_ctrl_node *pnext;
1474*4882a593Smuzhiyun 	/** Pointer to priv */
1475*4882a593Smuzhiyun 	pmlan_private priv;
1476*4882a593Smuzhiyun 	/** Command number */
1477*4882a593Smuzhiyun 	t_u32 cmd_no;
1478*4882a593Smuzhiyun 	/** Command flag */
1479*4882a593Smuzhiyun 	t_u32 cmd_flag;
1480*4882a593Smuzhiyun 	/** Pointer to mlan_buffer */
1481*4882a593Smuzhiyun 	mlan_buffer *cmdbuf;
1482*4882a593Smuzhiyun 	/** Pointer to mlan_buffer */
1483*4882a593Smuzhiyun 	mlan_buffer *respbuf;
1484*4882a593Smuzhiyun 	/** Command parameter */
1485*4882a593Smuzhiyun 	t_void *pdata_buf;
1486*4882a593Smuzhiyun 	/** Pointer to mlan_ioctl_req if command is from IOCTL */
1487*4882a593Smuzhiyun 	t_void *pioctl_buf;
1488*4882a593Smuzhiyun #if defined(PCIE) || defined(SDIO)
1489*4882a593Smuzhiyun 	/** pre_allocated mlan_buffer for cmd */
1490*4882a593Smuzhiyun 	mlan_buffer *pmbuf;
1491*4882a593Smuzhiyun #endif
1492*4882a593Smuzhiyun };
1493*4882a593Smuzhiyun 
1494*4882a593Smuzhiyun /** default tdls wmm qosinfo */
1495*4882a593Smuzhiyun #define DEFAULT_TDLS_WMM_QOS_INFO 15
1496*4882a593Smuzhiyun /** default tdls sleep period */
1497*4882a593Smuzhiyun #define DEFAULT_TDLS_SLEEP_PERIOD 30
1498*4882a593Smuzhiyun 
1499*4882a593Smuzhiyun /** TDLS status */
1500*4882a593Smuzhiyun typedef enum _tdlsStatus_e {
1501*4882a593Smuzhiyun 	TDLS_NOT_SETUP = 0,
1502*4882a593Smuzhiyun 	TDLS_SETUP_INPROGRESS,
1503*4882a593Smuzhiyun 	TDLS_SETUP_COMPLETE,
1504*4882a593Smuzhiyun 	TDLS_SETUP_FAILURE,
1505*4882a593Smuzhiyun 	TDLS_TEAR_DOWN,
1506*4882a593Smuzhiyun 	TDLS_SWITCHING_CHANNEL,
1507*4882a593Smuzhiyun 	TDLS_IN_BASE_CHANNEL,
1508*4882a593Smuzhiyun 	TDLS_IN_OFF_CHANNEL,
1509*4882a593Smuzhiyun } tdlsStatus_e;
1510*4882a593Smuzhiyun /** station node */
1511*4882a593Smuzhiyun typedef struct _sta_node sta_node, *psta_node;
1512*4882a593Smuzhiyun 
1513*4882a593Smuzhiyun /** station node*/
1514*4882a593Smuzhiyun struct _sta_node {
1515*4882a593Smuzhiyun 	/** previous node */
1516*4882a593Smuzhiyun 	sta_node *pprev;
1517*4882a593Smuzhiyun 	/** next node */
1518*4882a593Smuzhiyun 	sta_node *pnext;
1519*4882a593Smuzhiyun 	/** station mac address */
1520*4882a593Smuzhiyun 	t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
1521*4882a593Smuzhiyun 	/** wmm flag */
1522*4882a593Smuzhiyun 	t_u8 is_wmm_enabled;
1523*4882a593Smuzhiyun 	/** 11n flag */
1524*4882a593Smuzhiyun 	t_u8 is_11n_enabled;
1525*4882a593Smuzhiyun 	/** AMPDU STA */
1526*4882a593Smuzhiyun 	t_u8 ampdu_sta[MAX_NUM_TID];
1527*4882a593Smuzhiyun 	/** last rx_seq */
1528*4882a593Smuzhiyun 	t_u16 rx_seq[MAX_NUM_TID];
1529*4882a593Smuzhiyun 	/** max amsdu size */
1530*4882a593Smuzhiyun 	t_u16 max_amsdu;
1531*4882a593Smuzhiyun 	/** HT cap */
1532*4882a593Smuzhiyun 	IEEEtypes_HTCap_t HTcap;
1533*4882a593Smuzhiyun 	/** 11ac flag */
1534*4882a593Smuzhiyun 	t_u8 is_11ac_enabled;
1535*4882a593Smuzhiyun 	/** UAP 11ax flag */
1536*4882a593Smuzhiyun 	t_u8 is_11ax_enabled;
1537*4882a593Smuzhiyun 	IEEEtypes_HECap_t he_cap;
1538*4882a593Smuzhiyun 	/** SNR */
1539*4882a593Smuzhiyun 	t_s8 snr;
1540*4882a593Smuzhiyun 	/** Noise Floor */
1541*4882a593Smuzhiyun 	t_s8 nf;
1542*4882a593Smuzhiyun 	/** peer capability */
1543*4882a593Smuzhiyun 	t_u16 capability;
1544*4882a593Smuzhiyun 	/** tdls status */
1545*4882a593Smuzhiyun 	tdlsStatus_e status;
1546*4882a593Smuzhiyun 	/** flag for host based tdls */
1547*4882a593Smuzhiyun 	t_u8 external_tdls;
1548*4882a593Smuzhiyun 	/** peer support rates */
1549*4882a593Smuzhiyun 	t_u8 support_rate[32];
1550*4882a593Smuzhiyun 	/** rate size */
1551*4882a593Smuzhiyun 	t_u8 rate_len;
1552*4882a593Smuzhiyun 	/*Qos capability info*/
1553*4882a593Smuzhiyun 	t_u8 qos_info;
1554*4882a593Smuzhiyun 	/** HT info in TDLS setup confirm*/
1555*4882a593Smuzhiyun 	IEEEtypes_HTInfo_t HTInfo;
1556*4882a593Smuzhiyun 	/** peer BSSCO_20_40*/
1557*4882a593Smuzhiyun 	IEEEtypes_2040BSSCo_t BSSCO_20_40;
1558*4882a593Smuzhiyun 	/*Extended capability*/
1559*4882a593Smuzhiyun 	IEEEtypes_ExtCap_t ExtCap;
1560*4882a593Smuzhiyun 	/*RSN IE*/
1561*4882a593Smuzhiyun 	IEEEtypes_Generic_t rsn_ie;
1562*4882a593Smuzhiyun 	/**Link ID*/
1563*4882a593Smuzhiyun 	IEEEtypes_LinkIDElement_t link_ie;
1564*4882a593Smuzhiyun 	/** AID info */
1565*4882a593Smuzhiyun 	IEEEtypes_AID_t aid_info;
1566*4882a593Smuzhiyun 	/** VHT Capabilities IE */
1567*4882a593Smuzhiyun 	IEEEtypes_VHTCap_t vht_cap;
1568*4882a593Smuzhiyun 	/** VHT Operations IE */
1569*4882a593Smuzhiyun 	IEEEtypes_VHTOprat_t vht_oprat;
1570*4882a593Smuzhiyun 	/** HE Capabilities IE */
1571*4882a593Smuzhiyun 	IEEEtypes_HECap_t tdls_he_cap;
1572*4882a593Smuzhiyun 	/** HE Operations IE */
1573*4882a593Smuzhiyun 	IEEEtypes_HeOp_t he_op;
1574*4882a593Smuzhiyun 	/** wapi key on off flag */
1575*4882a593Smuzhiyun 	t_u8 wapi_key_on;
1576*4882a593Smuzhiyun 	/** tx pause status */
1577*4882a593Smuzhiyun 	t_u8 tx_pause;
1578*4882a593Smuzhiyun 	/** station band mode */
1579*4882a593Smuzhiyun 	t_u16 bandmode;
1580*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
1581*4882a593Smuzhiyun 	t_void *cm_connectioninfo;
1582*4882a593Smuzhiyun #endif
1583*4882a593Smuzhiyun 	sta_stats stats;
1584*4882a593Smuzhiyun };
1585*4882a593Smuzhiyun 
1586*4882a593Smuzhiyun /** 802.11h State information kept in the 'mlan_adapter' driver structure */
1587*4882a593Smuzhiyun typedef struct {
1588*4882a593Smuzhiyun 	/** Min TX Power capability sent to FW for 11h use and fw power control
1589*4882a593Smuzhiyun 	 */
1590*4882a593Smuzhiyun 	t_s8 min_tx_power_capability;
1591*4882a593Smuzhiyun 	/** Max TX Power capability sent to FW for 11h use and fw power control
1592*4882a593Smuzhiyun 	 */
1593*4882a593Smuzhiyun 	t_s8 max_tx_power_capability;
1594*4882a593Smuzhiyun 	/** User provisioned local power constraint sent in association requests
1595*4882a593Smuzhiyun 	 */
1596*4882a593Smuzhiyun 	t_s8 usr_def_power_constraint;
1597*4882a593Smuzhiyun 	/** Received CHANNEL_SWITCH_ANN event */
1598*4882a593Smuzhiyun 	t_bool recvd_chanswann_event;
1599*4882a593Smuzhiyun 	/** Indicates an interface wants to enable master radar detection */
1600*4882a593Smuzhiyun 	t_bool master_radar_det_enable_pending;
1601*4882a593Smuzhiyun 	/** Indicates an interface wants to enable slave radar detection */
1602*4882a593Smuzhiyun 	t_bool slave_radar_det_enable_pending;
1603*4882a593Smuzhiyun 	/** Indicates whether master radar detection active in the firmware */
1604*4882a593Smuzhiyun 	t_bool is_master_radar_det_active;
1605*4882a593Smuzhiyun 	/** Indicates whether slave radar detection active in the firmware */
1606*4882a593Smuzhiyun 	t_bool is_slave_radar_det_active;
1607*4882a593Smuzhiyun 	/** Quiet IE */
1608*4882a593Smuzhiyun 	IEEEtypes_Quiet_t quiet_ie;
1609*4882a593Smuzhiyun } wlan_11h_device_state_t;
1610*4882a593Smuzhiyun 
1611*4882a593Smuzhiyun /** Enumeration for DFS Timestamp represents field */
1612*4882a593Smuzhiyun enum _dfs_timestamp_repr_e {
1613*4882a593Smuzhiyun 	/** Ignore entry */
1614*4882a593Smuzhiyun 	DFS_TS_REPR_NOT_IN_USE = 0,
1615*4882a593Smuzhiyun 	/** NOP (Non-Occupancy Period) start time */
1616*4882a593Smuzhiyun 	DFS_TS_REPR_NOP_START = 1,
1617*4882a593Smuzhiyun 	/** CAC (Channel Availability Check) completion time */
1618*4882a593Smuzhiyun 	DFS_TS_REPR_CAC_COMPLETION
1619*4882a593Smuzhiyun };
1620*4882a593Smuzhiyun 
1621*4882a593Smuzhiyun /** DFS Timestamp type used for marking NOP/CAC events */
1622*4882a593Smuzhiyun typedef struct _wlan_dfs_timestamp_t wlan_dfs_timestamp_t;
1623*4882a593Smuzhiyun 
1624*4882a593Smuzhiyun /** DFS Timestamp type used for marking NOP/CAC events */
1625*4882a593Smuzhiyun struct _wlan_dfs_timestamp_t {
1626*4882a593Smuzhiyun 	/** Pointer to previous node */
1627*4882a593Smuzhiyun 	wlan_dfs_timestamp_t *pprev;
1628*4882a593Smuzhiyun 	/** Pointer to next node */
1629*4882a593Smuzhiyun 	wlan_dfs_timestamp_t *pnext;
1630*4882a593Smuzhiyun 	/** WLAN Channel number */
1631*4882a593Smuzhiyun 	t_u8 channel;
1632*4882a593Smuzhiyun 	/** What this timestamp represents */
1633*4882a593Smuzhiyun 	t_u8 represents;
1634*4882a593Smuzhiyun 	/** reserved field */
1635*4882a593Smuzhiyun 	t_u16 reserved;
1636*4882a593Smuzhiyun 	/** timestamp - seconds */
1637*4882a593Smuzhiyun 	t_u32 ts_sec;
1638*4882a593Smuzhiyun 	/** timestamp - microseconds */
1639*4882a593Smuzhiyun 	t_u32 ts_usec;
1640*4882a593Smuzhiyun };
1641*4882a593Smuzhiyun 
1642*4882a593Smuzhiyun /** DFS State information kept in the 'mlan_adapter' driver structure */
1643*4882a593Smuzhiyun typedef struct {
1644*4882a593Smuzhiyun 	/** Indicates whether DFS channel check is occurring in firmware */
1645*4882a593Smuzhiyun 	t_bool dfs_check_pending;
1646*4882a593Smuzhiyun 	/** Indicates whether DFS channel check found radar */
1647*4882a593Smuzhiyun 	t_bool dfs_radar_found;
1648*4882a593Smuzhiyun 	/** Channel radar is being checked on.  BAND_A is assumed. */
1649*4882a593Smuzhiyun 	t_u8 dfs_check_channel;
1650*4882a593Smuzhiyun 	/** Channel radar is being checked on bandwidth*/
1651*4882a593Smuzhiyun 	t_u8 dfs_check_bandwidth;
1652*4882a593Smuzhiyun 	/** point to the priv which start the DFS check */
1653*4882a593Smuzhiyun 	t_void *dfs_check_priv;
1654*4882a593Smuzhiyun 	/** Timestamp when we got last report,
1655*4882a593Smuzhiyun 	 * to determine if data is old or not.
1656*4882a593Smuzhiyun 	 */
1657*4882a593Smuzhiyun 	t_u32 dfs_report_time_sec;
1658*4882a593Smuzhiyun 	/** List for holding dfs_timestamps for NOP/CAC events */
1659*4882a593Smuzhiyun 	mlan_list_head dfs_ts_head;
1660*4882a593Smuzhiyun } wlan_dfs_device_state_t;
1661*4882a593Smuzhiyun 
1662*4882a593Smuzhiyun /** Enumeration for mlan_ds_11h_radar_det_hndlg stages */
1663*4882a593Smuzhiyun enum _mlan_ds_11h_rdh_stages {
1664*4882a593Smuzhiyun 	RDH_OFF = 0,
1665*4882a593Smuzhiyun 	RDH_CHK_INTFS = 1,
1666*4882a593Smuzhiyun 	RDH_STOP_TRAFFIC,
1667*4882a593Smuzhiyun 	RDH_GET_INFO_CHANNEL,
1668*4882a593Smuzhiyun 	RDH_GET_INFO_BEACON_DTIM,
1669*4882a593Smuzhiyun 	RDH_SET_CUSTOM_IE,
1670*4882a593Smuzhiyun 	RDH_REM_CUSTOM_IE,
1671*4882a593Smuzhiyun 	RDH_STOP_INTFS,
1672*4882a593Smuzhiyun 	RDH_SET_NEW_CHANNEL,
1673*4882a593Smuzhiyun 	RDH_RESTART_INTFS,
1674*4882a593Smuzhiyun 	RDH_RESTART_TRAFFIC
1675*4882a593Smuzhiyun };
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun /** State info for Radar Detected Handling kept in 'mlan_adapter' */
1678*4882a593Smuzhiyun typedef struct {
1679*4882a593Smuzhiyun 	/** Stage (of Operation) */
1680*4882a593Smuzhiyun 	t_u8 stage;
1681*4882a593Smuzhiyun 	/** Number of interfaces to handle */
1682*4882a593Smuzhiyun 	t_u8 priv_list_count;
1683*4882a593Smuzhiyun 	/** Index of interface in process (used by some stages) */
1684*4882a593Smuzhiyun 	t_u8 priv_curr_idx;
1685*4882a593Smuzhiyun 	/** Current Channel (to leave) */
1686*4882a593Smuzhiyun 	t_u8 curr_channel;
1687*4882a593Smuzhiyun 	/** New Channel (to switch to) */
1688*4882a593Smuzhiyun 	t_u8 new_channel;
1689*4882a593Smuzhiyun 	/** UAP band_config */
1690*4882a593Smuzhiyun 	Band_Config_t uap_band_cfg;
1691*4882a593Smuzhiyun 	/** BEACON*DTIM period (in msec; max of STA/UAP) */
1692*4882a593Smuzhiyun 	t_u16 max_bcn_dtim_ms;
1693*4882a593Smuzhiyun 	/** tx block flag */
1694*4882a593Smuzhiyun 	t_u8 tx_block;
1695*4882a593Smuzhiyun 	/** List of interfaces to handle */
1696*4882a593Smuzhiyun 	mlan_private *priv_list[MLAN_MAX_BSS_NUM];
1697*4882a593Smuzhiyun } wlan_radar_det_hndlg_state_t;
1698*4882a593Smuzhiyun 
1699*4882a593Smuzhiyun /** DFS/RDH testing exception settings kept in 'mlan_adapter' */
1700*4882a593Smuzhiyun typedef struct {
1701*4882a593Smuzhiyun 	/** user-configured CAC period (in msec) */
1702*4882a593Smuzhiyun 	t_u32 user_cac_period_msec;
1703*4882a593Smuzhiyun 	/** user-configured NOP period (in sec) */
1704*4882a593Smuzhiyun 	t_u16 user_nop_period_sec;
1705*4882a593Smuzhiyun 	/** user-configured skip channel change on radar */
1706*4882a593Smuzhiyun 	t_bool no_channel_change_on_radar;
1707*4882a593Smuzhiyun 	/** user-configured new channel to change to on radar */
1708*4882a593Smuzhiyun 	t_u8 fixed_new_channel_on_radar;
1709*4882a593Smuzhiyun 	/** user-configured cac restart */
1710*4882a593Smuzhiyun 	t_u8 cac_restart;
1711*4882a593Smuzhiyun 	/**  cac channel */
1712*4882a593Smuzhiyun 	t_u8 chan;
1713*4882a593Smuzhiyun 	/** band cfg */
1714*4882a593Smuzhiyun 	Band_Config_t bandcfg;
1715*4882a593Smuzhiyun 	/** cac time */
1716*4882a593Smuzhiyun 	t_u32 millisec_dwell_time;
1717*4882a593Smuzhiyun } wlan_dfs_testing_settings_t;
1718*4882a593Smuzhiyun 
1719*4882a593Smuzhiyun /**
1720*4882a593Smuzhiyun  * @brief Driver measurement state held in 'mlan_adapter' structure
1721*4882a593Smuzhiyun  *
1722*4882a593Smuzhiyun  *  Used to record a measurement request that the driver is pending on
1723*4882a593Smuzhiyun  *    the result (received measurement report).
1724*4882a593Smuzhiyun  */
1725*4882a593Smuzhiyun typedef struct {
1726*4882a593Smuzhiyun 	/**
1727*4882a593Smuzhiyun 	 * Dialog token of a pending measurement request/report.  Used to
1728*4882a593Smuzhiyun 	 *   block execution while waiting for the specific dialog token
1729*4882a593Smuzhiyun 	 */
1730*4882a593Smuzhiyun 	t_u8 meas_rpt_pend_on;
1731*4882a593Smuzhiyun 
1732*4882a593Smuzhiyun 	/**
1733*4882a593Smuzhiyun 	 * Measurement report received from the firmware that we were pending on
1734*4882a593Smuzhiyun 	 */
1735*4882a593Smuzhiyun 	HostCmd_DS_MEASUREMENT_REPORT meas_rpt_returned;
1736*4882a593Smuzhiyun 
1737*4882a593Smuzhiyun } wlan_meas_state_t;
1738*4882a593Smuzhiyun 
1739*4882a593Smuzhiyun #ifdef SDIO
1740*4882a593Smuzhiyun /**
1741*4882a593Smuzhiyun  *  @brief Link buffer into aggregate head buffer
1742*4882a593Smuzhiyun  *
1743*4882a593Smuzhiyun  *  @param pmbuf_aggr	Pointer to aggregation buffer
1744*4882a593Smuzhiyun  *  @param pmbuf		Pointer to buffer to copy
1745*4882a593Smuzhiyun  */
1746*4882a593Smuzhiyun static inline t_void wlan_link_buf_to_aggr(pmlan_buffer pmbuf_aggr,
1747*4882a593Smuzhiyun 					   pmlan_buffer pmbuf)
1748*4882a593Smuzhiyun {
1749*4882a593Smuzhiyun 	/* link new buf at end of list */
1750*4882a593Smuzhiyun 	pmbuf->pnext = pmbuf_aggr;
1751*4882a593Smuzhiyun 	pmbuf->pprev = pmbuf_aggr->pprev;
1752*4882a593Smuzhiyun 	pmbuf->pparent = pmbuf_aggr;
1753*4882a593Smuzhiyun 	pmbuf_aggr->pprev->pnext = pmbuf;
1754*4882a593Smuzhiyun 	pmbuf_aggr->pprev = pmbuf;
1755*4882a593Smuzhiyun 	pmbuf_aggr->use_count++;
1756*4882a593Smuzhiyun }
1757*4882a593Smuzhiyun 
1758*4882a593Smuzhiyun /** data structure for SDIO MPA TX */
1759*4882a593Smuzhiyun typedef struct _sdio_mpa_tx {
1760*4882a593Smuzhiyun 	/** allocated buf for tx aggreation */
1761*4882a593Smuzhiyun 	t_u8 *head_ptr;
1762*4882a593Smuzhiyun 	/** multiport tx aggregation buffer pointer */
1763*4882a593Smuzhiyun 	t_u8 *buf;
1764*4882a593Smuzhiyun 	/** multiport tx aggregation buffer length */
1765*4882a593Smuzhiyun 	t_u32 buf_len;
1766*4882a593Smuzhiyun 	/** multiport tx aggregation packet count */
1767*4882a593Smuzhiyun 	t_u32 pkt_cnt;
1768*4882a593Smuzhiyun 	/** multiport tx aggregation ports */
1769*4882a593Smuzhiyun 	t_u32 ports;
1770*4882a593Smuzhiyun 	/** multiport tx aggregation starting port */
1771*4882a593Smuzhiyun 	t_u16 start_port;
1772*4882a593Smuzhiyun 	/** multiport tx aggregation enable/disable flag */
1773*4882a593Smuzhiyun 	t_u8 enabled;
1774*4882a593Smuzhiyun 	/** multiport tx aggregation buffer size */
1775*4882a593Smuzhiyun 	t_u32 buf_size;
1776*4882a593Smuzhiyun 	/** multiport tx aggregation pkt aggr limit */
1777*4882a593Smuzhiyun 	t_u32 pkt_aggr_limit;
1778*4882a593Smuzhiyun 	/** multiport write info */
1779*4882a593Smuzhiyun 	t_u16 mp_wr_info[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
1780*4882a593Smuzhiyun 	/** multiport rx aggregation mbuf array */
1781*4882a593Smuzhiyun 	pmlan_buffer mbuf_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
1782*4882a593Smuzhiyun } sdio_mpa_tx;
1783*4882a593Smuzhiyun 
1784*4882a593Smuzhiyun /** data structure for SDIO MPA RX */
1785*4882a593Smuzhiyun typedef struct _sdio_mpa_rx {
1786*4882a593Smuzhiyun 	/** allocated buf for rx aggreation */
1787*4882a593Smuzhiyun 	t_u8 *head_ptr;
1788*4882a593Smuzhiyun 	/** multiport rx aggregation buffer pointer */
1789*4882a593Smuzhiyun 	t_u8 *buf;
1790*4882a593Smuzhiyun 	/** multiport rx aggregation buffer length */
1791*4882a593Smuzhiyun 	t_u32 buf_len;
1792*4882a593Smuzhiyun 	/** multiport rx aggregation packet count */
1793*4882a593Smuzhiyun 	t_u32 pkt_cnt;
1794*4882a593Smuzhiyun 	/** multiport rx aggregation ports */
1795*4882a593Smuzhiyun 	t_u32 ports;
1796*4882a593Smuzhiyun 	/** multiport rx aggregation starting port */
1797*4882a593Smuzhiyun 	t_u16 start_port;
1798*4882a593Smuzhiyun 
1799*4882a593Smuzhiyun 	/** multiport rx aggregation mbuf array */
1800*4882a593Smuzhiyun 	pmlan_buffer mbuf_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
1801*4882a593Smuzhiyun 	/** multiport rx aggregation pkt len array */
1802*4882a593Smuzhiyun 	t_u32 len_arr[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
1803*4882a593Smuzhiyun 
1804*4882a593Smuzhiyun 	/** multiport rx aggregation enable/disable flag */
1805*4882a593Smuzhiyun 	t_u8 enabled;
1806*4882a593Smuzhiyun 	/** multiport rx aggregation buffer size */
1807*4882a593Smuzhiyun 	t_u32 buf_size;
1808*4882a593Smuzhiyun 	/** multiport rx aggregation pkt aggr limit */
1809*4882a593Smuzhiyun 	t_u32 pkt_aggr_limit;
1810*4882a593Smuzhiyun } sdio_mpa_rx;
1811*4882a593Smuzhiyun #endif
1812*4882a593Smuzhiyun 
1813*4882a593Smuzhiyun #ifdef USB
1814*4882a593Smuzhiyun /** data structure for USB Rx Deaggregation */
1815*4882a593Smuzhiyun typedef struct _usb_rx_deaggr_params {
1816*4882a593Smuzhiyun 	/** Rx aggregation control */
1817*4882a593Smuzhiyun 	usb_aggr_ctrl_cfg aggr_ctrl;
1818*4882a593Smuzhiyun } usb_rx_deaggr_params;
1819*4882a593Smuzhiyun 
1820*4882a593Smuzhiyun #define MAX_USB_TX_PORT_NUM 1
1821*4882a593Smuzhiyun /** data structure for USB Tx Aggregation */
1822*4882a593Smuzhiyun typedef struct _usb_tx_aggr_params {
1823*4882a593Smuzhiyun 	/** Tx aggregation control */
1824*4882a593Smuzhiyun 	usb_aggr_ctrl_cfg aggr_ctrl;
1825*4882a593Smuzhiyun 	/** allocated pmbuf for tx aggreation */
1826*4882a593Smuzhiyun 	pmlan_buffer pmbuf_aggr;
1827*4882a593Smuzhiyun 	/** packet len used in pmbuf_aggr */
1828*4882a593Smuzhiyun 	t_u32 aggr_len;
1829*4882a593Smuzhiyun 	/** usb_tx_aggr timer */
1830*4882a593Smuzhiyun 	t_void *paggr_hold_timer;
1831*4882a593Smuzhiyun 	/** usb_tx_aggr timer set flag */
1832*4882a593Smuzhiyun 	t_u8 aggr_hold_timer_is_set;
1833*4882a593Smuzhiyun 	/** Timeout duration in milliseconds to wait for aggregation */
1834*4882a593Smuzhiyun 	t_u32 hold_timeout_msec;
1835*4882a593Smuzhiyun 	/** lock for transmission */
1836*4882a593Smuzhiyun 	t_void *paggr_lock;
1837*4882a593Smuzhiyun 	/** port for data transmission */
1838*4882a593Smuzhiyun 	t_u32 port;
1839*4882a593Smuzhiyun 	/** pointer to moal_adatper structure */
1840*4882a593Smuzhiyun 	t_void *phandle;
1841*4882a593Smuzhiyun } usb_tx_aggr_params, *pusb_tx_aggr_params;
1842*4882a593Smuzhiyun #endif
1843*4882a593Smuzhiyun 
1844*4882a593Smuzhiyun /** Type definition of mef_entry*/
1845*4882a593Smuzhiyun typedef struct _mef_cfg_data {
1846*4882a593Smuzhiyun 	/** criteria*/
1847*4882a593Smuzhiyun 	t_u32 criteria;
1848*4882a593Smuzhiyun 	/** entry num*/
1849*4882a593Smuzhiyun 	t_u16 entry_num;
1850*4882a593Smuzhiyun 	/** entry pointer*/
1851*4882a593Smuzhiyun 	mef_entry_t *pentry;
1852*4882a593Smuzhiyun } mef_cfg_data;
1853*4882a593Smuzhiyun 
1854*4882a593Smuzhiyun /** Type definition of mef_entry*/
1855*4882a593Smuzhiyun typedef struct _mef_entry {
1856*4882a593Smuzhiyun 	/** Flag for auto arp entry*/
1857*4882a593Smuzhiyun 	int enable_autoarp_entry;
1858*4882a593Smuzhiyun 	/** Num for wowlan entry*/
1859*4882a593Smuzhiyun 	int num_wowlan_entry;
1860*4882a593Smuzhiyun 	/** Num for IPv6 neighbor solicitation message offload */
1861*4882a593Smuzhiyun 	int num_ipv6_ns_offload;
1862*4882a593Smuzhiyun 	int clear_mef_entry;
1863*4882a593Smuzhiyun 	/** criteria*/
1864*4882a593Smuzhiyun 	t_u32 criteria;
1865*4882a593Smuzhiyun 	/** MEF CFG Array to store etted_entry_bitmap;
1866*4882a593Smuzhiyun 	 *  Caution: 0-3 is for NVIDIA WHITE/BLACK list entries
1867*4882a593Smuzhiyun 	 *  Caution: 4   is for NVIDIA ping entry
1868*4882a593Smuzhiyun 	 *  Caution: 5   is for Auto Arp Entry
1869*4882a593Smuzhiyun 	 *  Caution: 6   is for wowlan Entry
1870*4882a593Smuzhiyun 	 *  Caution: 7   is for IPv6 Neighbor Solicitation offload Entry
1871*4882a593Smuzhiyun 	 */
1872*4882a593Smuzhiyun 	mef_entry_t entry[MAX_NUM_ENTRIES];
1873*4882a593Smuzhiyun } mef_entry;
1874*4882a593Smuzhiyun 
1875*4882a593Smuzhiyun /** vdll_dnld_ctrl structure */
1876*4882a593Smuzhiyun typedef struct _vdll_dnld_ctrl {
1877*4882a593Smuzhiyun 	/**  pending  VDLL block */
1878*4882a593Smuzhiyun 	t_u8 *pending_block;
1879*4882a593Smuzhiyun 	/* pending VDLL block len */
1880*4882a593Smuzhiyun 	t_u16 pending_block_len;
1881*4882a593Smuzhiyun 	/** memory for VDLL fw image */
1882*4882a593Smuzhiyun 	t_u8 *vdll_mem;
1883*4882a593Smuzhiyun 	/**  VDLL fw image len */
1884*4882a593Smuzhiyun 	t_u32 vdll_len;
1885*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
1886*4882a593Smuzhiyun 	/** mlan_buffer for VDLL download */
1887*4882a593Smuzhiyun 	mlan_buffer *cmd_buf;
1888*4882a593Smuzhiyun #endif
1889*4882a593Smuzhiyun } vdll_dnld_ctrl, *pvdll_dnld_ctrl;
1890*4882a593Smuzhiyun 
1891*4882a593Smuzhiyun /** mlan_init_para structure */
1892*4882a593Smuzhiyun typedef struct _mlan_init_para {
1893*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
1894*4882a593Smuzhiyun 	/** MFG mode */
1895*4882a593Smuzhiyun 	t_u32 mfg_mode;
1896*4882a593Smuzhiyun #endif
1897*4882a593Smuzhiyun #ifdef SDIO
1898*4882a593Smuzhiyun 	/** SDIO interrupt mode (0: INT_MODE_SDIO, 1: INT_MODE_GPIO) */
1899*4882a593Smuzhiyun 	t_u32 int_mode;
1900*4882a593Smuzhiyun 	/** GPIO interrupt pin number */
1901*4882a593Smuzhiyun 	t_u32 gpio_pin;
1902*4882a593Smuzhiyun 	/** SDIO MPA Tx */
1903*4882a593Smuzhiyun 	t_u32 mpa_tx_cfg;
1904*4882a593Smuzhiyun 	/** SDIO MPA Rx */
1905*4882a593Smuzhiyun 	t_u32 mpa_rx_cfg;
1906*4882a593Smuzhiyun #endif
1907*4882a593Smuzhiyun 	/** Auto deep sleep */
1908*4882a593Smuzhiyun 	t_u32 auto_ds;
1909*4882a593Smuzhiyun 	/** IEEE PS mode */
1910*4882a593Smuzhiyun 	t_u32 ps_mode;
1911*4882a593Smuzhiyun 	/** Max Tx buffer size */
1912*4882a593Smuzhiyun 	t_u32 max_tx_buf;
1913*4882a593Smuzhiyun 	/** 802.11d configuration */
1914*4882a593Smuzhiyun 	t_u32 cfg_11d;
1915*4882a593Smuzhiyun 	/** 802.11H DFS Master Radar Detect */
1916*4882a593Smuzhiyun 	t_u32 dfs_master_radar_det_en;
1917*4882a593Smuzhiyun 	/** 802.11H DFS Slave Radar Detect */
1918*4882a593Smuzhiyun 	t_u32 dfs_slave_radar_det_en;
1919*4882a593Smuzhiyun 	/** dev cap mask */
1920*4882a593Smuzhiyun 	t_u32 dev_cap_mask;
1921*4882a593Smuzhiyun 	/** oob independent reset mode */
1922*4882a593Smuzhiyun 	t_u32 indrstcfg;
1923*4882a593Smuzhiyun 	/** passive to active scan */
1924*4882a593Smuzhiyun 	t_u8 passive_to_active_scan;
1925*4882a593Smuzhiyun 	/** uap max sta */
1926*4882a593Smuzhiyun 	t_u8 uap_max_sta;
1927*4882a593Smuzhiyun 	/** dfs w53 cfg */
1928*4882a593Smuzhiyun 	t_u8 dfs53cfg;
1929*4882a593Smuzhiyun 	/** dfs_offload */
1930*4882a593Smuzhiyun 	t_u8 dfs_offload;
1931*4882a593Smuzhiyun #ifdef PCIE
1932*4882a593Smuzhiyun 	/** adma ring size */
1933*4882a593Smuzhiyun 	t_u16 ring_size;
1934*4882a593Smuzhiyun #endif
1935*4882a593Smuzhiyun 	t_u8 ext_scan;
1936*4882a593Smuzhiyun 	t_u8 mcs32;
1937*4882a593Smuzhiyun } mlan_init_para, *pmlan_init_para;
1938*4882a593Smuzhiyun 
1939*4882a593Smuzhiyun #ifdef SDIO
1940*4882a593Smuzhiyun typedef struct _mlan_sdio_card_reg {
1941*4882a593Smuzhiyun 	t_u8 start_rd_port;
1942*4882a593Smuzhiyun 	t_u8 start_wr_port;
1943*4882a593Smuzhiyun 	t_u8 base_0_reg;
1944*4882a593Smuzhiyun 	t_u8 base_1_reg;
1945*4882a593Smuzhiyun 	t_u8 poll_reg;
1946*4882a593Smuzhiyun 	t_u8 host_int_enable;
1947*4882a593Smuzhiyun 	t_u8 host_int_status;
1948*4882a593Smuzhiyun 	t_u8 status_reg_0;
1949*4882a593Smuzhiyun 	t_u8 status_reg_1;
1950*4882a593Smuzhiyun 	t_u8 sdio_int_mask;
1951*4882a593Smuzhiyun 	t_u32 data_port_mask;
1952*4882a593Smuzhiyun 	t_u8 max_mp_regs;
1953*4882a593Smuzhiyun 	t_u8 rd_bitmap_l;
1954*4882a593Smuzhiyun 	t_u8 rd_bitmap_u;
1955*4882a593Smuzhiyun 	t_u8 rd_bitmap_1l;
1956*4882a593Smuzhiyun 	t_u8 rd_bitmap_1u;
1957*4882a593Smuzhiyun 	t_u8 wr_bitmap_l;
1958*4882a593Smuzhiyun 	t_u8 wr_bitmap_u;
1959*4882a593Smuzhiyun 	t_u8 wr_bitmap_1l;
1960*4882a593Smuzhiyun 	t_u8 wr_bitmap_1u;
1961*4882a593Smuzhiyun 	t_u8 rd_len_p0_l;
1962*4882a593Smuzhiyun 	t_u8 rd_len_p0_u;
1963*4882a593Smuzhiyun 	t_u8 card_config_2_1_reg;
1964*4882a593Smuzhiyun 	t_u8 cmd_config_0;
1965*4882a593Smuzhiyun 	t_u8 cmd_config_1;
1966*4882a593Smuzhiyun 	t_u8 cmd_config_2;
1967*4882a593Smuzhiyun 	t_u8 cmd_config_3;
1968*4882a593Smuzhiyun 	t_u8 cmd_rd_len_0;
1969*4882a593Smuzhiyun 	t_u8 cmd_rd_len_1;
1970*4882a593Smuzhiyun 	t_u8 cmd_rd_len_2;
1971*4882a593Smuzhiyun 	t_u8 cmd_rd_len_3;
1972*4882a593Smuzhiyun 	t_u8 io_port_0_reg;
1973*4882a593Smuzhiyun 	t_u8 io_port_1_reg;
1974*4882a593Smuzhiyun 	t_u8 io_port_2_reg;
1975*4882a593Smuzhiyun 	t_u8 host_int_rsr_reg;
1976*4882a593Smuzhiyun 	t_u8 host_int_mask_reg;
1977*4882a593Smuzhiyun 	t_u8 host_int_status_reg;
1978*4882a593Smuzhiyun 	t_u8 host_restart_reg;
1979*4882a593Smuzhiyun 	t_u8 card_to_host_event_reg;
1980*4882a593Smuzhiyun 	t_u8 host_interrupt_mask_reg;
1981*4882a593Smuzhiyun 	t_u8 card_interrupt_status_reg;
1982*4882a593Smuzhiyun 	t_u8 card_interrupt_rsr_reg;
1983*4882a593Smuzhiyun 	t_u8 card_revision_reg;
1984*4882a593Smuzhiyun 	t_u8 card_ocr_0_reg;
1985*4882a593Smuzhiyun 	t_u8 card_ocr_1_reg;
1986*4882a593Smuzhiyun 	t_u8 card_ocr_3_reg;
1987*4882a593Smuzhiyun 	t_u8 card_config_reg;
1988*4882a593Smuzhiyun 	t_u8 card_misc_cfg_reg;
1989*4882a593Smuzhiyun 	t_u8 debug_0_reg;
1990*4882a593Smuzhiyun 	t_u8 debug_1_reg;
1991*4882a593Smuzhiyun 	t_u8 debug_2_reg;
1992*4882a593Smuzhiyun 	t_u8 debug_3_reg;
1993*4882a593Smuzhiyun 	t_u32 fw_reset_reg;
1994*4882a593Smuzhiyun 	t_u8 fw_reset_val;
1995*4882a593Smuzhiyun 	t_u8 fw_dnld_offset_0_reg;
1996*4882a593Smuzhiyun 	t_u8 fw_dnld_offset_1_reg;
1997*4882a593Smuzhiyun 	t_u8 fw_dnld_offset_2_reg;
1998*4882a593Smuzhiyun 	t_u8 fw_dnld_offset_3_reg;
1999*4882a593Smuzhiyun 	t_u8 fw_dnld_status_0_reg;
2000*4882a593Smuzhiyun 	t_u8 fw_dnld_status_1_reg;
2001*4882a593Smuzhiyun 	t_u8 winner_check_reg;
2002*4882a593Smuzhiyun } mlan_sdio_card_reg, *pmlan_sdio_card_reg;
2003*4882a593Smuzhiyun 
2004*4882a593Smuzhiyun typedef struct _mlan_sdio_card {
2005*4882a593Smuzhiyun 	const mlan_sdio_card_reg *reg;
2006*4882a593Smuzhiyun 	/** maximum ports */
2007*4882a593Smuzhiyun 	t_u8 max_ports;
2008*4882a593Smuzhiyun 	/** mp aggregation packet limit */
2009*4882a593Smuzhiyun 	t_u8 mp_aggr_pkt_limit;
2010*4882a593Smuzhiyun 	/** sdio new mode support */
2011*4882a593Smuzhiyun 	t_bool supports_sdio_new_mode;
2012*4882a593Smuzhiyun 	/** max tx aggr buf size */
2013*4882a593Smuzhiyun 	t_u32 mp_tx_aggr_buf_size;
2014*4882a593Smuzhiyun 	/** max rx aggr buf size */
2015*4882a593Smuzhiyun 	t_u32 mp_rx_aggr_buf_size;
2016*4882a593Smuzhiyun 	/** IO port */
2017*4882a593Smuzhiyun 	t_u32 ioport;
2018*4882a593Smuzhiyun 	/** number of interrupt receive */
2019*4882a593Smuzhiyun 	t_u32 num_of_irq;
2020*4882a593Smuzhiyun 	/** max SDIO single port tx size */
2021*4882a593Smuzhiyun 	t_u16 max_sp_tx_size;
2022*4882a593Smuzhiyun 	/** max SDIO single port rx size */
2023*4882a593Smuzhiyun 	t_u16 max_sp_rx_size;
2024*4882a593Smuzhiyun 	/** SDIO multiple port read bitmap */
2025*4882a593Smuzhiyun 	t_u32 mp_rd_bitmap;
2026*4882a593Smuzhiyun 	/** SDIO multiple port write bitmap */
2027*4882a593Smuzhiyun 	t_u32 mp_wr_bitmap;
2028*4882a593Smuzhiyun 	/** SDIO end port from txbufcfg */
2029*4882a593Smuzhiyun 	t_u16 mp_end_port;
2030*4882a593Smuzhiyun 	/** SDIO port mask calculated based on txbufcfg end port */
2031*4882a593Smuzhiyun 	t_u32 mp_data_port_mask;
2032*4882a593Smuzhiyun 	/** Current available port for read */
2033*4882a593Smuzhiyun 	t_u8 curr_rd_port;
2034*4882a593Smuzhiyun 	/** Current available port for write */
2035*4882a593Smuzhiyun 	t_u8 curr_wr_port;
2036*4882a593Smuzhiyun 	/** FW update port number */
2037*4882a593Smuzhiyun 	t_u32 mp_update[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX * 2];
2038*4882a593Smuzhiyun 	/** Invalid port update count */
2039*4882a593Smuzhiyun 	t_u32 mp_invalid_update;
2040*4882a593Smuzhiyun 	/** Array to store values of SDIO multiple port group registers */
2041*4882a593Smuzhiyun 	t_u8 *mp_regs;
2042*4882a593Smuzhiyun 	/** allocated buf to read SDIO multiple port group registers */
2043*4882a593Smuzhiyun 	t_u8 *mp_regs_buf;
2044*4882a593Smuzhiyun 	/** buffer to handle receive packet */
2045*4882a593Smuzhiyun 	t_u8 *rx_buf;
2046*4882a593Smuzhiyun 	/** allocated buf for receive */
2047*4882a593Smuzhiyun 	t_u8 *rx_buffer;
2048*4882a593Smuzhiyun 	/* see blk_queue_max_segment_size */
2049*4882a593Smuzhiyun 	t_u32 max_seg_size;
2050*4882a593Smuzhiyun 	/* see blk_queue_max_segments */
2051*4882a593Smuzhiyun 	t_u16 max_segs;
2052*4882a593Smuzhiyun 
2053*4882a593Smuzhiyun 	/** data structure for SDIO MPA TX */
2054*4882a593Smuzhiyun 	sdio_mpa_tx mpa_tx;
2055*4882a593Smuzhiyun 	/** packet number for tx aggr */
2056*4882a593Smuzhiyun 	t_u32 mpa_tx_count[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
2057*4882a593Smuzhiyun 	/** no more packets count*/
2058*4882a593Smuzhiyun 	t_u32 mpa_sent_last_pkt;
2059*4882a593Smuzhiyun 	/** no write_ports count */
2060*4882a593Smuzhiyun 	t_u32 mpa_sent_no_ports;
2061*4882a593Smuzhiyun 	/** last wr_bitmap from FW */
2062*4882a593Smuzhiyun 	t_u32 last_recv_wr_bitmap;
2063*4882a593Smuzhiyun 	/** last wr_bitmap from FW */
2064*4882a593Smuzhiyun 	t_u32 last_recv_rd_bitmap;
2065*4882a593Smuzhiyun 	/** last mp_wr_bitmap */
2066*4882a593Smuzhiyun 	t_u32 last_mp_wr_bitmap[SDIO_MP_DBG_NUM];
2067*4882a593Smuzhiyun 	/** last ports for cmd53 write data */
2068*4882a593Smuzhiyun 	t_u32 last_mp_wr_ports[SDIO_MP_DBG_NUM];
2069*4882a593Smuzhiyun 	/** last length for cmd53 write data */
2070*4882a593Smuzhiyun 	t_u32 last_mp_wr_len[SDIO_MP_DBG_NUM];
2071*4882a593Smuzhiyun 	/** length info for cmd53 write data */
2072*4882a593Smuzhiyun 	t_u16 last_mp_wr_info[SDIO_MP_DBG_NUM * SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
2073*4882a593Smuzhiyun 	/** last curr_wr_port */
2074*4882a593Smuzhiyun 	t_u8 last_curr_wr_port[SDIO_MP_DBG_NUM];
2075*4882a593Smuzhiyun 
2076*4882a593Smuzhiyun 	/** buffer for mp debug */
2077*4882a593Smuzhiyun 	t_u8 *mpa_buf;
2078*4882a593Smuzhiyun 	/** length info for mp buf size */
2079*4882a593Smuzhiyun 	t_u32 mpa_buf_size;
2080*4882a593Smuzhiyun 
2081*4882a593Smuzhiyun 	/** last mp_index */
2082*4882a593Smuzhiyun 	t_u8 last_mp_index;
2083*4882a593Smuzhiyun 
2084*4882a593Smuzhiyun 	/** data structure for SDIO MPA RX */
2085*4882a593Smuzhiyun 	sdio_mpa_rx mpa_rx;
2086*4882a593Smuzhiyun 	/** packet number for tx aggr */
2087*4882a593Smuzhiyun 	t_u32 mpa_rx_count[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX];
2088*4882a593Smuzhiyun 
2089*4882a593Smuzhiyun 	/** SDIO interrupt mode (0: INT_MODE_SDIO, 1: INT_MODE_GPIO) */
2090*4882a593Smuzhiyun 	t_u32 int_mode;
2091*4882a593Smuzhiyun 	/** GPIO interrupt pin number */
2092*4882a593Smuzhiyun 	t_u32 gpio_pin;
2093*4882a593Smuzhiyun 
2094*4882a593Smuzhiyun 	/** flag for sdio rx aggr */
2095*4882a593Smuzhiyun 	t_bool sdio_rx_aggr_enable;
2096*4882a593Smuzhiyun 	/** fw rx block size */
2097*4882a593Smuzhiyun 	t_u16 sdio_rx_block_size;
2098*4882a593Smuzhiyun } mlan_sdio_card, *pmlan_sdio_card;
2099*4882a593Smuzhiyun #endif
2100*4882a593Smuzhiyun 
2101*4882a593Smuzhiyun #ifdef PCIE
2102*4882a593Smuzhiyun #define MAX_TXRX_BD 32
2103*4882a593Smuzhiyun #define ADMA_MAX_TXRX_BD 512
2104*4882a593Smuzhiyun #define ADMA_DEF_TXRX_BD 128
2105*4882a593Smuzhiyun /** 128 entry will mapping to 7*/
2106*4882a593Smuzhiyun #define TXRX_DEF_NUM_DESC 7
2107*4882a593Smuzhiyun /** 8 entry will mapping to 3 */
2108*4882a593Smuzhiyun #define EVT_NUM_DESC 3
2109*4882a593Smuzhiyun #define MLAN_MAX_TXRX_BD MAX(ADMA_MAX_TXRX_BD, MAX_TXRX_BD)
2110*4882a593Smuzhiyun /** 8 Event buffer ring */
2111*4882a593Smuzhiyun #define MLAN_MAX_EVT_BD 0x08
2112*4882a593Smuzhiyun typedef struct _mlan_pcie_card_reg {
2113*4882a593Smuzhiyun 	/* TX buffer description rd pointer */
2114*4882a593Smuzhiyun 	t_u32 reg_txbd_rdptr;
2115*4882a593Smuzhiyun 	/* TX buffer description wr pointer */
2116*4882a593Smuzhiyun 	t_u32 reg_txbd_wrptr;
2117*4882a593Smuzhiyun 	/* RX buffer description rd pointer */
2118*4882a593Smuzhiyun 	t_u32 reg_rxbd_rdptr;
2119*4882a593Smuzhiyun 	/* RX buffer description wr pointer */
2120*4882a593Smuzhiyun 	t_u32 reg_rxbd_wrptr;
2121*4882a593Smuzhiyun 	/** evtbd rdptr register */
2122*4882a593Smuzhiyun 	t_u32 reg_evtbd_rdptr;
2123*4882a593Smuzhiyun 	/** evtbd wrptr register */
2124*4882a593Smuzhiyun 	t_u32 reg_evtbd_wrptr;
2125*4882a593Smuzhiyun 	/** host int mask register */
2126*4882a593Smuzhiyun 	t_u16 reg_host_int_mask;
2127*4882a593Smuzhiyun 	/** host int status mask register*/
2128*4882a593Smuzhiyun 	t_u16 reg_host_int_status_mask;
2129*4882a593Smuzhiyun 	/** host int status register */
2130*4882a593Smuzhiyun 	t_u16 reg_host_int_status;
2131*4882a593Smuzhiyun 	/** host int status clr selection */
2132*4882a593Smuzhiyun 	t_u32 reg_host_int_clr_sel;
2133*4882a593Smuzhiyun 	/** cpu int event register */
2134*4882a593Smuzhiyun 	t_u16 reg_cpu_int_event;
2135*4882a593Smuzhiyun 	/** ip revision register */
2136*4882a593Smuzhiyun 	t_u16 reg_ip_rev;
2137*4882a593Smuzhiyun 	/** revision id register */
2138*4882a593Smuzhiyun 	t_u32 reg_rev_id;
2139*4882a593Smuzhiyun 	/** driver ready register */
2140*4882a593Smuzhiyun 	t_u16 reg_drv_ready;
2141*4882a593Smuzhiyun 	/** cpu int status register */
2142*4882a593Smuzhiyun 	t_u16 reg_cpu_int_status;
2143*4882a593Smuzhiyun 	/** scratch 0 register */
2144*4882a593Smuzhiyun 	t_u16 reg_scratch_0;
2145*4882a593Smuzhiyun 	/** scratch 1 register */
2146*4882a593Smuzhiyun 	t_u16 reg_scratch_1;
2147*4882a593Smuzhiyun 	/** scratch 2 register */
2148*4882a593Smuzhiyun 	t_u16 reg_scratch_2;
2149*4882a593Smuzhiyun 	/** scratch 3 register */
2150*4882a593Smuzhiyun 	t_u16 reg_scratch_3;
2151*4882a593Smuzhiyun 	/** scratch 6 register */
2152*4882a593Smuzhiyun 	t_u16 reg_scratch_6;
2153*4882a593Smuzhiyun 	/** scratch 7 register */
2154*4882a593Smuzhiyun 	t_u16 reg_scratch_7;
2155*4882a593Smuzhiyun 	/** host interrupt mask*/
2156*4882a593Smuzhiyun 	t_u32 host_intr_mask;
2157*4882a593Smuzhiyun 	/** data send interrupt for host*/
2158*4882a593Smuzhiyun 	t_u32 host_intr_dnld_done;
2159*4882a593Smuzhiyun 	/** Data receive interrupt for host */
2160*4882a593Smuzhiyun 	t_u32 host_intr_upld_rdy;
2161*4882a593Smuzhiyun 	/** Command sent interrupt for host */
2162*4882a593Smuzhiyun 	t_u32 host_intr_cmd_done;
2163*4882a593Smuzhiyun 	/** Event ready interrupt for host */
2164*4882a593Smuzhiyun 	t_u32 host_intr_event_rdy;
2165*4882a593Smuzhiyun 	t_u32 host_intr_cmd_dnld;
2166*4882a593Smuzhiyun 	/* TX/RX buffer description mask */
2167*4882a593Smuzhiyun 	t_u32 txrx_rw_ptr_mask;
2168*4882a593Smuzhiyun 	/* TX/RX buffer description wrap mask */
2169*4882a593Smuzhiyun 	t_u32 txrx_rw_ptr_wrap_mask;
2170*4882a593Smuzhiyun 	/* TX/RX buffer description indication */
2171*4882a593Smuzhiyun 	t_u32 txrx_rw_ptr_rollover_ind;
2172*4882a593Smuzhiyun 	/** ADMA feature */
2173*4882a593Smuzhiyun 	t_u8 use_adma;
2174*4882a593Smuzhiyun 	/** write to clear interrupt status flag */
2175*4882a593Smuzhiyun 	t_u8 msi_int_wr_clr;
2176*4882a593Smuzhiyun } mlan_pcie_card_reg, *pmlan_pcie_card_reg;
2177*4882a593Smuzhiyun 
2178*4882a593Smuzhiyun typedef struct _mlan_pcie_card {
2179*4882a593Smuzhiyun 	const mlan_pcie_card_reg *reg;
2180*4882a593Smuzhiyun 	/** PCIE interrupt modes 0: Legacy, 1: MSI, 2:MSI-X */
2181*4882a593Smuzhiyun 	t_u32 pcie_int_mode;
2182*4882a593Smuzhiyun 	/** PCIE function number */
2183*4882a593Smuzhiyun 	t_u8 func_num;
2184*4882a593Smuzhiyun 	/** pending num of tx ring buffer in firmware */
2185*4882a593Smuzhiyun 	t_u8 txbd_pending;
2186*4882a593Smuzhiyun 	/** Write pointer for TXBD ring */
2187*4882a593Smuzhiyun 	t_u32 txbd_wrptr;
2188*4882a593Smuzhiyun 	/** Shadow copy of TXBD read pointer */
2189*4882a593Smuzhiyun 	t_u32 txbd_rdptr;
2190*4882a593Smuzhiyun 	/** TXBD ring size */
2191*4882a593Smuzhiyun 	t_u32 txbd_ring_size;
2192*4882a593Smuzhiyun 	/** Lock for protecting the TX ring */
2193*4882a593Smuzhiyun 	t_void *tx_ring_lock;
2194*4882a593Smuzhiyun 	/** Virtual base address of txbd_ring */
2195*4882a593Smuzhiyun 	t_u8 *txbd_ring_vbase;
2196*4882a593Smuzhiyun 	/** Physical base address of txbd_ring */
2197*4882a593Smuzhiyun 	t_u64 txbd_ring_pbase;
2198*4882a593Smuzhiyun 	/** Ring of buffer descriptors for TX */
2199*4882a593Smuzhiyun 	t_void *txbd_ring[MLAN_MAX_TXRX_BD];
2200*4882a593Smuzhiyun 	/** A list of mlan_buffer objects used for data tx */
2201*4882a593Smuzhiyun 	mlan_buffer *tx_buf_list[MLAN_MAX_TXRX_BD];
2202*4882a593Smuzhiyun 	/** Flush indicator for txbd_ring */
2203*4882a593Smuzhiyun 	t_bool txbd_flush;
2204*4882a593Smuzhiyun 	/** txrx data dma ring size */
2205*4882a593Smuzhiyun 	t_u16 txrx_bd_size;
2206*4882a593Smuzhiyun 	/** txrx num desc */
2207*4882a593Smuzhiyun 	t_u16 txrx_num_desc;
2208*4882a593Smuzhiyun 
2209*4882a593Smuzhiyun 	/** Shadow copy of RXBD write pointer */
2210*4882a593Smuzhiyun 	t_u32 rxbd_wrptr;
2211*4882a593Smuzhiyun 	/** RxBD read pointer */
2212*4882a593Smuzhiyun 	t_u32 rxbd_rdptr;
2213*4882a593Smuzhiyun 	/** RXBD ring size */
2214*4882a593Smuzhiyun 	t_u32 rxbd_ring_size;
2215*4882a593Smuzhiyun 	/** A spinlock for rxbd_ring */
2216*4882a593Smuzhiyun 	t_void *rx_ring_lock;
2217*4882a593Smuzhiyun 	/** Virtual base address of rxbd_ring */
2218*4882a593Smuzhiyun 	t_u8 *rxbd_ring_vbase;
2219*4882a593Smuzhiyun 	/** Physical base address of rxbd_ring */
2220*4882a593Smuzhiyun 	t_u64 rxbd_ring_pbase;
2221*4882a593Smuzhiyun 	/** Ring of buffer descriptors for RX */
2222*4882a593Smuzhiyun 	t_void *rxbd_ring[MLAN_MAX_TXRX_BD];
2223*4882a593Smuzhiyun 	/** A list of mlan_buffer objects used for data rx */
2224*4882a593Smuzhiyun 	mlan_buffer *rx_buf_list[MLAN_MAX_TXRX_BD];
2225*4882a593Smuzhiyun 
2226*4882a593Smuzhiyun 	/** Shadow copy of cmdrsp/evt write pointer */
2227*4882a593Smuzhiyun 	t_u32 evtbd_wrptr;
2228*4882a593Smuzhiyun 	/** Read pointer for cmdrsp/evt ring */
2229*4882a593Smuzhiyun 	t_u32 evtbd_rdptr;
2230*4882a593Smuzhiyun 	/** Size of the cmdrsp/evt ring */
2231*4882a593Smuzhiyun 	t_u32 evtbd_ring_size;
2232*4882a593Smuzhiyun 	/** Virtual base address of evtbd_bd_ring */
2233*4882a593Smuzhiyun 	t_u8 *evtbd_ring_vbase;
2234*4882a593Smuzhiyun 	/** Physical base address of evtbd_bd_ring */
2235*4882a593Smuzhiyun 	t_u64 evtbd_ring_pbase;
2236*4882a593Smuzhiyun 	/** Ring of buffer descriptors for EVENT */
2237*4882a593Smuzhiyun 	t_void *evtbd_ring[MLAN_MAX_EVT_BD];
2238*4882a593Smuzhiyun 	/** A list of mlan_buffer objects used for EVENT */
2239*4882a593Smuzhiyun 	mlan_buffer *evt_buf_list[MLAN_MAX_EVT_BD];
2240*4882a593Smuzhiyun 
2241*4882a593Smuzhiyun 	/** Command buffer */
2242*4882a593Smuzhiyun 	mlan_buffer *cmd_buf;
2243*4882a593Smuzhiyun 	/** Command response buffer */
2244*4882a593Smuzhiyun 	mlan_buffer *cmdrsp_buf;
2245*4882a593Smuzhiyun 	/** Command buffer */
2246*4882a593Smuzhiyun 	mlan_buffer *vdll_cmd_buf;
2247*4882a593Smuzhiyun 	/** last tx_pkt_size  */
2248*4882a593Smuzhiyun 	t_u32 last_tx_pkt_size[MLAN_MAX_TXRX_BD];
2249*4882a593Smuzhiyun } mlan_pcie_card, *pmlan_pcie_card;
2250*4882a593Smuzhiyun #endif
2251*4882a593Smuzhiyun 
2252*4882a593Smuzhiyun #ifdef USB
2253*4882a593Smuzhiyun typedef struct _mlan_usb_card {
2254*4882a593Smuzhiyun 	/** data structure for USB Rx Deaggregation */
2255*4882a593Smuzhiyun 	usb_rx_deaggr_params usb_rx_deaggr;
2256*4882a593Smuzhiyun 	/** data structure for USB Tx Aggregation */
2257*4882a593Smuzhiyun 	usb_tx_aggr_params usb_tx_aggr[MAX_USB_TX_PORT_NUM];
2258*4882a593Smuzhiyun 	/** USB sggregation supported by FW */
2259*4882a593Smuzhiyun 	t_u8 fw_usb_aggr;
2260*4882a593Smuzhiyun 
2261*4882a593Smuzhiyun } mlan_usb_card, *pmlan_usb_card;
2262*4882a593Smuzhiyun 
2263*4882a593Smuzhiyun #endif
2264*4882a593Smuzhiyun 
2265*4882a593Smuzhiyun typedef struct _mlan_card_info {
2266*4882a593Smuzhiyun 	/** Max Tx buffer size */
2267*4882a593Smuzhiyun 	t_u32 max_tx_buf_size;
2268*4882a593Smuzhiyun 	/** support V14_FW_API */
2269*4882a593Smuzhiyun 	t_u8 v14_fw_api;
2270*4882a593Smuzhiyun 	/** support V16_FW_API */
2271*4882a593Smuzhiyun 	t_u8 v16_fw_api;
2272*4882a593Smuzhiyun 	/** support V17_FW_API */
2273*4882a593Smuzhiyun 	t_u8 v17_fw_api;
2274*4882a593Smuzhiyun 	/** suppress PS handshake */
2275*4882a593Smuzhiyun 	t_u8 supp_ps_handshake;
2276*4882a593Smuzhiyun 	/** DEFAULT_11N_TX_BF_CAP */
2277*4882a593Smuzhiyun 	t_u32 default_11n_tx_bf_cap;
2278*4882a593Smuzhiyun } mlan_card_info, *pmlan_card_info;
2279*4882a593Smuzhiyun 
2280*4882a593Smuzhiyun typedef struct _mlan_adapter mlan_adapter, *pmlan_adapter;
2281*4882a593Smuzhiyun 
2282*4882a593Smuzhiyun /**Adapter_operations data structure*/
2283*4882a593Smuzhiyun typedef struct _adapter_operations {
2284*4882a593Smuzhiyun 	/**firmware download handler*/
2285*4882a593Smuzhiyun 	mlan_status (*dnld_fw)(pmlan_adapter pmadapter, pmlan_fw_image pmfw);
2286*4882a593Smuzhiyun 	/**interrupt handler*/
2287*4882a593Smuzhiyun 	mlan_status (*interrupt)(t_u16 msg_id, pmlan_adapter pmadapter);
2288*4882a593Smuzhiyun 	/**INT process handler*/
2289*4882a593Smuzhiyun 	mlan_status (*process_int_status)(pmlan_adapter pmadapter);
2290*4882a593Smuzhiyun 	/**host to card handler*/
2291*4882a593Smuzhiyun 	mlan_status (*host_to_card)(pmlan_private pmpriv, t_u8 type,
2292*4882a593Smuzhiyun 				    mlan_buffer *pmbuf,
2293*4882a593Smuzhiyun 				    mlan_tx_param *tx_param);
2294*4882a593Smuzhiyun 	/*wakeup card*/
2295*4882a593Smuzhiyun 	mlan_status (*wakeup_card)(pmlan_adapter pmadapter, t_u8 timeout);
2296*4882a593Smuzhiyun 	/*reset the PM setting of card*/
2297*4882a593Smuzhiyun 	mlan_status (*reset_card)(pmlan_adapter adapter);
2298*4882a593Smuzhiyun 	/** Handle event/cmd complete*/
2299*4882a593Smuzhiyun 	mlan_status (*event_complete)(mlan_adapter *pmlan_adapter,
2300*4882a593Smuzhiyun 				      pmlan_buffer pmbuf, mlan_status status);
2301*4882a593Smuzhiyun 	/** Handle complete receiving data */
2302*4882a593Smuzhiyun 	mlan_status (*data_complete)(mlan_adapter *pmlan_adapter,
2303*4882a593Smuzhiyun 				     pmlan_buffer pmbuf, mlan_status status);
2304*4882a593Smuzhiyun 	/** Handle command response complete */
2305*4882a593Smuzhiyun 	mlan_status (*cmdrsp_complete)(mlan_adapter *pmlan_adapter,
2306*4882a593Smuzhiyun 				       pmlan_buffer pmbuf, mlan_status status);
2307*4882a593Smuzhiyun 	/** Handle rx packet */
2308*4882a593Smuzhiyun 	mlan_status (*handle_rx_packet)(mlan_adapter *pmadapter,
2309*4882a593Smuzhiyun 					pmlan_buffer pmbuf);
2310*4882a593Smuzhiyun 	/** handle dump interface specific info */
2311*4882a593Smuzhiyun 	mlan_status (*debug_dump)(mlan_adapter *pmadapter);
2312*4882a593Smuzhiyun 	/** disable host interrupt */
2313*4882a593Smuzhiyun 	mlan_status (*disable_host_int)(mlan_adapter *pmadapter);
2314*4882a593Smuzhiyun 	/** enable host interrupt */
2315*4882a593Smuzhiyun 	mlan_status (*enable_host_int)(mlan_adapter *pmadapter);
2316*4882a593Smuzhiyun 	/**Interface header length*/
2317*4882a593Smuzhiyun 	t_u32 intf_header_len;
2318*4882a593Smuzhiyun } mlan_adapter_operations;
2319*4882a593Smuzhiyun 
2320*4882a593Smuzhiyun /** Adapter data structure for MLAN */
2321*4882a593Smuzhiyun struct _mlan_adapter {
2322*4882a593Smuzhiyun 	/** MOAL handle structure */
2323*4882a593Smuzhiyun 	t_void *pmoal_handle;
2324*4882a593Smuzhiyun 	/** BSS Attributes */
2325*4882a593Smuzhiyun 	mlan_bss_attr bss_attr[MLAN_MAX_BSS_NUM];
2326*4882a593Smuzhiyun 	/** Private pointer */
2327*4882a593Smuzhiyun 	pmlan_private priv[MLAN_MAX_BSS_NUM];
2328*4882a593Smuzhiyun 	/** Total number of Priv number */
2329*4882a593Smuzhiyun 	t_u8 priv_num;
2330*4882a593Smuzhiyun 	/** Priority table for bss */
2331*4882a593Smuzhiyun 	mlan_bssprio_tbl bssprio_tbl[MLAN_MAX_BSS_NUM];
2332*4882a593Smuzhiyun 	/** Callback table */
2333*4882a593Smuzhiyun 	mlan_callbacks callbacks;
2334*4882a593Smuzhiyun 	/** Init parameters */
2335*4882a593Smuzhiyun 	mlan_init_para init_para;
2336*4882a593Smuzhiyun 	/** mlan_lock for init/shutdown */
2337*4882a593Smuzhiyun 	t_void *pmlan_lock;
2338*4882a593Smuzhiyun 	/** main_proc_lock for main_process */
2339*4882a593Smuzhiyun 	t_void *pmain_proc_lock;
2340*4882a593Smuzhiyun 	/** mlan_processing */
2341*4882a593Smuzhiyun 	t_u32 mlan_processing;
2342*4882a593Smuzhiyun 	/** main_process_cnt */
2343*4882a593Smuzhiyun 	t_u32 main_process_cnt;
2344*4882a593Smuzhiyun 	/** mlan_rx_processing */
2345*4882a593Smuzhiyun 	t_u32 mlan_rx_processing;
2346*4882a593Smuzhiyun 	/** rx_proc_lock for main_rx_process */
2347*4882a593Smuzhiyun 	t_void *prx_proc_lock;
2348*4882a593Smuzhiyun 	/** more_rx_task_flag */
2349*4882a593Smuzhiyun 	t_u32 more_rx_task_flag;
2350*4882a593Smuzhiyun 	/** rx work enable flag */
2351*4882a593Smuzhiyun 	t_u8 rx_work_flag;
2352*4882a593Smuzhiyun 	/* number of rx pkts queued */
2353*4882a593Smuzhiyun 	t_u16 rx_pkts_queued;
2354*4882a593Smuzhiyun 	/** more task flag */
2355*4882a593Smuzhiyun 	t_u32 more_task_flag;
2356*4882a593Smuzhiyun 	/** delay task flag */
2357*4882a593Smuzhiyun 	t_u32 delay_task_flag;
2358*4882a593Smuzhiyun 	/** Max tx buf size */
2359*4882a593Smuzhiyun 	t_u16 max_tx_buf_size;
2360*4882a593Smuzhiyun 	/** Tx buf size */
2361*4882a593Smuzhiyun 	t_u16 tx_buf_size;
2362*4882a593Smuzhiyun 	/** current tx buf size in fw */
2363*4882a593Smuzhiyun 	t_u16 curr_tx_buf_size;
2364*4882a593Smuzhiyun 	/** flush data flag */
2365*4882a593Smuzhiyun 	t_u8 flush_data;
2366*4882a593Smuzhiyun 	/** STATUS variables */
2367*4882a593Smuzhiyun 	WLAN_HARDWARE_STATUS hw_status;
2368*4882a593Smuzhiyun 	/** PnP SUPPORT */
2369*4882a593Smuzhiyun 	t_u8 surprise_removed;
2370*4882a593Smuzhiyun 	/** FW hang report */
2371*4882a593Smuzhiyun 	t_u8 fw_hang_report;
2372*4882a593Smuzhiyun 
2373*4882a593Smuzhiyun 	/** ECSA support */
2374*4882a593Smuzhiyun 	t_u8 ecsa_enable;
2375*4882a593Smuzhiyun 
2376*4882a593Smuzhiyun 	/** Get log support */
2377*4882a593Smuzhiyun 	t_u8 getlog_enable;
2378*4882a593Smuzhiyun 
2379*4882a593Smuzhiyun 	/** Radio on flag */
2380*4882a593Smuzhiyun 	t_u16 radio_on;
2381*4882a593Smuzhiyun 
2382*4882a593Smuzhiyun 	/** Firmware release number */
2383*4882a593Smuzhiyun 	t_u32 fw_release_number;
2384*4882a593Smuzhiyun 	/** firmware version */
2385*4882a593Smuzhiyun 	t_u8 fw_ver;
2386*4882a593Smuzhiyun 	/** firmware minor version */
2387*4882a593Smuzhiyun 	t_u8 fw_min_ver;
2388*4882a593Smuzhiyun 	/** firmare hotfix version */
2389*4882a593Smuzhiyun 	t_u8 fw_hotfix_ver;
2390*4882a593Smuzhiyun 	/** uap firmware version */
2391*4882a593Smuzhiyun 	t_u8 uap_fw_ver;
2392*4882a593Smuzhiyun 	/** mac address retrun from get_hw_spec */
2393*4882a593Smuzhiyun 	t_u8 permanent_addr[MLAN_MAC_ADDR_LENGTH];
2394*4882a593Smuzhiyun 	/** Number of antenna used */
2395*4882a593Smuzhiyun 	t_u16 number_of_antenna;
2396*4882a593Smuzhiyun 	/** antenna info */
2397*4882a593Smuzhiyun 	t_u8 antinfo;
2398*4882a593Smuzhiyun 	/** Firmware capability information */
2399*4882a593Smuzhiyun 	t_u32 fw_cap_info;
2400*4882a593Smuzhiyun 	/** Extended firmware capability information */
2401*4882a593Smuzhiyun 	t_u32 fw_cap_ext;
2402*4882a593Smuzhiyun #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) ||                \
2403*4882a593Smuzhiyun 	defined(PCIE9097) || defined(SD9097) || defined(USB9097) ||            \
2404*4882a593Smuzhiyun 	defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
2405*4882a593Smuzhiyun 	/** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for
2406*4882a593Smuzhiyun 	 * 2G */
2407*4882a593Smuzhiyun 	t_u16 user_htstream;
2408*4882a593Smuzhiyun #endif
2409*4882a593Smuzhiyun 	/** vdll ctrl */
2410*4882a593Smuzhiyun 	vdll_dnld_ctrl vdll_ctrl;
2411*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
2412*4882a593Smuzhiyun 	/** pint_lock for interrupt handling */
2413*4882a593Smuzhiyun 	t_void *pint_lock;
2414*4882a593Smuzhiyun 	/** Interrupt status */
2415*4882a593Smuzhiyun 	t_u32 ireg;
2416*4882a593Smuzhiyun #endif
2417*4882a593Smuzhiyun 	/** card type */
2418*4882a593Smuzhiyun 	t_u16 card_type;
2419*4882a593Smuzhiyun 	/** card rev */
2420*4882a593Smuzhiyun 	t_u8 card_rev;
2421*4882a593Smuzhiyun 	const mlan_card_info *pcard_info;
2422*4882a593Smuzhiyun #ifdef SDIO
2423*4882a593Smuzhiyun 	pmlan_sdio_card pcard_sd;
2424*4882a593Smuzhiyun #endif
2425*4882a593Smuzhiyun #ifdef PCIE
2426*4882a593Smuzhiyun 	pmlan_pcie_card pcard_pcie;
2427*4882a593Smuzhiyun #endif
2428*4882a593Smuzhiyun #ifdef USB
2429*4882a593Smuzhiyun 	pmlan_usb_card pcard_usb;
2430*4882a593Smuzhiyun #endif
2431*4882a593Smuzhiyun 
2432*4882a593Smuzhiyun 	/** Event cause */
2433*4882a593Smuzhiyun 	t_u32 event_cause;
2434*4882a593Smuzhiyun 	/** Event buffer */
2435*4882a593Smuzhiyun 	pmlan_buffer pmlan_buffer_event;
2436*4882a593Smuzhiyun 	/** Upload length */
2437*4882a593Smuzhiyun 	t_u32 upld_len;
2438*4882a593Smuzhiyun 	/** Upload buffer*/
2439*4882a593Smuzhiyun 	t_u8 upld_buf[WLAN_UPLD_SIZE];
2440*4882a593Smuzhiyun 	/** Data sent:
2441*4882a593Smuzhiyun 	 *       TRUE - Data is sent to fw, no Tx Done received
2442*4882a593Smuzhiyun 	 *       FALSE - Tx done received for previous Tx
2443*4882a593Smuzhiyun 	 */
2444*4882a593Smuzhiyun 	t_u8 data_sent;
2445*4882a593Smuzhiyun 	/** Data sent cnt */
2446*4882a593Smuzhiyun 	t_u32 data_sent_cnt;
2447*4882a593Smuzhiyun 	/** CMD sent:
2448*4882a593Smuzhiyun 	 *       TRUE - CMD is sent to fw, no CMD Done received
2449*4882a593Smuzhiyun 	 *       FALSE - CMD done received for previous CMD
2450*4882a593Smuzhiyun 	 */
2451*4882a593Smuzhiyun 	t_u8 cmd_sent;
2452*4882a593Smuzhiyun 	/** CMD Response received:
2453*4882a593Smuzhiyun 	 *       TRUE - CMD is response is received from fw, and yet to process
2454*4882a593Smuzhiyun 	 *       FALSE - No cmd response to process
2455*4882a593Smuzhiyun 	 */
2456*4882a593Smuzhiyun 	t_u8 cmd_resp_received;
2457*4882a593Smuzhiyun 	/** Event received:
2458*4882a593Smuzhiyun 	 *       TRUE - Event received from fw, and yet to process
2459*4882a593Smuzhiyun 	 *       FALSE - No events to process
2460*4882a593Smuzhiyun 	 */
2461*4882a593Smuzhiyun 	t_u8 event_received;
2462*4882a593Smuzhiyun 
2463*4882a593Smuzhiyun 	/** Data received:
2464*4882a593Smuzhiyun 	 *       TRUE - Data received from fw
2465*4882a593Smuzhiyun 	 *       FALSE - No Data received
2466*4882a593Smuzhiyun 	 */
2467*4882a593Smuzhiyun 	t_u8 data_received;
2468*4882a593Smuzhiyun 
2469*4882a593Smuzhiyun 	/** Command-related variables */
2470*4882a593Smuzhiyun 	/** Command sequence number */
2471*4882a593Smuzhiyun 	t_u16 seq_num;
2472*4882a593Smuzhiyun 	/** Command controller nodes */
2473*4882a593Smuzhiyun 	cmd_ctrl_node *cmd_pool;
2474*4882a593Smuzhiyun 	/** Current Command */
2475*4882a593Smuzhiyun 	cmd_ctrl_node *curr_cmd;
2476*4882a593Smuzhiyun 	/** mlan_lock for command */
2477*4882a593Smuzhiyun 	t_void *pmlan_cmd_lock;
2478*4882a593Smuzhiyun 	/** Number of command timeouts */
2479*4882a593Smuzhiyun 	t_u32 num_cmd_timeout;
2480*4882a593Smuzhiyun 	/** Last init fw command id */
2481*4882a593Smuzhiyun 	t_u16 last_init_cmd;
2482*4882a593Smuzhiyun 	/** Command timer */
2483*4882a593Smuzhiyun 	t_void *pmlan_cmd_timer;
2484*4882a593Smuzhiyun 	/** Command timer set flag */
2485*4882a593Smuzhiyun 	t_u8 cmd_timer_is_set;
2486*4882a593Smuzhiyun 	/** time stamp for command dnld */
2487*4882a593Smuzhiyun 	t_u32 dnld_cmd_in_secs;
2488*4882a593Smuzhiyun 
2489*4882a593Smuzhiyun 	/** Command Queues */
2490*4882a593Smuzhiyun 	/** Free command buffers */
2491*4882a593Smuzhiyun 	mlan_list_head cmd_free_q;
2492*4882a593Smuzhiyun 	/** Pending command buffers */
2493*4882a593Smuzhiyun 	mlan_list_head cmd_pending_q;
2494*4882a593Smuzhiyun 	/** Command queue for scanning */
2495*4882a593Smuzhiyun 	mlan_list_head scan_pending_q;
2496*4882a593Smuzhiyun 	/** Command pending queue while scanning */
2497*4882a593Smuzhiyun 	mlan_list_head ext_cmd_pending_q;
2498*4882a593Smuzhiyun 	/** ioctl pending queue */
2499*4882a593Smuzhiyun 	mlan_list_head ioctl_pending_q;
2500*4882a593Smuzhiyun 	/** pending_ioctl flag */
2501*4882a593Smuzhiyun 	t_u8 pending_ioctl;
2502*4882a593Smuzhiyun 	pmlan_private pending_disconnect_priv;
2503*4882a593Smuzhiyun 	/** mlan_processing */
2504*4882a593Smuzhiyun 	t_u32 scan_processing;
2505*4882a593Smuzhiyun 	/** scan state */
2506*4882a593Smuzhiyun 	t_u32 scan_state;
2507*4882a593Smuzhiyun 	/** firmware support for roaming*/
2508*4882a593Smuzhiyun 	t_u8 fw_roaming;
2509*4882a593Smuzhiyun 	/** User set passphrase*/
2510*4882a593Smuzhiyun 	t_u8 userset_passphrase;
2511*4882a593Smuzhiyun 	/** ext_scan enh support flag */
2512*4882a593Smuzhiyun 	t_u8 ext_scan_enh;
2513*4882a593Smuzhiyun 	/** scan type: 0 legacy, 1: enhance scan*/
2514*4882a593Smuzhiyun 	t_u8 ext_scan_type;
2515*4882a593Smuzhiyun 	/** ext scan timeout */
2516*4882a593Smuzhiyun 	t_u8 ext_scan_timeout;
2517*4882a593Smuzhiyun 	/** coex scan flag */
2518*4882a593Smuzhiyun 	t_u8 coex_scan;
2519*4882a593Smuzhiyun 	/** coex min scan time */
2520*4882a593Smuzhiyun 	t_u8 coex_min_scan_time;
2521*4882a593Smuzhiyun 	/** coex max scan time */
2522*4882a593Smuzhiyun 	t_u8 coex_max_scan_time;
2523*4882a593Smuzhiyun 	/** coex win size flag */
2524*4882a593Smuzhiyun 	t_u8 coex_win_size;
2525*4882a593Smuzhiyun 	/** coex amdpdu tx win size */
2526*4882a593Smuzhiyun 	t_u8 coex_tx_win_size;
2527*4882a593Smuzhiyun 	/** coex ampdu rx win size */
2528*4882a593Smuzhiyun 	t_u8 coex_rx_win_size;
2529*4882a593Smuzhiyun 	/** Region code */
2530*4882a593Smuzhiyun 	t_u16 region_code;
2531*4882a593Smuzhiyun 	/** Region Channel data */
2532*4882a593Smuzhiyun 	region_chan_t region_channel[MAX_REGION_CHANNEL_NUM];
2533*4882a593Smuzhiyun 	/** CFP table code for 2.4GHz */
2534*4882a593Smuzhiyun 	t_u8 cfp_code_bg;
2535*4882a593Smuzhiyun 	/** CFP table code for 5GHz */
2536*4882a593Smuzhiyun 	t_u8 cfp_code_a;
2537*4882a593Smuzhiyun 	wmm_ac_parameters_t ac_params[MAX_AC_QUEUES];
2538*4882a593Smuzhiyun 	/** Minimum BA Threshold */
2539*4882a593Smuzhiyun 	t_u8 min_ba_threshold;
2540*4882a593Smuzhiyun #ifdef STA_SUPPORT
2541*4882a593Smuzhiyun 	/** Universal Channel data */
2542*4882a593Smuzhiyun 	region_chan_t universal_channel[MAX_REGION_CHANNEL_NUM];
2543*4882a593Smuzhiyun 	/** Parsed region channel */
2544*4882a593Smuzhiyun 	parsed_region_chan_11d_t parsed_region_chan;
2545*4882a593Smuzhiyun #endif /* STA_SUPPORT */
2546*4882a593Smuzhiyun 	/** 11D and Domain Regulatory Data */
2547*4882a593Smuzhiyun 	wlan_802_11d_domain_reg_t domain_reg;
2548*4882a593Smuzhiyun 	/** Country Code */
2549*4882a593Smuzhiyun 	t_u8 country_code[COUNTRY_CODE_LEN];
2550*4882a593Smuzhiyun 	/** FSM variable for 11h support */
2551*4882a593Smuzhiyun 	wlan_11h_device_state_t state_11h;
2552*4882a593Smuzhiyun 	/** FSM variable for DFS support */
2553*4882a593Smuzhiyun 	wlan_dfs_device_state_t state_dfs;
2554*4882a593Smuzhiyun 	/** FSM variable for RDH support */
2555*4882a593Smuzhiyun 	wlan_radar_det_hndlg_state_t state_rdh;
2556*4882a593Smuzhiyun 	/** variable to configure dfs channel switch count */
2557*4882a593Smuzhiyun 	t_s8 dfs_cs_count;
2558*4882a593Smuzhiyun 	/** User configured settings for DFS testing */
2559*4882a593Smuzhiyun 	wlan_dfs_testing_settings_t dfs_test_params;
2560*4882a593Smuzhiyun 	/**  dfs w53 cfg */
2561*4882a593Smuzhiyun 	t_u8 dfs53cfg;
2562*4882a593Smuzhiyun 	/**  dfs_mode */
2563*4882a593Smuzhiyun 	t_u8 dfs_mode;
2564*4882a593Smuzhiyun 	/** FSM variable for MEAS support */
2565*4882a593Smuzhiyun 	wlan_meas_state_t state_meas;
2566*4882a593Smuzhiyun 	/** Scan table */
2567*4882a593Smuzhiyun 	BSSDescriptor_t *pscan_table;
2568*4882a593Smuzhiyun 	/** scan age in secs */
2569*4882a593Smuzhiyun 	t_u32 age_in_secs;
2570*4882a593Smuzhiyun 	/** Active scan for hidden ssid triggered */
2571*4882a593Smuzhiyun 	t_u8 active_scan_triggered;
2572*4882a593Smuzhiyun 	/** channel statstics */
2573*4882a593Smuzhiyun 	ChanStatistics_t *pchan_stats;
2574*4882a593Smuzhiyun 	/** Number of records in the chan_stats */
2575*4882a593Smuzhiyun 	t_u32 num_in_chan_stats;
2576*4882a593Smuzhiyun 	/** index of chan stats */
2577*4882a593Smuzhiyun 	t_u32 idx_chan_stats;
2578*4882a593Smuzhiyun 	t_u8 bgscan_reported;
2579*4882a593Smuzhiyun 
2580*4882a593Smuzhiyun 	/** Number of records in the scan table */
2581*4882a593Smuzhiyun 	t_u32 num_in_scan_table;
2582*4882a593Smuzhiyun 	/** Scan probes */
2583*4882a593Smuzhiyun 	t_u16 scan_probes;
2584*4882a593Smuzhiyun 
2585*4882a593Smuzhiyun 	/** Scan type */
2586*4882a593Smuzhiyun 	t_u8 scan_type;
2587*4882a593Smuzhiyun 	/** Scan mode */
2588*4882a593Smuzhiyun 	t_u32 scan_mode;
2589*4882a593Smuzhiyun 	/** Specific scan time */
2590*4882a593Smuzhiyun 	t_u16 specific_scan_time;
2591*4882a593Smuzhiyun 	/** Active scan time */
2592*4882a593Smuzhiyun 	t_u16 active_scan_time;
2593*4882a593Smuzhiyun 	/** Passive scan time */
2594*4882a593Smuzhiyun 	t_u16 passive_scan_time;
2595*4882a593Smuzhiyun 	/** Passive scan to active scan */
2596*4882a593Smuzhiyun 	t_u8 passive_to_active_scan;
2597*4882a593Smuzhiyun 	/** scan channel gap time */
2598*4882a593Smuzhiyun 	t_u16 scan_chan_gap;
2599*4882a593Smuzhiyun 	/** Scan block flag */
2600*4882a593Smuzhiyun 	t_u8 scan_block;
2601*4882a593Smuzhiyun 	/** Extended scan or legacy scan */
2602*4882a593Smuzhiyun 	t_u8 ext_scan;
2603*4882a593Smuzhiyun 	t_u32 bcn_buf_size;
2604*4882a593Smuzhiyun 	/** Beacon buffer */
2605*4882a593Smuzhiyun 	t_u8 *bcn_buf;
2606*4882a593Smuzhiyun 	/** Pointer to valid beacon buffer end */
2607*4882a593Smuzhiyun 	t_u8 *pbcn_buf_end;
2608*4882a593Smuzhiyun 	/** allocate fixed scan beacon buffer size*/
2609*4882a593Smuzhiyun 	t_u32 fixed_beacon_buffer;
2610*4882a593Smuzhiyun 
2611*4882a593Smuzhiyun 	/** F/W supported bands */
2612*4882a593Smuzhiyun 	t_u16 fw_bands;
2613*4882a593Smuzhiyun 	/** User selected band to start adhoc network */
2614*4882a593Smuzhiyun 	t_u16 adhoc_start_band;
2615*4882a593Smuzhiyun 	/** User selected bands */
2616*4882a593Smuzhiyun 	t_u16 config_bands;
2617*4882a593Smuzhiyun 	/** Pointer to channel list last sent to the firmware for scanning */
2618*4882a593Smuzhiyun 	ChanScanParamSet_t *pscan_channels;
2619*4882a593Smuzhiyun 
2620*4882a593Smuzhiyun 	/** Tx lock flag */
2621*4882a593Smuzhiyun 	t_u8 tx_lock_flag;
2622*4882a593Smuzhiyun 	/** Rx lock flag */
2623*4882a593Smuzhiyun 	t_u8 rx_lock_flag;
2624*4882a593Smuzhiyun 	/** main lock flag */
2625*4882a593Smuzhiyun 	t_u8 main_lock_flag;
2626*4882a593Smuzhiyun #ifdef USB
2627*4882a593Smuzhiyun 	/** Tx CMD endpoint address */
2628*4882a593Smuzhiyun 	t_u8 tx_cmd_ep;
2629*4882a593Smuzhiyun 	/** Rx CMD/EVT endpoint address */
2630*4882a593Smuzhiyun 	t_u8 rx_cmd_ep;
2631*4882a593Smuzhiyun 	/** Rx data endpoint address */
2632*4882a593Smuzhiyun 	t_u8 rx_data_ep;
2633*4882a593Smuzhiyun 	/** Tx data endpoint address */
2634*4882a593Smuzhiyun 	t_u8 tx_data_ep;
2635*4882a593Smuzhiyun #endif
2636*4882a593Smuzhiyun 
2637*4882a593Smuzhiyun 	/** sleep_params_t */
2638*4882a593Smuzhiyun 	sleep_params_t sleep_params;
2639*4882a593Smuzhiyun 	/** sleep_period_t (Enhanced Power Save) */
2640*4882a593Smuzhiyun 	sleep_period_t sleep_period;
2641*4882a593Smuzhiyun 	/** saved sleep_period_t (Enhanced Power Save) */
2642*4882a593Smuzhiyun 	sleep_period_t saved_sleep_period;
2643*4882a593Smuzhiyun 
2644*4882a593Smuzhiyun 	/** Power Save mode */
2645*4882a593Smuzhiyun 	/**
2646*4882a593Smuzhiyun 	 * Wlan802_11PowerModeCAM = disable
2647*4882a593Smuzhiyun 	 * Wlan802_11PowerModePSP = enable
2648*4882a593Smuzhiyun 	 */
2649*4882a593Smuzhiyun 	t_u16 ps_mode;
2650*4882a593Smuzhiyun 	/** Power Save state */
2651*4882a593Smuzhiyun 	t_u32 ps_state;
2652*4882a593Smuzhiyun 	/** Need to wakeup flag */
2653*4882a593Smuzhiyun 	t_u8 need_to_wakeup;
2654*4882a593Smuzhiyun 	/** keep_wakeup */
2655*4882a593Smuzhiyun 	t_u8 keep_wakeup;
2656*4882a593Smuzhiyun 
2657*4882a593Smuzhiyun 	/** Multiple DTIM */
2658*4882a593Smuzhiyun 	t_u16 multiple_dtim;
2659*4882a593Smuzhiyun 	/** Local listen interval */
2660*4882a593Smuzhiyun 	t_u16 local_listen_interval;
2661*4882a593Smuzhiyun 	/** Null packet interval */
2662*4882a593Smuzhiyun 	t_u16 null_pkt_interval;
2663*4882a593Smuzhiyun 
2664*4882a593Smuzhiyun 	/** IEEE ps inactivity timout value */
2665*4882a593Smuzhiyun 	t_u16 inact_tmo;
2666*4882a593Smuzhiyun 	/** Power save confirm sleep command buffer */
2667*4882a593Smuzhiyun 	pmlan_buffer psleep_cfm;
2668*4882a593Smuzhiyun 	/** Beacon miss timeout */
2669*4882a593Smuzhiyun 	t_u16 bcn_miss_time_out;
2670*4882a593Smuzhiyun 
2671*4882a593Smuzhiyun 	/** Deep Sleep flag */
2672*4882a593Smuzhiyun 	t_u8 is_deep_sleep;
2673*4882a593Smuzhiyun 	/** Idle time */
2674*4882a593Smuzhiyun 	t_u16 idle_time;
2675*4882a593Smuzhiyun 	/** Auto Deep Sleep enabled at init time */
2676*4882a593Smuzhiyun 	t_u8 init_auto_ds;
2677*4882a593Smuzhiyun 
2678*4882a593Smuzhiyun 	/** delay null pkt flag */
2679*4882a593Smuzhiyun 	t_u8 delay_null_pkt;
2680*4882a593Smuzhiyun 	/** Delay to PS in milliseconds */
2681*4882a593Smuzhiyun 	t_u16 delay_to_ps;
2682*4882a593Smuzhiyun 	/** Enhanced PS mode */
2683*4882a593Smuzhiyun 	t_u16 enhanced_ps_mode;
2684*4882a593Smuzhiyun 	/** Device wakeup required flag */
2685*4882a593Smuzhiyun 	t_u8 pm_wakeup_card_req;
2686*4882a593Smuzhiyun 
2687*4882a593Smuzhiyun 	/** Gen NULL pkg */
2688*4882a593Smuzhiyun 	t_u16 gen_null_pkt;
2689*4882a593Smuzhiyun 
2690*4882a593Smuzhiyun 	/** PPS/UAPSD mode flag */
2691*4882a593Smuzhiyun 	t_u16 pps_uapsd_mode;
2692*4882a593Smuzhiyun 	/** Number of wakeup tries */
2693*4882a593Smuzhiyun 	t_u32 pm_wakeup_fw_try;
2694*4882a593Smuzhiyun 	/** time stamp when host try to wake up firmware */
2695*4882a593Smuzhiyun 	t_u32 pm_wakeup_in_secs;
2696*4882a593Smuzhiyun 	/** Card wakeup timer */
2697*4882a593Smuzhiyun 	t_void *pwakeup_fw_timer;
2698*4882a593Smuzhiyun 	/** Card wakeup timer */
2699*4882a593Smuzhiyun 	t_u8 wakeup_fw_timer_is_set;
2700*4882a593Smuzhiyun 	/** Number of wake up timeouts */
2701*4882a593Smuzhiyun 	t_u32 pm_wakeup_timeout;
2702*4882a593Smuzhiyun 
2703*4882a593Smuzhiyun 	/** Host Sleep configured flag */
2704*4882a593Smuzhiyun 	t_u8 is_hs_configured;
2705*4882a593Smuzhiyun 	/** Host Sleep configuration */
2706*4882a593Smuzhiyun 	hs_config_param hs_cfg;
2707*4882a593Smuzhiyun 	/** Host Sleep activated flag */
2708*4882a593Smuzhiyun 	t_u8 hs_activated;
2709*4882a593Smuzhiyun 	/** mef_flt_cfg_mef configuration */
2710*4882a593Smuzhiyun 	mef_entry entry_cfg;
2711*4882a593Smuzhiyun 	/** Event body */
2712*4882a593Smuzhiyun 	t_u8 event_body[MAX_EVENT_SIZE];
2713*4882a593Smuzhiyun 	/** 802.11n device capabilities */
2714*4882a593Smuzhiyun 	t_u32 hw_dot_11n_dev_cap;
2715*4882a593Smuzhiyun 	/** Device support for MIMO abstraction of MCSs */
2716*4882a593Smuzhiyun 	t_u8 hw_dev_mcs_support;
2717*4882a593Smuzhiyun #ifdef STA_SUPPORT
2718*4882a593Smuzhiyun 	/** Adhoc Secondary Channel Bandwidth */
2719*4882a593Smuzhiyun 	t_u8 chan_bandwidth;
2720*4882a593Smuzhiyun #endif /* STA_SUPPORT */
2721*4882a593Smuzhiyun 
2722*4882a593Smuzhiyun 	/** 802.11ac device capabilities */
2723*4882a593Smuzhiyun 	t_u32 hw_dot_11ac_dev_cap;
2724*4882a593Smuzhiyun 	/** 802.11ac device support for MIMO abstraction of MCSs */
2725*4882a593Smuzhiyun 	t_u32 hw_dot_11ac_mcs_support;
2726*4882a593Smuzhiyun 	/** length of hw he capability */
2727*4882a593Smuzhiyun 	t_u8 hw_hecap_len;
2728*4882a593Smuzhiyun 	/** 802.11ax HE capability */
2729*4882a593Smuzhiyun 	t_u8 hw_he_cap[54];
2730*4882a593Smuzhiyun 	/** length of hw 2.4G he capability */
2731*4882a593Smuzhiyun 	t_u8 hw_2g_hecap_len;
2732*4882a593Smuzhiyun 	/** 802.11ax 2.4G HE capability */
2733*4882a593Smuzhiyun 	t_u8 hw_2g_he_cap[54];
2734*4882a593Smuzhiyun 	/** max mgmt IE index in device */
2735*4882a593Smuzhiyun 	t_u16 max_mgmt_ie_index;
2736*4882a593Smuzhiyun 	/** Head of Rx data queue */
2737*4882a593Smuzhiyun 	mlan_list_head rx_data_queue;
2738*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
2739*4882a593Smuzhiyun 	t_u32 mfg_mode;
2740*4882a593Smuzhiyun #endif
2741*4882a593Smuzhiyun 	/** Debug */
2742*4882a593Smuzhiyun 	wlan_dbg dbg;
2743*4882a593Smuzhiyun 
2744*4882a593Smuzhiyun 	/** RX pending for forwarding packets */
2745*4882a593Smuzhiyun 	mlan_scalar pending_bridge_pkts;
2746*4882a593Smuzhiyun 
2747*4882a593Smuzhiyun #ifdef STA_SUPPORT
2748*4882a593Smuzhiyun 	/** ARP filter buffer */
2749*4882a593Smuzhiyun 	t_u8 arp_filter[ARP_FILTER_MAX_BUF_SIZE];
2750*4882a593Smuzhiyun 	/** ARP filter buffer size */
2751*4882a593Smuzhiyun 	t_u32 arp_filter_size;
2752*4882a593Smuzhiyun #endif /* STA_SUPPORT */
2753*4882a593Smuzhiyun 	/** Minimum delay between HsActive and HostWake (in msec) */
2754*4882a593Smuzhiyun 	t_u16 min_wake_holdoff;
2755*4882a593Smuzhiyun 	/** Host sleep wake interval(in msec) */
2756*4882a593Smuzhiyun 	t_u32 hs_wake_interval;
2757*4882a593Smuzhiyun 	/** Host sleep inactivity timeout (in msec) */
2758*4882a593Smuzhiyun 	t_u32 hs_inactivity_timeout;
2759*4882a593Smuzhiyun 	/** Parameter type for indication gpio*/
2760*4882a593Smuzhiyun 	t_u8 param_type_ind;
2761*4882a593Smuzhiyun 	/** GPIO pin for indication wakeup source */
2762*4882a593Smuzhiyun 	t_u32 ind_gpio;
2763*4882a593Smuzhiyun 	/** Level on ind_gpio pin for indication normal wakeup source */
2764*4882a593Smuzhiyun 	t_u32 level;
2765*4882a593Smuzhiyun 	/** Parameter type for extend hscfg*/
2766*4882a593Smuzhiyun 	t_u8 param_type_ext;
2767*4882a593Smuzhiyun 	/** Events that will be forced ignore */
2768*4882a593Smuzhiyun 	t_u32 event_force_ignore;
2769*4882a593Smuzhiyun 	/** Events that will use extend gap to inform host*/
2770*4882a593Smuzhiyun 	t_u32 event_use_ext_gap;
2771*4882a593Smuzhiyun 	/** Extend gap*/
2772*4882a593Smuzhiyun 	t_u8 ext_gap;
2773*4882a593Smuzhiyun 	/** GPIO wave level for extend hscfg */
2774*4882a593Smuzhiyun 	t_u8 gpio_wave;
2775*4882a593Smuzhiyun 	/** Dynamic MIMO-SISO switch for hscfg*/
2776*4882a593Smuzhiyun 	t_u8 hs_mimo_switch;
2777*4882a593Smuzhiyun 	/** management frame wakeup filter config */
2778*4882a593Smuzhiyun 	mlan_mgmt_frame_wakeup mgmt_filter[MAX_MGMT_FRAME_FILTER];
2779*4882a593Smuzhiyun 	/** Bypass TX queue pkt count  */
2780*4882a593Smuzhiyun 	t_u32 bypass_pkt_count;
2781*4882a593Smuzhiyun #ifdef STA_SUPPORT
2782*4882a593Smuzhiyun 	/** warm-reset IOCTL request buffer pointer */
2783*4882a593Smuzhiyun 	pmlan_ioctl_req pwarm_reset_ioctl_req;
2784*4882a593Smuzhiyun #endif
2785*4882a593Smuzhiyun 	/** SCAN IOCTL request buffer pointer */
2786*4882a593Smuzhiyun 	pmlan_ioctl_req pscan_ioctl_req;
2787*4882a593Smuzhiyun 	/** DPD data pointer */
2788*4882a593Smuzhiyun 	t_u8 *pdpd_data;
2789*4882a593Smuzhiyun 	/** DPD data length  */
2790*4882a593Smuzhiyun 	t_u32 dpd_data_len;
2791*4882a593Smuzhiyun 	/** region txpowerlimit cfg data buf pointer */
2792*4882a593Smuzhiyun 	t_u8 *ptxpwr_data;
2793*4882a593Smuzhiyun 	/** region txpowerlimit cfg data len */
2794*4882a593Smuzhiyun 	t_u32 txpwr_data_len;
2795*4882a593Smuzhiyun 	/** Cal data pointer */
2796*4882a593Smuzhiyun 	t_u8 *pcal_data;
2797*4882a593Smuzhiyun 	/** Cal data length  */
2798*4882a593Smuzhiyun 	t_u32 cal_data_len;
2799*4882a593Smuzhiyun 	/** tdls status */
2800*4882a593Smuzhiyun 	/* TDLS_NOT_SETUP|TDLS_SWITCHING_CHANNEL|TDLS_IN_BASE_CHANNEL|TDLS_IN_SWITCH_CHANNEL*/
2801*4882a593Smuzhiyun 	tdlsStatus_e tdls_status;
2802*4882a593Smuzhiyun 	/** NetMon enabled */
2803*4882a593Smuzhiyun 	t_u32 enable_net_mon;
2804*4882a593Smuzhiyun 	/** Feature control bitmask */
2805*4882a593Smuzhiyun 	t_u32 feature_control;
2806*4882a593Smuzhiyun 
2807*4882a593Smuzhiyun 	/** Control coex RX window size configuration */
2808*4882a593Smuzhiyun 	t_u8 coex_rx_winsize;
2809*4882a593Smuzhiyun 	t_bool dfs_repeater;
2810*4882a593Smuzhiyun 	t_u32 dfsr_channel;
2811*4882a593Smuzhiyun 	t_u8 chanrpt_param_bandcfg;
2812*4882a593Smuzhiyun #if defined(PCIE)
2813*4882a593Smuzhiyun 	mlan_buffer *ssu_buf;
2814*4882a593Smuzhiyun #endif
2815*4882a593Smuzhiyun 	t_u8 csi_enabled;
2816*4882a593Smuzhiyun 	/** maximum sta connection */
2817*4882a593Smuzhiyun 	t_u8 max_sta_conn;
2818*4882a593Smuzhiyun 	otp_region_info_t *otp_region;
2819*4882a593Smuzhiyun 	chan_freq_power_t *cfp_otp_bg;
2820*4882a593Smuzhiyun 	t_u8 *tx_power_table_bg;
2821*4882a593Smuzhiyun 	t_u32 tx_power_table_bg_size;
2822*4882a593Smuzhiyun 	t_u8 tx_power_table_bg_rows;
2823*4882a593Smuzhiyun 	t_u8 tx_power_table_bg_cols;
2824*4882a593Smuzhiyun 	chan_freq_power_t *cfp_otp_a;
2825*4882a593Smuzhiyun 	t_u8 *tx_power_table_a;
2826*4882a593Smuzhiyun 	t_u32 tx_power_table_a_size;
2827*4882a593Smuzhiyun 	t_u8 tx_power_table_a_rows;
2828*4882a593Smuzhiyun 	t_u8 tx_power_table_a_cols;
2829*4882a593Smuzhiyun 	/**mlan adapter operations*/
2830*4882a593Smuzhiyun 	mlan_adapter_operations ops;
2831*4882a593Smuzhiyun #ifdef DRV_EMBEDDED_AUTHENTICATOR
2832*4882a593Smuzhiyun 	/** authenticator_priv */
2833*4882a593Smuzhiyun 	pmlan_private authenticator_priv;
2834*4882a593Smuzhiyun #endif
2835*4882a593Smuzhiyun 	/** TP accounting mode 1-enable 0-disable */
2836*4882a593Smuzhiyun 	t_u32 tp_state_on;
2837*4882a593Smuzhiyun 	/** Packet drop point */
2838*4882a593Smuzhiyun 	t_u32 tp_state_drop_point;
2839*4882a593Smuzhiyun 	/* lower 8 bytes of uuid */
2840*4882a593Smuzhiyun 	t_u64 uuid_lo;
2841*4882a593Smuzhiyun 
2842*4882a593Smuzhiyun 	/* higher 8 bytes of uuid */
2843*4882a593Smuzhiyun 	t_u64 uuid_hi;
2844*4882a593Smuzhiyun };
2845*4882a593Smuzhiyun 
2846*4882a593Smuzhiyun /** Check if stream 2X2 enabled */
2847*4882a593Smuzhiyun #define IS_STREAM_2X2(x) ((x)&FEATURE_CTRL_STREAM_2X2)
2848*4882a593Smuzhiyun /** Check if DFS support enabled */
2849*4882a593Smuzhiyun #define IS_DFS_SUPPORT(x) ((x)&FEATURE_CTRL_DFS_SUPPORT)
2850*4882a593Smuzhiyun #ifdef USB
2851*4882a593Smuzhiyun /** Check if winner check & not wait for FW ready event */
2852*4882a593Smuzhiyun #define IS_USB_NEW_INIT(x) ((x)&FEATURE_CTRL_USB_NEW_INIT)
2853*4882a593Smuzhiyun #endif
2854*4882a593Smuzhiyun 
2855*4882a593Smuzhiyun /** Ethernet packet type for EAPOL */
2856*4882a593Smuzhiyun #define MLAN_ETHER_PKT_TYPE_EAPOL (0x888E)
2857*4882a593Smuzhiyun #define MLAN_ETHER_PKT_TYPE_ARP (0x0806)
2858*4882a593Smuzhiyun /** Ethernet packet type for WAPI */
2859*4882a593Smuzhiyun #define MLAN_ETHER_PKT_TYPE_WAPI (0x88B4)
2860*4882a593Smuzhiyun /** Ethernet packet type offset */
2861*4882a593Smuzhiyun #define MLAN_ETHER_PKT_TYPE_OFFSET (12)
2862*4882a593Smuzhiyun 
2863*4882a593Smuzhiyun mlan_status wlan_cmd_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
2864*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf);
2865*4882a593Smuzhiyun 
2866*4882a593Smuzhiyun mlan_status wlan_ret_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
2867*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
2868*4882a593Smuzhiyun 
2869*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
2870*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
2871*4882a593Smuzhiyun 
2872*4882a593Smuzhiyun void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd,
2873*4882a593Smuzhiyun 				   radiotap_info *prt_info);
2874*4882a593Smuzhiyun 
2875*4882a593Smuzhiyun mlan_status wlan_init_lock_list(pmlan_adapter pmadapter);
2876*4882a593Smuzhiyun mlan_status wlan_init_priv_lock_list(pmlan_adapter pmadapter, t_u8 start_index);
2877*4882a593Smuzhiyun t_void wlan_free_lock_list(pmlan_adapter pmadapter);
2878*4882a593Smuzhiyun mlan_status wlan_init_timer(pmlan_adapter pmadapter);
2879*4882a593Smuzhiyun t_void wlan_free_timer(pmlan_adapter pmadapter);
2880*4882a593Smuzhiyun 
2881*4882a593Smuzhiyun /* Function prototype */
2882*4882a593Smuzhiyun /** Initialize firmware */
2883*4882a593Smuzhiyun mlan_status wlan_init_fw(pmlan_adapter pmadapter);
2884*4882a593Smuzhiyun 
2885*4882a593Smuzhiyun /** get hw spec complete */
2886*4882a593Smuzhiyun mlan_status wlan_get_hw_spec_complete(pmlan_adapter pmadapter);
2887*4882a593Smuzhiyun 
2888*4882a593Smuzhiyun /** Initialize firmware complete */
2889*4882a593Smuzhiyun mlan_status wlan_init_fw_complete(pmlan_adapter pmadapter);
2890*4882a593Smuzhiyun 
2891*4882a593Smuzhiyun /** Shutdown firmware complete */
2892*4882a593Smuzhiyun mlan_status wlan_shutdown_fw_complete(pmlan_adapter pmadapter);
2893*4882a593Smuzhiyun 
2894*4882a593Smuzhiyun /** Receive event */
2895*4882a593Smuzhiyun mlan_status wlan_recv_event(pmlan_private priv, mlan_event_id event_id,
2896*4882a593Smuzhiyun 			    t_void *pmevent);
2897*4882a593Smuzhiyun 
2898*4882a593Smuzhiyun /** Initialize mlan_adapter structure */
2899*4882a593Smuzhiyun t_void wlan_init_adapter(pmlan_adapter pmadapter);
2900*4882a593Smuzhiyun 
2901*4882a593Smuzhiyun /** Initialize mlan_private structure */
2902*4882a593Smuzhiyun mlan_status wlan_init_priv(pmlan_private priv);
2903*4882a593Smuzhiyun #ifdef USB
2904*4882a593Smuzhiyun /** get pcie device from card type */
2905*4882a593Smuzhiyun mlan_status wlan_get_usb_device(pmlan_adapter pmadapter);
2906*4882a593Smuzhiyun #endif
2907*4882a593Smuzhiyun mlan_status wlan_download_vdll_block(mlan_adapter *pmadapter, t_u8 *block,
2908*4882a593Smuzhiyun 				     t_u16 block_len);
2909*4882a593Smuzhiyun mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent);
2910*4882a593Smuzhiyun /** Process event */
2911*4882a593Smuzhiyun mlan_status wlan_process_event(pmlan_adapter pmadapter);
2912*4882a593Smuzhiyun 
2913*4882a593Smuzhiyun /** Prepare command */
2914*4882a593Smuzhiyun mlan_status wlan_prepare_cmd(pmlan_private priv, t_u16 cmd_no, t_u16 cmd_action,
2915*4882a593Smuzhiyun 			     t_u32 cmd_oid, t_void *pioctl_buf,
2916*4882a593Smuzhiyun 			     t_void *pdata_buf);
2917*4882a593Smuzhiyun 
2918*4882a593Smuzhiyun /** cmd timeout handler */
2919*4882a593Smuzhiyun t_void wlan_cmd_timeout_func(t_void *function_context);
2920*4882a593Smuzhiyun 
2921*4882a593Smuzhiyun /**
2922*4882a593Smuzhiyun  *  @brief check if Tx pending
2923*4882a593Smuzhiyun  *
2924*4882a593Smuzhiyun  *  @param pmadapter	Pointer to mlan_adapter
2925*4882a593Smuzhiyun  *  @return  MTRUE/MFALSE;
2926*4882a593Smuzhiyun  */
2927*4882a593Smuzhiyun static inline t_u8 wlan_is_tx_pending(mlan_adapter *pmadapter)
2928*4882a593Smuzhiyun {
2929*4882a593Smuzhiyun #ifdef PCIE
2930*4882a593Smuzhiyun 	if (IS_PCIE(pmadapter->card_type) &&
2931*4882a593Smuzhiyun 	    pmadapter->pcard_pcie->txbd_pending)
2932*4882a593Smuzhiyun 		return MTRUE;
2933*4882a593Smuzhiyun #endif
2934*4882a593Smuzhiyun 	return MFALSE;
2935*4882a593Smuzhiyun }
2936*4882a593Smuzhiyun 
2937*4882a593Smuzhiyun /** process host cmd */
2938*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
2939*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_req);
2940*4882a593Smuzhiyun /** process init/shutdown cmd*/
2941*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_init_shutdown(pmlan_adapter pmadapter,
2942*4882a593Smuzhiyun 					  pmlan_ioctl_req pioctl_req);
2943*4882a593Smuzhiyun /** process debug info */
2944*4882a593Smuzhiyun mlan_status wlan_get_info_debug_info(pmlan_adapter pmadapter,
2945*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_req);
2946*4882a593Smuzhiyun 
2947*4882a593Smuzhiyun #if defined(STA_SUPPORT) || defined(UAP_SUPPORT)
2948*4882a593Smuzhiyun extern pmlan_operations mlan_ops[];
2949*4882a593Smuzhiyun /** Set/Get BSS role */
2950*4882a593Smuzhiyun mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
2951*4882a593Smuzhiyun 				    pmlan_ioctl_req pioctl_req);
2952*4882a593Smuzhiyun #endif
2953*4882a593Smuzhiyun 
2954*4882a593Smuzhiyun #if defined(PCIE)
2955*4882a593Smuzhiyun mlan_status wlan_misc_ssu(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
2956*4882a593Smuzhiyun #endif
2957*4882a593Smuzhiyun 
2958*4882a593Smuzhiyun mlan_status wlan_misc_csi(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
2959*4882a593Smuzhiyun mlan_status wlan_process_csi_event(pmlan_private pmpriv);
2960*4882a593Smuzhiyun 
2961*4882a593Smuzhiyun mlan_status wlan_misc_hal_phy_cfg(pmlan_adapter pmadapter,
2962*4882a593Smuzhiyun 				  pmlan_ioctl_req pioctl_req);
2963*4882a593Smuzhiyun 
2964*4882a593Smuzhiyun mlan_status wlan_set_ewpa_mode(mlan_private *priv, pmlan_ds_passphrase psec_pp);
2965*4882a593Smuzhiyun mlan_status wlan_find_bss(mlan_private *pmpriv, pmlan_ioctl_req pioctl_req);
2966*4882a593Smuzhiyun 
2967*4882a593Smuzhiyun /* block main process */
2968*4882a593Smuzhiyun void mlan_block_main_process(mlan_adapter *pmadapter, t_u8 block);
2969*4882a593Smuzhiyun /* block rx process */
2970*4882a593Smuzhiyun void mlan_block_rx_process(mlan_adapter *pmadapter, t_u8 block);
2971*4882a593Smuzhiyun /** check pending command */
2972*4882a593Smuzhiyun int wlan_check_pending_cmd(mlan_adapter *pmadapter);
2973*4882a593Smuzhiyun /** Allocate memory for adapter structure members */
2974*4882a593Smuzhiyun mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter);
2975*4882a593Smuzhiyun /** Free adapter */
2976*4882a593Smuzhiyun t_void wlan_free_adapter(pmlan_adapter pmadapter);
2977*4882a593Smuzhiyun /** Free priv */
2978*4882a593Smuzhiyun t_void wlan_free_priv(mlan_private *pmpriv);
2979*4882a593Smuzhiyun /** Allocate command buffer */
2980*4882a593Smuzhiyun mlan_status wlan_alloc_cmd_buffer(mlan_adapter *pmadapter);
2981*4882a593Smuzhiyun /** Free command buffer */
2982*4882a593Smuzhiyun mlan_status wlan_free_cmd_buffer(mlan_adapter *pmadapter);
2983*4882a593Smuzhiyun /** Request command lock */
2984*4882a593Smuzhiyun t_void wlan_request_cmd_lock(mlan_adapter *pmadapter);
2985*4882a593Smuzhiyun /** Release command lock */
2986*4882a593Smuzhiyun t_void wlan_release_cmd_lock(mlan_adapter *pmadapter);
2987*4882a593Smuzhiyun #ifdef STA_SUPPORT
2988*4882a593Smuzhiyun /** Flush the scan pending queue */
2989*4882a593Smuzhiyun t_void wlan_flush_scan_queue(pmlan_adapter pmadapter);
2990*4882a593Smuzhiyun t_void wlan_move_cmd_to_cmd_pending_q(pmlan_adapter pmadapter);
2991*4882a593Smuzhiyun mlan_status wlan_cancel_pending_scan_cmd(pmlan_adapter pmadapter,
2992*4882a593Smuzhiyun 					 pmlan_ioctl_req pioctl_req);
2993*4882a593Smuzhiyun #endif
2994*4882a593Smuzhiyun /**Cancel pending command */
2995*4882a593Smuzhiyun t_void wlan_cancel_all_pending_cmd(pmlan_adapter pmadapter, t_u8 flag);
2996*4882a593Smuzhiyun /**Cancel pending ioctl */
2997*4882a593Smuzhiyun t_void wlan_cancel_pending_ioctl(pmlan_adapter pmadapter,
2998*4882a593Smuzhiyun 				 pmlan_ioctl_req pioctl_req);
2999*4882a593Smuzhiyun /**Cancel bss pending ioctl */
3000*4882a593Smuzhiyun t_void wlan_cancel_bss_pending_cmd(pmlan_adapter pmadapter, t_u32 bss_index);
3001*4882a593Smuzhiyun 
3002*4882a593Smuzhiyun /** Insert command to free queue */
3003*4882a593Smuzhiyun t_void wlan_insert_cmd_to_free_q(mlan_adapter *pmadapter,
3004*4882a593Smuzhiyun 				 cmd_ctrl_node *pcmd_node);
3005*4882a593Smuzhiyun 
3006*4882a593Smuzhiyun /** Insert command to pending queue */
3007*4882a593Smuzhiyun t_void wlan_insert_cmd_to_pending_q(mlan_adapter *pmadapter,
3008*4882a593Smuzhiyun 				    cmd_ctrl_node *pcmd_node, t_u32 addtail);
3009*4882a593Smuzhiyun 
3010*4882a593Smuzhiyun /** Execute next command */
3011*4882a593Smuzhiyun mlan_status wlan_exec_next_cmd(mlan_adapter *pmadapter);
3012*4882a593Smuzhiyun /** Proecess command response */
3013*4882a593Smuzhiyun mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter);
3014*4882a593Smuzhiyun /** Handle received packet, has extra handling for aggregate packets */
3015*4882a593Smuzhiyun mlan_status wlan_handle_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf);
3016*4882a593Smuzhiyun /** Process transmission */
3017*4882a593Smuzhiyun mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
3018*4882a593Smuzhiyun 			    mlan_tx_param *tx_param);
3019*4882a593Smuzhiyun /** Transmit a null data packet */
3020*4882a593Smuzhiyun mlan_status wlan_send_null_packet(pmlan_private priv, t_u8 flags);
3021*4882a593Smuzhiyun 
3022*4882a593Smuzhiyun #ifdef SDIO
3023*4882a593Smuzhiyun mlan_status wlan_alloc_sdio_mpa_buffers(mlan_adapter *pmadapter,
3024*4882a593Smuzhiyun 					t_u32 mpa_tx_buf_size,
3025*4882a593Smuzhiyun 					t_u32 mpa_rx_buf_size);
3026*4882a593Smuzhiyun 
3027*4882a593Smuzhiyun mlan_status wlan_free_sdio_mpa_buffers(mlan_adapter *pmadapter);
3028*4882a593Smuzhiyun #endif
3029*4882a593Smuzhiyun 
3030*4882a593Smuzhiyun /** Process write data complete */
3031*4882a593Smuzhiyun mlan_status wlan_write_data_complete(pmlan_adapter pmlan_adapter,
3032*4882a593Smuzhiyun 				     pmlan_buffer pmbuf, mlan_status status);
3033*4882a593Smuzhiyun 
3034*4882a593Smuzhiyun #ifdef USB
3035*4882a593Smuzhiyun mlan_status wlan_usb_deaggr_rx_pkt(pmlan_adapter pmadapter, pmlan_buffer pmbuf);
3036*4882a593Smuzhiyun 
3037*4882a593Smuzhiyun /**
3038*4882a593Smuzhiyun  *  @brief  This function resets USB Tx Aggregation buffers
3039*4882a593Smuzhiyun  *
3040*4882a593Smuzhiyun  *  @param pmadapter	A pointer to mlan_adapter
3041*4882a593Smuzhiyun  *
3042*4882a593Smuzhiyun  *  @return 	N/A
3043*4882a593Smuzhiyun  */
3044*4882a593Smuzhiyun static INLINE t_void wlan_reset_usb_tx_aggr(pmlan_adapter pmadapter)
3045*4882a593Smuzhiyun {
3046*4882a593Smuzhiyun 	t_s32 i = 0;
3047*4882a593Smuzhiyun 	pmlan_callbacks pcb = &pmadapter->callbacks;
3048*4882a593Smuzhiyun 	ENTER();
3049*4882a593Smuzhiyun 	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
3050*4882a593Smuzhiyun 		pcb->moal_spin_lock(
3051*4882a593Smuzhiyun 			pmadapter->pmoal_handle,
3052*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].paggr_lock);
3053*4882a593Smuzhiyun 		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_hold_timer_is_set) {
3054*4882a593Smuzhiyun 			pcb->moal_stop_timer(pmadapter->pmoal_handle,
3055*4882a593Smuzhiyun 					     pmadapter->pcard_usb
3056*4882a593Smuzhiyun 						     ->usb_tx_aggr[i]
3057*4882a593Smuzhiyun 						     .paggr_hold_timer);
3058*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i]
3059*4882a593Smuzhiyun 				.aggr_hold_timer_is_set = MFALSE;
3060*4882a593Smuzhiyun 		}
3061*4882a593Smuzhiyun 		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable &&
3062*4882a593Smuzhiyun 		    pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr != MNULL) {
3063*4882a593Smuzhiyun 			wlan_write_data_complete(
3064*4882a593Smuzhiyun 				pmadapter,
3065*4882a593Smuzhiyun 				pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr,
3066*4882a593Smuzhiyun 				MLAN_STATUS_FAILURE); /* did not get sent */
3067*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].pmbuf_aggr = MNULL;
3068*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].aggr_len = 0;
3069*4882a593Smuzhiyun 		}
3070*4882a593Smuzhiyun 		pcb->moal_spin_unlock(
3071*4882a593Smuzhiyun 			pmadapter->pmoal_handle,
3072*4882a593Smuzhiyun 			pmadapter->pcard_usb->usb_tx_aggr[i].paggr_lock);
3073*4882a593Smuzhiyun 	}
3074*4882a593Smuzhiyun 	LEAVE();
3075*4882a593Smuzhiyun }
3076*4882a593Smuzhiyun 
3077*4882a593Smuzhiyun /**
3078*4882a593Smuzhiyun  *  @brief  This function get usb_tx_aggr_params
3079*4882a593Smuzhiyun  *
3080*4882a593Smuzhiyun  *  @param pmadapter	A pointer to mlan_adapter
3081*4882a593Smuzhiyun  *  @param port		    port for TX
3082*4882a593Smuzhiyun  *
3083*4882a593Smuzhiyun  *  @return	            A pointer to usb_tx_aggr_params
3084*4882a593Smuzhiyun  */
3085*4882a593Smuzhiyun static INLINE usb_tx_aggr_params *
3086*4882a593Smuzhiyun wlan_get_usb_tx_aggr_params(pmlan_adapter pmadapter, t_u32 port)
3087*4882a593Smuzhiyun {
3088*4882a593Smuzhiyun 	int i;
3089*4882a593Smuzhiyun 	ENTER();
3090*4882a593Smuzhiyun 	for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) {
3091*4882a593Smuzhiyun 		if (pmadapter->pcard_usb->usb_tx_aggr[i].aggr_ctrl.enable &&
3092*4882a593Smuzhiyun 		    pmadapter->pcard_usb->usb_tx_aggr[i].port == port)
3093*4882a593Smuzhiyun 			return &pmadapter->pcard_usb->usb_tx_aggr[i];
3094*4882a593Smuzhiyun 	}
3095*4882a593Smuzhiyun 	LEAVE();
3096*4882a593Smuzhiyun 	return MNULL;
3097*4882a593Smuzhiyun }
3098*4882a593Smuzhiyun 
3099*4882a593Smuzhiyun t_void wlan_usb_tx_aggr_timeout_func(t_void *function_context);
3100*4882a593Smuzhiyun mlan_status wlan_usb_host_to_card_aggr(pmlan_adapter pmadapter,
3101*4882a593Smuzhiyun 				       pmlan_buffer pmbuf,
3102*4882a593Smuzhiyun 				       mlan_tx_param *tx_param,
3103*4882a593Smuzhiyun 				       usb_tx_aggr_params *aggr_params);
3104*4882a593Smuzhiyun #endif
3105*4882a593Smuzhiyun 
3106*4882a593Smuzhiyun /** Process receive packet complete */
3107*4882a593Smuzhiyun mlan_status wlan_recv_packet_complete(pmlan_adapter pmadapter,
3108*4882a593Smuzhiyun 				      pmlan_buffer pmbuf, mlan_status status);
3109*4882a593Smuzhiyun /** Clean Tx Rx queues */
3110*4882a593Smuzhiyun t_void wlan_clean_txrx(pmlan_private priv);
3111*4882a593Smuzhiyun 
3112*4882a593Smuzhiyun t_void wlan_add_buf_bypass_txqueue(mlan_adapter *pmadapter, pmlan_buffer pmbuf);
3113*4882a593Smuzhiyun t_void wlan_process_bypass_tx(mlan_adapter *pmadapter);
3114*4882a593Smuzhiyun t_void wlan_cleanup_bypass_txq(pmlan_private priv);
3115*4882a593Smuzhiyun t_u8 wlan_bypass_tx_list_empty(mlan_adapter *pmadapter);
3116*4882a593Smuzhiyun 
3117*4882a593Smuzhiyun /** Check if this is the last packet */
3118*4882a593Smuzhiyun t_u8 wlan_check_last_packet_indication(pmlan_private priv);
3119*4882a593Smuzhiyun 
3120*4882a593Smuzhiyun #define MOAL_ALLOC_MLAN_BUFFER MBIT(0)
3121*4882a593Smuzhiyun #define MOAL_MALLOC_BUFFER MBIT(1)
3122*4882a593Smuzhiyun #define MOAL_MEM_FLAG_ATOMIC MBIT(2)
3123*4882a593Smuzhiyun 
3124*4882a593Smuzhiyun #ifdef PCIE
3125*4882a593Smuzhiyun /* This defines the direction arg to the DMA mapping routines. */
3126*4882a593Smuzhiyun #define PCI_DMA_BIDIRECTIONAL 0
3127*4882a593Smuzhiyun #define PCI_DMA_TODEVICE 1
3128*4882a593Smuzhiyun #define PCI_DMA_FROMDEVICE 2
3129*4882a593Smuzhiyun #define PCI_DMA_NONE 3
3130*4882a593Smuzhiyun #endif
3131*4882a593Smuzhiyun 
3132*4882a593Smuzhiyun /** function to allocate a mlan_buffer */
3133*4882a593Smuzhiyun pmlan_buffer wlan_alloc_mlan_buffer(mlan_adapter *pmadapter, t_u32 data_len,
3134*4882a593Smuzhiyun 				    t_u32 head_room, t_u32 malloc_flag);
3135*4882a593Smuzhiyun /** function to free a mlan_buffer */
3136*4882a593Smuzhiyun t_void wlan_free_mlan_buffer(mlan_adapter *pmadapter, pmlan_buffer pmbuf);
3137*4882a593Smuzhiyun 
3138*4882a593Smuzhiyun /** command resp handler for version ext */
3139*4882a593Smuzhiyun mlan_status wlan_ret_ver_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3140*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
3141*4882a593Smuzhiyun 
3142*4882a593Smuzhiyun /** command resp handler for rx mgmt forward registration */
3143*4882a593Smuzhiyun mlan_status wlan_ret_rx_mgmt_ind(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3144*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3145*4882a593Smuzhiyun 
3146*4882a593Smuzhiyun /** Check Power Save condition */
3147*4882a593Smuzhiyun t_void wlan_check_ps_cond(mlan_adapter *pmadapter);
3148*4882a593Smuzhiyun 
3149*4882a593Smuzhiyun /** handle command for enhanced power save mode */
3150*4882a593Smuzhiyun mlan_status wlan_cmd_enh_power_mode(pmlan_private pmpriv,
3151*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3152*4882a593Smuzhiyun 				    t_u16 ps_bitmap, t_void *pdata_buf);
3153*4882a593Smuzhiyun /** handle command resp for enhanced power save mode */
3154*4882a593Smuzhiyun mlan_status wlan_ret_enh_power_mode(pmlan_private pmpriv,
3155*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *resp,
3156*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_buf);
3157*4882a593Smuzhiyun 
3158*4882a593Smuzhiyun /** handle commnand for cfg data */
3159*4882a593Smuzhiyun mlan_status wlan_cmd_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
3160*4882a593Smuzhiyun 			      t_u16 cmd_action, t_u32 cmd_oid,
3161*4882a593Smuzhiyun 			      t_void *pdata_buf);
3162*4882a593Smuzhiyun /** handle command resp for cfg data */
3163*4882a593Smuzhiyun mlan_status wlan_ret_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3164*4882a593Smuzhiyun 			      t_void *pioctl_buf);
3165*4882a593Smuzhiyun 
3166*4882a593Smuzhiyun /** Process sleep confirm command response */
3167*4882a593Smuzhiyun void wlan_process_sleep_confirm_resp(pmlan_adapter pmadapter, t_u8 *pbuf,
3168*4882a593Smuzhiyun 				     t_u32 len);
3169*4882a593Smuzhiyun 
3170*4882a593Smuzhiyun /** Perform hs related activities on receving the power up interrupt */
3171*4882a593Smuzhiyun void wlan_process_hs_config(pmlan_adapter pmadapter);
3172*4882a593Smuzhiyun 
3173*4882a593Smuzhiyun t_void wlan_wakeup_card_timeout_func(void *function_context);
3174*4882a593Smuzhiyun 
3175*4882a593Smuzhiyun mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload,
3176*4882a593Smuzhiyun 					   t_u32 payload_len, RxPD *prx_pd);
3177*4882a593Smuzhiyun 
3178*4882a593Smuzhiyun mlan_status wlan_pm_ioctl_hscfg(pmlan_adapter pmadapter,
3179*4882a593Smuzhiyun 				pmlan_ioctl_req pioctl_req);
3180*4882a593Smuzhiyun 
3181*4882a593Smuzhiyun mlan_status wlan_radio_ioctl_remain_chan_cfg(pmlan_adapter pmadapter,
3182*4882a593Smuzhiyun 					     pmlan_ioctl_req pioctl_req);
3183*4882a593Smuzhiyun mlan_status wlan_cmd_remain_on_channel(pmlan_private pmpriv,
3184*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *cmd,
3185*4882a593Smuzhiyun 				       t_u16 cmd_action, t_void *pdata_buf);
3186*4882a593Smuzhiyun mlan_status wlan_ret_remain_on_channel(pmlan_private pmpriv,
3187*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *resp,
3188*4882a593Smuzhiyun 				       mlan_ioctl_req *pioctl_buf);
3189*4882a593Smuzhiyun 
3190*4882a593Smuzhiyun #ifdef WIFI_DIRECT_SUPPORT
3191*4882a593Smuzhiyun mlan_status wlan_bss_ioctl_wifi_direct_mode(pmlan_adapter pmadapter,
3192*4882a593Smuzhiyun 					    pmlan_ioctl_req pioctl_req);
3193*4882a593Smuzhiyun 
3194*4882a593Smuzhiyun mlan_status wlan_cmd_wifi_direct_mode(pmlan_private pmpriv,
3195*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3196*4882a593Smuzhiyun 				      t_void *pdata_buf);
3197*4882a593Smuzhiyun mlan_status wlan_ret_wifi_direct_mode(pmlan_private pmpriv,
3198*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp,
3199*4882a593Smuzhiyun 				      mlan_ioctl_req *pioctl_buf);
3200*4882a593Smuzhiyun mlan_status wlan_cmd_p2p_params_config(pmlan_private pmpriv,
3201*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *cmd,
3202*4882a593Smuzhiyun 				       t_u16 cmd_action, t_void *pdata_buf);
3203*4882a593Smuzhiyun mlan_status wlan_ret_p2p_params_config(pmlan_private pmpriv,
3204*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *resp,
3205*4882a593Smuzhiyun 				       mlan_ioctl_req *pioctl_buf);
3206*4882a593Smuzhiyun mlan_status wlan_misc_p2p_config(pmlan_adapter pmadapter,
3207*4882a593Smuzhiyun 				 pmlan_ioctl_req pioctl_req);
3208*4882a593Smuzhiyun #endif
3209*4882a593Smuzhiyun mlan_status wlan_cmd_gpio_tsf_latch(pmlan_private pmpriv,
3210*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3211*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_buf,
3212*4882a593Smuzhiyun 				    t_void *pdata_buf);
3213*4882a593Smuzhiyun mlan_status wlan_ret_gpio_tsf_latch(pmlan_private pmpriv,
3214*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *resp,
3215*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_buf);
3216*4882a593Smuzhiyun mlan_status wlan_misc_gpio_tsf_latch_config(pmlan_adapter pmadapter,
3217*4882a593Smuzhiyun 					    pmlan_ioctl_req pioctl_req);
3218*4882a593Smuzhiyun mlan_status wlan_misc_get_tsf_info(pmlan_adapter pmadapter,
3219*4882a593Smuzhiyun 				   pmlan_ioctl_req pioctl_req);
3220*4882a593Smuzhiyun /** get ralist info */
3221*4882a593Smuzhiyun int wlan_get_ralist_info(mlan_private *priv, pralist_info buf);
3222*4882a593Smuzhiyun /** dump ralist */
3223*4882a593Smuzhiyun void wlan_dump_ralist(mlan_private *priv);
3224*4882a593Smuzhiyun 
3225*4882a593Smuzhiyun /** get pm info */
3226*4882a593Smuzhiyun mlan_status wlan_get_pm_info(pmlan_adapter pmadapter,
3227*4882a593Smuzhiyun 			     pmlan_ioctl_req pioctl_req);
3228*4882a593Smuzhiyun 
3229*4882a593Smuzhiyun mlan_status wlan_bss_ioctl_bss_remove(pmlan_adapter pmadapter,
3230*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3231*4882a593Smuzhiyun 
3232*4882a593Smuzhiyun mlan_status wlan_radio_ioctl_mimo_switch_cfg(pmlan_adapter pmadapter,
3233*4882a593Smuzhiyun 					     pmlan_ioctl_req pioctl_req);
3234*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_mimo_switch(pmlan_private pmpriv,
3235*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *cmd,
3236*4882a593Smuzhiyun 					t_void *pdata_buf);
3237*4882a593Smuzhiyun 
3238*4882a593Smuzhiyun mlan_status wlan_misc_per_pkt_cfg(pmlan_adapter pmadapter,
3239*4882a593Smuzhiyun 				  pmlan_ioctl_req pioctl_req);
3240*4882a593Smuzhiyun 
3241*4882a593Smuzhiyun mlan_status wlan_config_mgmt_filter(pmlan_adapter pmadapter,
3242*4882a593Smuzhiyun 				    pmlan_ioctl_req pioctl_req);
3243*4882a593Smuzhiyun mlan_status wlan_get_hs_wakeup_reason(pmlan_adapter pmadapter,
3244*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3245*4882a593Smuzhiyun 
3246*4882a593Smuzhiyun mlan_status wlan_cmd_hs_wakeup_reason(pmlan_private pmpriv,
3247*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *cmd,
3248*4882a593Smuzhiyun 				      t_void *pdata_buf);
3249*4882a593Smuzhiyun 
3250*4882a593Smuzhiyun mlan_status wlan_ret_hs_wakeup_reason(pmlan_private pmpriv,
3251*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp,
3252*4882a593Smuzhiyun 				      mlan_ioctl_req *pioctl_buf);
3253*4882a593Smuzhiyun 
3254*4882a593Smuzhiyun mlan_status wlan_get_tx_rx_histogram(pmlan_adapter pmadapter,
3255*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_req);
3256*4882a593Smuzhiyun mlan_status wlan_cmd_tx_rx_pkt_stats(pmlan_private pmpriv,
3257*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *cmd,
3258*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_buf,
3259*4882a593Smuzhiyun 				     t_void *pdata_buf);
3260*4882a593Smuzhiyun mlan_status wlan_ret_tx_rx_pkt_stats(pmlan_private pmpriv,
3261*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
3262*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_buf);
3263*4882a593Smuzhiyun 
3264*4882a593Smuzhiyun mlan_status wlan_radio_ioctl_radio_ctl(pmlan_adapter pmadapter,
3265*4882a593Smuzhiyun 				       pmlan_ioctl_req pioctl_req);
3266*4882a593Smuzhiyun 
3267*4882a593Smuzhiyun mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
3268*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_req);
3269*4882a593Smuzhiyun 
3270*4882a593Smuzhiyun mlan_status wlan_cmd_tx_rate_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3271*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf,
3272*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3273*4882a593Smuzhiyun mlan_status wlan_ret_tx_rate_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3274*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3275*4882a593Smuzhiyun 
3276*4882a593Smuzhiyun mlan_status wlan_rate_ioctl_cfg(pmlan_adapter pmadapter,
3277*4882a593Smuzhiyun 				pmlan_ioctl_req pioctl_req);
3278*4882a593Smuzhiyun mlan_status wlan_ret_802_11_tx_rate_query(pmlan_private pmpriv,
3279*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *resp,
3280*4882a593Smuzhiyun 					  mlan_ioctl_req *pioctl_buf);
3281*4882a593Smuzhiyun 
3282*4882a593Smuzhiyun mlan_status wlan_rate_ioctl_get_data_rate(pmlan_adapter pmadapter,
3283*4882a593Smuzhiyun 					  pmlan_ioctl_req pioctl_req);
3284*4882a593Smuzhiyun 
3285*4882a593Smuzhiyun t_void wlan_host_sleep_activated_event(pmlan_private priv, t_u8 activated);
3286*4882a593Smuzhiyun /** Handles the command response of hs_cfg */
3287*4882a593Smuzhiyun mlan_status wlan_ret_802_11_hs_cfg(pmlan_private pmpriv,
3288*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *resp,
3289*4882a593Smuzhiyun 				   mlan_ioctl_req *pioctl_buf);
3290*4882a593Smuzhiyun /** Sends HS_WAKEUP event to applications */
3291*4882a593Smuzhiyun t_void wlan_host_sleep_wakeup_event(pmlan_private priv);
3292*4882a593Smuzhiyun 
3293*4882a593Smuzhiyun /** Prepares command of robustcoex */
3294*4882a593Smuzhiyun mlan_status wlan_cmd_robustcoex(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3295*4882a593Smuzhiyun 				t_u16 cmd_action, t_u16 *pdata_buf);
3296*4882a593Smuzhiyun /** Set Robustcoex gpiocfg */
3297*4882a593Smuzhiyun mlan_status wlan_misc_robustcoex(pmlan_adapter pmadapter,
3298*4882a593Smuzhiyun 				 pmlan_ioctl_req pioctl_req);
3299*4882a593Smuzhiyun 
3300*4882a593Smuzhiyun /** Set mapping policy/get DMCS status */
3301*4882a593Smuzhiyun mlan_status wlan_misc_dmcs_config(pmlan_adapter pmadapter,
3302*4882a593Smuzhiyun 				  pmlan_ioctl_req pioctl_req);
3303*4882a593Smuzhiyun /** Prepares command of DMCS config */
3304*4882a593Smuzhiyun mlan_status wlan_cmd_dmcs_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3305*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf);
3306*4882a593Smuzhiyun /** Handles command response of DMCS config */
3307*4882a593Smuzhiyun mlan_status wlan_ret_dmcs_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3308*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3309*4882a593Smuzhiyun 
3310*4882a593Smuzhiyun #if defined(PCIE)
3311*4882a593Smuzhiyun mlan_status wlan_cmd_ssu(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3312*4882a593Smuzhiyun 			 t_u16 cmd_action, t_u16 *pdata_buf);
3313*4882a593Smuzhiyun #endif
3314*4882a593Smuzhiyun 
3315*4882a593Smuzhiyun /** send get hw spec command to firmware */
3316*4882a593Smuzhiyun mlan_status wlan_adapter_get_hw_spec(pmlan_adapter pmadapter);
3317*4882a593Smuzhiyun /** send adapter specific init cmd to firmware */
3318*4882a593Smuzhiyun mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter);
3319*4882a593Smuzhiyun /** get/set bandcfg */
3320*4882a593Smuzhiyun mlan_status wlan_radio_ioctl_band_cfg(pmlan_adapter pmadapter,
3321*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3322*4882a593Smuzhiyun 
3323*4882a593Smuzhiyun #ifdef RX_PACKET_COALESCE
3324*4882a593Smuzhiyun mlan_status wlan_cmd_rx_pkt_coalesce_cfg(pmlan_private pmpriv,
3325*4882a593Smuzhiyun 					 HostCmd_DS_COMMAND *cmd,
3326*4882a593Smuzhiyun 					 t_u16 cmd_action, t_void *pdata_buf);
3327*4882a593Smuzhiyun mlan_status wlan_ret_rx_pkt_coalesce_cfg(pmlan_private pmpriv,
3328*4882a593Smuzhiyun 					 const HostCmd_DS_COMMAND *resp,
3329*4882a593Smuzhiyun 					 mlan_ioctl_req *pioctl_buf);
3330*4882a593Smuzhiyun #endif
3331*4882a593Smuzhiyun 
3332*4882a593Smuzhiyun #ifdef STA_SUPPORT
3333*4882a593Smuzhiyun /** warm reset */
3334*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_warm_reset(pmlan_adapter pmadapter,
3335*4882a593Smuzhiyun 				       pmlan_ioctl_req pioctl_req);
3336*4882a593Smuzhiyun /** Process received packet */
3337*4882a593Smuzhiyun mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf);
3338*4882a593Smuzhiyun /** ioctl handler for station mode */
3339*4882a593Smuzhiyun mlan_status wlan_ops_sta_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req);
3340*4882a593Smuzhiyun 
3341*4882a593Smuzhiyun /** cmd handler for station mode */
3342*4882a593Smuzhiyun mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
3343*4882a593Smuzhiyun 				     t_u16 cmd_action, t_u32 cmd_oid,
3344*4882a593Smuzhiyun 				     t_void *pioctl_buf, t_void *pdata_buf,
3345*4882a593Smuzhiyun 				     t_void *pcmd_buf);
3346*4882a593Smuzhiyun 
3347*4882a593Smuzhiyun /** cmdresp handler for station mode */
3348*4882a593Smuzhiyun mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
3349*4882a593Smuzhiyun 					 t_void *pcmd_buf, t_void *pioctl);
3350*4882a593Smuzhiyun 
3351*4882a593Smuzhiyun /** rx handler for station mode */
3352*4882a593Smuzhiyun mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf);
3353*4882a593Smuzhiyun 
3354*4882a593Smuzhiyun /** event handler for station mode */
3355*4882a593Smuzhiyun mlan_status wlan_ops_sta_process_event(t_void *priv);
3356*4882a593Smuzhiyun 
3357*4882a593Smuzhiyun /** fill txpd for station mode */
3358*4882a593Smuzhiyun t_void *wlan_ops_sta_process_txpd(t_void *priv, pmlan_buffer pmbuf);
3359*4882a593Smuzhiyun 
3360*4882a593Smuzhiyun /** send init cmd to firmware for station mode */
3361*4882a593Smuzhiyun mlan_status wlan_ops_sta_init_cmd(t_void *priv, t_u8 first_bss);
3362*4882a593Smuzhiyun 
3363*4882a593Smuzhiyun /** Flush the scan table */
3364*4882a593Smuzhiyun mlan_status wlan_flush_scan_table(pmlan_adapter pmadapter);
3365*4882a593Smuzhiyun 
3366*4882a593Smuzhiyun /** Scan for networks */
3367*4882a593Smuzhiyun mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf,
3368*4882a593Smuzhiyun 			       wlan_user_scan_cfg *puser_scan_in);
3369*4882a593Smuzhiyun 
3370*4882a593Smuzhiyun /** Scan for specific SSID */
3371*4882a593Smuzhiyun mlan_status wlan_scan_specific_ssid(mlan_private *pmpriv, t_void *pioctl_buf,
3372*4882a593Smuzhiyun 				    mlan_802_11_ssid *preq_ssid);
3373*4882a593Smuzhiyun 
3374*4882a593Smuzhiyun /** Scan command handler */
3375*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
3376*4882a593Smuzhiyun 				 t_void *pdata_buf);
3377*4882a593Smuzhiyun 
3378*4882a593Smuzhiyun /** Handler for scan command response */
3379*4882a593Smuzhiyun mlan_status wlan_ret_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3380*4882a593Smuzhiyun 				 t_void *pioctl_buf);
3381*4882a593Smuzhiyun 
3382*4882a593Smuzhiyun t_u8 wlan_get_ext_scan_state(HostCmd_DS_COMMAND *pcmd);
3383*4882a593Smuzhiyun /** Extended scan command handler */
3384*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_scan_ext(pmlan_private pmpriv,
3385*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *pcmd,
3386*4882a593Smuzhiyun 				     t_void *pdata_buf);
3387*4882a593Smuzhiyun /** Handler for extended scan command response */
3388*4882a593Smuzhiyun mlan_status wlan_ret_802_11_scan_ext(pmlan_private pmpriv,
3389*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
3390*4882a593Smuzhiyun 				     t_void *pioctl_buf);
3391*4882a593Smuzhiyun /** Handler event for extended scan report */
3392*4882a593Smuzhiyun mlan_status wlan_handle_event_ext_scan_report(mlan_private *pmpriv,
3393*4882a593Smuzhiyun 					      mlan_buffer *pmbuf);
3394*4882a593Smuzhiyun mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv,
3395*4882a593Smuzhiyun 					      mlan_buffer *pmbuf);
3396*4882a593Smuzhiyun 
3397*4882a593Smuzhiyun /** check network compatibility */
3398*4882a593Smuzhiyun t_s32 wlan_is_network_compatible(mlan_private *pmpriv, t_u32 index, t_u32 mode);
3399*4882a593Smuzhiyun 
3400*4882a593Smuzhiyun /** Find an SSID in a list */
3401*4882a593Smuzhiyun t_s32 wlan_find_ssid_in_list(pmlan_private pmpriv, mlan_802_11_ssid *ssid,
3402*4882a593Smuzhiyun 			     t_u8 *bssid, t_u32 mode);
3403*4882a593Smuzhiyun 
3404*4882a593Smuzhiyun /** Find a BSSID in a list */
3405*4882a593Smuzhiyun t_s32 wlan_find_bssid_in_list(mlan_private *pmpriv, t_u8 *bssid, t_u32 mode);
3406*4882a593Smuzhiyun 
3407*4882a593Smuzhiyun /** Find best network */
3408*4882a593Smuzhiyun mlan_status wlan_find_best_network(mlan_private *pmpriv,
3409*4882a593Smuzhiyun 				   mlan_ssid_bssid *preq_ssid_bssid);
3410*4882a593Smuzhiyun 
3411*4882a593Smuzhiyun /** Compare two SSIDs */
3412*4882a593Smuzhiyun t_s32 wlan_ssid_cmp(pmlan_adapter pmadapter, mlan_802_11_ssid *ssid1,
3413*4882a593Smuzhiyun 		    mlan_802_11_ssid *ssid2);
3414*4882a593Smuzhiyun 
3415*4882a593Smuzhiyun /** Associate */
3416*4882a593Smuzhiyun mlan_status wlan_associate(mlan_private *pmpriv, IN t_void *pioctl_buf,
3417*4882a593Smuzhiyun 			   IN BSSDescriptor_t *pBSSDesc);
3418*4882a593Smuzhiyun 
3419*4882a593Smuzhiyun /** Associate command handler */
3420*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
3421*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *cmd,
3422*4882a593Smuzhiyun 				      t_void *pdata_buf);
3423*4882a593Smuzhiyun 
3424*4882a593Smuzhiyun /** Handler for association command response */
3425*4882a593Smuzhiyun mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
3426*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp,
3427*4882a593Smuzhiyun 				      t_void *pioctl_buf);
3428*4882a593Smuzhiyun 
3429*4882a593Smuzhiyun /** Reset connected state */
3430*4882a593Smuzhiyun t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect);
3431*4882a593Smuzhiyun 
3432*4882a593Smuzhiyun t_void wlan_2040_coex_event(pmlan_private pmpriv);
3433*4882a593Smuzhiyun 
3434*4882a593Smuzhiyun /** convert band to radio type */
3435*4882a593Smuzhiyun t_u8 wlan_band_to_radio_type(t_u16 band);
3436*4882a593Smuzhiyun /** convert radio_type to band */
3437*4882a593Smuzhiyun t_u16 radio_type_to_band(t_u8 chanBand);
3438*4882a593Smuzhiyun 
3439*4882a593Smuzhiyun /** Disconnect */
3440*4882a593Smuzhiyun mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
3441*4882a593Smuzhiyun 			    mlan_deauth_param *deauth_param);
3442*4882a593Smuzhiyun 
3443*4882a593Smuzhiyun /** Ad-Hoc start */
3444*4882a593Smuzhiyun mlan_status wlan_adhoc_start(mlan_private *pmpriv, t_void *pioctl_buf,
3445*4882a593Smuzhiyun 			     mlan_802_11_ssid *padhoc_ssid);
3446*4882a593Smuzhiyun 
3447*4882a593Smuzhiyun /** Ad-Hoc join */
3448*4882a593Smuzhiyun mlan_status wlan_adhoc_join(mlan_private *pmpriv, t_void *pioctl_buf,
3449*4882a593Smuzhiyun 			    BSSDescriptor_t *pBSSDesc);
3450*4882a593Smuzhiyun 
3451*4882a593Smuzhiyun /** Ad-Hoc start command handler */
3452*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_ad_hoc_start(mlan_private *pmpriv,
3453*4882a593Smuzhiyun 					 HostCmd_DS_COMMAND *cmd,
3454*4882a593Smuzhiyun 					 t_void *pdata_buf);
3455*4882a593Smuzhiyun 
3456*4882a593Smuzhiyun /** Ad-Hoc command handler */
3457*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
3458*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *cmd,
3459*4882a593Smuzhiyun 					t_void *pdata_buf);
3460*4882a593Smuzhiyun 
3461*4882a593Smuzhiyun /** Handler for Ad-Hoc commands */
3462*4882a593Smuzhiyun mlan_status wlan_ret_802_11_ad_hoc(mlan_private *pmpriv,
3463*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *resp,
3464*4882a593Smuzhiyun 				   t_void *pioctl_buf);
3465*4882a593Smuzhiyun 
3466*4882a593Smuzhiyun /** Handler for bgscan query commands */
3467*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_bg_scan_query(mlan_private *pmpriv,
3468*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *pcmd,
3469*4882a593Smuzhiyun 					  t_void *pdata_buf);
3470*4882a593Smuzhiyun /** Handler for bgscan config command */
3471*4882a593Smuzhiyun mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
3472*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *pcmd, t_void *pdata_buf);
3473*4882a593Smuzhiyun /** Hander for bgscan config command response */
3474*4882a593Smuzhiyun mlan_status wlan_ret_bgscan_config(mlan_private *pmpriv,
3475*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *resp,
3476*4882a593Smuzhiyun 				   mlan_ioctl_req *pioctl_buf);
3477*4882a593Smuzhiyun mlan_status wlan_ret_802_11_bgscan_query(mlan_private *pmpriv,
3478*4882a593Smuzhiyun 					 HostCmd_DS_COMMAND *resp,
3479*4882a593Smuzhiyun 					 mlan_ioctl_req *pioctl_buf);
3480*4882a593Smuzhiyun 
3481*4882a593Smuzhiyun /** Get Channel-Frequency-Power by band and channel */
3482*4882a593Smuzhiyun chan_freq_power_t *
3483*4882a593Smuzhiyun wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u16 band,
3484*4882a593Smuzhiyun 				 t_u16 channel, region_chan_t *region_channel);
3485*4882a593Smuzhiyun /** Find Channel-Frequency-Power by band and channel */
3486*4882a593Smuzhiyun chan_freq_power_t *wlan_find_cfp_by_band_and_channel(mlan_adapter *pmadapter,
3487*4882a593Smuzhiyun 						     t_u16 band, t_u16 channel);
3488*4882a593Smuzhiyun /** Find Channel-Frequency-Power by band and frequency */
3489*4882a593Smuzhiyun chan_freq_power_t *wlan_find_cfp_by_band_and_freq(mlan_adapter *pmadapter,
3490*4882a593Smuzhiyun 						  t_u16 band, t_u32 freq);
3491*4882a593Smuzhiyun /** Get Tx power of channel from Channel-Frequency-Power */
3492*4882a593Smuzhiyun t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u16 band,
3493*4882a593Smuzhiyun 				     t_u8 channel);
3494*4882a593Smuzhiyun /** find frequency from band and channel */
3495*4882a593Smuzhiyun t_u32 wlan_find_freq_from_band_chan(t_u16 band, t_u8 chan);
3496*4882a593Smuzhiyun 
3497*4882a593Smuzhiyun /*  Save a beacon buffer of the current bss descriptor */
3498*4882a593Smuzhiyun t_void wlan_save_curr_bcn(mlan_private *pmpriv);
3499*4882a593Smuzhiyun /*  Free a beacon buffer of the current bss descriptor */
3500*4882a593Smuzhiyun t_void wlan_free_curr_bcn(mlan_private *pmpriv);
3501*4882a593Smuzhiyun 
3502*4882a593Smuzhiyun #endif /* STA_SUPPORT */
3503*4882a593Smuzhiyun 
3504*4882a593Smuzhiyun /* Rate related functions */
3505*4882a593Smuzhiyun t_u8 wlan_convert_v14_tx_rate_info(pmlan_private pmpriv, t_u8 v14_rate_info);
3506*4882a593Smuzhiyun t_u8 wlan_convert_v14_rx_rate_info(pmlan_private pmpriv, t_u8 v14_rate_info);
3507*4882a593Smuzhiyun /** Convert index into data rate */
3508*4882a593Smuzhiyun t_u32 wlan_index_to_data_rate(pmlan_adapter pmadapter, t_u8 index,
3509*4882a593Smuzhiyun 			      t_u8 rate_info, t_u8 ext_rate_info);
3510*4882a593Smuzhiyun /** Get active data rates */
3511*4882a593Smuzhiyun t_u32 wlan_get_active_data_rates(mlan_private *pmpriv, t_u32 bss_mode,
3512*4882a593Smuzhiyun 				 t_u16 config_bands, WLAN_802_11_RATES rates);
3513*4882a593Smuzhiyun /** Get supported data rates */
3514*4882a593Smuzhiyun t_u32 wlan_get_supported_rates(mlan_private *pmpriv, t_u32 bss_mode,
3515*4882a593Smuzhiyun 			       t_u16 config_bands, WLAN_802_11_RATES rates);
3516*4882a593Smuzhiyun /** Convert data rate to index */
3517*4882a593Smuzhiyun t_u8 wlan_data_rate_to_index(pmlan_adapter pmadapter, t_u32 rate);
3518*4882a593Smuzhiyun /** Check if rate is auto */
3519*4882a593Smuzhiyun t_u8 wlan_is_rate_auto(mlan_private *pmpriv);
3520*4882a593Smuzhiyun /** Get rate index */
3521*4882a593Smuzhiyun int wlan_get_rate_index(pmlan_adapter pmadapter, t_u16 *rateBitmap, int size);
3522*4882a593Smuzhiyun mlan_status wlan_cmd_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3523*4882a593Smuzhiyun 				t_u16 cmd_action, t_void *pdata_buf);
3524*4882a593Smuzhiyun mlan_status wlan_ret_rxabortcfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3525*4882a593Smuzhiyun 				mlan_ioctl_req *pioctl_buf);
3526*4882a593Smuzhiyun mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv,
3527*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3528*4882a593Smuzhiyun 				    t_void *pdata_buf);
3529*4882a593Smuzhiyun mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv,
3530*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *resp,
3531*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_buf);
3532*4882a593Smuzhiyun mlan_status wlan_cmd_tx_ampdu_prot_mode(pmlan_private pmpriv,
3533*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *cmd,
3534*4882a593Smuzhiyun 					t_u16 cmd_action, t_void *pdata_buf);
3535*4882a593Smuzhiyun mlan_status wlan_ret_tx_ampdu_prot_mode(pmlan_private pmpriv,
3536*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *resp,
3537*4882a593Smuzhiyun 					mlan_ioctl_req *pioctl_buf);
3538*4882a593Smuzhiyun mlan_status wlan_cmd_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv,
3539*4882a593Smuzhiyun 					     HostCmd_DS_COMMAND *cmd,
3540*4882a593Smuzhiyun 					     t_u16 cmd_action,
3541*4882a593Smuzhiyun 					     t_void *pdata_buf);
3542*4882a593Smuzhiyun mlan_status wlan_ret_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv,
3543*4882a593Smuzhiyun 					     HostCmd_DS_COMMAND *resp,
3544*4882a593Smuzhiyun 					     mlan_ioctl_req *pioctl_buf);
3545*4882a593Smuzhiyun mlan_status wlan_cmd_hal_phy_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3546*4882a593Smuzhiyun 				 t_u16 cmd_action, t_u16 *pdata_buf);
3547*4882a593Smuzhiyun mlan_status wlan_ret_hal_phy_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3548*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3549*4882a593Smuzhiyun mlan_status wlan_cmd_ips_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3550*4882a593Smuzhiyun 				t_u16 cmd_action, t_void *pdata_buf);
3551*4882a593Smuzhiyun mlan_status wlan_ret_ips_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3552*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
3553*4882a593Smuzhiyun mlan_status wlan_cmd_rate_adapt_cfg(pmlan_private pmpriv,
3554*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3555*4882a593Smuzhiyun 				    t_void *pdata_buf);
3556*4882a593Smuzhiyun mlan_status wlan_ret_rate_adapt_cfg(pmlan_private pmpriv,
3557*4882a593Smuzhiyun 				    HostCmd_DS_COMMAND *resp,
3558*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_buf);
3559*4882a593Smuzhiyun mlan_status wlan_cmd_cck_desense_cfg(pmlan_private pmpriv,
3560*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3561*4882a593Smuzhiyun 				     t_void *pdata_buf);
3562*4882a593Smuzhiyun 
3563*4882a593Smuzhiyun mlan_status wlan_ret_cck_desense_cfg(pmlan_private pmpriv,
3564*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
3565*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_buf);
3566*4882a593Smuzhiyun 
3567*4882a593Smuzhiyun mlan_status wlan_cmd_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3568*4882a593Smuzhiyun 			     t_u16 cmd_action, t_void *pdata_buf);
3569*4882a593Smuzhiyun mlan_status wlan_ret_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3570*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
3571*4882a593Smuzhiyun 
3572*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_rxabortcfg(pmlan_adapter pmadapter,
3573*4882a593Smuzhiyun 				       pmlan_ioctl_req pioctl_req);
3574*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter,
3575*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req);
3576*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tx_ampdu_prot_mode(pmlan_adapter pmadapter,
3577*4882a593Smuzhiyun 					       pmlan_ioctl_req pioctl_req);
3578*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg(pmlan_adapter pmadapter,
3579*4882a593Smuzhiyun 						    pmlan_ioctl_req pioctl_req);
3580*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_rate_adapt_cfg(pmlan_adapter pmadapter,
3581*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req);
3582*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_cck_desense_cfg(pmlan_adapter pmadapter,
3583*4882a593Smuzhiyun 					    pmlan_ioctl_req pioctl_req);
3584*4882a593Smuzhiyun mlan_status wlan_cmd_mfg(pmlan_private pmpriv, pHostCmd_DS_COMMAND cmd,
3585*4882a593Smuzhiyun 			 t_u16 cmd_action, t_pvoid pdata_buf);
3586*4882a593Smuzhiyun mlan_status wlan_ret_mfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3587*4882a593Smuzhiyun 			 mlan_ioctl_req *pioctl_buf);
3588*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_rf_test_cfg(pmlan_adapter pmadapter,
3589*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
3590*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_range_ext(pmlan_adapter pmadapter,
3591*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3592*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_arb_cfg(pmlan_adapter pmadapter,
3593*4882a593Smuzhiyun 				    pmlan_ioctl_req pioctl_req);
3594*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tp_state(pmlan_adapter pmadapter,
3595*4882a593Smuzhiyun 				     pmlan_ioctl_req pioctl_req);
3596*4882a593Smuzhiyun /* CFP related functions */
3597*4882a593Smuzhiyun /** Region code index table */
3598*4882a593Smuzhiyun extern t_u16 region_code_index[MRVDRV_MAX_REGION_CODE];
3599*4882a593Smuzhiyun /** The table to keep CFP code for A */
3600*4882a593Smuzhiyun extern t_u16 cfp_code_index_a[MRVDRV_MAX_CFP_CODE_A];
3601*4882a593Smuzhiyun 
3602*4882a593Smuzhiyun /** Set region table */
3603*4882a593Smuzhiyun mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band);
3604*4882a593Smuzhiyun /** Get radar detection requirements*/
3605*4882a593Smuzhiyun t_bool wlan_get_cfp_radar_detect(mlan_private *priv, t_u8 chnl);
3606*4882a593Smuzhiyun /** check if scan type is passive for b/g band*/
3607*4882a593Smuzhiyun t_bool wlan_bg_scan_type_is_passive(mlan_private *priv, t_u8 chnl);
3608*4882a593Smuzhiyun /** check if channel is NO_IR (passive) */
3609*4882a593Smuzhiyun t_bool wlan_is_chan_passive(mlan_private *priv, t_u16 band, t_u8 chan);
3610*4882a593Smuzhiyun /** check if channel is disabled */
3611*4882a593Smuzhiyun t_bool wlan_is_chan_disabled(mlan_private *priv, t_u16 band, t_u8 chan);
3612*4882a593Smuzhiyun /** check if channel is blacklisted */
3613*4882a593Smuzhiyun t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u16 band, t_u8 chan);
3614*4882a593Smuzhiyun /** set blacklist setting for a channel */
3615*4882a593Smuzhiyun t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u16 band, t_u8 chan,
3616*4882a593Smuzhiyun 			       t_bool bl);
3617*4882a593Smuzhiyun 
3618*4882a593Smuzhiyun dfs_state_t wlan_get_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan);
3619*4882a593Smuzhiyun t_void wlan_set_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan,
3620*4882a593Smuzhiyun 			       dfs_state_t dfs_state);
3621*4882a593Smuzhiyun t_void wlan_reset_all_chan_dfs_state(mlan_private *priv, t_u16 band,
3622*4882a593Smuzhiyun 				     dfs_state_t dfs_state);
3623*4882a593Smuzhiyun /* 802.11D related functions */
3624*4882a593Smuzhiyun /** Initialize 11D */
3625*4882a593Smuzhiyun t_void wlan_11d_priv_init(mlan_private *pmpriv);
3626*4882a593Smuzhiyun /** Initialize 11D */
3627*4882a593Smuzhiyun t_void wlan_11d_init(mlan_adapter *pmadapter);
3628*4882a593Smuzhiyun /** Enable 11D */
3629*4882a593Smuzhiyun mlan_status wlan_11d_enable(mlan_private *pmpriv, t_void *pioctl_buf,
3630*4882a593Smuzhiyun 			    state_11d_t flag);
3631*4882a593Smuzhiyun /** Get if 11D is enabled */
3632*4882a593Smuzhiyun t_bool wlan_11d_is_enabled(mlan_private *pmpriv);
3633*4882a593Smuzhiyun /** Get if FW 11D is enabled */
3634*4882a593Smuzhiyun t_bool wlan_fw_11d_is_enabled(mlan_private *pmpriv);
3635*4882a593Smuzhiyun /** Get if priv is station */
3636*4882a593Smuzhiyun t_bool wlan_is_station(mlan_private *pmpriv);
3637*4882a593Smuzhiyun /** Command handler for 11D country info */
3638*4882a593Smuzhiyun mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
3639*4882a593Smuzhiyun 					 HostCmd_DS_COMMAND *pcmd,
3640*4882a593Smuzhiyun 					 t_u16 cmd_action);
3641*4882a593Smuzhiyun /** Handler for 11D country info command response */
3642*4882a593Smuzhiyun mlan_status wlan_ret_802_11d_domain_info(mlan_private *pmpriv,
3643*4882a593Smuzhiyun 					 HostCmd_DS_COMMAND *resp);
3644*4882a593Smuzhiyun /** Convert channel to frequency */
3645*4882a593Smuzhiyun t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u16 band);
3646*4882a593Smuzhiyun #ifdef STA_SUPPORT
3647*4882a593Smuzhiyun /** Set 11D universal table */
3648*4882a593Smuzhiyun mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u16 band);
3649*4882a593Smuzhiyun /** Clear 11D region table */
3650*4882a593Smuzhiyun mlan_status wlan_11d_clear_parsedtable(mlan_private *pmpriv);
3651*4882a593Smuzhiyun /** Create 11D country information for downloading */
3652*4882a593Smuzhiyun mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u16 band);
3653*4882a593Smuzhiyun /** Get scan type from 11D info */
3654*4882a593Smuzhiyun t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u16 band, t_u8 chan,
3655*4882a593Smuzhiyun 			    parsed_region_chan_11d_t *parsed_region_chan);
3656*4882a593Smuzhiyun /** Parse 11D country info */
3657*4882a593Smuzhiyun mlan_status wlan_11d_parse_dnld_countryinfo(mlan_private *pmpriv,
3658*4882a593Smuzhiyun 					    BSSDescriptor_t *pBSSDesc);
3659*4882a593Smuzhiyun /** Prepare 11D domain information for download */
3660*4882a593Smuzhiyun mlan_status wlan_11d_prepare_dnld_domain_info_cmd(mlan_private *pmpriv);
3661*4882a593Smuzhiyun /** Parse 11D country information into domain info */
3662*4882a593Smuzhiyun mlan_status wlan_11d_parse_domain_info(
3663*4882a593Smuzhiyun 	pmlan_adapter pmadapter, IEEEtypes_CountryInfoFullSet_t *country_info,
3664*4882a593Smuzhiyun 	t_u16 band, parsed_region_chan_11d_t *parsed_region_chan);
3665*4882a593Smuzhiyun #endif /* STA_SUPPORT */
3666*4882a593Smuzhiyun #ifdef UAP_SUPPORT
3667*4882a593Smuzhiyun /** Handle 11D domain information from UAP */
3668*4882a593Smuzhiyun mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
3669*4882a593Smuzhiyun 					    t_u8 *domain_tlv,
3670*4882a593Smuzhiyun 					    t_void *pioctl_buf);
3671*4882a593Smuzhiyun #endif
3672*4882a593Smuzhiyun /** Configure 11D domain info command */
3673*4882a593Smuzhiyun mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter,
3674*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_req);
3675*4882a593Smuzhiyun 
3676*4882a593Smuzhiyun /** This function converts region string to CFP table code */
3677*4882a593Smuzhiyun mlan_status wlan_misc_country_2_cfp_table_code(pmlan_adapter pmadapter,
3678*4882a593Smuzhiyun 					       t_u8 *country_code, t_u8 *cfp_bg,
3679*4882a593Smuzhiyun 					       t_u8 *cfp_a);
3680*4882a593Smuzhiyun 
3681*4882a593Smuzhiyun /** This function finds if given country code is in EU table */
3682*4882a593Smuzhiyun t_bool wlan_is_etsi_country(pmlan_adapter pmadapter, t_u8 *country_code);
3683*4882a593Smuzhiyun 
3684*4882a593Smuzhiyun /** check if station list is empty */
3685*4882a593Smuzhiyun t_u8 wlan_is_station_list_empty(mlan_private *priv);
3686*4882a593Smuzhiyun /** get station node */
3687*4882a593Smuzhiyun sta_node *wlan_get_station_entry(mlan_private *priv, t_u8 *mac);
3688*4882a593Smuzhiyun /** delete station list */
3689*4882a593Smuzhiyun t_void wlan_delete_station_list(pmlan_private priv);
3690*4882a593Smuzhiyun /** delete station entry */
3691*4882a593Smuzhiyun t_void wlan_delete_station_entry(mlan_private *priv, t_u8 *mac);
3692*4882a593Smuzhiyun /** add station entry */
3693*4882a593Smuzhiyun sta_node *wlan_add_station_entry(mlan_private *priv, t_u8 *mac);
3694*4882a593Smuzhiyun /** process uap rx packet */
3695*4882a593Smuzhiyun 
3696*4882a593Smuzhiyun void wlan_check_sta_capability(pmlan_private priv, pmlan_buffer pevent,
3697*4882a593Smuzhiyun 			       sta_node *sta_ptr);
3698*4882a593Smuzhiyun /** find specific ie */
3699*4882a593Smuzhiyun t_u8 *wlan_get_specific_ie(pmlan_private priv, t_u8 *ie_buf, t_u8 ie_len,
3700*4882a593Smuzhiyun 			   IEEEtypes_ElementId_e id, t_u8 ext_id);
3701*4882a593Smuzhiyun t_u8 wlan_is_wmm_ie_present(pmlan_adapter pmadapter, t_u8 *pbuf, t_u16 buf_len);
3702*4882a593Smuzhiyun 
3703*4882a593Smuzhiyun /**
3704*4882a593Smuzhiyun  *  @brief This function checks whether a station TDLS link is enabled or not
3705*4882a593Smuzhiyun  *
3706*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
3707*4882a593Smuzhiyun  *  @param mac      station mac address
3708*4882a593Smuzhiyun  *  @return
3709*4882a593Smuzhiyun  * TDLS_NOT_SETUP/TDLS_SETUP_INPROGRESS/TDLS_SETUP_COMPLETE/TDLS_SETUP_FAILURE/TDLS_TEAR_DOWN
3710*4882a593Smuzhiyun  */
3711*4882a593Smuzhiyun static INLINE tdlsStatus_e wlan_get_tdls_link_status(mlan_private *priv,
3712*4882a593Smuzhiyun 						     t_u8 *mac)
3713*4882a593Smuzhiyun {
3714*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
3715*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, mac);
3716*4882a593Smuzhiyun 	if (sta_ptr)
3717*4882a593Smuzhiyun 		return sta_ptr->status;
3718*4882a593Smuzhiyun 	return TDLS_NOT_SETUP;
3719*4882a593Smuzhiyun }
3720*4882a593Smuzhiyun 
3721*4882a593Smuzhiyun /**
3722*4882a593Smuzhiyun  *  @brief This function checks if TDLS link is in channel switching
3723*4882a593Smuzhiyun  *
3724*4882a593Smuzhiyun  *  @param status     tdls link status
3725*4882a593Smuzhiyun  *  @return         MTRUE/MFALSE
3726*4882a593Smuzhiyun  */
3727*4882a593Smuzhiyun static INLINE int wlan_is_tdls_link_chan_switching(tdlsStatus_e status)
3728*4882a593Smuzhiyun {
3729*4882a593Smuzhiyun 	return (status == TDLS_SWITCHING_CHANNEL) ? MTRUE : MFALSE;
3730*4882a593Smuzhiyun }
3731*4882a593Smuzhiyun 
3732*4882a593Smuzhiyun /**
3733*4882a593Smuzhiyun  *  @brief This function checks if send command to firmware is allowed
3734*4882a593Smuzhiyun  *
3735*4882a593Smuzhiyun  *  @param status     tdls link status
3736*4882a593Smuzhiyun  *  @return         MTRUE/MFALSE
3737*4882a593Smuzhiyun  */
3738*4882a593Smuzhiyun static INLINE int wlan_is_send_cmd_allowed(tdlsStatus_e status)
3739*4882a593Smuzhiyun {
3740*4882a593Smuzhiyun 	int ret = MTRUE;
3741*4882a593Smuzhiyun 	switch (status) {
3742*4882a593Smuzhiyun 	case TDLS_SWITCHING_CHANNEL:
3743*4882a593Smuzhiyun 	case TDLS_IN_OFF_CHANNEL:
3744*4882a593Smuzhiyun 		ret = MFALSE;
3745*4882a593Smuzhiyun 		break;
3746*4882a593Smuzhiyun 	default:
3747*4882a593Smuzhiyun 		break;
3748*4882a593Smuzhiyun 	}
3749*4882a593Smuzhiyun 	return ret;
3750*4882a593Smuzhiyun }
3751*4882a593Smuzhiyun 
3752*4882a593Smuzhiyun /**
3753*4882a593Smuzhiyun  *  @brief This function checks if TDLS link is setup
3754*4882a593Smuzhiyun  *
3755*4882a593Smuzhiyun  *  @param status     tdls link status
3756*4882a593Smuzhiyun  *  @return         MTRUE/MFALSE
3757*4882a593Smuzhiyun  */
3758*4882a593Smuzhiyun static INLINE int wlan_is_tdls_link_setup(tdlsStatus_e status)
3759*4882a593Smuzhiyun {
3760*4882a593Smuzhiyun 	int ret = MFALSE;
3761*4882a593Smuzhiyun 	switch (status) {
3762*4882a593Smuzhiyun 	case TDLS_SWITCHING_CHANNEL:
3763*4882a593Smuzhiyun 	case TDLS_IN_OFF_CHANNEL:
3764*4882a593Smuzhiyun 	case TDLS_IN_BASE_CHANNEL:
3765*4882a593Smuzhiyun 	case TDLS_SETUP_COMPLETE:
3766*4882a593Smuzhiyun 		ret = MTRUE;
3767*4882a593Smuzhiyun 		break;
3768*4882a593Smuzhiyun 	default:
3769*4882a593Smuzhiyun 		break;
3770*4882a593Smuzhiyun 	}
3771*4882a593Smuzhiyun 	return ret;
3772*4882a593Smuzhiyun }
3773*4882a593Smuzhiyun 
3774*4882a593Smuzhiyun /**
3775*4882a593Smuzhiyun  *  @brief This function checks tx_pause flag for peer
3776*4882a593Smuzhiyun  *
3777*4882a593Smuzhiyun  *  @param priv     A pointer to mlan_private
3778*4882a593Smuzhiyun  *  @param ra       Address of the receiver STA
3779*4882a593Smuzhiyun  *
3780*4882a593Smuzhiyun  *  @return         MTRUE or MFALSE
3781*4882a593Smuzhiyun  */
3782*4882a593Smuzhiyun static INLINE int wlan_is_tx_pause(mlan_private *priv, t_u8 *ra)
3783*4882a593Smuzhiyun {
3784*4882a593Smuzhiyun 	sta_node *sta_ptr = MNULL;
3785*4882a593Smuzhiyun 	sta_ptr = wlan_get_station_entry(priv, ra);
3786*4882a593Smuzhiyun 	if (sta_ptr)
3787*4882a593Smuzhiyun 		return sta_ptr->tx_pause;
3788*4882a593Smuzhiyun 	return MFALSE;
3789*4882a593Smuzhiyun }
3790*4882a593Smuzhiyun t_u16 wlan_update_ralist_tx_pause(pmlan_private priv, t_u8 *mac, t_u8 tx_pause);
3791*4882a593Smuzhiyun 
3792*4882a593Smuzhiyun #ifdef UAP_SUPPORT
3793*4882a593Smuzhiyun mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf);
3794*4882a593Smuzhiyun t_void wlan_drop_tx_pkts(pmlan_private priv);
3795*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
3796*4882a593Smuzhiyun 
3797*4882a593Smuzhiyun #ifdef UAP_SUPPORT
3798*4882a593Smuzhiyun /* process the recevied packet and bridge the packet */
3799*4882a593Smuzhiyun mlan_status wlan_uap_recv_packet(mlan_private *priv, pmlan_buffer pmbuf);
3800*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
3801*4882a593Smuzhiyun 
3802*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_custom_ie_list(pmlan_adapter pmadapter,
3803*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req,
3804*4882a593Smuzhiyun 					   t_bool send_ioctl);
3805*4882a593Smuzhiyun 
3806*4882a593Smuzhiyun mlan_status wlan_cmd_get_hw_spec(pmlan_private pmpriv,
3807*4882a593Smuzhiyun 				 HostCmd_DS_COMMAND *pcmd);
3808*4882a593Smuzhiyun mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3809*4882a593Smuzhiyun 				 t_void *pioctl_buf);
3810*4882a593Smuzhiyun #ifdef SDIO
3811*4882a593Smuzhiyun mlan_status wlan_cmd_sdio_rx_aggr_cfg(HostCmd_DS_COMMAND *pcmd,
3812*4882a593Smuzhiyun 				      t_u16 cmd_action, t_void *pdata_buf);
3813*4882a593Smuzhiyun mlan_status wlan_ret_sdio_rx_aggr_cfg(pmlan_private pmpriv,
3814*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp);
3815*4882a593Smuzhiyun #endif
3816*4882a593Smuzhiyun 
3817*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_mac_control(pmlan_adapter pmadapter,
3818*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
3819*4882a593Smuzhiyun mlan_status wlan_cmd_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
3820*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf);
3821*4882a593Smuzhiyun mlan_status wlan_ret_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3822*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
3823*4882a593Smuzhiyun 
3824*4882a593Smuzhiyun mlan_status wlan_cmd_cw_mode_ctrl(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3825*4882a593Smuzhiyun 				  t_u16 cmd_action, t_void *pdata_buf);
3826*4882a593Smuzhiyun mlan_status wlan_ret_cw_mode_ctrl(pmlan_private pmpriv,
3827*4882a593Smuzhiyun 				  HostCmd_DS_COMMAND *resp,
3828*4882a593Smuzhiyun 				  mlan_ioctl_req *pioctl_buf);
3829*4882a593Smuzhiyun 
3830*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_radio_control(pmlan_private pmpriv,
3831*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *cmd,
3832*4882a593Smuzhiyun 					  t_u16 cmd_action, t_void *pdata_buf);
3833*4882a593Smuzhiyun mlan_status wlan_ret_802_11_radio_control(pmlan_private pmpriv,
3834*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *resp,
3835*4882a593Smuzhiyun 					  mlan_ioctl_req *pioctl_buf);
3836*4882a593Smuzhiyun 
3837*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_rf_antenna(pmlan_private pmpriv,
3838*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *cmd,
3839*4882a593Smuzhiyun 				       t_u16 cmd_action, t_void *pdata_buf);
3840*4882a593Smuzhiyun mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
3841*4882a593Smuzhiyun 				       HostCmd_DS_COMMAND *resp,
3842*4882a593Smuzhiyun 				       mlan_ioctl_req *pioctl_buf);
3843*4882a593Smuzhiyun 
3844*4882a593Smuzhiyun mlan_status wlan_ret_reg_access(mlan_adapter *pmadapter, t_u16 type,
3845*4882a593Smuzhiyun 				HostCmd_DS_COMMAND *resp,
3846*4882a593Smuzhiyun 				mlan_ioctl_req *pioctl_buf);
3847*4882a593Smuzhiyun mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3848*4882a593Smuzhiyun 				mlan_ioctl_req *pioctl_buf);
3849*4882a593Smuzhiyun 
3850*4882a593Smuzhiyun mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
3851*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3852*4882a593Smuzhiyun mlan_status wlan_reg_mem_ioctl_read_eeprom(pmlan_adapter pmadapter,
3853*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req);
3854*4882a593Smuzhiyun mlan_status wlan_reg_mem_ioctl_mem_rw(pmlan_adapter pmadapter,
3855*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3856*4882a593Smuzhiyun mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3857*4882a593Smuzhiyun 				t_u16 cmd_action, t_void *pdata_buf);
3858*4882a593Smuzhiyun mlan_status wlan_cmd_mem_access(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3859*4882a593Smuzhiyun 				t_void *pdata_buf);
3860*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_mac_address(pmlan_private pmpriv,
3861*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *cmd,
3862*4882a593Smuzhiyun 					t_u16 cmd_action);
3863*4882a593Smuzhiyun mlan_status wlan_ret_802_11_mac_address(pmlan_private pmpriv,
3864*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *resp,
3865*4882a593Smuzhiyun 					mlan_ioctl_req *pioctl_buf);
3866*4882a593Smuzhiyun 
3867*4882a593Smuzhiyun int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf);
3868*4882a593Smuzhiyun t_void wlan_hold_tdls_packets(pmlan_private priv, t_u8 *mac);
3869*4882a593Smuzhiyun t_void wlan_restore_tdls_packets(pmlan_private priv, t_u8 *mac,
3870*4882a593Smuzhiyun 				 tdlsStatus_e status);
3871*4882a593Smuzhiyun t_void wlan_update_non_tdls_ralist(mlan_private *priv, t_u8 *mac,
3872*4882a593Smuzhiyun 				   t_u8 tx_pause);
3873*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tdls_config(pmlan_adapter pmadapter,
3874*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
3875*4882a593Smuzhiyun void wlan_11n_send_delba_to_peer(mlan_private *priv, t_u8 *ra);
3876*4882a593Smuzhiyun void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len);
3877*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tdls_oper(pmlan_adapter pmadapter,
3878*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3879*4882a593Smuzhiyun 
3880*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
3881*4882a593Smuzhiyun 					 pmlan_ioctl_req pioctl_req);
3882*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tdls_idle_time(pmlan_adapter pmadapter,
3883*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req);
3884*4882a593Smuzhiyun 
3885*4882a593Smuzhiyun t_void wlan_tdls_config(pmlan_private pmpriv, t_u8 enable);
3886*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_tdls_cs_channel(pmlan_adapter pmadapter,
3887*4882a593Smuzhiyun 					    pmlan_ioctl_req pioctl_req);
3888*4882a593Smuzhiyun 
3889*4882a593Smuzhiyun mlan_status wlan_get_info_ver_ext(pmlan_adapter pmadapter,
3890*4882a593Smuzhiyun 				  pmlan_ioctl_req pioctl_req);
3891*4882a593Smuzhiyun 
3892*4882a593Smuzhiyun mlan_status wlan_ioctl_link_statistic(mlan_private *pmpriv,
3893*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3894*4882a593Smuzhiyun 
3895*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_link_statistic(pmlan_private pmpriv,
3896*4882a593Smuzhiyun 					   HostCmd_DS_COMMAND *cmd,
3897*4882a593Smuzhiyun 					   t_u16 cmd_action,
3898*4882a593Smuzhiyun 					   mlan_ioctl_req *pioctl_buf);
3899*4882a593Smuzhiyun 
3900*4882a593Smuzhiyun mlan_status wlan_ret_get_link_statistic(pmlan_private pmpriv,
3901*4882a593Smuzhiyun 					HostCmd_DS_COMMAND *resp,
3902*4882a593Smuzhiyun 					mlan_ioctl_req *pioctl_buf);
3903*4882a593Smuzhiyun 
3904*4882a593Smuzhiyun mlan_status wlan_reg_rx_mgmt_ind(pmlan_adapter pmadapter,
3905*4882a593Smuzhiyun 				 pmlan_ioctl_req pioctl_req);
3906*4882a593Smuzhiyun 
3907*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
3908*4882a593Smuzhiyun mlan_status wlan_set_drvdbg(pmlan_adapter pmadapter,
3909*4882a593Smuzhiyun 			    pmlan_ioctl_req pioctl_req);
3910*4882a593Smuzhiyun #endif
3911*4882a593Smuzhiyun 
3912*4882a593Smuzhiyun mlan_status wlan_misc_hotspot_cfg(pmlan_adapter pmadapter,
3913*4882a593Smuzhiyun 				  pmlan_ioctl_req pioctl_req);
3914*4882a593Smuzhiyun 
3915*4882a593Smuzhiyun #ifdef STA_SUPPORT
3916*4882a593Smuzhiyun mlan_status wlan_misc_ext_capa_cfg(pmlan_adapter pmadapter,
3917*4882a593Smuzhiyun 				   pmlan_ioctl_req pioctl_req);
3918*4882a593Smuzhiyun 
3919*4882a593Smuzhiyun t_u32 wlan_is_ext_capa_support(mlan_private *pmpriv);
3920*4882a593Smuzhiyun #endif
3921*4882a593Smuzhiyun 
3922*4882a593Smuzhiyun #ifdef STA_SUPPORT
3923*4882a593Smuzhiyun void wlan_add_ext_capa_info_ie(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
3924*4882a593Smuzhiyun 			       t_u8 **pptlv_out);
3925*4882a593Smuzhiyun #endif
3926*4882a593Smuzhiyun 
3927*4882a593Smuzhiyun mlan_status wlan_cmd_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3928*4882a593Smuzhiyun 				t_u16 cmd_action, t_void *pdata_buf);
3929*4882a593Smuzhiyun 
3930*4882a593Smuzhiyun mlan_status wlan_ret_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3931*4882a593Smuzhiyun 				mlan_ioctl_req *pioctl_buf);
3932*4882a593Smuzhiyun 
3933*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
3934*4882a593Smuzhiyun mlan_status wlan_cmd_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
3935*4882a593Smuzhiyun 			    t_u16 cmd_action, t_u16 *pdata_buf);
3936*4882a593Smuzhiyun 
3937*4882a593Smuzhiyun mlan_status wlan_ret_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
3938*4882a593Smuzhiyun 			    mlan_ioctl_req *pioctl_buf);
3939*4882a593Smuzhiyun #endif
3940*4882a593Smuzhiyun 
3941*4882a593Smuzhiyun #define BW_20MHZ 0
3942*4882a593Smuzhiyun #define BW_40MHZ 1
3943*4882a593Smuzhiyun #define BW_80MHZ 2
3944*4882a593Smuzhiyun #define BW_160MHZ 3
3945*4882a593Smuzhiyun int wlan_add_supported_oper_class_ie(mlan_private *pmpriv, t_u8 **pptlv_out,
3946*4882a593Smuzhiyun 				     t_u8 curr_oper_class);
3947*4882a593Smuzhiyun mlan_status wlan_get_curr_oper_class(mlan_private *pmpriv, t_u8 channel,
3948*4882a593Smuzhiyun 				     t_u8 bw, t_u8 *oper_class);
3949*4882a593Smuzhiyun mlan_status wlan_check_operclass_validation(mlan_private *pmpriv, t_u8 channel,
3950*4882a593Smuzhiyun 					    t_u8 oper_class);
3951*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_operclass_validation(pmlan_adapter pmadapter,
3952*4882a593Smuzhiyun 						 mlan_ioctl_req *pioctl_req);
3953*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_oper_class(pmlan_adapter pmadapter,
3954*4882a593Smuzhiyun 				       mlan_ioctl_req *pioctl_req);
3955*4882a593Smuzhiyun 
3956*4882a593Smuzhiyun t_u16 wlan_adjust_data_rate(mlan_private *priv, t_u8 rx_rate, t_u8 rate_info);
3957*4882a593Smuzhiyun t_u8 wlan_adjust_antenna(pmlan_private priv, RxPD *prx_pd);
3958*4882a593Smuzhiyun 
3959*4882a593Smuzhiyun mlan_status wlan_misc_otp_user_data(pmlan_adapter pmadapter,
3960*4882a593Smuzhiyun 				    pmlan_ioctl_req pioctl_req);
3961*4882a593Smuzhiyun 
3962*4882a593Smuzhiyun #ifdef USB
3963*4882a593Smuzhiyun extern mlan_adapter_operations mlan_usb_ops;
3964*4882a593Smuzhiyun 
3965*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_usb_aggr_ctrl(pmlan_adapter pmadapter,
3966*4882a593Smuzhiyun 					  pmlan_ioctl_req pioctl_req);
3967*4882a593Smuzhiyun #endif
3968*4882a593Smuzhiyun 
3969*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_aggr_ctrl(pmlan_adapter pmadapter,
3970*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3971*4882a593Smuzhiyun mlan_status wlan_cmd_packet_aggr_ctrl(pmlan_private pmpriv,
3972*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
3973*4882a593Smuzhiyun 				      t_void *pdata_buf);
3974*4882a593Smuzhiyun mlan_status wlan_ret_packet_aggr_ctrl(pmlan_private pmpriv,
3975*4882a593Smuzhiyun 				      HostCmd_DS_COMMAND *resp,
3976*4882a593Smuzhiyun 				      mlan_ioctl_req *pioctl_buf);
3977*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_txcontrol(pmlan_adapter pmadapter,
3978*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
3979*4882a593Smuzhiyun 
3980*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_region(pmlan_adapter pmadapter,
3981*4882a593Smuzhiyun 				   pmlan_ioctl_req pioctl_req);
3982*4882a593Smuzhiyun 
3983*4882a593Smuzhiyun #ifdef RX_PACKET_COALESCE
3984*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_rx_pkt_coalesce_config(pmlan_adapter pmadapter,
3985*4882a593Smuzhiyun 						   pmlan_ioctl_req pioctl_req);
3986*4882a593Smuzhiyun #endif
3987*4882a593Smuzhiyun 
3988*4882a593Smuzhiyun void wlan_bt_coex_wlan_param_update_event(pmlan_private priv,
3989*4882a593Smuzhiyun 					  pmlan_buffer pevent);
3990*4882a593Smuzhiyun 
3991*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_dfs_repeater_cfg(pmlan_adapter pmadapter,
3992*4882a593Smuzhiyun 					     pmlan_ioctl_req pioctl_req);
3993*4882a593Smuzhiyun 
3994*4882a593Smuzhiyun t_bool wlan_check_interface_active(mlan_adapter *pmadapter);
3995*4882a593Smuzhiyun 
3996*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_coalesce_cfg(pmlan_adapter pmadapter,
3997*4882a593Smuzhiyun 					 pmlan_ioctl_req pioctl_req);
3998*4882a593Smuzhiyun 
3999*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_low_pwr_mode(pmlan_adapter pmadapter,
4000*4882a593Smuzhiyun 					 pmlan_ioctl_req pioctl_req);
4001*4882a593Smuzhiyun 
4002*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter,
4003*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req);
4004*4882a593Smuzhiyun 
4005*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_cwmode_ctrl(pmlan_adapter pmadapter,
4006*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
4007*4882a593Smuzhiyun 
4008*4882a593Smuzhiyun mlan_status wlan_set_mef_entry(mlan_private *pmpriv, pmlan_adapter pmadapter,
4009*4882a593Smuzhiyun 			       mef_cfg_data *pmef);
4010*4882a593Smuzhiyun mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv,
4011*4882a593Smuzhiyun 				     pmlan_adapter pmadapter);
4012*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_mef_flt_cfg(pmlan_adapter pmadapter,
4013*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
4014*4882a593Smuzhiyun 
4015*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_ind_rst_cfg(pmlan_adapter pmadapter,
4016*4882a593Smuzhiyun 					pmlan_ioctl_req pioctl_req);
4017*4882a593Smuzhiyun mlan_status wlan_cmd_ind_rst_cfg(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
4018*4882a593Smuzhiyun 				 t_void *pdata_buf);
4019*4882a593Smuzhiyun mlan_status wlan_ret_ind_rst_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4020*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
4021*4882a593Smuzhiyun 
4022*4882a593Smuzhiyun mlan_status wlan_cmd_802_11_supplicant_pmk(pmlan_private pmpriv,
4023*4882a593Smuzhiyun 					   HostCmd_DS_COMMAND *cmd,
4024*4882a593Smuzhiyun 					   t_u16 cmd_action, t_void *pdata_buf);
4025*4882a593Smuzhiyun 
4026*4882a593Smuzhiyun mlan_status wlan_ret_802_11_supplicant_pmk(pmlan_private pmpriv,
4027*4882a593Smuzhiyun 					   HostCmd_DS_COMMAND *resp,
4028*4882a593Smuzhiyun 					   mlan_ioctl_req *pioctl_buf);
4029*4882a593Smuzhiyun 
4030*4882a593Smuzhiyun mlan_status wlan_sec_ioctl_passphrase(pmlan_adapter pmadapter,
4031*4882a593Smuzhiyun 				      pmlan_ioctl_req pioctl_req);
4032*4882a593Smuzhiyun 
4033*4882a593Smuzhiyun mlan_status wlan_cmd_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
4034*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf);
4035*4882a593Smuzhiyun mlan_status wlan_ret_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4036*4882a593Smuzhiyun 				 mlan_ioctl_req *pioctl_buf);
4037*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
4038*4882a593Smuzhiyun 					mlan_ioctl_req *pioctl_req);
4039*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
4040*4882a593Smuzhiyun 				    mlan_ioctl_req *pioctl_req);
4041*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_ch_load_results(pmlan_adapter pmadapter,
4042*4882a593Smuzhiyun 					    mlan_ioctl_req *pioctl_req);
4043*4882a593Smuzhiyun mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
4044*4882a593Smuzhiyun 				 t_u16 cmd_action, t_void *pdata_buf);
4045*4882a593Smuzhiyun mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4046*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
4047*4882a593Smuzhiyun 
4048*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
4049*4882a593Smuzhiyun 				    pmlan_ioctl_req pioctl_req);
4050*4882a593Smuzhiyun void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left);
4051*4882a593Smuzhiyun 
4052*4882a593Smuzhiyun void wlan_free_fw_cfp_tables(mlan_adapter *pmadapter);
4053*4882a593Smuzhiyun 
4054*4882a593Smuzhiyun mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
4055*4882a593Smuzhiyun 				   pmlan_ioctl_req pioctl_req);
4056*4882a593Smuzhiyun 
4057*4882a593Smuzhiyun mlan_status wlan_get_cfp_table(pmlan_adapter pmadapter,
4058*4882a593Smuzhiyun 			       pmlan_ioctl_req pioctl_req);
4059*4882a593Smuzhiyun mlan_status wlan_get_cfpinfo(pmlan_adapter pmadapter,
4060*4882a593Smuzhiyun 			     pmlan_ioctl_req pioctl_req);
4061*4882a593Smuzhiyun 
4062*4882a593Smuzhiyun mlan_status wlan_cmd_get_tsf(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
4063*4882a593Smuzhiyun 			     t_u16 cmd_action);
4064*4882a593Smuzhiyun mlan_status wlan_ret_get_tsf(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4065*4882a593Smuzhiyun 			     mlan_ioctl_req *pioctl_buf);
4066*4882a593Smuzhiyun 
4067*4882a593Smuzhiyun t_u8 wlan_ft_akm_is_used(mlan_private *pmpriv, t_u8 *rsn_ie);
4068*4882a593Smuzhiyun 
4069*4882a593Smuzhiyun mlan_status wlan_clear_fw_roaming_pmk(pmlan_private pmpriv);
4070*4882a593Smuzhiyun 
4071*4882a593Smuzhiyun mlan_status wlan_get_rgchnpwr_cfg(pmlan_adapter pmadapter,
4072*4882a593Smuzhiyun 				  mlan_ioctl_req *pioctl_req);
4073*4882a593Smuzhiyun mlan_status wlan_get_chan_trpc_cfg(pmlan_adapter pmadapter,
4074*4882a593Smuzhiyun 				   mlan_ioctl_req *pioctl_req);
4075*4882a593Smuzhiyun mlan_status wlan_cmd_get_chan_trpc_config(pmlan_private pmpriv,
4076*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *cmd,
4077*4882a593Smuzhiyun 					  t_u16 cmd_action, t_void *pdata_buf);
4078*4882a593Smuzhiyun mlan_status wlan_ret_get_chan_trpc_config(pmlan_private pmpriv,
4079*4882a593Smuzhiyun 					  HostCmd_DS_COMMAND *resp,
4080*4882a593Smuzhiyun 					  mlan_ioctl_req *pioctl_buf);
4081*4882a593Smuzhiyun 
4082*4882a593Smuzhiyun mlan_status wlan_cmd_ps_inactivity_timeout(pmlan_private pmpriv,
4083*4882a593Smuzhiyun 					   HostCmd_DS_COMMAND *cmd,
4084*4882a593Smuzhiyun 					   t_u16 cmd_action, t_void *pdata_buf);
4085*4882a593Smuzhiyun 
4086*4882a593Smuzhiyun t_u8 wlan_ieee_rateid_to_mrvl_rateid(mlan_private *priv, t_u16 IeeeMacRate,
4087*4882a593Smuzhiyun 				     t_u8 *dst_mac);
4088*4882a593Smuzhiyun t_u8 wlan_mrvl_rateid_to_ieee_rateid(t_u8 rate);
4089*4882a593Smuzhiyun 
4090*4882a593Smuzhiyun t_u8 wlan_get_center_freq_idx(mlan_private *pmpriv, t_u16 band, t_u32 pri_chan,
4091*4882a593Smuzhiyun 			      t_u8 chan_bw);
4092*4882a593Smuzhiyun 
4093*4882a593Smuzhiyun mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv,
4094*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
4095*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_buf);
4096*4882a593Smuzhiyun 
4097*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_fw_dump_event(pmlan_adapter pmadapter,
4098*4882a593Smuzhiyun 					  mlan_ioctl_req *pioctl_req);
4099*4882a593Smuzhiyun mlan_status wlan_cmd_fw_dump_event(pmlan_private pmpriv,
4100*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
4101*4882a593Smuzhiyun 				   t_void *pdata_buf);
4102*4882a593Smuzhiyun 
4103*4882a593Smuzhiyun mlan_status wlan_misc_bootsleep(pmlan_adapter pmadapter,
4104*4882a593Smuzhiyun 				pmlan_ioctl_req pioctl_req);
4105*4882a593Smuzhiyun 
4106*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_dyn_bw(pmlan_adapter pmadapter,
4107*4882a593Smuzhiyun 				   mlan_ioctl_req *pioctl_req);
4108*4882a593Smuzhiyun mlan_status wlan_cmd_config_dyn_bw(pmlan_private pmpriv,
4109*4882a593Smuzhiyun 				   HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
4110*4882a593Smuzhiyun 				   t_void *pdata_buf);
4111*4882a593Smuzhiyun mlan_status wlan_ret_dyn_bw(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4112*4882a593Smuzhiyun 			    mlan_ioctl_req *pioctl_buf);
4113*4882a593Smuzhiyun 
4114*4882a593Smuzhiyun #ifdef UAP_SUPPORT
4115*4882a593Smuzhiyun /** wacp mode misc ioctl */
4116*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_wacp_mode(pmlan_adapter pmadapter,
4117*4882a593Smuzhiyun 				      mlan_ioctl_req *pioctl_req);
4118*4882a593Smuzhiyun #endif
4119*4882a593Smuzhiyun 
4120*4882a593Smuzhiyun mlan_status wlan_power_ioctl_set_get_lpm(pmlan_adapter pmadapter,
4121*4882a593Smuzhiyun 					 pmlan_ioctl_req pioctl_req);
4122*4882a593Smuzhiyun mlan_status wlan_cmd_set_get_low_power_mode_cfg(pmlan_private pmpriv,
4123*4882a593Smuzhiyun 						HostCmd_DS_COMMAND *cmd,
4124*4882a593Smuzhiyun 						t_u16 cmd_action,
4125*4882a593Smuzhiyun 						t_void *pdata_buf);
4126*4882a593Smuzhiyun mlan_status wlan_ret_set_get_low_power_mode_cfg(pmlan_private pmpriv,
4127*4882a593Smuzhiyun 						HostCmd_DS_COMMAND *resp,
4128*4882a593Smuzhiyun 						mlan_ioctl_req *pioctl_buf);
4129*4882a593Smuzhiyun 
4130*4882a593Smuzhiyun mlan_status wlan_cmd_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
4131*4882a593Smuzhiyun 			       t_u16 cmd_action, t_void *pdata_buf);
4132*4882a593Smuzhiyun mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
4133*4882a593Smuzhiyun 			       mlan_ioctl_req *pioctl_buf);
4134*4882a593Smuzhiyun 
4135*4882a593Smuzhiyun mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter,
4136*4882a593Smuzhiyun 					    pmlan_ioctl_req pioctl_req);
4137*4882a593Smuzhiyun mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv,
4138*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *cmd, t_u16 cmd_action);
4139*4882a593Smuzhiyun mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
4140*4882a593Smuzhiyun 				     HostCmd_DS_COMMAND *resp,
4141*4882a593Smuzhiyun 				     mlan_ioctl_req *pioctl_buf);
4142*4882a593Smuzhiyun 
4143*4882a593Smuzhiyun /**
4144*4882a593Smuzhiyun  *  @brief RA based queueing
4145*4882a593Smuzhiyun  *
4146*4882a593Smuzhiyun  *  @param priv             A pointer to mlan_private structure
4147*4882a593Smuzhiyun  *
4148*4882a593Smuzhiyun  *  @return                 MTRUE or MFALSE
4149*4882a593Smuzhiyun  */
4150*4882a593Smuzhiyun static INLINE t_u8 queuing_ra_based(pmlan_private priv)
4151*4882a593Smuzhiyun {
4152*4882a593Smuzhiyun 	/*
4153*4882a593Smuzhiyun 	 * Currently we assume if we are in Infra, then DA=RA. This might not be
4154*4882a593Smuzhiyun 	 * true in the future
4155*4882a593Smuzhiyun 	 */
4156*4882a593Smuzhiyun 	if ((priv->bss_mode == MLAN_BSS_MODE_INFRA) &&
4157*4882a593Smuzhiyun 	    (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA))
4158*4882a593Smuzhiyun 		return MFALSE;
4159*4882a593Smuzhiyun 
4160*4882a593Smuzhiyun 	return MTRUE;
4161*4882a593Smuzhiyun }
4162*4882a593Smuzhiyun 
4163*4882a593Smuzhiyun /**
4164*4882a593Smuzhiyun  *  @brief Copy Rates
4165*4882a593Smuzhiyun  *
4166*4882a593Smuzhiyun  *  @param dest             A pointer to Dest Buf
4167*4882a593Smuzhiyun  *  @param pos		        The position for copy
4168*4882a593Smuzhiyun  *  @param src		        A pointer to Src Buf
4169*4882a593Smuzhiyun  *  @param len              The len of Src Buf
4170*4882a593Smuzhiyun  *
4171*4882a593Smuzhiyun  *  @return                 Number of Rates copied
4172*4882a593Smuzhiyun  */
4173*4882a593Smuzhiyun static INLINE t_u32 wlan_copy_rates(t_u8 *dest, t_u32 pos, t_u8 *src, int len)
4174*4882a593Smuzhiyun {
4175*4882a593Smuzhiyun 	int i;
4176*4882a593Smuzhiyun 
4177*4882a593Smuzhiyun 	for (i = 0; i < len && src[i]; i++, pos++) {
4178*4882a593Smuzhiyun 		if (pos >= sizeof(WLAN_802_11_RATES))
4179*4882a593Smuzhiyun 			break;
4180*4882a593Smuzhiyun 		dest[pos] = src[i];
4181*4882a593Smuzhiyun 	}
4182*4882a593Smuzhiyun 
4183*4882a593Smuzhiyun 	return pos;
4184*4882a593Smuzhiyun }
4185*4882a593Smuzhiyun 
4186*4882a593Smuzhiyun /**
4187*4882a593Smuzhiyun  *  @brief strlen
4188*4882a593Smuzhiyun  *
4189*4882a593Smuzhiyun  *  @param str		        A pointer to string
4190*4882a593Smuzhiyun  *
4191*4882a593Smuzhiyun  *  @return                 Length of string
4192*4882a593Smuzhiyun  */
4193*4882a593Smuzhiyun static INLINE t_u32 wlan_strlen(const char *str)
4194*4882a593Smuzhiyun {
4195*4882a593Smuzhiyun 	t_u32 i;
4196*4882a593Smuzhiyun 
4197*4882a593Smuzhiyun 	for (i = 0; str[i] != 0; i++)
4198*4882a593Smuzhiyun 		;
4199*4882a593Smuzhiyun 
4200*4882a593Smuzhiyun 	return i;
4201*4882a593Smuzhiyun }
4202*4882a593Smuzhiyun 
4203*4882a593Smuzhiyun /**
4204*4882a593Smuzhiyun  *  @brief iscdigit
4205*4882a593Smuzhiyun  *
4206*4882a593Smuzhiyun  *  @param chr                  A char
4207*4882a593Smuzhiyun  *
4208*4882a593Smuzhiyun  *  @return                     Non zero if chr is a hex, else 0
4209*4882a593Smuzhiyun  */
4210*4882a593Smuzhiyun static INLINE t_u32 wlan_isxdigit(t_u8 chr)
4211*4882a593Smuzhiyun {
4212*4882a593Smuzhiyun 	return (chr <= 'f' && chr >= 'a') || (chr <= 'F' && chr >= 'A') ||
4213*4882a593Smuzhiyun 	       (chr <= '9' && chr >= '0');
4214*4882a593Smuzhiyun }
4215*4882a593Smuzhiyun 
4216*4882a593Smuzhiyun /**
4217*4882a593Smuzhiyun  *  @brief isspace
4218*4882a593Smuzhiyun  *
4219*4882a593Smuzhiyun  *  @param                       A chr
4220*4882a593Smuzhiyun  *
4221*4882a593Smuzhiyun  *  @return                      Non zero if chr is space etc, else 0
4222*4882a593Smuzhiyun  */
4223*4882a593Smuzhiyun static INLINE t_u32 wlan_isspace(t_u8 chr)
4224*4882a593Smuzhiyun {
4225*4882a593Smuzhiyun 	return chr <= ' ' && (chr == ' ' || (chr <= 13 && chr >= 9));
4226*4882a593Smuzhiyun }
4227*4882a593Smuzhiyun 
4228*4882a593Smuzhiyun /** delay unit */
4229*4882a593Smuzhiyun typedef enum _delay_unit {
4230*4882a593Smuzhiyun 	USEC,
4231*4882a593Smuzhiyun 	MSEC,
4232*4882a593Smuzhiyun 	SEC,
4233*4882a593Smuzhiyun } t_delay_unit;
4234*4882a593Smuzhiyun 
4235*4882a593Smuzhiyun /** delay function */
4236*4882a593Smuzhiyun t_void wlan_delay_func(mlan_adapter *pmadapter, t_u32 delay, t_delay_unit u);
4237*4882a593Smuzhiyun 
4238*4882a593Smuzhiyun /** delay function wrapper */
4239*4882a593Smuzhiyun #define wlan_delay(p, n) wlan_delay_func(p, n, SEC)
4240*4882a593Smuzhiyun /** delay function wrapper */
4241*4882a593Smuzhiyun #define wlan_mdelay(p, n) wlan_delay_func(p, n, MSEC)
4242*4882a593Smuzhiyun /** delay function wrapper */
4243*4882a593Smuzhiyun #define wlan_udelay(p, n) wlan_delay_func(p, n, USEC)
4244*4882a593Smuzhiyun 
4245*4882a593Smuzhiyun /**
4246*4882a593Smuzhiyun  *  @brief This function check if there are pending cmd
4247*4882a593Smuzhiyun  *         in cmd pending Q
4248*4882a593Smuzhiyun  *
4249*4882a593Smuzhiyun  *  @param pmadapter  A pointer to mlan_adapter structure
4250*4882a593Smuzhiyun  *
4251*4882a593Smuzhiyun  *  @return  MTRUE -- cmd pending
4252*4882a593Smuzhiyun  *           MFALSE -- no pending cmd
4253*4882a593Smuzhiyun  */
4254*4882a593Smuzhiyun static INLINE int wlan_is_cmd_pending(mlan_adapter *pmadapter)
4255*4882a593Smuzhiyun {
4256*4882a593Smuzhiyun 	int ret;
4257*4882a593Smuzhiyun 	cmd_ctrl_node *pcmd_node = MNULL;
4258*4882a593Smuzhiyun 	wlan_request_cmd_lock(pmadapter);
4259*4882a593Smuzhiyun 	pcmd_node = (cmd_ctrl_node *)util_peek_list(pmadapter->pmoal_handle,
4260*4882a593Smuzhiyun 						    &pmadapter->cmd_pending_q,
4261*4882a593Smuzhiyun 						    MNULL, MNULL);
4262*4882a593Smuzhiyun 	if (pcmd_node)
4263*4882a593Smuzhiyun 		ret = MTRUE;
4264*4882a593Smuzhiyun 	else
4265*4882a593Smuzhiyun 		ret = MFALSE;
4266*4882a593Smuzhiyun 	wlan_release_cmd_lock(pmadapter);
4267*4882a593Smuzhiyun 	return ret;
4268*4882a593Smuzhiyun }
4269*4882a593Smuzhiyun 
4270*4882a593Smuzhiyun /** Get BSS number from priv */
4271*4882a593Smuzhiyun #define GET_BSS_NUM(priv) ((priv)->bss_num)
4272*4882a593Smuzhiyun 
4273*4882a593Smuzhiyun /**
4274*4882a593Smuzhiyun  *  @brief This function returns priv based on the BSS num and BSS type
4275*4882a593Smuzhiyun  *
4276*4882a593Smuzhiyun  *  @param pmadapter A pointer to mlan_adapter
4277*4882a593Smuzhiyun  *  @param bss_num   BSS number
4278*4882a593Smuzhiyun  *  @param bss_type  BSS type
4279*4882a593Smuzhiyun  *
4280*4882a593Smuzhiyun  *  @return          Pointer to mlan_private
4281*4882a593Smuzhiyun  */
4282*4882a593Smuzhiyun static INLINE mlan_private *wlan_get_priv_by_id(mlan_adapter *pmadapter,
4283*4882a593Smuzhiyun 						t_u32 bss_num, t_u32 bss_type)
4284*4882a593Smuzhiyun {
4285*4882a593Smuzhiyun 	int i;
4286*4882a593Smuzhiyun 
4287*4882a593Smuzhiyun 	for (i = 0; i < MIN(pmadapter->priv_num, MLAN_MAX_BSS_NUM); i++) {
4288*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
4289*4882a593Smuzhiyun 			if ((pmadapter->priv[i]->bss_num == bss_num) &&
4290*4882a593Smuzhiyun 			    (pmadapter->priv[i]->bss_type == bss_type))
4291*4882a593Smuzhiyun 				return pmadapter->priv[i];
4292*4882a593Smuzhiyun 		}
4293*4882a593Smuzhiyun 	}
4294*4882a593Smuzhiyun 	return MNULL;
4295*4882a593Smuzhiyun }
4296*4882a593Smuzhiyun 
4297*4882a593Smuzhiyun /**
4298*4882a593Smuzhiyun  *  @brief This function returns first available priv
4299*4882a593Smuzhiyun  *  based on the BSS role
4300*4882a593Smuzhiyun  *
4301*4882a593Smuzhiyun  *  @param pmadapter A pointer to mlan_adapter
4302*4882a593Smuzhiyun  *  @param bss_role  BSS role or MLAN_BSS_ROLE_ANY
4303*4882a593Smuzhiyun  *
4304*4882a593Smuzhiyun  *  @return          Pointer to mlan_private
4305*4882a593Smuzhiyun  */
4306*4882a593Smuzhiyun static INLINE mlan_private *wlan_get_priv(mlan_adapter *pmadapter,
4307*4882a593Smuzhiyun 					  mlan_bss_role bss_role)
4308*4882a593Smuzhiyun {
4309*4882a593Smuzhiyun 	int i;
4310*4882a593Smuzhiyun 
4311*4882a593Smuzhiyun 	for (i = 0; i < MIN(pmadapter->priv_num, MLAN_MAX_BSS_NUM); i++) {
4312*4882a593Smuzhiyun 		if (pmadapter->priv[i]) {
4313*4882a593Smuzhiyun 			if (bss_role == MLAN_BSS_ROLE_ANY ||
4314*4882a593Smuzhiyun 			    GET_BSS_ROLE(pmadapter->priv[i]) == bss_role)
4315*4882a593Smuzhiyun 				return pmadapter->priv[i];
4316*4882a593Smuzhiyun 		}
4317*4882a593Smuzhiyun 	}
4318*4882a593Smuzhiyun 	return MNULL;
4319*4882a593Smuzhiyun }
4320*4882a593Smuzhiyun 
4321*4882a593Smuzhiyun /**
4322*4882a593Smuzhiyun  *  @brief This function counts the number of occurences for a certain
4323*4882a593Smuzhiyun  *  condition among privs.  Which privs are checked can be configured
4324*4882a593Smuzhiyun  *  via a second condition.
4325*4882a593Smuzhiyun  *
4326*4882a593Smuzhiyun  *  @param pmadapter  A pointer to mlan_adapter
4327*4882a593Smuzhiyun  *  @param count_cond Function pointer to condition to count on privs
4328*4882a593Smuzhiyun  *  @param check_cond Function pointer to condition to decide whether priv
4329*4882a593Smuzhiyun  *                    should be counted or not.  Use MNULL to check all privs.
4330*4882a593Smuzhiyun  *
4331*4882a593Smuzhiyun  *  @return          Count of privs where count_cond returned MTRUE.
4332*4882a593Smuzhiyun  */
4333*4882a593Smuzhiyun static INLINE int
4334*4882a593Smuzhiyun wlan_count_priv_cond(mlan_adapter *pmadapter,
4335*4882a593Smuzhiyun 		     t_bool (*count_cond)(pmlan_private pmpriv),
4336*4882a593Smuzhiyun 		     t_bool (*check_cond)(pmlan_private pmpriv))
4337*4882a593Smuzhiyun {
4338*4882a593Smuzhiyun 	pmlan_private pmpriv;
4339*4882a593Smuzhiyun 	int count = 0;
4340*4882a593Smuzhiyun 	int i;
4341*4882a593Smuzhiyun 
4342*4882a593Smuzhiyun 	if (pmadapter == MNULL || count_cond == MNULL)
4343*4882a593Smuzhiyun 		return 0;
4344*4882a593Smuzhiyun 
4345*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
4346*4882a593Smuzhiyun 		pmpriv = pmadapter->priv[i];
4347*4882a593Smuzhiyun 		if (pmpriv) {
4348*4882a593Smuzhiyun 			if ((check_cond == MNULL) ||
4349*4882a593Smuzhiyun 			    (check_cond && check_cond(pmpriv))) {
4350*4882a593Smuzhiyun 				if (count_cond(pmpriv))
4351*4882a593Smuzhiyun 					count++;
4352*4882a593Smuzhiyun 			}
4353*4882a593Smuzhiyun 		}
4354*4882a593Smuzhiyun 	}
4355*4882a593Smuzhiyun 
4356*4882a593Smuzhiyun 	return count;
4357*4882a593Smuzhiyun }
4358*4882a593Smuzhiyun 
4359*4882a593Smuzhiyun /**
4360*4882a593Smuzhiyun  *  @brief This function runs a procedure on each priv.
4361*4882a593Smuzhiyun  *  Which privs it is run on can be configured via a condition.
4362*4882a593Smuzhiyun  *
4363*4882a593Smuzhiyun  *  @param pmadapter  A pointer to mlan_adapter
4364*4882a593Smuzhiyun  *  @param operation  Function pointer to produedure to operate on priv
4365*4882a593Smuzhiyun  *  @param check_cond Function pointer to condition to decide whether priv
4366*4882a593Smuzhiyun  *                    operated on or not.  Use MNULL to run on all privs.
4367*4882a593Smuzhiyun  *
4368*4882a593Smuzhiyun  *  @return           Number of privs that operation was run on.
4369*4882a593Smuzhiyun  */
4370*4882a593Smuzhiyun static INLINE int
4371*4882a593Smuzhiyun wlan_do_task_on_privs(mlan_adapter *pmadapter,
4372*4882a593Smuzhiyun 		      t_void (*operation)(pmlan_private pmpriv),
4373*4882a593Smuzhiyun 		      t_bool (*check_cond)(pmlan_private pmpriv))
4374*4882a593Smuzhiyun {
4375*4882a593Smuzhiyun 	pmlan_private pmpriv;
4376*4882a593Smuzhiyun 	int count = 0;
4377*4882a593Smuzhiyun 	int i;
4378*4882a593Smuzhiyun 
4379*4882a593Smuzhiyun 	if (pmadapter == MNULL || operation == MNULL)
4380*4882a593Smuzhiyun 		return 0;
4381*4882a593Smuzhiyun 
4382*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
4383*4882a593Smuzhiyun 		pmpriv = pmadapter->priv[i];
4384*4882a593Smuzhiyun 		if (pmpriv) {
4385*4882a593Smuzhiyun 			if ((check_cond == MNULL) ||
4386*4882a593Smuzhiyun 			    (check_cond && check_cond(pmpriv))) {
4387*4882a593Smuzhiyun 				operation(pmpriv);
4388*4882a593Smuzhiyun 				count++;
4389*4882a593Smuzhiyun 			}
4390*4882a593Smuzhiyun 		}
4391*4882a593Smuzhiyun 	}
4392*4882a593Smuzhiyun 
4393*4882a593Smuzhiyun 	return count;
4394*4882a593Smuzhiyun }
4395*4882a593Smuzhiyun 
4396*4882a593Smuzhiyun /**
4397*4882a593Smuzhiyun  *  @brief This function builds a list of privs that test for a condition
4398*4882a593Smuzhiyun  *  This is useful if you need to do a number of operations on the same set
4399*4882a593Smuzhiyun  *  of privs.  For one-off tasks, the above two functions might be better.
4400*4882a593Smuzhiyun  *
4401*4882a593Smuzhiyun  *  @param pmadapter  A pointer to mlan_adapter
4402*4882a593Smuzhiyun  *  @param check_cond Function pointer to condition to decide whether priv
4403*4882a593Smuzhiyun  *                    should be placed in the list.
4404*4882a593Smuzhiyun  *  @param ppriv_list Output param.  Externally supplied array of mlan_private*
4405*4882a593Smuzhiyun  *                    to hold priv's that test positive with check_cond.
4406*4882a593Smuzhiyun  *                    Array size should be at least pmadapter->priv_num.
4407*4882a593Smuzhiyun  *
4408*4882a593Smuzhiyun  *  @return          Number of privs in ppriv_list
4409*4882a593Smuzhiyun  *
4410*4882a593Smuzhiyun  *  @sa              wlan_count_priv_cond
4411*4882a593Smuzhiyun  */
4412*4882a593Smuzhiyun static INLINE int
4413*4882a593Smuzhiyun wlan_get_privs_by_cond(mlan_adapter *pmadapter,
4414*4882a593Smuzhiyun 		       t_bool (*check_cond)(pmlan_private pmpriv),
4415*4882a593Smuzhiyun 		       mlan_private **ppriv_list)
4416*4882a593Smuzhiyun {
4417*4882a593Smuzhiyun 	pmlan_private pmpriv;
4418*4882a593Smuzhiyun 	int count = 0;
4419*4882a593Smuzhiyun 	int i;
4420*4882a593Smuzhiyun 
4421*4882a593Smuzhiyun 	if (pmadapter == MNULL || check_cond == MNULL || ppriv_list == MNULL)
4422*4882a593Smuzhiyun 		return 0;
4423*4882a593Smuzhiyun 
4424*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
4425*4882a593Smuzhiyun 		pmpriv = pmadapter->priv[i];
4426*4882a593Smuzhiyun 		if (pmpriv) {
4427*4882a593Smuzhiyun 			if (check_cond(pmpriv))
4428*4882a593Smuzhiyun 				ppriv_list[count++] = pmpriv;
4429*4882a593Smuzhiyun 		}
4430*4882a593Smuzhiyun 	}
4431*4882a593Smuzhiyun 
4432*4882a593Smuzhiyun 	return count;
4433*4882a593Smuzhiyun }
4434*4882a593Smuzhiyun 
4435*4882a593Smuzhiyun /**
4436*4882a593Smuzhiyun  *  @brief This function builds a list of privs that test against two conditions
4437*4882a593Smuzhiyun  *  This is useful if you need to do a number of operations on the same set
4438*4882a593Smuzhiyun  *  of privs.  Can choose whether both conditions (AND) or either condition (OR)
4439*4882a593Smuzhiyun  *  is required.
4440*4882a593Smuzhiyun  *
4441*4882a593Smuzhiyun  *  @param pmadapter      A pointer to mlan_adapter
4442*4882a593Smuzhiyun  *  @param check_cond     Function pointer to condition to decide whether priv
4443*4882a593Smuzhiyun  *                        should be placed in the list.
4444*4882a593Smuzhiyun  *  @param check_cond_2   Function pointer to second condition to check.
4445*4882a593Smuzhiyun  *  @param and_conditions If MTRUE, both conditions must be met (AND),
4446*4882a593Smuzhiyun  *                        else either condition can be met (OR).
4447*4882a593Smuzhiyun  *  @param ppriv_list     Output param.  Externally supplied array of
4448*4882a593Smuzhiyun  * mlan_private* to hold priv's that test positive with check_cond. Array size
4449*4882a593Smuzhiyun  * should be at least pmadapter->priv_num.
4450*4882a593Smuzhiyun  *
4451*4882a593Smuzhiyun  *  @return          Number of privs in ppriv_list
4452*4882a593Smuzhiyun  *
4453*4882a593Smuzhiyun  *  @sa              wlan_count_priv_cond, wlan_get_privs_by_cond
4454*4882a593Smuzhiyun  */
4455*4882a593Smuzhiyun static INLINE int
4456*4882a593Smuzhiyun wlan_get_privs_by_two_cond(mlan_adapter *pmadapter,
4457*4882a593Smuzhiyun 			   t_bool (*check_cond)(pmlan_private pmpriv),
4458*4882a593Smuzhiyun 			   t_bool (*check_cond_2)(pmlan_private pmpriv),
4459*4882a593Smuzhiyun 			   t_bool and_conditions, mlan_private **ppriv_list)
4460*4882a593Smuzhiyun {
4461*4882a593Smuzhiyun 	pmlan_private pmpriv;
4462*4882a593Smuzhiyun 	int count = 0;
4463*4882a593Smuzhiyun 	int i;
4464*4882a593Smuzhiyun 
4465*4882a593Smuzhiyun 	if (pmadapter == MNULL || check_cond == MNULL ||
4466*4882a593Smuzhiyun 	    check_cond_2 == MNULL || ppriv_list == MNULL)
4467*4882a593Smuzhiyun 		return 0;
4468*4882a593Smuzhiyun 
4469*4882a593Smuzhiyun 	for (i = 0; i < pmadapter->priv_num; i++) {
4470*4882a593Smuzhiyun 		pmpriv = pmadapter->priv[i];
4471*4882a593Smuzhiyun 		if (pmpriv) {
4472*4882a593Smuzhiyun 			if (and_conditions) {
4473*4882a593Smuzhiyun 				if (check_cond(pmpriv) && check_cond_2(pmpriv))
4474*4882a593Smuzhiyun 					ppriv_list[count++] = pmpriv;
4475*4882a593Smuzhiyun 			} else {
4476*4882a593Smuzhiyun 				if (check_cond(pmpriv) || check_cond_2(pmpriv))
4477*4882a593Smuzhiyun 					ppriv_list[count++] = pmpriv;
4478*4882a593Smuzhiyun 			}
4479*4882a593Smuzhiyun 		}
4480*4882a593Smuzhiyun 	}
4481*4882a593Smuzhiyun 
4482*4882a593Smuzhiyun 	return count;
4483*4882a593Smuzhiyun }
4484*4882a593Smuzhiyun #endif /* !_MLAN_MAIN_H_ */
4485