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