16607310bSBenjamin Close 26607310bSBenjamin Close /*- 36607310bSBenjamin Close * Copyright (c) 2006,2007 46607310bSBenjamin Close * Damien Bergamini <damien.bergamini@free.fr> 56607310bSBenjamin Close * 66607310bSBenjamin Close * Permission to use, copy, modify, and distribute this software for any 76607310bSBenjamin Close * purpose with or without fee is hereby granted, provided that the above 86607310bSBenjamin Close * copyright notice and this permission notice appear in all copies. 96607310bSBenjamin Close * 106607310bSBenjamin Close * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 116607310bSBenjamin Close * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 126607310bSBenjamin Close * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 136607310bSBenjamin Close * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 146607310bSBenjamin Close * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 156607310bSBenjamin Close * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 166607310bSBenjamin Close * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 176607310bSBenjamin Close */ 186607310bSBenjamin Close 196607310bSBenjamin Close #define WPI_TX_RING_COUNT 256 20692ad7caSAdrian Chadd #define WPI_TX_RING_LOMARK 192 21692ad7caSAdrian Chadd #define WPI_TX_RING_HIMARK 224 22a5403e31SAdrian Chadd 23a5403e31SAdrian Chadd #ifdef DIAGNOSTIC 24a5403e31SAdrian Chadd #define WPI_RX_RING_COUNT_LOG 8 25a5403e31SAdrian Chadd #else 26692ad7caSAdrian Chadd #define WPI_RX_RING_COUNT_LOG 6 27a5403e31SAdrian Chadd #endif 28a5403e31SAdrian Chadd 29692ad7caSAdrian Chadd #define WPI_RX_RING_COUNT (1 << WPI_RX_RING_COUNT_LOG) 30692ad7caSAdrian Chadd 31692ad7caSAdrian Chadd #define WPI_NTXQUEUES 8 32ebf62e08SAdrian Chadd #define WPI_DRV_NTXQUEUES 5 338e4cf38aSAdrian Chadd #define WPI_CMD_QUEUE_NUM 4 348e4cf38aSAdrian Chadd 35692ad7caSAdrian Chadd #define WPI_NDMACHNLS 6 36692ad7caSAdrian Chadd 37692ad7caSAdrian Chadd /* Maximum scatter/gather. */ 38692ad7caSAdrian Chadd #define WPI_MAX_SCATTER 4 396607310bSBenjamin Close 406607310bSBenjamin Close /* 416607310bSBenjamin Close * Rings must be aligned on a 16K boundary. 426607310bSBenjamin Close */ 436607310bSBenjamin Close #define WPI_RING_DMA_ALIGN 0x4000 446607310bSBenjamin Close 45692ad7caSAdrian Chadd /* Maximum Rx buffer size. */ 466607310bSBenjamin Close #define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */ 476607310bSBenjamin Close 486607310bSBenjamin Close /* 496607310bSBenjamin Close * Control and status registers. 506607310bSBenjamin Close */ 51692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG 0x000 52692ad7caSAdrian Chadd #define WPI_INT 0x008 53692ad7caSAdrian Chadd #define WPI_INT_MASK 0x00c 54692ad7caSAdrian Chadd #define WPI_FH_INT 0x010 55692ad7caSAdrian Chadd #define WPI_GPIO_IN 0x018 566607310bSBenjamin Close #define WPI_RESET 0x020 57692ad7caSAdrian Chadd #define WPI_GP_CNTRL 0x024 58692ad7caSAdrian Chadd #define WPI_EEPROM 0x02c 59692ad7caSAdrian Chadd #define WPI_EEPROM_GP 0x030 60692ad7caSAdrian Chadd #define WPI_GIO 0x03c 61692ad7caSAdrian Chadd #define WPI_UCODE_GP1 0x054 62692ad7caSAdrian Chadd #define WPI_UCODE_GP1_SET 0x058 63692ad7caSAdrian Chadd #define WPI_UCODE_GP1_CLR 0x05c 64692ad7caSAdrian Chadd #define WPI_UCODE_GP2 0x060 65692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN 0x100 66692ad7caSAdrian Chadd #define WPI_ANA_PLL 0x20c 67692ad7caSAdrian Chadd #define WPI_DBG_HPET_MEM 0x240 68692ad7caSAdrian Chadd #define WPI_MEM_RADDR 0x40c 69692ad7caSAdrian Chadd #define WPI_MEM_WADDR 0x410 70692ad7caSAdrian Chadd #define WPI_MEM_WDATA 0x418 71692ad7caSAdrian Chadd #define WPI_MEM_RDATA 0x41c 72692ad7caSAdrian Chadd #define WPI_PRPH_WADDR 0x444 73692ad7caSAdrian Chadd #define WPI_PRPH_RADDR 0x448 74692ad7caSAdrian Chadd #define WPI_PRPH_WDATA 0x44c 75692ad7caSAdrian Chadd #define WPI_PRPH_RDATA 0x450 76692ad7caSAdrian Chadd #define WPI_HBUS_TARG_WRPTR 0x460 77692ad7caSAdrian Chadd 78692ad7caSAdrian Chadd /* 79692ad7caSAdrian Chadd * Flow-Handler registers. 80692ad7caSAdrian Chadd */ 81692ad7caSAdrian Chadd #define WPI_FH_CBBC_CTRL(qid) (0x940 + (qid) * 8) 82692ad7caSAdrian Chadd #define WPI_FH_CBBC_BASE(qid) (0x944 + (qid) * 8) 83692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG 0xc00 84692ad7caSAdrian Chadd #define WPI_FH_RX_BASE 0xc04 85692ad7caSAdrian Chadd #define WPI_FH_RX_WPTR 0xc20 86692ad7caSAdrian Chadd #define WPI_FH_RX_RPTR_ADDR 0xc24 87692ad7caSAdrian Chadd #define WPI_FH_RSSR_TBL 0xcc0 88692ad7caSAdrian Chadd #define WPI_FH_RX_STATUS 0xcc4 89692ad7caSAdrian Chadd #define WPI_FH_TX_CONFIG(qid) (0xd00 + (qid) * 32) 90692ad7caSAdrian Chadd #define WPI_FH_TX_BASE 0xe80 91692ad7caSAdrian Chadd #define WPI_FH_MSG_CONFIG 0xe88 92692ad7caSAdrian Chadd #define WPI_FH_TX_STATUS 0xe90 936607310bSBenjamin Close 946607310bSBenjamin Close /* 956607310bSBenjamin Close * NIC internal memory offsets. 966607310bSBenjamin Close */ 97692ad7caSAdrian Chadd #define WPI_ALM_SCHED_MODE 0x2e00 98692ad7caSAdrian Chadd #define WPI_ALM_SCHED_ARASTAT 0x2e04 99692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXFACT 0x2e10 100692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXF4MF 0x2e14 101692ad7caSAdrian Chadd #define WPI_ALM_SCHED_TXF5MF 0x2e20 102692ad7caSAdrian Chadd #define WPI_ALM_SCHED_SBYPASS_MODE1 0x2e2c 103692ad7caSAdrian Chadd #define WPI_ALM_SCHED_SBYPASS_MODE2 0x2e30 104a6df6cfeSAdrian Chadd #define WPI_APMG_CLK_CTRL 0x3000 105692ad7caSAdrian Chadd #define WPI_APMG_CLK_EN 0x3004 106692ad7caSAdrian Chadd #define WPI_APMG_CLK_DIS 0x3008 107692ad7caSAdrian Chadd #define WPI_APMG_PS 0x300c 108692ad7caSAdrian Chadd #define WPI_APMG_PCI_STT 0x3010 109692ad7caSAdrian Chadd #define WPI_APMG_RFKILL 0x3014 110692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL 0x3400 111692ad7caSAdrian Chadd #define WPI_BSM_WR_MEM_SRC 0x3404 112692ad7caSAdrian Chadd #define WPI_BSM_WR_MEM_DST 0x3408 113692ad7caSAdrian Chadd #define WPI_BSM_WR_DWCOUNT 0x340c 114692ad7caSAdrian Chadd #define WPI_BSM_DRAM_TEXT_ADDR 0x3490 115692ad7caSAdrian Chadd #define WPI_BSM_DRAM_TEXT_SIZE 0x3494 116692ad7caSAdrian Chadd #define WPI_BSM_DRAM_DATA_ADDR 0x3498 117692ad7caSAdrian Chadd #define WPI_BSM_DRAM_DATA_SIZE 0x349c 118692ad7caSAdrian Chadd #define WPI_BSM_SRAM_BASE 0x3800 1196607310bSBenjamin Close 120692ad7caSAdrian Chadd /* Possible flags for register WPI_HW_IF_CONFIG. */ 121692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_ALM_MB (1 << 8) 122692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_ALM_MM (1 << 9) 123692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_SKU_MRC (1 << 10) 124692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_REV_D (1 << 11) 125692ad7caSAdrian Chadd #define WPI_HW_IF_CONFIG_TYPE_B (1 << 12) 1266607310bSBenjamin Close 127692ad7caSAdrian Chadd /* Possible flags for registers WPI_PRPH_RADDR/WPI_PRPH_WADDR. */ 128692ad7caSAdrian Chadd #define WPI_PRPH_DWORD ((sizeof (uint32_t) - 1) << 24) 1296607310bSBenjamin Close 130692ad7caSAdrian Chadd /* Possible values for WPI_BSM_WR_MEM_DST. */ 131692ad7caSAdrian Chadd #define WPI_FW_TEXT_BASE 0x00000000 132692ad7caSAdrian Chadd #define WPI_FW_DATA_BASE 0x00800000 1336607310bSBenjamin Close 134692ad7caSAdrian Chadd /* Possible flags for WPI_GPIO_IN. */ 135692ad7caSAdrian Chadd #define WPI_GPIO_IN_VMAIN (1 << 9) 1366607310bSBenjamin Close 137692ad7caSAdrian Chadd /* Possible flags for register WPI_RESET. */ 138692ad7caSAdrian Chadd #define WPI_RESET_NEVO (1 << 0) 139692ad7caSAdrian Chadd #define WPI_RESET_SW (1 << 7) 140692ad7caSAdrian Chadd #define WPI_RESET_MASTER_DISABLED (1 << 8) 141692ad7caSAdrian Chadd #define WPI_RESET_STOP_MASTER (1 << 9) 1426607310bSBenjamin Close 143692ad7caSAdrian Chadd /* Possible flags for register WPI_GP_CNTRL. */ 144692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_ACCESS_ENA (1 << 0) 145692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_CLOCK_READY (1 << 0) 146692ad7caSAdrian Chadd #define WPI_GP_CNTRL_INIT_DONE (1 << 2) 147692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_ACCESS_REQ (1 << 3) 148692ad7caSAdrian Chadd #define WPI_GP_CNTRL_SLEEP (1 << 4) 149692ad7caSAdrian Chadd #define WPI_GP_CNTRL_PS_MASK (7 << 24) 150692ad7caSAdrian Chadd #define WPI_GP_CNTRL_MAC_PS (4 << 24) 151692ad7caSAdrian Chadd #define WPI_GP_CNTRL_RFKILL (1 << 27) 1526607310bSBenjamin Close 153692ad7caSAdrian Chadd /* Possible flags for register WPI_GIO_CHICKEN. */ 154692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN_L1A_NO_L0S_RX (1 << 23) 155692ad7caSAdrian Chadd #define WPI_GIO_CHICKEN_DIS_L0S_TIMER (1 << 29) 1566607310bSBenjamin Close 157692ad7caSAdrian Chadd /* Possible flags for register WPI_GIO. */ 158692ad7caSAdrian Chadd #define WPI_GIO_L0S_ENA (1 << 1) 1596607310bSBenjamin Close 160692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_RX_CONFIG. */ 161692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_DMA_ENA (1U << 31) 162692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_RDRBD_ENA (1 << 29) 163692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_WRSTATUS_ENA (1 << 27) 164692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_MAXFRAG (1 << 24) 165692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_NRBD(x) ((x) << 20) 166692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_IRQ_DST_HOST (1 << 12) 167692ad7caSAdrian Chadd #define WPI_FH_RX_CONFIG_IRQ_TIMEOUT(x) ((x) << 4) 1686607310bSBenjamin Close 169692ad7caSAdrian Chadd /* Possible flags for register WPI_ANA_PLL. */ 170692ad7caSAdrian Chadd #define WPI_ANA_PLL_INIT (1 << 24) 1716607310bSBenjamin Close 172692ad7caSAdrian Chadd /* Possible flags for register WPI_UCODE_GP1*. */ 173692ad7caSAdrian Chadd #define WPI_UCODE_GP1_MAC_SLEEP (1 << 0) 174692ad7caSAdrian Chadd #define WPI_UCODE_GP1_RFKILL (1 << 1) 175692ad7caSAdrian Chadd #define WPI_UCODE_GP1_CMD_BLOCKED (1 << 2) 1766607310bSBenjamin Close 177692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_RX_STATUS. */ 178692ad7caSAdrian Chadd #define WPI_FH_RX_STATUS_IDLE (1 << 24) 1796607310bSBenjamin Close 180692ad7caSAdrian Chadd /* Possible flags for register WPI_BSM_WR_CTRL. */ 181692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL_START_EN (1 << 30) 182692ad7caSAdrian Chadd #define WPI_BSM_WR_CTRL_START (1U << 31) 1836607310bSBenjamin Close 184692ad7caSAdrian Chadd /* Possible flags for register WPI_INT. */ 185692ad7caSAdrian Chadd #define WPI_INT_ALIVE (1 << 0) 186692ad7caSAdrian Chadd #define WPI_INT_WAKEUP (1 << 1) 187692ad7caSAdrian Chadd #define WPI_INT_SW_RX (1 << 3) 188692ad7caSAdrian Chadd #define WPI_INT_SW_ERR (1 << 25) 189692ad7caSAdrian Chadd #define WPI_INT_FH_TX (1 << 27) 190692ad7caSAdrian Chadd #define WPI_INT_HW_ERR (1 << 29) 191692ad7caSAdrian Chadd #define WPI_INT_FH_RX (1U << 31) 1926607310bSBenjamin Close 193692ad7caSAdrian Chadd /* Shortcut. */ 194692ad7caSAdrian Chadd #define WPI_INT_MASK_DEF \ 195692ad7caSAdrian Chadd (WPI_INT_SW_ERR | WPI_INT_HW_ERR | WPI_INT_FH_TX | \ 196692ad7caSAdrian Chadd WPI_INT_FH_RX | WPI_INT_ALIVE | WPI_INT_WAKEUP | \ 197692ad7caSAdrian Chadd WPI_INT_SW_RX) 1986607310bSBenjamin Close 199692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_INT. */ 200692ad7caSAdrian Chadd #define WPI_FH_INT_RX_CHNL(x) (1 << ((x) + 16)) 201692ad7caSAdrian Chadd #define WPI_FH_INT_HI_PRIOR (1 << 30) 202692ad7caSAdrian Chadd /* Shortcuts for the above. */ 203692ad7caSAdrian Chadd #define WPI_FH_INT_RX \ 204692ad7caSAdrian Chadd (WPI_FH_INT_RX_CHNL(0) | \ 205692ad7caSAdrian Chadd WPI_FH_INT_RX_CHNL(1) | \ 206692ad7caSAdrian Chadd WPI_FH_INT_RX_CHNL(2) | \ 207692ad7caSAdrian Chadd WPI_FH_INT_HI_PRIOR) 208692ad7caSAdrian Chadd 209692ad7caSAdrian Chadd /* Possible flags for register WPI_FH_TX_STATUS. */ 210692ad7caSAdrian Chadd #define WPI_FH_TX_STATUS_IDLE(qid) \ 211692ad7caSAdrian Chadd (1 << ((qid) + 24) | 1 << ((qid) + 16)) 212692ad7caSAdrian Chadd 213692ad7caSAdrian Chadd /* Possible flags for register WPI_EEPROM. */ 214692ad7caSAdrian Chadd #define WPI_EEPROM_READ_VALID (1 << 0) 215692ad7caSAdrian Chadd 216692ad7caSAdrian Chadd /* Possible flags for register WPI_EEPROM_GP. */ 2176607310bSBenjamin Close #define WPI_EEPROM_VERSION 0x00000007 218692ad7caSAdrian Chadd #define WPI_EEPROM_GP_IF_OWNER 0x00000180 2196607310bSBenjamin Close 220692ad7caSAdrian Chadd /* Possible flags for register WPI_APMG_PS. */ 221692ad7caSAdrian Chadd #define WPI_APMG_PS_PWR_SRC_MASK (3 << 24) 222692ad7caSAdrian Chadd 223692ad7caSAdrian Chadd /* Possible flags for registers WPI_APMG_CLK_*. */ 224692ad7caSAdrian Chadd #define WPI_APMG_CLK_CTRL_DMA_CLK_RQT (1 << 9) 225692ad7caSAdrian Chadd #define WPI_APMG_CLK_CTRL_BSM_CLK_RQT (1 << 11) 226692ad7caSAdrian Chadd 227692ad7caSAdrian Chadd /* Possible flags for register WPI_APMG_PCI_STT. */ 228692ad7caSAdrian Chadd #define WPI_APMG_PCI_STT_L1A_DIS (1 << 11) 2296607310bSBenjamin Close 2306607310bSBenjamin Close struct wpi_shared { 2318e4cf38aSAdrian Chadd uint32_t txbase[WPI_NTXQUEUES]; 2326607310bSBenjamin Close uint32_t next; 2336607310bSBenjamin Close uint32_t reserved[2]; 2346607310bSBenjamin Close } __packed; 2356607310bSBenjamin Close 2366607310bSBenjamin Close #define WPI_MAX_SEG_LEN 65520 2376607310bSBenjamin Close struct wpi_tx_desc { 238692ad7caSAdrian Chadd uint8_t reserved1[3]; 239692ad7caSAdrian Chadd uint8_t nsegs; 2406607310bSBenjamin Close #define WPI_PAD32(x) (roundup2(x, 4) - (x)) 2416607310bSBenjamin Close 2426607310bSBenjamin Close struct { 2436607310bSBenjamin Close uint32_t addr; 2446607310bSBenjamin Close uint32_t len; 245692ad7caSAdrian Chadd } __packed segs[WPI_MAX_SCATTER]; 246692ad7caSAdrian Chadd uint8_t reserved2[28]; 2476607310bSBenjamin Close } __packed; 2486607310bSBenjamin Close 2496607310bSBenjamin Close struct wpi_tx_stat { 250692ad7caSAdrian Chadd uint8_t rtsfailcnt; 251692ad7caSAdrian Chadd uint8_t ackfailcnt; 252692ad7caSAdrian Chadd uint8_t btkillcnt; 2536607310bSBenjamin Close uint8_t rate; 2546607310bSBenjamin Close uint32_t duration; 2556607310bSBenjamin Close uint32_t status; 2563d9089a6SAdrian Chadd #define WPI_TX_STATUS_SUCCESS 0x01 2573d9089a6SAdrian Chadd #define WPI_TX_STATUS_DIRECT_DONE 0x02 2583d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL 0x80 2593d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_SHORT_LIMIT 0x82 2603d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_LONG_LIMIT 0x83 2613d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FIFO_UNDERRUN 0x84 2623d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_MGMNT_ABORT 0x85 2633d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NEXT_FRAG 0x86 2643d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_LIFE_EXPIRE 0x87 2653d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NODE_PS 0x88 2663d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_ABORTED 0x89 2673d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_BT_RETRY 0x8a 2683d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NODE_INVALID 0x8b 2693d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FRAG_DROPPED 0x8c 2703d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_TID_DISABLE 0x8d 2713d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_FRAME_FLUSHED 0x8e 2723d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_INSUFFICIENT_CF_POLL 0x8f 2733d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_TX_LOCKED 0x90 2743d9089a6SAdrian Chadd #define WPI_TX_STATUS_FAIL_NO_BEACON_ON_RADAR 0x91 2753d9089a6SAdrian Chadd 2766607310bSBenjamin Close } __packed; 2776607310bSBenjamin Close 2786607310bSBenjamin Close struct wpi_rx_desc { 2796607310bSBenjamin Close uint32_t len; 2806607310bSBenjamin Close uint8_t type; 2816607310bSBenjamin Close #define WPI_UC_READY 1 2826607310bSBenjamin Close #define WPI_RX_DONE 27 2836607310bSBenjamin Close #define WPI_TX_DONE 28 2846607310bSBenjamin Close #define WPI_START_SCAN 130 28582f1b132SAndrew Thompson #define WPI_SCAN_RESULTS 131 2866607310bSBenjamin Close #define WPI_STOP_SCAN 132 287692ad7caSAdrian Chadd #define WPI_BEACON_SENT 144 288692ad7caSAdrian Chadd #define WPI_RX_STATISTICS 156 289692ad7caSAdrian Chadd #define WPI_BEACON_STATISTICS 157 2906607310bSBenjamin Close #define WPI_STATE_CHANGED 161 291692ad7caSAdrian Chadd #define WPI_BEACON_MISSED 162 2926607310bSBenjamin Close 2936607310bSBenjamin Close uint8_t flags; 2946607310bSBenjamin Close uint8_t idx; 2956607310bSBenjamin Close uint8_t qid; 2966607310bSBenjamin Close } __packed; 2976607310bSBenjamin Close 2988e4cf38aSAdrian Chadd #define WPI_RX_DESC_QID_MSK 0x07 2998e4cf38aSAdrian Chadd #define WPI_UNSOLICITED_RX_NOTIF 0x80 3008e4cf38aSAdrian Chadd 3016607310bSBenjamin Close struct wpi_rx_stat { 3026607310bSBenjamin Close uint8_t len; 3036607310bSBenjamin Close #define WPI_STAT_MAXLEN 20 3046607310bSBenjamin Close 3056607310bSBenjamin Close uint8_t id; 3066607310bSBenjamin Close uint8_t rssi; /* received signal strength */ 3078e4cf38aSAdrian Chadd #define WPI_RSSI_OFFSET -95 3086607310bSBenjamin Close 3096607310bSBenjamin Close uint8_t agc; /* access gain control */ 3106607310bSBenjamin Close uint16_t signal; 3116607310bSBenjamin Close uint16_t noise; 3126607310bSBenjamin Close } __packed; 3136607310bSBenjamin Close 3146607310bSBenjamin Close struct wpi_rx_head { 3156607310bSBenjamin Close uint16_t chan; 3166607310bSBenjamin Close uint16_t flags; 317692ad7caSAdrian Chadd #define WPI_STAT_FLAG_SHPREAMBLE (1 << 2) 318692ad7caSAdrian Chadd 3196607310bSBenjamin Close uint8_t reserved; 320692ad7caSAdrian Chadd uint8_t plcp; 3216607310bSBenjamin Close uint16_t len; 3226607310bSBenjamin Close } __packed; 3236607310bSBenjamin Close 3246607310bSBenjamin Close struct wpi_rx_tail { 3256607310bSBenjamin Close uint32_t flags; 3266607310bSBenjamin Close #define WPI_RX_NO_CRC_ERR (1 << 0) 3276607310bSBenjamin Close #define WPI_RX_NO_OVFL_ERR (1 << 1) 3286607310bSBenjamin Close /* shortcut for the above */ 3296607310bSBenjamin Close #define WPI_RX_NOERROR (WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR) 330692ad7caSAdrian Chadd #define WPI_RX_CIPHER_MASK (7 << 8) 331692ad7caSAdrian Chadd #define WPI_RX_CIPHER_CCMP (2 << 8) 332692ad7caSAdrian Chadd #define WPI_RX_DECRYPT_MASK (3 << 11) 333692ad7caSAdrian Chadd #define WPI_RX_DECRYPT_OK (3 << 11) 334692ad7caSAdrian Chadd 3356607310bSBenjamin Close uint64_t tstamp; 3366607310bSBenjamin Close uint32_t tbeacon; 3376607310bSBenjamin Close } __packed; 3386607310bSBenjamin Close 3396607310bSBenjamin Close struct wpi_tx_cmd { 3406607310bSBenjamin Close uint8_t code; 341692ad7caSAdrian Chadd #define WPI_CMD_RXON 16 342692ad7caSAdrian Chadd #define WPI_CMD_RXON_ASSOC 17 343692ad7caSAdrian Chadd #define WPI_CMD_EDCA_PARAMS 19 344692ad7caSAdrian Chadd #define WPI_CMD_TIMING 20 3456607310bSBenjamin Close #define WPI_CMD_ADD_NODE 24 346692ad7caSAdrian Chadd #define WPI_CMD_DEL_NODE 25 3476607310bSBenjamin Close #define WPI_CMD_TX_DATA 28 3486607310bSBenjamin Close #define WPI_CMD_MRR_SETUP 71 3496607310bSBenjamin Close #define WPI_CMD_SET_LED 72 3506607310bSBenjamin Close #define WPI_CMD_SET_POWER_MODE 119 3516607310bSBenjamin Close #define WPI_CMD_SCAN 128 3526f506674SAdrian Chadd #define WPI_CMD_SCAN_ABORT 129 3536607310bSBenjamin Close #define WPI_CMD_SET_BEACON 145 3546607310bSBenjamin Close #define WPI_CMD_TXPOWER 151 355692ad7caSAdrian Chadd #define WPI_CMD_BT_COEX 155 356692ad7caSAdrian Chadd #define WPI_CMD_GET_STATISTICS 156 3576607310bSBenjamin Close 3586607310bSBenjamin Close uint8_t flags; 3596607310bSBenjamin Close uint8_t idx; 3606607310bSBenjamin Close uint8_t qid; 361692ad7caSAdrian Chadd uint8_t data[124]; 3626607310bSBenjamin Close } __packed; 3636607310bSBenjamin Close 364692ad7caSAdrian Chadd /* Structure for command WPI_CMD_RXON. */ 365692ad7caSAdrian Chadd struct wpi_rxon { 3666607310bSBenjamin Close uint8_t myaddr[IEEE80211_ADDR_LEN]; 3676607310bSBenjamin Close uint16_t reserved1; 3686607310bSBenjamin Close uint8_t bssid[IEEE80211_ADDR_LEN]; 3696607310bSBenjamin Close uint16_t reserved2; 370692ad7caSAdrian Chadd uint8_t wlap[IEEE80211_ADDR_LEN]; 3716607310bSBenjamin Close uint16_t reserved3; 3726607310bSBenjamin Close uint8_t mode; 3736607310bSBenjamin Close #define WPI_MODE_HOSTAP 1 3746607310bSBenjamin Close #define WPI_MODE_STA 3 3756607310bSBenjamin Close #define WPI_MODE_IBSS 4 3766607310bSBenjamin Close #define WPI_MODE_MONITOR 6 3776607310bSBenjamin Close 378692ad7caSAdrian Chadd uint8_t air; 3796607310bSBenjamin Close uint16_t reserved4; 3806607310bSBenjamin Close uint8_t ofdm_mask; 3816607310bSBenjamin Close uint8_t cck_mask; 3826607310bSBenjamin Close uint16_t associd; 3836607310bSBenjamin Close uint32_t flags; 384692ad7caSAdrian Chadd #define WPI_RXON_24GHZ (1 << 0) 385692ad7caSAdrian Chadd #define WPI_RXON_CCK (1 << 1) 386692ad7caSAdrian Chadd #define WPI_RXON_AUTO (1 << 2) 387692ad7caSAdrian Chadd #define WPI_RXON_SHSLOT (1 << 4) 388692ad7caSAdrian Chadd #define WPI_RXON_SHPREAMBLE (1 << 5) 389692ad7caSAdrian Chadd #define WPI_RXON_NODIVERSITY (1 << 7) 390692ad7caSAdrian Chadd #define WPI_RXON_ANTENNA_A (1 << 8) 391692ad7caSAdrian Chadd #define WPI_RXON_ANTENNA_B (1 << 9) 392692ad7caSAdrian Chadd #define WPI_RXON_TSF (1 << 15) 393692ad7caSAdrian Chadd #define WPI_RXON_CTS_TO_SELF (1 << 30) 3946607310bSBenjamin Close 3956607310bSBenjamin Close uint32_t filter; 3966607310bSBenjamin Close #define WPI_FILTER_PROMISC (1 << 0) 3976607310bSBenjamin Close #define WPI_FILTER_CTL (1 << 1) 3986607310bSBenjamin Close #define WPI_FILTER_MULTICAST (1 << 2) 3996607310bSBenjamin Close #define WPI_FILTER_NODECRYPT (1 << 3) 4006607310bSBenjamin Close #define WPI_FILTER_BSS (1 << 5) 4016607310bSBenjamin Close #define WPI_FILTER_BEACON (1 << 6) 402726ddc26SAdrian Chadd #define WPI_FILTER_ASSOC (1 << 7) /* Accept associaton requests. */ 4036607310bSBenjamin Close 4046607310bSBenjamin Close uint8_t chan; 405692ad7caSAdrian Chadd uint16_t reserved5; 4066607310bSBenjamin Close } __packed; 4076607310bSBenjamin Close 408692ad7caSAdrian Chadd /* Structure for command WPI_CMD_RXON_ASSOC. */ 4096607310bSBenjamin Close struct wpi_assoc { 4106607310bSBenjamin Close uint32_t flags; 4116607310bSBenjamin Close uint32_t filter; 4126607310bSBenjamin Close uint8_t ofdm_mask; 4136607310bSBenjamin Close uint8_t cck_mask; 4146607310bSBenjamin Close uint16_t reserved; 4156607310bSBenjamin Close } __packed; 4166607310bSBenjamin Close 417692ad7caSAdrian Chadd /* Structure for command WPI_CMD_EDCA_PARAMS. */ 418692ad7caSAdrian Chadd struct wpi_edca_params { 4196607310bSBenjamin Close uint32_t flags; 420692ad7caSAdrian Chadd #define WPI_EDCA_UPDATE (1 << 0) 421692ad7caSAdrian Chadd 4226607310bSBenjamin Close struct { 4236607310bSBenjamin Close uint16_t cwmin; 4246607310bSBenjamin Close uint16_t cwmax; 4256607310bSBenjamin Close uint8_t aifsn; 4266607310bSBenjamin Close uint8_t reserved; 427692ad7caSAdrian Chadd uint16_t txoplimit; 4286607310bSBenjamin Close } __packed ac[WME_NUM_AC]; 4296607310bSBenjamin Close } __packed; 4306607310bSBenjamin Close 431692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TIMING. */ 432692ad7caSAdrian Chadd struct wpi_cmd_timing { 4336607310bSBenjamin Close uint64_t tstamp; 4346607310bSBenjamin Close uint16_t bintval; 4356607310bSBenjamin Close uint16_t atim; 4366607310bSBenjamin Close uint32_t binitval; 4376607310bSBenjamin Close uint16_t lintval; 4386607310bSBenjamin Close uint16_t reserved; 4396607310bSBenjamin Close } __packed; 4406607310bSBenjamin Close 441692ad7caSAdrian Chadd /* Structure for command WPI_CMD_ADD_NODE. */ 4426607310bSBenjamin Close struct wpi_node_info { 4436607310bSBenjamin Close uint8_t control; 4446607310bSBenjamin Close #define WPI_NODE_UPDATE (1 << 0) 4456607310bSBenjamin Close 4466607310bSBenjamin Close uint8_t reserved1[3]; 447692ad7caSAdrian Chadd uint8_t macaddr[IEEE80211_ADDR_LEN]; 4486607310bSBenjamin Close uint16_t reserved2; 4496607310bSBenjamin Close uint8_t id; 4506607310bSBenjamin Close #define WPI_ID_BSS 0 451692ad7caSAdrian Chadd #define WPI_ID_IBSS_MIN 2 452692ad7caSAdrian Chadd #define WPI_ID_IBSS_MAX 23 4536607310bSBenjamin Close #define WPI_ID_BROADCAST 24 454692ad7caSAdrian Chadd #define WPI_ID_UNDEFINED (uint8_t)-1 4556607310bSBenjamin Close 4566607310bSBenjamin Close uint8_t flags; 457692ad7caSAdrian Chadd #define WPI_FLAG_KEY_SET (1 << 0) 458692ad7caSAdrian Chadd 4596607310bSBenjamin Close uint16_t reserved3; 460692ad7caSAdrian Chadd uint16_t kflags; 461692ad7caSAdrian Chadd #define WPI_KFLAG_CCMP (1 << 1) 462692ad7caSAdrian Chadd #define WPI_KFLAG_KID(kid) ((kid) << 8) 463692ad7caSAdrian Chadd #define WPI_KFLAG_MULTICAST (1 << 14) 464692ad7caSAdrian Chadd 465692ad7caSAdrian Chadd uint8_t tsc2; 4666607310bSBenjamin Close uint8_t reserved4; 4676607310bSBenjamin Close uint16_t ttak[5]; 4686607310bSBenjamin Close uint16_t reserved5; 4696607310bSBenjamin Close uint8_t key[IEEE80211_KEYBUF_SIZE]; 4706607310bSBenjamin Close uint32_t action; 471692ad7caSAdrian Chadd #define WPI_ACTION_SET_RATE (1 << 2) 472692ad7caSAdrian Chadd 4736607310bSBenjamin Close uint32_t mask; 4746607310bSBenjamin Close uint16_t tid; 475692ad7caSAdrian Chadd uint8_t plcp; 4766607310bSBenjamin Close uint8_t antenna; 4776607310bSBenjamin Close #define WPI_ANTENNA_A (1 << 6) 4786607310bSBenjamin Close #define WPI_ANTENNA_B (1 << 7) 4796607310bSBenjamin Close #define WPI_ANTENNA_BOTH (WPI_ANTENNA_A | WPI_ANTENNA_B) 480692ad7caSAdrian Chadd 4816607310bSBenjamin Close uint8_t add_imm; 4826607310bSBenjamin Close uint8_t del_imm; 4836607310bSBenjamin Close uint16_t add_imm_start; 4846607310bSBenjamin Close } __packed; 4856607310bSBenjamin Close 486692ad7caSAdrian Chadd /* Structure for command WPI_CMD_DEL_NODE. */ 487692ad7caSAdrian Chadd struct wpi_cmd_del_node { 488692ad7caSAdrian Chadd uint8_t count; 489692ad7caSAdrian Chadd uint8_t reserved1[3]; 490692ad7caSAdrian Chadd uint8_t macaddr[IEEE80211_ADDR_LEN]; 491692ad7caSAdrian Chadd uint16_t reserved2; 492692ad7caSAdrian Chadd } __packed; 493692ad7caSAdrian Chadd 494692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TX_DATA. */ 4956607310bSBenjamin Close struct wpi_cmd_data { 4966607310bSBenjamin Close uint16_t len; 4976607310bSBenjamin Close uint16_t lnext; 4986607310bSBenjamin Close uint32_t flags; 4996607310bSBenjamin Close #define WPI_TX_NEED_RTS (1 << 1) 5006607310bSBenjamin Close #define WPI_TX_NEED_CTS (1 << 2) 5016607310bSBenjamin Close #define WPI_TX_NEED_ACK (1 << 3) 5026607310bSBenjamin Close #define WPI_TX_FULL_TXOP (1 << 7) 5036607310bSBenjamin Close #define WPI_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ 5046607310bSBenjamin Close #define WPI_TX_AUTO_SEQ (1 << 13) 505fae61c69SAdrian Chadd #define WPI_TX_MORE_FRAG (1 << 14) 5066607310bSBenjamin Close #define WPI_TX_INSERT_TSTAMP (1 << 16) 5076607310bSBenjamin Close 508692ad7caSAdrian Chadd uint8_t plcp; 5096607310bSBenjamin Close uint8_t id; 5106607310bSBenjamin Close uint8_t tid; 5116607310bSBenjamin Close uint8_t security; 512692ad7caSAdrian Chadd #define WPI_CIPHER_WEP 1 513692ad7caSAdrian Chadd #define WPI_CIPHER_CCMP 2 514692ad7caSAdrian Chadd #define WPI_CIPHER_TKIP 3 515692ad7caSAdrian Chadd #define WPI_CIPHER_WEP104 9 516692ad7caSAdrian Chadd 5176607310bSBenjamin Close uint8_t key[IEEE80211_KEYBUF_SIZE]; 5186607310bSBenjamin Close uint8_t tkip[IEEE80211_WEP_MICLEN]; 5196607310bSBenjamin Close uint32_t fnext; 520*940aa808SAdrian Chadd #define WPI_NEXT_STA_ID(id) ((id) << 8) 521*940aa808SAdrian Chadd 5226607310bSBenjamin Close uint32_t lifetime; 5236607310bSBenjamin Close #define WPI_LIFETIME_INFINITE 0xffffffff 524692ad7caSAdrian Chadd 5256607310bSBenjamin Close uint8_t ofdm_mask; 5266607310bSBenjamin Close uint8_t cck_mask; 5276607310bSBenjamin Close uint8_t rts_ntries; 5286607310bSBenjamin Close uint8_t data_ntries; 5296607310bSBenjamin Close uint16_t timeout; 5306607310bSBenjamin Close uint16_t txop; 5316607310bSBenjamin Close } __packed; 5326607310bSBenjamin Close 533692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_BEACON. */ 5346607310bSBenjamin Close struct wpi_cmd_beacon { 5356607310bSBenjamin Close uint16_t len; 5366607310bSBenjamin Close uint16_t reserved1; 5376607310bSBenjamin Close uint32_t flags; /* same as wpi_cmd_data */ 538692ad7caSAdrian Chadd uint8_t plcp; 5396607310bSBenjamin Close uint8_t id; 5406607310bSBenjamin Close uint8_t reserved2[30]; 5416607310bSBenjamin Close uint32_t lifetime; 5426607310bSBenjamin Close uint8_t ofdm_mask; 5436607310bSBenjamin Close uint8_t cck_mask; 5446607310bSBenjamin Close uint16_t reserved3[3]; 5456607310bSBenjamin Close uint16_t tim; 5466607310bSBenjamin Close uint8_t timsz; 5476607310bSBenjamin Close uint8_t reserved4; 5486607310bSBenjamin Close } __packed; 5496607310bSBenjamin Close 550692ad7caSAdrian Chadd /* Structure for notification WPI_BEACON_MISSED. */ 551692ad7caSAdrian Chadd struct wpi_beacon_missed { 552a7099588SBenjamin Close uint32_t consecutive; 553a7099588SBenjamin Close uint32_t total; 554a7099588SBenjamin Close uint32_t expected; 555a7099588SBenjamin Close uint32_t received; 556a7099588SBenjamin Close } __packed; 557a7099588SBenjamin Close 558692ad7caSAdrian Chadd /* Structure for command WPI_CMD_MRR_SETUP. */ 559692ad7caSAdrian Chadd #define WPI_RIDX_MAX 11 5606607310bSBenjamin Close struct wpi_mrr_setup { 561692ad7caSAdrian Chadd uint32_t which; 5626607310bSBenjamin Close #define WPI_MRR_CTL 0 5636607310bSBenjamin Close #define WPI_MRR_DATA 1 5646607310bSBenjamin Close 5656607310bSBenjamin Close struct { 566692ad7caSAdrian Chadd uint8_t plcp; 5676607310bSBenjamin Close uint8_t flags; 5686607310bSBenjamin Close uint8_t ntries; 56930b60481SAdrian Chadd #define WPI_NTRIES_DEFAULT 2 57030b60481SAdrian Chadd 5716607310bSBenjamin Close uint8_t next; 572692ad7caSAdrian Chadd } __packed rates[WPI_RIDX_MAX + 1]; 5736607310bSBenjamin Close } __packed; 5746607310bSBenjamin Close 575692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_LED. */ 5766607310bSBenjamin Close struct wpi_cmd_led { 5776607310bSBenjamin Close uint32_t unit; /* multiplier (in usecs) */ 5786607310bSBenjamin Close uint8_t which; 5796607310bSBenjamin Close #define WPI_LED_ACTIVITY 1 5806607310bSBenjamin Close #define WPI_LED_LINK 2 5816607310bSBenjamin Close 5826607310bSBenjamin Close uint8_t off; 5836607310bSBenjamin Close uint8_t on; 5846607310bSBenjamin Close uint8_t reserved; 5856607310bSBenjamin Close } __packed; 5866607310bSBenjamin Close 587692ad7caSAdrian Chadd /* Structure for command WPI_CMD_SET_POWER_MODE. */ 588692ad7caSAdrian Chadd struct wpi_pmgt_cmd { 589692ad7caSAdrian Chadd uint16_t flags; 590692ad7caSAdrian Chadd #define WPI_PS_ALLOW_SLEEP (1 << 0) 591692ad7caSAdrian Chadd #define WPI_PS_NOTIFY (1 << 1) 592692ad7caSAdrian Chadd #define WPI_PS_SLEEP_OVER_DTIM (1 << 2) 593692ad7caSAdrian Chadd #define WPI_PS_PCI_PMGT (1 << 3) 594692ad7caSAdrian Chadd 595692ad7caSAdrian Chadd uint8_t reserved[2]; 596692ad7caSAdrian Chadd uint32_t rxtimeout; 597692ad7caSAdrian Chadd uint32_t txtimeout; 598692ad7caSAdrian Chadd uint32_t intval[5]; 5996607310bSBenjamin Close } __packed; 6006607310bSBenjamin Close 601692ad7caSAdrian Chadd /* Structures for command WPI_CMD_SCAN. */ 602692ad7caSAdrian Chadd #define WPI_SCAN_MAX_ESSIDS 4 603692ad7caSAdrian Chadd struct wpi_scan_essid { 604692ad7caSAdrian Chadd uint8_t id; 605692ad7caSAdrian Chadd uint8_t len; 606692ad7caSAdrian Chadd uint8_t data[IEEE80211_NWID_LEN]; 607692ad7caSAdrian Chadd } __packed; 608692ad7caSAdrian Chadd 6096607310bSBenjamin Close struct wpi_scan_hdr { 6106607310bSBenjamin Close uint16_t len; 6116607310bSBenjamin Close uint8_t reserved1; 6126607310bSBenjamin Close uint8_t nchan; 61342946b7dSAdrian Chadd uint16_t quiet_time; /* timeout in milliseconds */ 61442946b7dSAdrian Chadd #define WPI_QUIET_TIME_DEFAULT 10 61542946b7dSAdrian Chadd 61642946b7dSAdrian Chadd uint16_t quiet_threshold; /* min # of packets */ 617692ad7caSAdrian Chadd uint16_t crc_threshold; 6186607310bSBenjamin Close uint16_t reserved2; 619692ad7caSAdrian Chadd uint32_t max_svc; /* background scans */ 620692ad7caSAdrian Chadd uint32_t pause_svc; /* background scans */ 621efccc3c6SAdrian Chadd #define WPI_PAUSE_MAX_TIME ((1 << 20) - 1) 622efccc3c6SAdrian Chadd #define WPI_PAUSE_SCAN(nbeacons, time) ((nbeacons << 24) | time) 623efccc3c6SAdrian Chadd 6246607310bSBenjamin Close uint32_t flags; 6256607310bSBenjamin Close uint32_t filter; 6266607310bSBenjamin Close 627692ad7caSAdrian Chadd /* Followed by a struct wpi_cmd_data. */ 628692ad7caSAdrian Chadd /* Followed by an array of 4 structs wpi_scan_essid. */ 629692ad7caSAdrian Chadd /* Followed by probe request body. */ 630692ad7caSAdrian Chadd /* Followed by an array of ``nchan'' structs wpi_scan_chan. */ 6316607310bSBenjamin Close } __packed; 6326607310bSBenjamin Close 6336607310bSBenjamin Close struct wpi_scan_chan { 6346607310bSBenjamin Close uint8_t flags; 6356607310bSBenjamin Close #define WPI_CHAN_ACTIVE (1 << 0) 636692ad7caSAdrian Chadd #define WPI_CHAN_NPBREQS(x) (((1 << (x)) - 1) << 1) 637692ad7caSAdrian Chadd 638692ad7caSAdrian Chadd uint8_t chan; 639692ad7caSAdrian Chadd uint8_t rf_gain; 640692ad7caSAdrian Chadd uint8_t dsp_gain; 6416607310bSBenjamin Close uint16_t active; /* msecs */ 6426607310bSBenjamin Close uint16_t passive; /* msecs */ 6436607310bSBenjamin Close } __packed; 6446607310bSBenjamin Close 645692ad7caSAdrian Chadd #define WPI_SCAN_CRC_TH_DEFAULT htole16(1) 646692ad7caSAdrian Chadd #define WPI_SCAN_CRC_TH_NEVER htole16(0xffff) 647692ad7caSAdrian Chadd 648692ad7caSAdrian Chadd /* Maximum size of a scan command. */ 649692ad7caSAdrian Chadd #define WPI_SCAN_MAXSZ (MCLBYTES - 4) 650692ad7caSAdrian Chadd 651692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_TIME_2GHZ (30) /* all times in msec */ 652692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_TIME_5GHZ (20) 653692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_FACTOR_2GHZ ( 3) 654692ad7caSAdrian Chadd #define WPI_ACTIVE_DWELL_FACTOR_5GHZ ( 2) 655692ad7caSAdrian Chadd 656692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_TIME_2GHZ ( 20) 657692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_TIME_5GHZ ( 10) 658692ad7caSAdrian Chadd #define WPI_PASSIVE_DWELL_BASE (100) 65942946b7dSAdrian Chadd #define WPI_CHANNEL_TUNE_TIME ( 6) 660692ad7caSAdrian Chadd 661692ad7caSAdrian Chadd /* Structure for command WPI_CMD_TXPOWER. */ 662692ad7caSAdrian Chadd struct wpi_cmd_txpower { 663692ad7caSAdrian Chadd uint8_t band; 664692ad7caSAdrian Chadd #define WPI_BAND_5GHZ 0 665692ad7caSAdrian Chadd #define WPI_BAND_2GHZ 1 666692ad7caSAdrian Chadd 667692ad7caSAdrian Chadd uint8_t reserved; 668692ad7caSAdrian Chadd uint16_t chan; 669692ad7caSAdrian Chadd 670692ad7caSAdrian Chadd struct { 671692ad7caSAdrian Chadd uint8_t plcp; 672692ad7caSAdrian Chadd uint8_t rf_gain; 673692ad7caSAdrian Chadd uint8_t dsp_gain; 674692ad7caSAdrian Chadd uint8_t reserved; 675692ad7caSAdrian Chadd } __packed rates[WPI_RIDX_MAX + 1]; 676692ad7caSAdrian Chadd 677692ad7caSAdrian Chadd } __packed; 678692ad7caSAdrian Chadd 679692ad7caSAdrian Chadd /* Structure for command WPI_CMD_BT_COEX. */ 6806607310bSBenjamin Close struct wpi_bluetooth { 6816607310bSBenjamin Close uint8_t flags; 682692ad7caSAdrian Chadd #define WPI_BT_COEX_DISABLE 0 683692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_2WIRE 1 684692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_3WIRE 2 685692ad7caSAdrian Chadd #define WPI_BT_COEX_MODE_4WIRE 3 686692ad7caSAdrian Chadd 687692ad7caSAdrian Chadd uint8_t lead_time; 688692ad7caSAdrian Chadd #define WPI_BT_LEAD_TIME_DEF 30 689692ad7caSAdrian Chadd 690692ad7caSAdrian Chadd uint8_t max_kill; 691692ad7caSAdrian Chadd #define WPI_BT_MAX_KILL_DEF 5 692692ad7caSAdrian Chadd 6936607310bSBenjamin Close uint8_t reserved; 694692ad7caSAdrian Chadd uint32_t kill_ack; 695692ad7caSAdrian Chadd uint32_t kill_cts; 6966607310bSBenjamin Close } __packed; 6976607310bSBenjamin Close 698692ad7caSAdrian Chadd /* Structure for WPI_UC_READY notification. */ 6996607310bSBenjamin Close struct wpi_ucode_info { 700692ad7caSAdrian Chadd uint8_t minor; 701692ad7caSAdrian Chadd uint8_t major; 702692ad7caSAdrian Chadd uint16_t reserved1; 7036607310bSBenjamin Close uint8_t revision[8]; 7046607310bSBenjamin Close uint8_t type; 7056607310bSBenjamin Close uint8_t subtype; 706692ad7caSAdrian Chadd uint16_t reserved2; 7076607310bSBenjamin Close uint32_t logptr; 708692ad7caSAdrian Chadd uint32_t errptr; 709692ad7caSAdrian Chadd uint32_t tstamp; 7106607310bSBenjamin Close uint32_t valid; 7116607310bSBenjamin Close } __packed; 7126607310bSBenjamin Close 713692ad7caSAdrian Chadd /* Structure for WPI_START_SCAN notification. */ 7146607310bSBenjamin Close struct wpi_start_scan { 7156607310bSBenjamin Close uint64_t tstamp; 7166607310bSBenjamin Close uint32_t tbeacon; 7176607310bSBenjamin Close uint8_t chan; 7186607310bSBenjamin Close uint8_t band; 7196607310bSBenjamin Close uint16_t reserved; 7206607310bSBenjamin Close uint32_t status; 7216607310bSBenjamin Close } __packed; 7226607310bSBenjamin Close 723692ad7caSAdrian Chadd /* Structure for WPI_STOP_SCAN notification. */ 7246607310bSBenjamin Close struct wpi_stop_scan { 7256607310bSBenjamin Close uint8_t nchan; 7266607310bSBenjamin Close uint8_t status; 7276f506674SAdrian Chadd #define WPI_SCAN_COMPLETED 1 7286f506674SAdrian Chadd #define WPI_SCAN_ABORTED 2 7296f506674SAdrian Chadd 7306607310bSBenjamin Close uint8_t reserved; 7316607310bSBenjamin Close uint8_t chan; 7326607310bSBenjamin Close uint64_t tsf; 7336607310bSBenjamin Close } __packed; 7346607310bSBenjamin Close 735692ad7caSAdrian Chadd /* Structures for WPI_{RX,BEACON}_STATISTICS notification. */ 736692ad7caSAdrian Chadd struct wpi_rx_phy_stats { 737692ad7caSAdrian Chadd uint32_t ina; 738692ad7caSAdrian Chadd uint32_t fina; 739692ad7caSAdrian Chadd uint32_t bad_plcp; 740692ad7caSAdrian Chadd uint32_t bad_crc32; 741692ad7caSAdrian Chadd uint32_t overrun; 742692ad7caSAdrian Chadd uint32_t eoverrun; 743692ad7caSAdrian Chadd uint32_t good_crc32; 744692ad7caSAdrian Chadd uint32_t fa; 745692ad7caSAdrian Chadd uint32_t bad_fina_sync; 746692ad7caSAdrian Chadd uint32_t sfd_timeout; 747692ad7caSAdrian Chadd uint32_t fina_timeout; 748692ad7caSAdrian Chadd uint32_t no_rts_ack; 749692ad7caSAdrian Chadd uint32_t rxe_limit; 750692ad7caSAdrian Chadd uint32_t ack; 751692ad7caSAdrian Chadd uint32_t cts; 752692ad7caSAdrian Chadd } __packed; 753692ad7caSAdrian Chadd 754692ad7caSAdrian Chadd struct wpi_rx_general_stats { 755692ad7caSAdrian Chadd uint32_t bad_cts; 756692ad7caSAdrian Chadd uint32_t bad_ack; 757692ad7caSAdrian Chadd uint32_t not_bss; 758692ad7caSAdrian Chadd uint32_t filtered; 759692ad7caSAdrian Chadd uint32_t bad_chan; 760692ad7caSAdrian Chadd } __packed; 761692ad7caSAdrian Chadd 762692ad7caSAdrian Chadd struct wpi_rx_stats { 763692ad7caSAdrian Chadd struct wpi_rx_phy_stats ofdm; 764692ad7caSAdrian Chadd struct wpi_rx_phy_stats cck; 765692ad7caSAdrian Chadd struct wpi_rx_general_stats general; 766692ad7caSAdrian Chadd } __packed; 767692ad7caSAdrian Chadd 768692ad7caSAdrian Chadd struct wpi_tx_stats { 769692ad7caSAdrian Chadd uint32_t preamble; 770692ad7caSAdrian Chadd uint32_t rx_detected; 771692ad7caSAdrian Chadd uint32_t bt_defer; 772692ad7caSAdrian Chadd uint32_t bt_kill; 773692ad7caSAdrian Chadd uint32_t short_len; 774692ad7caSAdrian Chadd uint32_t cts_timeout; 775692ad7caSAdrian Chadd uint32_t ack_timeout; 776692ad7caSAdrian Chadd uint32_t exp_ack; 777692ad7caSAdrian Chadd uint32_t ack; 778692ad7caSAdrian Chadd } __packed; 779692ad7caSAdrian Chadd 780692ad7caSAdrian Chadd struct wpi_general_stats { 781692ad7caSAdrian Chadd uint32_t temp; 782692ad7caSAdrian Chadd uint32_t burst_check; 783692ad7caSAdrian Chadd uint32_t burst; 784692ad7caSAdrian Chadd uint32_t reserved[4]; 785692ad7caSAdrian Chadd uint32_t sleep; 786692ad7caSAdrian Chadd uint32_t slot_out; 787692ad7caSAdrian Chadd uint32_t slot_idle; 788692ad7caSAdrian Chadd uint32_t ttl_tstamp; 789692ad7caSAdrian Chadd uint32_t tx_ant_a; 790692ad7caSAdrian Chadd uint32_t tx_ant_b; 791692ad7caSAdrian Chadd uint32_t exec; 792692ad7caSAdrian Chadd uint32_t probe; 793692ad7caSAdrian Chadd } __packed; 794692ad7caSAdrian Chadd 795692ad7caSAdrian Chadd struct wpi_stats { 796692ad7caSAdrian Chadd uint32_t flags; 797692ad7caSAdrian Chadd struct wpi_rx_stats rx; 798692ad7caSAdrian Chadd struct wpi_tx_stats tx; 799692ad7caSAdrian Chadd struct wpi_general_stats general; 800692ad7caSAdrian Chadd } __packed; 801692ad7caSAdrian Chadd 802692ad7caSAdrian Chadd /* Possible flags for command WPI_CMD_GET_STATISTICS. */ 803692ad7caSAdrian Chadd #define WPI_STATISTICS_BEACON_DISABLE (1 << 1) 804692ad7caSAdrian Chadd 805692ad7caSAdrian Chadd /* Firmware error dump entry. */ 806692ad7caSAdrian Chadd struct wpi_fw_dump { 807692ad7caSAdrian Chadd uint32_t desc; 808692ad7caSAdrian Chadd uint32_t time; 809692ad7caSAdrian Chadd uint32_t blink[2]; 810692ad7caSAdrian Chadd uint32_t ilink[2]; 811692ad7caSAdrian Chadd uint32_t data; 812692ad7caSAdrian Chadd } __packed; 813692ad7caSAdrian Chadd 814692ad7caSAdrian Chadd /* Firmware image file header. */ 815692ad7caSAdrian Chadd struct wpi_firmware_hdr { 816692ad7caSAdrian Chadd #define WPI_FW_MINVERSION 2144 817692ad7caSAdrian Chadd #define WPI_FW_NAME "wpifw" 818692ad7caSAdrian Chadd 819692ad7caSAdrian Chadd uint16_t driver; 820692ad7caSAdrian Chadd uint8_t minor; 821692ad7caSAdrian Chadd uint8_t major; 822692ad7caSAdrian Chadd uint32_t rtextsz; 823692ad7caSAdrian Chadd uint32_t rdatasz; 824692ad7caSAdrian Chadd uint32_t itextsz; 825692ad7caSAdrian Chadd uint32_t idatasz; 826692ad7caSAdrian Chadd uint32_t btextsz; 827692ad7caSAdrian Chadd } __packed; 828692ad7caSAdrian Chadd 829692ad7caSAdrian Chadd #define WPI_FW_TEXT_MAXSZ ( 80 * 1024 ) 830692ad7caSAdrian Chadd #define WPI_FW_DATA_MAXSZ ( 32 * 1024 ) 831692ad7caSAdrian Chadd #define WPI_FW_BOOT_TEXT_MAXSZ 1024 832692ad7caSAdrian Chadd 833692ad7caSAdrian Chadd #define WPI_FW_UPDATED (1U << 31 ) 834692ad7caSAdrian Chadd 835692ad7caSAdrian Chadd /* 836692ad7caSAdrian Chadd * Offsets into EEPROM. 837692ad7caSAdrian Chadd */ 8386607310bSBenjamin Close #define WPI_EEPROM_MAC 0x015 8396607310bSBenjamin Close #define WPI_EEPROM_REVISION 0x035 840692ad7caSAdrian Chadd #define WPI_EEPROM_SKU_CAP 0x045 8416607310bSBenjamin Close #define WPI_EEPROM_TYPE 0x04a 8426607310bSBenjamin Close #define WPI_EEPROM_DOMAIN 0x060 8436607310bSBenjamin Close #define WPI_EEPROM_BAND1 0x063 8446607310bSBenjamin Close #define WPI_EEPROM_BAND2 0x072 8456607310bSBenjamin Close #define WPI_EEPROM_BAND3 0x080 8466607310bSBenjamin Close #define WPI_EEPROM_BAND4 0x08d 8476607310bSBenjamin Close #define WPI_EEPROM_BAND5 0x099 8486607310bSBenjamin Close #define WPI_EEPROM_POWER_GRP 0x100 8496607310bSBenjamin Close 8506607310bSBenjamin Close struct wpi_eeprom_chan { 8516607310bSBenjamin Close uint8_t flags; 8526607310bSBenjamin Close #define WPI_EEPROM_CHAN_VALID (1 << 0) 8536607310bSBenjamin Close #define WPI_EEPROM_CHAN_IBSS (1 << 1) 8546607310bSBenjamin Close #define WPI_EEPROM_CHAN_ACTIVE (1 << 3) 8556607310bSBenjamin Close #define WPI_EEPROM_CHAN_RADAR (1 << 4) 8566607310bSBenjamin Close 8576607310bSBenjamin Close int8_t maxpwr; 8586607310bSBenjamin Close } __packed; 8596607310bSBenjamin Close 8606607310bSBenjamin Close struct wpi_eeprom_sample { 8616607310bSBenjamin Close uint8_t index; 8626607310bSBenjamin Close int8_t power; 8636607310bSBenjamin Close uint16_t volt; 864692ad7caSAdrian Chadd } __packed; 8656607310bSBenjamin Close 8666607310bSBenjamin Close #define WPI_POWER_GROUPS_COUNT 5 8676607310bSBenjamin Close struct wpi_eeprom_group { 8686607310bSBenjamin Close struct wpi_eeprom_sample samples[5]; 8696607310bSBenjamin Close int32_t coef[5]; 8706607310bSBenjamin Close int32_t corr[5]; 8716607310bSBenjamin Close int8_t maxpwr; 8726607310bSBenjamin Close uint8_t chan; 8736607310bSBenjamin Close int16_t temp; 8746607310bSBenjamin Close } __packed; 8756607310bSBenjamin Close 8766607310bSBenjamin Close #define WPI_CHAN_BANDS_COUNT 5 8776607310bSBenjamin Close #define WPI_MAX_CHAN_PER_BAND 14 8786607310bSBenjamin Close static const struct wpi_chan_band { 8796607310bSBenjamin Close uint32_t addr; /* offset in EEPROM */ 8806607310bSBenjamin Close uint8_t nchan; 8816607310bSBenjamin Close uint8_t chan[WPI_MAX_CHAN_PER_BAND]; 882692ad7caSAdrian Chadd } wpi_bands[] = { 883692ad7caSAdrian Chadd /* 20MHz channels, 2GHz band. */ 8846607310bSBenjamin Close { WPI_EEPROM_BAND1, 14, 8856607310bSBenjamin Close { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } }, 886692ad7caSAdrian Chadd /* 20MHz channels, 5GHz band. */ 8876607310bSBenjamin Close { WPI_EEPROM_BAND2, 13, 8886607310bSBenjamin Close { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } }, 8896607310bSBenjamin Close { WPI_EEPROM_BAND3, 12, 8906607310bSBenjamin Close { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } }, 8916607310bSBenjamin Close { WPI_EEPROM_BAND4, 11, 8926607310bSBenjamin Close { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } }, 8936607310bSBenjamin Close { WPI_EEPROM_BAND5, 6, 8946607310bSBenjamin Close { 145, 149, 153, 157, 161, 165 } } 8956607310bSBenjamin Close }; 8966607310bSBenjamin Close 897692ad7caSAdrian Chadd /* HW rate indices. */ 898692ad7caSAdrian Chadd #define WPI_RIDX_OFDM6 0 899692ad7caSAdrian Chadd #define WPI_RIDX_OFDM36 5 900692ad7caSAdrian Chadd #define WPI_RIDX_OFDM48 6 901692ad7caSAdrian Chadd #define WPI_RIDX_OFDM54 7 902692ad7caSAdrian Chadd #define WPI_RIDX_CCK1 8 903692ad7caSAdrian Chadd #define WPI_RIDX_CCK2 9 904692ad7caSAdrian Chadd #define WPI_RIDX_CCK11 11 905692ad7caSAdrian Chadd 906692ad7caSAdrian Chadd static const uint8_t wpi_ridx_to_plcp[] = { 907692ad7caSAdrian Chadd /* OFDM: IEEE Std 802.11a-1999, pp. 14 Table 80 */ 908692ad7caSAdrian Chadd /* R1-R4 (ral/ural is R4-R1) */ 909692ad7caSAdrian Chadd 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 910692ad7caSAdrian Chadd /* CCK: device-dependent */ 911692ad7caSAdrian Chadd 10, 20, 55, 110 912692ad7caSAdrian Chadd }; 913692ad7caSAdrian Chadd 9146607310bSBenjamin Close #define WPI_MAX_PWR_INDEX 77 9156607310bSBenjamin Close 9166607310bSBenjamin Close /* 9176607310bSBenjamin Close * RF Tx gain values from highest to lowest power (values obtained from 9186607310bSBenjamin Close * the reference driver.) 9196607310bSBenjamin Close */ 9206607310bSBenjamin Close static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 9216607310bSBenjamin Close 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 9226607310bSBenjamin Close 0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3, 9236607310bSBenjamin Close 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb, 9246607310bSBenjamin Close 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b, 9256607310bSBenjamin Close 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3, 9266607310bSBenjamin Close 0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63, 9276607310bSBenjamin Close 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03, 9286607310bSBenjamin Close 0x03 9296607310bSBenjamin Close }; 9306607310bSBenjamin Close 9316607310bSBenjamin Close static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 9326607310bSBenjamin Close 0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b, 9336607310bSBenjamin Close 0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b, 9346607310bSBenjamin Close 0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33, 9356607310bSBenjamin Close 0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b, 9366607310bSBenjamin Close 0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b, 9376607310bSBenjamin Close 0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63, 9386607310bSBenjamin Close 0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 9396607310bSBenjamin Close 0x03 9406607310bSBenjamin Close }; 9416607310bSBenjamin Close 9426607310bSBenjamin Close /* 9436607310bSBenjamin Close * DSP pre-DAC gain values from highest to lowest power (values obtained 9446607310bSBenjamin Close * from the reference driver.) 9456607310bSBenjamin Close */ 9466607310bSBenjamin Close static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 9476607310bSBenjamin Close 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c, 9486607310bSBenjamin Close 0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b, 9496607310bSBenjamin Close 0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d, 9506607310bSBenjamin Close 0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74, 9516607310bSBenjamin Close 0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71, 9526607310bSBenjamin Close 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 9536607310bSBenjamin Close 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 9546607310bSBenjamin Close 0x5f 9556607310bSBenjamin Close }; 9566607310bSBenjamin Close 9576607310bSBenjamin Close static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 9586607310bSBenjamin Close 0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b, 9596607310bSBenjamin Close 0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62, 9606607310bSBenjamin Close 0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f, 9616607310bSBenjamin Close 0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78, 9626607310bSBenjamin Close 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 9636607310bSBenjamin Close 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78, 9646607310bSBenjamin Close 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 9656607310bSBenjamin Close 0x78 9666607310bSBenjamin Close }; 9676607310bSBenjamin Close 968692ad7caSAdrian Chadd /* 969692ad7caSAdrian Chadd * Power saving settings (values obtained from the reference driver.) 970692ad7caSAdrian Chadd */ 971692ad7caSAdrian Chadd #define WPI_NDTIMRANGES 2 972692ad7caSAdrian Chadd #define WPI_NPOWERLEVELS 6 973692ad7caSAdrian Chadd static const struct wpi_pmgt { 974692ad7caSAdrian Chadd uint32_t rxtimeout; 975692ad7caSAdrian Chadd uint32_t txtimeout; 976692ad7caSAdrian Chadd uint32_t intval[5]; 977525a3d47SAdrian Chadd uint8_t skip_dtim; 978692ad7caSAdrian Chadd } wpi_pmgt[WPI_NDTIMRANGES][WPI_NPOWERLEVELS] = { 979692ad7caSAdrian Chadd /* DTIM <= 10 */ 980692ad7caSAdrian Chadd { 981692ad7caSAdrian Chadd { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ 982692ad7caSAdrian Chadd { 200, 500, { 1, 2, 3, 4, 4 }, 0 }, /* PS level 1 */ 983692ad7caSAdrian Chadd { 200, 300, { 2, 4, 6, 7, 7 }, 0 }, /* PS level 2 */ 984692ad7caSAdrian Chadd { 50, 100, { 2, 6, 9, 9, 10 }, 0 }, /* PS level 3 */ 985692ad7caSAdrian Chadd { 50, 25, { 2, 7, 9, 9, 10 }, 1 }, /* PS level 4 */ 986692ad7caSAdrian Chadd { 25, 25, { 4, 7, 10, 10, 10 }, 1 } /* PS level 5 */ 987692ad7caSAdrian Chadd }, 988692ad7caSAdrian Chadd /* DTIM >= 11 */ 989692ad7caSAdrian Chadd { 990692ad7caSAdrian Chadd { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ 991692ad7caSAdrian Chadd { 200, 500, { 1, 2, 3, 4, -1 }, 0 }, /* PS level 1 */ 992692ad7caSAdrian Chadd { 200, 300, { 2, 4, 6, 7, -1 }, 0 }, /* PS level 2 */ 993692ad7caSAdrian Chadd { 50, 100, { 2, 6, 9, 9, -1 }, 0 }, /* PS level 3 */ 994692ad7caSAdrian Chadd { 50, 25, { 2, 7, 9, 9, -1 }, 0 }, /* PS level 4 */ 995692ad7caSAdrian Chadd { 25, 25, { 4, 7, 10, 10, -1 }, 0 } /* PS level 5 */ 996692ad7caSAdrian Chadd } 997692ad7caSAdrian Chadd }; 998692ad7caSAdrian Chadd 999692ad7caSAdrian Chadd /* Firmware errors. */ 1000692ad7caSAdrian Chadd static const char * const wpi_fw_errmsg[] = { 1001692ad7caSAdrian Chadd "OK", 1002692ad7caSAdrian Chadd "FAIL", 1003692ad7caSAdrian Chadd "BAD_PARAM", 1004692ad7caSAdrian Chadd "BAD_CHECKSUM", 1005692ad7caSAdrian Chadd "NMI_INTERRUPT", 1006692ad7caSAdrian Chadd "SYSASSERT", 1007692ad7caSAdrian Chadd "FATAL_ERROR" 1008692ad7caSAdrian Chadd }; 1009692ad7caSAdrian Chadd 10106607310bSBenjamin Close #define WPI_READ(sc, reg) \ 10116607310bSBenjamin Close bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 10126607310bSBenjamin Close 10136607310bSBenjamin Close #define WPI_WRITE(sc, reg, val) \ 10146607310bSBenjamin Close bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 10156607310bSBenjamin Close 10166607310bSBenjamin Close #define WPI_WRITE_REGION_4(sc, offset, datap, count) \ 10176607310bSBenjamin Close bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ 10186607310bSBenjamin Close (datap), (count)) 1019692ad7caSAdrian Chadd 1020692ad7caSAdrian Chadd #define WPI_SETBITS(sc, reg, mask) \ 1021692ad7caSAdrian Chadd WPI_WRITE(sc, reg, WPI_READ(sc, reg) | (mask)) 1022692ad7caSAdrian Chadd 1023692ad7caSAdrian Chadd #define WPI_CLRBITS(sc, reg, mask) \ 1024692ad7caSAdrian Chadd WPI_WRITE(sc, reg, WPI_READ(sc, reg) & ~(mask)) 1025692ad7caSAdrian Chadd 1026692ad7caSAdrian Chadd #define WPI_BARRIER_WRITE(sc) \ 1027692ad7caSAdrian Chadd bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ 1028692ad7caSAdrian Chadd BUS_SPACE_BARRIER_WRITE) 1029692ad7caSAdrian Chadd 1030692ad7caSAdrian Chadd #define WPI_BARRIER_READ_WRITE(sc) \ 1031692ad7caSAdrian Chadd bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ 1032692ad7caSAdrian Chadd BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE) 1033