xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/nxp/mlinux/mlan_decl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /** @file mlan_decl.h
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  *  @brief This file declares the generic data structures and APIs.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *  Copyright 2008-2022 NXP
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  *  This software file (the File) is distributed by NXP
9*4882a593Smuzhiyun  *  under the terms of the GNU General Public License Version 2, June 1991
10*4882a593Smuzhiyun  *  (the License).  You may use, redistribute and/or modify the File in
11*4882a593Smuzhiyun  *  accordance with the terms and conditions of the License, a copy of which
12*4882a593Smuzhiyun  *  is available by writing to the Free Software Foundation, Inc.,
13*4882a593Smuzhiyun  *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
14*4882a593Smuzhiyun  *  worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
15*4882a593Smuzhiyun  *
16*4882a593Smuzhiyun  *  THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
17*4882a593Smuzhiyun  *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
18*4882a593Smuzhiyun  *  ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
19*4882a593Smuzhiyun  *  this warranty disclaimer.
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #ifndef _MLAN_DECL_H_
24*4882a593Smuzhiyun #define _MLAN_DECL_H_
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /** MLAN release version */
27*4882a593Smuzhiyun #define MLAN_RELEASE_VERSION "366.p5"
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /** Re-define generic data types for MLAN/MOAL */
30*4882a593Smuzhiyun /** Signed char (1-byte) */
31*4882a593Smuzhiyun typedef signed char t_s8, *t_ps8;
32*4882a593Smuzhiyun /** Unsigned char (1-byte) */
33*4882a593Smuzhiyun typedef unsigned char t_u8, *t_pu8;
34*4882a593Smuzhiyun /** Signed short (2-bytes) */
35*4882a593Smuzhiyun typedef short t_s16, *t_ps16;
36*4882a593Smuzhiyun /** Unsigned short (2-bytes) */
37*4882a593Smuzhiyun typedef unsigned short t_u16, *t_pu16;
38*4882a593Smuzhiyun /** Signed long (4-bytes) */
39*4882a593Smuzhiyun typedef int t_s32, *t_ps32;
40*4882a593Smuzhiyun /** Unsigned long (4-bytes) */
41*4882a593Smuzhiyun typedef unsigned int t_u32, *t_pu32;
42*4882a593Smuzhiyun /** Signed long long 8-bytes) */
43*4882a593Smuzhiyun typedef long long t_s64, *t_ps64;
44*4882a593Smuzhiyun /** Unsigned long long 8-bytes) */
45*4882a593Smuzhiyun typedef unsigned long long t_u64, *t_pu64;
46*4882a593Smuzhiyun /** Void pointer (4-bytes) */
47*4882a593Smuzhiyun typedef void t_void, *t_pvoid;
48*4882a593Smuzhiyun /** Size type */
49*4882a593Smuzhiyun typedef t_u32 t_size;
50*4882a593Smuzhiyun /** Boolean type */
51*4882a593Smuzhiyun typedef t_u8 t_bool;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun #ifdef MLAN_64BIT
54*4882a593Smuzhiyun /** Pointer type (64-bit) */
55*4882a593Smuzhiyun typedef t_u64 t_ptr;
56*4882a593Smuzhiyun /** Signed value (64-bit) */
57*4882a593Smuzhiyun typedef t_s64 t_sval;
58*4882a593Smuzhiyun #else
59*4882a593Smuzhiyun /** Pointer type (32-bit) */
60*4882a593Smuzhiyun typedef t_u32 t_ptr;
61*4882a593Smuzhiyun /** Signed value (32-bit) */
62*4882a593Smuzhiyun typedef t_s32 t_sval;
63*4882a593Smuzhiyun #endif
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /** Constants below */
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #ifdef __GNUC__
68*4882a593Smuzhiyun /** Structure packing begins */
69*4882a593Smuzhiyun #define MLAN_PACK_START
70*4882a593Smuzhiyun /** Structure packeing end */
71*4882a593Smuzhiyun #define MLAN_PACK_END __attribute__((packed))
72*4882a593Smuzhiyun #else /* !__GNUC__ */
73*4882a593Smuzhiyun #ifdef PRAGMA_PACK
74*4882a593Smuzhiyun /** Structure packing begins */
75*4882a593Smuzhiyun #define MLAN_PACK_START
76*4882a593Smuzhiyun /** Structure packeing end */
77*4882a593Smuzhiyun #define MLAN_PACK_END
78*4882a593Smuzhiyun #else /* !PRAGMA_PACK */
79*4882a593Smuzhiyun /** Structure packing begins */
80*4882a593Smuzhiyun #define MLAN_PACK_START __packed
81*4882a593Smuzhiyun /** Structure packing end */
82*4882a593Smuzhiyun #define MLAN_PACK_END
83*4882a593Smuzhiyun #endif /* PRAGMA_PACK */
84*4882a593Smuzhiyun #endif /* __GNUC__ */
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #ifndef INLINE
87*4882a593Smuzhiyun #ifdef __GNUC__
88*4882a593Smuzhiyun /** inline directive */
89*4882a593Smuzhiyun #define INLINE inline
90*4882a593Smuzhiyun #else
91*4882a593Smuzhiyun /** inline directive */
92*4882a593Smuzhiyun #define INLINE __inline
93*4882a593Smuzhiyun #endif
94*4882a593Smuzhiyun #endif
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun /** MLAN TRUE */
97*4882a593Smuzhiyun #define MTRUE (1)
98*4882a593Smuzhiyun /** MLAN FALSE */
99*4882a593Smuzhiyun #define MFALSE (0)
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun #define CHANNEL_SPEC_SNIFFER_MODE 1
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #ifndef MACSTR
104*4882a593Smuzhiyun /** MAC address security format */
105*4882a593Smuzhiyun #define MACSTR "%02x:XX:XX:XX:%02x:%02x"
106*4882a593Smuzhiyun #endif
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #ifndef MAC2STR
109*4882a593Smuzhiyun /** MAC address security print arguments */
110*4882a593Smuzhiyun #define MAC2STR(a) (a)[0], (a)[4], (a)[5]
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #ifndef FULL_MACSTR
114*4882a593Smuzhiyun #define FULL_MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
115*4882a593Smuzhiyun #endif
116*4882a593Smuzhiyun #ifndef FULL_MAC2STR
117*4882a593Smuzhiyun #define FULL_MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
118*4882a593Smuzhiyun #endif
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /** Macros for Data Alignment : size */
121*4882a593Smuzhiyun #define ALIGN_SZ(p, a) (((p) + ((a)-1)) & ~((a)-1))
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun /** Macros for Data Alignment : address */
124*4882a593Smuzhiyun #define ALIGN_ADDR(p, a)                                                       \
125*4882a593Smuzhiyun 	((((t_ptr)(p)) + (((t_ptr)(a)) - 1)) & ~(((t_ptr)(a)) - 1))
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /** Return the byte offset of a field in the given structure */
128*4882a593Smuzhiyun #define MLAN_FIELD_OFFSET(type, field) ((t_u32)(t_ptr) & (((type *)0)->field))
129*4882a593Smuzhiyun /** Return aligned offset */
130*4882a593Smuzhiyun #define OFFSET_ALIGN_ADDR(p, a) (t_u32)(ALIGN_ADDR(p, a) - (t_ptr)p)
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun /** Maximum BSS numbers */
133*4882a593Smuzhiyun #define MLAN_MAX_BSS_NUM (16)
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun /** NET IP alignment */
136*4882a593Smuzhiyun #define MLAN_NET_IP_ALIGN 2
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun /** US country code */
139*4882a593Smuzhiyun #define COUNTRY_CODE_US 0x10
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun /** DMA alignment */
142*4882a593Smuzhiyun /* SDIO3.0 Inrevium Adapter require 32 bit DMA alignment */
143*4882a593Smuzhiyun #define DMA_ALIGNMENT 32
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /** max size of TxPD */
146*4882a593Smuzhiyun #define MAX_TXPD_SIZE 32
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /** Minimum data header length */
149*4882a593Smuzhiyun #define MLAN_MIN_DATA_HEADER_LEN (DMA_ALIGNMENT + MAX_TXPD_SIZE)
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun /** rx data header length */
152*4882a593Smuzhiyun #define MLAN_RX_HEADER_LEN MLAN_MIN_DATA_HEADER_LEN
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /** This is current limit on Maximum Tx AMPDU allowed */
155*4882a593Smuzhiyun #define MLAN_MAX_TX_BASTREAM_SUPPORTED 16
156*4882a593Smuzhiyun #define MLAN_MAX_TX_BASTREAM_DEFAULT 2
157*4882a593Smuzhiyun /** This is current limit on Maximum Rx AMPDU allowed */
158*4882a593Smuzhiyun #define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #ifdef STA_SUPPORT
161*4882a593Smuzhiyun /** Default Win size attached during ADDBA request */
162*4882a593Smuzhiyun #define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
163*4882a593Smuzhiyun /** Default Win size attached during ADDBA response */
164*4882a593Smuzhiyun #define MLAN_STA_AMPDU_DEF_RXWINSIZE 64
165*4882a593Smuzhiyun /** RX winsize for COEX */
166*4882a593Smuzhiyun #define MLAN_STA_COEX_AMPDU_DEF_RXWINSIZE 16
167*4882a593Smuzhiyun #endif /* STA_SUPPORT */
168*4882a593Smuzhiyun #ifdef UAP_SUPPORT
169*4882a593Smuzhiyun /** Default Win size attached during ADDBA request */
170*4882a593Smuzhiyun #define MLAN_UAP_AMPDU_DEF_TXWINSIZE 64
171*4882a593Smuzhiyun /** Default Win size attached during ADDBA response */
172*4882a593Smuzhiyun #define MLAN_UAP_AMPDU_DEF_RXWINSIZE 64
173*4882a593Smuzhiyun /** RX winsize for COEX */
174*4882a593Smuzhiyun #define MLAN_UAP_COEX_AMPDU_DEF_RXWINSIZE 16
175*4882a593Smuzhiyun #endif /* UAP_SUPPORT */
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun #ifdef WIFI_DIRECT_SUPPORT
178*4882a593Smuzhiyun /** WFD use the same window size for tx/rx */
179*4882a593Smuzhiyun #define MLAN_WFD_AMPDU_DEF_TXRXWINSIZE 64
180*4882a593Smuzhiyun /** RX winsize for COEX */
181*4882a593Smuzhiyun #define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16
182*4882a593Smuzhiyun #endif
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun /** Block ack timeout value */
185*4882a593Smuzhiyun #define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
186*4882a593Smuzhiyun /** Maximum Tx Win size configured for ADDBA request [10 bits] */
187*4882a593Smuzhiyun #define MLAN_AMPDU_MAX_TXWINSIZE 0x3ff
188*4882a593Smuzhiyun /** Maximum Rx Win size configured for ADDBA request [10 bits] */
189*4882a593Smuzhiyun #define MLAN_AMPDU_MAX_RXWINSIZE 0x3ff
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /** Rate index for HR/DSSS 0 */
192*4882a593Smuzhiyun #define MLAN_RATE_INDEX_HRDSSS0 0
193*4882a593Smuzhiyun /** Rate index for HR/DSSS 3 */
194*4882a593Smuzhiyun #define MLAN_RATE_INDEX_HRDSSS3 3
195*4882a593Smuzhiyun /** Rate index for OFDM 0 */
196*4882a593Smuzhiyun #define MLAN_RATE_INDEX_OFDM0 4
197*4882a593Smuzhiyun /** Rate index for OFDM 7 */
198*4882a593Smuzhiyun #define MLAN_RATE_INDEX_OFDM7 11
199*4882a593Smuzhiyun /** Rate index for MCS 0 */
200*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS0 0
201*4882a593Smuzhiyun /** Rate index for MCS 2 */
202*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS2 2
203*4882a593Smuzhiyun /** Rate index for MCS 4 */
204*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS4 4
205*4882a593Smuzhiyun /** Rate index for MCS 7 */
206*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS7 7
207*4882a593Smuzhiyun /** Rate index for MCS 9 */
208*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS9 9
209*4882a593Smuzhiyun /** Rate index for MCS11 */
210*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS11 11
211*4882a593Smuzhiyun /** Rate index for MCS15 */
212*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS15 15
213*4882a593Smuzhiyun /** Rate index for MCS 32 */
214*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS32 32
215*4882a593Smuzhiyun /** Rate index for MCS 127 */
216*4882a593Smuzhiyun #define MLAN_RATE_INDEX_MCS127 127
217*4882a593Smuzhiyun #define MLAN_RATE_NSS1 1
218*4882a593Smuzhiyun #define MLAN_RATE_NSS2 2
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /** Rate bitmap for OFDM 0 */
221*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_OFDM0 16
222*4882a593Smuzhiyun /** Rate bitmap for OFDM 7 */
223*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_OFDM7 23
224*4882a593Smuzhiyun /** Rate bitmap for MCS 0 */
225*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_MCS0 32
226*4882a593Smuzhiyun /** Rate bitmap for MCS 127 */
227*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_MCS127 159
228*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_NSS1_MCS0 160
229*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_NSS1_MCS9 169
230*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_NSS2_MCS0 176
231*4882a593Smuzhiyun #define MLAN_RATE_BITMAP_NSS2_MCS9 185
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /** MU beamformer */
234*4882a593Smuzhiyun #define DEFALUT_11AC_CAP_BEAMFORMING_RESET_MASK (MBIT(19))
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /** Size of rx data buffer 3839+256 */
237*4882a593Smuzhiyun #define MLAN_RX_DATA_BUF_SIZE 4096
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /** Size of command buffer */
240*4882a593Smuzhiyun /** because cal_data_size 2.4 k */
241*4882a593Smuzhiyun #define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024)
242*4882a593Smuzhiyun /** Size of rx command buffer */
243*4882a593Smuzhiyun #define MLAN_RX_CMD_BUF_SIZE MRVDRV_SIZE_OF_CMD_BUFFER
244*4882a593Smuzhiyun /** Upload size */
245*4882a593Smuzhiyun #define WLAN_UPLD_SIZE MRVDRV_SIZE_OF_CMD_BUFFER
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun #if defined(PCIE)
248*4882a593Smuzhiyun #define MLAN_SSU_MAX_PKT_SIZE (283 * 4)
249*4882a593Smuzhiyun #define MLAN_SSU_HEADER_SIZE 256
250*4882a593Smuzhiyun /**
251*4882a593Smuzhiyun  * Size of DMA buffer to collect 10ms SSU data:
252*4882a593Smuzhiyun  * 2500 spectral packets, plus header
253*4882a593Smuzhiyun  */
254*4882a593Smuzhiyun #define MLAN_SSU_BUF_SIZE_1MS (MLAN_SSU_MAX_PKT_SIZE * 250)
255*4882a593Smuzhiyun #define MLAN_SSU_BUF_SIZE (MLAN_SSU_HEADER_SIZE + MLAN_SSU_BUF_SIZE_1MS * 10)
256*4882a593Smuzhiyun #define MLAN_SSU_BUF_SIZE_HOST (MLAN_SSU_BUF_SIZE)
257*4882a593Smuzhiyun #endif
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /** driver initial the fw reset */
260*4882a593Smuzhiyun #define FW_RELOAD_SDIO_INBAND_RESET 1
261*4882a593Smuzhiyun /** out band reset trigger reset, no interface re-emulation */
262*4882a593Smuzhiyun #define FW_RELOAD_NO_EMULATION 2
263*4882a593Smuzhiyun /** out band reset with interface re-emulation */
264*4882a593Smuzhiyun #define FW_RELOAD_WITH_EMULATION 3
265*4882a593Smuzhiyun #ifdef PCIE
266*4882a593Smuzhiyun /** pcie card reset */
267*4882a593Smuzhiyun #define FW_RELOAD_PCIE_RESET 4
268*4882a593Smuzhiyun #endif
269*4882a593Smuzhiyun #define FW_RELOAD_SDIO_HW_RESET 5
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun #ifdef USB
272*4882a593Smuzhiyun #define MLAN_USB_BLOCK_SIZE (512)
273*4882a593Smuzhiyun #define MLAN_USB_AGGR_MODE_NUM (0)
274*4882a593Smuzhiyun #define MLAN_USB_AGGR_MODE_LEN (1)
275*4882a593Smuzhiyun #define MLAN_USB_AGGR_MODE_LEN_V2 (2)
276*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_MAX_LEN (16000)
277*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_MAX_NUM 10
278*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_V2_ALIGN 4
279*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_HEADER 4
280*4882a593Smuzhiyun #define MLAN_USB_MAX_PKT_SIZE (MLAN_USB_BLOCK_SIZE * 4)
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun #define MLAN_USB_RX_ALIGN_SIZE MLAN_USB_BLOCK_SIZE
283*4882a593Smuzhiyun #define MLAN_USB_RX_MAX_AGGR_NUM (8)
284*4882a593Smuzhiyun #define MLAN_USB_RX_DEAGGR_TIMEOUT_USEC (200)
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_ALIGN (MLAN_USB_BLOCK_SIZE * 4)
287*4882a593Smuzhiyun #define MLAN_USB_TX_MAX_AGGR_NUM (8)
288*4882a593Smuzhiyun #define MLAN_USB_TX_MAX_AGGR_SIZE                                              \
289*4882a593Smuzhiyun 	(MLAN_USB_BLOCK_SIZE * 4 * MLAN_USB_TX_MAX_AGGR_NUM)
290*4882a593Smuzhiyun #define MLAN_USB_TX_MIN_AGGR_TIMEOUT (1)
291*4882a593Smuzhiyun #define MLAN_USB_TX_MAX_AGGR_TIMEOUT (4)
292*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_TIMEOUT_MSEC MLAN_USB_TX_MIN_AGGR_TIMEOUT
293*4882a593Smuzhiyun #define MLAN_USB_TX_AGGR_TIMEOUT_DYN (0xFFFF)
294*4882a593Smuzhiyun #endif /*USB*/
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /** MLAN MAC Address Length */
297*4882a593Smuzhiyun #define MLAN_MAC_ADDR_LENGTH (6)
298*4882a593Smuzhiyun /** MLAN 802.11 MAC Address */
299*4882a593Smuzhiyun typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /** MLAN Maximum SSID Length */
302*4882a593Smuzhiyun #define MLAN_MAX_SSID_LENGTH (32)
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun /** RTS/FRAG related defines */
305*4882a593Smuzhiyun /** Minimum RTS value */
306*4882a593Smuzhiyun #define MLAN_RTS_MIN_VALUE (0)
307*4882a593Smuzhiyun /** Maximum RTS value */
308*4882a593Smuzhiyun #define MLAN_RTS_MAX_VALUE (2347)
309*4882a593Smuzhiyun /** Minimum FRAG value */
310*4882a593Smuzhiyun #define MLAN_FRAG_MIN_VALUE (256)
311*4882a593Smuzhiyun /** Maximum FRAG value */
312*4882a593Smuzhiyun #define MLAN_FRAG_MAX_VALUE (2346)
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun /** Minimum tx retry count */
315*4882a593Smuzhiyun #define MLAN_TX_RETRY_MIN (0)
316*4882a593Smuzhiyun /** Maximum tx retry count */
317*4882a593Smuzhiyun #define MLAN_TX_RETRY_MAX (14)
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun /** max Wmm AC queues */
320*4882a593Smuzhiyun #define MAX_AC_QUEUES 4
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun #ifdef SDIO
323*4882a593Smuzhiyun /** define SDIO block size for data Tx/Rx */
324*4882a593Smuzhiyun /* We support up to 480-byte block size due to FW buffer limitation. */
325*4882a593Smuzhiyun #define MLAN_SDIO_BLOCK_SIZE 256
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun /** define SDIO block size for firmware download */
328*4882a593Smuzhiyun #define MLAN_SDIO_BLOCK_SIZE_FW_DNLD MLAN_SDIO_BLOCK_SIZE
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /** define allocated buffer size */
331*4882a593Smuzhiyun #define ALLOC_BUF_SIZE MLAN_RX_DATA_BUF_SIZE
332*4882a593Smuzhiyun /** SDIO MP aggr pkt limit */
333*4882a593Smuzhiyun #define SDIO_MP_AGGR_DEF_PKT_LIMIT (16)
334*4882a593Smuzhiyun /** SDIO MP aggr pkt limit 8 */
335*4882a593Smuzhiyun #define SDIO_MP_AGGR_DEF_PKT_LIMIT_8 (8)
336*4882a593Smuzhiyun /** max SDIO MP aggr pkt limit */
337*4882a593Smuzhiyun #define SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX (16)
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun /** SDIO IO Port mask */
340*4882a593Smuzhiyun #define MLAN_SDIO_IO_PORT_MASK 0xfffff
341*4882a593Smuzhiyun /** SDIO Block/Byte mode mask */
342*4882a593Smuzhiyun #define MLAN_SDIO_BYTE_MODE_MASK 0x80000000
343*4882a593Smuzhiyun #endif /* SDIO */
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /** SD Interface */
346*4882a593Smuzhiyun #define INTF_SD MBIT(0)
347*4882a593Smuzhiyun #define IS_SD(ct) (ct & (INTF_SD << 8))
348*4882a593Smuzhiyun /** PCIE Interface */
349*4882a593Smuzhiyun #define INTF_PCIE MBIT(1)
350*4882a593Smuzhiyun #define IS_PCIE(ct) (ct & (INTF_PCIE << 8))
351*4882a593Smuzhiyun /** USB Interface */
352*4882a593Smuzhiyun #define INTF_USB MBIT(2)
353*4882a593Smuzhiyun #define IS_USB(ct) (ct & (INTF_USB << 8))
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun /** 8887 card type */
356*4882a593Smuzhiyun #define CARD_TYPE_8887 0x01
357*4882a593Smuzhiyun /** 8897 card type */
358*4882a593Smuzhiyun #define CARD_TYPE_8897 0x02
359*4882a593Smuzhiyun /** 8977 card type */
360*4882a593Smuzhiyun #define CARD_TYPE_8977 0x03
361*4882a593Smuzhiyun /** 8997 card type */
362*4882a593Smuzhiyun #define CARD_TYPE_8997 0x04
363*4882a593Smuzhiyun /** 8987 card type */
364*4882a593Smuzhiyun #define CARD_TYPE_8987 0x05
365*4882a593Smuzhiyun /** 9098 card type */
366*4882a593Smuzhiyun #define CARD_TYPE_9098 0x06
367*4882a593Smuzhiyun /** 9097 card type */
368*4882a593Smuzhiyun #define CARD_TYPE_9097 0x07
369*4882a593Smuzhiyun /** 8978 card type */
370*4882a593Smuzhiyun #define CARD_TYPE_8978 0x08
371*4882a593Smuzhiyun /** 9177 card type */
372*4882a593Smuzhiyun #define CARD_TYPE_9177 0x09
373*4882a593Smuzhiyun /** 8801 card type */
374*4882a593Smuzhiyun #define CARD_TYPE_8801 0x0a
375*4882a593Smuzhiyun /** OWL card type */
376*4882a593Smuzhiyun #define CARD_TYPE_NW62X 0x0b
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun /** 9098 A0 reverion num */
379*4882a593Smuzhiyun #define CHIP_9098_REV_A0 1
380*4882a593Smuzhiyun #define CHIP_9098_REV_A1 2
381*4882a593Smuzhiyun /** 9097 CHIP REV */
382*4882a593Smuzhiyun #define CHIP_9097_REV_B0 1
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun #define INTF_MASK 0xff
385*4882a593Smuzhiyun #define CARD_TYPE_MASK 0xff
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun #ifdef SDIO
388*4882a593Smuzhiyun /** SD8887 card type */
389*4882a593Smuzhiyun #define CARD_TYPE_SD8887 (CARD_TYPE_8887 | (INTF_SD << 8))
390*4882a593Smuzhiyun /** SD8897 card type */
391*4882a593Smuzhiyun #define CARD_TYPE_SD8897 (CARD_TYPE_8897 | (INTF_SD << 8))
392*4882a593Smuzhiyun /** SD8977 card type */
393*4882a593Smuzhiyun #define CARD_TYPE_SD8977 (CARD_TYPE_8977 | (INTF_SD << 8))
394*4882a593Smuzhiyun /** SD8978 card type */
395*4882a593Smuzhiyun #define CARD_TYPE_SD8978 (CARD_TYPE_8978 | (INTF_SD << 8))
396*4882a593Smuzhiyun /** SD8997 card type */
397*4882a593Smuzhiyun #define CARD_TYPE_SD8997 (CARD_TYPE_8997 | (INTF_SD << 8))
398*4882a593Smuzhiyun /** SD8987 card type */
399*4882a593Smuzhiyun #define CARD_TYPE_SD8987 (CARD_TYPE_8987 | (INTF_SD << 8))
400*4882a593Smuzhiyun /** SD9097 card type */
401*4882a593Smuzhiyun #define CARD_TYPE_SD9097 (CARD_TYPE_9097 | (INTF_SD << 8))
402*4882a593Smuzhiyun /** SD9098 card type */
403*4882a593Smuzhiyun #define CARD_TYPE_SD9098 (CARD_TYPE_9098 | (INTF_SD << 8))
404*4882a593Smuzhiyun /** SD9177 card type */
405*4882a593Smuzhiyun #define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8))
406*4882a593Smuzhiyun /** SD8801 card type */
407*4882a593Smuzhiyun #define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8))
408*4882a593Smuzhiyun /** SD_NW62X card type */
409*4882a593Smuzhiyun #define CARD_TYPE_SDNW62X (CARD_TYPE_NW62X | (INTF_SD << 8))
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun #define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct))
412*4882a593Smuzhiyun #define IS_SD8897(ct) (CARD_TYPE_SD8897 == (ct))
413*4882a593Smuzhiyun #define IS_SD8977(ct) (CARD_TYPE_SD8977 == (ct))
414*4882a593Smuzhiyun #define IS_SD8978(ct) (CARD_TYPE_SD8978 == (ct))
415*4882a593Smuzhiyun #define IS_SD8997(ct) (CARD_TYPE_SD8997 == (ct))
416*4882a593Smuzhiyun #define IS_SD8987(ct) (CARD_TYPE_SD8987 == (ct))
417*4882a593Smuzhiyun #define IS_SD9097(ct) (CARD_TYPE_SD9097 == (ct))
418*4882a593Smuzhiyun #define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct))
419*4882a593Smuzhiyun #define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct))
420*4882a593Smuzhiyun #define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct))
421*4882a593Smuzhiyun #define IS_SDNW62X(ct) (CARD_TYPE_SDNW62X == (ct))
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun /** SD8887 Card */
424*4882a593Smuzhiyun #define CARD_SD8887 "SD8887"
425*4882a593Smuzhiyun /** SD8897 Card */
426*4882a593Smuzhiyun #define CARD_SD8897 "SD8897"
427*4882a593Smuzhiyun /** SD8977 Card */
428*4882a593Smuzhiyun #define CARD_SD8977 "SD8977"
429*4882a593Smuzhiyun /** SD8978 Card */
430*4882a593Smuzhiyun #define CARD_SD8978 "SDIW416"
431*4882a593Smuzhiyun /** SD8997 Card */
432*4882a593Smuzhiyun #define CARD_SD8997 "SD8997"
433*4882a593Smuzhiyun /** SD8987 Card */
434*4882a593Smuzhiyun #define CARD_SD8987 "SD8987"
435*4882a593Smuzhiyun /** SD9097 Card */
436*4882a593Smuzhiyun #define CARD_SD9097 "SDIW620"
437*4882a593Smuzhiyun /** SD9098 Card */
438*4882a593Smuzhiyun #define CARD_SD9098 "SD9098"
439*4882a593Smuzhiyun /** SD9177 Card */
440*4882a593Smuzhiyun #define CARD_SD9177 "SDIW612"
441*4882a593Smuzhiyun /** SD8801 Card */
442*4882a593Smuzhiyun #define CARD_SD8801 "SD8801"
443*4882a593Smuzhiyun /** SDNW62X Card */
444*4882a593Smuzhiyun #define CARD_SDNW62X "SDNW62X"
445*4882a593Smuzhiyun #endif
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun #ifdef PCIE
448*4882a593Smuzhiyun /** PCIE8897 card type */
449*4882a593Smuzhiyun #define CARD_TYPE_PCIE8897 (CARD_TYPE_8897 | (INTF_PCIE << 8))
450*4882a593Smuzhiyun /** PCIE8997 card type */
451*4882a593Smuzhiyun #define CARD_TYPE_PCIE8997 (CARD_TYPE_8997 | (INTF_PCIE << 8))
452*4882a593Smuzhiyun /** PCIE9097 card type */
453*4882a593Smuzhiyun #define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8))
454*4882a593Smuzhiyun /** PCIE9098 card type */
455*4882a593Smuzhiyun #define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8))
456*4882a593Smuzhiyun /** PCIENW62X card type */
457*4882a593Smuzhiyun #define CARD_TYPE_PCIENW62X (CARD_TYPE_NW62X | (INTF_PCIE << 8))
458*4882a593Smuzhiyun 
459*4882a593Smuzhiyun #define IS_PCIE8897(ct) (CARD_TYPE_PCIE8897 == (ct))
460*4882a593Smuzhiyun #define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct))
461*4882a593Smuzhiyun #define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct))
462*4882a593Smuzhiyun #define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct))
463*4882a593Smuzhiyun #define IS_PCIENW62X(ct) (CARD_TYPE_PCIENW62X == (ct))
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun /** PCIE8897 Card */
466*4882a593Smuzhiyun #define CARD_PCIE8897 "PCIE8897"
467*4882a593Smuzhiyun /** PCIE8997 Card */
468*4882a593Smuzhiyun #define CARD_PCIE8997 "PCIE8997"
469*4882a593Smuzhiyun /** PCIE9097 Card */
470*4882a593Smuzhiyun #define CARD_PCIE9097 "PCIEIW620"
471*4882a593Smuzhiyun /** PCIE9000S Card */
472*4882a593Smuzhiyun #define CARD_PCIE9000S "PCIE9000S"
473*4882a593Smuzhiyun /** PCIE9098 Card */
474*4882a593Smuzhiyun #define CARD_PCIE9098 "PCIE9098"
475*4882a593Smuzhiyun /** PCIEAW690 Card */
476*4882a593Smuzhiyun #define CARD_PCIEAW690 "PCIEAW690"
477*4882a593Smuzhiyun /** PCIENW62X Card */
478*4882a593Smuzhiyun #define CARD_PCIENW62X "PCIENW62X"
479*4882a593Smuzhiyun /** PCIEIW629 Card */
480*4882a593Smuzhiyun #define CARD_PCIEIW629 "PCIEIW629"
481*4882a593Smuzhiyun #endif
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun #ifdef USB
484*4882a593Smuzhiyun /** USB8801 card type */
485*4882a593Smuzhiyun #define CARD_TYPE_USB8801 (CARD_TYPE_8801 | (INTF_USB << 8))
486*4882a593Smuzhiyun /** USB8897 card type */
487*4882a593Smuzhiyun #define CARD_TYPE_USB8897 (CARD_TYPE_8897 | (INTF_USB << 8))
488*4882a593Smuzhiyun /** USB8997 card type */
489*4882a593Smuzhiyun #define CARD_TYPE_USB8997 (CARD_TYPE_8997 | (INTF_USB << 8))
490*4882a593Smuzhiyun /** USB8978 card type */
491*4882a593Smuzhiyun #define CARD_TYPE_USB8978 (CARD_TYPE_8978 | (INTF_USB << 8))
492*4882a593Smuzhiyun /** USB9098 card type */
493*4882a593Smuzhiyun #define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8))
494*4882a593Smuzhiyun /** USB9097 card type */
495*4882a593Smuzhiyun #define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8))
496*4882a593Smuzhiyun /** USBNW62X card type */
497*4882a593Smuzhiyun #define CARD_TYPE_USBNW62X (CARD_TYPE_NW62X | (INTF_USB << 8))
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun #define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct))
500*4882a593Smuzhiyun #define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct))
501*4882a593Smuzhiyun #define IS_USB8997(ct) (CARD_TYPE_USB8997 == (ct))
502*4882a593Smuzhiyun #define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct))
503*4882a593Smuzhiyun #define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct))
504*4882a593Smuzhiyun #define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct))
505*4882a593Smuzhiyun #define IS_USBNW62X(ct) (CARD_TYPE_USBNW62X == (ct))
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /** USB8801 Card */
508*4882a593Smuzhiyun #define CARD_USB8801 "USB8801"
509*4882a593Smuzhiyun /** USB8897 Card */
510*4882a593Smuzhiyun #define CARD_USB8897 "USB8897"
511*4882a593Smuzhiyun /** USB8997 Card */
512*4882a593Smuzhiyun #define CARD_USB8997 "USB8997"
513*4882a593Smuzhiyun /** USB8978 Card */
514*4882a593Smuzhiyun #define CARD_USB8978 "USBIW416"
515*4882a593Smuzhiyun /** USB9098 Card */
516*4882a593Smuzhiyun #define CARD_USB9098 "USB9098"
517*4882a593Smuzhiyun /** USB9097 Card */
518*4882a593Smuzhiyun #define CARD_USB9097 "USBIW620"
519*4882a593Smuzhiyun /** USBNW62X Card */
520*4882a593Smuzhiyun #define CARD_USBNW62X "USBNW62X"
521*4882a593Smuzhiyun #endif
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun #define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf))
524*4882a593Smuzhiyun #define IS_CARD8887(ct) (CARD_TYPE_8887 == ((ct)&0xf))
525*4882a593Smuzhiyun #define IS_CARD8897(ct) (CARD_TYPE_8897 == ((ct)&0xf))
526*4882a593Smuzhiyun #define IS_CARD8977(ct) (CARD_TYPE_8977 == ((ct)&0xf))
527*4882a593Smuzhiyun #define IS_CARD8997(ct) (CARD_TYPE_8997 == ((ct)&0xf))
528*4882a593Smuzhiyun #define IS_CARD8987(ct) (CARD_TYPE_8987 == ((ct)&0xf))
529*4882a593Smuzhiyun #define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf))
530*4882a593Smuzhiyun #define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf))
531*4882a593Smuzhiyun #define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf))
532*4882a593Smuzhiyun #define IS_CARDNW62X(ct) (CARD_TYPE_NW62X == ((ct)&0xf))
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun typedef struct _card_type_entry {
535*4882a593Smuzhiyun 	t_u16 card_type;
536*4882a593Smuzhiyun 	t_u16 func_id;
537*4882a593Smuzhiyun 	char *name;
538*4882a593Smuzhiyun } card_type_entry;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
541*4882a593Smuzhiyun /** Max retry number of IO write */
542*4882a593Smuzhiyun #define MAX_WRITE_IOMEM_RETRY 2
543*4882a593Smuzhiyun #endif /* SDIO || PCIE */
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun #ifdef PCIE
546*4882a593Smuzhiyun typedef enum {
547*4882a593Smuzhiyun 	PCIE_INT_MODE_LEGACY = 0,
548*4882a593Smuzhiyun 	PCIE_INT_MODE_MSI,
549*4882a593Smuzhiyun 	PCIE_INT_MODE_MSIX,
550*4882a593Smuzhiyun 	PCIE_INT_MODE_MAX,
551*4882a593Smuzhiyun } PCIE_INT_MODE;
552*4882a593Smuzhiyun #endif /* PCIE */
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun /** IN parameter */
555*4882a593Smuzhiyun #define IN
556*4882a593Smuzhiyun /** OUT parameter */
557*4882a593Smuzhiyun #define OUT
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun /** BIT value */
560*4882a593Smuzhiyun #define MBIT(x) (((t_u32)1) << (x))
561*4882a593Smuzhiyun 
562*4882a593Smuzhiyun /** Buffer flag for requeued packet */
563*4882a593Smuzhiyun #define MLAN_BUF_FLAG_REQUEUED_PKT MBIT(0)
564*4882a593Smuzhiyun /** Buffer flag for transmit buf from moal */
565*4882a593Smuzhiyun #define MLAN_BUF_FLAG_MOAL_TX_BUF MBIT(1)
566*4882a593Smuzhiyun /** Buffer flag for malloc mlan_buffer */
567*4882a593Smuzhiyun #define MLAN_BUF_FLAG_MALLOC_BUF MBIT(2)
568*4882a593Smuzhiyun 
569*4882a593Smuzhiyun /** Buffer flag for bridge packet */
570*4882a593Smuzhiyun #define MLAN_BUF_FLAG_BRIDGE_BUF MBIT(3)
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun #ifdef USB
573*4882a593Smuzhiyun /** Buffer flag for deaggregated rx packet */
574*4882a593Smuzhiyun #define MLAN_BUF_FLAG_RX_DEAGGR MBIT(5)
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun /** Buffer flag for sleep confirm resp packet */
577*4882a593Smuzhiyun #define MLAN_BUF_FLAG_SLEEPCFM_RESP MBIT(6)
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun /** Buffer flag for USB TX AGGR */
580*4882a593Smuzhiyun #define MLAN_BUF_FLAG_USB_TX_AGGR MBIT(7)
581*4882a593Smuzhiyun #endif
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun /** Buffer flag for TDLS */
584*4882a593Smuzhiyun #define MLAN_BUF_FLAG_TDLS MBIT(8)
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun /** Buffer flag for TCP_ACK */
587*4882a593Smuzhiyun #define MLAN_BUF_FLAG_TCP_ACK MBIT(9)
588*4882a593Smuzhiyun 
589*4882a593Smuzhiyun /** Buffer flag for TX_STATUS */
590*4882a593Smuzhiyun #define MLAN_BUF_FLAG_TX_STATUS MBIT(10)
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun /** Buffer flag for NET_MONITOR */
593*4882a593Smuzhiyun #define MLAN_BUF_FLAG_NET_MONITOR MBIT(11)
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun /** Buffer flag for NULL data packet */
596*4882a593Smuzhiyun #define MLAN_BUF_FLAG_NULL_PKT MBIT(12)
597*4882a593Smuzhiyun /** Buffer flag for Diag pkt */
598*4882a593Smuzhiyun #define MLAN_BUF_FLAG_DIAG_BUF MBIT(13)
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun #define MLAN_BUF_FLAG_TX_CTRL MBIT(14)
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun #define MLAN_BUF_FLAG_MC_AGGR_PKT MBIT(17)
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
605*4882a593Smuzhiyun /** Debug level bit definition */
606*4882a593Smuzhiyun #define MMSG MBIT(0)
607*4882a593Smuzhiyun #define MFATAL MBIT(1)
608*4882a593Smuzhiyun #define MERROR MBIT(2)
609*4882a593Smuzhiyun #define MDATA MBIT(3)
610*4882a593Smuzhiyun #define MCMND MBIT(4)
611*4882a593Smuzhiyun #define MEVENT MBIT(5)
612*4882a593Smuzhiyun #define MINTR MBIT(6)
613*4882a593Smuzhiyun #define MIOCTL MBIT(7)
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun #define MREG_D MBIT(9)
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #define MMPA_D MBIT(15)
618*4882a593Smuzhiyun #define MDAT_D MBIT(16)
619*4882a593Smuzhiyun #define MCMD_D MBIT(17)
620*4882a593Smuzhiyun #define MEVT_D MBIT(18)
621*4882a593Smuzhiyun #define MFW_D MBIT(19)
622*4882a593Smuzhiyun #define MIF_D MBIT(20)
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun #define MENTRY MBIT(28)
625*4882a593Smuzhiyun #define MWARN MBIT(29)
626*4882a593Smuzhiyun #define MINFO MBIT(30)
627*4882a593Smuzhiyun #define MHEX_DUMP MBIT(31)
628*4882a593Smuzhiyun #endif /* DEBUG_LEVEL1 */
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun /** Memory allocation type: DMA */
631*4882a593Smuzhiyun #define MLAN_MEM_DMA MBIT(0)
632*4882a593Smuzhiyun /** Memory allocation flag: ATOMIC */
633*4882a593Smuzhiyun #define MLAN_MEM_FLAG_ATOMIC MBIT(1)
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun /** Default memory allocation flag */
636*4882a593Smuzhiyun #define MLAN_MEM_DEF 0
637*4882a593Smuzhiyun 
638*4882a593Smuzhiyun /** mlan_status */
639*4882a593Smuzhiyun typedef enum _mlan_status {
640*4882a593Smuzhiyun 	MLAN_STATUS_FAILURE = 0xffffffff,
641*4882a593Smuzhiyun 	MLAN_STATUS_SUCCESS = 0,
642*4882a593Smuzhiyun 	MLAN_STATUS_PENDING,
643*4882a593Smuzhiyun 	MLAN_STATUS_RESOURCE,
644*4882a593Smuzhiyun #ifdef USB
645*4882a593Smuzhiyun 	/* Status pending and no resource */
646*4882a593Smuzhiyun 	MLAN_STATUS_PRESOURCE,
647*4882a593Smuzhiyun #endif
648*4882a593Smuzhiyun 	MLAN_STATUS_COMPLETE,
649*4882a593Smuzhiyun 	MLAN_STATUS_FILE_ERR,
650*4882a593Smuzhiyun } mlan_status;
651*4882a593Smuzhiyun 
652*4882a593Smuzhiyun /** mlan_error_code */
653*4882a593Smuzhiyun typedef enum _mlan_error_code {
654*4882a593Smuzhiyun 	/** No error */
655*4882a593Smuzhiyun 	MLAN_ERROR_NO_ERROR = 0,
656*4882a593Smuzhiyun 	/** Firmware/device errors below (MSB=0) */
657*4882a593Smuzhiyun 	MLAN_ERROR_FW_NOT_READY = 0x00000001,
658*4882a593Smuzhiyun 	MLAN_ERROR_FW_BUSY = 0x00000002,
659*4882a593Smuzhiyun 	MLAN_ERROR_FW_CMDRESP = 0x00000003,
660*4882a593Smuzhiyun 	MLAN_ERROR_DATA_TX_FAIL = 0x00000004,
661*4882a593Smuzhiyun 	MLAN_ERROR_DATA_RX_FAIL = 0x00000005,
662*4882a593Smuzhiyun 	/** Driver errors below (MSB=1) */
663*4882a593Smuzhiyun 	MLAN_ERROR_PKT_SIZE_INVALID = 0x80000001,
664*4882a593Smuzhiyun 	MLAN_ERROR_PKT_TIMEOUT = 0x80000002,
665*4882a593Smuzhiyun 	MLAN_ERROR_PKT_INVALID = 0x80000003,
666*4882a593Smuzhiyun 	MLAN_ERROR_CMD_INVALID = 0x80000004,
667*4882a593Smuzhiyun 	MLAN_ERROR_CMD_TIMEOUT = 0x80000005,
668*4882a593Smuzhiyun 	MLAN_ERROR_CMD_DNLD_FAIL = 0x80000006,
669*4882a593Smuzhiyun 	MLAN_ERROR_CMD_CANCEL = 0x80000007,
670*4882a593Smuzhiyun 	MLAN_ERROR_CMD_RESP_FAIL = 0x80000008,
671*4882a593Smuzhiyun 	MLAN_ERROR_CMD_ASSOC_FAIL = 0x80000009,
672*4882a593Smuzhiyun 	MLAN_ERROR_CMD_SCAN_FAIL = 0x8000000A,
673*4882a593Smuzhiyun 	MLAN_ERROR_IOCTL_INVALID = 0x8000000B,
674*4882a593Smuzhiyun 	MLAN_ERROR_IOCTL_FAIL = 0x8000000C,
675*4882a593Smuzhiyun 	MLAN_ERROR_EVENT_UNKNOWN = 0x8000000D,
676*4882a593Smuzhiyun 	MLAN_ERROR_INVALID_PARAMETER = 0x8000000E,
677*4882a593Smuzhiyun 	MLAN_ERROR_NO_MEM = 0x8000000F,
678*4882a593Smuzhiyun 	/** More to add */
679*4882a593Smuzhiyun } mlan_error_code;
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun /** mlan_buf_type */
682*4882a593Smuzhiyun typedef enum _mlan_buf_type {
683*4882a593Smuzhiyun 	MLAN_BUF_TYPE_CMD = 1,
684*4882a593Smuzhiyun 	MLAN_BUF_TYPE_DATA,
685*4882a593Smuzhiyun 	MLAN_BUF_TYPE_EVENT,
686*4882a593Smuzhiyun 	MLAN_BUF_TYPE_RAW_DATA,
687*4882a593Smuzhiyun #ifdef SDIO
688*4882a593Smuzhiyun 	MLAN_BUF_TYPE_SPA_DATA,
689*4882a593Smuzhiyun #endif
690*4882a593Smuzhiyun } mlan_buf_type;
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun #define SCAN_STATE_SCAN_START MBIT(0)
693*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN MBIT(1)
694*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_ENH MBIT(2)
695*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_CANCEL MBIT(3)
696*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_CMDRESP MBIT(4)
697*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_ENH_CMDRESP MBIT(5)
698*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_CANCEL_CMDRESP MBIT(6)
699*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_RESULT MBIT(7)
700*4882a593Smuzhiyun #define SCAN_STATE_LAST_EXT_SCAN_RESULT MBIT(8)
701*4882a593Smuzhiyun #define SCAN_STATE_EXT_SCAN_STATUS MBIT(9)
702*4882a593Smuzhiyun #define SCAN_STATE_SCAN_COMPLETE MBIT(10)
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun #ifdef USB
705*4882a593Smuzhiyun /** mlan_usb_ep */
706*4882a593Smuzhiyun typedef enum _mlan_usb_ep {
707*4882a593Smuzhiyun 	MLAN_USB_EP_CTRL = 0,
708*4882a593Smuzhiyun 	MLAN_USB_EP_CMD_EVENT = 1,
709*4882a593Smuzhiyun 	MLAN_USB_EP_DATA = 2,
710*4882a593Smuzhiyun 	MLAN_USB_EP_DATA_CH2 = 3,
711*4882a593Smuzhiyun 	MLAN_USB_EP_CMD_EVENT_IF2 = 4,
712*4882a593Smuzhiyun 	MLAN_USB_EP_DATA_IF2 = 5,
713*4882a593Smuzhiyun 	MLAN_USB_EP_DATA_CH2_IF2 = 6,
714*4882a593Smuzhiyun } mlan_usb_ep;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun /** Timeout in milliseconds for usb_bulk_msg function */
717*4882a593Smuzhiyun #define MLAN_USB_BULK_MSG_TIMEOUT 100
718*4882a593Smuzhiyun #endif /* USB */
719*4882a593Smuzhiyun 
720*4882a593Smuzhiyun /** MLAN BSS type */
721*4882a593Smuzhiyun typedef enum _mlan_bss_type {
722*4882a593Smuzhiyun 	MLAN_BSS_TYPE_STA = 0,
723*4882a593Smuzhiyun 	MLAN_BSS_TYPE_UAP = 1,
724*4882a593Smuzhiyun #ifdef WIFI_DIRECT_SUPPORT
725*4882a593Smuzhiyun 	MLAN_BSS_TYPE_WIFIDIRECT = 2,
726*4882a593Smuzhiyun #endif
727*4882a593Smuzhiyun 	MLAN_BSS_TYPE_DFS = 8,
728*4882a593Smuzhiyun 	MLAN_BSS_TYPE_ANY = 0xff,
729*4882a593Smuzhiyun } mlan_bss_type;
730*4882a593Smuzhiyun 
731*4882a593Smuzhiyun /** MLAN BSS role */
732*4882a593Smuzhiyun typedef enum _mlan_bss_role {
733*4882a593Smuzhiyun 	MLAN_BSS_ROLE_STA = 0,
734*4882a593Smuzhiyun 	MLAN_BSS_ROLE_UAP = 1,
735*4882a593Smuzhiyun 	MLAN_BSS_ROLE_ANY = 0xff,
736*4882a593Smuzhiyun } mlan_bss_role;
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun /** BSS role mask */
739*4882a593Smuzhiyun #define BSS_ROLE_MASK (MBIT(0) | MBIT(1))
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun /** Get BSS role */
742*4882a593Smuzhiyun #define GET_BSS_ROLE(priv) ((priv)->bss_role & BSS_ROLE_MASK)
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun /** mlan_data_frame_type */
745*4882a593Smuzhiyun typedef enum _mlan_data_frame_type {
746*4882a593Smuzhiyun 	MLAN_DATA_FRAME_TYPE_ETH_II = 0,
747*4882a593Smuzhiyun 	MLAN_DATA_FRAME_TYPE_802_11,
748*4882a593Smuzhiyun } mlan_data_frame_type;
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun /** mlan_event_id */
751*4882a593Smuzhiyun typedef enum _mlan_event_id {
752*4882a593Smuzhiyun 	/* Event generated by firmware (MSB=0) */
753*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_UNKNOWN = 0x00000001,
754*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED = 0x00000002,
755*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_ADHOC_LINK_LOST = 0x00000003,
756*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DISCONNECTED = 0x00000004,
757*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_MIC_ERR_UNI = 0x00000005,
758*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_MIC_ERR_MUL = 0x00000006,
759*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BCN_RSSI_LOW = 0x00000007,
760*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BCN_RSSI_HIGH = 0x00000008,
761*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BCN_SNR_LOW = 0x00000009,
762*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BCN_SNR_HIGH = 0x0000000A,
763*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_MAX_FAIL = 0x0000000B,
764*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DATA_RSSI_LOW = 0x0000000C,
765*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DATA_RSSI_HIGH = 0x0000000D,
766*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DATA_SNR_LOW = 0x0000000E,
767*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DATA_SNR_HIGH = 0x0000000F,
768*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_LINK_QUALITY = 0x00000010,
769*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_PORT_RELEASE = 0x00000011,
770*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_PRE_BCN_LOST = 0x00000012,
771*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DEBUG_INFO = 0x00000013,
772*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_WMM_CONFIG_CHANGE = 0x0000001A,
773*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_HS_WAKEUP = 0x0000001B,
774*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BG_SCAN = 0x0000001D,
775*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BG_SCAN_STOPPED = 0x0000001E,
776*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_WEP_ICV_ERR = 0x00000020,
777*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_STOP_TX = 0x00000021,
778*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_START_TX = 0x00000022,
779*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_CHANNEL_SWITCH_ANN = 0x00000023,
780*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
781*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
782*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026,
783*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B,
784*4882a593Smuzhiyun 
785*4882a593Smuzhiyun #ifdef UAP_SUPPORT
786*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_BSS_START = 0x0000002C,
787*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_BSS_ACTIVE = 0x0000002D,
788*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_BSS_IDLE = 0x0000002E,
789*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_MIC_COUNTERMEASURES = 0x0000002F,
790*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_STA_CONNECT = 0x00000030,
791*4882a593Smuzhiyun 	MLAN_EVENT_ID_UAP_FW_STA_DISCONNECT = 0x00000031,
792*4882a593Smuzhiyun #endif
793*4882a593Smuzhiyun 
794*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_DUMP_INFO = 0x00000033,
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_TX_STATUS = 0x00000034,
797*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_CHAN_SWITCH_COMPLETE = 0x00000036,
798*4882a593Smuzhiyun #if defined(PCIE)
799*4882a593Smuzhiyun 	MLAN_EVENT_ID_SSU_DUMP_FILE = 0x00000039,
800*4882a593Smuzhiyun #endif /* SSU_SUPPORT */
801*4882a593Smuzhiyun 	MLAN_EVENT_ID_CSI = 0x00000040,
802*4882a593Smuzhiyun 	/* Event generated by MLAN driver (MSB=1) */
803*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_CONNECTED = 0x80000001,
804*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_DEFER_HANDLING = 0x80000002,
805*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_HS_ACTIVATED = 0x80000003,
806*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_HS_DEACTIVATED = 0x80000004,
807*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_MGMT_FRAME = 0x80000005,
808*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_OBSS_SCAN_PARAM = 0x80000006,
809*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_PASSTHRU = 0x80000007,
810*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_SCAN_REPORT = 0x80000009,
811*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_MEAS_REPORT = 0x8000000A,
812*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_ASSOC_FAILURE_REPORT = 0x8000000B,
813*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_REPORT_STRING = 0x8000000F,
814*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_DBG_DUMP = 0x80000012,
815*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_BGSCAN_RESULT = 0x80000013,
816*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_FLUSH_RX_WORK = 0x80000015,
817*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_DEFER_RX_WORK = 0x80000016,
818*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_TDLS_TEARDOWN_REQ = 0x80000017,
819*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_FT_RESPONSE = 0x80000018,
820*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_FLUSH_MAIN_WORK = 0x80000019,
821*4882a593Smuzhiyun #ifdef UAP_SUPPORT
822*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
823*4882a593Smuzhiyun #endif
824*4882a593Smuzhiyun 	MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023,
825*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026,
826*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027,
827*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028,
828*4882a593Smuzhiyun 	MLAN_EVENT_ID_DRV_WIFI_STATUS = 0x80000029,
829*4882a593Smuzhiyun 	MLAN_EVENT_ID_STORE_HOST_CMD_RESP = 0x80000030,
830*4882a593Smuzhiyun } mlan_event_id;
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun /** Data Structures */
833*4882a593Smuzhiyun /** mlan_image data structure */
834*4882a593Smuzhiyun typedef struct _mlan_fw_image {
835*4882a593Smuzhiyun 	/** Firmware image buffer pointer */
836*4882a593Smuzhiyun 	t_u8 *pfw_buf;
837*4882a593Smuzhiyun 	/** Firmware image length */
838*4882a593Smuzhiyun 	t_u32 fw_len;
839*4882a593Smuzhiyun 	/** Firmware reload flag */
840*4882a593Smuzhiyun 	t_u8 fw_reload;
841*4882a593Smuzhiyun } mlan_fw_image, *pmlan_fw_image;
842*4882a593Smuzhiyun 
843*4882a593Smuzhiyun /** MrvlIEtypesHeader_t */
844*4882a593Smuzhiyun typedef MLAN_PACK_START struct _MrvlIEtypesHeader {
845*4882a593Smuzhiyun 	/** Header type */
846*4882a593Smuzhiyun 	t_u16 type;
847*4882a593Smuzhiyun 	/** Header length */
848*4882a593Smuzhiyun 	t_u16 len;
849*4882a593Smuzhiyun } MLAN_PACK_END MrvlIEtypesHeader_t;
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun /** MrvlExtIEtypesHeader_t */
852*4882a593Smuzhiyun typedef MLAN_PACK_START struct _MrvlExtIEtypesHeader {
853*4882a593Smuzhiyun 	/** Header type */
854*4882a593Smuzhiyun 	t_u16 type;
855*4882a593Smuzhiyun 	/** Header length */
856*4882a593Smuzhiyun 	t_u16 len;
857*4882a593Smuzhiyun 	/** ext id */
858*4882a593Smuzhiyun 	t_u8 ext_id;
859*4882a593Smuzhiyun } MLAN_PACK_END MrvlExtIEtypesHeader_t;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun /** MrvlIEtypes_Data_t */
862*4882a593Smuzhiyun typedef MLAN_PACK_START struct _MrvlExtIEtypes_Data_t {
863*4882a593Smuzhiyun 	/** Header */
864*4882a593Smuzhiyun 	MrvlExtIEtypesHeader_t header;
865*4882a593Smuzhiyun 	/** Data */
866*4882a593Smuzhiyun 	t_u8 data[];
867*4882a593Smuzhiyun } MLAN_PACK_END MrvlExtIEtypes_Data_t;
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun /** MrvlIEtypes_Data_t */
870*4882a593Smuzhiyun typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t {
871*4882a593Smuzhiyun 	/** Header */
872*4882a593Smuzhiyun 	MrvlIEtypesHeader_t header;
873*4882a593Smuzhiyun 	/** Data */
874*4882a593Smuzhiyun 	t_u8 data[];
875*4882a593Smuzhiyun } MLAN_PACK_END MrvlIEtypes_Data_t;
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun #define OID_TYPE_CAL 0x2
878*4882a593Smuzhiyun #define OID_TYPE_DPD 0xa
879*4882a593Smuzhiyun #define UNKNOW_DPD_LENGTH 0xffffffff
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun /** Custom data structure */
882*4882a593Smuzhiyun typedef struct _mlan_init_param {
883*4882a593Smuzhiyun 	/** DPD data buffer pointer */
884*4882a593Smuzhiyun 	t_u8 *pdpd_data_buf;
885*4882a593Smuzhiyun 	/** DPD data length */
886*4882a593Smuzhiyun 	t_u32 dpd_data_len;
887*4882a593Smuzhiyun 	/** region txpowerlimit cfg data buffer pointer */
888*4882a593Smuzhiyun 	t_u8 *ptxpwr_data_buf;
889*4882a593Smuzhiyun 	/** region txpowerlimit cfg data length */
890*4882a593Smuzhiyun 	t_u32 txpwr_data_len;
891*4882a593Smuzhiyun 	/** Cal data buffer pointer */
892*4882a593Smuzhiyun 	t_u8 *pcal_data_buf;
893*4882a593Smuzhiyun 	/** Cal data length */
894*4882a593Smuzhiyun 	t_u32 cal_data_len;
895*4882a593Smuzhiyun 	/** Other custom data */
896*4882a593Smuzhiyun } mlan_init_param, *pmlan_init_param;
897*4882a593Smuzhiyun 
898*4882a593Smuzhiyun /** channel type */
899*4882a593Smuzhiyun enum mlan_channel_type {
900*4882a593Smuzhiyun 	CHAN_NO_HT,
901*4882a593Smuzhiyun 	CHAN_HT20,
902*4882a593Smuzhiyun 	CHAN_HT40MINUS,
903*4882a593Smuzhiyun 	CHAN_HT40PLUS,
904*4882a593Smuzhiyun 	CHAN_VHT80
905*4882a593Smuzhiyun };
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun /** channel band */
908*4882a593Smuzhiyun enum { BAND_2GHZ = 0,
909*4882a593Smuzhiyun        BAND_5GHZ = 1,
910*4882a593Smuzhiyun        BAND_6GHZ = 2,
911*4882a593Smuzhiyun        BAND_4GHZ = 3,
912*4882a593Smuzhiyun };
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun /** channel offset */
915*4882a593Smuzhiyun enum { SEC_CHAN_NONE = 0,
916*4882a593Smuzhiyun        SEC_CHAN_ABOVE = 1,
917*4882a593Smuzhiyun        SEC_CHAN_5MHZ = 2,
918*4882a593Smuzhiyun        SEC_CHAN_BELOW = 3 };
919*4882a593Smuzhiyun 
920*4882a593Smuzhiyun /** channel bandwidth */
921*4882a593Smuzhiyun enum { CHAN_BW_20MHZ = 0,
922*4882a593Smuzhiyun        CHAN_BW_10MHZ,
923*4882a593Smuzhiyun        CHAN_BW_40MHZ,
924*4882a593Smuzhiyun        CHAN_BW_80MHZ,
925*4882a593Smuzhiyun };
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun /** scan mode */
928*4882a593Smuzhiyun enum { SCAN_MODE_MANUAL = 0,
929*4882a593Smuzhiyun        SCAN_MODE_ACS,
930*4882a593Smuzhiyun        SCAN_MODE_USER,
931*4882a593Smuzhiyun };
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun /** DFS state */
934*4882a593Smuzhiyun typedef enum _dfs_state_t {
935*4882a593Smuzhiyun 	/** Channel can be used, CAC (Channel Availability Check) must be done
936*4882a593Smuzhiyun 	   before using it */
937*4882a593Smuzhiyun 	DFS_USABLE = 0,
938*4882a593Smuzhiyun 	/** Channel is not available, radar was detected */
939*4882a593Smuzhiyun 	DFS_UNAVAILABLE = 1,
940*4882a593Smuzhiyun 	/** Channel is Available, CAC is done and is free of radar */
941*4882a593Smuzhiyun 	DFS_AVAILABLE = 2,
942*4882a593Smuzhiyun } dfs_state_t;
943*4882a593Smuzhiyun 
944*4882a593Smuzhiyun /** max cac time 10 minutes */
945*4882a593Smuzhiyun #define MAX_CAC_DWELL_TIME 600000
946*4882a593Smuzhiyun /** default cac time 60 seconds */
947*4882a593Smuzhiyun #define DEF_CAC_DWELL_TIME 60000
948*4882a593Smuzhiyun /** start freq for 5G */
949*4882a593Smuzhiyun #define START_FREQ_11A_BAND 5000
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun typedef enum _dfs_w53_cfg_t {
952*4882a593Smuzhiyun 	/** DFS W53 Default Fw Value */
953*4882a593Smuzhiyun 	DFS_W53_DEFAULT_FW = 0,
954*4882a593Smuzhiyun 	/** DFS W53 New W53 Rules/Standard */
955*4882a593Smuzhiyun 	DFS_W53_NEW = 1,
956*4882a593Smuzhiyun 	/** DFS W53 Old W53 Rules/Standard */
957*4882a593Smuzhiyun 	DFS_W53_OLD = 2
958*4882a593Smuzhiyun } dfs_w53_cfg_t;
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun typedef enum _dfs_moe_t {
961*4882a593Smuzhiyun 	/** driver default DFS behavior */
962*4882a593Smuzhiyun 	DFS_MODE_DEFAULT = 0,
963*4882a593Smuzhiyun 	/* disable DFS master when uap and station operate in same DFS channel
964*4882a593Smuzhiyun 	 */
965*4882a593Smuzhiyun 	DFS_MODE_ENH = 1,
966*4882a593Smuzhiyun } dfs_mode_t;
967*4882a593Smuzhiyun 
968*4882a593Smuzhiyun /** Band_Config_t */
969*4882a593Smuzhiyun typedef MLAN_PACK_START struct _Band_Config_t {
970*4882a593Smuzhiyun #ifdef BIG_ENDIAN_SUPPORT
971*4882a593Smuzhiyun 	/** Channel Selection Mode - (00)=manual, (01)=ACS,  (02)=user*/
972*4882a593Smuzhiyun 	t_u8 scanMode : 2;
973*4882a593Smuzhiyun 	/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
974*4882a593Smuzhiyun 	t_u8 chan2Offset : 2;
975*4882a593Smuzhiyun 	/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
976*4882a593Smuzhiyun 	t_u8 chanWidth : 2;
977*4882a593Smuzhiyun 	/** Band Info - (00)=2.4GHz, (01)=5GHz */
978*4882a593Smuzhiyun 	t_u8 chanBand : 2;
979*4882a593Smuzhiyun #else
980*4882a593Smuzhiyun 	/** Band Info - (00)=2.4GHz, (01)=5GHz */
981*4882a593Smuzhiyun 	t_u8 chanBand : 2;
982*4882a593Smuzhiyun 	/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
983*4882a593Smuzhiyun 	t_u8 chanWidth : 2;
984*4882a593Smuzhiyun 	/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
985*4882a593Smuzhiyun 	t_u8 chan2Offset : 2;
986*4882a593Smuzhiyun 	/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
987*4882a593Smuzhiyun 	t_u8 scanMode : 2;
988*4882a593Smuzhiyun #endif
989*4882a593Smuzhiyun } MLAN_PACK_END Band_Config_t;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun /** channel_band_t */
992*4882a593Smuzhiyun typedef MLAN_PACK_START struct _chan_band_info {
993*4882a593Smuzhiyun 	/** Band Configuration */
994*4882a593Smuzhiyun 	Band_Config_t bandcfg;
995*4882a593Smuzhiyun 	/** channel */
996*4882a593Smuzhiyun 	t_u8 channel;
997*4882a593Smuzhiyun 	/** 11n flag */
998*4882a593Smuzhiyun 	t_u8 is_11n_enabled;
999*4882a593Smuzhiyun 	/** center channel */
1000*4882a593Smuzhiyun 	t_u8 center_chan;
1001*4882a593Smuzhiyun 	/** dfs channel flag */
1002*4882a593Smuzhiyun 	t_u8 is_dfs_chan;
1003*4882a593Smuzhiyun } MLAN_PACK_END chan_band_info;
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun /** Channel usability flags */
1006*4882a593Smuzhiyun #define NXP_CHANNEL_NO_OFDM MBIT(9)
1007*4882a593Smuzhiyun #define NXP_CHANNEL_NO_CCK MBIT(8)
1008*4882a593Smuzhiyun #define NXP_CHANNEL_DISABLED MBIT(7)
1009*4882a593Smuzhiyun /* BIT 5/6 resevered for FW */
1010*4882a593Smuzhiyun #define NXP_CHANNEL_NOHT160 MBIT(4)
1011*4882a593Smuzhiyun #define NXP_CHANNEL_NOHT80 MBIT(3)
1012*4882a593Smuzhiyun #define NXP_CHANNEL_NOHT40 MBIT(2)
1013*4882a593Smuzhiyun #define NXP_CHANNEL_DFS MBIT(1)
1014*4882a593Smuzhiyun #define NXP_CHANNEL_PASSIVE MBIT(0)
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun /** CFP dynamic (non-const) elements */
1017*4882a593Smuzhiyun typedef struct _cfp_dyn_t {
1018*4882a593Smuzhiyun 	/** extra flags to specify channel usability
1019*4882a593Smuzhiyun 	 *  bit 9 : if set, channel is non-OFDM
1020*4882a593Smuzhiyun 	 *  bit 8 : if set, channel is non-CCK
1021*4882a593Smuzhiyun 	 *  bit 7 : if set, channel is disabled
1022*4882a593Smuzhiyun 	 *  bit  5/6 resevered for FW
1023*4882a593Smuzhiyun 	 *  bit 4 : if set, 160MHz on channel is disabled
1024*4882a593Smuzhiyun 	 *  bit 3 : if set, 80MHz on channel is disabled
1025*4882a593Smuzhiyun 	 *  bit 2 : if set, 40MHz on channel is disabled
1026*4882a593Smuzhiyun 	 *  bit 1 : if set, channel is DFS channel
1027*4882a593Smuzhiyun 	 *  bit 0 : if set, channel is passive
1028*4882a593Smuzhiyun 	 */
1029*4882a593Smuzhiyun 	t_u16 flags;
1030*4882a593Smuzhiyun 	/** TRUE: Channel is blacklisted (do not use) */
1031*4882a593Smuzhiyun 	t_bool blacklist;
1032*4882a593Smuzhiyun 	/** DFS state of the channel
1033*4882a593Smuzhiyun 	 * 0:DFS_USABLE  1:DFS_AVAILABLE  2:DFS_UNAVAILABLE */
1034*4882a593Smuzhiyun 	dfs_state_t dfs_state;
1035*4882a593Smuzhiyun } cfp_dyn_t;
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun /** Chan-Freq-TxPower mapping table*/
1038*4882a593Smuzhiyun typedef struct _chan_freq_power_t {
1039*4882a593Smuzhiyun 	/** Channel Number */
1040*4882a593Smuzhiyun 	t_u16 channel;
1041*4882a593Smuzhiyun 	/** Frequency of this Channel */
1042*4882a593Smuzhiyun 	t_u32 freq;
1043*4882a593Smuzhiyun 	/** Max allowed Tx power level */
1044*4882a593Smuzhiyun 	t_u16 max_tx_power;
1045*4882a593Smuzhiyun 	/** TRUE:radar detect required for BAND A or passive scan for BAND B/G;
1046*4882a593Smuzhiyun 	 * FALSE:radar detect not required for BAND A or active scan for BAND
1047*4882a593Smuzhiyun 	 * B/G*/
1048*4882a593Smuzhiyun 	t_bool passive_scan_or_radar_detect;
1049*4882a593Smuzhiyun 	/** Elements associated to cfp that change at run-time */
1050*4882a593Smuzhiyun 	cfp_dyn_t dynamic;
1051*4882a593Smuzhiyun } chan_freq_power_t;
1052*4882a593Smuzhiyun 
1053*4882a593Smuzhiyun /** mlan_event data structure */
1054*4882a593Smuzhiyun typedef struct _mlan_event {
1055*4882a593Smuzhiyun 	/** BSS index number for multiple BSS support */
1056*4882a593Smuzhiyun 	t_u32 bss_index;
1057*4882a593Smuzhiyun 	/** Event ID */
1058*4882a593Smuzhiyun 	mlan_event_id event_id;
1059*4882a593Smuzhiyun 	/** Event length */
1060*4882a593Smuzhiyun 	t_u32 event_len;
1061*4882a593Smuzhiyun 	/** Event buffer */
1062*4882a593Smuzhiyun 	t_u8 event_buf[];
1063*4882a593Smuzhiyun } mlan_event, *pmlan_event;
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun /** mlan_cmdresp_event data structure */
1066*4882a593Smuzhiyun typedef struct _mlan_cmdresp_event {
1067*4882a593Smuzhiyun 	/** BSS index number for multiple BSS support */
1068*4882a593Smuzhiyun 	t_u32 bss_index;
1069*4882a593Smuzhiyun 	/** Event ID */
1070*4882a593Smuzhiyun 	mlan_event_id event_id;
1071*4882a593Smuzhiyun 	/** Event length */
1072*4882a593Smuzhiyun 	t_u32 event_len;
1073*4882a593Smuzhiyun 	/** resp buffer pointer */
1074*4882a593Smuzhiyun 	t_u8 *resp;
1075*4882a593Smuzhiyun } mlan_cmdresp_event, *pmlan_cmdresp_event;
1076*4882a593Smuzhiyun 
1077*4882a593Smuzhiyun /** csi event data structure */
1078*4882a593Smuzhiyun typedef MLAN_PACK_START struct _csi_record_ds {
1079*4882a593Smuzhiyun 	/** Length in DWORDS, including header */
1080*4882a593Smuzhiyun 	t_u16 Len;
1081*4882a593Smuzhiyun 	/** CSI signature. 0xABCD fixed */
1082*4882a593Smuzhiyun 	t_u16 CSI_Sign;
1083*4882a593Smuzhiyun 	/** User defined HeaderID  */
1084*4882a593Smuzhiyun 	t_u32 CSI_HeaderID;
1085*4882a593Smuzhiyun 	/** Packet info field */
1086*4882a593Smuzhiyun 	t_u16 PKT_info;
1087*4882a593Smuzhiyun 	/** Frame control field for the received packet*/
1088*4882a593Smuzhiyun 	t_u16 FCF;
1089*4882a593Smuzhiyun 	/** Timestamp when packet received */
1090*4882a593Smuzhiyun 	t_u64 TSF;
1091*4882a593Smuzhiyun 	/** Received Packet Destination MAC Address */
1092*4882a593Smuzhiyun 	t_u8 Dst_MAC[6];
1093*4882a593Smuzhiyun 	/** Received Packet Source MAC Address */
1094*4882a593Smuzhiyun 	t_u8 Src_MAC[6];
1095*4882a593Smuzhiyun 	/** RSSI for antenna A */
1096*4882a593Smuzhiyun 	t_u8 Rx_RSSI_A;
1097*4882a593Smuzhiyun 	/** RSSI for antenna B */
1098*4882a593Smuzhiyun 	t_u8 Rx_RSSI_B;
1099*4882a593Smuzhiyun 	/** Noise floor for antenna A */
1100*4882a593Smuzhiyun 	t_u8 Rx_NF_A;
1101*4882a593Smuzhiyun 	/** Noise floor for antenna A */
1102*4882a593Smuzhiyun 	t_u8 Rx_NF_B;
1103*4882a593Smuzhiyun 	/** Rx signal strength above noise floor */
1104*4882a593Smuzhiyun 	t_u8 Rx_SINR;
1105*4882a593Smuzhiyun 	/** Channel */
1106*4882a593Smuzhiyun 	t_u8 channel;
1107*4882a593Smuzhiyun 	/** user defined Chip ID */
1108*4882a593Smuzhiyun 	t_u16 chip_id;
1109*4882a593Smuzhiyun 	/** Reserved */
1110*4882a593Smuzhiyun 	t_u32 rsvd;
1111*4882a593Smuzhiyun 	/** CSI data length in DWORDs */
1112*4882a593Smuzhiyun 	t_u32 CSI_Data_Length;
1113*4882a593Smuzhiyun 	/** Start of CSI data */
1114*4882a593Smuzhiyun 	t_u8 CSI_Data[0];
1115*4882a593Smuzhiyun 	/** At the end of CSI raw data, user defined TailID of 4 bytes*/
1116*4882a593Smuzhiyun } MLAN_PACK_END csi_record_ds, *pcsi_record_ds;
1117*4882a593Smuzhiyun 
1118*4882a593Smuzhiyun /** mlan_ioctl_req data structure */
1119*4882a593Smuzhiyun typedef struct _mlan_ioctl_req {
1120*4882a593Smuzhiyun 	/** Pointer to previous mlan_ioctl_req */
1121*4882a593Smuzhiyun 	struct _mlan_ioctl_req *pprev;
1122*4882a593Smuzhiyun 	/** Pointer to next mlan_ioctl_req */
1123*4882a593Smuzhiyun 	struct _mlan_ioctl_req *pnext;
1124*4882a593Smuzhiyun 	/** Status code from firmware/driver */
1125*4882a593Smuzhiyun 	t_u32 status_code;
1126*4882a593Smuzhiyun 	/** BSS index number for multiple BSS support */
1127*4882a593Smuzhiyun 	t_u32 bss_index;
1128*4882a593Smuzhiyun 	/** Request id */
1129*4882a593Smuzhiyun 	t_u32 req_id;
1130*4882a593Smuzhiyun 	/** Action: set or get */
1131*4882a593Smuzhiyun 	t_u32 action;
1132*4882a593Smuzhiyun 	/** Pointer to buffer */
1133*4882a593Smuzhiyun 	t_u8 *pbuf;
1134*4882a593Smuzhiyun 	/** Length of buffer */
1135*4882a593Smuzhiyun 	t_u32 buf_len;
1136*4882a593Smuzhiyun 	/** Length of the data read/written in buffer */
1137*4882a593Smuzhiyun 	t_u32 data_read_written;
1138*4882a593Smuzhiyun 	/** Length of buffer needed */
1139*4882a593Smuzhiyun 	t_u32 buf_len_needed;
1140*4882a593Smuzhiyun 	/** Reserved for MOAL module */
1141*4882a593Smuzhiyun 	t_ptr reserved_1;
1142*4882a593Smuzhiyun } mlan_ioctl_req, *pmlan_ioctl_req;
1143*4882a593Smuzhiyun 
1144*4882a593Smuzhiyun typedef MLAN_PACK_START struct _mix_rate_info {
1145*4882a593Smuzhiyun 	/**  bit0: LGI: gi=0, SGI: gi= 1 */
1146*4882a593Smuzhiyun 	/**  bit1-2: 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3  */
1147*4882a593Smuzhiyun 	/**  bit3-4: LG: format=0, HT: format=1, VHT: format=2 */
1148*4882a593Smuzhiyun 	/**  bit5: LDPC: 0-not support,  1-support */
1149*4882a593Smuzhiyun 	/**  bit6-7:reserved */
1150*4882a593Smuzhiyun 	t_u8 rate_info;
1151*4882a593Smuzhiyun 	/** MCS index */
1152*4882a593Smuzhiyun 	t_u8 mcs_index;
1153*4882a593Smuzhiyun 	/** bitrate, in 500Kbps */
1154*4882a593Smuzhiyun 	t_u16 bitrate;
1155*4882a593Smuzhiyun } MLAN_PACK_END mix_rate_info, *pmix_rate_info;
1156*4882a593Smuzhiyun 
1157*4882a593Smuzhiyun typedef MLAN_PACK_START struct _rxpd_extra_info {
1158*4882a593Smuzhiyun 	/** flags */
1159*4882a593Smuzhiyun 	t_u8 flags;
1160*4882a593Smuzhiyun 	/** channel.flags */
1161*4882a593Smuzhiyun 	t_u16 channel_flags;
1162*4882a593Smuzhiyun 	/** mcs.known */
1163*4882a593Smuzhiyun 	t_u8 mcs_known;
1164*4882a593Smuzhiyun 	/** mcs.flags */
1165*4882a593Smuzhiyun 	t_u8 mcs_flags;
1166*4882a593Smuzhiyun 	/** vht sig1 */
1167*4882a593Smuzhiyun 	t_u32 vht_sig1;
1168*4882a593Smuzhiyun 	/** vht sig2 */
1169*4882a593Smuzhiyun 	t_u32 vht_sig2;
1170*4882a593Smuzhiyun } MLAN_PACK_END rxpd_extra_info, *prxpd_extra_info;
1171*4882a593Smuzhiyun 
1172*4882a593Smuzhiyun typedef MLAN_PACK_START struct _radiotap_info {
1173*4882a593Smuzhiyun 	/** Rate Info */
1174*4882a593Smuzhiyun 	mix_rate_info rate_info;
1175*4882a593Smuzhiyun 	/** SNR */
1176*4882a593Smuzhiyun 	t_s8 snr;
1177*4882a593Smuzhiyun 	/** Noise Floor */
1178*4882a593Smuzhiyun 	t_s8 nf;
1179*4882a593Smuzhiyun 	/** band config */
1180*4882a593Smuzhiyun 	t_u8 band_config;
1181*4882a593Smuzhiyun 	/** chan number */
1182*4882a593Smuzhiyun 	t_u8 chan_num;
1183*4882a593Smuzhiyun 	t_u8 antenna;
1184*4882a593Smuzhiyun 	/** extra rxpd info from FW */
1185*4882a593Smuzhiyun 	rxpd_extra_info extra_info;
1186*4882a593Smuzhiyun } MLAN_PACK_END radiotap_info, *pradiotap_info;
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun /** txpower structure */
1189*4882a593Smuzhiyun typedef MLAN_PACK_START struct {
1190*4882a593Smuzhiyun #ifdef BIG_ENDIAN_SUPPORT
1191*4882a593Smuzhiyun 	/** Host tx power ctrl:
1192*4882a593Smuzhiyun 	     0x0: use fw setting for TX power
1193*4882a593Smuzhiyun 	     0x1: value specified in bit[6] and bit[5:0] are valid */
1194*4882a593Smuzhiyun 	t_u8 hostctl : 1;
1195*4882a593Smuzhiyun 	/** Sign of the power specified in bit[5:0] */
1196*4882a593Smuzhiyun 	t_u8 sign : 1;
1197*4882a593Smuzhiyun 	/** Power to be used for transmission(in dBm) */
1198*4882a593Smuzhiyun 	t_u8 abs_val : 6;
1199*4882a593Smuzhiyun #else
1200*4882a593Smuzhiyun 	/** Power to be used for transmission(in dBm) */
1201*4882a593Smuzhiyun 	t_u8 abs_val : 6;
1202*4882a593Smuzhiyun 	/** Sign of the power specified in bit[5:0] */
1203*4882a593Smuzhiyun 	t_u8 sign : 1;
1204*4882a593Smuzhiyun 	/** Host tx power ctrl:
1205*4882a593Smuzhiyun 	     0x0: use fw setting for TX power
1206*4882a593Smuzhiyun 	     0x1: value specified in bit[6] and bit[5:0] are valid */
1207*4882a593Smuzhiyun 	t_u8 hostctl : 1;
1208*4882a593Smuzhiyun #endif
1209*4882a593Smuzhiyun } MLAN_PACK_END tx_power_t;
1210*4882a593Smuzhiyun /* pkt_txctrl */
1211*4882a593Smuzhiyun typedef MLAN_PACK_START struct _pkt_txctrl {
1212*4882a593Smuzhiyun 	/**Data rate in unit of 0.5Mbps */
1213*4882a593Smuzhiyun 	t_u16 data_rate;
1214*4882a593Smuzhiyun 	/*Channel number to transmit the frame */
1215*4882a593Smuzhiyun 	t_u8 channel;
1216*4882a593Smuzhiyun 	/** Bandwidth to transmit the frame*/
1217*4882a593Smuzhiyun 	t_u8 bw;
1218*4882a593Smuzhiyun 	/** Power to be used for transmission*/
1219*4882a593Smuzhiyun 	union {
1220*4882a593Smuzhiyun 		tx_power_t tp;
1221*4882a593Smuzhiyun 		t_u8 val;
1222*4882a593Smuzhiyun 	} tx_power;
1223*4882a593Smuzhiyun 	/** Retry time of tx transmission*/
1224*4882a593Smuzhiyun 	t_u8 retry_limit;
1225*4882a593Smuzhiyun } MLAN_PACK_END pkt_txctrl, *ppkt_txctrl;
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun /** pkt_rxinfo */
1228*4882a593Smuzhiyun typedef MLAN_PACK_START struct _pkt_rxinfo {
1229*4882a593Smuzhiyun 	/** Data rate of received paccket*/
1230*4882a593Smuzhiyun 	t_u16 data_rate;
1231*4882a593Smuzhiyun 	/** Channel on which packet was received*/
1232*4882a593Smuzhiyun 	t_u8 channel;
1233*4882a593Smuzhiyun 	/** Rx antenna*/
1234*4882a593Smuzhiyun 	t_u8 antenna;
1235*4882a593Smuzhiyun 	/** Rx Rssi*/
1236*4882a593Smuzhiyun 	t_u8 rssi;
1237*4882a593Smuzhiyun } MLAN_PACK_END pkt_rxinfo, *ppkt_rxinfo;
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun #define MC_FLAG_RETRY MBIT(0)
1240*4882a593Smuzhiyun #define MC_FLAG_START_CYCLE MBIT(1)
1241*4882a593Smuzhiyun #define MC_FLAG_END_CYCLE MBIT(2)
1242*4882a593Smuzhiyun #define MC_FLAG_START_AMPDU MBIT(3)
1243*4882a593Smuzhiyun #define MC_FLAG_END_AMPDU MBIT(4)
1244*4882a593Smuzhiyun /* mc pkt txcontrol */
1245*4882a593Smuzhiyun typedef MLAN_PACK_START struct _mc_txcontrol {
1246*4882a593Smuzhiyun 	/** Data rate in mcs index, 0-7 */
1247*4882a593Smuzhiyun 	t_u8 mcs_index;
1248*4882a593Smuzhiyun 	/** band width 0-20Mhz, 1-40Mhz */
1249*4882a593Smuzhiyun 	t_u8 bandwidth;
1250*4882a593Smuzhiyun 	/** seq_num */
1251*4882a593Smuzhiyun 	t_u16 seq_num;
1252*4882a593Smuzhiyun 	/** packet expiry time */
1253*4882a593Smuzhiyun 	t_u32 pkt_expiry;
1254*4882a593Smuzhiyun 	/** mc_pkt_flags */
1255*4882a593Smuzhiyun 	t_u8 mc_pkt_flags;
1256*4882a593Smuzhiyun } MLAN_PACK_END mc_txcontrol, *pmc_txcontrol;
1257*4882a593Smuzhiyun 
1258*4882a593Smuzhiyun /** mlan_buffer data structure */
1259*4882a593Smuzhiyun typedef struct _mlan_buffer {
1260*4882a593Smuzhiyun 	/** Pointer to previous mlan_buffer */
1261*4882a593Smuzhiyun 	struct _mlan_buffer *pprev;
1262*4882a593Smuzhiyun 	/** Pointer to next mlan_buffer */
1263*4882a593Smuzhiyun 	struct _mlan_buffer *pnext;
1264*4882a593Smuzhiyun 	/** Status code from firmware/driver */
1265*4882a593Smuzhiyun 	t_u32 status_code;
1266*4882a593Smuzhiyun 	/** Flags for this buffer */
1267*4882a593Smuzhiyun 	t_u32 flags;
1268*4882a593Smuzhiyun 	/** BSS index number for multiple BSS support */
1269*4882a593Smuzhiyun 	t_u32 bss_index;
1270*4882a593Smuzhiyun 	/** Buffer descriptor, e.g. skb in Linux */
1271*4882a593Smuzhiyun 	t_void *pdesc;
1272*4882a593Smuzhiyun 	/** Pointer to buffer */
1273*4882a593Smuzhiyun 	t_u8 *pbuf;
1274*4882a593Smuzhiyun #ifdef PCIE
1275*4882a593Smuzhiyun 	/** Physical address of the pbuf pointer */
1276*4882a593Smuzhiyun 	t_u64 buf_pa;
1277*4882a593Smuzhiyun 	t_u32 total_pcie_buf_len;
1278*4882a593Smuzhiyun #endif
1279*4882a593Smuzhiyun 	/** Offset to data */
1280*4882a593Smuzhiyun 	t_u32 data_offset;
1281*4882a593Smuzhiyun 	/** Data length */
1282*4882a593Smuzhiyun 	t_u32 data_len;
1283*4882a593Smuzhiyun 	/** Buffer type: data, cmd, event etc. */
1284*4882a593Smuzhiyun 	mlan_buf_type buf_type;
1285*4882a593Smuzhiyun 
1286*4882a593Smuzhiyun 	/** Fields below are valid for data packet only */
1287*4882a593Smuzhiyun 	/** QoS priority */
1288*4882a593Smuzhiyun 	t_u32 priority;
1289*4882a593Smuzhiyun 	/** Time stamp when packet is received (seconds) */
1290*4882a593Smuzhiyun 	t_u32 in_ts_sec;
1291*4882a593Smuzhiyun 	/** Time stamp when packet is received (micro seconds) */
1292*4882a593Smuzhiyun 	t_u32 in_ts_usec;
1293*4882a593Smuzhiyun 	/** Time stamp when packet is processed (seconds) */
1294*4882a593Smuzhiyun 	t_u32 out_ts_sec;
1295*4882a593Smuzhiyun 	/** Time stamp when packet is processed (micro seconds) */
1296*4882a593Smuzhiyun 	t_u32 out_ts_usec;
1297*4882a593Smuzhiyun 	/** tx_seq_num */
1298*4882a593Smuzhiyun 	t_u32 tx_seq_num;
1299*4882a593Smuzhiyun 	/** Time stamp when packet is deque from rx_q(seconds) */
1300*4882a593Smuzhiyun 	t_u32 extra_ts_sec;
1301*4882a593Smuzhiyun 	/** Time stamp when packet is dequed from rx_q(micro seconds) */
1302*4882a593Smuzhiyun 	t_u32 extra_ts_usec;
1303*4882a593Smuzhiyun 	/** Fields below are valid for MLAN module only */
1304*4882a593Smuzhiyun 	/** Pointer to parent mlan_buffer */
1305*4882a593Smuzhiyun 	struct _mlan_buffer *pparent;
1306*4882a593Smuzhiyun 	/** Use count for this buffer */
1307*4882a593Smuzhiyun 	t_u32 use_count;
1308*4882a593Smuzhiyun 	union {
1309*4882a593Smuzhiyun 		mc_txcontrol mc_tx_info;
1310*4882a593Smuzhiyun 		pkt_txctrl tx_info;
1311*4882a593Smuzhiyun 		pkt_rxinfo rx_info;
1312*4882a593Smuzhiyun 	} u;
1313*4882a593Smuzhiyun } mlan_buffer, *pmlan_buffer, **ppmlan_buffer;
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun /** mlan_hw_info data structure */
1316*4882a593Smuzhiyun typedef struct _mlan_hw_info {
1317*4882a593Smuzhiyun 	t_u32 fw_cap;
1318*4882a593Smuzhiyun 	t_u32 fw_cap_ext;
1319*4882a593Smuzhiyun } mlan_hw_info, *pmlan_hw_info;
1320*4882a593Smuzhiyun 
1321*4882a593Smuzhiyun /** mlan_bss_attr data structure */
1322*4882a593Smuzhiyun typedef struct _mlan_bss_attr {
1323*4882a593Smuzhiyun 	/** BSS type */
1324*4882a593Smuzhiyun 	t_u32 bss_type;
1325*4882a593Smuzhiyun 	/** Data frame type: Ethernet II, 802.11, etc. */
1326*4882a593Smuzhiyun 	t_u32 frame_type;
1327*4882a593Smuzhiyun 	/** The BSS is active (non-0) or not (0). */
1328*4882a593Smuzhiyun 	t_u32 active;
1329*4882a593Smuzhiyun 	/** BSS Priority */
1330*4882a593Smuzhiyun 	t_u32 bss_priority;
1331*4882a593Smuzhiyun 	/** BSS number */
1332*4882a593Smuzhiyun 	t_u32 bss_num;
1333*4882a593Smuzhiyun 	/** The BSS is virtual */
1334*4882a593Smuzhiyun 	t_u32 bss_virtual;
1335*4882a593Smuzhiyun } mlan_bss_attr, *pmlan_bss_attr;
1336*4882a593Smuzhiyun 
1337*4882a593Smuzhiyun /** bss tbl data structure */
1338*4882a593Smuzhiyun typedef struct _mlan_bss_tbl {
1339*4882a593Smuzhiyun 	/** BSS Attributes */
1340*4882a593Smuzhiyun 	mlan_bss_attr bss_attr[MLAN_MAX_BSS_NUM];
1341*4882a593Smuzhiyun } mlan_bss_tbl, *pmlan_bss_tbl;
1342*4882a593Smuzhiyun 
1343*4882a593Smuzhiyun #ifdef PRAGMA_PACK
1344*4882a593Smuzhiyun #pragma pack(push, 1)
1345*4882a593Smuzhiyun #endif
1346*4882a593Smuzhiyun 
1347*4882a593Smuzhiyun /** Type enumeration for the command result */
1348*4882a593Smuzhiyun typedef MLAN_PACK_START enum _mlan_cmd_result_e {
1349*4882a593Smuzhiyun 	MLAN_CMD_RESULT_SUCCESS = 0,
1350*4882a593Smuzhiyun 	MLAN_CMD_RESULT_FAILURE = 1,
1351*4882a593Smuzhiyun 	MLAN_CMD_RESULT_TIMEOUT = 2,
1352*4882a593Smuzhiyun 	MLAN_CMD_RESULT_INVALID_DATA = 3
1353*4882a593Smuzhiyun } MLAN_PACK_END mlan_cmd_result_e;
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun /** Type enumeration of WMM AC_QUEUES */
1356*4882a593Smuzhiyun typedef MLAN_PACK_START enum _mlan_wmm_ac_e {
1357*4882a593Smuzhiyun 	WMM_AC_BK,
1358*4882a593Smuzhiyun 	WMM_AC_BE,
1359*4882a593Smuzhiyun 	WMM_AC_VI,
1360*4882a593Smuzhiyun 	WMM_AC_VO
1361*4882a593Smuzhiyun } MLAN_PACK_END mlan_wmm_ac_e;
1362*4882a593Smuzhiyun 
1363*4882a593Smuzhiyun /** Type enumeration for the action field in the Queue Config command */
1364*4882a593Smuzhiyun typedef MLAN_PACK_START enum _mlan_wmm_queue_config_action_e {
1365*4882a593Smuzhiyun 	MLAN_WMM_QUEUE_CONFIG_ACTION_GET = 0,
1366*4882a593Smuzhiyun 	MLAN_WMM_QUEUE_CONFIG_ACTION_SET = 1,
1367*4882a593Smuzhiyun 	MLAN_WMM_QUEUE_CONFIG_ACTION_DEFAULT = 2,
1368*4882a593Smuzhiyun 	MLAN_WMM_QUEUE_CONFIG_ACTION_MAX
1369*4882a593Smuzhiyun } MLAN_PACK_END mlan_wmm_queue_config_action_e;
1370*4882a593Smuzhiyun 
1371*4882a593Smuzhiyun /** Type enumeration for the action field in the queue stats command */
1372*4882a593Smuzhiyun typedef MLAN_PACK_START enum _mlan_wmm_queue_stats_action_e {
1373*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_START = 0,
1374*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_STOP = 1,
1375*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_GET_CLR = 2,
1376*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_SET_CFG = 3, /* Not currently used */
1377*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_GET_CFG = 4, /* Not currently used */
1378*4882a593Smuzhiyun 	MLAN_WMM_STATS_ACTION_MAX
1379*4882a593Smuzhiyun } MLAN_PACK_END mlan_wmm_queue_stats_action_e;
1380*4882a593Smuzhiyun 
1381*4882a593Smuzhiyun /**
1382*4882a593Smuzhiyun  *  @brief IOCTL structure for a Traffic stream status.
1383*4882a593Smuzhiyun  *
1384*4882a593Smuzhiyun  */
1385*4882a593Smuzhiyun typedef MLAN_PACK_START struct {
1386*4882a593Smuzhiyun 	/** TSID: Range: 0->7 */
1387*4882a593Smuzhiyun 	t_u8 tid;
1388*4882a593Smuzhiyun 	/** TSID specified is valid */
1389*4882a593Smuzhiyun 	t_u8 valid;
1390*4882a593Smuzhiyun 	/** AC TSID is active on */
1391*4882a593Smuzhiyun 	t_u8 access_category;
1392*4882a593Smuzhiyun 	/** UP specified for the TSID */
1393*4882a593Smuzhiyun 	t_u8 user_priority;
1394*4882a593Smuzhiyun 	/** Power save mode for TSID: 0 (legacy), 1 (UAPSD) */
1395*4882a593Smuzhiyun 	t_u8 psb;
1396*4882a593Smuzhiyun 	/** Upstream(0), Downlink(1), Bidirectional(3) */
1397*4882a593Smuzhiyun 	t_u8 flow_dir;
1398*4882a593Smuzhiyun 	/** Medium time granted for the TSID */
1399*4882a593Smuzhiyun 	t_u16 medium_time;
1400*4882a593Smuzhiyun } MLAN_PACK_END wlan_ioctl_wmm_ts_status_t,
1401*4882a593Smuzhiyun 	/** Type definition of mlan_ds_wmm_ts_status for
1402*4882a593Smuzhiyun 	   MLAN_OID_WMM_CFG_TS_STATUS */
1403*4882a593Smuzhiyun 	mlan_ds_wmm_ts_status, *pmlan_ds_wmm_ts_status;
1404*4882a593Smuzhiyun 
1405*4882a593Smuzhiyun /** Max Ie length */
1406*4882a593Smuzhiyun #define MAX_IE_SIZE 256
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun /** custom IE */
1409*4882a593Smuzhiyun typedef MLAN_PACK_START struct _custom_ie {
1410*4882a593Smuzhiyun 	/** IE Index */
1411*4882a593Smuzhiyun 	t_u16 ie_index;
1412*4882a593Smuzhiyun 	/** Mgmt Subtype Mask */
1413*4882a593Smuzhiyun 	t_u16 mgmt_subtype_mask;
1414*4882a593Smuzhiyun 	/** IE Length */
1415*4882a593Smuzhiyun 	t_u16 ie_length;
1416*4882a593Smuzhiyun 	/** IE buffer */
1417*4882a593Smuzhiyun 	t_u8 ie_buffer[MAX_IE_SIZE];
1418*4882a593Smuzhiyun } MLAN_PACK_END custom_ie;
1419*4882a593Smuzhiyun 
1420*4882a593Smuzhiyun /** Max IE index to FW */
1421*4882a593Smuzhiyun #define MAX_MGMT_IE_INDEX_TO_FW 4
1422*4882a593Smuzhiyun /** Max IE index per BSS */
1423*4882a593Smuzhiyun #define MAX_MGMT_IE_INDEX 26
1424*4882a593Smuzhiyun 
1425*4882a593Smuzhiyun /** custom IE info */
1426*4882a593Smuzhiyun typedef MLAN_PACK_START struct _custom_ie_info {
1427*4882a593Smuzhiyun 	/** size of buffer */
1428*4882a593Smuzhiyun 	t_u16 buf_size;
1429*4882a593Smuzhiyun 	/** no of buffers of buf_size */
1430*4882a593Smuzhiyun 	t_u16 buf_count;
1431*4882a593Smuzhiyun } MLAN_PACK_END custom_ie_info;
1432*4882a593Smuzhiyun 
1433*4882a593Smuzhiyun /** TLV buffer : Max Mgmt IE */
1434*4882a593Smuzhiyun typedef MLAN_PACK_START struct _tlvbuf_max_mgmt_ie {
1435*4882a593Smuzhiyun 	/** Type */
1436*4882a593Smuzhiyun 	t_u16 type;
1437*4882a593Smuzhiyun 	/** Length */
1438*4882a593Smuzhiyun 	t_u16 len;
1439*4882a593Smuzhiyun 	/** No of tuples */
1440*4882a593Smuzhiyun 	t_u16 count;
1441*4882a593Smuzhiyun 	/** custom IE info tuples */
1442*4882a593Smuzhiyun 	custom_ie_info info[MAX_MGMT_IE_INDEX];
1443*4882a593Smuzhiyun } MLAN_PACK_END tlvbuf_max_mgmt_ie;
1444*4882a593Smuzhiyun 
1445*4882a593Smuzhiyun /** TLV buffer : custom IE */
1446*4882a593Smuzhiyun typedef MLAN_PACK_START struct _tlvbuf_custom_ie {
1447*4882a593Smuzhiyun 	/** Type */
1448*4882a593Smuzhiyun 	t_u16 type;
1449*4882a593Smuzhiyun 	/** Length */
1450*4882a593Smuzhiyun 	t_u16 len;
1451*4882a593Smuzhiyun 	/** IE data */
1452*4882a593Smuzhiyun 	custom_ie ie_data_list[MAX_MGMT_IE_INDEX_TO_FW];
1453*4882a593Smuzhiyun 	/** Max mgmt IE TLV */
1454*4882a593Smuzhiyun 	tlvbuf_max_mgmt_ie max_mgmt_ie;
1455*4882a593Smuzhiyun } MLAN_PACK_END mlan_ds_misc_custom_ie;
1456*4882a593Smuzhiyun 
1457*4882a593Smuzhiyun /** Max TDLS config data length */
1458*4882a593Smuzhiyun #define MAX_TDLS_DATA_LEN 1024
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun /** Action commands for TDLS enable/disable */
1461*4882a593Smuzhiyun #define WLAN_TDLS_CONFIG 0x00
1462*4882a593Smuzhiyun /** Action commands for TDLS configuration :Set */
1463*4882a593Smuzhiyun #define WLAN_TDLS_SET_INFO 0x01
1464*4882a593Smuzhiyun /** Action commands for TDLS configuration :Discovery Request */
1465*4882a593Smuzhiyun #define WLAN_TDLS_DISCOVERY_REQ 0x02
1466*4882a593Smuzhiyun /** Action commands for TDLS configuration :Setup Request */
1467*4882a593Smuzhiyun #define WLAN_TDLS_SETUP_REQ 0x03
1468*4882a593Smuzhiyun /** Action commands for TDLS configuration :Tear down Request */
1469*4882a593Smuzhiyun #define WLAN_TDLS_TEAR_DOWN_REQ 0x04
1470*4882a593Smuzhiyun /** Action ID for TDLS power mode */
1471*4882a593Smuzhiyun #define WLAN_TDLS_POWER_MODE 0x05
1472*4882a593Smuzhiyun /**Action ID for init TDLS Channel Switch*/
1473*4882a593Smuzhiyun #define WLAN_TDLS_INIT_CHAN_SWITCH 0x06
1474*4882a593Smuzhiyun /** Action ID for stop TDLS Channel Switch */
1475*4882a593Smuzhiyun #define WLAN_TDLS_STOP_CHAN_SWITCH 0x07
1476*4882a593Smuzhiyun /** Action ID for configure CS related parameters */
1477*4882a593Smuzhiyun #define WLAN_TDLS_CS_PARAMS 0x08
1478*4882a593Smuzhiyun /** Action ID for Disable CS */
1479*4882a593Smuzhiyun #define WLAN_TDLS_CS_DISABLE 0x09
1480*4882a593Smuzhiyun /** Action ID for TDLS link status */
1481*4882a593Smuzhiyun #define WLAN_TDLS_LINK_STATUS 0x0A
1482*4882a593Smuzhiyun /** Action ID for Host TDLS config uapsd and CS */
1483*4882a593Smuzhiyun #define WLAN_HOST_TDLS_CONFIG 0x0D
1484*4882a593Smuzhiyun /** Action ID for TDLS CS immediate return */
1485*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_CS_RET_IM 0xFFF7
1486*4882a593Smuzhiyun /** Action ID for TDLS Stop RX */
1487*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_STOP_RX 0xFFF8
1488*4882a593Smuzhiyun /** Action ID for TDLS Allow weak security for links establish */
1489*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_ALLOW_WEAK_SECURITY 0xFFF9
1490*4882a593Smuzhiyun /** Action ID for TDLS Ignore key lifetime expiry */
1491*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_IGNORE_KEY_EXPIRY 0xFFFA
1492*4882a593Smuzhiyun /** Action ID for TDLS Higher/Lower mac Test */
1493*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_HIGHER_LOWER_MAC 0xFFFB
1494*4882a593Smuzhiyun /** Action ID for TDLS Prohibited Test */
1495*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_SETUP_PROHIBITED 0xFFFC
1496*4882a593Smuzhiyun /** Action ID for TDLS Existing link Test */
1497*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_SETUP_SAME_LINK 0xFFFD
1498*4882a593Smuzhiyun /** Action ID for TDLS Fail Setup Confirm */
1499*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_FAIL_SETUP_CONFIRM 0xFFFE
1500*4882a593Smuzhiyun /** Action commands for TDLS debug: Wrong BSS Request */
1501*4882a593Smuzhiyun #define WLAN_TDLS_DEBUG_WRONG_BSS 0xFFFF
1502*4882a593Smuzhiyun 
1503*4882a593Smuzhiyun /** tdls each link rate information */
1504*4882a593Smuzhiyun typedef MLAN_PACK_START struct _tdls_link_rate_info {
1505*4882a593Smuzhiyun 	/** Tx Data Rate */
1506*4882a593Smuzhiyun 	t_u8 tx_data_rate;
1507*4882a593Smuzhiyun 	/** Tx Rate HT info*/
1508*4882a593Smuzhiyun 	t_u8 tx_rate_htinfo;
1509*4882a593Smuzhiyun } MLAN_PACK_END tdls_link_rate_info;
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun /** tdls each link status */
1512*4882a593Smuzhiyun typedef MLAN_PACK_START struct _tdls_each_link_status {
1513*4882a593Smuzhiyun 	/** peer mac Address */
1514*4882a593Smuzhiyun 	t_u8 peer_mac[MLAN_MAC_ADDR_LENGTH];
1515*4882a593Smuzhiyun 	/** Link Flags */
1516*4882a593Smuzhiyun 	t_u8 link_flags;
1517*4882a593Smuzhiyun 	/** Traffic Status */
1518*4882a593Smuzhiyun 	t_u8 traffic_status;
1519*4882a593Smuzhiyun 	/** Tx Failure Count */
1520*4882a593Smuzhiyun 	t_u8 tx_fail_count;
1521*4882a593Smuzhiyun 	/** Channel Number */
1522*4882a593Smuzhiyun 	t_u32 active_channel;
1523*4882a593Smuzhiyun 	/** Last Data RSSI in dBm */
1524*4882a593Smuzhiyun 	t_s16 data_rssi_last;
1525*4882a593Smuzhiyun 	/** Last Data NF in dBm */
1526*4882a593Smuzhiyun 	t_s16 data_nf_last;
1527*4882a593Smuzhiyun 	/** AVG DATA RSSI in dBm */
1528*4882a593Smuzhiyun 	t_s16 data_rssi_avg;
1529*4882a593Smuzhiyun 	/** AVG DATA NF in dBm */
1530*4882a593Smuzhiyun 	t_s16 data_nf_avg;
1531*4882a593Smuzhiyun 	union {
1532*4882a593Smuzhiyun 		/** tdls rate info */
1533*4882a593Smuzhiyun 		tdls_link_rate_info rate_info;
1534*4882a593Smuzhiyun 		/** tdls link final rate*/
1535*4882a593Smuzhiyun 		t_u16 final_data_rate;
1536*4882a593Smuzhiyun 	} u;
1537*4882a593Smuzhiyun 	/** Security Method */
1538*4882a593Smuzhiyun 	t_u8 security_method;
1539*4882a593Smuzhiyun 	/** Key Lifetime in milliseconds */
1540*4882a593Smuzhiyun 	t_u32 key_lifetime;
1541*4882a593Smuzhiyun 	/** Key Length */
1542*4882a593Smuzhiyun 	t_u8 key_length;
1543*4882a593Smuzhiyun 	/** actual key */
1544*4882a593Smuzhiyun 	t_u8 key[1];
1545*4882a593Smuzhiyun } MLAN_PACK_END tdls_each_link_status;
1546*4882a593Smuzhiyun 
1547*4882a593Smuzhiyun /** TDLS configuration data */
1548*4882a593Smuzhiyun typedef MLAN_PACK_START struct _tdls_all_config {
1549*4882a593Smuzhiyun 	union {
1550*4882a593Smuzhiyun 		/** TDLS state enable disable */
1551*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_config {
1552*4882a593Smuzhiyun 			/** enable or disable */
1553*4882a593Smuzhiyun 			t_u16 enable;
1554*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_config;
1555*4882a593Smuzhiyun 		/** Host tdls config */
1556*4882a593Smuzhiyun 		MLAN_PACK_START struct _host_tdls_cfg {
1557*4882a593Smuzhiyun 			/** support uapsd */
1558*4882a593Smuzhiyun 			t_u8 uapsd_support;
1559*4882a593Smuzhiyun 			/** channel_switch */
1560*4882a593Smuzhiyun 			t_u8 cs_support;
1561*4882a593Smuzhiyun 			/** TLV  length */
1562*4882a593Smuzhiyun 			t_u16 tlv_len;
1563*4882a593Smuzhiyun 			/** tdls info */
1564*4882a593Smuzhiyun 			t_u8 tlv_buffer[];
1565*4882a593Smuzhiyun 		} MLAN_PACK_END host_tdls_cfg;
1566*4882a593Smuzhiyun 		/** TDLS set info */
1567*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_set_data {
1568*4882a593Smuzhiyun 			/** (tlv + capInfo) length */
1569*4882a593Smuzhiyun 			t_u16 tlv_length;
1570*4882a593Smuzhiyun 			/** Cap Info */
1571*4882a593Smuzhiyun 			t_u16 cap_info;
1572*4882a593Smuzhiyun 			/** TLV buffer */
1573*4882a593Smuzhiyun 			t_u8 tlv_buffer[];
1574*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_set;
1575*4882a593Smuzhiyun 
1576*4882a593Smuzhiyun 		/** TDLS discovery and others having mac argument */
1577*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_discovery_data {
1578*4882a593Smuzhiyun 			/** peer mac Address */
1579*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1580*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_discovery, tdls_stop_chan_switch,
1581*4882a593Smuzhiyun 			tdls_link_status_req;
1582*4882a593Smuzhiyun 
1583*4882a593Smuzhiyun 		/** TDLS discovery Response */
1584*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_discovery_resp {
1585*4882a593Smuzhiyun 			/** payload length */
1586*4882a593Smuzhiyun 			t_u16 payload_len;
1587*4882a593Smuzhiyun 			/** peer mac Address */
1588*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1589*4882a593Smuzhiyun 			/** RSSI */
1590*4882a593Smuzhiyun 			t_s8 rssi;
1591*4882a593Smuzhiyun 			/** Cap Info */
1592*4882a593Smuzhiyun 			t_u16 cap_info;
1593*4882a593Smuzhiyun 			/** TLV buffer */
1594*4882a593Smuzhiyun 			t_u8 tlv_buffer[];
1595*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_discovery_resp;
1596*4882a593Smuzhiyun 
1597*4882a593Smuzhiyun 		/** TDLS setup request */
1598*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_setup_data {
1599*4882a593Smuzhiyun 			/** peer mac Address */
1600*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1601*4882a593Smuzhiyun 			/** timeout value in milliseconds */
1602*4882a593Smuzhiyun 			t_u32 setup_timeout;
1603*4882a593Smuzhiyun 			/** key lifetime in milliseconds */
1604*4882a593Smuzhiyun 			t_u32 key_lifetime;
1605*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_setup;
1606*4882a593Smuzhiyun 
1607*4882a593Smuzhiyun 		/** TDLS tear down info */
1608*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_tear_down_data {
1609*4882a593Smuzhiyun 			/** peer mac Address */
1610*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1611*4882a593Smuzhiyun 			/** reason code */
1612*4882a593Smuzhiyun 			t_u16 reason_code;
1613*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_tear_down, tdls_cmd_resp;
1614*4882a593Smuzhiyun 
1615*4882a593Smuzhiyun 		/** TDLS power mode info */
1616*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_power_mode_data {
1617*4882a593Smuzhiyun 			/** peer mac Address */
1618*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1619*4882a593Smuzhiyun 			/** Power Mode */
1620*4882a593Smuzhiyun 			t_u16 power_mode;
1621*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_power_mode;
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun 		/** TDLS channel switch info */
1624*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_chan_switch {
1625*4882a593Smuzhiyun 			/** peer mac Address */
1626*4882a593Smuzhiyun 			t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1627*4882a593Smuzhiyun 			/** Channel Switch primary channel no */
1628*4882a593Smuzhiyun 			t_u8 primary_channel;
1629*4882a593Smuzhiyun 			/** Channel Switch secondary channel offset */
1630*4882a593Smuzhiyun 			t_u8 secondary_channel_offset;
1631*4882a593Smuzhiyun 			/** Channel Switch Band */
1632*4882a593Smuzhiyun 			t_u8 band;
1633*4882a593Smuzhiyun 			/** Channel Switch time in milliseconds */
1634*4882a593Smuzhiyun 			t_u16 switch_time;
1635*4882a593Smuzhiyun 			/** Channel Switch timeout in milliseconds */
1636*4882a593Smuzhiyun 			t_u16 switch_timeout;
1637*4882a593Smuzhiyun 			/** Channel Regulatory class*/
1638*4882a593Smuzhiyun 			t_u8 regulatory_class;
1639*4882a593Smuzhiyun 			/** peridicity flag*/
1640*4882a593Smuzhiyun 			t_u8 periodicity;
1641*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_chan_switch;
1642*4882a593Smuzhiyun 
1643*4882a593Smuzhiyun 		/** TDLS channel switch paramters */
1644*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_cs_params {
1645*4882a593Smuzhiyun 			/** unit time, multiples of 10ms */
1646*4882a593Smuzhiyun 			t_u8 unit_time;
1647*4882a593Smuzhiyun 			/** threshold for other link */
1648*4882a593Smuzhiyun 			t_u8 threshold_otherlink;
1649*4882a593Smuzhiyun 			/** threshold for direct link */
1650*4882a593Smuzhiyun 			t_u8 threshold_directlink;
1651*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_cs_params;
1652*4882a593Smuzhiyun 
1653*4882a593Smuzhiyun 		/** tdls disable channel switch */
1654*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_disable_cs {
1655*4882a593Smuzhiyun 			/** Data*/
1656*4882a593Smuzhiyun 			t_u16 data;
1657*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_disable_cs;
1658*4882a593Smuzhiyun 		/** TDLS debug data */
1659*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_debug_data {
1660*4882a593Smuzhiyun 			/** debug data */
1661*4882a593Smuzhiyun 			t_u16 debug_data;
1662*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_debug_data;
1663*4882a593Smuzhiyun 
1664*4882a593Smuzhiyun 		/** TDLS link status Response */
1665*4882a593Smuzhiyun 		MLAN_PACK_START struct _tdls_link_status_resp {
1666*4882a593Smuzhiyun 			/** payload length */
1667*4882a593Smuzhiyun 			t_u16 payload_len;
1668*4882a593Smuzhiyun 			/** number of links */
1669*4882a593Smuzhiyun 			t_u8 active_links;
1670*4882a593Smuzhiyun 			/** structure for link status */
1671*4882a593Smuzhiyun 			tdls_each_link_status link_stats[1];
1672*4882a593Smuzhiyun 		} MLAN_PACK_END tdls_link_status_resp;
1673*4882a593Smuzhiyun 
1674*4882a593Smuzhiyun 	} u;
1675*4882a593Smuzhiyun } MLAN_PACK_END tdls_all_config;
1676*4882a593Smuzhiyun 
1677*4882a593Smuzhiyun /** TDLS configuration buffer */
1678*4882a593Smuzhiyun typedef MLAN_PACK_START struct _buf_tdls_config {
1679*4882a593Smuzhiyun 	/** TDLS Action */
1680*4882a593Smuzhiyun 	t_u16 tdls_action;
1681*4882a593Smuzhiyun 	/** TDLS data */
1682*4882a593Smuzhiyun 	t_u8 tdls_data[MAX_TDLS_DATA_LEN];
1683*4882a593Smuzhiyun } MLAN_PACK_END mlan_ds_misc_tdls_config;
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun /** Event structure for tear down */
1686*4882a593Smuzhiyun typedef struct _tdls_tear_down_event {
1687*4882a593Smuzhiyun 	/** Peer mac address */
1688*4882a593Smuzhiyun 	t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH];
1689*4882a593Smuzhiyun 	/** Reason code */
1690*4882a593Smuzhiyun 	t_u16 reason_code;
1691*4882a593Smuzhiyun } tdls_tear_down_event;
1692*4882a593Smuzhiyun 
1693*4882a593Smuzhiyun /** channel width */
1694*4882a593Smuzhiyun typedef enum wifi_channel_width {
1695*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_20 = 0,
1696*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_40 = 1,
1697*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_80 = 2,
1698*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_160 = 3,
1699*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_80P80 = 4,
1700*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_5 = 5,
1701*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_10 = 6,
1702*4882a593Smuzhiyun 	WIFI_CHAN_WIDTH_INVALID = -1
1703*4882a593Smuzhiyun } wifi_channel_width_t;
1704*4882a593Smuzhiyun 
1705*4882a593Smuzhiyun /** channel information */
1706*4882a593Smuzhiyun typedef struct {
1707*4882a593Smuzhiyun 	/** channel width (20, 40, 80, 80+80, 160) */
1708*4882a593Smuzhiyun 	wifi_channel_width_t width;
1709*4882a593Smuzhiyun 	/** primary 20 MHz channel */
1710*4882a593Smuzhiyun 	int center_freq;
1711*4882a593Smuzhiyun 	/** center frequency (MHz) first segment */
1712*4882a593Smuzhiyun 	int center_freq0;
1713*4882a593Smuzhiyun 	/** center frequency (MHz) second segment */
1714*4882a593Smuzhiyun 	int center_freq1;
1715*4882a593Smuzhiyun } wifi_channel_info;
1716*4882a593Smuzhiyun 
1717*4882a593Smuzhiyun /** wifi rate */
1718*4882a593Smuzhiyun typedef struct {
1719*4882a593Smuzhiyun 	/** 0: OFDM, 1:CCK, 2:HT 3:VHT 4..7 reserved */
1720*4882a593Smuzhiyun 	t_u32 preamble : 3;
1721*4882a593Smuzhiyun 	/** 0:1x1, 1:2x2, 3:3x3, 4:4x4 */
1722*4882a593Smuzhiyun 	t_u32 nss : 2;
1723*4882a593Smuzhiyun 	/** 0:20MHz, 1:40Mhz, 2:80Mhz, 3:160Mhz */
1724*4882a593Smuzhiyun 	t_u32 bw : 3;
1725*4882a593Smuzhiyun 	/** OFDM/CCK rate code would be as per ieee std in the units of 0.5mbps
1726*4882a593Smuzhiyun 	 */
1727*4882a593Smuzhiyun 	/** HT/VHT it would be mcs index */
1728*4882a593Smuzhiyun 	t_u32 rateMcsIdx : 8;
1729*4882a593Smuzhiyun 	/** reserved */
1730*4882a593Smuzhiyun 	t_u32 reserved : 16;
1731*4882a593Smuzhiyun 	/** units of 100 Kbps */
1732*4882a593Smuzhiyun 	t_u32 bitrate;
1733*4882a593Smuzhiyun } wifi_rate;
1734*4882a593Smuzhiyun 
1735*4882a593Smuzhiyun /** wifi Preamble type */
1736*4882a593Smuzhiyun typedef enum {
1737*4882a593Smuzhiyun 	WIFI_PREAMBLE_LEGACY = 0x1,
1738*4882a593Smuzhiyun 	WIFI_PREAMBLE_HT = 0x2,
1739*4882a593Smuzhiyun 	WIFI_PREAMBLE_VHT = 0x4
1740*4882a593Smuzhiyun } wifi_preamble;
1741*4882a593Smuzhiyun 
1742*4882a593Smuzhiyun /** timeval */
1743*4882a593Smuzhiyun typedef struct {
1744*4882a593Smuzhiyun 	/** Time (seconds) */
1745*4882a593Smuzhiyun 	t_u32 time_sec;
1746*4882a593Smuzhiyun 	/** Time (micro seconds) */
1747*4882a593Smuzhiyun 	t_u32 time_usec;
1748*4882a593Smuzhiyun } wifi_timeval;
1749*4882a593Smuzhiyun 
1750*4882a593Smuzhiyun #define MAX_NUM_RATE 32
1751*4882a593Smuzhiyun #define MAX_RADIO 2
1752*4882a593Smuzhiyun #define MAX_NUM_CHAN 1
1753*4882a593Smuzhiyun #define VHT_NUM_SUPPORT_MCS 10
1754*4882a593Smuzhiyun #define MCS_NUM_SUPP 16
1755*4882a593Smuzhiyun 
1756*4882a593Smuzhiyun #define BUF_MAXLEN 4096
1757*4882a593Smuzhiyun /** connection state */
1758*4882a593Smuzhiyun typedef enum {
1759*4882a593Smuzhiyun 	MLAN_DISCONNECTED = 0,
1760*4882a593Smuzhiyun 	MLAN_AUTHENTICATING = 1,
1761*4882a593Smuzhiyun 	MLAN_ASSOCIATING = 2,
1762*4882a593Smuzhiyun 	MLAN_ASSOCIATED = 3,
1763*4882a593Smuzhiyun 	/** if done by firmware/driver */
1764*4882a593Smuzhiyun 	MLAN_EAPOL_STARTED = 4,
1765*4882a593Smuzhiyun 	/** if done by firmware/driver */
1766*4882a593Smuzhiyun 	MLAN_EAPOL_COMPLETED = 5,
1767*4882a593Smuzhiyun } mlan_connection_state;
1768*4882a593Smuzhiyun /** roam state */
1769*4882a593Smuzhiyun typedef enum {
1770*4882a593Smuzhiyun 	MLAN_ROAMING_IDLE = 0,
1771*4882a593Smuzhiyun 	MLAN_ROAMING_ACTIVE = 1,
1772*4882a593Smuzhiyun } mlan_roam_state;
1773*4882a593Smuzhiyun /** interface mode */
1774*4882a593Smuzhiyun typedef enum {
1775*4882a593Smuzhiyun 	MLAN_INTERFACE_STA = 0,
1776*4882a593Smuzhiyun 	MLAN_INTERFACE_SOFTAP = 1,
1777*4882a593Smuzhiyun 	MLAN_INTERFACE_IBSS = 2,
1778*4882a593Smuzhiyun 	MLAN_INTERFACE_P2P_CLIENT = 3,
1779*4882a593Smuzhiyun 	MLAN_INTERFACE_P2P_GO = 4,
1780*4882a593Smuzhiyun 	MLAN_INTERFACE_NAN = 5,
1781*4882a593Smuzhiyun 	MLAN_INTERFACE_MESH = 6,
1782*4882a593Smuzhiyun } mlan_interface_mode;
1783*4882a593Smuzhiyun 
1784*4882a593Smuzhiyun /** set for QOS association */
1785*4882a593Smuzhiyun #define MLAN_CAPABILITY_QOS 0x00000001
1786*4882a593Smuzhiyun /** set for protected association (802.11 beacon frame control protected bit
1787*4882a593Smuzhiyun  * set) */
1788*4882a593Smuzhiyun #define MLAN_CAPABILITY_PROTECTED 0x00000002
1789*4882a593Smuzhiyun /** set if 802.11 Extended Capabilities element interworking bit is set */
1790*4882a593Smuzhiyun #define MLAN_CAPABILITY_INTERWORKING 0x00000004
1791*4882a593Smuzhiyun /** set for HS20 association */
1792*4882a593Smuzhiyun #define MLAN_CAPABILITY_HS20 0x00000008
1793*4882a593Smuzhiyun /** set is 802.11 Extended Capabilities element UTF-8 SSID bit is set */
1794*4882a593Smuzhiyun #define MLAN_CAPABILITY_SSID_UTF8 0x00000010
1795*4882a593Smuzhiyun /** set is 802.11 Country Element is present */
1796*4882a593Smuzhiyun #define MLAN_CAPABILITY_COUNTRY 0x00000020
1797*4882a593Smuzhiyun 
1798*4882a593Smuzhiyun /** link layer status */
1799*4882a593Smuzhiyun typedef struct {
1800*4882a593Smuzhiyun 	/** interface mode */
1801*4882a593Smuzhiyun 	mlan_interface_mode mode;
1802*4882a593Smuzhiyun 	/** interface mac address (self) */
1803*4882a593Smuzhiyun 	t_u8 mac_addr[6];
1804*4882a593Smuzhiyun 	/** connection state (valid for STA, CLI only) */
1805*4882a593Smuzhiyun 	mlan_connection_state state;
1806*4882a593Smuzhiyun 	/** roaming state */
1807*4882a593Smuzhiyun 	mlan_roam_state roaming;
1808*4882a593Smuzhiyun 	/** WIFI_CAPABILITY_XXX (self) */
1809*4882a593Smuzhiyun 	t_u32 capabilities;
1810*4882a593Smuzhiyun 	/** null terminated SSID */
1811*4882a593Smuzhiyun 	t_u8 ssid[33];
1812*4882a593Smuzhiyun 	/** bssid */
1813*4882a593Smuzhiyun 	t_u8 bssid[6];
1814*4882a593Smuzhiyun 	/** country string advertised by AP */
1815*4882a593Smuzhiyun 	t_u8 ap_country_str[3];
1816*4882a593Smuzhiyun 	/** country string for this association */
1817*4882a593Smuzhiyun 	t_u8 country_str[3];
1818*4882a593Smuzhiyun } mlan_interface_link_layer_info, *mlan_interface_handle;
1819*4882a593Smuzhiyun 
1820*4882a593Smuzhiyun /** channel statistics */
1821*4882a593Smuzhiyun typedef struct {
1822*4882a593Smuzhiyun 	/** channel */
1823*4882a593Smuzhiyun 	wifi_channel_info channel;
1824*4882a593Smuzhiyun 	/** msecs the radio is awake (32 bits number accruing over time) */
1825*4882a593Smuzhiyun 	t_u32 on_time;
1826*4882a593Smuzhiyun 	/** msecs the CCA register is busy (32 bits number accruing over time)
1827*4882a593Smuzhiyun 	 */
1828*4882a593Smuzhiyun 	t_u32 cca_busy_time;
1829*4882a593Smuzhiyun } wifi_channel_stat;
1830*4882a593Smuzhiyun 
1831*4882a593Smuzhiyun #define timeval_to_msec(timeval)                                               \
1832*4882a593Smuzhiyun 	(t_u64)((t_u64)(timeval.time_sec) * 1000 +                             \
1833*4882a593Smuzhiyun 		(t_u64)(timeval.time_usec) / 1000)
1834*4882a593Smuzhiyun #define timeval_to_usec(timeval)                                               \
1835*4882a593Smuzhiyun 	(t_u64)((t_u64)(timeval.time_sec) * 1000 * 1000 +                      \
1836*4882a593Smuzhiyun 		(t_u64)(timeval.time_usec))
1837*4882a593Smuzhiyun #define is_zero_timeval(timeval)                                               \
1838*4882a593Smuzhiyun 	((timeval.time_sec == 0) && (timeval.time_usec == 0))
1839*4882a593Smuzhiyun 
1840*4882a593Smuzhiyun /** radio statistics */
1841*4882a593Smuzhiyun typedef struct {
1842*4882a593Smuzhiyun 	/** wifi radio (if multiple radio supported) */
1843*4882a593Smuzhiyun 	int radio;
1844*4882a593Smuzhiyun 	/** msecs the radio is awake (32 bits number accruing over time) */
1845*4882a593Smuzhiyun 	t_u32 on_time;
1846*4882a593Smuzhiyun 	/** msecs the radio is transmitting (32 bits number accruing over time)
1847*4882a593Smuzhiyun 	 */
1848*4882a593Smuzhiyun 	t_u32 tx_time;
1849*4882a593Smuzhiyun 	/**  TBD: num_tx_levels: number of radio transmit power levels */
1850*4882a593Smuzhiyun 	t_u32 reserved0;
1851*4882a593Smuzhiyun 	/** TBD: tx_time_per_levels: pointer to an array of radio transmit per
1852*4882a593Smuzhiyun 	 * power levels in msecs accured over time */
1853*4882a593Smuzhiyun 	/* t_u32 *reserved1;*/
1854*4882a593Smuzhiyun 	/** msecs the radio is in active receive (32 bits number accruing over
1855*4882a593Smuzhiyun 	 * time) */
1856*4882a593Smuzhiyun 	t_u32 rx_time;
1857*4882a593Smuzhiyun 	/** msecs the radio is awake due to all scan (32 bits number accruing
1858*4882a593Smuzhiyun 	 * over time) */
1859*4882a593Smuzhiyun 	t_u32 on_time_scan;
1860*4882a593Smuzhiyun 	/** msecs the radio is awake due to NAN (32 bits number accruing over
1861*4882a593Smuzhiyun 	 * time) */
1862*4882a593Smuzhiyun 	t_u32 on_time_nbd;
1863*4882a593Smuzhiyun 	/** msecs the radio is awake due to G?scan (32 bits number accruing over
1864*4882a593Smuzhiyun 	 * time) */
1865*4882a593Smuzhiyun 	t_u32 on_time_gscan;
1866*4882a593Smuzhiyun 	/** msecs the radio is awake due to roam?scan (32 bits number accruing
1867*4882a593Smuzhiyun 	 * over time) */
1868*4882a593Smuzhiyun 	t_u32 on_time_roam_scan;
1869*4882a593Smuzhiyun 	/** msecs the radio is awake due to PNO scan (32 bits number accruing
1870*4882a593Smuzhiyun 	 * over time) */
1871*4882a593Smuzhiyun 	t_u32 on_time_pno_scan;
1872*4882a593Smuzhiyun 	/** msecs the radio is awake due to HS2.0 scans and GAS exchange (32
1873*4882a593Smuzhiyun 	 * bits number accruing over time) */
1874*4882a593Smuzhiyun 	t_u32 on_time_hs20;
1875*4882a593Smuzhiyun 	/** number of channels */
1876*4882a593Smuzhiyun 	t_u32 num_channels;
1877*4882a593Smuzhiyun 	/** channel statistics */
1878*4882a593Smuzhiyun 	wifi_channel_stat channels[MAX_NUM_CHAN];
1879*4882a593Smuzhiyun } wifi_radio_stat;
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun /** per rate statistics */
1882*4882a593Smuzhiyun typedef struct {
1883*4882a593Smuzhiyun 	/** rate information */
1884*4882a593Smuzhiyun 	wifi_rate rate;
1885*4882a593Smuzhiyun 	/** number of successfully transmitted data pkts (ACK rcvd) */
1886*4882a593Smuzhiyun 	t_u32 tx_mpdu;
1887*4882a593Smuzhiyun 	/** number of received data pkts */
1888*4882a593Smuzhiyun 	t_u32 rx_mpdu;
1889*4882a593Smuzhiyun 	/** number of data packet losses (no ACK) */
1890*4882a593Smuzhiyun 	t_u32 mpdu_lost;
1891*4882a593Smuzhiyun 	/** total number of data pkt retries */
1892*4882a593Smuzhiyun 	t_u32 retries;
1893*4882a593Smuzhiyun 	/** number of short data pkt retries */
1894*4882a593Smuzhiyun 	t_u32 retries_short;
1895*4882a593Smuzhiyun 	/** number of long data pkt retries */
1896*4882a593Smuzhiyun 	t_u32 retries_long;
1897*4882a593Smuzhiyun } wifi_rate_stat;
1898*4882a593Smuzhiyun 
1899*4882a593Smuzhiyun /** wifi peer type */
1900*4882a593Smuzhiyun typedef enum {
1901*4882a593Smuzhiyun 	WIFI_PEER_STA,
1902*4882a593Smuzhiyun 	WIFI_PEER_AP,
1903*4882a593Smuzhiyun 	WIFI_PEER_P2P_GO,
1904*4882a593Smuzhiyun 	WIFI_PEER_P2P_CLIENT,
1905*4882a593Smuzhiyun 	WIFI_PEER_NAN,
1906*4882a593Smuzhiyun 	WIFI_PEER_TDLS,
1907*4882a593Smuzhiyun 	WIFI_PEER_INVALID,
1908*4882a593Smuzhiyun } wifi_peer_type;
1909*4882a593Smuzhiyun 
1910*4882a593Smuzhiyun /** per peer statistics */
1911*4882a593Smuzhiyun typedef struct {
1912*4882a593Smuzhiyun 	/** peer type (AP, TDLS, GO etc.) */
1913*4882a593Smuzhiyun 	wifi_peer_type type;
1914*4882a593Smuzhiyun 	/** mac address */
1915*4882a593Smuzhiyun 	t_u8 peer_mac_address[6];
1916*4882a593Smuzhiyun 	/** peer WIFI_CAPABILITY_XXX */
1917*4882a593Smuzhiyun 	t_u32 capabilities;
1918*4882a593Smuzhiyun 	/** number of rates */
1919*4882a593Smuzhiyun 	t_u32 num_rate;
1920*4882a593Smuzhiyun 	/** per rate statistics, number of entries  = num_rate */
1921*4882a593Smuzhiyun 	wifi_rate_stat rate_stats[];
1922*4882a593Smuzhiyun } wifi_peer_info;
1923*4882a593Smuzhiyun 
1924*4882a593Smuzhiyun /** per access category statistics */
1925*4882a593Smuzhiyun typedef struct {
1926*4882a593Smuzhiyun 	/** access category (VI, VO, BE, BK) */
1927*4882a593Smuzhiyun 	mlan_wmm_ac_e ac;
1928*4882a593Smuzhiyun 	/** number of successfully transmitted unicast data pkts (ACK rcvd) */
1929*4882a593Smuzhiyun 	t_u32 tx_mpdu;
1930*4882a593Smuzhiyun 	/** number of received unicast mpdus */
1931*4882a593Smuzhiyun 	t_u32 rx_mpdu;
1932*4882a593Smuzhiyun 	/** number of succesfully transmitted multicast data packets */
1933*4882a593Smuzhiyun 	/** STA case: implies ACK received from AP for the unicast packet in
1934*4882a593Smuzhiyun 	 * which mcast pkt was sent */
1935*4882a593Smuzhiyun 	t_u32 tx_mcast;
1936*4882a593Smuzhiyun 	/** number of received multicast data packets */
1937*4882a593Smuzhiyun 	t_u32 rx_mcast;
1938*4882a593Smuzhiyun 	/** number of received unicast a-mpdus */
1939*4882a593Smuzhiyun 	t_u32 rx_ampdu;
1940*4882a593Smuzhiyun 	/** number of transmitted unicast a-mpdus */
1941*4882a593Smuzhiyun 	t_u32 tx_ampdu;
1942*4882a593Smuzhiyun 	/** number of data pkt losses (no ACK) */
1943*4882a593Smuzhiyun 	t_u32 mpdu_lost;
1944*4882a593Smuzhiyun 	/** total number of data pkt retries */
1945*4882a593Smuzhiyun 	t_u32 retries;
1946*4882a593Smuzhiyun 	/** number of short data pkt retries */
1947*4882a593Smuzhiyun 	t_u32 retries_short;
1948*4882a593Smuzhiyun 	/** number of long data pkt retries */
1949*4882a593Smuzhiyun 	t_u32 retries_long;
1950*4882a593Smuzhiyun 	/** data pkt min contention time (usecs) */
1951*4882a593Smuzhiyun 	t_u32 contention_time_min;
1952*4882a593Smuzhiyun 	/** data pkt max contention time (usecs) */
1953*4882a593Smuzhiyun 	t_u32 contention_time_max;
1954*4882a593Smuzhiyun 	/** data pkt avg contention time (usecs) */
1955*4882a593Smuzhiyun 	t_u32 contention_time_avg;
1956*4882a593Smuzhiyun 	/** num of data pkts used for contention statistics */
1957*4882a593Smuzhiyun 	t_u32 contention_num_samples;
1958*4882a593Smuzhiyun } wifi_wmm_ac_stat;
1959*4882a593Smuzhiyun 
1960*4882a593Smuzhiyun /** interface statistics */
1961*4882a593Smuzhiyun typedef struct {
1962*4882a593Smuzhiyun 	/** wifi interface */
1963*4882a593Smuzhiyun 	/* wifi_interface_handle iface;*/
1964*4882a593Smuzhiyun 	/** current state of the interface */
1965*4882a593Smuzhiyun 	mlan_interface_link_layer_info info;
1966*4882a593Smuzhiyun 	/** access point beacon received count from connected AP */
1967*4882a593Smuzhiyun 	t_u32 beacon_rx;
1968*4882a593Smuzhiyun 	/** Average beacon offset encountered (beacon_TSF - TBTT)
1969*4882a593Smuzhiyun 	 *    the average_tsf_offset field is used so as to calculate the
1970*4882a593Smuzhiyun 	 *    typical beacon contention time on the channel as well may be
1971*4882a593Smuzhiyun 	 *    used to debug beacon synchronization and related power consumption
1972*4882a593Smuzhiyun 	 * issue
1973*4882a593Smuzhiyun 	 */
1974*4882a593Smuzhiyun 	t_u64 average_tsf_offset;
1975*4882a593Smuzhiyun 	/** indicate that this AP typically leaks packets beyond the driver
1976*4882a593Smuzhiyun 	 * guard time */
1977*4882a593Smuzhiyun 	t_u32 leaky_ap_detected;
1978*4882a593Smuzhiyun 	/** average number of frame leaked by AP after frame with PM bit set was
1979*4882a593Smuzhiyun 	 * ACK'ed by AP */
1980*4882a593Smuzhiyun 	t_u32 leaky_ap_avg_num_frames_leaked;
1981*4882a593Smuzhiyun 	/** Guard time currently in force (when implementing IEEE power
1982*4882a593Smuzhiyun 	 * management based on frame control PM bit), How long driver waits
1983*4882a593Smuzhiyun 	 * before shutting down the radio and after receiving an ACK for a data
1984*4882a593Smuzhiyun 	 * frame with PM bit set)
1985*4882a593Smuzhiyun 	 */
1986*4882a593Smuzhiyun 	t_u32 leaky_ap_guard_time;
1987*4882a593Smuzhiyun 	/** access point mgmt frames received count from connected AP (including
1988*4882a593Smuzhiyun 	 * Beacon) */
1989*4882a593Smuzhiyun 	t_u32 mgmt_rx;
1990*4882a593Smuzhiyun 	/** action frames received count */
1991*4882a593Smuzhiyun 	t_u32 mgmt_action_rx;
1992*4882a593Smuzhiyun 	/** action frames transmit count */
1993*4882a593Smuzhiyun 	t_u32 mgmt_action_tx;
1994*4882a593Smuzhiyun 	/** access Point Beacon and Management frames RSSI (averaged) */
1995*4882a593Smuzhiyun 	t_s32 rssi_mgmt;
1996*4882a593Smuzhiyun 	/** access Point Data Frames RSSI (averaged) from connected AP */
1997*4882a593Smuzhiyun 	t_s32 rssi_data;
1998*4882a593Smuzhiyun 	/** access Point ACK RSSI (averaged) from connected AP */
1999*4882a593Smuzhiyun 	t_s32 rssi_ack;
2000*4882a593Smuzhiyun 	/** per ac data packet statistics */
2001*4882a593Smuzhiyun 	wifi_wmm_ac_stat ac[MAX_AC_QUEUES];
2002*4882a593Smuzhiyun 	/** number of peers */
2003*4882a593Smuzhiyun 	t_u32 num_peers;
2004*4882a593Smuzhiyun 	/** per peer statistics */
2005*4882a593Smuzhiyun 	wifi_peer_info peer_info[];
2006*4882a593Smuzhiyun } wifi_iface_stat;
2007*4882a593Smuzhiyun 
2008*4882a593Smuzhiyun /** link layer stat configuration params */
2009*4882a593Smuzhiyun typedef struct {
2010*4882a593Smuzhiyun 	/** threshold to classify the pkts as short or long */
2011*4882a593Smuzhiyun 	t_u32 mpdu_size_threshold;
2012*4882a593Smuzhiyun 	/** wifi statistics bitmap */
2013*4882a593Smuzhiyun 	t_u32 aggressive_statistics_gathering;
2014*4882a593Smuzhiyun } wifi_link_layer_params;
2015*4882a593Smuzhiyun 
2016*4882a593Smuzhiyun /** wifi statistics bitmap  */
2017*4882a593Smuzhiyun #define WIFI_STATS_RADIO 0x00000001 /** all radio statistics */
2018*4882a593Smuzhiyun #define WIFI_STATS_RADIO_CCA                                                   \
2019*4882a593Smuzhiyun 	0x00000002 /** cca_busy_time (within radio statistics) */
2020*4882a593Smuzhiyun #define WIFI_STATS_RADIO_CHANNELS                                              \
2021*4882a593Smuzhiyun 	0x00000004 /** all channel statistics (within radio statistics) */
2022*4882a593Smuzhiyun #define WIFI_STATS_RADIO_SCAN                                                  \
2023*4882a593Smuzhiyun 	0x00000008 /** all scan statistics (within radio statistics) */
2024*4882a593Smuzhiyun #define WIFI_STATS_IFACE 0x00000010 /** all interface statistics */
2025*4882a593Smuzhiyun #define WIFI_STATS_IFACE_TXRATE                                                \
2026*4882a593Smuzhiyun 	0x00000020 /** all tx rate statistics (within interface statistics) */
2027*4882a593Smuzhiyun #define WIFI_STATS_IFACE_AC                                                    \
2028*4882a593Smuzhiyun 	0x00000040 /** all ac statistics (within interface statistics) */
2029*4882a593Smuzhiyun #define WIFI_STATS_IFACE_CONTENTION                                            \
2030*4882a593Smuzhiyun 	0x00000080 /** all contention (min, max, avg) statistics (within ac    \
2031*4882a593Smuzhiyun 		      statisctics) */
2032*4882a593Smuzhiyun 
2033*4882a593Smuzhiyun /** station stats */
2034*4882a593Smuzhiyun typedef struct _sta_stats {
2035*4882a593Smuzhiyun 	/** last_rx_in_msec */
2036*4882a593Smuzhiyun 	t_u64 last_rx_in_msec;
2037*4882a593Smuzhiyun 	/** rx_packets */
2038*4882a593Smuzhiyun 	t_u32 rx_packets;
2039*4882a593Smuzhiyun 	/** tx packets */
2040*4882a593Smuzhiyun 	t_u32 tx_packets;
2041*4882a593Smuzhiyun 	/** rx bytes */
2042*4882a593Smuzhiyun 	t_u32 rx_bytes;
2043*4882a593Smuzhiyun 	/** tx bytes */
2044*4882a593Smuzhiyun 	t_u32 tx_bytes;
2045*4882a593Smuzhiyun } sta_stats;
2046*4882a593Smuzhiyun 
2047*4882a593Smuzhiyun #ifdef PRAGMA_PACK
2048*4882a593Smuzhiyun #pragma pack(pop)
2049*4882a593Smuzhiyun #endif
2050*4882a593Smuzhiyun 
2051*4882a593Smuzhiyun /** mlan_callbacks data structure */
2052*4882a593Smuzhiyun typedef struct _mlan_callbacks {
2053*4882a593Smuzhiyun 	/** moal_get_fw_data */
2054*4882a593Smuzhiyun 	mlan_status (*moal_get_fw_data)(t_void *pmoal, t_u32 offset, t_u32 len,
2055*4882a593Smuzhiyun 					t_u8 *pbuf);
2056*4882a593Smuzhiyun 	mlan_status (*moal_get_vdll_data)(t_void *pmoal, t_u32 len, t_u8 *pbuf);
2057*4882a593Smuzhiyun 	/** moal_get_hw_spec_complete */
2058*4882a593Smuzhiyun 	mlan_status (*moal_get_hw_spec_complete)(t_void *pmoal,
2059*4882a593Smuzhiyun 						 mlan_status status,
2060*4882a593Smuzhiyun 						 pmlan_hw_info phw,
2061*4882a593Smuzhiyun 						 pmlan_bss_tbl ptbl);
2062*4882a593Smuzhiyun 	/** moal_init_fw_complete */
2063*4882a593Smuzhiyun 	mlan_status (*moal_init_fw_complete)(t_void *pmoal, mlan_status status);
2064*4882a593Smuzhiyun 	/** moal_shutdown_fw_complete */
2065*4882a593Smuzhiyun 	mlan_status (*moal_shutdown_fw_complete)(t_void *pmoal,
2066*4882a593Smuzhiyun 						 mlan_status status);
2067*4882a593Smuzhiyun 	/** moal_send_packet_complete */
2068*4882a593Smuzhiyun 	mlan_status (*moal_send_packet_complete)(t_void *pmoal,
2069*4882a593Smuzhiyun 						 pmlan_buffer pmbuf,
2070*4882a593Smuzhiyun 						 mlan_status status);
2071*4882a593Smuzhiyun 	/** moal_recv_complete */
2072*4882a593Smuzhiyun 	mlan_status (*moal_recv_complete)(t_void *pmoal, pmlan_buffer pmbuf,
2073*4882a593Smuzhiyun 					  t_u32 port, mlan_status status);
2074*4882a593Smuzhiyun 	/** moal_recv_packet */
2075*4882a593Smuzhiyun 	mlan_status (*moal_recv_packet)(t_void *pmoal, pmlan_buffer pmbuf);
2076*4882a593Smuzhiyun 	/** moal_recv_amsdu_packet */
2077*4882a593Smuzhiyun 	mlan_status (*moal_recv_amsdu_packet)(t_void *pmoal,
2078*4882a593Smuzhiyun 					      pmlan_buffer pmbuf);
2079*4882a593Smuzhiyun 	/** moal_recv_event */
2080*4882a593Smuzhiyun 	mlan_status (*moal_recv_event)(t_void *pmoal, pmlan_event pmevent);
2081*4882a593Smuzhiyun 	/** moal_ioctl_complete */
2082*4882a593Smuzhiyun 	mlan_status (*moal_ioctl_complete)(t_void *pmoal,
2083*4882a593Smuzhiyun 					   pmlan_ioctl_req pioctl_req,
2084*4882a593Smuzhiyun 					   mlan_status status);
2085*4882a593Smuzhiyun 
2086*4882a593Smuzhiyun 	/** moal_alloc_mlan_buffer */
2087*4882a593Smuzhiyun 	mlan_status (*moal_alloc_mlan_buffer)(t_void *pmoal, t_u32 size,
2088*4882a593Smuzhiyun 					      ppmlan_buffer pmbuf);
2089*4882a593Smuzhiyun 	/** moal_free_mlan_buffer */
2090*4882a593Smuzhiyun 	mlan_status (*moal_free_mlan_buffer)(t_void *pmoal, pmlan_buffer pmbuf);
2091*4882a593Smuzhiyun 
2092*4882a593Smuzhiyun #ifdef USB
2093*4882a593Smuzhiyun 	/** moal_write_data_async */
2094*4882a593Smuzhiyun 	mlan_status (*moal_write_data_async)(t_void *pmoal, pmlan_buffer pmbuf,
2095*4882a593Smuzhiyun 					     t_u32 port);
2096*4882a593Smuzhiyun #endif /* USB */
2097*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
2098*4882a593Smuzhiyun 	/** moal_write_reg */
2099*4882a593Smuzhiyun 	mlan_status (*moal_write_reg)(t_void *pmoal, t_u32 reg, t_u32 data);
2100*4882a593Smuzhiyun 	/** moal_read_reg */
2101*4882a593Smuzhiyun 	mlan_status (*moal_read_reg)(t_void *pmoal, t_u32 reg, t_u32 *data);
2102*4882a593Smuzhiyun #endif /* SDIO || PCIE */
2103*4882a593Smuzhiyun 	/** moal_write_data_sync */
2104*4882a593Smuzhiyun 	mlan_status (*moal_write_data_sync)(t_void *pmoal, pmlan_buffer pmbuf,
2105*4882a593Smuzhiyun 					    t_u32 port, t_u32 timeout);
2106*4882a593Smuzhiyun 	/** moal_read_data_sync */
2107*4882a593Smuzhiyun 	mlan_status (*moal_read_data_sync)(t_void *pmoal, pmlan_buffer pmbuf,
2108*4882a593Smuzhiyun 					   t_u32 port, t_u32 timeout);
2109*4882a593Smuzhiyun 	/** moal_malloc */
2110*4882a593Smuzhiyun 	mlan_status (*moal_malloc)(t_void *pmoal, t_u32 size, t_u32 flag,
2111*4882a593Smuzhiyun 				   t_u8 **ppbuf);
2112*4882a593Smuzhiyun 	/** moal_mfree */
2113*4882a593Smuzhiyun 	mlan_status (*moal_mfree)(t_void *pmoal, t_u8 *pbuf);
2114*4882a593Smuzhiyun 	/** moal_vmalloc */
2115*4882a593Smuzhiyun 	mlan_status (*moal_vmalloc)(t_void *pmoal, t_u32 size, t_u8 **ppbuf);
2116*4882a593Smuzhiyun 	/** moal_vfree */
2117*4882a593Smuzhiyun 	mlan_status (*moal_vfree)(t_void *pmoal, t_u8 *pbuf);
2118*4882a593Smuzhiyun #ifdef PCIE
2119*4882a593Smuzhiyun 	/** moal_malloc_consistent */
2120*4882a593Smuzhiyun 	mlan_status (*moal_malloc_consistent)(t_void *pmoal, t_u32 size,
2121*4882a593Smuzhiyun 					      t_u8 **ppbuf, t_u64 *pbuf_pa);
2122*4882a593Smuzhiyun 	/** moal_mfree_consistent */
2123*4882a593Smuzhiyun 	mlan_status (*moal_mfree_consistent)(t_void *pmoal, t_u32 size,
2124*4882a593Smuzhiyun 					     t_u8 *pbuf, t_u64 buf_pa);
2125*4882a593Smuzhiyun 	/** moal_map_memory */
2126*4882a593Smuzhiyun 	mlan_status (*moal_map_memory)(t_void *pmoal, t_u8 *pbuf,
2127*4882a593Smuzhiyun 				       t_u64 *pbuf_pa, t_u32 size, t_u32 flag);
2128*4882a593Smuzhiyun 	/** moal_unmap_memory */
2129*4882a593Smuzhiyun 	mlan_status (*moal_unmap_memory)(t_void *pmoal, t_u8 *pbuf,
2130*4882a593Smuzhiyun 					 t_u64 buf_pa, t_u32 size, t_u32 flag);
2131*4882a593Smuzhiyun #endif /* PCIE */
2132*4882a593Smuzhiyun 	/** moal_memset */
2133*4882a593Smuzhiyun 	t_void *(*moal_memset)(t_void *pmoal, t_void *pmem, t_u8 byte,
2134*4882a593Smuzhiyun 			       t_u32 num);
2135*4882a593Smuzhiyun 	/** moal_memcpy */
2136*4882a593Smuzhiyun 	t_void *(*moal_memcpy)(t_void *pmoal, t_void *pdest, const t_void *psrc,
2137*4882a593Smuzhiyun 			       t_u32 num);
2138*4882a593Smuzhiyun 	/** moal_memcpy_ext */
2139*4882a593Smuzhiyun 	t_void *(*moal_memcpy_ext)(t_void *pmoal, t_void *pdest,
2140*4882a593Smuzhiyun 				   const t_void *psrc, t_u32 num,
2141*4882a593Smuzhiyun 				   t_u32 dest_size);
2142*4882a593Smuzhiyun 	/** moal_memmove */
2143*4882a593Smuzhiyun 	t_void *(*moal_memmove)(t_void *pmoal, t_void *pdest,
2144*4882a593Smuzhiyun 				const t_void *psrc, t_u32 num);
2145*4882a593Smuzhiyun 	/** moal_memcmp */
2146*4882a593Smuzhiyun 	t_s32 (*moal_memcmp)(t_void *pmoal, const t_void *pmem1,
2147*4882a593Smuzhiyun 			     const t_void *pmem2, t_u32 num);
2148*4882a593Smuzhiyun 	/** moal_udelay */
2149*4882a593Smuzhiyun 	t_void (*moal_udelay)(t_void *pmoal, t_u32 udelay);
2150*4882a593Smuzhiyun 	/** moal_usleep_range */
2151*4882a593Smuzhiyun 	t_void (*moal_usleep_range)(t_void *pmoal, t_u32 min_delay,
2152*4882a593Smuzhiyun 				    t_u32 max_delay);
2153*4882a593Smuzhiyun 	/** moal_get_boot_ktime */
2154*4882a593Smuzhiyun 	mlan_status (*moal_get_boot_ktime)(t_void *pmoal, t_u64 *pnsec);
2155*4882a593Smuzhiyun 	/** moal_get_system_time */
2156*4882a593Smuzhiyun 	mlan_status (*moal_get_system_time)(t_void *pmoal, t_u32 *psec,
2157*4882a593Smuzhiyun 					    t_u32 *pusec);
2158*4882a593Smuzhiyun 	/** moal_init_timer*/
2159*4882a593Smuzhiyun 	mlan_status (*moal_init_timer)(t_void *pmoal, t_void **pptimer,
2160*4882a593Smuzhiyun 				       IN t_void (*callback)(t_void *pcontext),
2161*4882a593Smuzhiyun 				       t_void *pcontext);
2162*4882a593Smuzhiyun 	/** moal_free_timer */
2163*4882a593Smuzhiyun 	mlan_status (*moal_free_timer)(t_void *pmoal, t_void *ptimer);
2164*4882a593Smuzhiyun 	/** moal_start_timer*/
2165*4882a593Smuzhiyun 	mlan_status (*moal_start_timer)(t_void *pmoal, t_void *ptimer,
2166*4882a593Smuzhiyun 					t_u8 periodic, t_u32 msec);
2167*4882a593Smuzhiyun 	/** moal_stop_timer*/
2168*4882a593Smuzhiyun 	mlan_status (*moal_stop_timer)(t_void *pmoal, t_void *ptimer);
2169*4882a593Smuzhiyun 	/** moal_init_lock */
2170*4882a593Smuzhiyun 	mlan_status (*moal_init_lock)(t_void *pmoal, t_void **pplock);
2171*4882a593Smuzhiyun 	/** moal_free_lock */
2172*4882a593Smuzhiyun 	mlan_status (*moal_free_lock)(t_void *pmoal, t_void *plock);
2173*4882a593Smuzhiyun 	/** moal_spin_lock */
2174*4882a593Smuzhiyun 	mlan_status (*moal_spin_lock)(t_void *pmoal, t_void *plock);
2175*4882a593Smuzhiyun 	/** moal_spin_unlock */
2176*4882a593Smuzhiyun 	mlan_status (*moal_spin_unlock)(t_void *pmoal, t_void *plock);
2177*4882a593Smuzhiyun 	/** moal_print */
2178*4882a593Smuzhiyun 	t_void (*moal_print)(t_void *pmoal, t_u32 level, char *pformat, IN...);
2179*4882a593Smuzhiyun 	/** moal_print_netintf */
2180*4882a593Smuzhiyun 	t_void (*moal_print_netintf)(t_void *pmoal, t_u32 bss_index,
2181*4882a593Smuzhiyun 				     t_u32 level);
2182*4882a593Smuzhiyun 	/** moal_assert */
2183*4882a593Smuzhiyun 	t_void (*moal_assert)(t_void *pmoal, t_u32 cond);
2184*4882a593Smuzhiyun 
2185*4882a593Smuzhiyun 	/** moal_hist_data_add */
2186*4882a593Smuzhiyun 	t_void (*moal_hist_data_add)(t_void *pmoal, t_u32 bss_index,
2187*4882a593Smuzhiyun 				     t_u16 rx_rate, t_s8 snr, t_s8 nflr,
2188*4882a593Smuzhiyun 				     t_u8 antenna);
2189*4882a593Smuzhiyun 	t_void (*moal_updata_peer_signal)(t_void *pmoal, t_u32 bss_index,
2190*4882a593Smuzhiyun 					  t_u8 *peer_addr, t_s8 snr, t_s8 nflr);
2191*4882a593Smuzhiyun 	t_u64 (*moal_do_div)(t_u64 num, t_u32 base);
2192*4882a593Smuzhiyun #if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
2193*4882a593Smuzhiyun 	mlan_status (*moal_wait_hostcmd_complete)(t_void *pmoal,
2194*4882a593Smuzhiyun 						  t_u32 bss_index);
2195*4882a593Smuzhiyun 	mlan_status (*moal_notify_hostcmd_complete)(t_void *pmoal,
2196*4882a593Smuzhiyun 						    t_u32 bss_index);
2197*4882a593Smuzhiyun #endif
2198*4882a593Smuzhiyun 	void (*moal_tp_accounting)(t_void *pmoal, t_void *buf,
2199*4882a593Smuzhiyun 				   t_u32 drop_point);
2200*4882a593Smuzhiyun 	void (*moal_tp_accounting_rx_param)(t_void *pmoal, unsigned int type,
2201*4882a593Smuzhiyun 					    unsigned int rsvd1);
2202*4882a593Smuzhiyun 	void (*moal_amsdu_tp_accounting)(t_void *pmoal, t_s32 delay,
2203*4882a593Smuzhiyun 					 t_s32 copy_delay);
2204*4882a593Smuzhiyun } mlan_callbacks, *pmlan_callbacks;
2205*4882a593Smuzhiyun 
2206*4882a593Smuzhiyun /** Parameter unchanged, use MLAN default setting */
2207*4882a593Smuzhiyun #define ROBUSTCOEX_GPIO_UNCHANGED 0
2208*4882a593Smuzhiyun /** Parameter enabled, override MLAN default setting */
2209*4882a593Smuzhiyun #define ROBUSTCOEX_GPIO_CFG 1
2210*4882a593Smuzhiyun 
2211*4882a593Smuzhiyun #if defined(SDIO)
2212*4882a593Smuzhiyun /** Interrupt Mode SDIO */
2213*4882a593Smuzhiyun #define INT_MODE_SDIO 0
2214*4882a593Smuzhiyun /** Interrupt Mode GPIO */
2215*4882a593Smuzhiyun #define INT_MODE_GPIO 1
2216*4882a593Smuzhiyun /** New mode: GPIO-1 as a duplicated signal of interrupt as appear of SDIO_DAT1
2217*4882a593Smuzhiyun  */
2218*4882a593Smuzhiyun #define GPIO_INT_NEW_MODE 255
2219*4882a593Smuzhiyun #endif
2220*4882a593Smuzhiyun 
2221*4882a593Smuzhiyun /** Parameter unchanged, use MLAN default setting */
2222*4882a593Smuzhiyun #define MLAN_INIT_PARA_UNCHANGED 0
2223*4882a593Smuzhiyun /** Parameter enabled, override MLAN default setting */
2224*4882a593Smuzhiyun #define MLAN_INIT_PARA_ENABLED 1
2225*4882a593Smuzhiyun /** Parameter disabled, override MLAN default setting */
2226*4882a593Smuzhiyun #define MLAN_INIT_PARA_DISABLED 2
2227*4882a593Smuzhiyun 
2228*4882a593Smuzhiyun /** Control bit for stream 2X2 */
2229*4882a593Smuzhiyun #define FEATURE_CTRL_STREAM_2X2 MBIT(0)
2230*4882a593Smuzhiyun /** Control bit for DFS support */
2231*4882a593Smuzhiyun #define FEATURE_CTRL_DFS_SUPPORT MBIT(1)
2232*4882a593Smuzhiyun #ifdef USB
2233*4882a593Smuzhiyun /** Control bit for winner check & not wait for FW ready event */
2234*4882a593Smuzhiyun #define FEATURE_CTRL_USB_NEW_INIT MBIT(2)
2235*4882a593Smuzhiyun #endif
2236*4882a593Smuzhiyun /** Default feature control */
2237*4882a593Smuzhiyun #define FEATURE_CTRL_DEFAULT 0xffffffff
2238*4882a593Smuzhiyun /** Check if stream 2X2 enabled */
2239*4882a593Smuzhiyun #define IS_STREAM_2X2(x) ((x)&FEATURE_CTRL_STREAM_2X2)
2240*4882a593Smuzhiyun /** Check if DFS support enabled */
2241*4882a593Smuzhiyun #define IS_DFS_SUPPORT(x) ((x)&FEATURE_CTRL_DFS_SUPPORT)
2242*4882a593Smuzhiyun #ifdef USB
2243*4882a593Smuzhiyun /** Check if winner check & not wait for FW ready event */
2244*4882a593Smuzhiyun #define IS_USB_NEW_INIT(x) ((x)&FEATURE_CTRL_USB_NEW_INIT)
2245*4882a593Smuzhiyun #endif
2246*4882a593Smuzhiyun 
2247*4882a593Smuzhiyun /*
2248*4882a593Smuzhiyun #define DRV_MODE_NAN                 MBIT(4)
2249*4882a593Smuzhiyun #define DRV_MODE_11P                 MBIT(5)
2250*4882a593Smuzhiyun #define DRV_MODE_MAC80211            MBIT(6)
2251*4882a593Smuzhiyun #define DRV_MODE_DFS                 MBIT(7)*/
2252*4882a593Smuzhiyun #define DRV_MODE_MASK (MBIT(4) | MBIT(5) | MBIT(6) | MBIT(7))
2253*4882a593Smuzhiyun 
2254*4882a593Smuzhiyun /** mlan_device data structure */
2255*4882a593Smuzhiyun typedef struct _mlan_device {
2256*4882a593Smuzhiyun 	/** MOAL Handle */
2257*4882a593Smuzhiyun 	t_void *pmoal_handle;
2258*4882a593Smuzhiyun 	/** BSS Attributes */
2259*4882a593Smuzhiyun 	mlan_bss_attr bss_attr[MLAN_MAX_BSS_NUM];
2260*4882a593Smuzhiyun 	/** Callbacks */
2261*4882a593Smuzhiyun 	mlan_callbacks callbacks;
2262*4882a593Smuzhiyun #ifdef MFG_CMD_SUPPORT
2263*4882a593Smuzhiyun 	/** MFG mode */
2264*4882a593Smuzhiyun 	t_u32 mfg_mode;
2265*4882a593Smuzhiyun #endif
2266*4882a593Smuzhiyun #ifdef PCIE
2267*4882a593Smuzhiyun 	t_u16 ring_size;
2268*4882a593Smuzhiyun #endif
2269*4882a593Smuzhiyun #if defined(SDIO)
2270*4882a593Smuzhiyun 	/** SDIO interrupt mode (0: INT_MODE_SDIO, 1: INT_MODE_GPIO) */
2271*4882a593Smuzhiyun 	t_u32 int_mode;
2272*4882a593Smuzhiyun 	/** GPIO interrupt pin number */
2273*4882a593Smuzhiyun 	t_u32 gpio_pin;
2274*4882a593Smuzhiyun #endif
2275*4882a593Smuzhiyun #ifdef DEBUG_LEVEL1
2276*4882a593Smuzhiyun 	/** Driver debug bit masks */
2277*4882a593Smuzhiyun 	t_u32 drvdbg;
2278*4882a593Smuzhiyun #endif
2279*4882a593Smuzhiyun 	/** allocate fixed buffer size for scan beacon buffer*/
2280*4882a593Smuzhiyun 	t_u32 fixed_beacon_buffer;
2281*4882a593Smuzhiyun 	/** SDIO MPA Tx */
2282*4882a593Smuzhiyun 	t_u32 mpa_tx_cfg;
2283*4882a593Smuzhiyun 	/** SDIO MPA Rx */
2284*4882a593Smuzhiyun 	t_u32 mpa_rx_cfg;
2285*4882a593Smuzhiyun #ifdef SDIO
2286*4882a593Smuzhiyun 	/** SDIO Single port rx aggr */
2287*4882a593Smuzhiyun 	t_u8 sdio_rx_aggr_enable;
2288*4882a593Smuzhiyun 	/* see blk_queue_max_segment_size */
2289*4882a593Smuzhiyun 	t_u32 max_seg_size;
2290*4882a593Smuzhiyun 	/* see blk_queue_max_segments */
2291*4882a593Smuzhiyun 	t_u16 max_segs;
2292*4882a593Smuzhiyun #endif
2293*4882a593Smuzhiyun 	/** Auto deep sleep */
2294*4882a593Smuzhiyun 	t_u32 auto_ds;
2295*4882a593Smuzhiyun 	/** IEEE PS mode */
2296*4882a593Smuzhiyun 	t_u32 ps_mode;
2297*4882a593Smuzhiyun 	/** Max Tx buffer size */
2298*4882a593Smuzhiyun 	t_u32 max_tx_buf;
2299*4882a593Smuzhiyun #if defined(STA_SUPPORT)
2300*4882a593Smuzhiyun 	/** 802.11d configuration */
2301*4882a593Smuzhiyun 	t_u32 cfg_11d;
2302*4882a593Smuzhiyun #endif
2303*4882a593Smuzhiyun 	/** Feature control bitmask */
2304*4882a593Smuzhiyun 	t_u32 feature_control;
2305*4882a593Smuzhiyun 	/** enable/disable rx work */
2306*4882a593Smuzhiyun 	t_u8 rx_work;
2307*4882a593Smuzhiyun 	/** dev cap mask */
2308*4882a593Smuzhiyun 	t_u32 dev_cap_mask;
2309*4882a593Smuzhiyun 	/** oob independent reset */
2310*4882a593Smuzhiyun 	t_u32 indrstcfg;
2311*4882a593Smuzhiyun 	/** dtim interval */
2312*4882a593Smuzhiyun 	t_u16 multi_dtim;
2313*4882a593Smuzhiyun 	/** IEEE ps inactivity timeout value */
2314*4882a593Smuzhiyun 	t_u16 inact_tmo;
2315*4882a593Smuzhiyun 	/** card type */
2316*4882a593Smuzhiyun 	t_u16 card_type;
2317*4882a593Smuzhiyun 	/** card rev */
2318*4882a593Smuzhiyun 	t_u8 card_rev;
2319*4882a593Smuzhiyun 	/** Host sleep wakeup interval */
2320*4882a593Smuzhiyun 	t_u32 hs_wake_interval;
2321*4882a593Smuzhiyun 	/** GPIO to indicate wakeup source */
2322*4882a593Smuzhiyun 	t_u8 indication_gpio;
2323*4882a593Smuzhiyun 	/** Dynamic MIMO-SISO switch for hscfg*/
2324*4882a593Smuzhiyun 	t_u8 hs_mimo_switch;
2325*4882a593Smuzhiyun #ifdef USB
2326*4882a593Smuzhiyun 	/** Tx CMD endpoint address */
2327*4882a593Smuzhiyun 	t_u8 tx_cmd_ep;
2328*4882a593Smuzhiyun 	/** Rx CMD/EVT endpoint address */
2329*4882a593Smuzhiyun 	t_u8 rx_cmd_ep;
2330*4882a593Smuzhiyun 
2331*4882a593Smuzhiyun 	/** Rx data endpoint address */
2332*4882a593Smuzhiyun 	t_u8 rx_data_ep;
2333*4882a593Smuzhiyun 	/** Tx data endpoint address */
2334*4882a593Smuzhiyun 	t_u8 tx_data_ep;
2335*4882a593Smuzhiyun #endif
2336*4882a593Smuzhiyun 	/** passive to active scan */
2337*4882a593Smuzhiyun 	t_u8 passive_to_active_scan;
2338*4882a593Smuzhiyun 	/** uap max supported station per chip */
2339*4882a593Smuzhiyun 	t_u8 uap_max_sta;
2340*4882a593Smuzhiyun 	/** drv mode */
2341*4882a593Smuzhiyun 	t_u32 drv_mode;
2342*4882a593Smuzhiyun 	/** dfs w53 cfg */
2343*4882a593Smuzhiyun 	t_u8 dfs53cfg;
2344*4882a593Smuzhiyun 	/** dfs_offload */
2345*4882a593Smuzhiyun 	t_u8 dfs_offload;
2346*4882a593Smuzhiyun 	/** extend enhance scan */
2347*4882a593Smuzhiyun 	t_u8 ext_scan;
2348*4882a593Smuzhiyun 	/* mcs32 setting */
2349*4882a593Smuzhiyun 	t_u8 mcs32;
2350*4882a593Smuzhiyun } mlan_device, *pmlan_device;
2351*4882a593Smuzhiyun 
2352*4882a593Smuzhiyun /** MLAN API function prototype */
2353*4882a593Smuzhiyun #define MLAN_API
2354*4882a593Smuzhiyun 
2355*4882a593Smuzhiyun /** Registration */
2356*4882a593Smuzhiyun MLAN_API mlan_status mlan_register(pmlan_device pmdevice,
2357*4882a593Smuzhiyun 				   t_void **ppmlan_adapter);
2358*4882a593Smuzhiyun 
2359*4882a593Smuzhiyun /** Un-registration */
2360*4882a593Smuzhiyun MLAN_API mlan_status mlan_unregister(t_void *padapter);
2361*4882a593Smuzhiyun 
2362*4882a593Smuzhiyun /** Firmware Downloading */
2363*4882a593Smuzhiyun MLAN_API mlan_status mlan_dnld_fw(t_void *padapter, pmlan_fw_image pmfw);
2364*4882a593Smuzhiyun 
2365*4882a593Smuzhiyun /** Custom data pass API */
2366*4882a593Smuzhiyun MLAN_API mlan_status mlan_set_init_param(t_void *padapter,
2367*4882a593Smuzhiyun 					 pmlan_init_param pparam);
2368*4882a593Smuzhiyun 
2369*4882a593Smuzhiyun /** Firmware Initialization */
2370*4882a593Smuzhiyun MLAN_API mlan_status mlan_init_fw(t_void *padapter);
2371*4882a593Smuzhiyun 
2372*4882a593Smuzhiyun /** Firmware Shutdown */
2373*4882a593Smuzhiyun MLAN_API mlan_status mlan_shutdown_fw(t_void *padapter);
2374*4882a593Smuzhiyun 
2375*4882a593Smuzhiyun /** Main Process */
2376*4882a593Smuzhiyun MLAN_API mlan_status mlan_main_process(t_void *padapter);
2377*4882a593Smuzhiyun 
2378*4882a593Smuzhiyun /** Rx process */
2379*4882a593Smuzhiyun mlan_status mlan_rx_process(t_void *padapter, t_u8 *rx_pkts);
2380*4882a593Smuzhiyun 
2381*4882a593Smuzhiyun /** Packet Transmission */
2382*4882a593Smuzhiyun MLAN_API mlan_status mlan_send_packet(t_void *padapter, pmlan_buffer pmbuf);
2383*4882a593Smuzhiyun 
2384*4882a593Smuzhiyun #ifdef USB
2385*4882a593Smuzhiyun /** mlan_write_data_async_complete */
2386*4882a593Smuzhiyun MLAN_API mlan_status mlan_write_data_async_complete(t_void *padapter,
2387*4882a593Smuzhiyun 						    pmlan_buffer pmbuf,
2388*4882a593Smuzhiyun 						    t_u32 port,
2389*4882a593Smuzhiyun 						    mlan_status status);
2390*4882a593Smuzhiyun 
2391*4882a593Smuzhiyun /** Packet Reception */
2392*4882a593Smuzhiyun MLAN_API mlan_status mlan_recv(t_void *padapter, pmlan_buffer pmbuf,
2393*4882a593Smuzhiyun 			       t_u32 port);
2394*4882a593Smuzhiyun #endif /* USB */
2395*4882a593Smuzhiyun 
2396*4882a593Smuzhiyun /** Packet Reception complete callback */
2397*4882a593Smuzhiyun MLAN_API mlan_status mlan_recv_packet_complete(t_void *padapter,
2398*4882a593Smuzhiyun 					       pmlan_buffer pmbuf,
2399*4882a593Smuzhiyun 					       mlan_status status);
2400*4882a593Smuzhiyun 
2401*4882a593Smuzhiyun /** handle amsdu deaggregated packet */
2402*4882a593Smuzhiyun void mlan_process_deaggr_pkt(t_void *padapter, pmlan_buffer pmbuf, t_u8 *drop);
2403*4882a593Smuzhiyun 
2404*4882a593Smuzhiyun #if defined(SDIO) || defined(PCIE)
2405*4882a593Smuzhiyun /** interrupt handler */
2406*4882a593Smuzhiyun MLAN_API mlan_status mlan_interrupt(t_u16 msg_id, t_void *padapter);
2407*4882a593Smuzhiyun 
2408*4882a593Smuzhiyun #if defined(SYSKT)
2409*4882a593Smuzhiyun /** GPIO IRQ callback function */
2410*4882a593Smuzhiyun MLAN_API t_void mlan_hs_callback(t_void *pctx);
2411*4882a593Smuzhiyun #endif /* SYSKT_MULTI || SYSKT */
2412*4882a593Smuzhiyun #endif /* SDIO || PCIE */
2413*4882a593Smuzhiyun 
2414*4882a593Smuzhiyun MLAN_API t_void mlan_pm_wakeup_card(t_void *padapter, t_u8 keep_wakeup);
2415*4882a593Smuzhiyun 
2416*4882a593Smuzhiyun MLAN_API t_u8 mlan_is_main_process_running(t_void *adapter);
2417*4882a593Smuzhiyun #ifdef PCIE
2418*4882a593Smuzhiyun MLAN_API t_void mlan_set_int_mode(t_void *adapter, t_u32 int_mode,
2419*4882a593Smuzhiyun 				  t_u8 func_num);
2420*4882a593Smuzhiyun #endif
2421*4882a593Smuzhiyun /** mlan ioctl */
2422*4882a593Smuzhiyun MLAN_API mlan_status mlan_ioctl(t_void *padapter, pmlan_ioctl_req pioctl_req);
2423*4882a593Smuzhiyun /** mlan select wmm queue */
2424*4882a593Smuzhiyun MLAN_API t_u8 mlan_select_wmm_queue(t_void *padapter, t_u8 bss_num, t_u8 tid);
2425*4882a593Smuzhiyun 
2426*4882a593Smuzhiyun /** mlan mask host interrupt */
2427*4882a593Smuzhiyun MLAN_API mlan_status mlan_disable_host_int(t_void *padapter);
2428*4882a593Smuzhiyun /** mlan unmask host interrupt */
2429*4882a593Smuzhiyun MLAN_API mlan_status mlan_enable_host_int(t_void *padapter);
2430*4882a593Smuzhiyun 
2431*4882a593Smuzhiyun #define CSI_SIGNATURE 0xABCD
2432*4882a593Smuzhiyun 
2433*4882a593Smuzhiyun #endif /* !_MLAN_DECL_H_ */
2434