1 /** @file mlan_decl.h
2  *
3  *  @brief This file declares the generic data structures and APIs.
4  *
5  *  Copyright 2008-2024 NXP
6  *
7  *  SPDX-License-Identifier: BSD-3-Clause
8  *
9  */
10 
11 /******************************************************
12 Change log:
13     11/07/2008: initial version
14 ******************************************************/
15 
16 #ifndef _MLAN_DECL_H_
17 #define _MLAN_DECL_H_
18 
19 #include "type_decls.h"
20 #include <osa.h>
21 #if CONFIG_WPA_SUPP
22 #include <ieee802_11_defs.h>
23 #endif
24 
25 /** MLAN release version */
26 #define MLAN_RELEASE_VERSION "310"
27 
28 /** Constants below */
29 
30 #ifdef __GNUC__
31 /** Structure packing begins */
32 #define MLAN_PACK_START
33 /** Structure packeing end */
34 #define MLAN_PACK_END __attribute__((packed))
35 #else /* !__GNUC__ */
36 #ifdef PRAGMA_PACK
37 /** Structure packing begins */
38 #define MLAN_PACK_START
39 /** Structure packeing end */
40 #define MLAN_PACK_END
41 #else /* !PRAGMA_PACK */
42 /** Structure packing begins */
43 #define MLAN_PACK_START __packed
44 /** Structure packing end */
45 #define MLAN_PACK_END
46 #endif /* PRAGMA_PACK */
47 #endif /* __GNUC__ */
48 
49 #ifndef INLINE
50 #ifdef __GNUC__
51 /** inline directive */
52 #define INLINE inline
53 #else
54 /** inline directive */
55 #define INLINE __inline
56 #endif
57 #endif
58 
59 /** MLAN TRUE */
60 #define MTRUE (1)
61 /** MLAN FALSE */
62 #define MFALSE (0)
63 
64 /** Macros for Data Alignment : size */
65 #define ALIGN_SZ(p, a) (((p) + ((a)-1U)) & ~((a)-1U))
66 
67 /** Macros for Data Alignment : address */
68 #define ALIGN_ADDR(p, a) ((((t_ptr)(p)) + (((t_ptr)(a)) - 1U)) & ~(((t_ptr)(a)) - 1U))
69 
70 #ifndef MACSTR
71 /** MAC address security format */
72 #define MACSTR "%02x:XX:XX:XX:%02x:%02x"
73 #endif
74 
75 #ifndef MAC2STR
76 /** MAC address security print arguments */
77 #define MAC2STR(a) (a)[0], (a)[4], (a)[5]
78 #endif
79 
80 /** Return the byte offset of a field in the given structure */
81 #define MLAN_FIELD_OFFSET(type, field) ((t_u32)(t_ptr) & (((type *)0)->field))
82 /** Return aligned offset */
83 #define OFFSET_ALIGN_ADDR(p, a) (t_u32)(ALIGN_ADDR(p, a) - (t_ptr)p)
84 
85 /** Maximum BSS numbers */
86 /* fixme: We have reduced this from 16 to 2. Ensure that this is Ok */
87 #if UAP_SUPPORT
88 #define MLAN_MAX_BSS_NUM 2U
89 #else
90 #define MLAN_MAX_BSS_NUM 1U
91 #endif
92 
93 /** NET IP alignment */
94 #define MLAN_NET_IP_ALIGN 0
95 
96 /** DMA alignment */
97 #define DMA_ALIGNMENT 32U
98 /** max size of TxPD */
99 #define MAX_TXPD_SIZE 32
100 
101 /** Minimum data header length */
102 #define MLAN_MIN_DATA_HEADER_LEN (DMA_ALIGNMENT + MAX_TXPD_SIZE)
103 
104 /** rx data header length */
105 #define MLAN_RX_HEADER_LEN MLAN_MIN_DATA_HEADER_LEN
106 
107 /** This is current limit on Maximum Tx AMPDU allowed */
108 #define MLAN_MAX_TX_BASTREAM_SUPPORTED 2U
109 /** This is current limit on Maximum Rx AMPDU allowed */
110 #define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
111 
112 /** US country code */
113 #define COUNTRY_CODE_US 0x10
114 
115 #ifdef STA_SUPPORT
116 /** Default Win size attached during ADDBA request */
117 #ifndef MLAN_STA_AMPDU_DEF_TXWINSIZE
118 #if defined(SD9177) && defined(COEX_APP_SUPPORT)
119 #define MLAN_STA_AMPDU_DEF_TXWINSIZE 32
120 #else
121 #define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
122 #endif
123 #endif
124 
125 /** Default Win size attached during ADDBA response */
126 #ifndef MLAN_STA_AMPDU_DEF_RXWINSIZE
127 #if defined(SD9177) && !defined(COEX_APP_SUPPORT)
128 #define MLAN_STA_AMPDU_DEF_RXWINSIZE 64
129 #else
130 #define MLAN_STA_AMPDU_DEF_RXWINSIZE 32
131 #endif
132 #endif
133 #endif /* STA_SUPPORT */
134 
135 #if UAP_SUPPORT
136 /** Default Win size attached during ADDBA request */
137 #ifndef MLAN_UAP_AMPDU_DEF_TXWINSIZE
138 #if defined(SD9177) && defined(COEX_APP_SUPPORT)
139 #define MLAN_UAP_AMPDU_DEF_TXWINSIZE 32
140 #else
141 #define MLAN_UAP_AMPDU_DEF_TXWINSIZE 64
142 #endif
143 #endif
144 
145 /** Default Win size attached during ADDBA response */
146 #ifndef MLAN_UAP_AMPDU_DEF_RXWINSIZE
147 #if defined(SD9177) && !defined(COEX_APP_SUPPORT)
148 #define MLAN_UAP_AMPDU_DEF_RXWINSIZE 64
149 #else
150 #define MLAN_UAP_AMPDU_DEF_RXWINSIZE 32
151 #endif
152 #endif
153 
154 #endif /* UAP_SUPPORT */
155 
156 /** Block ack timeout value */
157 #define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0U
158 /** Maximum Tx Win size configured for ADDBA request [10 bits] */
159 #define MLAN_AMPDU_MAX_TXWINSIZE 0x3ff
160 /** Maximum Rx Win size configured for ADDBA request [10 bits] */
161 #define MLAN_AMPDU_MAX_RXWINSIZE 0x3ff
162 
163 /** Rate index for HR/DSSS 0 */
164 #define MLAN_RATE_INDEX_HRDSSS0 0
165 /** Rate index for HR/DSSS 3 */
166 #define MLAN_RATE_INDEX_HRDSSS3 3
167 /** Rate index for OFDM 0 */
168 #define MLAN_RATE_INDEX_OFDM0 4U
169 /** Rate index for OFDM 7 */
170 #define MLAN_RATE_INDEX_OFDM7 11
171 /** Rate index for MCS 0 */
172 #define MLAN_RATE_INDEX_MCS0 0U
173 /** Rate index for MCS 2 */
174 #define MLAN_RATE_INDEX_MCS2 2U
175 /** Rate index for MCS 4 */
176 #define MLAN_RATE_INDEX_MCS4 4U
177 /** Rate index for MCS 7 */
178 #define MLAN_RATE_INDEX_MCS7 7U
179 /** Rate index for MCS 8 */
180 #define MLAN_RATE_INDEX_MCS8 8U
181 /** Rate index for MCS 9 */
182 #define MLAN_RATE_INDEX_MCS9 9U
183 #if CONFIG_11AX
184 /** Rate index for MCS11 */
185 #define MLAN_RATE_INDEX_MCS11 11U
186 #endif
187 /** Rate index for MCS 32 */
188 #define MLAN_RATE_INDEX_MCS32 32U
189 /** Rate index for MCS 127 */
190 #define MLAN_RATE_INDEX_MCS127 127U
191 #if (CONFIG_11AC) || (CONFIG_11AX)
192 #define MLAN_RATE_NSS1 1
193 #define MLAN_RATE_NSS2 2
194 #endif
195 
196 /** Rate bitmap for OFDM 0 */
197 #define MLAN_RATE_BITMAP_OFDM0 16
198 /** Rate bitmap for OFDM 7 */
199 #define MLAN_RATE_BITMAP_OFDM7 23
200 /** Rate bitmap for MCS 0 */
201 #define MLAN_RATE_BITMAP_MCS0 32U
202 /** Rate bitmap for MCS 127 */
203 #define MLAN_RATE_BITMAP_MCS127 159
204 #if CONFIG_11AC
205 #define MLAN_RATE_BITMAP_NSS1_MCS0 160
206 #define MLAN_RATE_BITMAP_NSS1_MCS9 169
207 #define MLAN_RATE_BITMAP_NSS2_MCS0 176
208 #define MLAN_RATE_BITMAP_NSS2_MCS9 185
209 #endif
210 
211 /** MU beamformer */
212 #define DEFALUT_11AC_CAP_BEAMFORMING_RESET_MASK (MBIT(19))
213 #ifdef RW610
214 /** Short GI for 80MHz/TVHT_MODE_4C */
215 #define DEFALUT_11AC_CAP_SHORTGI_80MHZ_RESET_MASK (MBIT(5))
216 /** HE Phy Cap Info(40MHz in 2.4GHz band) */
217 #define DEFAULT_11AX_CAP_40MHZIH2_4GHZBAND_RESET_MASK (MBIT(1))
218 #endif
219 
220 /** Size of rx data buffer */
221 #define MLAN_RX_DATA_BUF_SIZE (4 * 1024)
222 /** Size of rx command buffer */
223 #define MLAN_RX_CMD_BUF_SIZE (2 * 1024)
224 
225 /** MLAN MAC Address Length */
226 #define MLAN_MAC_ADDR_LENGTH (6U)
227 /** MLAN 802.11 MAC Address */
228 typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
229 
230 /** MLAN Maximum SSID Length */
231 #define MLAN_MAX_SSID_LENGTH (32U)
232 
233 /** RTS/FRAG related defines */
234 /** Minimum RTS value */
235 #define MLAN_RTS_MIN_VALUE (0)
236 /** Maximum RTS value */
237 #define MLAN_RTS_MAX_VALUE (2347)
238 /** Minimum FRAG value */
239 #define MLAN_FRAG_MIN_VALUE (256)
240 /** Maximum FRAG value */
241 #define MLAN_FRAG_MAX_VALUE (2346)
242 
243 /** Minimum tx retry count */
244 #define MLAN_TX_RETRY_MIN (0)
245 /** Maximum tx retry count */
246 #define MLAN_TX_RETRY_MAX (14)
247 
248 /** define SDIO block size for data Tx/Rx */
249 /* We support up to 480-byte block size due to FW buffer limitation. */
250 #define MLAN_SDIO_BLOCK_SIZE 256U
251 
252 /** define SDIO block size for firmware download */
253 #define MLAN_SDIO_BLOCK_SIZE_FW_DNLD MLAN_SDIO_BLOCK_SIZE
254 
255 /** define allocated buffer size */
256 #define ALLOC_BUF_SIZE (4 * 1024)
257 
258 /** SDIO IO Port mask */
259 #define MLAN_SDIO_IO_PORT_MASK 0xfffff
260 /** SDIO Block/Byte mode mask */
261 #define MLAN_SDIO_BYTE_MODE_MASK 0x80000000U
262 
263 /** Max retry number of IO write */
264 #define MAX_READ_IOMEM_RETRY 2
265 
266 /** IN parameter */
267 #define IN
268 /** OUT parameter */
269 #define OUT
270 
271 /** BIT value */
272 #define MBIT(x) (((t_u32)1) << (x))
273 
274 #define MRVL_PKT_TYPE_MGMT_FRAME 0xE5
275 
276 /** Buffer flag for requeued packet */
277 #define MLAN_BUF_FLAG_REQUEUED_PKT MBIT(0)
278 /** Buffer flag for transmit buf from moal */
279 #define MLAN_BUF_FLAG_MOAL_TX_BUF MBIT(1)
280 /** Buffer flag for malloc mlan_buffer */
281 #define MLAN_BUF_FLAG_MALLOC_BUF MBIT(2)
282 
283 /** Buffer flag for bridge packet */
284 #define MLAN_BUF_FLAG_BRIDGE_BUF MBIT(3)
285 
286 /** Buffer flag for TX_STATUS */
287 #define MLAN_BUF_FLAG_TX_STATUS MBIT(10)
288 
289 #ifdef DEBUG_LEVEL1
290 /** Debug level bit definition */
291 #define MMSG   MBIT(0)
292 #define MFATAL MBIT(1)
293 #define MERROR MBIT(2)
294 #define MDATA  MBIT(3)
295 #define MCMND  MBIT(4)
296 #define MEVENT MBIT(5)
297 #define MINTR  MBIT(6)
298 #define MIOCTL MBIT(7)
299 
300 #define MDAT_D MBIT(16)
301 #define MCMD_D MBIT(17)
302 #define MEVT_D MBIT(18)
303 #define MFW_D  MBIT(19)
304 #define MIF_D  MBIT(20)
305 
306 #define MENTRY    MBIT(28)
307 #define MWARN     MBIT(29)
308 #define MINFO     MBIT(30)
309 #define MHEX_DUMP MBIT(31)
310 #endif /* DEBUG_LEVEL1 */
311 
312 /** Memory allocation type: DMA */
313 #define MLAN_MEM_DMA MBIT(0U)
314 
315 /** Default memory allocation flag */
316 #define MLAN_MEM_DEF 0U
317 
318 #if CONFIG_WIFI_IND_DNLD
319 /** driver initial the fw reset */
320 #define FW_RELOAD_SDIO_INBAND_RESET 1
321 /** out band reset trigger reset, no interface re-emulation */
322 #define FW_RELOAD_NO_EMULATION 2
323 /** out band reset with interface re-emulation */
324 #define FW_RELOAD_WITH_EMULATION 3
325 /** sdio hw reset */
326 #define FW_RELOAD_SDIO_HW_RESET 5
327 #endif
328 
329 /** MrvlExtIEtypesHeader_t */
330 typedef MLAN_PACK_START struct _MrvlExtIEtypesHeader
331 {
332     /** Header type */
333     t_u16 type;
334     /** Header length */
335     t_u16 len;
336     /** ext id */
337     t_u8 ext_id;
338 } MLAN_PACK_END MrvlExtIEtypesHeader_t;
339 
340 /** MrvlIEtypes_Data_t */
341 typedef MLAN_PACK_START struct _MrvlExtIEtypes_Data_t
342 {
343     /** Header */
344     MrvlExtIEtypesHeader_t header;
345     /** Data */
346     t_u8 data[];
347 } MLAN_PACK_END MrvlExtIEtypes_Data_t;
348 
349 /** mlan_status */
350 typedef enum _mlan_status
351 {
352     MLAN_STATUS_FAILURE = 0xffffffff,
353     MLAN_STATUS_SUCCESS = 0,
354     MLAN_STATUS_PENDING,
355     MLAN_STATUS_RESOURCE,
356 } mlan_status;
357 
358 /** mlan_error_code */
359 typedef enum _mlan_error_code
360 {
361     /** No error */
362     MLAN_ERROR_NO_ERROR = 0,
363     /** Firmware/device errors below (MSB=0) */
364     MLAN_ERROR_FW_NOT_READY = 0x00000001,
365     MLAN_ERROR_FW_BUSY,
366     MLAN_ERROR_FW_CMDRESP,
367     MLAN_ERROR_DATA_TX_FAIL,
368     MLAN_ERROR_DATA_RX_FAIL,
369     /** Driver errors below (MSB=1) */
370     MLAN_ERROR_PKT_SIZE_INVALID = 0x80000001,
371     MLAN_ERROR_PKT_TIMEOUT,
372     MLAN_ERROR_PKT_INVALID,
373     MLAN_ERROR_CMD_INVALID,
374     MLAN_ERROR_CMD_TIMEOUT,
375     MLAN_ERROR_CMD_DNLD_FAIL,
376     MLAN_ERROR_CMD_CANCEL,
377     MLAN_ERROR_CMD_RESP_FAIL,
378     MLAN_ERROR_CMD_ASSOC_FAIL,
379     MLAN_ERROR_CMD_SCAN_FAIL,
380     MLAN_ERROR_IOCTL_INVALID,
381     MLAN_ERROR_IOCTL_FAIL,
382     MLAN_ERROR_EVENT_UNKNOWN,
383     MLAN_ERROR_INVALID_PARAMETER,
384     MLAN_ERROR_NO_MEM,
385     /** More to add */
386 } mlan_error_code;
387 
388 /** mlan_buf_type */
389 typedef enum _mlan_buf_type
390 {
391     MLAN_BUF_TYPE_CMD = 1,
392     MLAN_BUF_TYPE_DATA,
393     MLAN_BUF_TYPE_EVENT,
394     MLAN_BUF_TYPE_RAW_DATA,
395 } mlan_buf_type;
396 
397 /** MLAN BSS type */
398 typedef enum _mlan_bss_type
399 {
400     MLAN_BSS_TYPE_STA = 0,
401     MLAN_BSS_TYPE_UAP = 1,
402     /* fixme: This macro will be enabled when
403      * mlan is completely integrated with wlan
404      */
405     /* #ifdef WIFI_DIRECT_SUPPORT*/
406     MLAN_BSS_TYPE_WIFIDIRECT = 2,
407     /*#endif*/
408     MLAN_BSS_TYPE_ANY = 0xff,
409 } mlan_bss_type;
410 
411 /** MLAN BSS role */
412 typedef enum _mlan_bss_role
413 {
414     MLAN_BSS_ROLE_STA = 0,
415     MLAN_BSS_ROLE_UAP = 1,
416     MLAN_BSS_ROLE_ANY = 0xff,
417 } mlan_bss_role;
418 
419 /** BSS role bit mask */
420 #define BSS_ROLE_BIT_MASK MBIT(0)
421 
422 /** Get BSS role */
423 #define GET_BSS_ROLE(priv) ((unsigned)(priv)->bss_role & (BSS_ROLE_BIT_MASK))
424 
425 /** mlan_data_frame_type */
426 typedef enum _mlan_data_frame_type
427 {
428     MLAN_DATA_FRAME_TYPE_ETH_II = 0,
429     MLAN_DATA_FRAME_TYPE_802_11,
430 } mlan_data_frame_type;
431 
432 /** mlan_event_id */
433 typedef enum _mlan_event_id
434 {
435     /* Event generated by firmware (MSB=0) */
436     MLAN_EVENT_ID_FW_UNKNOWN = 0x00000001,
437     MLAN_EVENT_ID_FW_ADHOC_LINK_SENSED,
438     MLAN_EVENT_ID_FW_ADHOC_LINK_LOST,
439     MLAN_EVENT_ID_FW_DISCONNECTED,
440     MLAN_EVENT_ID_FW_MIC_ERR_UNI,
441     MLAN_EVENT_ID_FW_MIC_ERR_MUL,
442     MLAN_EVENT_ID_FW_BCN_RSSI_LOW,
443     MLAN_EVENT_ID_FW_BCN_RSSI_HIGH,
444     MLAN_EVENT_ID_FW_BCN_SNR_LOW,
445     MLAN_EVENT_ID_FW_BCN_SNR_HIGH,
446     MLAN_EVENT_ID_FW_MAX_FAIL,
447     MLAN_EVENT_ID_FW_DATA_RSSI_LOW,
448     MLAN_EVENT_ID_FW_DATA_RSSI_HIGH,
449     MLAN_EVENT_ID_FW_DATA_SNR_LOW,
450     MLAN_EVENT_ID_FW_DATA_SNR_HIGH,
451     MLAN_EVENT_ID_FW_LINK_QUALITY,
452     MLAN_EVENT_ID_FW_PORT_RELEASE,
453     MLAN_EVENT_ID_FW_PRE_BCN_LOST,
454     MLAN_EVENT_ID_FW_WMM_CONFIG_CHANGE,
455     MLAN_EVENT_ID_FW_HS_WAKEUP,
456     MLAN_EVENT_ID_FW_BG_SCAN,
457     MLAN_EVENT_ID_FW_WEP_ICV_ERR,
458     MLAN_EVENT_ID_FW_STOP_TX,
459     MLAN_EVENT_ID_FW_START_TX,
460     MLAN_EVENT_ID_FW_CHANNEL_SWITCH_ANN,
461     MLAN_EVENT_ID_FW_RADAR_DETECTED,
462     MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY,
463     MLAN_EVENT_ID_FW_BW_CHANGED,
464 #ifdef WIFI_DIRECT_SUPPORT
465     MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED,
466 #endif
467 #if UAP_SUPPORT
468     MLAN_EVENT_ID_UAP_FW_BSS_START,
469     MLAN_EVENT_ID_UAP_FW_BSS_ACTIVE,
470     MLAN_EVENT_ID_UAP_FW_BSS_IDLE,
471     MLAN_EVENT_ID_UAP_FW_STA_CONNECT,
472     MLAN_EVENT_ID_UAP_FW_STA_DISCONNECT,
473 #endif
474 
475     /* Event generated by MLAN driver (MSB=1) */
476     MLAN_EVENT_ID_DRV_CONNECTED = 0x80000001,
477     MLAN_EVENT_ID_DRV_DEFER_HANDLING,
478     MLAN_EVENT_ID_DRV_HS_ACTIVATED,
479     MLAN_EVENT_ID_DRV_HS_DEACTIVATED,
480     MLAN_EVENT_ID_DRV_MGMT_FRAME,
481     MLAN_EVENT_ID_DRV_OBSS_SCAN_PARAM,
482     MLAN_EVENT_ID_DRV_PASSTHRU,
483     MLAN_EVENT_ID_DRV_SCAN_REPORT,
484     MLAN_EVENT_ID_DRV_MEAS_REPORT,
485     MLAN_EVENT_ID_DRV_ASSOC_FAILURE_REPORT,
486     MLAN_EVENT_ID_DRV_REPORT_STRING,
487     MLAN_EVENT_ID_DRV_DBG_DUMP,
488 } mlan_event_id;
489 
490 /** Data Structures */
491 /** mlan_image data structure */
492 typedef struct _mlan_fw_image
493 {
494     /** Helper image buffer pointer */
495     t_u8 *phelper_buf;
496     /** Helper image length */
497     t_u32 helper_len;
498     /** Firmware image buffer pointer */
499     t_u8 *pfw_buf;
500     /** Firmware image length */
501     t_u32 fw_len;
502 #if CONFIG_WIFI_IND_DNLD
503     /** Firmware reload flag */
504     t_u8 fw_reload;
505 #endif
506 } mlan_fw_image, *pmlan_fw_image;
507 
508 /** Custom data structure */
509 typedef struct _mlan_init_param
510 {
511     /** Cal data buffer pointer */
512     t_u8 *pcal_data_buf;
513     /** Cal data length */
514     t_u32 cal_data_len;
515     /** Other custom data */
516 } mlan_init_param, *pmlan_init_param;
517 
518 /** Channel usability flags */
519 #define NXP_CHANNEL_NO_OFDM  MBIT(9)
520 #define NXP_CHANNEL_NO_CCK   MBIT(8)
521 #define NXP_CHANNEL_DISABLED MBIT(7)
522 /* BIT 5/6 resevered for FW */
523 #define NXP_CHANNEL_NOHT160 MBIT(4)
524 #define NXP_CHANNEL_NOHT80  MBIT(3)
525 #define NXP_CHANNEL_NOHT40  MBIT(2)
526 #define NXP_CHANNEL_DFS     MBIT(1)
527 #define NXP_CHANNEL_PASSIVE MBIT(0)
528 
529 /** CFP dynamic (non-const) elements */
530 typedef struct _cfp_dyn_t
531 {
532     /** extra flags to specify channel usability
533      *  bit 9 : if set, channel is non-OFDM
534      *  bit 8 : if set, channel is non-CCK
535      *  bit 7 : if set, channel is disabled
536      *  bit  5/6 resevered for FW
537      *  bit 4 : if set, 160MHz on channel is disabled
538      *  bit 3 : if set, 80MHz on channel is disabled
539      *  bit 2 : if set, 40MHz on channel is disabled
540      *  bit 1 : if set, channel is DFS channel
541      *  bit 0 : if set, channel is passive
542      */
543     t_u16 flags;
544     /** TRUE: Channel is blacklisted (do not use) */
545     t_bool blacklist;
546 } cfp_dyn_t;
547 
548 /** Chan-Freq-TxPower mapping table*/
549 typedef struct _chan_freq_power_t
550 {
551     /** Channel Number */
552     t_u16 channel;
553     /** Frequency of this Channel */
554     t_u32 freq;
555     /** Max allowed Tx power level */
556     t_u16 max_tx_power;
557     /** TRUE:radar detect required for BAND A or passive scan for BAND B/G;
558      * FALSE:radar detect not required for BAND A or active scan for BAND B/G*/
559     t_bool passive_scan_or_radar_detect;
560     /** Elements associated to cfp that change at run-time */
561     cfp_dyn_t dynamic;
562 } chan_freq_power_t;
563 
564 /** mlan_event data structure */
565 typedef struct _mlan_event
566 {
567     /** BSS index number for multiple BSS support */
568     t_u32 bss_index;
569     /** Event ID */
570     mlan_event_id event_id;
571     /** Event length */
572     t_u32 event_len;
573     /** Event buffer */
574     t_u8 event_buf[1];
575 } mlan_event, *pmlan_event;
576 
577 #if CONFIG_P2P
578 /** mlan_event data structure */
579 typedef struct _mlan_event_p2p
580 {
581     /** Event length */
582     t_u32 event_len;
583     /** Event buffer */
584     t_u8 event_buf[0];
585 } mlan_event_p2p, *pmlan_event_p2p;
586 #endif
587 
588 #if CONFIG_EXT_SCAN_SUPPORT
589 /** mlan_event_scan_result data structure */
590 typedef MLAN_PACK_START struct _mlan_event_scan_result
591 {
592     /** Event ID */
593     t_u16 event_id;
594     /** BSS index number for multiple BSS support */
595     t_u8 bss_index;
596     /** BSS type */
597     t_u8 bss_type;
598     /** More event available or not */
599     t_u8 more_event;
600     /** Reserved */
601     t_u8 reserved[3];
602     /** Size of the response buffer */
603     t_u16 buf_size;
604     /** Number of BSS in scan response */
605     t_u8 num_of_set;
606 } MLAN_PACK_END mlan_event_scan_result, *pmlan_event_scan_result;
607 #endif
608 
609 /** mlan_buffer data structure */
610 typedef struct _mlan_buffer
611 {
612     /** Pointer to previous mlan_buffer */
613     // struct _mlan_buffer *pprev;
614     /** Pointer to next mlan_buffer */
615     // struct _mlan_buffer *pnext;
616     /** Status code from firmware/driver */
617     t_u32 status_code;
618     /** Flags for this buffer */
619     t_u32 flags;
620     /** BSS index number for multiple BSS support */
621     t_u32 bss_index;
622     /** Buffer descriptor, e.g. skb in Linux */
623     t_void *pdesc;
624     /** Private member added for WMSDK. This is used to store the lwip pbuf
625  pointer */
626     t_void *lwip_pbuf;
627     /** Pointer to buffer */
628     t_u8 *pbuf;
629     /** Offset to data */
630     t_u32 data_offset;
631     /** Data length */
632     t_u32 data_len;
633     /** Buffer type: data, cmd, event etc. */
634     mlan_buf_type buf_type;
635 
636     /** Fields below are valid for data packet only */
637     /** QoS priority */
638     t_u32 priority;
639     /** Time stamp when packet is received (seconds) */
640     // t_u32 in_ts_sec;
641     /** Time stamp when packet is received (micro seconds) */
642     // t_u32 in_ts_usec;
643     /** Time stamp when packet is processed (seconds) */
644     // t_u32 out_ts_sec;
645     /** Time stamp when packet is processed (micro seconds) */
646     // t_u32 out_ts_usec;
647 
648     /** Fields below are valid for MLAN module only */
649     /** Pointer to parent mlan_buffer */
650     // struct _mlan_buffer *pparent;
651     /** Use count for this buffer */
652     t_u32 use_count;
653 } mlan_buffer, *pmlan_buffer;
654 
655 /** mlan_bss_attr data structure */
656 typedef struct _mlan_bss_attr
657 {
658     /** BSS type */
659     mlan_bss_type bss_type;
660     /** Data frame type: Ethernet II, 802.11, etc. */
661     t_u32 frame_type;
662     /** The BSS is active (non-0) or not (0). */
663     t_u32 active;
664     /** BSS Priority */
665     t_u32 bss_priority;
666     /** BSS number */
667     t_u32 bss_num;
668 } mlan_bss_attr, *pmlan_bss_attr;
669 
670 #ifdef PRAGMA_PACK
671 #pragma pack(push, 1)
672 #endif
673 
674 /** Type enumeration for the command result */
675 typedef MLAN_PACK_START enum _mlan_cmd_result_e {
676     MLAN_CMD_RESULT_SUCCESS      = 0,
677     MLAN_CMD_RESULT_FAILURE      = 1,
678     MLAN_CMD_RESULT_TIMEOUT      = 2,
679     MLAN_CMD_RESULT_INVALID_DATA = 3
680 } MLAN_PACK_END mlan_cmd_result_e;
681 
682 #define WMM_AC_BK 0
683 #define WMM_AC_BE 1
684 #define WMM_AC_VI 2
685 #define WMM_AC_VO 3
686 
687 typedef t_u8 mlan_wmm_ac_e;
688 
689 /** Type enumeration for the action field in the Queue Config command */
690 typedef MLAN_PACK_START enum _mlan_wmm_queue_config_action_e {
691     MLAN_WMM_QUEUE_CONFIG_ACTION_GET     = 0,
692     MLAN_WMM_QUEUE_CONFIG_ACTION_SET     = 1,
693     MLAN_WMM_QUEUE_CONFIG_ACTION_DEFAULT = 2,
694     MLAN_WMM_QUEUE_CONFIG_ACTION_MAX
695 } MLAN_PACK_END mlan_wmm_queue_config_action_e;
696 
697 /** Type enumeration for the action field in the queue stats command */
698 typedef MLAN_PACK_START enum _mlan_wmm_queue_stats_action_e {
699     MLAN_WMM_STATS_ACTION_START   = 0,
700     MLAN_WMM_STATS_ACTION_STOP    = 1,
701     MLAN_WMM_STATS_ACTION_GET_CLR = 2,
702     MLAN_WMM_STATS_ACTION_SET_CFG = 3, /* Not currently used */
703     MLAN_WMM_STATS_ACTION_GET_CFG = 4, /* Not currently used */
704     MLAN_WMM_STATS_ACTION_MAX
705 } MLAN_PACK_END mlan_wmm_queue_stats_action_e;
706 
707 /**
708  *  @brief IOCTL structure for a Traffic stream status.
709  *
710  */
711 typedef MLAN_PACK_START struct
712 {
713     /** TSID: Range: 0->7 */
714     t_u8 tid;
715     /** TSID specified is valid */
716     t_u8 valid;
717     /** AC TSID is active on */
718     t_u8 access_category;
719     /** UP specified for the TSID */
720     t_u8 user_priority;
721     /** Power save mode for TSID: 0 (legacy), 1 (UAPSD) */
722     t_u8 psb;
723     /** Upstream(0), Downlink(1), Bidirectional(3) */
724     t_u8 flow_dir;
725     /** Medium time granted for the TSID */
726     t_u16 medium_time;
727 } MLAN_PACK_END wlan_ioctl_wmm_ts_status_t,
728     /** Type definition of mlan_ds_wmm_ts_status for MLAN_OID_WMM_CFG_TS_STATUS */
729     mlan_ds_wmm_ts_status, *pmlan_ds_wmm_ts_status;
730 
731 /** Max Ie length */
732 #define MAX_IE_SIZE 256U
733 
734 /** custom IE */
735 typedef MLAN_PACK_START struct _custom_ie
736 {
737     /** IE Index */
738     t_u16 ie_index;
739     /** Mgmt Subtype Mask */
740     t_u16 mgmt_subtype_mask;
741     /** IE Length */
742     t_u16 ie_length;
743     /** IE buffer */
744     t_u8 ie_buffer[MAX_IE_SIZE];
745 } MLAN_PACK_END custom_ie;
746 
747 /** TLV buffer : custom IE */
748 typedef MLAN_PACK_START struct _tlvbuf_custom_ie
749 {
750     /** Tag */
751     t_u16 type;
752     /** Length */
753     t_u16 length;
754     /** custom IE data */
755     custom_ie ie_data[0];
756 } MLAN_PACK_END tlvbuf_custom_ie;
757 
758 /** Max IE index to FW */
759 #define MAX_MGMT_IE_INDEX_TO_FW 4U
760 /** Max IE index per BSS */
761 #define MAX_MGMT_IE_INDEX 16
762 
763 /** custom IE info */
764 typedef MLAN_PACK_START struct _custom_ie_info
765 {
766     /** size of buffer */
767     t_u16 buf_size;
768     /** no of buffers of buf_size */
769     t_u16 buf_count;
770 } MLAN_PACK_END custom_ie_info;
771 
772 /** TLV buffer : Max Mgmt IE */
773 typedef MLAN_PACK_START struct _tlvbuf_max_mgmt_ie
774 {
775     /** Type */
776     t_u16 type;
777     /** Length */
778     t_u16 len;
779     /** No of tuples */
780     t_u16 count;
781     /** custom IE info tuples */
782     custom_ie_info info[MAX_MGMT_IE_INDEX];
783 } MLAN_PACK_END tlvbuf_max_mgmt_ie;
784 
785 /** TLV buffer : custom IE */
786 typedef MLAN_PACK_START struct _mlan_ds_misc_custom_ie
787 {
788     /** Type */
789     t_u16 type;
790     /** Length */
791     t_u16 len;
792     /** IE data */
793     custom_ie ie_data_list[MAX_MGMT_IE_INDEX_TO_FW];
794     /** Max mgmt IE TLV */
795     tlvbuf_max_mgmt_ie max_mgmt_ie;
796 } MLAN_PACK_END mlan_ds_misc_custom_ie;
797 
798 /** channel type */
799 enum mlan_channel_type
800 {
801     CHAN_NO_HT,
802     CHAN_HT20,
803     CHAN_HT40MINUS,
804     CHAN_HT40PLUS,
805     CHAN_VHT80
806 };
807 
808 /** channel band */
809 enum
810 {
811     BAND_2GHZ = 0,
812     BAND_5GHZ = 1,
813     BAND_6GHZ = 2,
814     BAND_4GHZ = 3,
815 };
816 
817 /** Band_Config_t */
818 typedef MLAN_PACK_START struct _Band_Config_t
819 {
820 #ifdef BIG_ENDIAN_SUPPORT
821     /** Channel Selection Mode - (00)=manual, (01)=ACS,  (02)=user*/
822     t_u8 scanMode : 2;
823     /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
824     t_u8 chan2Offset : 2;
825     /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
826     t_u8 chanWidth : 2;
827     /** Band Info - (00)=2.4GHz, (01)=5GHz */
828     t_u8 chanBand : 2;
829 #else
830     /** Band Info - (00)=2.4GHz, (01)=5GHz */
831     t_u8 chanBand : 2;
832     /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
833     t_u8 chanWidth : 2;
834     /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
835     t_u8 chan2Offset : 2;
836     /** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
837     t_u8 scanMode : 2;
838 #endif
839 } MLAN_PACK_END Band_Config_t;
840 
841 /** channel_band_t */
842 typedef MLAN_PACK_START struct _chan_band_info
843 {
844     /** Band Configuration */
845     Band_Config_t bandcfg;
846     /** channel */
847     t_u8 channel;
848     /** 11n flag */
849     t_u8 is_11n_enabled;
850     /** center channel */
851     t_u8 center_chan;
852 #if defined(ENABLE_802_11H) && defined(DFS_SUPPORT)
853     /** dfs channel flag */
854     t_u8 is_dfs_chan;
855 #endif
856 } MLAN_PACK_END chan_band_info;
857 
858 /** csi event data structure */
859 #if CONFIG_CSI
860 typedef MLAN_PACK_START struct _csi_record_ds
861 {
862     /** Length in DWORDS, including header */
863     t_u16 Len;
864     /** CSI signature. 0xABCD fixed */
865     t_u16 CSI_Sign;
866     /** User defined HeaderID  */
867     t_u32 CSI_HeaderID;
868     /** Packet info field */
869     t_u16 PKT_info;
870     /** Frame control field for the received packet*/
871     t_u16 FCF;
872     /** Timestamp when packet received */
873     t_u64 TSF;
874     /** Received Packet Destination MAC Address */
875     t_u8 Dst_MAC[6];
876     /** Received Packet Source MAC Address */
877     t_u8 Src_MAC[6];
878     /** RSSI for antenna A */
879     t_u8 Rx_RSSI_A;
880     /** RSSI for antenna B */
881     t_u8 Rx_RSSI_B;
882     /** Noise floor for antenna A */
883     t_u8 Rx_NF_A;
884     /** Noise floor for antenna A */
885     t_u8 Rx_NF_B;
886     /** Rx signal strength above noise floor */
887     t_u8 Rx_SINR;
888     /** Channel */
889     t_u8 channel;
890     /** user defined Chip ID */
891     t_u16 chip_id;
892     /** Reserved */
893     t_u32 rsvd;
894     /** CSI data length in DWORDs */
895     t_u32 CSI_Data_Length;
896     /** Start of CSI data */
897     t_u8 CSI_Data[0];
898     /** At the end of CSI raw data, user defined TailID of 4 bytes*/
899 } MLAN_PACK_END csi_record_ds, *pcsi_record_ds;
900 #endif
901 
902 #ifdef PRAGMA_PACK
903 #pragma pack(pop)
904 #endif
905 
906 /** mlan_callbacks data structure */
907 typedef struct _mlan_callbacks
908 {
909 #if 0
910     /** moal_get_fw_data */
911     mlan_status(*moal_get_fw_data) (IN t_void * pmoal_handle,
912                                     IN t_u32 offset,
913                                     IN t_u32 len, OUT t_u8 * pbuf);
914     /** moal_init_fw_complete */
915     mlan_status(*moal_init_fw_complete) (IN t_void * pmoal_handle,
916                                          IN mlan_status status);
917     /** moal_shutdown_fw_complete */
918     mlan_status(*moal_shutdown_fw_complete) (IN t_void * pmoal_handle,
919                                              IN mlan_status status);
920     /** moal_send_packet_complete */
921     mlan_status(*moal_send_packet_complete) (IN t_void * pmoal_handle,
922                                              IN pmlan_buffer pmbuf,
923                                              IN mlan_status status);
924     /** moal_recv_complete */
925     mlan_status(*moal_recv_complete) (IN t_void * pmoal_handle,
926                                       IN pmlan_buffer pmbuf,
927                                       IN t_u32 port, IN mlan_status status);
928 #endif /* 0 */
929     /** moal_recv_packet */
930     mlan_status (*moal_recv_packet)(IN t_void *pmoal_handle, IN pmlan_buffer pmbuf);
931 #if 0
932     /** moal_recv_event */
933     mlan_status(*moal_recv_event) (IN t_void * pmoal_handle,
934                                    IN pmlan_event pmevent);
935     /** moal_ioctl_complete */
936     mlan_status(*moal_ioctl_complete) (IN t_void * pmoal_handle,
937                                        IN pmlan_ioctl_req pioctl_req,
938                                        IN mlan_status status);
939     /** moal_alloc_mlan_buffer */
940     mlan_status(*moal_alloc_mlan_buffer) (IN t_void * pmoal_handle,
941                                           IN t_u32 size,
942                                           OUT pmlan_buffer * pmbuf);
943     /** moal_free_mlan_buffer */
944     mlan_status(*moal_free_mlan_buffer) (IN t_void * pmoal_handle,
945                                          IN pmlan_buffer pmbuf);
946     /** moal_write_reg */
947     mlan_status(*moal_write_reg) (IN t_void * pmoal_handle,
948                                   IN t_u32 reg, IN t_u32 data);
949     /** moal_read_reg */
950     mlan_status(*moal_read_reg) (IN t_void * pmoal_handle,
951                                  IN t_u32 reg, OUT t_u32 * data);
952     /** moal_write_data_sync */
953     mlan_status(*moal_write_data_sync) (IN t_void * pmoal_handle,
954                                         IN pmlan_buffer pmbuf,
955                                         IN t_u32 port, IN t_u32 timeout);
956     /** moal_read_data_sync */
957     mlan_status(*moal_read_data_sync) (IN t_void * pmoal_handle,
958                                        IN OUT pmlan_buffer pmbuf,
959                                        IN t_u32 port, IN t_u32 timeout);
960 #endif /* 0 */
961     /** moal_malloc */
962     mlan_status (*moal_malloc)(IN t_void *pmoal_handle, IN t_u32 size, IN t_u32 flag, OUT t_u8 **ppbuf);
963     /** moal_mfree */
964     mlan_status (*moal_mfree)(IN t_void *pmoal_handle, IN t_u8 *pbuf);
965 #if 0
966     /** moal_memset */
967     t_void *(*moal_memset) (IN t_void * pmoal_handle,
968                             IN t_void * pmem, IN t_u8 byte, IN t_u32 num);
969     /** moal_memcpy */
970     t_void *(*moal_memcpy) (IN t_void * pmoal_handle,
971                             IN t_void * pdest,
972                             IN const t_void * psrc, IN t_u32 num);
973     /** moal_memmove */
974     t_void *(*moal_memmove) (IN t_void * pmoal_handle,
975                              IN t_void * pdest,
976                              IN const t_void * psrc, IN t_u32 num);
977     /** moal_memcmp */
978       t_s32(*moal_memcmp) (IN t_void * pmoal_handle,
979                            IN const t_void * pmem1,
980                            IN const t_void * pmem2, IN t_u32 num);
981     /** moal_udelay */
982       t_void(*moal_udelay) (IN t_void * pmoal_handle, IN t_u32 udelay);
983     /** moal_get_system_time */
984       mlan_status(*moal_get_system_time) (IN t_void * pmoal_handle,
985                                           OUT t_u32 * psec, OUT t_u32 * pusec);
986 #endif /* 0 */
987 
988     /** moal_memcpy_ext */
989     t_void *(*moal_memcpy_ext)(t_void *pmoal, t_void *pdest, const t_void *psrc, t_u32 num, t_u32 dest_size);
990 
991     /** moal_init_timer*/
992     mlan_status (*moal_init_timer)(IN t_void *pmoal_handle,
993                                    OUT t_void *ptimer,
994                                    IN t_void (*callback)(osa_timer_arg_t arg),
995                                    IN t_void *pcontext);
996     /** moal_free_timer */
997     mlan_status (*moal_free_timer)(IN t_void *pmoal_handle, IN t_void *ptimer);
998     /** moal_start_timer*/
999     mlan_status (*moal_start_timer)(IN t_void *pmoal_handle, IN t_void *ptimer, IN bool periodic, IN t_u32 msec);
1000     /** moal_reset_timer*/
1001     mlan_status (*moal_reset_timer)(IN t_void *pmoal_handle, IN t_void *ptimer);
1002     /** moal_stop_timer*/
1003     mlan_status (*moal_stop_timer)(IN t_void *pmoal_handle, IN t_void *ptimer);
1004     /** moal_init_lock */
1005     mlan_status (*moal_init_lock)(IN t_void *pmoal_handle, OUT t_void *plock);
1006     /** moal_free_lock */
1007     mlan_status (*moal_free_lock)(IN t_void *pmoal_handle, IN t_void *plock);
1008     /** moal_spin_lock */
1009     mlan_status (*moal_spin_lock)(IN t_void *pmoal_handle, IN t_void *plock);
1010     /** moal_spin_unlock */
1011     mlan_status (*moal_spin_unlock)(IN t_void *pmoal_handle, IN t_void *plock);
1012 #if CONFIG_WMM
1013     /** moal_init_semaphore */
1014     mlan_status (*moal_init_semaphore)(IN t_void *pmoal_handle, IN const char *name, OUT t_void *plock);
1015     /** moal_free_semaphore */
1016     mlan_status (*moal_free_semaphore)(IN t_void *pmoal_handle, IN t_void *plock);
1017     /** moal_semaphore_get */
1018     mlan_status (*moal_semaphore_get)(IN t_void *pmoal_handle, IN t_void *plock);
1019     /** moal_semaphore_put */
1020     mlan_status (*moal_semaphore_put)(IN t_void *pmoal_handle, IN t_void *plock);
1021 #endif
1022 #if 0
1023     /** moal_print */
1024       t_void(*moal_print) (IN t_void * pmoal_handle,
1025                            IN t_u32 level, IN t_s8 * pformat, IN ...);
1026     /** moal_print_netintf */
1027       t_void(*moal_print_netintf) (IN t_void * pmoal_handle,
1028                                    IN t_u32 bss_index, IN t_u32 level);
1029     /** moal_assert */
1030       t_void(*moal_assert) (IN t_void * pmoal_handle, IN t_u32 cond);
1031 #endif /* 0 */
1032 } mlan_callbacks, *pmlan_callbacks;
1033 
1034 /** Interrupt Mode SDIO */
1035 #define INT_MODE_SDIO 0
1036 /** Interrupt Mode GPIO */
1037 #define INT_MODE_GPIO 1
1038 
1039 /** Parameter unchanged, use MLAN default setting */
1040 #define MLAN_INIT_PARA_UNCHANGED 0
1041 /** Parameter enabled, override MLAN default setting */
1042 #define MLAN_INIT_PARA_ENABLED 1
1043 /** Parameter disabled, override MLAN default setting */
1044 #define MLAN_INIT_PARA_DISABLED 2U
1045 
1046 /** mlan_device data structure */
1047 typedef struct _mlan_device
1048 {
1049     /** BSS Attributes */
1050     mlan_bss_attr bss_attr[MLAN_MAX_BSS_NUM];
1051     /** Callbacks */
1052     mlan_callbacks callbacks;
1053 } mlan_device, *pmlan_device;
1054 
1055 /** MLAN API function prototype */
1056 #define MLAN_API
1057 
1058 /** Registration */
1059 MLAN_API mlan_status mlan_register(IN pmlan_device pmdevice, OUT t_void **ppmlan_adapter);
1060 
1061 /** Un-registration */
1062 MLAN_API mlan_status mlan_unregister(IN t_void *pmlan_adapter);
1063 
1064 /** Firmware Initialization */
1065 MLAN_API mlan_status mlan_init_fw(IN t_void *pmlan_adapter);
1066 #endif /* !_MLAN_DECL_H_ */
1067