1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * This file is part of wl1251 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 1998-2007 Texas Instruments Incorporated 6*4882a593Smuzhiyun * Copyright (C) 2008 Nokia Corporation 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __WL1251_ACX_H__ 10*4882a593Smuzhiyun #define __WL1251_ACX_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include "wl1251.h" 13*4882a593Smuzhiyun #include "cmd.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* Target's information element */ 16*4882a593Smuzhiyun struct acx_header { 17*4882a593Smuzhiyun struct wl1251_cmd_header cmd; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* acx (or information element) header */ 20*4882a593Smuzhiyun u16 id; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* payload length (not including headers */ 23*4882a593Smuzhiyun u16 len; 24*4882a593Smuzhiyun } __packed; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct acx_error_counter { 27*4882a593Smuzhiyun struct acx_header header; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /* The number of PLCP errors since the last time this */ 30*4882a593Smuzhiyun /* information element was interrogated. This field is */ 31*4882a593Smuzhiyun /* automatically cleared when it is interrogated.*/ 32*4882a593Smuzhiyun u32 PLCP_error; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* The number of FCS errors since the last time this */ 35*4882a593Smuzhiyun /* information element was interrogated. This field is */ 36*4882a593Smuzhiyun /* automatically cleared when it is interrogated.*/ 37*4882a593Smuzhiyun u32 FCS_error; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* The number of MPDUs without PLCP header errors received*/ 40*4882a593Smuzhiyun /* since the last time this information element was interrogated. */ 41*4882a593Smuzhiyun /* This field is automatically cleared when it is interrogated.*/ 42*4882a593Smuzhiyun u32 valid_frame; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* the number of missed sequence numbers in the squentially */ 45*4882a593Smuzhiyun /* values of frames seq numbers */ 46*4882a593Smuzhiyun u32 seq_num_miss; 47*4882a593Smuzhiyun } __packed; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun struct acx_revision { 50*4882a593Smuzhiyun struct acx_header header; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun /* 53*4882a593Smuzhiyun * The WiLink firmware version, an ASCII string x.x.x.x, 54*4882a593Smuzhiyun * that uniquely identifies the current firmware. 55*4882a593Smuzhiyun * The left most digit is incremented each time a 56*4882a593Smuzhiyun * significant change is made to the firmware, such as 57*4882a593Smuzhiyun * code redesign or new platform support. 58*4882a593Smuzhiyun * The second digit is incremented when major enhancements 59*4882a593Smuzhiyun * are added or major fixes are made. 60*4882a593Smuzhiyun * The third digit is incremented for each GA release. 61*4882a593Smuzhiyun * The fourth digit is incremented for each build. 62*4882a593Smuzhiyun * The first two digits identify a firmware release version, 63*4882a593Smuzhiyun * in other words, a unique set of features. 64*4882a593Smuzhiyun * The first three digits identify a GA release. 65*4882a593Smuzhiyun */ 66*4882a593Smuzhiyun char fw_version[20]; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun /* 69*4882a593Smuzhiyun * This 4 byte field specifies the WiLink hardware version. 70*4882a593Smuzhiyun * bits 0 - 15: Reserved. 71*4882a593Smuzhiyun * bits 16 - 23: Version ID - The WiLink version ID 72*4882a593Smuzhiyun * (1 = first spin, 2 = second spin, and so on). 73*4882a593Smuzhiyun * bits 24 - 31: Chip ID - The WiLink chip ID. 74*4882a593Smuzhiyun */ 75*4882a593Smuzhiyun u32 hw_version; 76*4882a593Smuzhiyun } __packed; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun enum wl1251_psm_mode { 79*4882a593Smuzhiyun /* Active mode */ 80*4882a593Smuzhiyun WL1251_PSM_CAM = 0, 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* Power save mode */ 83*4882a593Smuzhiyun WL1251_PSM_PS = 1, 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Extreme low power */ 86*4882a593Smuzhiyun WL1251_PSM_ELP = 2, 87*4882a593Smuzhiyun }; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct acx_sleep_auth { 90*4882a593Smuzhiyun struct acx_header header; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun /* The sleep level authorization of the device. */ 93*4882a593Smuzhiyun /* 0 - Always active*/ 94*4882a593Smuzhiyun /* 1 - Power down mode: light / fast sleep*/ 95*4882a593Smuzhiyun /* 2 - ELP mode: Deep / Max sleep*/ 96*4882a593Smuzhiyun u8 sleep_auth; 97*4882a593Smuzhiyun u8 padding[3]; 98*4882a593Smuzhiyun } __packed; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun enum { 101*4882a593Smuzhiyun HOSTIF_PCI_MASTER_HOST_INDIRECT, 102*4882a593Smuzhiyun HOSTIF_PCI_MASTER_HOST_DIRECT, 103*4882a593Smuzhiyun HOSTIF_SLAVE, 104*4882a593Smuzhiyun HOSTIF_PKT_RING, 105*4882a593Smuzhiyun HOSTIF_DONTCARE = 0xFF 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define DEFAULT_UCAST_PRIORITY 0 109*4882a593Smuzhiyun #define DEFAULT_RX_Q_PRIORITY 0 110*4882a593Smuzhiyun #define DEFAULT_NUM_STATIONS 1 111*4882a593Smuzhiyun #define DEFAULT_RXQ_PRIORITY 0 /* low 0 .. 15 high */ 112*4882a593Smuzhiyun #define DEFAULT_RXQ_TYPE 0x07 /* All frames, Data/Ctrl/Mgmt */ 113*4882a593Smuzhiyun #define TRACE_BUFFER_MAX_SIZE 256 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define DP_RX_PACKET_RING_CHUNK_SIZE 1600 116*4882a593Smuzhiyun #define DP_TX_PACKET_RING_CHUNK_SIZE 1600 117*4882a593Smuzhiyun #define DP_RX_PACKET_RING_CHUNK_NUM 2 118*4882a593Smuzhiyun #define DP_TX_PACKET_RING_CHUNK_NUM 2 119*4882a593Smuzhiyun #define DP_TX_COMPLETE_TIME_OUT 20 120*4882a593Smuzhiyun #define FW_TX_CMPLT_BLOCK_SIZE 16 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct acx_data_path_params { 123*4882a593Smuzhiyun struct acx_header header; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u16 rx_packet_ring_chunk_size; 126*4882a593Smuzhiyun u16 tx_packet_ring_chunk_size; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun u8 rx_packet_ring_chunk_num; 129*4882a593Smuzhiyun u8 tx_packet_ring_chunk_num; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* 132*4882a593Smuzhiyun * Maximum number of packets that can be gathered 133*4882a593Smuzhiyun * in the TX complete ring before an interrupt 134*4882a593Smuzhiyun * is generated. 135*4882a593Smuzhiyun */ 136*4882a593Smuzhiyun u8 tx_complete_threshold; 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* Number of pending TX complete entries in cyclic ring.*/ 139*4882a593Smuzhiyun u8 tx_complete_ring_depth; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* 142*4882a593Smuzhiyun * Max num microseconds since a packet enters the TX 143*4882a593Smuzhiyun * complete ring until an interrupt is generated. 144*4882a593Smuzhiyun */ 145*4882a593Smuzhiyun u32 tx_complete_timeout; 146*4882a593Smuzhiyun } __packed; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun struct acx_data_path_params_resp { 150*4882a593Smuzhiyun struct acx_header header; 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun u16 rx_packet_ring_chunk_size; 153*4882a593Smuzhiyun u16 tx_packet_ring_chunk_size; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun u8 rx_packet_ring_chunk_num; 156*4882a593Smuzhiyun u8 tx_packet_ring_chunk_num; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun u8 pad[2]; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun u32 rx_packet_ring_addr; 161*4882a593Smuzhiyun u32 tx_packet_ring_addr; 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun u32 rx_control_addr; 164*4882a593Smuzhiyun u32 tx_control_addr; 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun u32 tx_complete_addr; 167*4882a593Smuzhiyun } __packed; 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun #define TX_MSDU_LIFETIME_MIN 0 170*4882a593Smuzhiyun #define TX_MSDU_LIFETIME_MAX 3000 171*4882a593Smuzhiyun #define TX_MSDU_LIFETIME_DEF 512 172*4882a593Smuzhiyun #define RX_MSDU_LIFETIME_MIN 0 173*4882a593Smuzhiyun #define RX_MSDU_LIFETIME_MAX 0xFFFFFFFF 174*4882a593Smuzhiyun #define RX_MSDU_LIFETIME_DEF 512000 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun struct acx_rx_msdu_lifetime { 177*4882a593Smuzhiyun struct acx_header header; 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* 180*4882a593Smuzhiyun * The maximum amount of time, in TU, before the 181*4882a593Smuzhiyun * firmware discards the MSDU. 182*4882a593Smuzhiyun */ 183*4882a593Smuzhiyun u32 lifetime; 184*4882a593Smuzhiyun } __packed; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun /* 187*4882a593Smuzhiyun * RX Config Options Table 188*4882a593Smuzhiyun * Bit Definition 189*4882a593Smuzhiyun * === ========== 190*4882a593Smuzhiyun * 31:14 Reserved 191*4882a593Smuzhiyun * 13 Copy RX Status - when set, write three receive status words 192*4882a593Smuzhiyun * to top of rx'd MPDUs. 193*4882a593Smuzhiyun * When cleared, do not write three status words (added rev 1.5) 194*4882a593Smuzhiyun * 12 Reserved 195*4882a593Smuzhiyun * 11 RX Complete upon FCS error - when set, give rx complete 196*4882a593Smuzhiyun * interrupt for FCS errors, after the rx filtering, e.g. unicast 197*4882a593Smuzhiyun * frames not to us with FCS error will not generate an interrupt. 198*4882a593Smuzhiyun * 10 SSID Filter Enable - When set, the WiLink discards all beacon, 199*4882a593Smuzhiyun * probe request, and probe response frames with an SSID that does 200*4882a593Smuzhiyun * not match the SSID specified by the host in the START/JOIN 201*4882a593Smuzhiyun * command. 202*4882a593Smuzhiyun * When clear, the WiLink receives frames with any SSID. 203*4882a593Smuzhiyun * 9 Broadcast Filter Enable - When set, the WiLink discards all 204*4882a593Smuzhiyun * broadcast frames. When clear, the WiLink receives all received 205*4882a593Smuzhiyun * broadcast frames. 206*4882a593Smuzhiyun * 8:6 Reserved 207*4882a593Smuzhiyun * 5 BSSID Filter Enable - When set, the WiLink discards any frames 208*4882a593Smuzhiyun * with a BSSID that does not match the BSSID specified by the 209*4882a593Smuzhiyun * host. 210*4882a593Smuzhiyun * When clear, the WiLink receives frames from any BSSID. 211*4882a593Smuzhiyun * 4 MAC Addr Filter - When set, the WiLink discards any frames 212*4882a593Smuzhiyun * with a destination address that does not match the MAC address 213*4882a593Smuzhiyun * of the adaptor. 214*4882a593Smuzhiyun * When clear, the WiLink receives frames destined to any MAC 215*4882a593Smuzhiyun * address. 216*4882a593Smuzhiyun * 3 Promiscuous - When set, the WiLink receives all valid frames 217*4882a593Smuzhiyun * (i.e., all frames that pass the FCS check). 218*4882a593Smuzhiyun * When clear, only frames that pass the other filters specified 219*4882a593Smuzhiyun * are received. 220*4882a593Smuzhiyun * 2 FCS - When set, the WiLink includes the FCS with the received 221*4882a593Smuzhiyun * frame. 222*4882a593Smuzhiyun * When cleared, the FCS is discarded. 223*4882a593Smuzhiyun * 1 PLCP header - When set, write all data from baseband to frame 224*4882a593Smuzhiyun * buffer including PHY header. 225*4882a593Smuzhiyun * 0 Reserved - Always equal to 0. 226*4882a593Smuzhiyun * 227*4882a593Smuzhiyun * RX Filter Options Table 228*4882a593Smuzhiyun * Bit Definition 229*4882a593Smuzhiyun * === ========== 230*4882a593Smuzhiyun * 31:12 Reserved - Always equal to 0. 231*4882a593Smuzhiyun * 11 Association - When set, the WiLink receives all association 232*4882a593Smuzhiyun * related frames (association request/response, reassocation 233*4882a593Smuzhiyun * request/response, and disassociation). When clear, these frames 234*4882a593Smuzhiyun * are discarded. 235*4882a593Smuzhiyun * 10 Auth/De auth - When set, the WiLink receives all authentication 236*4882a593Smuzhiyun * and de-authentication frames. When clear, these frames are 237*4882a593Smuzhiyun * discarded. 238*4882a593Smuzhiyun * 9 Beacon - When set, the WiLink receives all beacon frames. 239*4882a593Smuzhiyun * When clear, these frames are discarded. 240*4882a593Smuzhiyun * 8 Contention Free - When set, the WiLink receives all contention 241*4882a593Smuzhiyun * free frames. 242*4882a593Smuzhiyun * When clear, these frames are discarded. 243*4882a593Smuzhiyun * 7 Control - When set, the WiLink receives all control frames. 244*4882a593Smuzhiyun * When clear, these frames are discarded. 245*4882a593Smuzhiyun * 6 Data - When set, the WiLink receives all data frames. 246*4882a593Smuzhiyun * When clear, these frames are discarded. 247*4882a593Smuzhiyun * 5 FCS Error - When set, the WiLink receives frames that have FCS 248*4882a593Smuzhiyun * errors. 249*4882a593Smuzhiyun * When clear, these frames are discarded. 250*4882a593Smuzhiyun * 4 Management - When set, the WiLink receives all management 251*4882a593Smuzhiyun * frames. 252*4882a593Smuzhiyun * When clear, these frames are discarded. 253*4882a593Smuzhiyun * 3 Probe Request - When set, the WiLink receives all probe request 254*4882a593Smuzhiyun * frames. 255*4882a593Smuzhiyun * When clear, these frames are discarded. 256*4882a593Smuzhiyun * 2 Probe Response - When set, the WiLink receives all probe 257*4882a593Smuzhiyun * response frames. 258*4882a593Smuzhiyun * When clear, these frames are discarded. 259*4882a593Smuzhiyun * 1 RTS/CTS/ACK - When set, the WiLink receives all RTS, CTS and ACK 260*4882a593Smuzhiyun * frames. 261*4882a593Smuzhiyun * When clear, these frames are discarded. 262*4882a593Smuzhiyun * 0 Rsvd Type/Sub Type - When set, the WiLink receives all frames 263*4882a593Smuzhiyun * that have reserved frame types and sub types as defined by the 264*4882a593Smuzhiyun * 802.11 specification. 265*4882a593Smuzhiyun * When clear, these frames are discarded. 266*4882a593Smuzhiyun */ 267*4882a593Smuzhiyun struct acx_rx_config { 268*4882a593Smuzhiyun struct acx_header header; 269*4882a593Smuzhiyun 270*4882a593Smuzhiyun u32 config_options; 271*4882a593Smuzhiyun u32 filter_options; 272*4882a593Smuzhiyun } __packed; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun enum { 275*4882a593Smuzhiyun QOS_AC_BE = 0, 276*4882a593Smuzhiyun QOS_AC_BK, 277*4882a593Smuzhiyun QOS_AC_VI, 278*4882a593Smuzhiyun QOS_AC_VO, 279*4882a593Smuzhiyun QOS_HIGHEST_AC_INDEX = QOS_AC_VO, 280*4882a593Smuzhiyun }; 281*4882a593Smuzhiyun 282*4882a593Smuzhiyun #define MAX_NUM_OF_AC (QOS_HIGHEST_AC_INDEX+1) 283*4882a593Smuzhiyun #define FIRST_AC_INDEX QOS_AC_BE 284*4882a593Smuzhiyun #define MAX_NUM_OF_802_1d_TAGS 8 285*4882a593Smuzhiyun #define AC_PARAMS_MAX_TSID 15 286*4882a593Smuzhiyun #define MAX_APSD_CONF 0xffff 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun #define QOS_TX_HIGH_MIN (0) 289*4882a593Smuzhiyun #define QOS_TX_HIGH_MAX (100) 290*4882a593Smuzhiyun 291*4882a593Smuzhiyun #define QOS_TX_HIGH_BK_DEF (25) 292*4882a593Smuzhiyun #define QOS_TX_HIGH_BE_DEF (35) 293*4882a593Smuzhiyun #define QOS_TX_HIGH_VI_DEF (35) 294*4882a593Smuzhiyun #define QOS_TX_HIGH_VO_DEF (35) 295*4882a593Smuzhiyun 296*4882a593Smuzhiyun #define QOS_TX_LOW_BK_DEF (15) 297*4882a593Smuzhiyun #define QOS_TX_LOW_BE_DEF (25) 298*4882a593Smuzhiyun #define QOS_TX_LOW_VI_DEF (25) 299*4882a593Smuzhiyun #define QOS_TX_LOW_VO_DEF (25) 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun struct acx_tx_queue_qos_config { 302*4882a593Smuzhiyun struct acx_header header; 303*4882a593Smuzhiyun 304*4882a593Smuzhiyun u8 qid; 305*4882a593Smuzhiyun u8 pad[3]; 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun /* Max number of blocks allowd in the queue */ 308*4882a593Smuzhiyun u16 high_threshold; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun /* Lowest memory blocks guaranteed for this queue */ 311*4882a593Smuzhiyun u16 low_threshold; 312*4882a593Smuzhiyun } __packed; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun struct acx_packet_detection { 315*4882a593Smuzhiyun struct acx_header header; 316*4882a593Smuzhiyun 317*4882a593Smuzhiyun u32 threshold; 318*4882a593Smuzhiyun } __packed; 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun 321*4882a593Smuzhiyun enum acx_slot_type { 322*4882a593Smuzhiyun SLOT_TIME_LONG = 0, 323*4882a593Smuzhiyun SLOT_TIME_SHORT = 1, 324*4882a593Smuzhiyun DEFAULT_SLOT_TIME = SLOT_TIME_SHORT, 325*4882a593Smuzhiyun MAX_SLOT_TIMES = 0xFF 326*4882a593Smuzhiyun }; 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun #define STATION_WONE_INDEX 0 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun struct acx_slot { 331*4882a593Smuzhiyun struct acx_header header; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun u8 wone_index; /* Reserved */ 334*4882a593Smuzhiyun u8 slot_time; 335*4882a593Smuzhiyun u8 reserved[6]; 336*4882a593Smuzhiyun } __packed; 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun #define ACX_MC_ADDRESS_GROUP_MAX (8) 340*4882a593Smuzhiyun #define ACX_MC_ADDRESS_GROUP_MAX_LEN (ETH_ALEN * ACX_MC_ADDRESS_GROUP_MAX) 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun struct acx_dot11_grp_addr_tbl { 343*4882a593Smuzhiyun struct acx_header header; 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun u8 enabled; 346*4882a593Smuzhiyun u8 num_groups; 347*4882a593Smuzhiyun u8 pad[2]; 348*4882a593Smuzhiyun u8 mac_table[ACX_MC_ADDRESS_GROUP_MAX_LEN]; 349*4882a593Smuzhiyun } __packed; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun 352*4882a593Smuzhiyun #define RX_TIMEOUT_PS_POLL_MIN 0 353*4882a593Smuzhiyun #define RX_TIMEOUT_PS_POLL_MAX (200000) 354*4882a593Smuzhiyun #define RX_TIMEOUT_PS_POLL_DEF (15) 355*4882a593Smuzhiyun #define RX_TIMEOUT_UPSD_MIN 0 356*4882a593Smuzhiyun #define RX_TIMEOUT_UPSD_MAX (200000) 357*4882a593Smuzhiyun #define RX_TIMEOUT_UPSD_DEF (15) 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun struct acx_rx_timeout { 360*4882a593Smuzhiyun struct acx_header header; 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* 363*4882a593Smuzhiyun * The longest time the STA will wait to receive 364*4882a593Smuzhiyun * traffic from the AP after a PS-poll has been 365*4882a593Smuzhiyun * transmitted. 366*4882a593Smuzhiyun */ 367*4882a593Smuzhiyun u16 ps_poll_timeout; 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun /* 370*4882a593Smuzhiyun * The longest time the STA will wait to receive 371*4882a593Smuzhiyun * traffic from the AP after a frame has been sent 372*4882a593Smuzhiyun * from an UPSD enabled queue. 373*4882a593Smuzhiyun */ 374*4882a593Smuzhiyun u16 upsd_timeout; 375*4882a593Smuzhiyun } __packed; 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun #define RTS_THRESHOLD_MIN 0 378*4882a593Smuzhiyun #define RTS_THRESHOLD_MAX 4096 379*4882a593Smuzhiyun #define RTS_THRESHOLD_DEF 2347 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun struct acx_rts_threshold { 382*4882a593Smuzhiyun struct acx_header header; 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun u16 threshold; 385*4882a593Smuzhiyun u8 pad[2]; 386*4882a593Smuzhiyun } __packed; 387*4882a593Smuzhiyun 388*4882a593Smuzhiyun enum wl1251_acx_low_rssi_type { 389*4882a593Smuzhiyun /* 390*4882a593Smuzhiyun * The event is a "Level" indication which keeps triggering 391*4882a593Smuzhiyun * as long as the average RSSI is below the threshold. 392*4882a593Smuzhiyun */ 393*4882a593Smuzhiyun WL1251_ACX_LOW_RSSI_TYPE_LEVEL = 0, 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun /* 396*4882a593Smuzhiyun * The event is an "Edge" indication which triggers 397*4882a593Smuzhiyun * only when the RSSI threshold is crossed from above. 398*4882a593Smuzhiyun */ 399*4882a593Smuzhiyun WL1251_ACX_LOW_RSSI_TYPE_EDGE = 1, 400*4882a593Smuzhiyun }; 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun struct acx_low_rssi { 403*4882a593Smuzhiyun struct acx_header header; 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun /* 406*4882a593Smuzhiyun * The threshold (in dBm) below (or above after low rssi 407*4882a593Smuzhiyun * indication) which the firmware generates an interrupt to the 408*4882a593Smuzhiyun * host. This parameter is signed. 409*4882a593Smuzhiyun */ 410*4882a593Smuzhiyun s8 threshold; 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun /* 413*4882a593Smuzhiyun * The weight of the current RSSI sample, before adding the new 414*4882a593Smuzhiyun * sample, that is used to calculate the average RSSI. 415*4882a593Smuzhiyun */ 416*4882a593Smuzhiyun u8 weight; 417*4882a593Smuzhiyun 418*4882a593Smuzhiyun /* 419*4882a593Smuzhiyun * The number of Beacons/Probe response frames that will be 420*4882a593Smuzhiyun * received before issuing the Low or Regained RSSI event. 421*4882a593Smuzhiyun */ 422*4882a593Smuzhiyun u8 depth; 423*4882a593Smuzhiyun 424*4882a593Smuzhiyun /* 425*4882a593Smuzhiyun * Configures how the Low RSSI Event is triggered. Refer to 426*4882a593Smuzhiyun * enum wl1251_acx_low_rssi_type for more. 427*4882a593Smuzhiyun */ 428*4882a593Smuzhiyun u8 type; 429*4882a593Smuzhiyun } __packed; 430*4882a593Smuzhiyun 431*4882a593Smuzhiyun struct acx_beacon_filter_option { 432*4882a593Smuzhiyun struct acx_header header; 433*4882a593Smuzhiyun 434*4882a593Smuzhiyun u8 enable; 435*4882a593Smuzhiyun 436*4882a593Smuzhiyun /* 437*4882a593Smuzhiyun * The number of beacons without the unicast TIM 438*4882a593Smuzhiyun * bit set that the firmware buffers before 439*4882a593Smuzhiyun * signaling the host about ready frames. 440*4882a593Smuzhiyun * When set to 0 and the filter is enabled, beacons 441*4882a593Smuzhiyun * without the unicast TIM bit set are dropped. 442*4882a593Smuzhiyun */ 443*4882a593Smuzhiyun u8 max_num_beacons; 444*4882a593Smuzhiyun u8 pad[2]; 445*4882a593Smuzhiyun } __packed; 446*4882a593Smuzhiyun 447*4882a593Smuzhiyun /* 448*4882a593Smuzhiyun * ACXBeaconFilterEntry (not 221) 449*4882a593Smuzhiyun * Byte Offset Size (Bytes) Definition 450*4882a593Smuzhiyun * =========== ============ ========== 451*4882a593Smuzhiyun * 0 1 IE identifier 452*4882a593Smuzhiyun * 1 1 Treatment bit mask 453*4882a593Smuzhiyun * 454*4882a593Smuzhiyun * ACXBeaconFilterEntry (221) 455*4882a593Smuzhiyun * Byte Offset Size (Bytes) Definition 456*4882a593Smuzhiyun * =========== ============ ========== 457*4882a593Smuzhiyun * 0 1 IE identifier 458*4882a593Smuzhiyun * 1 1 Treatment bit mask 459*4882a593Smuzhiyun * 2 3 OUI 460*4882a593Smuzhiyun * 5 1 Type 461*4882a593Smuzhiyun * 6 2 Version 462*4882a593Smuzhiyun * 463*4882a593Smuzhiyun * 464*4882a593Smuzhiyun * Treatment bit mask - The information element handling: 465*4882a593Smuzhiyun * bit 0 - The information element is compared and transferred 466*4882a593Smuzhiyun * in case of change. 467*4882a593Smuzhiyun * bit 1 - The information element is transferred to the host 468*4882a593Smuzhiyun * with each appearance or disappearance. 469*4882a593Smuzhiyun * Note that both bits can be set at the same time. 470*4882a593Smuzhiyun */ 471*4882a593Smuzhiyun #define BEACON_FILTER_TABLE_MAX_IE_NUM (32) 472*4882a593Smuzhiyun #define BEACON_FILTER_TABLE_MAX_VENDOR_SPECIFIC_IE_NUM (6) 473*4882a593Smuzhiyun #define BEACON_FILTER_TABLE_IE_ENTRY_SIZE (2) 474*4882a593Smuzhiyun #define BEACON_FILTER_TABLE_EXTRA_VENDOR_SPECIFIC_IE_SIZE (6) 475*4882a593Smuzhiyun #define BEACON_FILTER_TABLE_MAX_SIZE ((BEACON_FILTER_TABLE_MAX_IE_NUM * \ 476*4882a593Smuzhiyun BEACON_FILTER_TABLE_IE_ENTRY_SIZE) + \ 477*4882a593Smuzhiyun (BEACON_FILTER_TABLE_MAX_VENDOR_SPECIFIC_IE_NUM * \ 478*4882a593Smuzhiyun BEACON_FILTER_TABLE_EXTRA_VENDOR_SPECIFIC_IE_SIZE)) 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun #define BEACON_RULE_PASS_ON_CHANGE BIT(0) 481*4882a593Smuzhiyun #define BEACON_RULE_PASS_ON_APPEARANCE BIT(1) 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun #define BEACON_FILTER_IE_ID_CHANNEL_SWITCH_ANN (37) 484*4882a593Smuzhiyun 485*4882a593Smuzhiyun struct acx_beacon_filter_ie_table { 486*4882a593Smuzhiyun struct acx_header header; 487*4882a593Smuzhiyun 488*4882a593Smuzhiyun u8 num_ie; 489*4882a593Smuzhiyun u8 pad[3]; 490*4882a593Smuzhiyun u8 table[BEACON_FILTER_TABLE_MAX_SIZE]; 491*4882a593Smuzhiyun } __packed; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun #define SYNCH_FAIL_DEFAULT_THRESHOLD 10 /* number of beacons */ 494*4882a593Smuzhiyun #define NO_BEACON_DEFAULT_TIMEOUT (500) /* in microseconds */ 495*4882a593Smuzhiyun 496*4882a593Smuzhiyun struct acx_conn_monit_params { 497*4882a593Smuzhiyun struct acx_header header; 498*4882a593Smuzhiyun 499*4882a593Smuzhiyun u32 synch_fail_thold; /* number of beacons missed */ 500*4882a593Smuzhiyun u32 bss_lose_timeout; /* number of TU's from synch fail */ 501*4882a593Smuzhiyun } __packed; 502*4882a593Smuzhiyun 503*4882a593Smuzhiyun enum { 504*4882a593Smuzhiyun SG_ENABLE = 0, 505*4882a593Smuzhiyun SG_DISABLE, 506*4882a593Smuzhiyun SG_SENSE_NO_ACTIVITY, 507*4882a593Smuzhiyun SG_SENSE_ACTIVE 508*4882a593Smuzhiyun }; 509*4882a593Smuzhiyun 510*4882a593Smuzhiyun struct acx_bt_wlan_coex { 511*4882a593Smuzhiyun struct acx_header header; 512*4882a593Smuzhiyun 513*4882a593Smuzhiyun /* 514*4882a593Smuzhiyun * 0 -> PTA enabled 515*4882a593Smuzhiyun * 1 -> PTA disabled 516*4882a593Smuzhiyun * 2 -> sense no active mode, i.e. 517*4882a593Smuzhiyun * an interrupt is sent upon 518*4882a593Smuzhiyun * BT activity. 519*4882a593Smuzhiyun * 3 -> PTA is switched on in response 520*4882a593Smuzhiyun * to the interrupt sending. 521*4882a593Smuzhiyun */ 522*4882a593Smuzhiyun u8 enable; 523*4882a593Smuzhiyun u8 pad[3]; 524*4882a593Smuzhiyun } __packed; 525*4882a593Smuzhiyun 526*4882a593Smuzhiyun #define PTA_ANTENNA_TYPE_DEF (0) 527*4882a593Smuzhiyun #define PTA_BT_HP_MAXTIME_DEF (2000) 528*4882a593Smuzhiyun #define PTA_WLAN_HP_MAX_TIME_DEF (5000) 529*4882a593Smuzhiyun #define PTA_SENSE_DISABLE_TIMER_DEF (1350) 530*4882a593Smuzhiyun #define PTA_PROTECTIVE_RX_TIME_DEF (1500) 531*4882a593Smuzhiyun #define PTA_PROTECTIVE_TX_TIME_DEF (1500) 532*4882a593Smuzhiyun #define PTA_TIMEOUT_NEXT_BT_LP_PACKET_DEF (3000) 533*4882a593Smuzhiyun #define PTA_SIGNALING_TYPE_DEF (1) 534*4882a593Smuzhiyun #define PTA_AFH_LEVERAGE_ON_DEF (0) 535*4882a593Smuzhiyun #define PTA_NUMBER_QUIET_CYCLE_DEF (0) 536*4882a593Smuzhiyun #define PTA_MAX_NUM_CTS_DEF (3) 537*4882a593Smuzhiyun #define PTA_NUMBER_OF_WLAN_PACKETS_DEF (2) 538*4882a593Smuzhiyun #define PTA_NUMBER_OF_BT_PACKETS_DEF (2) 539*4882a593Smuzhiyun #define PTA_PROTECTIVE_RX_TIME_FAST_DEF (1500) 540*4882a593Smuzhiyun #define PTA_PROTECTIVE_TX_TIME_FAST_DEF (3000) 541*4882a593Smuzhiyun #define PTA_CYCLE_TIME_FAST_DEF (8700) 542*4882a593Smuzhiyun #define PTA_RX_FOR_AVALANCHE_DEF (5) 543*4882a593Smuzhiyun #define PTA_ELP_HP_DEF (0) 544*4882a593Smuzhiyun #define PTA_ANTI_STARVE_PERIOD_DEF (500) 545*4882a593Smuzhiyun #define PTA_ANTI_STARVE_NUM_CYCLE_DEF (4) 546*4882a593Smuzhiyun #define PTA_ALLOW_PA_SD_DEF (1) 547*4882a593Smuzhiyun #define PTA_TIME_BEFORE_BEACON_DEF (6300) 548*4882a593Smuzhiyun #define PTA_HPDM_MAX_TIME_DEF (1600) 549*4882a593Smuzhiyun #define PTA_TIME_OUT_NEXT_WLAN_DEF (2550) 550*4882a593Smuzhiyun #define PTA_AUTO_MODE_NO_CTS_DEF (0) 551*4882a593Smuzhiyun #define PTA_BT_HP_RESPECTED_DEF (3) 552*4882a593Smuzhiyun #define PTA_WLAN_RX_MIN_RATE_DEF (24) 553*4882a593Smuzhiyun #define PTA_ACK_MODE_DEF (1) 554*4882a593Smuzhiyun 555*4882a593Smuzhiyun struct acx_bt_wlan_coex_param { 556*4882a593Smuzhiyun struct acx_header header; 557*4882a593Smuzhiyun 558*4882a593Smuzhiyun /* 559*4882a593Smuzhiyun * The minimum rate of a received WLAN packet in the STA, 560*4882a593Smuzhiyun * during protective mode, of which a new BT-HP request 561*4882a593Smuzhiyun * during this Rx will always be respected and gain the antenna. 562*4882a593Smuzhiyun */ 563*4882a593Smuzhiyun u32 min_rate; 564*4882a593Smuzhiyun 565*4882a593Smuzhiyun /* Max time the BT HP will be respected. */ 566*4882a593Smuzhiyun u16 bt_hp_max_time; 567*4882a593Smuzhiyun 568*4882a593Smuzhiyun /* Max time the WLAN HP will be respected. */ 569*4882a593Smuzhiyun u16 wlan_hp_max_time; 570*4882a593Smuzhiyun 571*4882a593Smuzhiyun /* 572*4882a593Smuzhiyun * The time between the last BT activity 573*4882a593Smuzhiyun * and the moment when the sense mode returns 574*4882a593Smuzhiyun * to SENSE_INACTIVE. 575*4882a593Smuzhiyun */ 576*4882a593Smuzhiyun u16 sense_disable_timer; 577*4882a593Smuzhiyun 578*4882a593Smuzhiyun /* Time before the next BT HP instance */ 579*4882a593Smuzhiyun u16 rx_time_bt_hp; 580*4882a593Smuzhiyun u16 tx_time_bt_hp; 581*4882a593Smuzhiyun 582*4882a593Smuzhiyun /* range: 10-20000 default: 1500 */ 583*4882a593Smuzhiyun u16 rx_time_bt_hp_fast; 584*4882a593Smuzhiyun u16 tx_time_bt_hp_fast; 585*4882a593Smuzhiyun 586*4882a593Smuzhiyun /* range: 2000-65535 default: 8700 */ 587*4882a593Smuzhiyun u16 wlan_cycle_fast; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun /* range: 0 - 15000 (Msec) default: 1000 */ 590*4882a593Smuzhiyun u16 bt_anti_starvation_period; 591*4882a593Smuzhiyun 592*4882a593Smuzhiyun /* range 400-10000(Usec) default: 3000 */ 593*4882a593Smuzhiyun u16 next_bt_lp_packet; 594*4882a593Smuzhiyun 595*4882a593Smuzhiyun /* Deafult: worst case for BT DH5 traffic */ 596*4882a593Smuzhiyun u16 wake_up_beacon; 597*4882a593Smuzhiyun 598*4882a593Smuzhiyun /* range: 0-50000(Usec) default: 1050 */ 599*4882a593Smuzhiyun u16 hp_dm_max_guard_time; 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun /* 602*4882a593Smuzhiyun * This is to prevent both BT & WLAN antenna 603*4882a593Smuzhiyun * starvation. 604*4882a593Smuzhiyun * Range: 100-50000(Usec) default:2550 605*4882a593Smuzhiyun */ 606*4882a593Smuzhiyun u16 next_wlan_packet; 607*4882a593Smuzhiyun 608*4882a593Smuzhiyun /* 0 -> shared antenna */ 609*4882a593Smuzhiyun u8 antenna_type; 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun /* 612*4882a593Smuzhiyun * 0 -> TI legacy 613*4882a593Smuzhiyun * 1 -> Palau 614*4882a593Smuzhiyun */ 615*4882a593Smuzhiyun u8 signal_type; 616*4882a593Smuzhiyun 617*4882a593Smuzhiyun /* 618*4882a593Smuzhiyun * BT AFH status 619*4882a593Smuzhiyun * 0 -> no AFH 620*4882a593Smuzhiyun * 1 -> from dedicated GPIO 621*4882a593Smuzhiyun * 2 -> AFH on (from host) 622*4882a593Smuzhiyun */ 623*4882a593Smuzhiyun u8 afh_leverage_on; 624*4882a593Smuzhiyun 625*4882a593Smuzhiyun /* 626*4882a593Smuzhiyun * The number of cycles during which no 627*4882a593Smuzhiyun * TX will be sent after 1 cycle of RX 628*4882a593Smuzhiyun * transaction in protective mode 629*4882a593Smuzhiyun */ 630*4882a593Smuzhiyun u8 quiet_cycle_num; 631*4882a593Smuzhiyun 632*4882a593Smuzhiyun /* 633*4882a593Smuzhiyun * The maximum number of CTSs that will 634*4882a593Smuzhiyun * be sent for receiving RX packet in 635*4882a593Smuzhiyun * protective mode 636*4882a593Smuzhiyun */ 637*4882a593Smuzhiyun u8 max_cts; 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun /* 640*4882a593Smuzhiyun * The number of WLAN packets 641*4882a593Smuzhiyun * transferred in common mode before 642*4882a593Smuzhiyun * switching to BT. 643*4882a593Smuzhiyun */ 644*4882a593Smuzhiyun u8 wlan_packets_num; 645*4882a593Smuzhiyun 646*4882a593Smuzhiyun /* 647*4882a593Smuzhiyun * The number of BT packets 648*4882a593Smuzhiyun * transferred in common mode before 649*4882a593Smuzhiyun * switching to WLAN. 650*4882a593Smuzhiyun */ 651*4882a593Smuzhiyun u8 bt_packets_num; 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun /* range: 1-255 default: 5 */ 654*4882a593Smuzhiyun u8 missed_rx_avalanche; 655*4882a593Smuzhiyun 656*4882a593Smuzhiyun /* range: 0-1 default: 1 */ 657*4882a593Smuzhiyun u8 wlan_elp_hp; 658*4882a593Smuzhiyun 659*4882a593Smuzhiyun /* range: 0 - 15 default: 4 */ 660*4882a593Smuzhiyun u8 bt_anti_starvation_cycles; 661*4882a593Smuzhiyun 662*4882a593Smuzhiyun u8 ack_mode_dual_ant; 663*4882a593Smuzhiyun 664*4882a593Smuzhiyun /* 665*4882a593Smuzhiyun * Allow PA_SD assertion/de-assertion 666*4882a593Smuzhiyun * during enabled BT activity. 667*4882a593Smuzhiyun */ 668*4882a593Smuzhiyun u8 pa_sd_enable; 669*4882a593Smuzhiyun 670*4882a593Smuzhiyun /* 671*4882a593Smuzhiyun * Enable/Disable PTA in auto mode: 672*4882a593Smuzhiyun * Support Both Active & P.S modes 673*4882a593Smuzhiyun */ 674*4882a593Smuzhiyun u8 pta_auto_mode_enable; 675*4882a593Smuzhiyun 676*4882a593Smuzhiyun /* range: 0 - 20 default: 1 */ 677*4882a593Smuzhiyun u8 bt_hp_respected_num; 678*4882a593Smuzhiyun } __packed; 679*4882a593Smuzhiyun 680*4882a593Smuzhiyun #define CCA_THRSH_ENABLE_ENERGY_D 0x140A 681*4882a593Smuzhiyun #define CCA_THRSH_DISABLE_ENERGY_D 0xFFEF 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun struct acx_energy_detection { 684*4882a593Smuzhiyun struct acx_header header; 685*4882a593Smuzhiyun 686*4882a593Smuzhiyun /* The RX Clear Channel Assessment threshold in the PHY */ 687*4882a593Smuzhiyun u16 rx_cca_threshold; 688*4882a593Smuzhiyun u8 tx_energy_detection; 689*4882a593Smuzhiyun u8 pad; 690*4882a593Smuzhiyun } __packed; 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun #define BCN_RX_TIMEOUT_DEF_VALUE 10000 693*4882a593Smuzhiyun #define BROADCAST_RX_TIMEOUT_DEF_VALUE 20000 694*4882a593Smuzhiyun #define RX_BROADCAST_IN_PS_DEF_VALUE 1 695*4882a593Smuzhiyun #define CONSECUTIVE_PS_POLL_FAILURE_DEF 4 696*4882a593Smuzhiyun 697*4882a593Smuzhiyun struct acx_beacon_broadcast { 698*4882a593Smuzhiyun struct acx_header header; 699*4882a593Smuzhiyun 700*4882a593Smuzhiyun u16 beacon_rx_timeout; 701*4882a593Smuzhiyun u16 broadcast_timeout; 702*4882a593Smuzhiyun 703*4882a593Smuzhiyun /* Enables receiving of broadcast packets in PS mode */ 704*4882a593Smuzhiyun u8 rx_broadcast_in_ps; 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun /* Consecutive PS Poll failures before updating the host */ 707*4882a593Smuzhiyun u8 ps_poll_threshold; 708*4882a593Smuzhiyun u8 pad[2]; 709*4882a593Smuzhiyun } __packed; 710*4882a593Smuzhiyun 711*4882a593Smuzhiyun struct acx_event_mask { 712*4882a593Smuzhiyun struct acx_header header; 713*4882a593Smuzhiyun 714*4882a593Smuzhiyun u32 event_mask; 715*4882a593Smuzhiyun u32 high_event_mask; /* Unused */ 716*4882a593Smuzhiyun } __packed; 717*4882a593Smuzhiyun 718*4882a593Smuzhiyun #define CFG_RX_FCS BIT(2) 719*4882a593Smuzhiyun #define CFG_RX_ALL_GOOD BIT(3) 720*4882a593Smuzhiyun #define CFG_UNI_FILTER_EN BIT(4) 721*4882a593Smuzhiyun #define CFG_BSSID_FILTER_EN BIT(5) 722*4882a593Smuzhiyun #define CFG_MC_FILTER_EN BIT(6) 723*4882a593Smuzhiyun #define CFG_MC_ADDR0_EN BIT(7) 724*4882a593Smuzhiyun #define CFG_MC_ADDR1_EN BIT(8) 725*4882a593Smuzhiyun #define CFG_BC_REJECT_EN BIT(9) 726*4882a593Smuzhiyun #define CFG_SSID_FILTER_EN BIT(10) 727*4882a593Smuzhiyun #define CFG_RX_INT_FCS_ERROR BIT(11) 728*4882a593Smuzhiyun #define CFG_RX_INT_ENCRYPTED BIT(12) 729*4882a593Smuzhiyun #define CFG_RX_WR_RX_STATUS BIT(13) 730*4882a593Smuzhiyun #define CFG_RX_FILTER_NULTI BIT(14) 731*4882a593Smuzhiyun #define CFG_RX_RESERVE BIT(15) 732*4882a593Smuzhiyun #define CFG_RX_TIMESTAMP_TSF BIT(16) 733*4882a593Smuzhiyun 734*4882a593Smuzhiyun #define CFG_RX_RSV_EN BIT(0) 735*4882a593Smuzhiyun #define CFG_RX_RCTS_ACK BIT(1) 736*4882a593Smuzhiyun #define CFG_RX_PRSP_EN BIT(2) 737*4882a593Smuzhiyun #define CFG_RX_PREQ_EN BIT(3) 738*4882a593Smuzhiyun #define CFG_RX_MGMT_EN BIT(4) 739*4882a593Smuzhiyun #define CFG_RX_FCS_ERROR BIT(5) 740*4882a593Smuzhiyun #define CFG_RX_DATA_EN BIT(6) 741*4882a593Smuzhiyun #define CFG_RX_CTL_EN BIT(7) 742*4882a593Smuzhiyun #define CFG_RX_CF_EN BIT(8) 743*4882a593Smuzhiyun #define CFG_RX_BCN_EN BIT(9) 744*4882a593Smuzhiyun #define CFG_RX_AUTH_EN BIT(10) 745*4882a593Smuzhiyun #define CFG_RX_ASSOC_EN BIT(11) 746*4882a593Smuzhiyun 747*4882a593Smuzhiyun #define SCAN_PASSIVE BIT(0) 748*4882a593Smuzhiyun #define SCAN_5GHZ_BAND BIT(1) 749*4882a593Smuzhiyun #define SCAN_TRIGGERED BIT(2) 750*4882a593Smuzhiyun #define SCAN_PRIORITY_HIGH BIT(3) 751*4882a593Smuzhiyun 752*4882a593Smuzhiyun struct acx_fw_gen_frame_rates { 753*4882a593Smuzhiyun struct acx_header header; 754*4882a593Smuzhiyun 755*4882a593Smuzhiyun u8 tx_ctrl_frame_rate; /* RATE_* */ 756*4882a593Smuzhiyun u8 tx_ctrl_frame_mod; /* CCK_* or PBCC_* */ 757*4882a593Smuzhiyun u8 tx_mgt_frame_rate; 758*4882a593Smuzhiyun u8 tx_mgt_frame_mod; 759*4882a593Smuzhiyun } __packed; 760*4882a593Smuzhiyun 761*4882a593Smuzhiyun /* STA MAC */ 762*4882a593Smuzhiyun struct acx_dot11_station_id { 763*4882a593Smuzhiyun struct acx_header header; 764*4882a593Smuzhiyun 765*4882a593Smuzhiyun u8 mac[ETH_ALEN]; 766*4882a593Smuzhiyun u8 pad[2]; 767*4882a593Smuzhiyun } __packed; 768*4882a593Smuzhiyun 769*4882a593Smuzhiyun struct acx_feature_config { 770*4882a593Smuzhiyun struct acx_header header; 771*4882a593Smuzhiyun 772*4882a593Smuzhiyun u32 options; 773*4882a593Smuzhiyun u32 data_flow_options; 774*4882a593Smuzhiyun } __packed; 775*4882a593Smuzhiyun 776*4882a593Smuzhiyun struct acx_current_tx_power { 777*4882a593Smuzhiyun struct acx_header header; 778*4882a593Smuzhiyun 779*4882a593Smuzhiyun u8 current_tx_power; 780*4882a593Smuzhiyun u8 padding[3]; 781*4882a593Smuzhiyun } __packed; 782*4882a593Smuzhiyun 783*4882a593Smuzhiyun struct acx_dot11_default_key { 784*4882a593Smuzhiyun struct acx_header header; 785*4882a593Smuzhiyun 786*4882a593Smuzhiyun u8 id; 787*4882a593Smuzhiyun u8 pad[3]; 788*4882a593Smuzhiyun } __packed; 789*4882a593Smuzhiyun 790*4882a593Smuzhiyun struct acx_tsf_info { 791*4882a593Smuzhiyun struct acx_header header; 792*4882a593Smuzhiyun 793*4882a593Smuzhiyun u32 current_tsf_msb; 794*4882a593Smuzhiyun u32 current_tsf_lsb; 795*4882a593Smuzhiyun u32 last_TBTT_msb; 796*4882a593Smuzhiyun u32 last_TBTT_lsb; 797*4882a593Smuzhiyun u8 last_dtim_count; 798*4882a593Smuzhiyun u8 pad[3]; 799*4882a593Smuzhiyun } __packed; 800*4882a593Smuzhiyun 801*4882a593Smuzhiyun enum acx_wake_up_event { 802*4882a593Smuzhiyun WAKE_UP_EVENT_BEACON_BITMAP = 0x01, /* Wake on every Beacon*/ 803*4882a593Smuzhiyun WAKE_UP_EVENT_DTIM_BITMAP = 0x02, /* Wake on every DTIM*/ 804*4882a593Smuzhiyun WAKE_UP_EVENT_N_DTIM_BITMAP = 0x04, /* Wake on every Nth DTIM */ 805*4882a593Smuzhiyun WAKE_UP_EVENT_N_BEACONS_BITMAP = 0x08, /* Wake on every Nth Beacon */ 806*4882a593Smuzhiyun WAKE_UP_EVENT_BITS_MASK = 0x0F 807*4882a593Smuzhiyun }; 808*4882a593Smuzhiyun 809*4882a593Smuzhiyun struct acx_wake_up_condition { 810*4882a593Smuzhiyun struct acx_header header; 811*4882a593Smuzhiyun 812*4882a593Smuzhiyun u8 wake_up_event; /* Only one bit can be set */ 813*4882a593Smuzhiyun u8 listen_interval; 814*4882a593Smuzhiyun u8 pad[2]; 815*4882a593Smuzhiyun } __packed; 816*4882a593Smuzhiyun 817*4882a593Smuzhiyun struct acx_aid { 818*4882a593Smuzhiyun struct acx_header header; 819*4882a593Smuzhiyun 820*4882a593Smuzhiyun /* 821*4882a593Smuzhiyun * To be set when associated with an AP. 822*4882a593Smuzhiyun */ 823*4882a593Smuzhiyun u16 aid; 824*4882a593Smuzhiyun u8 pad[2]; 825*4882a593Smuzhiyun } __packed; 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun enum acx_preamble_type { 828*4882a593Smuzhiyun ACX_PREAMBLE_LONG = 0, 829*4882a593Smuzhiyun ACX_PREAMBLE_SHORT = 1 830*4882a593Smuzhiyun }; 831*4882a593Smuzhiyun 832*4882a593Smuzhiyun struct acx_preamble { 833*4882a593Smuzhiyun struct acx_header header; 834*4882a593Smuzhiyun 835*4882a593Smuzhiyun /* 836*4882a593Smuzhiyun * When set, the WiLink transmits the frames with a short preamble and 837*4882a593Smuzhiyun * when cleared, the WiLink transmits the frames with a long preamble. 838*4882a593Smuzhiyun */ 839*4882a593Smuzhiyun u8 preamble; 840*4882a593Smuzhiyun u8 padding[3]; 841*4882a593Smuzhiyun } __packed; 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun enum acx_ctsprotect_type { 844*4882a593Smuzhiyun CTSPROTECT_DISABLE = 0, 845*4882a593Smuzhiyun CTSPROTECT_ENABLE = 1 846*4882a593Smuzhiyun }; 847*4882a593Smuzhiyun 848*4882a593Smuzhiyun struct acx_ctsprotect { 849*4882a593Smuzhiyun struct acx_header header; 850*4882a593Smuzhiyun u8 ctsprotect; 851*4882a593Smuzhiyun u8 padding[3]; 852*4882a593Smuzhiyun } __packed; 853*4882a593Smuzhiyun 854*4882a593Smuzhiyun struct acx_tx_statistics { 855*4882a593Smuzhiyun u32 internal_desc_overflow; 856*4882a593Smuzhiyun } __packed; 857*4882a593Smuzhiyun 858*4882a593Smuzhiyun struct acx_rx_statistics { 859*4882a593Smuzhiyun u32 out_of_mem; 860*4882a593Smuzhiyun u32 hdr_overflow; 861*4882a593Smuzhiyun u32 hw_stuck; 862*4882a593Smuzhiyun u32 dropped; 863*4882a593Smuzhiyun u32 fcs_err; 864*4882a593Smuzhiyun u32 xfr_hint_trig; 865*4882a593Smuzhiyun u32 path_reset; 866*4882a593Smuzhiyun u32 reset_counter; 867*4882a593Smuzhiyun } __packed; 868*4882a593Smuzhiyun 869*4882a593Smuzhiyun struct acx_dma_statistics { 870*4882a593Smuzhiyun u32 rx_requested; 871*4882a593Smuzhiyun u32 rx_errors; 872*4882a593Smuzhiyun u32 tx_requested; 873*4882a593Smuzhiyun u32 tx_errors; 874*4882a593Smuzhiyun } __packed; 875*4882a593Smuzhiyun 876*4882a593Smuzhiyun struct acx_isr_statistics { 877*4882a593Smuzhiyun /* host command complete */ 878*4882a593Smuzhiyun u32 cmd_cmplt; 879*4882a593Smuzhiyun 880*4882a593Smuzhiyun /* fiqisr() */ 881*4882a593Smuzhiyun u32 fiqs; 882*4882a593Smuzhiyun 883*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_RX_HEADER) */ 884*4882a593Smuzhiyun u32 rx_headers; 885*4882a593Smuzhiyun 886*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_RX_CMPLT) */ 887*4882a593Smuzhiyun u32 rx_completes; 888*4882a593Smuzhiyun 889*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_NO_RX_BUF) */ 890*4882a593Smuzhiyun u32 rx_mem_overflow; 891*4882a593Smuzhiyun 892*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_S_RX_RDY) */ 893*4882a593Smuzhiyun u32 rx_rdys; 894*4882a593Smuzhiyun 895*4882a593Smuzhiyun /* irqisr() */ 896*4882a593Smuzhiyun u32 irqs; 897*4882a593Smuzhiyun 898*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_TX_PROC) */ 899*4882a593Smuzhiyun u32 tx_procs; 900*4882a593Smuzhiyun 901*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_DECRYPT_DONE) */ 902*4882a593Smuzhiyun u32 decrypt_done; 903*4882a593Smuzhiyun 904*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_DMA0) */ 905*4882a593Smuzhiyun u32 dma0_done; 906*4882a593Smuzhiyun 907*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_DMA1) */ 908*4882a593Smuzhiyun u32 dma1_done; 909*4882a593Smuzhiyun 910*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_TX_EXC_CMPLT) */ 911*4882a593Smuzhiyun u32 tx_exch_complete; 912*4882a593Smuzhiyun 913*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_COMMAND) */ 914*4882a593Smuzhiyun u32 commands; 915*4882a593Smuzhiyun 916*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_RX_PROC) */ 917*4882a593Smuzhiyun u32 rx_procs; 918*4882a593Smuzhiyun 919*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_PM_802) */ 920*4882a593Smuzhiyun u32 hw_pm_mode_changes; 921*4882a593Smuzhiyun 922*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_ACKNOWLEDGE) */ 923*4882a593Smuzhiyun u32 host_acknowledges; 924*4882a593Smuzhiyun 925*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_PM_PCI) */ 926*4882a593Smuzhiyun u32 pci_pm; 927*4882a593Smuzhiyun 928*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_ACM_WAKEUP) */ 929*4882a593Smuzhiyun u32 wakeups; 930*4882a593Smuzhiyun 931*4882a593Smuzhiyun /* (INT_STS_ND & INT_TRIG_LOW_RSSI) */ 932*4882a593Smuzhiyun u32 low_rssi; 933*4882a593Smuzhiyun } __packed; 934*4882a593Smuzhiyun 935*4882a593Smuzhiyun struct acx_wep_statistics { 936*4882a593Smuzhiyun /* WEP address keys configured */ 937*4882a593Smuzhiyun u32 addr_key_count; 938*4882a593Smuzhiyun 939*4882a593Smuzhiyun /* default keys configured */ 940*4882a593Smuzhiyun u32 default_key_count; 941*4882a593Smuzhiyun 942*4882a593Smuzhiyun u32 reserved; 943*4882a593Smuzhiyun 944*4882a593Smuzhiyun /* number of times that WEP key not found on lookup */ 945*4882a593Smuzhiyun u32 key_not_found; 946*4882a593Smuzhiyun 947*4882a593Smuzhiyun /* number of times that WEP key decryption failed */ 948*4882a593Smuzhiyun u32 decrypt_fail; 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun /* WEP packets decrypted */ 951*4882a593Smuzhiyun u32 packets; 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun /* WEP decrypt interrupts */ 954*4882a593Smuzhiyun u32 interrupt; 955*4882a593Smuzhiyun } __packed; 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun #define ACX_MISSED_BEACONS_SPREAD 10 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun struct acx_pwr_statistics { 960*4882a593Smuzhiyun /* the amount of enters into power save mode (both PD & ELP) */ 961*4882a593Smuzhiyun u32 ps_enter; 962*4882a593Smuzhiyun 963*4882a593Smuzhiyun /* the amount of enters into ELP mode */ 964*4882a593Smuzhiyun u32 elp_enter; 965*4882a593Smuzhiyun 966*4882a593Smuzhiyun /* the amount of missing beacon interrupts to the host */ 967*4882a593Smuzhiyun u32 missing_bcns; 968*4882a593Smuzhiyun 969*4882a593Smuzhiyun /* the amount of wake on host-access times */ 970*4882a593Smuzhiyun u32 wake_on_host; 971*4882a593Smuzhiyun 972*4882a593Smuzhiyun /* the amount of wake on timer-expire */ 973*4882a593Smuzhiyun u32 wake_on_timer_exp; 974*4882a593Smuzhiyun 975*4882a593Smuzhiyun /* the number of packets that were transmitted with PS bit set */ 976*4882a593Smuzhiyun u32 tx_with_ps; 977*4882a593Smuzhiyun 978*4882a593Smuzhiyun /* the number of packets that were transmitted with PS bit clear */ 979*4882a593Smuzhiyun u32 tx_without_ps; 980*4882a593Smuzhiyun 981*4882a593Smuzhiyun /* the number of received beacons */ 982*4882a593Smuzhiyun u32 rcvd_beacons; 983*4882a593Smuzhiyun 984*4882a593Smuzhiyun /* the number of entering into PowerOn (power save off) */ 985*4882a593Smuzhiyun u32 power_save_off; 986*4882a593Smuzhiyun 987*4882a593Smuzhiyun /* the number of entries into power save mode */ 988*4882a593Smuzhiyun u16 enable_ps; 989*4882a593Smuzhiyun 990*4882a593Smuzhiyun /* 991*4882a593Smuzhiyun * the number of exits from power save, not including failed PS 992*4882a593Smuzhiyun * transitions 993*4882a593Smuzhiyun */ 994*4882a593Smuzhiyun u16 disable_ps; 995*4882a593Smuzhiyun 996*4882a593Smuzhiyun /* 997*4882a593Smuzhiyun * the number of times the TSF counter was adjusted because 998*4882a593Smuzhiyun * of drift 999*4882a593Smuzhiyun */ 1000*4882a593Smuzhiyun u32 fix_tsf_ps; 1001*4882a593Smuzhiyun 1002*4882a593Smuzhiyun /* Gives statistics about the spread continuous missed beacons. 1003*4882a593Smuzhiyun * The 16 LSB are dedicated for the PS mode. 1004*4882a593Smuzhiyun * The 16 MSB are dedicated for the PS mode. 1005*4882a593Smuzhiyun * cont_miss_bcns_spread[0] - single missed beacon. 1006*4882a593Smuzhiyun * cont_miss_bcns_spread[1] - two continuous missed beacons. 1007*4882a593Smuzhiyun * cont_miss_bcns_spread[2] - three continuous missed beacons. 1008*4882a593Smuzhiyun * ... 1009*4882a593Smuzhiyun * cont_miss_bcns_spread[9] - ten and more continuous missed beacons. 1010*4882a593Smuzhiyun */ 1011*4882a593Smuzhiyun u32 cont_miss_bcns_spread[ACX_MISSED_BEACONS_SPREAD]; 1012*4882a593Smuzhiyun 1013*4882a593Smuzhiyun /* the number of beacons in awake mode */ 1014*4882a593Smuzhiyun u32 rcvd_awake_beacons; 1015*4882a593Smuzhiyun } __packed; 1016*4882a593Smuzhiyun 1017*4882a593Smuzhiyun struct acx_mic_statistics { 1018*4882a593Smuzhiyun u32 rx_pkts; 1019*4882a593Smuzhiyun u32 calc_failure; 1020*4882a593Smuzhiyun } __packed; 1021*4882a593Smuzhiyun 1022*4882a593Smuzhiyun struct acx_aes_statistics { 1023*4882a593Smuzhiyun u32 encrypt_fail; 1024*4882a593Smuzhiyun u32 decrypt_fail; 1025*4882a593Smuzhiyun u32 encrypt_packets; 1026*4882a593Smuzhiyun u32 decrypt_packets; 1027*4882a593Smuzhiyun u32 encrypt_interrupt; 1028*4882a593Smuzhiyun u32 decrypt_interrupt; 1029*4882a593Smuzhiyun } __packed; 1030*4882a593Smuzhiyun 1031*4882a593Smuzhiyun struct acx_event_statistics { 1032*4882a593Smuzhiyun u32 heart_beat; 1033*4882a593Smuzhiyun u32 calibration; 1034*4882a593Smuzhiyun u32 rx_mismatch; 1035*4882a593Smuzhiyun u32 rx_mem_empty; 1036*4882a593Smuzhiyun u32 rx_pool; 1037*4882a593Smuzhiyun u32 oom_late; 1038*4882a593Smuzhiyun u32 phy_transmit_error; 1039*4882a593Smuzhiyun u32 tx_stuck; 1040*4882a593Smuzhiyun } __packed; 1041*4882a593Smuzhiyun 1042*4882a593Smuzhiyun struct acx_ps_statistics { 1043*4882a593Smuzhiyun u32 pspoll_timeouts; 1044*4882a593Smuzhiyun u32 upsd_timeouts; 1045*4882a593Smuzhiyun u32 upsd_max_sptime; 1046*4882a593Smuzhiyun u32 upsd_max_apturn; 1047*4882a593Smuzhiyun u32 pspoll_max_apturn; 1048*4882a593Smuzhiyun u32 pspoll_utilization; 1049*4882a593Smuzhiyun u32 upsd_utilization; 1050*4882a593Smuzhiyun } __packed; 1051*4882a593Smuzhiyun 1052*4882a593Smuzhiyun struct acx_rxpipe_statistics { 1053*4882a593Smuzhiyun u32 rx_prep_beacon_drop; 1054*4882a593Smuzhiyun u32 descr_host_int_trig_rx_data; 1055*4882a593Smuzhiyun u32 beacon_buffer_thres_host_int_trig_rx_data; 1056*4882a593Smuzhiyun u32 missed_beacon_host_int_trig_rx_data; 1057*4882a593Smuzhiyun u32 tx_xfr_host_int_trig_rx_data; 1058*4882a593Smuzhiyun } __packed; 1059*4882a593Smuzhiyun 1060*4882a593Smuzhiyun struct acx_statistics { 1061*4882a593Smuzhiyun struct acx_header header; 1062*4882a593Smuzhiyun 1063*4882a593Smuzhiyun struct acx_tx_statistics tx; 1064*4882a593Smuzhiyun struct acx_rx_statistics rx; 1065*4882a593Smuzhiyun struct acx_dma_statistics dma; 1066*4882a593Smuzhiyun struct acx_isr_statistics isr; 1067*4882a593Smuzhiyun struct acx_wep_statistics wep; 1068*4882a593Smuzhiyun struct acx_pwr_statistics pwr; 1069*4882a593Smuzhiyun struct acx_aes_statistics aes; 1070*4882a593Smuzhiyun struct acx_mic_statistics mic; 1071*4882a593Smuzhiyun struct acx_event_statistics event; 1072*4882a593Smuzhiyun struct acx_ps_statistics ps; 1073*4882a593Smuzhiyun struct acx_rxpipe_statistics rxpipe; 1074*4882a593Smuzhiyun } __packed; 1075*4882a593Smuzhiyun 1076*4882a593Smuzhiyun #define ACX_MAX_RATE_CLASSES 8 1077*4882a593Smuzhiyun #define ACX_RATE_MASK_UNSPECIFIED 0 1078*4882a593Smuzhiyun #define ACX_RATE_RETRY_LIMIT 10 1079*4882a593Smuzhiyun 1080*4882a593Smuzhiyun struct acx_rate_class { 1081*4882a593Smuzhiyun u32 enabled_rates; 1082*4882a593Smuzhiyun u8 short_retry_limit; 1083*4882a593Smuzhiyun u8 long_retry_limit; 1084*4882a593Smuzhiyun u8 aflags; 1085*4882a593Smuzhiyun u8 reserved; 1086*4882a593Smuzhiyun } __packed; 1087*4882a593Smuzhiyun 1088*4882a593Smuzhiyun struct acx_rate_policy { 1089*4882a593Smuzhiyun struct acx_header header; 1090*4882a593Smuzhiyun 1091*4882a593Smuzhiyun u32 rate_class_cnt; 1092*4882a593Smuzhiyun struct acx_rate_class rate_class[ACX_MAX_RATE_CLASSES]; 1093*4882a593Smuzhiyun } __packed; 1094*4882a593Smuzhiyun 1095*4882a593Smuzhiyun struct wl1251_acx_memory { 1096*4882a593Smuzhiyun __le16 num_stations; /* number of STAs to be supported. */ 1097*4882a593Smuzhiyun u16 reserved_1; 1098*4882a593Smuzhiyun 1099*4882a593Smuzhiyun /* 1100*4882a593Smuzhiyun * Nmber of memory buffers for the RX mem pool. 1101*4882a593Smuzhiyun * The actual number may be less if there are 1102*4882a593Smuzhiyun * not enough blocks left for the minimum num 1103*4882a593Smuzhiyun * of TX ones. 1104*4882a593Smuzhiyun */ 1105*4882a593Smuzhiyun u8 rx_mem_block_num; 1106*4882a593Smuzhiyun u8 reserved_2; 1107*4882a593Smuzhiyun u8 num_tx_queues; /* From 1 to 16 */ 1108*4882a593Smuzhiyun u8 host_if_options; /* HOST_IF* */ 1109*4882a593Smuzhiyun u8 tx_min_mem_block_num; 1110*4882a593Smuzhiyun u8 num_ssid_profiles; 1111*4882a593Smuzhiyun __le16 debug_buffer_size; 1112*4882a593Smuzhiyun } __packed; 1113*4882a593Smuzhiyun 1114*4882a593Smuzhiyun 1115*4882a593Smuzhiyun #define ACX_RX_DESC_MIN 1 1116*4882a593Smuzhiyun #define ACX_RX_DESC_MAX 127 1117*4882a593Smuzhiyun #define ACX_RX_DESC_DEF 32 1118*4882a593Smuzhiyun struct wl1251_acx_rx_queue_config { 1119*4882a593Smuzhiyun u8 num_descs; 1120*4882a593Smuzhiyun u8 pad; 1121*4882a593Smuzhiyun u8 type; 1122*4882a593Smuzhiyun u8 priority; 1123*4882a593Smuzhiyun __le32 dma_address; 1124*4882a593Smuzhiyun } __packed; 1125*4882a593Smuzhiyun 1126*4882a593Smuzhiyun #define ACX_TX_DESC_MIN 1 1127*4882a593Smuzhiyun #define ACX_TX_DESC_MAX 127 1128*4882a593Smuzhiyun #define ACX_TX_DESC_DEF 16 1129*4882a593Smuzhiyun struct wl1251_acx_tx_queue_config { 1130*4882a593Smuzhiyun u8 num_descs; 1131*4882a593Smuzhiyun u8 pad[2]; 1132*4882a593Smuzhiyun u8 attributes; 1133*4882a593Smuzhiyun } __packed; 1134*4882a593Smuzhiyun 1135*4882a593Smuzhiyun #define MAX_TX_QUEUE_CONFIGS 5 1136*4882a593Smuzhiyun #define MAX_TX_QUEUES 4 1137*4882a593Smuzhiyun struct wl1251_acx_config_memory { 1138*4882a593Smuzhiyun struct acx_header header; 1139*4882a593Smuzhiyun 1140*4882a593Smuzhiyun struct wl1251_acx_memory mem_config; 1141*4882a593Smuzhiyun struct wl1251_acx_rx_queue_config rx_queue_config; 1142*4882a593Smuzhiyun struct wl1251_acx_tx_queue_config tx_queue_config[MAX_TX_QUEUE_CONFIGS]; 1143*4882a593Smuzhiyun } __packed; 1144*4882a593Smuzhiyun 1145*4882a593Smuzhiyun struct wl1251_acx_mem_map { 1146*4882a593Smuzhiyun struct acx_header header; 1147*4882a593Smuzhiyun 1148*4882a593Smuzhiyun void *code_start; 1149*4882a593Smuzhiyun void *code_end; 1150*4882a593Smuzhiyun 1151*4882a593Smuzhiyun void *wep_defkey_start; 1152*4882a593Smuzhiyun void *wep_defkey_end; 1153*4882a593Smuzhiyun 1154*4882a593Smuzhiyun void *sta_table_start; 1155*4882a593Smuzhiyun void *sta_table_end; 1156*4882a593Smuzhiyun 1157*4882a593Smuzhiyun void *packet_template_start; 1158*4882a593Smuzhiyun void *packet_template_end; 1159*4882a593Smuzhiyun 1160*4882a593Smuzhiyun void *queue_memory_start; 1161*4882a593Smuzhiyun void *queue_memory_end; 1162*4882a593Smuzhiyun 1163*4882a593Smuzhiyun void *packet_memory_pool_start; 1164*4882a593Smuzhiyun void *packet_memory_pool_end; 1165*4882a593Smuzhiyun 1166*4882a593Smuzhiyun void *debug_buffer1_start; 1167*4882a593Smuzhiyun void *debug_buffer1_end; 1168*4882a593Smuzhiyun 1169*4882a593Smuzhiyun void *debug_buffer2_start; 1170*4882a593Smuzhiyun void *debug_buffer2_end; 1171*4882a593Smuzhiyun 1172*4882a593Smuzhiyun /* Number of blocks FW allocated for TX packets */ 1173*4882a593Smuzhiyun u32 num_tx_mem_blocks; 1174*4882a593Smuzhiyun 1175*4882a593Smuzhiyun /* Number of blocks FW allocated for RX packets */ 1176*4882a593Smuzhiyun u32 num_rx_mem_blocks; 1177*4882a593Smuzhiyun } __packed; 1178*4882a593Smuzhiyun 1179*4882a593Smuzhiyun 1180*4882a593Smuzhiyun struct wl1251_acx_wr_tbtt_and_dtim { 1181*4882a593Smuzhiyun 1182*4882a593Smuzhiyun struct acx_header header; 1183*4882a593Smuzhiyun 1184*4882a593Smuzhiyun /* Time in TUs between two consecutive beacons */ 1185*4882a593Smuzhiyun u16 tbtt; 1186*4882a593Smuzhiyun 1187*4882a593Smuzhiyun /* 1188*4882a593Smuzhiyun * DTIM period 1189*4882a593Smuzhiyun * For BSS: Number of TBTTs in a DTIM period (range: 1-10) 1190*4882a593Smuzhiyun * For IBSS: value shall be set to 1 1191*4882a593Smuzhiyun */ 1192*4882a593Smuzhiyun u8 dtim; 1193*4882a593Smuzhiyun u8 padding; 1194*4882a593Smuzhiyun } __packed; 1195*4882a593Smuzhiyun 1196*4882a593Smuzhiyun enum wl1251_acx_bet_mode { 1197*4882a593Smuzhiyun WL1251_ACX_BET_DISABLE = 0, 1198*4882a593Smuzhiyun WL1251_ACX_BET_ENABLE = 1, 1199*4882a593Smuzhiyun }; 1200*4882a593Smuzhiyun 1201*4882a593Smuzhiyun struct wl1251_acx_bet_enable { 1202*4882a593Smuzhiyun struct acx_header header; 1203*4882a593Smuzhiyun 1204*4882a593Smuzhiyun /* 1205*4882a593Smuzhiyun * Specifies if beacon early termination procedure is enabled or 1206*4882a593Smuzhiyun * disabled, see enum wl1251_acx_bet_mode. 1207*4882a593Smuzhiyun */ 1208*4882a593Smuzhiyun u8 enable; 1209*4882a593Smuzhiyun 1210*4882a593Smuzhiyun /* 1211*4882a593Smuzhiyun * Specifies the maximum number of consecutive beacons that may be 1212*4882a593Smuzhiyun * early terminated. After this number is reached at least one full 1213*4882a593Smuzhiyun * beacon must be correctly received in FW before beacon ET 1214*4882a593Smuzhiyun * resumes. Range 0 - 255. 1215*4882a593Smuzhiyun */ 1216*4882a593Smuzhiyun u8 max_consecutive; 1217*4882a593Smuzhiyun 1218*4882a593Smuzhiyun u8 padding[2]; 1219*4882a593Smuzhiyun } __packed; 1220*4882a593Smuzhiyun 1221*4882a593Smuzhiyun #define ACX_IPV4_VERSION 4 1222*4882a593Smuzhiyun #define ACX_IPV6_VERSION 6 1223*4882a593Smuzhiyun #define ACX_IPV4_ADDR_SIZE 4 1224*4882a593Smuzhiyun struct wl1251_acx_arp_filter { 1225*4882a593Smuzhiyun struct acx_header header; 1226*4882a593Smuzhiyun u8 version; /* The IP version: 4 - IPv4, 6 - IPv6.*/ 1227*4882a593Smuzhiyun u8 enable; /* 1 - ARP filtering is enabled, 0 - disabled */ 1228*4882a593Smuzhiyun u8 padding[2]; 1229*4882a593Smuzhiyun u8 address[16]; /* The IP address used to filter ARP packets. 1230*4882a593Smuzhiyun ARP packets that do not match this address are 1231*4882a593Smuzhiyun dropped. When the IP Version is 4, the last 12 1232*4882a593Smuzhiyun bytes of the the address are ignored. */ 1233*4882a593Smuzhiyun } __attribute__((packed)); 1234*4882a593Smuzhiyun 1235*4882a593Smuzhiyun struct wl1251_acx_ac_cfg { 1236*4882a593Smuzhiyun struct acx_header header; 1237*4882a593Smuzhiyun 1238*4882a593Smuzhiyun /* 1239*4882a593Smuzhiyun * Access Category - The TX queue's access category 1240*4882a593Smuzhiyun * (refer to AccessCategory_enum) 1241*4882a593Smuzhiyun */ 1242*4882a593Smuzhiyun u8 ac; 1243*4882a593Smuzhiyun 1244*4882a593Smuzhiyun /* 1245*4882a593Smuzhiyun * The contention window minimum size (in slots) for 1246*4882a593Smuzhiyun * the access class. 1247*4882a593Smuzhiyun */ 1248*4882a593Smuzhiyun u8 cw_min; 1249*4882a593Smuzhiyun 1250*4882a593Smuzhiyun /* 1251*4882a593Smuzhiyun * The contention window maximum size (in slots) for 1252*4882a593Smuzhiyun * the access class. 1253*4882a593Smuzhiyun */ 1254*4882a593Smuzhiyun u16 cw_max; 1255*4882a593Smuzhiyun 1256*4882a593Smuzhiyun /* The AIF value (in slots) for the access class. */ 1257*4882a593Smuzhiyun u8 aifsn; 1258*4882a593Smuzhiyun 1259*4882a593Smuzhiyun u8 reserved; 1260*4882a593Smuzhiyun 1261*4882a593Smuzhiyun /* The TX Op Limit (in microseconds) for the access class. */ 1262*4882a593Smuzhiyun u16 txop_limit; 1263*4882a593Smuzhiyun } __packed; 1264*4882a593Smuzhiyun 1265*4882a593Smuzhiyun 1266*4882a593Smuzhiyun enum wl1251_acx_channel_type { 1267*4882a593Smuzhiyun CHANNEL_TYPE_DCF = 0, 1268*4882a593Smuzhiyun CHANNEL_TYPE_EDCF = 1, 1269*4882a593Smuzhiyun CHANNEL_TYPE_HCCA = 2, 1270*4882a593Smuzhiyun }; 1271*4882a593Smuzhiyun 1272*4882a593Smuzhiyun enum wl1251_acx_ps_scheme { 1273*4882a593Smuzhiyun /* regular ps: simple sending of packets */ 1274*4882a593Smuzhiyun WL1251_ACX_PS_SCHEME_LEGACY = 0, 1275*4882a593Smuzhiyun 1276*4882a593Smuzhiyun /* sending a packet triggers a unscheduled apsd downstream */ 1277*4882a593Smuzhiyun WL1251_ACX_PS_SCHEME_UPSD_TRIGGER = 1, 1278*4882a593Smuzhiyun 1279*4882a593Smuzhiyun /* a pspoll packet will be sent before every data packet */ 1280*4882a593Smuzhiyun WL1251_ACX_PS_SCHEME_LEGACY_PSPOLL = 2, 1281*4882a593Smuzhiyun 1282*4882a593Smuzhiyun /* scheduled apsd mode */ 1283*4882a593Smuzhiyun WL1251_ACX_PS_SCHEME_SAPSD = 3, 1284*4882a593Smuzhiyun }; 1285*4882a593Smuzhiyun 1286*4882a593Smuzhiyun enum wl1251_acx_ack_policy { 1287*4882a593Smuzhiyun WL1251_ACX_ACK_POLICY_LEGACY = 0, 1288*4882a593Smuzhiyun WL1251_ACX_ACK_POLICY_NO_ACK = 1, 1289*4882a593Smuzhiyun WL1251_ACX_ACK_POLICY_BLOCK = 2, 1290*4882a593Smuzhiyun }; 1291*4882a593Smuzhiyun 1292*4882a593Smuzhiyun struct wl1251_acx_tid_cfg { 1293*4882a593Smuzhiyun struct acx_header header; 1294*4882a593Smuzhiyun 1295*4882a593Smuzhiyun /* tx queue id number (0-7) */ 1296*4882a593Smuzhiyun u8 queue; 1297*4882a593Smuzhiyun 1298*4882a593Smuzhiyun /* channel access type for the queue, enum wl1251_acx_channel_type */ 1299*4882a593Smuzhiyun u8 type; 1300*4882a593Smuzhiyun 1301*4882a593Smuzhiyun /* EDCA: ac index (0-3), HCCA: traffic stream id (8-15) */ 1302*4882a593Smuzhiyun u8 tsid; 1303*4882a593Smuzhiyun 1304*4882a593Smuzhiyun /* ps scheme of the specified queue, enum wl1251_acx_ps_scheme */ 1305*4882a593Smuzhiyun u8 ps_scheme; 1306*4882a593Smuzhiyun 1307*4882a593Smuzhiyun /* the tx queue ack policy, enum wl1251_acx_ack_policy */ 1308*4882a593Smuzhiyun u8 ack_policy; 1309*4882a593Smuzhiyun 1310*4882a593Smuzhiyun u8 padding[3]; 1311*4882a593Smuzhiyun 1312*4882a593Smuzhiyun /* not supported */ 1313*4882a593Smuzhiyun u32 apsdconf[2]; 1314*4882a593Smuzhiyun } __packed; 1315*4882a593Smuzhiyun 1316*4882a593Smuzhiyun /************************************************************************* 1317*4882a593Smuzhiyun 1318*4882a593Smuzhiyun Host Interrupt Register (WiLink -> Host) 1319*4882a593Smuzhiyun 1320*4882a593Smuzhiyun **************************************************************************/ 1321*4882a593Smuzhiyun 1322*4882a593Smuzhiyun /* RX packet is ready in Xfer buffer #0 */ 1323*4882a593Smuzhiyun #define WL1251_ACX_INTR_RX0_DATA BIT(0) 1324*4882a593Smuzhiyun 1325*4882a593Smuzhiyun /* TX result(s) are in the TX complete buffer */ 1326*4882a593Smuzhiyun #define WL1251_ACX_INTR_TX_RESULT BIT(1) 1327*4882a593Smuzhiyun 1328*4882a593Smuzhiyun /* OBSOLETE */ 1329*4882a593Smuzhiyun #define WL1251_ACX_INTR_TX_XFR BIT(2) 1330*4882a593Smuzhiyun 1331*4882a593Smuzhiyun /* RX packet is ready in Xfer buffer #1 */ 1332*4882a593Smuzhiyun #define WL1251_ACX_INTR_RX1_DATA BIT(3) 1333*4882a593Smuzhiyun 1334*4882a593Smuzhiyun /* Event was entered to Event MBOX #A */ 1335*4882a593Smuzhiyun #define WL1251_ACX_INTR_EVENT_A BIT(4) 1336*4882a593Smuzhiyun 1337*4882a593Smuzhiyun /* Event was entered to Event MBOX #B */ 1338*4882a593Smuzhiyun #define WL1251_ACX_INTR_EVENT_B BIT(5) 1339*4882a593Smuzhiyun 1340*4882a593Smuzhiyun /* OBSOLETE */ 1341*4882a593Smuzhiyun #define WL1251_ACX_INTR_WAKE_ON_HOST BIT(6) 1342*4882a593Smuzhiyun 1343*4882a593Smuzhiyun /* Trace message on MBOX #A */ 1344*4882a593Smuzhiyun #define WL1251_ACX_INTR_TRACE_A BIT(7) 1345*4882a593Smuzhiyun 1346*4882a593Smuzhiyun /* Trace message on MBOX #B */ 1347*4882a593Smuzhiyun #define WL1251_ACX_INTR_TRACE_B BIT(8) 1348*4882a593Smuzhiyun 1349*4882a593Smuzhiyun /* Command processing completion */ 1350*4882a593Smuzhiyun #define WL1251_ACX_INTR_CMD_COMPLETE BIT(9) 1351*4882a593Smuzhiyun 1352*4882a593Smuzhiyun /* Init sequence is done */ 1353*4882a593Smuzhiyun #define WL1251_ACX_INTR_INIT_COMPLETE BIT(14) 1354*4882a593Smuzhiyun 1355*4882a593Smuzhiyun #define WL1251_ACX_INTR_ALL 0xFFFFFFFF 1356*4882a593Smuzhiyun 1357*4882a593Smuzhiyun enum { 1358*4882a593Smuzhiyun ACX_WAKE_UP_CONDITIONS = 0x0002, 1359*4882a593Smuzhiyun ACX_MEM_CFG = 0x0003, 1360*4882a593Smuzhiyun ACX_SLOT = 0x0004, 1361*4882a593Smuzhiyun ACX_QUEUE_HEAD = 0x0005, /* for MASTER mode only */ 1362*4882a593Smuzhiyun ACX_AC_CFG = 0x0007, 1363*4882a593Smuzhiyun ACX_MEM_MAP = 0x0008, 1364*4882a593Smuzhiyun ACX_AID = 0x000A, 1365*4882a593Smuzhiyun ACX_RADIO_PARAM = 0x000B, /* Not used */ 1366*4882a593Smuzhiyun ACX_CFG = 0x000C, /* Not used */ 1367*4882a593Smuzhiyun ACX_FW_REV = 0x000D, 1368*4882a593Smuzhiyun ACX_MEDIUM_USAGE = 0x000F, 1369*4882a593Smuzhiyun ACX_RX_CFG = 0x0010, 1370*4882a593Smuzhiyun ACX_TX_QUEUE_CFG = 0x0011, /* FIXME: only used by wl1251 */ 1371*4882a593Smuzhiyun ACX_BSS_IN_PS = 0x0012, /* for AP only */ 1372*4882a593Smuzhiyun ACX_STATISTICS = 0x0013, /* Debug API */ 1373*4882a593Smuzhiyun ACX_FEATURE_CFG = 0x0015, 1374*4882a593Smuzhiyun ACX_MISC_CFG = 0x0017, /* Not used */ 1375*4882a593Smuzhiyun ACX_TID_CFG = 0x001A, 1376*4882a593Smuzhiyun ACX_BEACON_FILTER_OPT = 0x001F, 1377*4882a593Smuzhiyun ACX_LOW_RSSI = 0x0020, 1378*4882a593Smuzhiyun ACX_NOISE_HIST = 0x0021, 1379*4882a593Smuzhiyun ACX_HDK_VERSION = 0x0022, /* ??? */ 1380*4882a593Smuzhiyun ACX_PD_THRESHOLD = 0x0023, 1381*4882a593Smuzhiyun ACX_DATA_PATH_PARAMS = 0x0024, /* WO */ 1382*4882a593Smuzhiyun ACX_DATA_PATH_RESP_PARAMS = 0x0024, /* RO */ 1383*4882a593Smuzhiyun ACX_CCA_THRESHOLD = 0x0025, 1384*4882a593Smuzhiyun ACX_EVENT_MBOX_MASK = 0x0026, 1385*4882a593Smuzhiyun #ifdef FW_RUNNING_AS_AP 1386*4882a593Smuzhiyun ACX_DTIM_PERIOD = 0x0027, /* for AP only */ 1387*4882a593Smuzhiyun #else 1388*4882a593Smuzhiyun ACX_WR_TBTT_AND_DTIM = 0x0027, /* STA only */ 1389*4882a593Smuzhiyun #endif 1390*4882a593Smuzhiyun ACX_ACI_OPTION_CFG = 0x0029, /* OBSOLETE (for 1251)*/ 1391*4882a593Smuzhiyun ACX_GPIO_CFG = 0x002A, /* Not used */ 1392*4882a593Smuzhiyun ACX_GPIO_SET = 0x002B, /* Not used */ 1393*4882a593Smuzhiyun ACX_PM_CFG = 0x002C, /* To Be Documented */ 1394*4882a593Smuzhiyun ACX_CONN_MONIT_PARAMS = 0x002D, 1395*4882a593Smuzhiyun ACX_AVERAGE_RSSI = 0x002E, /* Not used */ 1396*4882a593Smuzhiyun ACX_CONS_TX_FAILURE = 0x002F, 1397*4882a593Smuzhiyun ACX_BCN_DTIM_OPTIONS = 0x0031, 1398*4882a593Smuzhiyun ACX_SG_ENABLE = 0x0032, 1399*4882a593Smuzhiyun ACX_SG_CFG = 0x0033, 1400*4882a593Smuzhiyun ACX_ANTENNA_DIVERSITY_CFG = 0x0035, /* To Be Documented */ 1401*4882a593Smuzhiyun ACX_LOW_SNR = 0x0037, /* To Be Documented */ 1402*4882a593Smuzhiyun ACX_BEACON_FILTER_TABLE = 0x0038, 1403*4882a593Smuzhiyun ACX_ARP_IP_FILTER = 0x0039, 1404*4882a593Smuzhiyun ACX_ROAMING_STATISTICS_TBL = 0x003B, 1405*4882a593Smuzhiyun ACX_RATE_POLICY = 0x003D, 1406*4882a593Smuzhiyun ACX_CTS_PROTECTION = 0x003E, 1407*4882a593Smuzhiyun ACX_SLEEP_AUTH = 0x003F, 1408*4882a593Smuzhiyun ACX_PREAMBLE_TYPE = 0x0040, 1409*4882a593Smuzhiyun ACX_ERROR_CNT = 0x0041, 1410*4882a593Smuzhiyun ACX_FW_GEN_FRAME_RATES = 0x0042, 1411*4882a593Smuzhiyun ACX_IBSS_FILTER = 0x0044, 1412*4882a593Smuzhiyun ACX_SERVICE_PERIOD_TIMEOUT = 0x0045, 1413*4882a593Smuzhiyun ACX_TSF_INFO = 0x0046, 1414*4882a593Smuzhiyun ACX_CONFIG_PS_WMM = 0x0049, 1415*4882a593Smuzhiyun ACX_ENABLE_RX_DATA_FILTER = 0x004A, 1416*4882a593Smuzhiyun ACX_SET_RX_DATA_FILTER = 0x004B, 1417*4882a593Smuzhiyun ACX_GET_DATA_FILTER_STATISTICS = 0x004C, 1418*4882a593Smuzhiyun ACX_POWER_LEVEL_TABLE = 0x004D, 1419*4882a593Smuzhiyun ACX_BET_ENABLE = 0x0050, 1420*4882a593Smuzhiyun DOT11_STATION_ID = 0x1001, 1421*4882a593Smuzhiyun DOT11_RX_MSDU_LIFE_TIME = 0x1004, 1422*4882a593Smuzhiyun DOT11_CUR_TX_PWR = 0x100D, 1423*4882a593Smuzhiyun DOT11_DEFAULT_KEY = 0x1010, 1424*4882a593Smuzhiyun DOT11_RX_DOT11_MODE = 0x1012, 1425*4882a593Smuzhiyun DOT11_RTS_THRESHOLD = 0x1013, 1426*4882a593Smuzhiyun DOT11_GROUP_ADDRESS_TBL = 0x1014, 1427*4882a593Smuzhiyun 1428*4882a593Smuzhiyun MAX_DOT11_IE = DOT11_GROUP_ADDRESS_TBL, 1429*4882a593Smuzhiyun 1430*4882a593Smuzhiyun MAX_IE = 0xFFFF 1431*4882a593Smuzhiyun }; 1432*4882a593Smuzhiyun 1433*4882a593Smuzhiyun 1434*4882a593Smuzhiyun int wl1251_acx_frame_rates(struct wl1251 *wl, u8 ctrl_rate, u8 ctrl_mod, 1435*4882a593Smuzhiyun u8 mgt_rate, u8 mgt_mod); 1436*4882a593Smuzhiyun int wl1251_acx_station_id(struct wl1251 *wl); 1437*4882a593Smuzhiyun int wl1251_acx_default_key(struct wl1251 *wl, u8 key_id); 1438*4882a593Smuzhiyun int wl1251_acx_wake_up_conditions(struct wl1251 *wl, u8 wake_up_event, 1439*4882a593Smuzhiyun u8 listen_interval); 1440*4882a593Smuzhiyun int wl1251_acx_sleep_auth(struct wl1251 *wl, u8 sleep_auth); 1441*4882a593Smuzhiyun int wl1251_acx_fw_version(struct wl1251 *wl, char *buf, size_t len); 1442*4882a593Smuzhiyun int wl1251_acx_tx_power(struct wl1251 *wl, int power); 1443*4882a593Smuzhiyun int wl1251_acx_feature_cfg(struct wl1251 *wl, u32 data_flow_options); 1444*4882a593Smuzhiyun int wl1251_acx_mem_map(struct wl1251 *wl, 1445*4882a593Smuzhiyun struct acx_header *mem_map, size_t len); 1446*4882a593Smuzhiyun int wl1251_acx_data_path_params(struct wl1251 *wl, 1447*4882a593Smuzhiyun struct acx_data_path_params_resp *data_path); 1448*4882a593Smuzhiyun int wl1251_acx_rx_msdu_life_time(struct wl1251 *wl, u32 life_time); 1449*4882a593Smuzhiyun int wl1251_acx_rx_config(struct wl1251 *wl, u32 config, u32 filter); 1450*4882a593Smuzhiyun int wl1251_acx_pd_threshold(struct wl1251 *wl); 1451*4882a593Smuzhiyun int wl1251_acx_slot(struct wl1251 *wl, enum acx_slot_type slot_time); 1452*4882a593Smuzhiyun int wl1251_acx_group_address_tbl(struct wl1251 *wl, bool enable, 1453*4882a593Smuzhiyun void *mc_list, u32 mc_list_len); 1454*4882a593Smuzhiyun int wl1251_acx_service_period_timeout(struct wl1251 *wl); 1455*4882a593Smuzhiyun int wl1251_acx_rts_threshold(struct wl1251 *wl, u16 rts_threshold); 1456*4882a593Smuzhiyun int wl1251_acx_beacon_filter_opt(struct wl1251 *wl, bool enable_filter); 1457*4882a593Smuzhiyun int wl1251_acx_beacon_filter_table(struct wl1251 *wl); 1458*4882a593Smuzhiyun int wl1251_acx_conn_monit_params(struct wl1251 *wl); 1459*4882a593Smuzhiyun int wl1251_acx_sg_enable(struct wl1251 *wl); 1460*4882a593Smuzhiyun int wl1251_acx_sg_cfg(struct wl1251 *wl); 1461*4882a593Smuzhiyun int wl1251_acx_cca_threshold(struct wl1251 *wl); 1462*4882a593Smuzhiyun int wl1251_acx_bcn_dtim_options(struct wl1251 *wl); 1463*4882a593Smuzhiyun int wl1251_acx_aid(struct wl1251 *wl, u16 aid); 1464*4882a593Smuzhiyun int wl1251_acx_event_mbox_mask(struct wl1251 *wl, u32 event_mask); 1465*4882a593Smuzhiyun int wl1251_acx_low_rssi(struct wl1251 *wl, s8 threshold, u8 weight, 1466*4882a593Smuzhiyun u8 depth, enum wl1251_acx_low_rssi_type type); 1467*4882a593Smuzhiyun int wl1251_acx_set_preamble(struct wl1251 *wl, enum acx_preamble_type preamble); 1468*4882a593Smuzhiyun int wl1251_acx_cts_protect(struct wl1251 *wl, 1469*4882a593Smuzhiyun enum acx_ctsprotect_type ctsprotect); 1470*4882a593Smuzhiyun int wl1251_acx_statistics(struct wl1251 *wl, struct acx_statistics *stats); 1471*4882a593Smuzhiyun int wl1251_acx_tsf_info(struct wl1251 *wl, u64 *mactime); 1472*4882a593Smuzhiyun int wl1251_acx_rate_policies(struct wl1251 *wl); 1473*4882a593Smuzhiyun int wl1251_acx_mem_cfg(struct wl1251 *wl); 1474*4882a593Smuzhiyun int wl1251_acx_wr_tbtt_and_dtim(struct wl1251 *wl, u16 tbtt, u8 dtim); 1475*4882a593Smuzhiyun int wl1251_acx_bet_enable(struct wl1251 *wl, enum wl1251_acx_bet_mode mode, 1476*4882a593Smuzhiyun u8 max_consecutive); 1477*4882a593Smuzhiyun int wl1251_acx_arp_ip_filter(struct wl1251 *wl, bool enable, __be32 address); 1478*4882a593Smuzhiyun int wl1251_acx_ac_cfg(struct wl1251 *wl, u8 ac, u8 cw_min, u16 cw_max, 1479*4882a593Smuzhiyun u8 aifs, u16 txop); 1480*4882a593Smuzhiyun int wl1251_acx_tid_cfg(struct wl1251 *wl, u8 queue, 1481*4882a593Smuzhiyun enum wl1251_acx_channel_type type, 1482*4882a593Smuzhiyun u8 tsid, enum wl1251_acx_ps_scheme ps_scheme, 1483*4882a593Smuzhiyun enum wl1251_acx_ack_policy ack_policy); 1484*4882a593Smuzhiyun 1485*4882a593Smuzhiyun #endif /* __WL1251_ACX_H__ */ 1486