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