17832b1f6SBernhard Schmidt /* $OpenBSD: if_iwnreg.h,v 1.40 2010/05/05 19:41:57 damien Exp $ */ 23971d07bSSam Leffler 33971d07bSSam Leffler /*- 48f302007SRui Paulo * Copyright (c) 2007, 2008 53971d07bSSam Leffler * Damien Bergamini <damien.bergamini@free.fr> 63971d07bSSam Leffler * 73971d07bSSam Leffler * Permission to use, copy, modify, and distribute this software for any 83971d07bSSam Leffler * purpose with or without fee is hereby granted, provided that the above 93971d07bSSam Leffler * copyright notice and this permission notice appear in all copies. 103971d07bSSam Leffler * 113971d07bSSam Leffler * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 123971d07bSSam Leffler * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 133971d07bSSam Leffler * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 143971d07bSSam Leffler * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 153971d07bSSam Leffler * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 163971d07bSSam Leffler * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 173971d07bSSam Leffler * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 183971d07bSSam Leffler */ 19b876a4a3SAdrian Chadd #ifndef __IF_IWNREG_H__ 20b876a4a3SAdrian Chadd #define __IF_IWNREG_H__ 213971d07bSSam Leffler 22f8639279SAdrian Chadd #define IWN_CT_KILL_THRESHOLD 114 /* in Celsius */ 23f8639279SAdrian Chadd #define IWN_CT_KILL_EXIT_THRESHOLD 95 /* in Celsius */ 24f8639279SAdrian Chadd 253971d07bSSam Leffler #define IWN_TX_RING_COUNT 256 268f302007SRui Paulo #define IWN_TX_RING_LOMARK 192 278f302007SRui Paulo #define IWN_TX_RING_HIMARK 224 288f302007SRui Paulo #define IWN_RX_RING_COUNT_LOG 6 298f302007SRui Paulo #define IWN_RX_RING_COUNT (1 << IWN_RX_RING_COUNT_LOG) 303971d07bSSam Leffler 318f302007SRui Paulo #define IWN4965_NTXQUEUES 16 328f302007SRui Paulo #define IWN5000_NTXQUEUES 20 333971d07bSSam Leffler 3497fadf57SBernhard Schmidt #define IWN4965_FIRSTAGGQUEUE 7 3597fadf57SBernhard Schmidt #define IWN5000_FIRSTAGGQUEUE 10 3697fadf57SBernhard Schmidt 378f302007SRui Paulo #define IWN4965_NDMACHNLS 7 388f302007SRui Paulo #define IWN5000_NDMACHNLS 8 393971d07bSSam Leffler 408f302007SRui Paulo #define IWN_SRVC_DMACHNL 9 418f302007SRui Paulo 420f454b93SRui Paulo #define IWN_ICT_SIZE 4096 430f454b93SRui Paulo #define IWN_ICT_COUNT (IWN_ICT_SIZE / sizeof (uint32_t)) 440f454b93SRui Paulo 45f8639279SAdrian Chadd /* For cards with PAN command, default is IWN_CMD_QUEUE_NUM */ 46f8639279SAdrian Chadd #define IWN_CMD_QUEUE_NUM 4 47f8639279SAdrian Chadd #define IWN_PAN_CMD_QUEUE 9 48f8639279SAdrian Chadd 498f302007SRui Paulo /* Maximum number of DMA segments for TX. */ 503971d07bSSam Leffler #define IWN_MAX_SCATTER 20 513971d07bSSam Leffler 528f302007SRui Paulo /* RX buffers must be large enough to hold a full 4K A-MPDU. */ 533971d07bSSam Leffler #define IWN_RBUF_SIZE (4 * 1024) 543971d07bSSam Leffler 558f302007SRui Paulo #if defined(__LP64__) 568f302007SRui Paulo /* HW supports 36-bit DMA addresses. */ 578f302007SRui Paulo #define IWN_LOADDR(paddr) ((uint32_t)(paddr)) 588f302007SRui Paulo #define IWN_HIADDR(paddr) (((paddr) >> 32) & 0xf) 598f302007SRui Paulo #else 608f302007SRui Paulo #define IWN_LOADDR(paddr) (paddr) 618f302007SRui Paulo #define IWN_HIADDR(paddr) (0) 628f302007SRui Paulo #endif 638f302007SRui Paulo 643971d07bSSam Leffler /* 653971d07bSSam Leffler * Control and status registers. 663971d07bSSam Leffler */ 678f302007SRui Paulo #define IWN_HW_IF_CONFIG 0x000 688f302007SRui Paulo #define IWN_INT_COALESCING 0x004 690f454b93SRui Paulo #define IWN_INT_PERIODIC 0x005 /* use IWN_WRITE_1 */ 708f302007SRui Paulo #define IWN_INT 0x008 710f454b93SRui Paulo #define IWN_INT_MASK 0x00c 728f302007SRui Paulo #define IWN_FH_INT 0x010 7338b1a25dSAdrian Chadd #define IWN_GPIO_IN 0x018 /* read external chip pins */ 743971d07bSSam Leffler #define IWN_RESET 0x020 758f302007SRui Paulo #define IWN_GP_CNTRL 0x024 768f302007SRui Paulo #define IWN_HW_REV 0x028 778f302007SRui Paulo #define IWN_EEPROM 0x02c 788f302007SRui Paulo #define IWN_EEPROM_GP 0x030 798f302007SRui Paulo #define IWN_OTP_GP 0x034 808f302007SRui Paulo #define IWN_GIO 0x03c 8138b1a25dSAdrian Chadd #define IWN_GP_UCODE 0x048 820f454b93SRui Paulo #define IWN_GP_DRIVER 0x050 8338b1a25dSAdrian Chadd #define IWN_UCODE_GP1 0x054 8438b1a25dSAdrian Chadd #define IWN_UCODE_GP1_SET 0x058 858f302007SRui Paulo #define IWN_UCODE_GP1_CLR 0x05c 8638b1a25dSAdrian Chadd #define IWN_UCODE_GP2 0x060 878f302007SRui Paulo #define IWN_LED 0x094 880f454b93SRui Paulo #define IWN_DRAM_INT_TBL 0x0a0 899dd0e40bSBernhard Schmidt #define IWN_SHADOW_REG_CTRL 0x0a8 908f302007SRui Paulo #define IWN_GIO_CHICKEN 0x100 918f302007SRui Paulo #define IWN_ANA_PLL 0x20c 920f454b93SRui Paulo #define IWN_HW_REV_WA 0x22c 938f302007SRui Paulo #define IWN_DBG_HPET_MEM 0x240 940f454b93SRui Paulo #define IWN_DBG_LINK_PWR_MGMT 0x250 9538b1a25dSAdrian Chadd /* Need nic_lock for use above */ 968f302007SRui Paulo #define IWN_MEM_RADDR 0x40c 973971d07bSSam Leffler #define IWN_MEM_WADDR 0x410 983971d07bSSam Leffler #define IWN_MEM_WDATA 0x418 998f302007SRui Paulo #define IWN_MEM_RDATA 0x41c 100f8639279SAdrian Chadd #define IWN_TARG_MBX_C 0x430 1018f302007SRui Paulo #define IWN_PRPH_WADDR 0x444 1028f302007SRui Paulo #define IWN_PRPH_RADDR 0x448 1038f302007SRui Paulo #define IWN_PRPH_WDATA 0x44c 1048f302007SRui Paulo #define IWN_PRPH_RDATA 0x450 1058f302007SRui Paulo #define IWN_HBUS_TARG_WRPTR 0x460 1063971d07bSSam Leffler 1078f302007SRui Paulo /* 1088f302007SRui Paulo * Flow-Handler registers. 1098f302007SRui Paulo */ 1108f302007SRui Paulo #define IWN_FH_TFBD_CTRL0(qid) (0x1900 + (qid) * 8) 1118f302007SRui Paulo #define IWN_FH_TFBD_CTRL1(qid) (0x1904 + (qid) * 8) 1128f302007SRui Paulo #define IWN_FH_KW_ADDR 0x197c 1138f302007SRui Paulo #define IWN_FH_SRAM_ADDR(qid) (0x19a4 + (qid) * 4) 1148f302007SRui Paulo #define IWN_FH_CBBC_QUEUE(qid) (0x19d0 + (qid) * 4) 1158f302007SRui Paulo #define IWN_FH_STATUS_WPTR 0x1bc0 1168f302007SRui Paulo #define IWN_FH_RX_BASE 0x1bc4 1178f302007SRui Paulo #define IWN_FH_RX_WPTR 0x1bc8 1188f302007SRui Paulo #define IWN_FH_RX_CONFIG 0x1c00 1198f302007SRui Paulo #define IWN_FH_RX_STATUS 0x1c44 1208f302007SRui Paulo #define IWN_FH_TX_CONFIG(qid) (0x1d00 + (qid) * 32) 1218f302007SRui Paulo #define IWN_FH_TXBUF_STATUS(qid) (0x1d08 + (qid) * 32) 1228f302007SRui Paulo #define IWN_FH_TX_CHICKEN 0x1e98 1238f302007SRui Paulo #define IWN_FH_TX_STATUS 0x1eb0 1243971d07bSSam Leffler 1258f302007SRui Paulo /* 1268f302007SRui Paulo * TX scheduler registers. 1278f302007SRui Paulo */ 1288f302007SRui Paulo #define IWN_SCHED_BASE 0xa02c00 1298f302007SRui Paulo #define IWN_SCHED_SRAM_ADDR (IWN_SCHED_BASE + 0x000) 1308f302007SRui Paulo #define IWN5000_SCHED_DRAM_ADDR (IWN_SCHED_BASE + 0x008) 1318f302007SRui Paulo #define IWN4965_SCHED_DRAM_ADDR (IWN_SCHED_BASE + 0x010) 1328f302007SRui Paulo #define IWN5000_SCHED_TXFACT (IWN_SCHED_BASE + 0x010) 1338f302007SRui Paulo #define IWN4965_SCHED_TXFACT (IWN_SCHED_BASE + 0x01c) 1348f302007SRui Paulo #define IWN4965_SCHED_QUEUE_RDPTR(qid) (IWN_SCHED_BASE + 0x064 + (qid) * 4) 1358f302007SRui Paulo #define IWN5000_SCHED_QUEUE_RDPTR(qid) (IWN_SCHED_BASE + 0x068 + (qid) * 4) 1368f302007SRui Paulo #define IWN4965_SCHED_QCHAIN_SEL (IWN_SCHED_BASE + 0x0d0) 1378f302007SRui Paulo #define IWN4965_SCHED_INTR_MASK (IWN_SCHED_BASE + 0x0e4) 1388f302007SRui Paulo #define IWN5000_SCHED_QCHAIN_SEL (IWN_SCHED_BASE + 0x0e8) 1398f302007SRui Paulo #define IWN4965_SCHED_QUEUE_STATUS(qid) (IWN_SCHED_BASE + 0x104 + (qid) * 4) 1408f302007SRui Paulo #define IWN5000_SCHED_INTR_MASK (IWN_SCHED_BASE + 0x108) 1418f302007SRui Paulo #define IWN5000_SCHED_QUEUE_STATUS(qid) (IWN_SCHED_BASE + 0x10c + (qid) * 4) 1428f302007SRui Paulo #define IWN5000_SCHED_AGGR_SEL (IWN_SCHED_BASE + 0x248) 1438f302007SRui Paulo 1448f302007SRui Paulo /* 1458f302007SRui Paulo * Offsets in TX scheduler's SRAM. 1468f302007SRui Paulo */ 1478f302007SRui Paulo #define IWN4965_SCHED_CTX_OFF 0x380 1488f302007SRui Paulo #define IWN4965_SCHED_CTX_LEN 416 1498f302007SRui Paulo #define IWN4965_SCHED_QUEUE_OFFSET(qid) (0x380 + (qid) * 8) 1508f302007SRui Paulo #define IWN4965_SCHED_TRANS_TBL(qid) (0x500 + (qid) * 2) 1518f302007SRui Paulo #define IWN5000_SCHED_CTX_OFF 0x600 1528f302007SRui Paulo #define IWN5000_SCHED_CTX_LEN 520 1538f302007SRui Paulo #define IWN5000_SCHED_QUEUE_OFFSET(qid) (0x600 + (qid) * 8) 1548f302007SRui Paulo #define IWN5000_SCHED_TRANS_TBL(qid) (0x7e0 + (qid) * 2) 1553971d07bSSam Leffler 1563971d07bSSam Leffler /* 1573971d07bSSam Leffler * NIC internal memory offsets. 1583971d07bSSam Leffler */ 1590f454b93SRui Paulo #define IWN_APMG_CLK_CTRL 0x3000 1600f454b93SRui Paulo #define IWN_APMG_CLK_EN 0x3004 1618f302007SRui Paulo #define IWN_APMG_CLK_DIS 0x3008 1628f302007SRui Paulo #define IWN_APMG_PS 0x300c 1630f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR 0x3058 1640f454b93SRui Paulo #define IWN_APMG_ANALOG_SVR 0x306c 1658f302007SRui Paulo #define IWN_APMG_PCI_STT 0x3010 1668f302007SRui Paulo #define IWN_BSM_WR_CTRL 0x3400 1678f302007SRui Paulo #define IWN_BSM_WR_MEM_SRC 0x3404 1688f302007SRui Paulo #define IWN_BSM_WR_MEM_DST 0x3408 1698f302007SRui Paulo #define IWN_BSM_WR_DWCOUNT 0x340c 1708f302007SRui Paulo #define IWN_BSM_DRAM_TEXT_ADDR 0x3490 1718f302007SRui Paulo #define IWN_BSM_DRAM_TEXT_SIZE 0x3494 1728f302007SRui Paulo #define IWN_BSM_DRAM_DATA_ADDR 0x3498 1738f302007SRui Paulo #define IWN_BSM_DRAM_DATA_SIZE 0x349c 1748f302007SRui Paulo #define IWN_BSM_SRAM_BASE 0x3800 1753971d07bSSam Leffler 1768f302007SRui Paulo /* Possible flags for register IWN_HW_IF_CONFIG. */ 1778f302007SRui Paulo #define IWN_HW_IF_CONFIG_4965_R (1 << 4) 1788f302007SRui Paulo #define IWN_HW_IF_CONFIG_MAC_SI (1 << 8) 1798f302007SRui Paulo #define IWN_HW_IF_CONFIG_RADIO_SI (1 << 9) 1808f302007SRui Paulo #define IWN_HW_IF_CONFIG_EEPROM_LOCKED (1 << 21) 1818f302007SRui Paulo #define IWN_HW_IF_CONFIG_NIC_READY (1 << 22) 1828f302007SRui Paulo #define IWN_HW_IF_CONFIG_HAP_WAKE_L1A (1 << 23) 1838f302007SRui Paulo #define IWN_HW_IF_CONFIG_PREPARE_DONE (1 << 25) 1848f302007SRui Paulo #define IWN_HW_IF_CONFIG_PREPARE (1 << 27) 1853971d07bSSam Leffler 1860f454b93SRui Paulo /* Possible values for register IWN_INT_PERIODIC. */ 1870f454b93SRui Paulo #define IWN_INT_PERIODIC_DIS 0x00 1880f454b93SRui Paulo #define IWN_INT_PERIODIC_ENA 0xff 1890f454b93SRui Paulo 1908f302007SRui Paulo /* Possible flags for registers IWN_PRPH_RADDR/IWN_PRPH_WADDR. */ 1918f302007SRui Paulo #define IWN_PRPH_DWORD ((sizeof (uint32_t) - 1) << 24) 1923971d07bSSam Leffler 1938f302007SRui Paulo /* Possible values for IWN_BSM_WR_MEM_DST. */ 1948f302007SRui Paulo #define IWN_FW_TEXT_BASE 0x00000000 1958f302007SRui Paulo #define IWN_FW_DATA_BASE 0x00800000 1963971d07bSSam Leffler 1978f302007SRui Paulo /* Possible flags for register IWN_RESET. */ 1988f302007SRui Paulo #define IWN_RESET_NEVO (1 << 0) 1998f302007SRui Paulo #define IWN_RESET_SW (1 << 7) 2008f302007SRui Paulo #define IWN_RESET_MASTER_DISABLED (1 << 8) 2018f302007SRui Paulo #define IWN_RESET_STOP_MASTER (1 << 9) 2027a22215cSEitan Adler #define IWN_RESET_LINK_PWR_MGMT_DIS (1U << 31) 2033971d07bSSam Leffler 2048f302007SRui Paulo /* Possible flags for register IWN_GP_CNTRL. */ 2058f302007SRui Paulo #define IWN_GP_CNTRL_MAC_ACCESS_ENA (1 << 0) 2068f302007SRui Paulo #define IWN_GP_CNTRL_MAC_CLOCK_READY (1 << 0) 2078f302007SRui Paulo #define IWN_GP_CNTRL_INIT_DONE (1 << 2) 2088f302007SRui Paulo #define IWN_GP_CNTRL_MAC_ACCESS_REQ (1 << 3) 2098f302007SRui Paulo #define IWN_GP_CNTRL_SLEEP (1 << 4) 2108f302007SRui Paulo #define IWN_GP_CNTRL_RFKILL (1 << 27) 2113971d07bSSam Leffler 2128f302007SRui Paulo /* Possible flags for register IWN_GIO_CHICKEN. */ 2138f302007SRui Paulo #define IWN_GIO_CHICKEN_L1A_NO_L0S_RX (1 << 23) 2148f302007SRui Paulo #define IWN_GIO_CHICKEN_DIS_L0S_TIMER (1 << 29) 2153971d07bSSam Leffler 2168f302007SRui Paulo /* Possible flags for register IWN_GIO. */ 2178f302007SRui Paulo #define IWN_GIO_L0S_ENA (1 << 1) 2183971d07bSSam Leffler 2190f454b93SRui Paulo /* Possible flags for register IWN_GP_DRIVER. */ 2200f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_3X3_HYB (0 << 0) 2210f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_2X2_HYB (1 << 0) 2220f454b93SRui Paulo #define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0) 2237373959eSBernhard Schmidt #define IWN_GP_DRIVER_CALIB_VER6 (1 << 2) 2249dd0e40bSBernhard Schmidt #define IWN_GP_DRIVER_6050_1X2 (1 << 3) 225f8639279SAdrian Chadd #define IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT (1 << 7) 2264cfb1a08SAdrian Chadd #define IWN_GP_DRIVER_NONE 0 2270f454b93SRui Paulo 2288f302007SRui Paulo /* Possible flags for register IWN_UCODE_GP1_CLR. */ 2298f302007SRui Paulo #define IWN_UCODE_GP1_RFKILL (1 << 1) 2308f302007SRui Paulo #define IWN_UCODE_GP1_CMD_BLOCKED (1 << 2) 2318f302007SRui Paulo #define IWN_UCODE_GP1_CTEMP_STOP_RF (1 << 3) 232f8639279SAdrian Chadd #define IWN_UCODE_GP1_CFG_COMPLETE (1 << 5) 2333971d07bSSam Leffler 2348f302007SRui Paulo /* Possible flags/values for register IWN_LED. */ 2358f302007SRui Paulo #define IWN_LED_BSM_CTRL (1 << 5) 2368f302007SRui Paulo #define IWN_LED_OFF 0x00000038 2378f302007SRui Paulo #define IWN_LED_ON 0x00000078 2383971d07bSSam Leffler 239f8639279SAdrian Chadd #define IWN_MAX_BLINK_TBL 10 240f8639279SAdrian Chadd #define IWN_LED_STATIC_ON 0 241f8639279SAdrian Chadd #define IWN_LED_STATIC_OFF 1 242f8639279SAdrian Chadd #define IWN_LED_SLOW_BLINK 2 243f8639279SAdrian Chadd #define IWN_LED_INT_BLINK 3 244f8639279SAdrian Chadd #define IWN_LED_UNIT 0x1388 /* 5 ms */ 245f8639279SAdrian Chadd 246f8639279SAdrian Chadd static const struct { 247f8639279SAdrian Chadd uint16_t tpt; /* Mb/s */ 248f8639279SAdrian Chadd uint8_t on_time; 249f8639279SAdrian Chadd uint8_t off_time; 250f8639279SAdrian Chadd } blink_tbl[] = 251f8639279SAdrian Chadd { 252f8639279SAdrian Chadd {300, 5, 5}, 253f8639279SAdrian Chadd {200, 8, 8}, 254f8639279SAdrian Chadd {100, 11, 11}, 255f8639279SAdrian Chadd {70, 13, 13}, 256f8639279SAdrian Chadd {50, 15, 15}, 257f8639279SAdrian Chadd {20, 17, 17}, 258f8639279SAdrian Chadd {10, 19, 19}, 259f8639279SAdrian Chadd {5, 22, 22}, 260f8639279SAdrian Chadd {1, 26, 26}, 261f8639279SAdrian Chadd {0, 33, 33}, 262f8639279SAdrian Chadd /* SOLID_ON */ 263f8639279SAdrian Chadd }; 264f8639279SAdrian Chadd 2650f454b93SRui Paulo /* Possible flags for register IWN_DRAM_INT_TBL. */ 2660f454b93SRui Paulo #define IWN_DRAM_INT_TBL_WRAP_CHECK (1 << 27) 2677a22215cSEitan Adler #define IWN_DRAM_INT_TBL_ENABLE (1U << 31) 2680f454b93SRui Paulo 2698f302007SRui Paulo /* Possible values for register IWN_ANA_PLL. */ 2708f302007SRui Paulo #define IWN_ANA_PLL_INIT 0x00880300 2713971d07bSSam Leffler 2728f302007SRui Paulo /* Possible flags for register IWN_FH_RX_STATUS. */ 2738f302007SRui Paulo #define IWN_FH_RX_STATUS_IDLE (1 << 24) 2743971d07bSSam Leffler 2758f302007SRui Paulo /* Possible flags for register IWN_BSM_WR_CTRL. */ 2768f302007SRui Paulo #define IWN_BSM_WR_CTRL_START_EN (1 << 30) 2777a22215cSEitan Adler #define IWN_BSM_WR_CTRL_START (1U << 31) 2783971d07bSSam Leffler 2798f302007SRui Paulo /* Possible flags for register IWN_INT. */ 2808f302007SRui Paulo #define IWN_INT_ALIVE (1 << 0) 2818f302007SRui Paulo #define IWN_INT_WAKEUP (1 << 1) 2828f302007SRui Paulo #define IWN_INT_SW_RX (1 << 3) 2838f302007SRui Paulo #define IWN_INT_CT_REACHED (1 << 6) 2848f302007SRui Paulo #define IWN_INT_RF_TOGGLED (1 << 7) 2858f302007SRui Paulo #define IWN_INT_SW_ERR (1 << 25) 2860f454b93SRui Paulo #define IWN_INT_SCHED (1 << 26) 2878f302007SRui Paulo #define IWN_INT_FH_TX (1 << 27) 2880f454b93SRui Paulo #define IWN_INT_RX_PERIODIC (1 << 28) 2898f302007SRui Paulo #define IWN_INT_HW_ERR (1 << 29) 2907a22215cSEitan Adler #define IWN_INT_FH_RX (1U << 31) 2913971d07bSSam Leffler 2928f302007SRui Paulo /* Shortcut. */ 2930f454b93SRui Paulo #define IWN_INT_MASK_DEF \ 2948f302007SRui Paulo (IWN_INT_SW_ERR | IWN_INT_HW_ERR | IWN_INT_FH_TX | \ 2958f302007SRui Paulo IWN_INT_FH_RX | IWN_INT_ALIVE | IWN_INT_WAKEUP | \ 2968f302007SRui Paulo IWN_INT_SW_RX | IWN_INT_CT_REACHED | IWN_INT_RF_TOGGLED) 2973971d07bSSam Leffler 2988f302007SRui Paulo /* Possible flags for register IWN_FH_INT. */ 2998f302007SRui Paulo #define IWN_FH_INT_TX_CHNL(x) (1 << (x)) 3008f302007SRui Paulo #define IWN_FH_INT_RX_CHNL(x) (1 << ((x) + 16)) 3018f302007SRui Paulo #define IWN_FH_INT_HI_PRIOR (1 << 30) 3028f302007SRui Paulo /* Shortcuts for the above. */ 3038f302007SRui Paulo #define IWN_FH_INT_TX \ 3048f302007SRui Paulo (IWN_FH_INT_TX_CHNL(0) | IWN_FH_INT_TX_CHNL(1)) 3058f302007SRui Paulo #define IWN_FH_INT_RX \ 3068f302007SRui Paulo (IWN_FH_INT_RX_CHNL(0) | IWN_FH_INT_RX_CHNL(1) | IWN_FH_INT_HI_PRIOR) 3073971d07bSSam Leffler 3088f302007SRui Paulo /* Possible flags/values for register IWN_FH_TX_CONFIG. */ 3098f302007SRui Paulo #define IWN_FH_TX_CONFIG_DMA_PAUSE 0 3107a22215cSEitan Adler #define IWN_FH_TX_CONFIG_DMA_ENA (1U << 31) 3118f302007SRui Paulo #define IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD (1 << 20) 3123971d07bSSam Leffler 3138f302007SRui Paulo /* Possible flags/values for register IWN_FH_TXBUF_STATUS. */ 3148f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TBNUM(x) ((x) << 20) 3158f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TBIDX(x) ((x) << 12) 3168f302007SRui Paulo #define IWN_FH_TXBUF_STATUS_TFBD_VALID 3 3178f302007SRui Paulo 3188f302007SRui Paulo /* Possible flags for register IWN_FH_TX_CHICKEN. */ 3198f302007SRui Paulo #define IWN_FH_TX_CHICKEN_SCHED_RETRY (1 << 1) 3208f302007SRui Paulo 3218f302007SRui Paulo /* Possible flags for register IWN_FH_TX_STATUS. */ 32269e775c3SBernhard Schmidt #define IWN_FH_TX_STATUS_IDLE(chnl) (1 << ((chnl) + 16)) 3238f302007SRui Paulo 3248f302007SRui Paulo /* Possible flags for register IWN_FH_RX_CONFIG. */ 3257a22215cSEitan Adler #define IWN_FH_RX_CONFIG_ENA (1U << 31) 3268f302007SRui Paulo #define IWN_FH_RX_CONFIG_NRBD(x) ((x) << 20) 3278f302007SRui Paulo #define IWN_FH_RX_CONFIG_RB_SIZE_8K (1 << 16) 3288f302007SRui Paulo #define IWN_FH_RX_CONFIG_SINGLE_FRAME (1 << 15) 3298f302007SRui Paulo #define IWN_FH_RX_CONFIG_IRQ_DST_HOST (1 << 12) 3308f302007SRui Paulo #define IWN_FH_RX_CONFIG_RB_TIMEOUT(x) ((x) << 4) 3318f302007SRui Paulo #define IWN_FH_RX_CONFIG_IGN_RXF_EMPTY (1 << 2) 3328f302007SRui Paulo 3338f302007SRui Paulo /* Possible flags for register IWN_FH_TX_CONFIG. */ 3347a22215cSEitan Adler #define IWN_FH_TX_CONFIG_DMA_ENA (1U << 31) 3358f302007SRui Paulo #define IWN_FH_TX_CONFIG_DMA_CREDIT_ENA (1 << 3) 3368f302007SRui Paulo 3378f302007SRui Paulo /* Possible flags for register IWN_EEPROM. */ 3388f302007SRui Paulo #define IWN_EEPROM_READ_VALID (1 << 0) 3398f302007SRui Paulo #define IWN_EEPROM_CMD (1 << 1) 3408f302007SRui Paulo 3418f302007SRui Paulo /* Possible flags for register IWN_EEPROM_GP. */ 3428f302007SRui Paulo #define IWN_EEPROM_GP_IF_OWNER 0x00000180 3438f302007SRui Paulo 3448f302007SRui Paulo /* Possible flags for register IWN_OTP_GP. */ 3458f302007SRui Paulo #define IWN_OTP_GP_DEV_SEL_OTP (1 << 16) 3468f302007SRui Paulo #define IWN_OTP_GP_RELATIVE_ACCESS (1 << 17) 3478f302007SRui Paulo #define IWN_OTP_GP_ECC_CORR_STTS (1 << 20) 3488f302007SRui Paulo #define IWN_OTP_GP_ECC_UNCORR_STTS (1 << 21) 3498f302007SRui Paulo 3508f302007SRui Paulo /* Possible flags for register IWN_SCHED_QUEUE_STATUS. */ 3518f302007SRui Paulo #define IWN4965_TXQ_STATUS_ACTIVE 0x0007fc01 3528f302007SRui Paulo #define IWN4965_TXQ_STATUS_INACTIVE 0x0007fc00 3538f302007SRui Paulo #define IWN4965_TXQ_STATUS_AGGR_ENA (1 << 5 | 1 << 8) 3548f302007SRui Paulo #define IWN4965_TXQ_STATUS_CHGACT (1 << 10) 3558f302007SRui Paulo #define IWN5000_TXQ_STATUS_ACTIVE 0x00ff0018 3568f302007SRui Paulo #define IWN5000_TXQ_STATUS_INACTIVE 0x00ff0010 3578f302007SRui Paulo #define IWN5000_TXQ_STATUS_CHGACT (1 << 19) 3588f302007SRui Paulo 3590f454b93SRui Paulo /* Possible flags for registers IWN_APMG_CLK_*. */ 3608f302007SRui Paulo #define IWN_APMG_CLK_CTRL_DMA_CLK_RQT (1 << 9) 3618f302007SRui Paulo #define IWN_APMG_CLK_CTRL_BSM_CLK_RQT (1 << 11) 3628f302007SRui Paulo 3638f302007SRui Paulo /* Possible flags for register IWN_APMG_PS. */ 3648f302007SRui Paulo #define IWN_APMG_PS_EARLY_PWROFF_DIS (1 << 22) 3658f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC(x) ((x) << 24) 3668f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_VMAIN 0 3678f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_VAUX 2 3688f302007SRui Paulo #define IWN_APMG_PS_PWR_SRC_MASK IWN_APMG_PS_PWR_SRC(3) 3698f302007SRui Paulo #define IWN_APMG_PS_RESET_REQ (1 << 26) 3708f302007SRui Paulo 3710f454b93SRui Paulo /* Possible flags for register IWN_APMG_DIGITAL_SVR. */ 3720f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE(x) (((x) & 0xf) << 5) 3730f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK \ 3740f454b93SRui Paulo IWN_APMG_DIGITAL_SVR_VOLTAGE(0xf) 3750f454b93SRui Paulo #define IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32 \ 3760f454b93SRui Paulo IWN_APMG_DIGITAL_SVR_VOLTAGE(3) 3770f454b93SRui Paulo 3788f302007SRui Paulo /* Possible flags for IWN_APMG_PCI_STT. */ 3798f302007SRui Paulo #define IWN_APMG_PCI_STT_L1A_DIS (1 << 11) 3808f302007SRui Paulo 3818f302007SRui Paulo /* Possible flags for register IWN_BSM_DRAM_TEXT_SIZE. */ 3827a22215cSEitan Adler #define IWN_FW_UPDATED (1U << 31) 3833971d07bSSam Leffler 3848f302007SRui Paulo #define IWN_SCHED_WINSZ 64 3858f302007SRui Paulo #define IWN_SCHED_LIMIT 64 3868f302007SRui Paulo #define IWN4965_SCHED_COUNT 512 3878f302007SRui Paulo #define IWN5000_SCHED_COUNT (IWN_TX_RING_COUNT + IWN_SCHED_WINSZ) 3888f302007SRui Paulo #define IWN4965_SCHEDSZ (IWN4965_NTXQUEUES * IWN4965_SCHED_COUNT * 2) 3898f302007SRui Paulo #define IWN5000_SCHEDSZ (IWN5000_NTXQUEUES * IWN5000_SCHED_COUNT * 2) 3903971d07bSSam Leffler 3918f302007SRui Paulo struct iwn_tx_desc { 3928f302007SRui Paulo uint8_t reserved1[3]; 3938f302007SRui Paulo uint8_t nsegs; 3948f302007SRui Paulo struct { 3958f302007SRui Paulo uint32_t addr; 3968f302007SRui Paulo uint16_t len; 3978f302007SRui Paulo } __packed segs[IWN_MAX_SCATTER]; 3988f302007SRui Paulo /* Pad to 128 bytes. */ 3998f302007SRui Paulo uint32_t reserved2; 4008f302007SRui Paulo } __packed; 4013971d07bSSam Leffler 4028f302007SRui Paulo struct iwn_rx_status { 4033971d07bSSam Leffler uint16_t closed_count; 4043971d07bSSam Leffler uint16_t closed_rx_count; 4053971d07bSSam Leffler uint16_t finished_count; 4063971d07bSSam Leffler uint16_t finished_rx_count; 4073971d07bSSam Leffler uint32_t reserved[2]; 4083971d07bSSam Leffler } __packed; 4093971d07bSSam Leffler 4103971d07bSSam Leffler struct iwn_rx_desc { 411f8639279SAdrian Chadd /* 412f8639279SAdrian Chadd * The first 4 bytes of the RX frame header contain both the RX frame 413f8639279SAdrian Chadd * size and some flags. 414f8639279SAdrian Chadd * Bit fields: 415f8639279SAdrian Chadd * 31: flag flush RB request 416f8639279SAdrian Chadd * 30: flag ignore TC (terminal counter) request 417f8639279SAdrian Chadd * 29: flag fast IRQ request 418f8639279SAdrian Chadd * 28-14: Reserved 419f8639279SAdrian Chadd * 13-00: RX frame size 420f8639279SAdrian Chadd */ 4213971d07bSSam Leffler uint32_t len; 4223971d07bSSam Leffler uint8_t type; 4233971d07bSSam Leffler #define IWN_UC_READY 1 4243971d07bSSam Leffler #define IWN_ADD_NODE_DONE 24 4253971d07bSSam Leffler #define IWN_TX_DONE 28 426f8639279SAdrian Chadd #define IWN_REPLY_LED_CMD 72 4278f302007SRui Paulo #define IWN5000_CALIBRATION_RESULT 102 4288f302007SRui Paulo #define IWN5000_CALIBRATION_DONE 103 4293971d07bSSam Leffler #define IWN_START_SCAN 130 430f8639279SAdrian Chadd #define IWN_NOTIF_SCAN_RESULT 131 4313971d07bSSam Leffler #define IWN_STOP_SCAN 132 4323971d07bSSam Leffler #define IWN_RX_STATISTICS 156 4333971d07bSSam Leffler #define IWN_BEACON_STATISTICS 157 4343971d07bSSam Leffler #define IWN_STATE_CHANGED 161 4353971d07bSSam Leffler #define IWN_BEACON_MISSED 162 4368f302007SRui Paulo #define IWN_RX_PHY 192 4378f302007SRui Paulo #define IWN_MPDU_RX_DONE 193 4383971d07bSSam Leffler #define IWN_RX_DONE 195 4390f454b93SRui Paulo #define IWN_RX_COMPRESSED_BA 197 4403971d07bSSam Leffler 441f8639279SAdrian Chadd uint8_t flags; /* 0:5 reserved, 6 abort, 7 internal */ 442f8639279SAdrian Chadd uint8_t idx; /* position within TX queue */ 4433971d07bSSam Leffler uint8_t qid; 444f8639279SAdrian Chadd /* 0:4 TX queue id - 5:6 reserved - 7 unsolicited RX 445f8639279SAdrian Chadd * or uCode-originated notification 446f8639279SAdrian Chadd */ 4473971d07bSSam Leffler } __packed; 4483971d07bSSam Leffler 449f8639279SAdrian Chadd #define IWN_RX_DESC_QID_MSK 0x1F 450f8639279SAdrian Chadd #define IWN_UNSOLICITED_RX_NOTIF 0x80 451f8639279SAdrian Chadd 452f8639279SAdrian Chadd /* CARD_STATE_NOTIFICATION */ 453f8639279SAdrian Chadd #define IWN_STATE_CHANGE_HW_CARD_DISABLED 0x01 454f8639279SAdrian Chadd #define IWN_STATE_CHANGE_SW_CARD_DISABLED 0x02 455f8639279SAdrian Chadd #define IWN_STATE_CHANGE_CT_CARD_DISABLED 0x04 456f8639279SAdrian Chadd #define IWN_STATE_CHANGE_RXON_CARD_DISABLED 0x10 457f8639279SAdrian Chadd 4588f302007SRui Paulo /* Possible RX status flags. */ 4593971d07bSSam Leffler #define IWN_RX_NO_CRC_ERR (1 << 0) 4603971d07bSSam Leffler #define IWN_RX_NO_OVFL_ERR (1 << 1) 4618f302007SRui Paulo /* Shortcut for the above. */ 4623971d07bSSam Leffler #define IWN_RX_NOERROR (IWN_RX_NO_CRC_ERR | IWN_RX_NO_OVFL_ERR) 4638f302007SRui Paulo #define IWN_RX_MPDU_MIC_OK (1 << 6) 4648f302007SRui Paulo #define IWN_RX_CIPHER_MASK (7 << 8) 4658f302007SRui Paulo #define IWN_RX_CIPHER_CCMP (2 << 8) 4668f302007SRui Paulo #define IWN_RX_MPDU_DEC (1 << 11) 4678f302007SRui Paulo #define IWN_RX_DECRYPT_MASK (3 << 11) 4688f302007SRui Paulo #define IWN_RX_DECRYPT_OK (3 << 11) 4693971d07bSSam Leffler 4703971d07bSSam Leffler struct iwn_tx_cmd { 4713971d07bSSam Leffler uint8_t code; 4720f454b93SRui Paulo #define IWN_CMD_RXON 16 4730f454b93SRui Paulo #define IWN_CMD_RXON_ASSOC 17 4748f302007SRui Paulo #define IWN_CMD_EDCA_PARAMS 19 4758f302007SRui Paulo #define IWN_CMD_TIMING 20 4768f302007SRui Paulo #define IWN_CMD_ADD_NODE 24 4778f302007SRui Paulo #define IWN_CMD_TX_DATA 28 4788f302007SRui Paulo #define IWN_CMD_LINK_QUALITY 78 4798f302007SRui Paulo #define IWN_CMD_SET_LED 72 4808f302007SRui Paulo #define IWN5000_CMD_WIMAX_COEX 90 481f8639279SAdrian Chadd #define IWN_TEMP_NOTIFICATION 98 4828f302007SRui Paulo #define IWN5000_CMD_CALIB_CONFIG 101 483654baa4aSRui Paulo #define IWN5000_CMD_CALIB_RESULT 102 484654baa4aSRui Paulo #define IWN5000_CMD_CALIB_COMPLETE 103 4858f302007SRui Paulo #define IWN_CMD_SET_POWER_MODE 119 4868f302007SRui Paulo #define IWN_CMD_SCAN 128 487654baa4aSRui Paulo #define IWN_CMD_SCAN_RESULTS 131 4880f454b93SRui Paulo #define IWN_CMD_TXPOWER_DBM 149 4898f302007SRui Paulo #define IWN_CMD_TXPOWER 151 4900f454b93SRui Paulo #define IWN5000_CMD_TX_ANT_CONFIG 152 491bc0203e2SAdrian Chadd #define IWN_CMD_TXPOWER_DBM_V1 152 4928f302007SRui Paulo #define IWN_CMD_BT_COEX 155 4938f302007SRui Paulo #define IWN_CMD_GET_STATISTICS 156 4948f302007SRui Paulo #define IWN_CMD_SET_CRITICAL_TEMP 164 4958f302007SRui Paulo #define IWN_CMD_SET_SENSITIVITY 168 4968f302007SRui Paulo #define IWN_CMD_PHY_CALIB 176 4978bb237d9SBernhard Schmidt #define IWN_CMD_BT_COEX_PRIOTABLE 204 4988bb237d9SBernhard Schmidt #define IWN_CMD_BT_COEX_PROT 205 499f8639279SAdrian Chadd #define IWN_CMD_BT_COEX_NOTIF 206 500f8639279SAdrian Chadd /* PAN commands */ 501f8639279SAdrian Chadd #define IWN_CMD_WIPAN_PARAMS 0xb2 502f8639279SAdrian Chadd #define IWN_CMD_WIPAN_RXON 0xb3 503f8639279SAdrian Chadd #define IWN_CMD_WIPAN_RXON_TIMING 0xb4 504f8639279SAdrian Chadd #define IWN_CMD_WIPAN_RXON_ASSOC 0xb6 505f8639279SAdrian Chadd #define IWN_CMD_WIPAN_QOS_PARAM 0xb7 506f8639279SAdrian Chadd #define IWN_CMD_WIPAN_WEPKEY 0xb8 507f8639279SAdrian Chadd #define IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH 0xb9 508f8639279SAdrian Chadd #define IWN_CMD_WIPAN_NOA_NOTIFICATION 0xbc 509f8639279SAdrian Chadd #define IWN_CMD_WIPAN_DEACTIVATION_COMPLETE 0xbd 5108f302007SRui Paulo 5113971d07bSSam Leffler uint8_t flags; 5123971d07bSSam Leffler uint8_t idx; 5133971d07bSSam Leffler uint8_t qid; 5143971d07bSSam Leffler uint8_t data[136]; 5153971d07bSSam Leffler } __packed; 5163971d07bSSam Leffler 517f8639279SAdrian Chadd /* 518f8639279SAdrian Chadd * Structure for IWN_CMD_GET_STATISTICS = (0x9c) 156 519f8639279SAdrian Chadd * all devices identical. 520f8639279SAdrian Chadd * 521f8639279SAdrian Chadd * This command triggers an immediate response containing uCode statistics. 522f8639279SAdrian Chadd * The response is in the same format as IWN_BEACON_STATISTICS (0x9d) 157. 523f8639279SAdrian Chadd * 524f8639279SAdrian Chadd * If the CLEAR_STATS configuration flag is set, uCode will clear its 525f8639279SAdrian Chadd * internal copy of the statistics (counters) after issuing the response. 526f8639279SAdrian Chadd * This flag does not affect IWN_BEACON_STATISTICS after beacons (see below). 527f8639279SAdrian Chadd * 528f8639279SAdrian Chadd * If the DISABLE_NOTIF configuration flag is set, uCode will not issue 529f8639279SAdrian Chadd * IWN_BEACON_STATISTICS after received beacons. This flag 530f8639279SAdrian Chadd * does not affect the response to the IWN_CMD_GET_STATISTICS 0x9c itself. 531f8639279SAdrian Chadd */ 532f8639279SAdrian Chadd struct iwn_statistics_cmd { 533f8639279SAdrian Chadd uint32_t configuration_flags; 534f8639279SAdrian Chadd #define IWN_STATS_CONF_CLEAR_STATS htole32(0x1) 535f8639279SAdrian Chadd #define IWN_STATS_CONF_DISABLE_NOTIF htole32(0x2) 536f8639279SAdrian Chadd } __packed; 537f8639279SAdrian Chadd 5388f302007SRui Paulo /* Antenna flags, used in various commands. */ 5398f302007SRui Paulo #define IWN_ANT_A (1 << 0) 5408f302007SRui Paulo #define IWN_ANT_B (1 << 1) 5418f302007SRui Paulo #define IWN_ANT_C (1 << 2) 5420f454b93SRui Paulo /* Shortcuts. */ 5430f454b93SRui Paulo #define IWN_ANT_AB (IWN_ANT_A | IWN_ANT_B) 5440f454b93SRui Paulo #define IWN_ANT_BC (IWN_ANT_B | IWN_ANT_C) 545f8639279SAdrian Chadd #define IWN_ANT_AC (IWN_ANT_A | IWN_ANT_C) 5468f302007SRui Paulo #define IWN_ANT_ABC (IWN_ANT_A | IWN_ANT_B | IWN_ANT_C) 5478f302007SRui Paulo 5480f454b93SRui Paulo /* Structure for command IWN_CMD_RXON. */ 5498f302007SRui Paulo struct iwn_rxon { 5503971d07bSSam Leffler uint8_t myaddr[IEEE80211_ADDR_LEN]; 5513971d07bSSam Leffler uint16_t reserved1; 5523971d07bSSam Leffler uint8_t bssid[IEEE80211_ADDR_LEN]; 5533971d07bSSam Leffler uint16_t reserved2; 5543971d07bSSam Leffler uint8_t wlap[IEEE80211_ADDR_LEN]; 5553971d07bSSam Leffler uint16_t reserved3; 5563971d07bSSam Leffler uint8_t mode; 5573971d07bSSam Leffler #define IWN_MODE_HOSTAP 1 5583971d07bSSam Leffler #define IWN_MODE_STA 3 5593971d07bSSam Leffler #define IWN_MODE_IBSS 4 5603971d07bSSam Leffler #define IWN_MODE_MONITOR 6 561f8639279SAdrian Chadd #define IWN_MODE_2STA 8 562f8639279SAdrian Chadd #define IWN_MODE_P2P 9 5638f302007SRui Paulo 5648f302007SRui Paulo uint8_t air; 5653971d07bSSam Leffler uint16_t rxchain; 5660f454b93SRui Paulo #define IWN_RXCHAIN_DRIVER_FORCE (1 << 0) 5670f454b93SRui Paulo #define IWN_RXCHAIN_VALID(x) (((x) & IWN_ANT_ABC) << 1) 5680f454b93SRui Paulo #define IWN_RXCHAIN_FORCE_SEL(x) (((x) & IWN_ANT_ABC) << 4) 5690f454b93SRui Paulo #define IWN_RXCHAIN_FORCE_MIMO_SEL(x) (((x) & IWN_ANT_ABC) << 7) 5708f302007SRui Paulo #define IWN_RXCHAIN_IDLE_COUNT(x) ((x) << 10) 5718f302007SRui Paulo #define IWN_RXCHAIN_MIMO_COUNT(x) ((x) << 12) 5728f302007SRui Paulo #define IWN_RXCHAIN_MIMO_FORCE (1 << 14) 5738f302007SRui Paulo 5748f302007SRui Paulo uint8_t ofdm_mask; 5758f302007SRui Paulo uint8_t cck_mask; 5763971d07bSSam Leffler uint16_t associd; 5773971d07bSSam Leffler uint32_t flags; 5780f454b93SRui Paulo #define IWN_RXON_24GHZ (1 << 0) 5790f454b93SRui Paulo #define IWN_RXON_CCK (1 << 1) 5800f454b93SRui Paulo #define IWN_RXON_AUTO (1 << 2) 5810f454b93SRui Paulo #define IWN_RXON_SHSLOT (1 << 4) 5820f454b93SRui Paulo #define IWN_RXON_SHPREAMBLE (1 << 5) 5830f454b93SRui Paulo #define IWN_RXON_NODIVERSITY (1 << 7) 5840f454b93SRui Paulo #define IWN_RXON_ANTENNA_A (1 << 8) 5850f454b93SRui Paulo #define IWN_RXON_ANTENNA_B (1 << 9) 5860f454b93SRui Paulo #define IWN_RXON_TSF (1 << 15) 587b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_HT40MINUS (1 << 22) 58854991f37SAdrian Chadd 589b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_PROTMODE(x) (x << 23) 59054991f37SAdrian Chadd 59154991f37SAdrian Chadd /* 0=legacy, 1=pure40, 2=mixed */ 592b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_MODEPURE40 (1 << 25) 593b5d2f6bfSBernhard Schmidt #define IWN_RXON_HT_MODEMIXED (2 << 25) 59454991f37SAdrian Chadd 5950f454b93SRui Paulo #define IWN_RXON_CTS_TO_SELF (1 << 30) 5968f302007SRui Paulo 5973971d07bSSam Leffler uint32_t filter; 5988f302007SRui Paulo #define IWN_FILTER_PROMISC (1 << 0) 5998f302007SRui Paulo #define IWN_FILTER_CTL (1 << 1) 6008f302007SRui Paulo #define IWN_FILTER_MULTICAST (1 << 2) 6018f302007SRui Paulo #define IWN_FILTER_NODECRYPT (1 << 3) 6028f302007SRui Paulo #define IWN_FILTER_BSS (1 << 5) 6038f302007SRui Paulo #define IWN_FILTER_BEACON (1 << 6) 6048f302007SRui Paulo 6058f302007SRui Paulo uint8_t chan; 6068f302007SRui Paulo uint8_t reserved4; 6078f302007SRui Paulo uint8_t ht_single_mask; 6088f302007SRui Paulo uint8_t ht_dual_mask; 6090f454b93SRui Paulo /* The following fields are for >=5000 Series only. */ 6108f302007SRui Paulo uint8_t ht_triple_mask; 6118f302007SRui Paulo uint8_t reserved5; 6128f302007SRui Paulo uint16_t acquisition; 6138f302007SRui Paulo uint16_t reserved6; 6143971d07bSSam Leffler } __packed; 6153971d07bSSam Leffler 6168f302007SRui Paulo #define IWN4965_RXONSZ (sizeof (struct iwn_rxon) - 6) 6178f302007SRui Paulo #define IWN5000_RXONSZ (sizeof (struct iwn_rxon)) 6188f302007SRui Paulo 6199d5228cdSAndriy Voskoboinyk /* Structure for command IWN_CMD_RXON_ASSOC (4965AGN only.) */ 6209d5228cdSAndriy Voskoboinyk struct iwn4965_rxon_assoc { 6219d5228cdSAndriy Voskoboinyk uint32_t flags; 6229d5228cdSAndriy Voskoboinyk uint32_t filter; 6239d5228cdSAndriy Voskoboinyk uint8_t ofdm_mask; 6249d5228cdSAndriy Voskoboinyk uint8_t cck_mask; 6259d5228cdSAndriy Voskoboinyk uint8_t ht_single_mask; 6269d5228cdSAndriy Voskoboinyk uint8_t ht_dual_mask; 6279d5228cdSAndriy Voskoboinyk uint16_t rxchain; 6289d5228cdSAndriy Voskoboinyk uint16_t reserved; 6299d5228cdSAndriy Voskoboinyk } __packed; 6309d5228cdSAndriy Voskoboinyk 6319d5228cdSAndriy Voskoboinyk /* Structure for command IWN_CMD_RXON_ASSOC (5000 Series only.) */ 6329d5228cdSAndriy Voskoboinyk struct iwn5000_rxon_assoc { 6339d5228cdSAndriy Voskoboinyk uint32_t flags; 6349d5228cdSAndriy Voskoboinyk uint32_t filter; 6359d5228cdSAndriy Voskoboinyk uint8_t ofdm_mask; 6369d5228cdSAndriy Voskoboinyk uint8_t cck_mask; 6379d5228cdSAndriy Voskoboinyk uint16_t reserved1; 6389d5228cdSAndriy Voskoboinyk uint8_t ht_single_mask; 6399d5228cdSAndriy Voskoboinyk uint8_t ht_dual_mask; 6409d5228cdSAndriy Voskoboinyk uint8_t ht_triple_mask; 6419d5228cdSAndriy Voskoboinyk uint8_t reserved2; 6429d5228cdSAndriy Voskoboinyk uint16_t rxchain; 6439d5228cdSAndriy Voskoboinyk uint16_t acquisition; 6449d5228cdSAndriy Voskoboinyk uint32_t reserved3; 6459d5228cdSAndriy Voskoboinyk } __packed; 6469d5228cdSAndriy Voskoboinyk 6478f302007SRui Paulo /* Structure for command IWN_CMD_ASSOCIATE. */ 6483971d07bSSam Leffler struct iwn_assoc { 6493971d07bSSam Leffler uint32_t flags; 6503971d07bSSam Leffler uint32_t filter; 6513971d07bSSam Leffler uint8_t ofdm_mask; 6523971d07bSSam Leffler uint8_t cck_mask; 6533971d07bSSam Leffler uint16_t reserved; 6543971d07bSSam Leffler } __packed; 6553971d07bSSam Leffler 6568f302007SRui Paulo /* Structure for command IWN_CMD_EDCA_PARAMS. */ 6573971d07bSSam Leffler struct iwn_edca_params { 6583971d07bSSam Leffler uint32_t flags; 6593971d07bSSam Leffler #define IWN_EDCA_UPDATE (1 << 0) 6603971d07bSSam Leffler #define IWN_EDCA_TXOP (1 << 4) 6613971d07bSSam Leffler 6623971d07bSSam Leffler struct { 6633971d07bSSam Leffler uint16_t cwmin; 6643971d07bSSam Leffler uint16_t cwmax; 6653971d07bSSam Leffler uint8_t aifsn; 6663971d07bSSam Leffler uint8_t reserved; 6673971d07bSSam Leffler uint16_t txoplimit; 6680f454b93SRui Paulo } __packed ac[WME_NUM_AC]; 6693971d07bSSam Leffler } __packed; 6703971d07bSSam Leffler 6718f302007SRui Paulo /* Structure for command IWN_CMD_TIMING. */ 6728f302007SRui Paulo struct iwn_cmd_timing { 6733971d07bSSam Leffler uint64_t tstamp; 6743971d07bSSam Leffler uint16_t bintval; 6753971d07bSSam Leffler uint16_t atim; 6763971d07bSSam Leffler uint32_t binitval; 6773971d07bSSam Leffler uint16_t lintval; 678f8639279SAdrian Chadd uint8_t dtim_period; 679f8639279SAdrian Chadd uint8_t delta_cp_bss_tbtts; 6803971d07bSSam Leffler } __packed; 6813971d07bSSam Leffler 6828f302007SRui Paulo /* Structure for command IWN_CMD_ADD_NODE. */ 6833971d07bSSam Leffler struct iwn_node_info { 6843971d07bSSam Leffler uint8_t control; 6853971d07bSSam Leffler #define IWN_NODE_UPDATE (1 << 0) 6868f302007SRui Paulo 6873971d07bSSam Leffler uint8_t reserved1[3]; 6888f302007SRui Paulo 6893971d07bSSam Leffler uint8_t macaddr[IEEE80211_ADDR_LEN]; 6903971d07bSSam Leffler uint16_t reserved2; 6913971d07bSSam Leffler uint8_t id; 6923971d07bSSam Leffler #define IWN_ID_BSS 0 693f8639279SAdrian Chadd #define IWN_STA_ID 1 694f8639279SAdrian Chadd 695f8639279SAdrian Chadd #define IWN_PAN_ID_BCAST 14 6968f302007SRui Paulo #define IWN5000_ID_BROADCAST 15 6978f302007SRui Paulo #define IWN4965_ID_BROADCAST 31 69864b92f26SAndriy Voskoboinyk 69964b92f26SAndriy Voskoboinyk #define IWN_ID_UNDEFINED (uint8_t)-1 7008f302007SRui Paulo 7013971d07bSSam Leffler uint8_t flags; 7023971d07bSSam Leffler #define IWN_FLAG_SET_KEY (1 << 0) 7038f302007SRui Paulo #define IWN_FLAG_SET_DISABLE_TID (1 << 1) 7048f302007SRui Paulo #define IWN_FLAG_SET_TXRATE (1 << 2) 7058f302007SRui Paulo #define IWN_FLAG_SET_ADDBA (1 << 3) 7068f302007SRui Paulo #define IWN_FLAG_SET_DELBA (1 << 4) 7078f302007SRui Paulo 7083971d07bSSam Leffler uint16_t reserved3; 7098f302007SRui Paulo uint16_t kflags; 7108f302007SRui Paulo #define IWN_KFLAG_CCMP (1 << 1) 7118f302007SRui Paulo #define IWN_KFLAG_MAP (1 << 3) 7128f302007SRui Paulo #define IWN_KFLAG_KID(kid) ((kid) << 8) 7138f302007SRui Paulo #define IWN_KFLAG_INVALID (1 << 11) 7148f302007SRui Paulo #define IWN_KFLAG_GROUP (1 << 14) 7158f302007SRui Paulo 7163971d07bSSam Leffler uint8_t tsc2; /* TKIP TSC2 */ 7173971d07bSSam Leffler uint8_t reserved4; 7183971d07bSSam Leffler uint16_t ttak[5]; 7198f302007SRui Paulo uint8_t kid; 7208f302007SRui Paulo uint8_t reserved5; 7218f302007SRui Paulo uint8_t key[16]; 7228f302007SRui Paulo /* The following 3 fields are for 5000 Series only. */ 7238f302007SRui Paulo uint64_t tsc; 7248f302007SRui Paulo uint8_t rxmic[8]; 7258f302007SRui Paulo uint8_t txmic[8]; 7268f302007SRui Paulo 7273971d07bSSam Leffler uint32_t htflags; 728b5d2f6bfSBernhard Schmidt #define IWN_SMPS_MIMO_PROT (1 << 17) 7298f302007SRui Paulo #define IWN_AMDPU_SIZE_FACTOR(x) ((x) << 19) 730b5d2f6bfSBernhard Schmidt #define IWN_NODE_HT40 (1 << 21) 731b5d2f6bfSBernhard Schmidt #define IWN_SMPS_MIMO_DIS (1 << 22) 7328f302007SRui Paulo #define IWN_AMDPU_DENSITY(x) ((x) << 23) 7338f302007SRui Paulo 7343971d07bSSam Leffler uint32_t mask; 7358f302007SRui Paulo uint16_t disable_tid; 7368f302007SRui Paulo uint16_t reserved6; 7378f302007SRui Paulo uint8_t addba_tid; 7388f302007SRui Paulo uint8_t delba_tid; 7398f302007SRui Paulo uint16_t addba_ssn; 7408f302007SRui Paulo uint32_t reserved7; 7418f302007SRui Paulo } __packed; 7428f302007SRui Paulo 7438f302007SRui Paulo struct iwn4965_node_info { 7448f302007SRui Paulo uint8_t control; 7458f302007SRui Paulo uint8_t reserved1[3]; 7468f302007SRui Paulo uint8_t macaddr[IEEE80211_ADDR_LEN]; 7478f302007SRui Paulo uint16_t reserved2; 7488f302007SRui Paulo uint8_t id; 7498f302007SRui Paulo uint8_t flags; 7508f302007SRui Paulo uint16_t reserved3; 7518f302007SRui Paulo uint16_t kflags; 7528f302007SRui Paulo uint8_t tsc2; /* TKIP TSC2 */ 7538f302007SRui Paulo uint8_t reserved4; 7548f302007SRui Paulo uint16_t ttak[5]; 7558f302007SRui Paulo uint8_t kid; 7568f302007SRui Paulo uint8_t reserved5; 7578f302007SRui Paulo uint8_t key[16]; 7588f302007SRui Paulo uint32_t htflags; 7598f302007SRui Paulo uint32_t mask; 7608f302007SRui Paulo uint16_t disable_tid; 7618f302007SRui Paulo uint16_t reserved6; 7628f302007SRui Paulo uint8_t addba_tid; 7638f302007SRui Paulo uint8_t delba_tid; 7648f302007SRui Paulo uint16_t addba_ssn; 7658f302007SRui Paulo uint32_t reserved7; 7668f302007SRui Paulo } __packed; 7678f302007SRui Paulo 7687ab19263SAndriy Voskoboinyk #define IWN_RFLAG_RATE 0xff 7697ab19263SAndriy Voskoboinyk #define IWN_RFLAG_RATE_MCS 0x1f 7707ab19263SAndriy Voskoboinyk #define IWN_RFLAG_HT40_DUP 0x20 7717ab19263SAndriy Voskoboinyk 772fa818eaeSBernhard Schmidt #define IWN_RFLAG_MCS (1 << 8) 7731647639aSBernhard Schmidt #define IWN_RFLAG_CCK (1 << 9) 774fa818eaeSBernhard Schmidt #define IWN_RFLAG_GREENFIELD (1 << 10) 775fa818eaeSBernhard Schmidt #define IWN_RFLAG_HT40 (1 << 11) 776fa818eaeSBernhard Schmidt #define IWN_RFLAG_DUPLICATE (1 << 12) 777fa818eaeSBernhard Schmidt #define IWN_RFLAG_SGI (1 << 13) 7781647639aSBernhard Schmidt #define IWN_RFLAG_ANT(x) ((x) << 14) 7793971d07bSSam Leffler 7808f302007SRui Paulo /* Structure for command IWN_CMD_TX_DATA. */ 7813971d07bSSam Leffler struct iwn_cmd_data { 7823971d07bSSam Leffler uint16_t len; 7833971d07bSSam Leffler uint16_t lnext; 7843971d07bSSam Leffler uint32_t flags; 7858f302007SRui Paulo #define IWN_TX_NEED_PROTECTION (1 << 0) /* 5000 only */ 7863971d07bSSam Leffler #define IWN_TX_NEED_RTS (1 << 1) 7873971d07bSSam Leffler #define IWN_TX_NEED_CTS (1 << 2) 7883971d07bSSam Leffler #define IWN_TX_NEED_ACK (1 << 3) 7898f302007SRui Paulo #define IWN_TX_LINKQ (1 << 4) 7908f302007SRui Paulo #define IWN_TX_IMM_BA (1 << 6) 7913971d07bSSam Leffler #define IWN_TX_FULL_TXOP (1 << 7) 7923971d07bSSam Leffler #define IWN_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ 7933971d07bSSam Leffler #define IWN_TX_AUTO_SEQ (1 << 13) 7948f302007SRui Paulo #define IWN_TX_MORE_FRAG (1 << 14) 7953971d07bSSam Leffler #define IWN_TX_INSERT_TSTAMP (1 << 16) 7963971d07bSSam Leffler #define IWN_TX_NEED_PADDING (1 << 20) 7973971d07bSSam Leffler 7988f302007SRui Paulo uint32_t scratch; 7991647639aSBernhard Schmidt uint32_t rate; 8008f302007SRui Paulo 8013971d07bSSam Leffler uint8_t id; 8023971d07bSSam Leffler uint8_t security; 8033971d07bSSam Leffler #define IWN_CIPHER_WEP40 1 8043971d07bSSam Leffler #define IWN_CIPHER_CCMP 2 8053971d07bSSam Leffler #define IWN_CIPHER_TKIP 3 8063971d07bSSam Leffler #define IWN_CIPHER_WEP104 9 8073971d07bSSam Leffler 8088f302007SRui Paulo uint8_t linkq; 8093971d07bSSam Leffler uint8_t reserved2; 8108f302007SRui Paulo uint8_t key[16]; 8113971d07bSSam Leffler uint16_t fnext; 8123971d07bSSam Leffler uint16_t reserved3; 8133971d07bSSam Leffler uint32_t lifetime; 8143971d07bSSam Leffler #define IWN_LIFETIME_INFINITE 0xffffffff 8153971d07bSSam Leffler 8163971d07bSSam Leffler uint32_t loaddr; 8173971d07bSSam Leffler uint8_t hiaddr; 8183971d07bSSam Leffler uint8_t rts_ntries; 8193971d07bSSam Leffler uint8_t data_ntries; 8203971d07bSSam Leffler uint8_t tid; 8213971d07bSSam Leffler uint16_t timeout; 8223971d07bSSam Leffler uint16_t txop; 8233971d07bSSam Leffler } __packed; 8243971d07bSSam Leffler 8258f302007SRui Paulo /* Structure for command IWN_CMD_LINK_QUALITY. */ 8263971d07bSSam Leffler #define IWN_MAX_TX_RETRIES 16 8273971d07bSSam Leffler struct iwn_cmd_link_quality { 8283971d07bSSam Leffler uint8_t id; 8293971d07bSSam Leffler uint8_t reserved1; 8303971d07bSSam Leffler uint16_t ctl; 8313971d07bSSam Leffler uint8_t flags; 8328f302007SRui Paulo uint8_t mimo; 8338f302007SRui Paulo uint8_t antmsk_1stream; 8348f302007SRui Paulo uint8_t antmsk_2stream; 8350f454b93SRui Paulo uint8_t ridx[WME_NUM_AC]; 8368f302007SRui Paulo uint16_t ampdu_limit; 8378f302007SRui Paulo uint8_t ampdu_threshold; 8388f302007SRui Paulo uint8_t ampdu_max; 8393971d07bSSam Leffler uint32_t reserved2; 8401647639aSBernhard Schmidt uint32_t retry[IWN_MAX_TX_RETRIES]; 8413971d07bSSam Leffler uint32_t reserved3; 8423971d07bSSam Leffler } __packed; 8433971d07bSSam Leffler 8448f302007SRui Paulo /* Structure for command IWN_CMD_SET_LED. */ 8453971d07bSSam Leffler struct iwn_cmd_led { 8463971d07bSSam Leffler uint32_t unit; /* multiplier (in usecs) */ 8473971d07bSSam Leffler uint8_t which; 8483971d07bSSam Leffler #define IWN_LED_ACTIVITY 1 8493971d07bSSam Leffler #define IWN_LED_LINK 2 8503971d07bSSam Leffler 8513971d07bSSam Leffler uint8_t off; 8523971d07bSSam Leffler uint8_t on; 8533971d07bSSam Leffler uint8_t reserved; 8543971d07bSSam Leffler } __packed; 8553971d07bSSam Leffler 8568f302007SRui Paulo /* Structure for command IWN5000_CMD_WIMAX_COEX. */ 8578f302007SRui Paulo struct iwn5000_wimax_coex { 8588f302007SRui Paulo uint32_t flags; 8590f454b93SRui Paulo #define IWN_WIMAX_COEX_STA_TABLE_VALID (1 << 0) 8600f454b93SRui Paulo #define IWN_WIMAX_COEX_UNASSOC_WA_UNMASK (1 << 2) 8610f454b93SRui Paulo #define IWN_WIMAX_COEX_ASSOC_WA_UNMASK (1 << 3) 8620f454b93SRui Paulo #define IWN_WIMAX_COEX_ENABLE (1 << 7) 8630f454b93SRui Paulo 8640f454b93SRui Paulo struct iwn5000_wimax_event { 8658f302007SRui Paulo uint8_t request; 8668f302007SRui Paulo uint8_t window; 8678f302007SRui Paulo uint8_t reserved; 8688f302007SRui Paulo uint8_t flags; 8698f302007SRui Paulo } __packed events[16]; 8708f302007SRui Paulo } __packed; 8713971d07bSSam Leffler 8728f302007SRui Paulo /* Structures for command IWN5000_CMD_CALIB_CONFIG. */ 8738f302007SRui Paulo struct iwn5000_calib_elem { 8748f302007SRui Paulo uint32_t enable; 8758f302007SRui Paulo uint32_t start; 87626ddc983SBernhard Schmidt #define IWN5000_CALIB_DC (1 << 1) 87726ddc983SBernhard Schmidt 8788f302007SRui Paulo uint32_t send; 8798f302007SRui Paulo uint32_t apply; 8808f302007SRui Paulo uint32_t reserved; 8818f302007SRui Paulo } __packed; 8828f302007SRui Paulo 8838f302007SRui Paulo struct iwn5000_calib_status { 8848f302007SRui Paulo struct iwn5000_calib_elem once; 8858f302007SRui Paulo struct iwn5000_calib_elem perd; 8868f302007SRui Paulo uint32_t flags; 8878f302007SRui Paulo } __packed; 8888f302007SRui Paulo 8898f302007SRui Paulo struct iwn5000_calib_config { 8908f302007SRui Paulo struct iwn5000_calib_status ucode; 8918f302007SRui Paulo struct iwn5000_calib_status driver; 8928f302007SRui Paulo uint32_t reserved; 8938f302007SRui Paulo } __packed; 8948f302007SRui Paulo 8958f302007SRui Paulo /* Structure for command IWN_CMD_SET_POWER_MODE. */ 8968f302007SRui Paulo struct iwn_pmgt_cmd { 8978f302007SRui Paulo uint16_t flags; 8988f302007SRui Paulo #define IWN_PS_ALLOW_SLEEP (1 << 0) 8998f302007SRui Paulo #define IWN_PS_NOTIFY (1 << 1) 9008f302007SRui Paulo #define IWN_PS_SLEEP_OVER_DTIM (1 << 2) 9018f302007SRui Paulo #define IWN_PS_PCI_PMGT (1 << 3) 9028f302007SRui Paulo #define IWN_PS_FAST_PD (1 << 4) 903f8639279SAdrian Chadd #define IWN_PS_BEACON_FILTERING (1 << 5) 904f8639279SAdrian Chadd #define IWN_PS_SHADOW_REG (1 << 6) 905f8639279SAdrian Chadd #define IWN_PS_CT_KILL (1 << 7) 906f8639279SAdrian Chadd #define IWN_PS_BT_SCD (1 << 8) 907f8639279SAdrian Chadd #define IWN_PS_ADVANCED_PM (1 << 9) 9088f302007SRui Paulo 9098f302007SRui Paulo uint8_t keepalive; 9103971d07bSSam Leffler uint8_t debug; 9118f302007SRui Paulo uint32_t rxtimeout; 9128f302007SRui Paulo uint32_t txtimeout; 9138f302007SRui Paulo uint32_t intval[5]; 9143971d07bSSam Leffler uint32_t beacons; 9153971d07bSSam Leffler } __packed; 9163971d07bSSam Leffler 9178f302007SRui Paulo /* Structures for command IWN_CMD_SCAN. */ 9183971d07bSSam Leffler struct iwn_scan_essid { 9193971d07bSSam Leffler uint8_t id; 9203971d07bSSam Leffler uint8_t len; 9213971d07bSSam Leffler uint8_t data[IEEE80211_NWID_LEN]; 9223971d07bSSam Leffler } __packed; 9233971d07bSSam Leffler 9243971d07bSSam Leffler struct iwn_scan_hdr { 9253971d07bSSam Leffler uint16_t len; 9261650f039SAdrian Chadd uint8_t scan_flags; 9273971d07bSSam Leffler uint8_t nchan; 9288f302007SRui Paulo uint16_t quiet_time; 9298f302007SRui Paulo uint16_t quiet_threshold; 9303971d07bSSam Leffler uint16_t crc_threshold; 9313971d07bSSam Leffler uint16_t rxchain; 9323971d07bSSam Leffler uint32_t max_svc; /* background scans */ 9333971d07bSSam Leffler uint32_t pause_svc; /* background scans */ 9343971d07bSSam Leffler uint32_t flags; 9353971d07bSSam Leffler uint32_t filter; 9363971d07bSSam Leffler 9378f302007SRui Paulo /* Followed by a struct iwn_cmd_data. */ 9388f302007SRui Paulo /* Followed by an array of 20 structs iwn_scan_essid. */ 9398f302007SRui Paulo /* Followed by probe request body. */ 9408f302007SRui Paulo /* Followed by an array of ``nchan'' structs iwn_scan_chan. */ 9413971d07bSSam Leffler } __packed; 9423971d07bSSam Leffler 9433971d07bSSam Leffler struct iwn_scan_chan { 9448f302007SRui Paulo uint32_t flags; 945f8639279SAdrian Chadd #define IWN_CHAN_PASSIVE (0 << 0) 9463971d07bSSam Leffler #define IWN_CHAN_ACTIVE (1 << 0) 9478f302007SRui Paulo #define IWN_CHAN_NPBREQS(x) (((1 << (x)) - 1) << 1) 9483971d07bSSam Leffler 9498f302007SRui Paulo uint16_t chan; 9503971d07bSSam Leffler uint8_t rf_gain; 9513971d07bSSam Leffler uint8_t dsp_gain; 9523971d07bSSam Leffler uint16_t active; /* msecs */ 9533971d07bSSam Leffler uint16_t passive; /* msecs */ 9543971d07bSSam Leffler } __packed; 9553971d07bSSam Leffler 956f8639279SAdrian Chadd #define IWN_SCAN_CRC_TH_DISABLED 0 957f8639279SAdrian Chadd #define IWN_SCAN_CRC_TH_DEFAULT htole16(1) 958f8639279SAdrian Chadd #define IWN_SCAN_CRC_TH_NEVER htole16(0xffff) 959f8639279SAdrian Chadd 9608f302007SRui Paulo /* Maximum size of a scan command. */ 9618f302007SRui Paulo #define IWN_SCAN_MAXSZ (MCLBYTES - 4) 9628f302007SRui Paulo 963fee842aaSAdrian Chadd /* 964fee842aaSAdrian Chadd * For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after 965fee842aaSAdrian Chadd * sending probe req. This should be set long enough to hear probe responses 966fee842aaSAdrian Chadd * from more than one AP. 967fee842aaSAdrian Chadd */ 968fee842aaSAdrian Chadd #define IWN_ACTIVE_DWELL_TIME_2GHZ (30) /* all times in msec */ 969fee842aaSAdrian Chadd #define IWN_ACTIVE_DWELL_TIME_5GHZ (20) 970fee842aaSAdrian Chadd #define IWN_ACTIVE_DWELL_FACTOR_2GHZ (3) 971fee842aaSAdrian Chadd #define IWN_ACTIVE_DWELL_FACTOR_5GHZ (2) 972f8639279SAdrian Chadd 973fee842aaSAdrian Chadd /* 974fee842aaSAdrian Chadd * For passive scan, listen PASSIVE_DWELL_TIME (msec) on each channel. 975fee842aaSAdrian Chadd * Must be set longer than active dwell time. 976fee842aaSAdrian Chadd * For the most reliable scan, set > AP beacon interval (typically 100msec). 977fee842aaSAdrian Chadd */ 978fee842aaSAdrian Chadd #define IWN_PASSIVE_DWELL_TIME_2GHZ (20) /* all times in msec */ 979fee842aaSAdrian Chadd #define IWN_PASSIVE_DWELL_TIME_5GHZ (10) 980f8639279SAdrian Chadd #define IWN_PASSIVE_DWELL_BASE (100) 981f8639279SAdrian Chadd #define IWN_CHANNEL_TUNE_TIME (5) 982f8639279SAdrian Chadd 983f8639279SAdrian Chadd #define IWN_SCAN_CHAN_TIMEOUT 2 984fee842aaSAdrian Chadd #define IWN_MAX_SCAN_CHANNEL 50 985fee842aaSAdrian Chadd 986fee842aaSAdrian Chadd /* 987fee842aaSAdrian Chadd * If active scanning is requested but a certain channel is 988fee842aaSAdrian Chadd * marked passive, we can do active scanning if we detect 989fee842aaSAdrian Chadd * transmissions. 990fee842aaSAdrian Chadd * 991fee842aaSAdrian Chadd * There is an issue with some firmware versions that triggers 992fee842aaSAdrian Chadd * a sysassert on a "good CRC threshold" of zero (== disabled), 993fee842aaSAdrian Chadd * on a radar channel even though this means that we should NOT 994fee842aaSAdrian Chadd * send probes. 995fee842aaSAdrian Chadd * 996fee842aaSAdrian Chadd * The "good CRC threshold" is the number of frames that we 997fee842aaSAdrian Chadd * need to receive during our dwell time on a channel before 998fee842aaSAdrian Chadd * sending out probes -- setting this to a huge value will 999fee842aaSAdrian Chadd * mean we never reach it, but at the same time work around 1000fee842aaSAdrian Chadd * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER 1001fee842aaSAdrian Chadd * here instead of IWL_GOOD_CRC_TH_DISABLED. 1002fee842aaSAdrian Chadd * 1003fee842aaSAdrian Chadd * This was fixed in later versions along with some other 1004fee842aaSAdrian Chadd * scan changes, and the threshold behaves as a flag in those 1005fee842aaSAdrian Chadd * versions. 1006fee842aaSAdrian Chadd */ 1007fee842aaSAdrian Chadd #define IWN_GOOD_CRC_TH_DISABLED 0 1008fee842aaSAdrian Chadd #define IWN_GOOD_CRC_TH_DEFAULT htole16(1) 1009fee842aaSAdrian Chadd #define IWN_GOOD_CRC_TH_NEVER htole16(0xffff) 1010f8639279SAdrian Chadd 10118f302007SRui Paulo /* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */ 10123971d07bSSam Leffler #define IWN_RIDX_MAX 32 10138f302007SRui Paulo struct iwn4965_cmd_txpower { 10143971d07bSSam Leffler uint8_t band; 10153971d07bSSam Leffler uint8_t reserved1; 10163971d07bSSam Leffler uint8_t chan; 10173971d07bSSam Leffler uint8_t reserved2; 10183971d07bSSam Leffler struct { 10198f302007SRui Paulo uint8_t rf_gain[2]; 10208f302007SRui Paulo uint8_t dsp_gain[2]; 10218f302007SRui Paulo } __packed power[IWN_RIDX_MAX + 1]; 10223971d07bSSam Leffler } __packed; 10233971d07bSSam Leffler 10248f302007SRui Paulo /* Structure for command IWN_CMD_TXPOWER_DBM (5000 Series only.) */ 10258f302007SRui Paulo struct iwn5000_cmd_txpower { 10268f302007SRui Paulo int8_t global_limit; /* in half-dBm */ 10278f302007SRui Paulo #define IWN5000_TXPOWER_AUTO 0x7f 10288f302007SRui Paulo #define IWN5000_TXPOWER_MAX_DBM 16 10298f302007SRui Paulo 10308f302007SRui Paulo uint8_t flags; 10318f302007SRui Paulo #define IWN5000_TXPOWER_NO_CLOSED (1 << 6) 10328f302007SRui Paulo 10338f302007SRui Paulo int8_t srv_limit; /* in half-dBm */ 10348f302007SRui Paulo uint8_t reserved; 10358f302007SRui Paulo } __packed; 10368f302007SRui Paulo 10378bb237d9SBernhard Schmidt /* Structures for command IWN_CMD_BLUETOOTH. */ 10383971d07bSSam Leffler struct iwn_bluetooth { 10393971d07bSSam Leffler uint8_t flags; 10407373959eSBernhard Schmidt #define IWN_BT_COEX_CHAN_ANN (1 << 0) 10417373959eSBernhard Schmidt #define IWN_BT_COEX_BT_PRIO (1 << 1) 10427373959eSBernhard Schmidt #define IWN_BT_COEX_2_WIRE (1 << 2) 10430f454b93SRui Paulo 10440f454b93SRui Paulo uint8_t lead_time; 10450f454b93SRui Paulo #define IWN_BT_LEAD_TIME_DEF 30 10460f454b93SRui Paulo 10470f454b93SRui Paulo uint8_t max_kill; 10480f454b93SRui Paulo #define IWN_BT_MAX_KILL_DEF 5 10490f454b93SRui Paulo 10503971d07bSSam Leffler uint8_t reserved; 10510f454b93SRui Paulo uint32_t kill_ack; 10520f454b93SRui Paulo uint32_t kill_cts; 10533971d07bSSam Leffler } __packed; 10543971d07bSSam Leffler 10558bb237d9SBernhard Schmidt struct iwn6000_btcoex_config { 10568bb237d9SBernhard Schmidt uint8_t flags; 1057f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_CHAN_INHIBITION 1 1058f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_MASK ((1 << 3) | (1 << 4) | (1 << 5 )) 1059f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_SHIFT 3 1060f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_DISABLED 0 1061f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_LEGACY_2W 1 1062f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_3W 2 1063f8639279SAdrian Chadd #define IWN_BT_FLAG_COEX6000_MODE_4W 3 1064f8639279SAdrian Chadd 1065f8639279SAdrian Chadd #define IWN_BT_FLAG_UCODE_DEFAULT (1 << 6) 1066f8639279SAdrian Chadd #define IWN_BT_FLAG_SYNC_2_BT_DISABLE (1 << 7) 10678bb237d9SBernhard Schmidt uint8_t lead_time; 10688bb237d9SBernhard Schmidt uint8_t max_kill; 10698bb237d9SBernhard Schmidt uint8_t bt3_t7_timer; 10708bb237d9SBernhard Schmidt uint32_t kill_ack; 10718bb237d9SBernhard Schmidt uint32_t kill_cts; 10728bb237d9SBernhard Schmidt uint8_t sample_time; 10738bb237d9SBernhard Schmidt uint8_t bt3_t2_timer; 10748bb237d9SBernhard Schmidt uint16_t bt4_reaction; 10758bb237d9SBernhard Schmidt uint32_t lookup_table[12]; 10768bb237d9SBernhard Schmidt uint16_t bt4_decision; 10778bb237d9SBernhard Schmidt uint16_t valid; 10788bb237d9SBernhard Schmidt uint8_t prio_boost; 10798bb237d9SBernhard Schmidt uint8_t tx_prio_boost; 10808bb237d9SBernhard Schmidt uint16_t rx_prio_boost; 10818bb237d9SBernhard Schmidt } __packed; 10828bb237d9SBernhard Schmidt 1083f8639279SAdrian Chadd /* Structure for enhanced command IWN_CMD_BLUETOOTH for 2000 Series. */ 1084f8639279SAdrian Chadd struct iwn2000_btcoex_config { 1085f8639279SAdrian Chadd uint8_t flags; /* Cf Flags in iwn6000_btcoex_config */ 1086f8639279SAdrian Chadd uint8_t lead_time; 1087f8639279SAdrian Chadd uint8_t max_kill; 1088f8639279SAdrian Chadd uint8_t bt3_t7_timer; 1089f8639279SAdrian Chadd uint32_t kill_ack; 1090f8639279SAdrian Chadd uint32_t kill_cts; 1091f8639279SAdrian Chadd uint8_t sample_time; 1092f8639279SAdrian Chadd uint8_t bt3_t2_timer; 1093f8639279SAdrian Chadd uint16_t bt4_reaction; 1094f8639279SAdrian Chadd uint32_t lookup_table[12]; 1095f8639279SAdrian Chadd uint16_t bt4_decision; 1096f8639279SAdrian Chadd uint16_t valid; 1097f8639279SAdrian Chadd 1098f8639279SAdrian Chadd uint32_t prio_boost; /* size change prior to iwn6000_btcoex_config */ 1099f8639279SAdrian Chadd uint8_t reserved; /* added prior to iwn6000_btcoex_config */ 1100f8639279SAdrian Chadd 1101f8639279SAdrian Chadd uint8_t tx_prio_boost; 1102f8639279SAdrian Chadd uint16_t rx_prio_boost; 1103f8639279SAdrian Chadd } __packed; 1104f8639279SAdrian Chadd 11058bb237d9SBernhard Schmidt struct iwn_btcoex_priotable { 11068bb237d9SBernhard Schmidt uint8_t calib_init1; 11078bb237d9SBernhard Schmidt uint8_t calib_init2; 11088bb237d9SBernhard Schmidt uint8_t calib_periodic_low1; 11098bb237d9SBernhard Schmidt uint8_t calib_periodic_low2; 11108bb237d9SBernhard Schmidt uint8_t calib_periodic_high1; 11118bb237d9SBernhard Schmidt uint8_t calib_periodic_high2; 11128bb237d9SBernhard Schmidt uint8_t dtim; 11138bb237d9SBernhard Schmidt uint8_t scan52; 11148bb237d9SBernhard Schmidt uint8_t scan24; 11158bb237d9SBernhard Schmidt uint8_t reserved[7]; 11168bb237d9SBernhard Schmidt } __packed; 11178bb237d9SBernhard Schmidt 11188bb237d9SBernhard Schmidt struct iwn_btcoex_prot { 11198bb237d9SBernhard Schmidt uint8_t open; 11208bb237d9SBernhard Schmidt uint8_t type; 11218bb237d9SBernhard Schmidt uint8_t reserved[2]; 11228bb237d9SBernhard Schmidt } __packed; 11238bb237d9SBernhard Schmidt 11248f302007SRui Paulo /* Structure for command IWN_CMD_SET_CRITICAL_TEMP. */ 11253971d07bSSam Leffler struct iwn_critical_temp { 11263971d07bSSam Leffler uint32_t reserved; 11273971d07bSSam Leffler uint32_t tempM; 11283971d07bSSam Leffler uint32_t tempR; 11298f302007SRui Paulo /* degK <-> degC conversion macros. */ 11303971d07bSSam Leffler #define IWN_CTOK(c) ((c) + 273) 11313971d07bSSam Leffler #define IWN_KTOC(k) ((k) - 273) 11323971d07bSSam Leffler #define IWN_CTOMUK(c) (((c) * 1000000) + 273150000) 11333971d07bSSam Leffler } __packed; 11343971d07bSSam Leffler 11359dd0e40bSBernhard Schmidt /* Structures for command IWN_CMD_SET_SENSITIVITY. */ 11363971d07bSSam Leffler struct iwn_sensitivity_cmd { 11373971d07bSSam Leffler uint16_t which; 11383971d07bSSam Leffler #define IWN_SENSITIVITY_DEFAULTTBL 0 11393971d07bSSam Leffler #define IWN_SENSITIVITY_WORKTBL 1 11403971d07bSSam Leffler 11413971d07bSSam Leffler uint16_t energy_cck; 11423971d07bSSam Leffler uint16_t energy_ofdm; 11433971d07bSSam Leffler uint16_t corr_ofdm_x1; 11443971d07bSSam Leffler uint16_t corr_ofdm_mrc_x1; 11453971d07bSSam Leffler uint16_t corr_cck_mrc_x4; 11463971d07bSSam Leffler uint16_t corr_ofdm_x4; 11473971d07bSSam Leffler uint16_t corr_ofdm_mrc_x4; 11483971d07bSSam Leffler uint16_t corr_barker; 11493971d07bSSam Leffler uint16_t corr_barker_mrc; 11503971d07bSSam Leffler uint16_t corr_cck_x4; 11513971d07bSSam Leffler uint16_t energy_ofdm_th; 11523971d07bSSam Leffler } __packed; 11533971d07bSSam Leffler 11549dd0e40bSBernhard Schmidt struct iwn_enhanced_sensitivity_cmd { 11559dd0e40bSBernhard Schmidt uint16_t which; 11569dd0e40bSBernhard Schmidt uint16_t energy_cck; 11579dd0e40bSBernhard Schmidt uint16_t energy_ofdm; 11589dd0e40bSBernhard Schmidt uint16_t corr_ofdm_x1; 11599dd0e40bSBernhard Schmidt uint16_t corr_ofdm_mrc_x1; 11609dd0e40bSBernhard Schmidt uint16_t corr_cck_mrc_x4; 11619dd0e40bSBernhard Schmidt uint16_t corr_ofdm_x4; 11629dd0e40bSBernhard Schmidt uint16_t corr_ofdm_mrc_x4; 11639dd0e40bSBernhard Schmidt uint16_t corr_barker; 11649dd0e40bSBernhard Schmidt uint16_t corr_barker_mrc; 11659dd0e40bSBernhard Schmidt uint16_t corr_cck_x4; 11669dd0e40bSBernhard Schmidt uint16_t energy_ofdm_th; 11679dd0e40bSBernhard Schmidt /* "Enhanced" part. */ 11689dd0e40bSBernhard Schmidt uint16_t ina_det_ofdm; 11699dd0e40bSBernhard Schmidt uint16_t ina_det_cck; 11709dd0e40bSBernhard Schmidt uint16_t corr_11_9_en; 11719dd0e40bSBernhard Schmidt uint16_t ofdm_det_slope_mrc; 11729dd0e40bSBernhard Schmidt uint16_t ofdm_det_icept_mrc; 11739dd0e40bSBernhard Schmidt uint16_t ofdm_det_slope; 11749dd0e40bSBernhard Schmidt uint16_t ofdm_det_icept; 11759dd0e40bSBernhard Schmidt uint16_t cck_det_slope_mrc; 11769dd0e40bSBernhard Schmidt uint16_t cck_det_icept_mrc; 11779dd0e40bSBernhard Schmidt uint16_t cck_det_slope; 11789dd0e40bSBernhard Schmidt uint16_t cck_det_icept; 11799dd0e40bSBernhard Schmidt uint16_t reserved; 11809dd0e40bSBernhard Schmidt } __packed; 11819dd0e40bSBernhard Schmidt 11824cfb1a08SAdrian Chadd /* 11834cfb1a08SAdrian Chadd * Define maximal number of calib result send to runtime firmware 11844cfb1a08SAdrian Chadd * PS: TEMP_OFFSET count for 2 (std and v2) 11854cfb1a08SAdrian Chadd */ 11864cfb1a08SAdrian Chadd #define IWN5000_PHY_CALIB_MAX_RESULT 8 11874cfb1a08SAdrian Chadd 11888f302007SRui Paulo /* Structures for command IWN_CMD_PHY_CALIB. */ 11898f302007SRui Paulo struct iwn_phy_calib { 11903971d07bSSam Leffler uint8_t code; 11918f302007SRui Paulo #define IWN4965_PHY_CALIB_DIFF_GAIN 7 11928f302007SRui Paulo #define IWN5000_PHY_CALIB_DC 8 11938f302007SRui Paulo #define IWN5000_PHY_CALIB_LO 9 11948f302007SRui Paulo #define IWN5000_PHY_CALIB_TX_IQ 11 11958f302007SRui Paulo #define IWN5000_PHY_CALIB_CRYSTAL 15 11968f302007SRui Paulo #define IWN5000_PHY_CALIB_BASE_BAND 16 11970f454b93SRui Paulo #define IWN5000_PHY_CALIB_TX_IQ_PERIODIC 17 119889a84499SBernhard Schmidt #define IWN5000_PHY_CALIB_TEMP_OFFSET 18 119989a84499SBernhard Schmidt 12008f302007SRui Paulo #define IWN5000_PHY_CALIB_RESET_NOISE_GAIN 18 12018f302007SRui Paulo #define IWN5000_PHY_CALIB_NOISE_GAIN 19 12023971d07bSSam Leffler 12038f302007SRui Paulo uint8_t group; 12048f302007SRui Paulo uint8_t ngroups; 12058f302007SRui Paulo uint8_t isvalid; 12063971d07bSSam Leffler } __packed; 12073971d07bSSam Leffler 12088f302007SRui Paulo struct iwn5000_phy_calib_crystal { 12098f302007SRui Paulo uint8_t code; 12108f302007SRui Paulo uint8_t group; 12118f302007SRui Paulo uint8_t ngroups; 12128f302007SRui Paulo uint8_t isvalid; 12133971d07bSSam Leffler 12148f302007SRui Paulo uint8_t cap_pin[2]; 12158f302007SRui Paulo uint8_t reserved[2]; 12168f302007SRui Paulo } __packed; 12178f302007SRui Paulo 121889a84499SBernhard Schmidt struct iwn5000_phy_calib_temp_offset { 121989a84499SBernhard Schmidt uint8_t code; 122089a84499SBernhard Schmidt uint8_t group; 122189a84499SBernhard Schmidt uint8_t ngroups; 122289a84499SBernhard Schmidt uint8_t isvalid; 122389a84499SBernhard Schmidt int16_t offset; 122489a84499SBernhard Schmidt #define IWN_DEFAULT_TEMP_OFFSET 2700 122589a84499SBernhard Schmidt 122689a84499SBernhard Schmidt uint16_t reserved; 122789a84499SBernhard Schmidt } __packed; 122889a84499SBernhard Schmidt 1229f8639279SAdrian Chadd struct iwn5000_phy_calib_temp_offsetv2 { 1230f8639279SAdrian Chadd uint8_t code; 1231f8639279SAdrian Chadd uint8_t group; 1232f8639279SAdrian Chadd uint8_t ngroups; 1233f8639279SAdrian Chadd uint8_t isvalid; 1234f8639279SAdrian Chadd int16_t offset_high; 1235f8639279SAdrian Chadd int16_t offset_low; 1236f8639279SAdrian Chadd int16_t burnt_voltage_ref; 1237f8639279SAdrian Chadd int16_t reserved; 1238f8639279SAdrian Chadd } __packed; 1239f8639279SAdrian Chadd 12408f302007SRui Paulo struct iwn_phy_calib_gain { 12418f302007SRui Paulo uint8_t code; 12428f302007SRui Paulo uint8_t group; 12438f302007SRui Paulo uint8_t ngroups; 12448f302007SRui Paulo uint8_t isvalid; 12458f302007SRui Paulo 12468f302007SRui Paulo int8_t gain[3]; 12478f302007SRui Paulo uint8_t reserved; 12488f302007SRui Paulo } __packed; 12498f302007SRui Paulo 12508f302007SRui Paulo /* Structure for command IWN_CMD_SPECTRUM_MEASUREMENT. */ 12518f302007SRui Paulo struct iwn_spectrum_cmd { 12528f302007SRui Paulo uint16_t len; 12538f302007SRui Paulo uint8_t token; 12548f302007SRui Paulo uint8_t id; 12558f302007SRui Paulo uint8_t origin; 12568f302007SRui Paulo uint8_t periodic; 12578f302007SRui Paulo uint16_t timeout; 12588f302007SRui Paulo uint32_t start; 12598f302007SRui Paulo uint32_t reserved1; 12608f302007SRui Paulo uint32_t flags; 12618f302007SRui Paulo uint32_t filter; 12628f302007SRui Paulo uint16_t nchan; 12638f302007SRui Paulo uint16_t reserved2; 12648f302007SRui Paulo struct { 12658f302007SRui Paulo uint32_t duration; 12668f302007SRui Paulo uint8_t chan; 12678f302007SRui Paulo uint8_t type; 12688f302007SRui Paulo #define IWN_MEASUREMENT_BASIC (1 << 0) 12698f302007SRui Paulo #define IWN_MEASUREMENT_CCA (1 << 1) 12708f302007SRui Paulo #define IWN_MEASUREMENT_RPI_HISTOGRAM (1 << 2) 12718f302007SRui Paulo #define IWN_MEASUREMENT_NOISE_HISTOGRAM (1 << 3) 12728f302007SRui Paulo #define IWN_MEASUREMENT_FRAME (1 << 4) 12738f302007SRui Paulo #define IWN_MEASUREMENT_IDLE (1 << 7) 12748f302007SRui Paulo 12758f302007SRui Paulo uint16_t reserved; 12768f302007SRui Paulo } __packed chan[10]; 12778f302007SRui Paulo } __packed; 12788f302007SRui Paulo 12798f302007SRui Paulo /* Structure for IWN_UC_READY notification. */ 12803971d07bSSam Leffler #define IWN_NATTEN_GROUPS 5 12813971d07bSSam Leffler struct iwn_ucode_info { 12823971d07bSSam Leffler uint8_t minor; 12833971d07bSSam Leffler uint8_t major; 12843971d07bSSam Leffler uint16_t reserved1; 12853971d07bSSam Leffler uint8_t revision[8]; 12863971d07bSSam Leffler uint8_t type; 12873971d07bSSam Leffler uint8_t subtype; 12883971d07bSSam Leffler #define IWN_UCODE_RUNTIME 0 12893971d07bSSam Leffler #define IWN_UCODE_INIT 9 12903971d07bSSam Leffler 12913971d07bSSam Leffler uint16_t reserved2; 12923971d07bSSam Leffler uint32_t logptr; 12938f302007SRui Paulo uint32_t errptr; 12943971d07bSSam Leffler uint32_t tstamp; 12953971d07bSSam Leffler uint32_t valid; 12963971d07bSSam Leffler 12978f302007SRui Paulo /* The following fields are for UCODE_INIT only. */ 12983971d07bSSam Leffler int32_t volt; 12993971d07bSSam Leffler struct { 13003971d07bSSam Leffler int32_t chan20MHz; 13013971d07bSSam Leffler int32_t chan40MHz; 13023971d07bSSam Leffler } __packed temp[4]; 13038f302007SRui Paulo int32_t atten[IWN_NATTEN_GROUPS][2]; 13043971d07bSSam Leffler } __packed; 13053971d07bSSam Leffler 13068f302007SRui Paulo /* Structures for IWN_TX_DONE notification. */ 1307f8639279SAdrian Chadd 1308f7efe7e9SAdrian Chadd /* 1309f7efe7e9SAdrian Chadd * TX command response is sent after *agn* transmission attempts. 1310f7efe7e9SAdrian Chadd * 1311f7efe7e9SAdrian Chadd * both postpone and abort status are expected behavior from uCode. there is 1312f7efe7e9SAdrian Chadd * no special operation required from driver; except for RFKILL_FLUSH, 1313f7efe7e9SAdrian Chadd * which required tx flush host command to flush all the tx frames in queues 1314f7efe7e9SAdrian Chadd */ 1315f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_MSK 0x000000ff 1316f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_DELAY_MSK 0x00000040 1317f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_ABORT_MSK 0x00000080 1318f7efe7e9SAdrian Chadd #define IWN_TX_PACKET_MODE_MSK 0x0000ff00 1319f7efe7e9SAdrian Chadd #define IWN_TX_FIFO_NUMBER_MSK 0x00070000 1320f7efe7e9SAdrian Chadd #define IWN_TX_RESERVED 0x00780000 1321f7efe7e9SAdrian Chadd #define IWN_TX_POWER_PA_DETECT_MSK 0x7f800000 1322f7efe7e9SAdrian Chadd #define IWN_TX_ABORT_REQUIRED_MSK 0x80000000 1323f7efe7e9SAdrian Chadd 1324f7efe7e9SAdrian Chadd /* Success status */ 1325f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_SUCCESS 0x01 1326f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_DIRECT_DONE 0x02 1327f7efe7e9SAdrian Chadd 1328f7efe7e9SAdrian Chadd /* postpone TX */ 1329f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_POSTPONE_DELAY 0x40 1330f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_POSTPONE_FEW_BYTES 0x41 1331f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_POSTPONE_BT_PRIO 0x42 1332f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_POSTPONE_QUIET_PERIOD 0x43 1333f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_POSTPONE_CALC_TTAK 0x44 1334f7efe7e9SAdrian Chadd 1335f7efe7e9SAdrian Chadd /* Failures */ 13363971d07bSSam Leffler #define IWN_TX_FAIL 0x80 /* all failures have 0x80 set */ 1337f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY 0x81 13383971d07bSSam Leffler #define IWN_TX_FAIL_SHORT_LIMIT 0x82 /* too many RTS retries */ 13393971d07bSSam Leffler #define IWN_TX_FAIL_LONG_LIMIT 0x83 /* too many retries */ 13403971d07bSSam Leffler #define IWN_TX_FAIL_FIFO_UNDERRRUN 0x84 /* tx fifo not kept running */ 1341f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_DRAIN_FLOW 0x85 1342f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_RFKILL_FLUSH 0x86 1343f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_LIFE_EXPIRE 0x87 13443971d07bSSam Leffler #define IWN_TX_FAIL_DEST_IN_PS 0x88 /* sta found in power save */ 1345f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_HOST_ABORTED 0x89 1346f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_BT_RETRY 0x8a 134749457198SAdrian Chadd #define IWN_TX_FAIL_STA_INVALID 0x8b /* XXX STA invalid (???) */ 1348f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_FRAG_DROPPED 0x8c 1349f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_TID_DISABLE 0x8d 1350f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_FIFO_FLUSHED 0x8e 1351f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_INSUFFICIENT_CF_POLL 0x8f 1352f7efe7e9SAdrian Chadd #define IWN_TX_FAIL_TX_LOCKED 0x90 /* waiting to see traffic */ 1353f7efe7e9SAdrian Chadd #define IWN_TX_STATUS_FAIL_NO_BEACON_ON_RADAR 0x91 1354f7efe7e9SAdrian Chadd 1355f7efe7e9SAdrian Chadd /* 1356f7efe7e9SAdrian Chadd * TX command response for A-MPDU packet responses. 1357f7efe7e9SAdrian Chadd * 1358f7efe7e9SAdrian Chadd * The status response is different to the non A-MPDU responses. 1359f7efe7e9SAdrian Chadd * In addition, the sequence number is treated as the sequence 1360f7efe7e9SAdrian Chadd * number of the TX command, NOT the 802.11 sequence number! 1361f7efe7e9SAdrian Chadd */ 1362f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_TRANSMITTED 0x00 1363f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_UNDERRUN_MSK 0x01 1364f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_FEW_BYTES_MSK 0x04 1365f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_ABORT_MSK 0x08 1366f7efe7e9SAdrian Chadd 1367f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_LAST_SENT_TTL_MSK 0x10 1368f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK 0x20 1369f7efe7e9SAdrian Chadd 1370f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_SCD_QUERY_MSK 0x80 1371f7efe7e9SAdrian Chadd 1372f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_TEST_BAD_CRC32_MSK 0x100 1373f7efe7e9SAdrian Chadd 1374f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_RESPONSE_MSK 0x1ff 1375f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_DUMP_TX_MSK 0x200 1376f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_DELAY_TX_MSK 0x400 1377f7efe7e9SAdrian Chadd 1378f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATUS_MSK 0x00000fff 1379f7efe7e9SAdrian Chadd #define IWN_AGG_TX_TRY_MSK 0x0000f000 13800613dc6fSAndriy Voskoboinyk #define IWN_AGG_TX_TRY_POS 12 13810613dc6fSAndriy Voskoboinyk #define IWN_AGG_TX_TRY_COUNT(status) \ 13820613dc6fSAndriy Voskoboinyk (((status) & IWN_AGG_TX_TRY_MSK) >> IWN_AGG_TX_TRY_POS) 1383f7efe7e9SAdrian Chadd 1384f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_LAST_SENT_MSK \ 1385f7efe7e9SAdrian Chadd (IWN_AGG_TX_STATE_LAST_SENT_TTL_MSK | \ 1386f7efe7e9SAdrian Chadd IWN_AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK) 1387f7efe7e9SAdrian Chadd 13880613dc6fSAndriy Voskoboinyk #define IWN_AGG_TX_STATE_IGNORE_MASK \ 13890613dc6fSAndriy Voskoboinyk (IWN_AGG_TX_STATE_FEW_BYTES_MSK | \ 13900613dc6fSAndriy Voskoboinyk IWN_AGG_TX_STATE_ABORT_MSK) 13910613dc6fSAndriy Voskoboinyk 1392f7efe7e9SAdrian Chadd /* # tx attempts for first frame in aggregation */ 1393f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_TRY_CNT_POS 12 1394f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_TRY_CNT_MSK 0xf000 1395f7efe7e9SAdrian Chadd 1396f7efe7e9SAdrian Chadd /* Command ID and sequence number of Tx command for this frame */ 1397f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_SEQ_NUM_POS 16 1398f7efe7e9SAdrian Chadd #define IWN_AGG_TX_STATE_SEQ_NUM_MSK 0xffff0000 13998f302007SRui Paulo 14008f302007SRui Paulo struct iwn4965_tx_stat { 14018f302007SRui Paulo uint8_t nframes; 14020f454b93SRui Paulo uint8_t btkillcnt; 14030f454b93SRui Paulo uint8_t rtsfailcnt; 14040f454b93SRui Paulo uint8_t ackfailcnt; 14051647639aSBernhard Schmidt uint32_t rate; 14068f302007SRui Paulo uint16_t duration; 14078f302007SRui Paulo uint16_t reserved; 14088f302007SRui Paulo uint32_t power[2]; 14098f302007SRui Paulo uint32_t status; 14103971d07bSSam Leffler } __packed; 14113971d07bSSam Leffler 14128f302007SRui Paulo struct iwn5000_tx_stat { 1413f8639279SAdrian Chadd uint8_t nframes; /* 1 no aggregation, >1 aggregation */ 14140f454b93SRui Paulo uint8_t btkillcnt; 14150f454b93SRui Paulo uint8_t rtsfailcnt; 14160f454b93SRui Paulo uint8_t ackfailcnt; 14171647639aSBernhard Schmidt uint32_t rate; 14188f302007SRui Paulo uint16_t duration; 14198f302007SRui Paulo uint16_t reserved; 14208f302007SRui Paulo uint32_t power[2]; 14218f302007SRui Paulo uint32_t info; 14228f302007SRui Paulo uint16_t seq; 14238f302007SRui Paulo uint16_t len; 14240f454b93SRui Paulo uint8_t tlc; 1425f8639279SAdrian Chadd uint8_t ratid; /* tid (0:3), sta_id (4:7) */ 14260f454b93SRui Paulo uint8_t fc[2]; 14278f302007SRui Paulo uint16_t status; 14288f302007SRui Paulo uint16_t sequence; 14298f302007SRui Paulo } __packed; 14308f302007SRui Paulo 14318f302007SRui Paulo /* Structure for IWN_BEACON_MISSED notification. */ 14323971d07bSSam Leffler struct iwn_beacon_missed { 14333971d07bSSam Leffler uint32_t consecutive; 14343971d07bSSam Leffler uint32_t total; 14353971d07bSSam Leffler uint32_t expected; 14363971d07bSSam Leffler uint32_t received; 14373971d07bSSam Leffler } __packed; 14383971d07bSSam Leffler 14398f302007SRui Paulo /* Structure for IWN_MPDU_RX_DONE notification. */ 14408f302007SRui Paulo struct iwn_rx_mpdu { 14413971d07bSSam Leffler uint16_t len; 14423971d07bSSam Leffler uint16_t reserved; 14433971d07bSSam Leffler } __packed; 14443971d07bSSam Leffler 14458f302007SRui Paulo /* Structures for IWN_RX_DONE and IWN_MPDU_RX_DONE notifications. */ 14468f302007SRui Paulo struct iwn4965_rx_phystat { 14478f302007SRui Paulo uint16_t antenna; 14488f302007SRui Paulo uint16_t agc; 14498f302007SRui Paulo uint8_t rssi[6]; 14508f302007SRui Paulo } __packed; 14518f302007SRui Paulo 14528f302007SRui Paulo struct iwn5000_rx_phystat { 14538f302007SRui Paulo uint32_t reserved1; 14548f302007SRui Paulo uint32_t agc; 14558f302007SRui Paulo uint16_t rssi[3]; 14568f302007SRui Paulo } __packed; 14578f302007SRui Paulo 14583971d07bSSam Leffler struct iwn_rx_stat { 14593971d07bSSam Leffler uint8_t phy_len; 14603971d07bSSam Leffler uint8_t cfg_phy_len; 14613971d07bSSam Leffler #define IWN_STAT_MAXLEN 20 14623971d07bSSam Leffler 14633971d07bSSam Leffler uint8_t id; 14643971d07bSSam Leffler uint8_t reserved1; 14653971d07bSSam Leffler uint64_t tstamp; 14663971d07bSSam Leffler uint32_t beacon; 14673971d07bSSam Leffler uint16_t flags; 14688f302007SRui Paulo #define IWN_STAT_FLAG_SHPREAMBLE (1 << 2) 14693971d07bSSam Leffler 14708f302007SRui Paulo uint16_t chan; 14718f302007SRui Paulo uint8_t phybuf[32]; 14721647639aSBernhard Schmidt uint32_t rate; 1473f8639279SAdrian Chadd /* 1474f8639279SAdrian Chadd * rate bit fields 1475f8639279SAdrian Chadd * 1476f8639279SAdrian Chadd * High-throughput (HT) rate format for bits 7:0 (bit 8 must be "1"): 1477f8639279SAdrian Chadd * 2-0: 0) 6 Mbps 1478f8639279SAdrian Chadd * 1) 12 Mbps 1479f8639279SAdrian Chadd * 2) 18 Mbps 1480f8639279SAdrian Chadd * 3) 24 Mbps 1481f8639279SAdrian Chadd * 4) 36 Mbps 1482f8639279SAdrian Chadd * 5) 48 Mbps 1483f8639279SAdrian Chadd * 6) 54 Mbps 1484f8639279SAdrian Chadd * 7) 60 Mbps 1485f8639279SAdrian Chadd * 1486f8639279SAdrian Chadd * 4-3: 0) Single stream (SISO) 1487f8639279SAdrian Chadd * 1) Dual stream (MIMO) 1488f8639279SAdrian Chadd * 2) Triple stream (MIMO) 1489f8639279SAdrian Chadd * 1490f8639279SAdrian Chadd * 5: Value of 0x20 in bits 7:0 indicates 6 Mbps HT40 duplicate data 1491f8639279SAdrian Chadd * 1492f8639279SAdrian Chadd * Legacy OFDM rate format for bits 7:0 (bit 8 must be "0", bit 9 "0"): 1493f8639279SAdrian Chadd * 3-0: 0xD) 6 Mbps 1494f8639279SAdrian Chadd * 0xF) 9 Mbps 1495f8639279SAdrian Chadd * 0x5) 12 Mbps 1496f8639279SAdrian Chadd * 0x7) 18 Mbps 1497f8639279SAdrian Chadd * 0x9) 24 Mbps 1498f8639279SAdrian Chadd * 0xB) 36 Mbps 1499f8639279SAdrian Chadd * 0x1) 48 Mbps 1500f8639279SAdrian Chadd * 0x3) 54 Mbps 1501f8639279SAdrian Chadd * 1502f8639279SAdrian Chadd * Legacy CCK rate format for bits 7:0 (bit 8 must be "0", bit 9 "1"): 1503f8639279SAdrian Chadd * 6-0: 10) 1 Mbps 1504f8639279SAdrian Chadd * 20) 2 Mbps 1505f8639279SAdrian Chadd * 55) 5.5 Mbps 1506f8639279SAdrian Chadd * 110) 11 Mbps 1507f8639279SAdrian Chadd * 1508f8639279SAdrian Chadd */ 15093971d07bSSam Leffler uint16_t len; 15103971d07bSSam Leffler uint16_t reserve3; 15113971d07bSSam Leffler } __packed; 15123971d07bSSam Leffler 15138f302007SRui Paulo #define IWN_RSSI_TO_DBM 44 15148f302007SRui Paulo 15150f454b93SRui Paulo /* Structure for IWN_RX_COMPRESSED_BA notification. */ 15160f454b93SRui Paulo struct iwn_compressed_ba { 15170f454b93SRui Paulo uint8_t macaddr[IEEE80211_ADDR_LEN]; 15180f454b93SRui Paulo uint16_t reserved; 15190f454b93SRui Paulo uint8_t id; 15200f454b93SRui Paulo uint8_t tid; 15210f454b93SRui Paulo uint16_t seq; 15220f454b93SRui Paulo uint64_t bitmap; 15230f454b93SRui Paulo uint16_t qid; 15240f454b93SRui Paulo uint16_t ssn; 1525f7efe7e9SAdrian Chadd /* extra fields starting with iwn5000 */ 1526f7efe7e9SAdrian Chadd #if 0 1527f7efe7e9SAdrian Chadd uint8_t txed; /* number of frames sent */ 1528f7efe7e9SAdrian Chadd uint8_t txed_2_done; /* number of frames acked */ 1529f7efe7e9SAdrian Chadd uint16_t reserved1; 1530f7efe7e9SAdrian Chadd #endif 15310f454b93SRui Paulo } __packed; 15320f454b93SRui Paulo 15338f302007SRui Paulo /* Structure for IWN_START_SCAN notification. */ 15343971d07bSSam Leffler struct iwn_start_scan { 15353971d07bSSam Leffler uint64_t tstamp; 15363971d07bSSam Leffler uint32_t tbeacon; 15373971d07bSSam Leffler uint8_t chan; 15383971d07bSSam Leffler uint8_t band; 15393971d07bSSam Leffler uint16_t reserved; 15403971d07bSSam Leffler uint32_t status; 15413971d07bSSam Leffler } __packed; 15423971d07bSSam Leffler 15438f302007SRui Paulo /* Structure for IWN_STOP_SCAN notification. */ 15443971d07bSSam Leffler struct iwn_stop_scan { 15453971d07bSSam Leffler uint8_t nchan; 15463971d07bSSam Leffler uint8_t status; 15473971d07bSSam Leffler uint8_t reserved; 15483971d07bSSam Leffler uint8_t chan; 15493971d07bSSam Leffler uint64_t tsf; 15503971d07bSSam Leffler } __packed; 15513971d07bSSam Leffler 15528f302007SRui Paulo /* Structure for IWN_SPECTRUM_MEASUREMENT notification. */ 15538f302007SRui Paulo struct iwn_spectrum_notif { 15548f302007SRui Paulo uint8_t id; 15558f302007SRui Paulo uint8_t token; 15568f302007SRui Paulo uint8_t idx; 15578f302007SRui Paulo uint8_t state; 15588f302007SRui Paulo #define IWN_MEASUREMENT_START 0 15598f302007SRui Paulo #define IWN_MEASUREMENT_STOP 1 15608f302007SRui Paulo 15618f302007SRui Paulo uint32_t start; 15628f302007SRui Paulo uint8_t band; 15638f302007SRui Paulo uint8_t chan; 15648f302007SRui Paulo uint8_t type; 15658f302007SRui Paulo uint8_t reserved1; 15668f302007SRui Paulo uint32_t cca_ofdm; 15678f302007SRui Paulo uint32_t cca_cck; 15688f302007SRui Paulo uint32_t cca_time; 15698f302007SRui Paulo uint8_t basic; 15708f302007SRui Paulo uint8_t reserved2[3]; 15718f302007SRui Paulo uint32_t ofdm[8]; 15728f302007SRui Paulo uint32_t cck[8]; 15738f302007SRui Paulo uint32_t stop; 15748f302007SRui Paulo uint32_t status; 15758f302007SRui Paulo #define IWN_MEASUREMENT_OK 0 15768f302007SRui Paulo #define IWN_MEASUREMENT_CONCURRENT 1 15778f302007SRui Paulo #define IWN_MEASUREMENT_CSA_CONFLICT 2 15788f302007SRui Paulo #define IWN_MEASUREMENT_TGH_CONFLICT 3 15798f302007SRui Paulo #define IWN_MEASUREMENT_STOPPED 6 15808f302007SRui Paulo #define IWN_MEASUREMENT_TIMEOUT 7 15818f302007SRui Paulo #define IWN_MEASUREMENT_FAILED 8 15828f302007SRui Paulo } __packed; 15838f302007SRui Paulo 15840f454b93SRui Paulo /* Structures for IWN_{RX,BEACON}_STATISTICS notification. */ 15853971d07bSSam Leffler struct iwn_rx_phy_stats { 15863971d07bSSam Leffler uint32_t ina; 15873971d07bSSam Leffler uint32_t fina; 15883971d07bSSam Leffler uint32_t bad_plcp; 15893971d07bSSam Leffler uint32_t bad_crc32; 15903971d07bSSam Leffler uint32_t overrun; 15913971d07bSSam Leffler uint32_t eoverrun; 15923971d07bSSam Leffler uint32_t good_crc32; 15933971d07bSSam Leffler uint32_t fa; 15943971d07bSSam Leffler uint32_t bad_fina_sync; 15953971d07bSSam Leffler uint32_t sfd_timeout; 15963971d07bSSam Leffler uint32_t fina_timeout; 15973971d07bSSam Leffler uint32_t no_rts_ack; 15983971d07bSSam Leffler uint32_t rxe_limit; 15993971d07bSSam Leffler uint32_t ack; 16003971d07bSSam Leffler uint32_t cts; 16013971d07bSSam Leffler uint32_t ba_resp; 16023971d07bSSam Leffler uint32_t dsp_kill; 16033971d07bSSam Leffler uint32_t bad_mh; 16043971d07bSSam Leffler uint32_t rssi_sum; 16053971d07bSSam Leffler uint32_t reserved; 16063971d07bSSam Leffler } __packed; 16073971d07bSSam Leffler 16083971d07bSSam Leffler struct iwn_rx_general_stats { 16093971d07bSSam Leffler uint32_t bad_cts; 16103971d07bSSam Leffler uint32_t bad_ack; 16113971d07bSSam Leffler uint32_t not_bss; 16123971d07bSSam Leffler uint32_t filtered; 16133971d07bSSam Leffler uint32_t bad_chan; 16143971d07bSSam Leffler uint32_t beacons; 16153971d07bSSam Leffler uint32_t missed_beacons; 16163971d07bSSam Leffler uint32_t adc_saturated; /* time in 0.8us */ 16173971d07bSSam Leffler uint32_t ina_searched; /* time in 0.8us */ 16183971d07bSSam Leffler uint32_t noise[3]; 16193971d07bSSam Leffler uint32_t flags; 16203971d07bSSam Leffler uint32_t load; 16213971d07bSSam Leffler uint32_t fa; 16223971d07bSSam Leffler uint32_t rssi[3]; 16233971d07bSSam Leffler uint32_t energy[3]; 16243971d07bSSam Leffler } __packed; 16253971d07bSSam Leffler 16263971d07bSSam Leffler struct iwn_rx_ht_phy_stats { 16273971d07bSSam Leffler uint32_t bad_plcp; 16283971d07bSSam Leffler uint32_t overrun; 16293971d07bSSam Leffler uint32_t eoverrun; 16303971d07bSSam Leffler uint32_t good_crc32; 16313971d07bSSam Leffler uint32_t bad_crc32; 16323971d07bSSam Leffler uint32_t bad_mh; 16333971d07bSSam Leffler uint32_t good_ampdu_crc32; 16343971d07bSSam Leffler uint32_t ampdu; 16353971d07bSSam Leffler uint32_t fragment; 16360840bbcdSAdrian Chadd uint32_t unsupport_mcs; 16373971d07bSSam Leffler } __packed; 16383971d07bSSam Leffler 16393971d07bSSam Leffler struct iwn_rx_stats { 16403971d07bSSam Leffler struct iwn_rx_phy_stats ofdm; 16413971d07bSSam Leffler struct iwn_rx_phy_stats cck; 16423971d07bSSam Leffler struct iwn_rx_general_stats general; 16433971d07bSSam Leffler struct iwn_rx_ht_phy_stats ht; 16443971d07bSSam Leffler } __packed; 16453971d07bSSam Leffler 16460840bbcdSAdrian Chadd struct iwn_rx_general_stats_bt { 16470840bbcdSAdrian Chadd struct iwn_rx_general_stats common; 16480840bbcdSAdrian Chadd /* additional stats for bt */ 16490840bbcdSAdrian Chadd uint32_t num_bt_kills; 16500840bbcdSAdrian Chadd uint32_t reserved[2]; 16510840bbcdSAdrian Chadd } __packed; 16520840bbcdSAdrian Chadd 16530840bbcdSAdrian Chadd struct iwn_rx_stats_bt { 16540840bbcdSAdrian Chadd struct iwn_rx_phy_stats ofdm; 16550840bbcdSAdrian Chadd struct iwn_rx_phy_stats cck; 16560840bbcdSAdrian Chadd struct iwn_rx_general_stats_bt general_bt; 16570840bbcdSAdrian Chadd struct iwn_rx_ht_phy_stats ht; 16580840bbcdSAdrian Chadd } __packed; 16590840bbcdSAdrian Chadd 16603971d07bSSam Leffler struct iwn_tx_stats { 16613971d07bSSam Leffler uint32_t preamble; 16623971d07bSSam Leffler uint32_t rx_detected; 16633971d07bSSam Leffler uint32_t bt_defer; 16643971d07bSSam Leffler uint32_t bt_kill; 16653971d07bSSam Leffler uint32_t short_len; 16663971d07bSSam Leffler uint32_t cts_timeout; 16673971d07bSSam Leffler uint32_t ack_timeout; 16683971d07bSSam Leffler uint32_t exp_ack; 16693971d07bSSam Leffler uint32_t ack; 16703971d07bSSam Leffler uint32_t msdu; 16712e9afe95SAdrian Chadd uint32_t burst_err1; 16723971d07bSSam Leffler uint32_t burst_err2; 16733971d07bSSam Leffler uint32_t cts_collision; 16743971d07bSSam Leffler uint32_t ack_collision; 16753971d07bSSam Leffler uint32_t ba_timeout; 16763971d07bSSam Leffler uint32_t ba_resched; 16773971d07bSSam Leffler uint32_t query_ampdu; 16783971d07bSSam Leffler uint32_t query; 16793971d07bSSam Leffler uint32_t query_ampdu_frag; 16803971d07bSSam Leffler uint32_t query_mismatch; 16813971d07bSSam Leffler uint32_t not_ready; 16823971d07bSSam Leffler uint32_t underrun; 16833971d07bSSam Leffler uint32_t bt_ht_kill; 16843971d07bSSam Leffler uint32_t rx_ba_resp; 16850840bbcdSAdrian Chadd /* 16860840bbcdSAdrian Chadd * 6000 series only - LSB=ant A, ant B, ant C, MSB=reserved 16870840bbcdSAdrian Chadd * TX power on chain in 1/2 dBm. 16880840bbcdSAdrian Chadd */ 16890840bbcdSAdrian Chadd uint32_t tx_power; 16900840bbcdSAdrian Chadd uint32_t reserved[1]; 16913971d07bSSam Leffler } __packed; 16923971d07bSSam Leffler 16933971d07bSSam Leffler struct iwn_general_stats { 16940840bbcdSAdrian Chadd uint32_t temp; /* radio temperature */ 16950840bbcdSAdrian Chadd uint32_t temp_m; /* radio voltage */ 16963971d07bSSam Leffler uint32_t burst_check; 16973971d07bSSam Leffler uint32_t burst; 16980840bbcdSAdrian Chadd uint32_t wait_for_silence_timeout_cnt; 16990840bbcdSAdrian Chadd uint32_t reserved1[3]; 17003971d07bSSam Leffler uint32_t sleep; 17013971d07bSSam Leffler uint32_t slot_out; 17023971d07bSSam Leffler uint32_t slot_idle; 17033971d07bSSam Leffler uint32_t ttl_tstamp; 17043971d07bSSam Leffler uint32_t tx_ant_a; 17053971d07bSSam Leffler uint32_t tx_ant_b; 17063971d07bSSam Leffler uint32_t exec; 17073971d07bSSam Leffler uint32_t probe; 17083971d07bSSam Leffler uint32_t reserved2[2]; 17093971d07bSSam Leffler uint32_t rx_enabled; 17100840bbcdSAdrian Chadd /* 17110840bbcdSAdrian Chadd * This is the number of times we have to re-tune 17120840bbcdSAdrian Chadd * in order to get out of bad PHY status. 17130840bbcdSAdrian Chadd */ 17140840bbcdSAdrian Chadd uint32_t num_of_sos_states; 17153971d07bSSam Leffler } __packed; 17163971d07bSSam Leffler 17173971d07bSSam Leffler struct iwn_stats { 17183971d07bSSam Leffler uint32_t flags; 17193971d07bSSam Leffler struct iwn_rx_stats rx; 17203971d07bSSam Leffler struct iwn_tx_stats tx; 17213971d07bSSam Leffler struct iwn_general_stats general; 17220840bbcdSAdrian Chadd uint32_t reserved1[2]; 17233971d07bSSam Leffler } __packed; 17243971d07bSSam Leffler 17250840bbcdSAdrian Chadd struct iwn_bt_activity_stats { 17260840bbcdSAdrian Chadd /* Tx statistics */ 17270840bbcdSAdrian Chadd uint32_t hi_priority_tx_req_cnt; 17280840bbcdSAdrian Chadd uint32_t hi_priority_tx_denied_cnt; 17290840bbcdSAdrian Chadd uint32_t lo_priority_tx_req_cnt; 17300840bbcdSAdrian Chadd uint32_t lo_priority_tx_denied_cnt; 17310840bbcdSAdrian Chadd /* Rx statistics */ 17320840bbcdSAdrian Chadd uint32_t hi_priority_rx_req_cnt; 17330840bbcdSAdrian Chadd uint32_t hi_priority_rx_denied_cnt; 17340840bbcdSAdrian Chadd uint32_t lo_priority_rx_req_cnt; 17350840bbcdSAdrian Chadd uint32_t lo_priority_rx_denied_cnt; 17360840bbcdSAdrian Chadd } __packed; 17370840bbcdSAdrian Chadd 17380840bbcdSAdrian Chadd struct iwn_stats_bt { 17390840bbcdSAdrian Chadd uint32_t flags; 17400840bbcdSAdrian Chadd struct iwn_rx_stats_bt rx_bt; 17410840bbcdSAdrian Chadd struct iwn_tx_stats tx; 17420840bbcdSAdrian Chadd struct iwn_general_stats general; 17430840bbcdSAdrian Chadd struct iwn_bt_activity_stats activity; 17440840bbcdSAdrian Chadd uint32_t reserved1[2]; 17450840bbcdSAdrian Chadd }; 17463971d07bSSam Leffler 17478f302007SRui Paulo /* Firmware error dump. */ 17488f302007SRui Paulo struct iwn_fw_dump { 17498f302007SRui Paulo uint32_t valid; 17508f302007SRui Paulo uint32_t id; 17518f302007SRui Paulo uint32_t pc; 17528f302007SRui Paulo uint32_t branch_link[2]; 17538f302007SRui Paulo uint32_t interrupt_link[2]; 17548f302007SRui Paulo uint32_t error_data[2]; 17558f302007SRui Paulo uint32_t src_line; 17568f302007SRui Paulo uint32_t tsf; 17578f302007SRui Paulo uint32_t time[2]; 17588f302007SRui Paulo } __packed; 17598f302007SRui Paulo 17607832b1f6SBernhard Schmidt /* TLV firmware header. */ 17617832b1f6SBernhard Schmidt struct iwn_fw_tlv_hdr { 17627832b1f6SBernhard Schmidt uint32_t zero; /* Always 0, to differentiate from legacy. */ 17637832b1f6SBernhard Schmidt uint32_t signature; 17647832b1f6SBernhard Schmidt #define IWN_FW_SIGNATURE 0x0a4c5749 /* "IWL\n" */ 17657832b1f6SBernhard Schmidt 17667832b1f6SBernhard Schmidt uint8_t descr[64]; 17677832b1f6SBernhard Schmidt uint32_t rev; 17687832b1f6SBernhard Schmidt #define IWN_FW_API(x) (((x) >> 8) & 0xff) 17697832b1f6SBernhard Schmidt 17707832b1f6SBernhard Schmidt uint32_t build; 17717832b1f6SBernhard Schmidt uint64_t altmask; 17727832b1f6SBernhard Schmidt } __packed; 17737832b1f6SBernhard Schmidt 17747832b1f6SBernhard Schmidt /* TLV header. */ 17757832b1f6SBernhard Schmidt struct iwn_fw_tlv { 17767832b1f6SBernhard Schmidt uint16_t type; 17777832b1f6SBernhard Schmidt #define IWN_FW_TLV_MAIN_TEXT 1 17787832b1f6SBernhard Schmidt #define IWN_FW_TLV_MAIN_DATA 2 17797832b1f6SBernhard Schmidt #define IWN_FW_TLV_INIT_TEXT 3 17807832b1f6SBernhard Schmidt #define IWN_FW_TLV_INIT_DATA 4 17817832b1f6SBernhard Schmidt #define IWN_FW_TLV_BOOT_TEXT 5 17827832b1f6SBernhard Schmidt #define IWN_FW_TLV_PBREQ_MAXLEN 6 1783f8639279SAdrian Chadd #define IWN_FW_TLV_PAN 7 1784f8639279SAdrian Chadd #define IWN_FW_TLV_RUNT_EVTLOG_PTR 8 1785f8639279SAdrian Chadd #define IWN_FW_TLV_RUNT_EVTLOG_SIZE 9 1786f8639279SAdrian Chadd #define IWN_FW_TLV_RUNT_ERRLOG_PTR 10 1787f8639279SAdrian Chadd #define IWN_FW_TLV_INIT_EVTLOG_PTR 11 1788f8639279SAdrian Chadd #define IWN_FW_TLV_INIT_EVTLOG_SIZE 12 1789f8639279SAdrian Chadd #define IWN_FW_TLV_INIT_ERRLOG_PTR 13 17909ff2129fSBernhard Schmidt #define IWN_FW_TLV_ENH_SENS 14 17919ff2129fSBernhard Schmidt #define IWN_FW_TLV_PHY_CALIB 15 1792f8639279SAdrian Chadd #define IWN_FW_TLV_WOWLAN_INST 16 1793f8639279SAdrian Chadd #define IWN_FW_TLV_WOWLAN_DATA 17 1794f8639279SAdrian Chadd #define IWN_FW_TLV_FLAGS 18 17957832b1f6SBernhard Schmidt 17967832b1f6SBernhard Schmidt uint16_t alt; 17977832b1f6SBernhard Schmidt uint32_t len; 17987832b1f6SBernhard Schmidt } __packed; 17997832b1f6SBernhard Schmidt 18008f302007SRui Paulo #define IWN4965_FW_TEXT_MAXSZ ( 96 * 1024) 18018f302007SRui Paulo #define IWN4965_FW_DATA_MAXSZ ( 40 * 1024) 18028f302007SRui Paulo #define IWN5000_FW_TEXT_MAXSZ (256 * 1024) 18038f302007SRui Paulo #define IWN5000_FW_DATA_MAXSZ ( 80 * 1024) 18043971d07bSSam Leffler #define IWN_FW_BOOT_TEXT_MAXSZ 1024 18058f302007SRui Paulo #define IWN4965_FWSZ (IWN4965_FW_TEXT_MAXSZ + IWN4965_FW_DATA_MAXSZ) 18068f302007SRui Paulo #define IWN5000_FWSZ IWN5000_FW_TEXT_MAXSZ 18073971d07bSSam Leffler 18083971d07bSSam Leffler /* 18093b64bbd2SAdrian Chadd * Microcode flags TLV (18.) 18103b64bbd2SAdrian Chadd */ 18113b64bbd2SAdrian Chadd 18123b64bbd2SAdrian Chadd /** 18133b64bbd2SAdrian Chadd * enum iwn_ucode_tlv_flag - ucode API flags 18143b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously 18153b64bbd2SAdrian Chadd * was a separate TLV but moved here to save space. 18163b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID, 18173b64bbd2SAdrian Chadd * treats good CRC threshold as a boolean 18183b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w). 18193b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P. 18203b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS 18213b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD 18223b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan 18233b64bbd2SAdrian Chadd * offload profile config command. 18243b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_RX_ENERGY_API: supports rx signal strength api 18253b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2: using the new time event API. 18263b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six 18273b64bbd2SAdrian Chadd * (rather than two) IPv6 addresses 18283b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_BF_UPDATED: new beacon filtering API 18293b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID: not sending a probe with the SSID element 18303b64bbd2SAdrian Chadd * from the probe request template. 18313b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API: modified D3 API to allow keeping 18323b64bbd2SAdrian Chadd * connection when going back to D0 18333b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL: new NS offload (small version) 18343b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE: new NS offload (large version) 18353b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_SCHED_SCAN: this uCode image supports scheduled scan. 18363b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_STA_KEY_CMD: new ADD_STA and ADD_STA_KEY command API 18373b64bbd2SAdrian Chadd * @IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD: support device wide power command 18383b64bbd2SAdrian Chadd * containing CAM (Continuous Active Mode) indication. 18393b64bbd2SAdrian Chadd */ 18403b64bbd2SAdrian Chadd enum iwn_ucode_tlv_flag { 18413b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_PAN = (1 << 0), 18423b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_NEWSCAN = (1 << 1), 18433b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_MFP = (1 << 2), 18443b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_P2P = (1 << 3), 18453b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_DW_BC_TABLE = (1 << 4), 18463b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_NEWBT_COEX = (1 << 5), 18473b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_UAPSD = (1 << 6), 18483b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_SHORT_BL = (1 << 7), 18493b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_RX_ENERGY_API = (1 << 8), 18503b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_TIME_EVENT_API_V2 = (1 << 9), 18513b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS = (1 << 10), 18523b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_BF_UPDATED = (1 << 11), 18533b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_NO_BASIC_SSID = (1 << 12), 18543b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_D3_CONTINUITY_API = (1 << 14), 18553b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_SMALL = (1 << 15), 18563b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_NEW_NSOFFL_LARGE = (1 << 16), 18573b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_SCHED_SCAN = (1 << 17), 18583b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_STA_KEY_CMD = (1 << 19), 18593b64bbd2SAdrian Chadd IWN_UCODE_TLV_FLAGS_DEVICE_PS_CMD = (1 << 20), 18603b64bbd2SAdrian Chadd }; 18613b64bbd2SAdrian Chadd 18623b64bbd2SAdrian Chadd /* 18633971d07bSSam Leffler * Offsets into EEPROM. 18643971d07bSSam Leffler */ 18653971d07bSSam Leffler #define IWN_EEPROM_MAC 0x015 18669dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP 0x045 18678f302007SRui Paulo #define IWN_EEPROM_RFCFG 0x048 18688f302007SRui Paulo #define IWN4965_EEPROM_DOMAIN 0x060 18698f302007SRui Paulo #define IWN4965_EEPROM_BAND1 0x063 18708f302007SRui Paulo #define IWN5000_EEPROM_REG 0x066 18718f302007SRui Paulo #define IWN5000_EEPROM_CAL 0x067 18728f302007SRui Paulo #define IWN4965_EEPROM_BAND2 0x072 18738f302007SRui Paulo #define IWN4965_EEPROM_BAND3 0x080 18748f302007SRui Paulo #define IWN4965_EEPROM_BAND4 0x08d 18758f302007SRui Paulo #define IWN4965_EEPROM_BAND5 0x099 18768f302007SRui Paulo #define IWN4965_EEPROM_BAND6 0x0a0 18778f302007SRui Paulo #define IWN4965_EEPROM_BAND7 0x0a8 18788f302007SRui Paulo #define IWN4965_EEPROM_MAXPOW 0x0e8 18798f302007SRui Paulo #define IWN4965_EEPROM_VOLTAGE 0x0e9 18808f302007SRui Paulo #define IWN4965_EEPROM_BANDS 0x0ea 18818f302007SRui Paulo /* Indirect offsets. */ 1882f8639279SAdrian Chadd #define IWN5000_EEPROM_NO_HT40 0x000 18838f302007SRui Paulo #define IWN5000_EEPROM_DOMAIN 0x001 18848f302007SRui Paulo #define IWN5000_EEPROM_BAND1 0x004 18858f302007SRui Paulo #define IWN5000_EEPROM_BAND2 0x013 18868f302007SRui Paulo #define IWN5000_EEPROM_BAND3 0x021 18878f302007SRui Paulo #define IWN5000_EEPROM_BAND4 0x02e 18888f302007SRui Paulo #define IWN5000_EEPROM_BAND5 0x03a 18898f302007SRui Paulo #define IWN5000_EEPROM_BAND6 0x041 1890688f9483SBernhard Schmidt #define IWN6000_EEPROM_BAND6 0x040 18918f302007SRui Paulo #define IWN5000_EEPROM_BAND7 0x049 18920f454b93SRui Paulo #define IWN6000_EEPROM_ENHINFO 0x054 18938f302007SRui Paulo #define IWN5000_EEPROM_CRYSTAL 0x128 18948f302007SRui Paulo #define IWN5000_EEPROM_TEMP 0x12a 18958f302007SRui Paulo #define IWN5000_EEPROM_VOLT 0x12b 18968f302007SRui Paulo 18979dd0e40bSBernhard Schmidt /* Possible flags for IWN_EEPROM_SKU_CAP. */ 18989dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_11N (1 << 6) 18999dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_AMT (1 << 7) 19009dd0e40bSBernhard Schmidt #define IWN_EEPROM_SKU_CAP_IPAN (1 << 8) 19019dd0e40bSBernhard Schmidt 19028f302007SRui Paulo /* Possible flags for IWN_EEPROM_RFCFG. */ 19038f302007SRui Paulo #define IWN_RFCFG_TYPE(x) (((x) >> 0) & 0x3) 19048f302007SRui Paulo #define IWN_RFCFG_STEP(x) (((x) >> 2) & 0x3) 19058f302007SRui Paulo #define IWN_RFCFG_DASH(x) (((x) >> 4) & 0x3) 19068f302007SRui Paulo #define IWN_RFCFG_TXANTMSK(x) (((x) >> 8) & 0xf) 19078f302007SRui Paulo #define IWN_RFCFG_RXANTMSK(x) (((x) >> 12) & 0xf) 19083971d07bSSam Leffler 19093971d07bSSam Leffler struct iwn_eeprom_chan { 19103971d07bSSam Leffler uint8_t flags; 19113971d07bSSam Leffler #define IWN_EEPROM_CHAN_VALID (1 << 0) 19128f302007SRui Paulo #define IWN_EEPROM_CHAN_IBSS (1 << 1) 19138f302007SRui Paulo #define IWN_EEPROM_CHAN_ACTIVE (1 << 3) 19148f302007SRui Paulo #define IWN_EEPROM_CHAN_RADAR (1 << 4) 19153971d07bSSam Leffler 19163971d07bSSam Leffler int8_t maxpwr; 19173971d07bSSam Leffler } __packed; 19183971d07bSSam Leffler 19190f454b93SRui Paulo struct iwn_eeprom_enhinfo { 19203c2a1fc3SBernhard Schmidt uint8_t flags; 19213c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_VALID 0x01 19223c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_5GHZ 0x02 19233c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_OFDM 0x04 19243c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_HT40 0x08 19253c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_HTAP 0x10 19263c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_RES1 0x20 19273c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_RES2 0x40 19283c2a1fc3SBernhard Schmidt #define IWN_ENHINFO_COMMON 0x80 19293c2a1fc3SBernhard Schmidt 19303c2a1fc3SBernhard Schmidt uint8_t chan; 19310f454b93SRui Paulo int8_t chain[3]; /* max power in half-dBm */ 19320f454b93SRui Paulo uint8_t reserved; 19330f454b93SRui Paulo int8_t mimo2; /* max power in half-dBm */ 19340f454b93SRui Paulo int8_t mimo3; /* max power in half-dBm */ 19350f454b93SRui Paulo } __packed; 19360f454b93SRui Paulo 19377373959eSBernhard Schmidt struct iwn5000_eeprom_calib_hdr { 19387373959eSBernhard Schmidt uint8_t version; 19397373959eSBernhard Schmidt uint8_t pa_type; 19407373959eSBernhard Schmidt uint16_t volt; 19417373959eSBernhard Schmidt } __packed; 19427373959eSBernhard Schmidt 19433971d07bSSam Leffler #define IWN_NSAMPLES 3 19448f302007SRui Paulo struct iwn4965_eeprom_chan_samples { 19453971d07bSSam Leffler uint8_t num; 19463971d07bSSam Leffler struct { 19473971d07bSSam Leffler uint8_t temp; 19483971d07bSSam Leffler uint8_t gain; 19493971d07bSSam Leffler uint8_t power; 19503971d07bSSam Leffler int8_t pa_det; 19518f302007SRui Paulo } samples[2][IWN_NSAMPLES]; 19523971d07bSSam Leffler } __packed; 19533971d07bSSam Leffler 19543971d07bSSam Leffler #define IWN_NBANDS 8 19558f302007SRui Paulo struct iwn4965_eeprom_band { 19563971d07bSSam Leffler uint8_t lo; /* low channel number */ 19573971d07bSSam Leffler uint8_t hi; /* high channel number */ 19588f302007SRui Paulo struct iwn4965_eeprom_chan_samples chans[2]; 19593971d07bSSam Leffler } __packed; 19603971d07bSSam Leffler 19618f302007SRui Paulo /* 19628f302007SRui Paulo * Offsets of channels descriptions in EEPROM. 19638f302007SRui Paulo */ 19648f302007SRui Paulo static const uint32_t iwn4965_regulatory_bands[IWN_NBANDS] = { 19658f302007SRui Paulo IWN4965_EEPROM_BAND1, 19668f302007SRui Paulo IWN4965_EEPROM_BAND2, 19678f302007SRui Paulo IWN4965_EEPROM_BAND3, 19688f302007SRui Paulo IWN4965_EEPROM_BAND4, 19698f302007SRui Paulo IWN4965_EEPROM_BAND5, 19708f302007SRui Paulo IWN4965_EEPROM_BAND6, 19718f302007SRui Paulo IWN4965_EEPROM_BAND7 19728f302007SRui Paulo }; 19738f302007SRui Paulo 19748f302007SRui Paulo static const uint32_t iwn5000_regulatory_bands[IWN_NBANDS] = { 19758f302007SRui Paulo IWN5000_EEPROM_BAND1, 19768f302007SRui Paulo IWN5000_EEPROM_BAND2, 19778f302007SRui Paulo IWN5000_EEPROM_BAND3, 19788f302007SRui Paulo IWN5000_EEPROM_BAND4, 19798f302007SRui Paulo IWN5000_EEPROM_BAND5, 19808f302007SRui Paulo IWN5000_EEPROM_BAND6, 19818f302007SRui Paulo IWN5000_EEPROM_BAND7 19828f302007SRui Paulo }; 19838f302007SRui Paulo 1984688f9483SBernhard Schmidt static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = { 1985688f9483SBernhard Schmidt IWN5000_EEPROM_BAND1, 1986688f9483SBernhard Schmidt IWN5000_EEPROM_BAND2, 1987688f9483SBernhard Schmidt IWN5000_EEPROM_BAND3, 1988688f9483SBernhard Schmidt IWN5000_EEPROM_BAND4, 1989688f9483SBernhard Schmidt IWN5000_EEPROM_BAND5, 1990688f9483SBernhard Schmidt IWN6000_EEPROM_BAND6, 1991688f9483SBernhard Schmidt IWN5000_EEPROM_BAND7 1992688f9483SBernhard Schmidt }; 1993688f9483SBernhard Schmidt 1994f8639279SAdrian Chadd static const uint32_t iwn1000_regulatory_bands[IWN_NBANDS] = { 1995f8639279SAdrian Chadd IWN5000_EEPROM_BAND1, 1996f8639279SAdrian Chadd IWN5000_EEPROM_BAND2, 1997f8639279SAdrian Chadd IWN5000_EEPROM_BAND3, 1998f8639279SAdrian Chadd IWN5000_EEPROM_BAND4, 1999f8639279SAdrian Chadd IWN5000_EEPROM_BAND5, 2000f8639279SAdrian Chadd IWN5000_EEPROM_BAND6, 2001f8639279SAdrian Chadd IWN5000_EEPROM_NO_HT40, 2002f8639279SAdrian Chadd }; 2003f8639279SAdrian Chadd 20044cfb1a08SAdrian Chadd static const uint32_t iwn2030_regulatory_bands[IWN_NBANDS] = { 20054cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND1, 20064cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND2, 20074cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND3, 20084cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND4, 20094cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND5, 20104cfb1a08SAdrian Chadd IWN6000_EEPROM_BAND6, 20114cfb1a08SAdrian Chadd IWN5000_EEPROM_BAND7 20124cfb1a08SAdrian Chadd }; 20134cfb1a08SAdrian Chadd 20148f302007SRui Paulo #define IWN_CHAN_BANDS_COUNT 7 20158f302007SRui Paulo #define IWN_MAX_CHAN_PER_BAND 14 20168f302007SRui Paulo static const struct iwn_chan_band { 20178f302007SRui Paulo uint8_t nchan; 20188f302007SRui Paulo uint8_t chan[IWN_MAX_CHAN_PER_BAND]; 20198f302007SRui Paulo } iwn_bands[] = { 20208f302007SRui Paulo /* 20MHz channels, 2GHz band. */ 20218f302007SRui Paulo { 14, { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } }, 20228f302007SRui Paulo /* 20MHz channels, 5GHz band. */ 20238f302007SRui Paulo { 13, { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } }, 20248f302007SRui Paulo { 12, { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } }, 20258f302007SRui Paulo { 11, { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } }, 20268f302007SRui Paulo { 6, { 145, 149, 153, 157, 161, 165 } }, 20278f302007SRui Paulo /* 40MHz channels (primary channels), 2GHz band. */ 20288f302007SRui Paulo { 7, { 1, 2, 3, 4, 5, 6, 7 } }, 20298f302007SRui Paulo /* 40MHz channels (primary channels), 5GHz band. */ 20308f302007SRui Paulo { 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } } 20318f302007SRui Paulo }; 20328f302007SRui Paulo 2033f8639279SAdrian Chadd static const uint8_t iwn_bss_ac_to_queue[] = { 2034f8639279SAdrian Chadd 2, 3, 1, 0, 2035f8639279SAdrian Chadd }; 2036f8639279SAdrian Chadd 2037f8639279SAdrian Chadd static const uint8_t iwn_pan_ac_to_queue[] = { 2038f8639279SAdrian Chadd 5, 4, 6, 7, 2039f8639279SAdrian Chadd }; 20400f454b93SRui Paulo #define IWN1000_OTP_NBLOCKS 3 20410f454b93SRui Paulo #define IWN6000_OTP_NBLOCKS 4 20420f454b93SRui Paulo #define IWN6050_OTP_NBLOCKS 7 20438f302007SRui Paulo 20448f302007SRui Paulo /* HW rate indices. */ 20458f302007SRui Paulo #define IWN_RIDX_CCK1 0 20468f302007SRui Paulo #define IWN_RIDX_OFDM6 4 20478f302007SRui Paulo 20488f302007SRui Paulo #define IWN4965_MAX_PWR_INDEX 107 2049f8639279SAdrian Chadd #define IWN_POWERSAVE_LVL_NONE 0 2050f8639279SAdrian Chadd #define IWN_POWERSAVE_LVL_VOIP_COMPATIBLE 1 2051f8639279SAdrian Chadd #define IWN_POWERSAVE_LVL_MAX 5 2052f8639279SAdrian Chadd 2053f8639279SAdrian Chadd #define IWN_POWERSAVE_LVL_DEFAULT IWN_POWERSAVE_LVL_NONE 2054f8639279SAdrian Chadd 2055f8639279SAdrian Chadd /* DTIM value to pass in for IWN_POWERSAVE_LVL_VOIP_COMPATIBLE */ 2056f8639279SAdrian Chadd #define IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE 2 20573971d07bSSam Leffler 20583971d07bSSam Leffler /* 20593971d07bSSam Leffler * RF Tx gain values from highest to lowest power (values obtained from 20603971d07bSSam Leffler * the reference driver.) 20613971d07bSSam Leffler */ 20628f302007SRui Paulo static const uint8_t iwn4965_rf_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = { 20633971d07bSSam Leffler 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 0x3c, 0x3c, 20643971d07bSSam Leffler 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x38, 20653971d07bSSam Leffler 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 0x35, 0x35, 20663971d07bSSam Leffler 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x31, 0x31, 20673971d07bSSam Leffler 0x31, 0x30, 0x30, 0x30, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 20683971d07bSSam Leffler 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 0x01, 0x01, 20693971d07bSSam Leffler 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20703971d07bSSam Leffler 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20713971d07bSSam Leffler 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 20723971d07bSSam Leffler 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 20733971d07bSSam Leffler }; 20743971d07bSSam Leffler 20758f302007SRui Paulo static const uint8_t iwn4965_rf_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = { 20763971d07bSSam Leffler 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x3e, 0x3e, 0x3e, 0x3d, 0x3d, 0x3d, 20773971d07bSSam Leffler 0x3c, 0x3c, 0x3c, 0x3b, 0x3b, 0x3b, 0x3a, 0x3a, 0x3a, 0x39, 0x39, 20783971d07bSSam Leffler 0x39, 0x38, 0x38, 0x38, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x35, 20793971d07bSSam Leffler 0x35, 0x35, 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 20803971d07bSSam Leffler 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x25, 0x25, 0x25, 0x24, 0x24, 20813971d07bSSam Leffler 0x24, 0x23, 0x23, 0x23, 0x22, 0x18, 0x18, 0x17, 0x17, 0x17, 0x16, 20823971d07bSSam Leffler 0x16, 0x16, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 20833971d07bSSam Leffler 0x12, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 20843971d07bSSam Leffler 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x01, 20853971d07bSSam Leffler 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 20863971d07bSSam Leffler }; 20873971d07bSSam Leffler 20883971d07bSSam Leffler /* 20893971d07bSSam Leffler * DSP pre-DAC gain values from highest to lowest power (values obtained 20903971d07bSSam Leffler * from the reference driver.) 20913971d07bSSam Leffler */ 20928f302007SRui Paulo static const uint8_t iwn4965_dsp_gain_2ghz[IWN4965_MAX_PWR_INDEX + 1] = { 20933971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 20943971d07bSSam Leffler 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 20953971d07bSSam Leffler 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 20963971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 20973971d07bSSam Leffler 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 20983971d07bSSam Leffler 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 20993971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x61, 0x60, 0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 21003971d07bSSam Leffler 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50, 0x4f, 21013971d07bSSam Leffler 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48, 0x47, 0x46, 0x45, 0x44, 21023971d07bSSam Leffler 0x43, 0x42, 0x41, 0x40, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b 21033971d07bSSam Leffler }; 21043971d07bSSam Leffler 21058f302007SRui Paulo static const uint8_t iwn4965_dsp_gain_5ghz[IWN4965_MAX_PWR_INDEX + 1] = { 21063971d07bSSam Leffler 0x7b, 0x75, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 21073971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 21083971d07bSSam Leffler 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 21093971d07bSSam Leffler 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 21103971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 21113971d07bSSam Leffler 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 21123971d07bSSam Leffler 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 21133971d07bSSam Leffler 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 21143971d07bSSam Leffler 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 0x68, 0x62, 0x6e, 21153971d07bSSam Leffler 0x68, 0x62, 0x6e, 0x68, 0x62, 0x5d, 0x58, 0x53, 0x4e 21163971d07bSSam Leffler }; 21173971d07bSSam Leffler 21188f302007SRui Paulo /* 21198f302007SRui Paulo * Power saving settings (values obtained from the reference driver.) 21208f302007SRui Paulo */ 21218f302007SRui Paulo #define IWN_NDTIMRANGES 3 21228f302007SRui Paulo #define IWN_NPOWERLEVELS 6 21238f302007SRui Paulo static const struct iwn_pmgt { 21248f302007SRui Paulo uint32_t rxtimeout; 21258f302007SRui Paulo uint32_t txtimeout; 21268f302007SRui Paulo uint32_t intval[5]; 21278f302007SRui Paulo int skip_dtim; 21288f302007SRui Paulo } iwn_pmgt[IWN_NDTIMRANGES][IWN_NPOWERLEVELS] = { 21298f302007SRui Paulo /* DTIM <= 2 */ 21308f302007SRui Paulo { 21318f302007SRui Paulo { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ 21328f302007SRui Paulo { 200, 500, { 1, 2, 2, 2, -1 }, 0 }, /* PS level 1 */ 21338f302007SRui Paulo { 200, 300, { 1, 2, 2, 2, -1 }, 0 }, /* PS level 2 */ 21348f302007SRui Paulo { 50, 100, { 2, 2, 2, 2, -1 }, 0 }, /* PS level 3 */ 21358f302007SRui Paulo { 50, 25, { 2, 2, 4, 4, -1 }, 1 }, /* PS level 4 */ 21368f302007SRui Paulo { 25, 25, { 2, 2, 4, 6, -1 }, 2 } /* PS level 5 */ 21378f302007SRui Paulo }, 21388f302007SRui Paulo /* 3 <= DTIM <= 10 */ 21398f302007SRui Paulo { 21408f302007SRui Paulo { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ 21418f302007SRui Paulo { 200, 500, { 1, 2, 3, 4, 4 }, 0 }, /* PS level 1 */ 21428f302007SRui Paulo { 200, 300, { 1, 2, 3, 4, 7 }, 0 }, /* PS level 2 */ 21438f302007SRui Paulo { 50, 100, { 2, 4, 6, 7, 9 }, 0 }, /* PS level 3 */ 21448f302007SRui Paulo { 50, 25, { 2, 4, 6, 9, 10 }, 1 }, /* PS level 4 */ 21458f302007SRui Paulo { 25, 25, { 2, 4, 7, 10, 10 }, 2 } /* PS level 5 */ 21468f302007SRui Paulo }, 21478f302007SRui Paulo /* DTIM >= 11 */ 21488f302007SRui Paulo { 21498f302007SRui Paulo { 0, 0, { 0, 0, 0, 0, 0 }, 0 }, /* CAM */ 21508f302007SRui Paulo { 200, 500, { 1, 2, 3, 4, -1 }, 0 }, /* PS level 1 */ 21518f302007SRui Paulo { 200, 300, { 2, 4, 6, 7, -1 }, 0 }, /* PS level 2 */ 21528f302007SRui Paulo { 50, 100, { 2, 7, 9, 9, -1 }, 0 }, /* PS level 3 */ 21538f302007SRui Paulo { 50, 25, { 2, 7, 9, 9, -1 }, 0 }, /* PS level 4 */ 21548f302007SRui Paulo { 25, 25, { 4, 7, 10, 10, -1 }, 0 } /* PS level 5 */ 21558f302007SRui Paulo } 21568f302007SRui Paulo }; 21578f302007SRui Paulo 21588f302007SRui Paulo struct iwn_sensitivity_limits { 21598f302007SRui Paulo uint32_t min_ofdm_x1; 21608f302007SRui Paulo uint32_t max_ofdm_x1; 21618f302007SRui Paulo uint32_t min_ofdm_mrc_x1; 21628f302007SRui Paulo uint32_t max_ofdm_mrc_x1; 21638f302007SRui Paulo uint32_t min_ofdm_x4; 21648f302007SRui Paulo uint32_t max_ofdm_x4; 21658f302007SRui Paulo uint32_t min_ofdm_mrc_x4; 21668f302007SRui Paulo uint32_t max_ofdm_mrc_x4; 21678f302007SRui Paulo uint32_t min_cck_x4; 21688f302007SRui Paulo uint32_t max_cck_x4; 21698f302007SRui Paulo uint32_t min_cck_mrc_x4; 21708f302007SRui Paulo uint32_t max_cck_mrc_x4; 21718f302007SRui Paulo uint32_t min_energy_cck; 21728f302007SRui Paulo uint32_t energy_cck; 21738f302007SRui Paulo uint32_t energy_ofdm; 2174929f6e3cSAdrian Chadd uint32_t barker_mrc; 21758f302007SRui Paulo }; 21768f302007SRui Paulo 21778f302007SRui Paulo /* 21788f302007SRui Paulo * RX sensitivity limits (values obtained from the reference driver.) 21798f302007SRui Paulo */ 21808f302007SRui Paulo static const struct iwn_sensitivity_limits iwn4965_sensitivity_limits = { 21818f302007SRui Paulo 105, 140, 21820f454b93SRui Paulo 220, 270, 21838f302007SRui Paulo 85, 120, 21848f302007SRui Paulo 170, 210, 21858f302007SRui Paulo 125, 200, 21868f302007SRui Paulo 200, 400, 21878f302007SRui Paulo 97, 21888f302007SRui Paulo 100, 2189929f6e3cSAdrian Chadd 100, 2190929f6e3cSAdrian Chadd 390 21918f302007SRui Paulo }; 21928f302007SRui Paulo 21938f302007SRui Paulo static const struct iwn_sensitivity_limits iwn5000_sensitivity_limits = { 21947373959eSBernhard Schmidt 120, 120, /* min = max for performance bug in DSP. */ 21957373959eSBernhard Schmidt 240, 240, /* min = max for performance bug in DSP. */ 21968f302007SRui Paulo 90, 120, 21978f302007SRui Paulo 170, 210, 21988f302007SRui Paulo 125, 200, 21998f302007SRui Paulo 170, 400, 22008f302007SRui Paulo 95, 22018f302007SRui Paulo 95, 2202929f6e3cSAdrian Chadd 95, 2203929f6e3cSAdrian Chadd 390 22048f302007SRui Paulo }; 22058f302007SRui Paulo 22060f454b93SRui Paulo static const struct iwn_sensitivity_limits iwn5150_sensitivity_limits = { 22070f454b93SRui Paulo 105, 105, /* min = max for performance bug in DSP. */ 22080f454b93SRui Paulo 220, 220, /* min = max for performance bug in DSP. */ 22090f454b93SRui Paulo 90, 120, 22100f454b93SRui Paulo 170, 210, 22110f454b93SRui Paulo 125, 200, 22120f454b93SRui Paulo 170, 400, 22130f454b93SRui Paulo 95, 22140f454b93SRui Paulo 95, 2215929f6e3cSAdrian Chadd 95, 2216929f6e3cSAdrian Chadd 390, 22170f454b93SRui Paulo }; 22180f454b93SRui Paulo 22197373959eSBernhard Schmidt static const struct iwn_sensitivity_limits iwn1000_sensitivity_limits = { 22207373959eSBernhard Schmidt 120, 155, 22217373959eSBernhard Schmidt 240, 290, 22227373959eSBernhard Schmidt 90, 120, 22237373959eSBernhard Schmidt 170, 210, 22247373959eSBernhard Schmidt 125, 200, 22257373959eSBernhard Schmidt 170, 400, 22267373959eSBernhard Schmidt 95, 22277373959eSBernhard Schmidt 95, 2228929f6e3cSAdrian Chadd 95, 2229929f6e3cSAdrian Chadd 390, 22307373959eSBernhard Schmidt }; 22317373959eSBernhard Schmidt 22320f454b93SRui Paulo static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = { 22337373959eSBernhard Schmidt 105, 110, 22340f454b93SRui Paulo 192, 232, 22350f454b93SRui Paulo 80, 145, 22360f454b93SRui Paulo 128, 232, 22370f454b93SRui Paulo 125, 175, 22380f454b93SRui Paulo 160, 310, 22390f454b93SRui Paulo 97, 22400f454b93SRui Paulo 97, 2241929f6e3cSAdrian Chadd 100, 2242929f6e3cSAdrian Chadd 390 22430f454b93SRui Paulo }; 22440f454b93SRui Paulo 2245929f6e3cSAdrian Chadd static const struct iwn_sensitivity_limits iwn6235_sensitivity_limits = { 2246929f6e3cSAdrian Chadd 105, 110, 2247929f6e3cSAdrian Chadd 192, 232, 2248929f6e3cSAdrian Chadd 80, 145, 2249929f6e3cSAdrian Chadd 128, 232, 2250929f6e3cSAdrian Chadd 125, 175, 2251929f6e3cSAdrian Chadd 160, 310, 2252929f6e3cSAdrian Chadd 100, 2253929f6e3cSAdrian Chadd 110, 2254929f6e3cSAdrian Chadd 110, 2255929f6e3cSAdrian Chadd 336 2256929f6e3cSAdrian Chadd }; 2257929f6e3cSAdrian Chadd 2258929f6e3cSAdrian Chadd 2259f8639279SAdrian Chadd /* Get value from linux kernel 3.2.+ in Drivers/net/wireless/iwlwifi/iwl-2000.c*/ 2260f8639279SAdrian Chadd static const struct iwn_sensitivity_limits iwn2030_sensitivity_limits = { 2261f8639279SAdrian Chadd 105,110, 2262f8639279SAdrian Chadd 128,232, 2263f8639279SAdrian Chadd 80,145, 2264f8639279SAdrian Chadd 128,232, 2265f8639279SAdrian Chadd 125,175, 2266f8639279SAdrian Chadd 160,310, 2267f8639279SAdrian Chadd 97, 2268f8639279SAdrian Chadd 97, 2269*561d34d7SSofian Brabez 110, 2270*561d34d7SSofian Brabez 390 2271f8639279SAdrian Chadd }; 2272f8639279SAdrian Chadd 22738f302007SRui Paulo /* Map TID to TX scheduler's FIFO. */ 22748f302007SRui Paulo static const uint8_t iwn_tid2fifo[] = { 22758f302007SRui Paulo 1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3 22768f302007SRui Paulo }; 22778f302007SRui Paulo 22780f454b93SRui Paulo /* WiFi/WiMAX coexist event priority table for 6050. */ 22790f454b93SRui Paulo static const struct iwn5000_wimax_event iwn6050_wimax_events[] = { 22800f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22810f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x03 }, 22820f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x03 }, 22830f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x03 }, 22840f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22850f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x07 }, 22860f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22870f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x03 }, 22880f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x03 }, 22890f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22900f454b93SRui Paulo { 0x06, 0x03, 0x00, 0x07 }, 22910f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22920f454b93SRui Paulo { 0x06, 0x06, 0x00, 0x03 }, 22930f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x07 }, 22940f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 }, 22950f454b93SRui Paulo { 0x04, 0x03, 0x00, 0x00 } 22960f454b93SRui Paulo }; 22970f454b93SRui Paulo 22988f302007SRui Paulo /* Firmware errors. */ 22998f302007SRui Paulo static const char * const iwn_fw_errmsg[] = { 23008f302007SRui Paulo "OK", 23018f302007SRui Paulo "FAIL", 23028f302007SRui Paulo "BAD_PARAM", 23038f302007SRui Paulo "BAD_CHECKSUM", 23048f302007SRui Paulo "NMI_INTERRUPT_WDG", 23058f302007SRui Paulo "SYSASSERT", 23068f302007SRui Paulo "FATAL_ERROR", 23078f302007SRui Paulo "BAD_COMMAND", 23088f302007SRui Paulo "HW_ERROR_TUNE_LOCK", 23098f302007SRui Paulo "HW_ERROR_TEMPERATURE", 23108f302007SRui Paulo "ILLEGAL_CHAN_FREQ", 23118f302007SRui Paulo "VCC_NOT_STABLE", 23128f302007SRui Paulo "FH_ERROR", 23138f302007SRui Paulo "NMI_INTERRUPT_HOST", 23148f302007SRui Paulo "NMI_INTERRUPT_ACTION_PT", 23158f302007SRui Paulo "NMI_INTERRUPT_UNKNOWN", 23168f302007SRui Paulo "UCODE_VERSION_MISMATCH", 23178f302007SRui Paulo "HW_ERROR_ABS_LOCK", 23188f302007SRui Paulo "HW_ERROR_CAL_LOCK_FAIL", 23198f302007SRui Paulo "NMI_INTERRUPT_INST_ACTION_PT", 23208f302007SRui Paulo "NMI_INTERRUPT_DATA_ACTION_PT", 23218f302007SRui Paulo "NMI_TRM_HW_ER", 23228f302007SRui Paulo "NMI_INTERRUPT_TRM", 232348a098e3SChristian Brueffer "NMI_INTERRUPT_BREAKPOINT", 23248f302007SRui Paulo "DEBUG_0", 23258f302007SRui Paulo "DEBUG_1", 23268f302007SRui Paulo "DEBUG_2", 23278f302007SRui Paulo "DEBUG_3", 23287373959eSBernhard Schmidt "ADVANCED_SYSASSERT" 23298f302007SRui Paulo }; 23308f302007SRui Paulo 23318f302007SRui Paulo /* Find least significant bit that is set. */ 23328f302007SRui Paulo #define IWN_LSB(x) ((((x) - 1) & (x)) ^ (x)) 23338f302007SRui Paulo 23343971d07bSSam Leffler #define IWN_READ(sc, reg) \ 23353971d07bSSam Leffler bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 23363971d07bSSam Leffler 23373971d07bSSam Leffler #define IWN_WRITE(sc, reg, val) \ 23383971d07bSSam Leffler bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 23393971d07bSSam Leffler 23400f454b93SRui Paulo #define IWN_WRITE_1(sc, reg, val) \ 23410f454b93SRui Paulo bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 23420f454b93SRui Paulo 23438f302007SRui Paulo #define IWN_SETBITS(sc, reg, mask) \ 23448f302007SRui Paulo IWN_WRITE(sc, reg, IWN_READ(sc, reg) | (mask)) 23458f302007SRui Paulo 23468f302007SRui Paulo #define IWN_CLRBITS(sc, reg, mask) \ 23478f302007SRui Paulo IWN_WRITE(sc, reg, IWN_READ(sc, reg) & ~(mask)) 23480f454b93SRui Paulo 23490f454b93SRui Paulo #define IWN_BARRIER_WRITE(sc) \ 23500f454b93SRui Paulo bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ 23510f454b93SRui Paulo BUS_SPACE_BARRIER_WRITE) 23520f454b93SRui Paulo 23530f454b93SRui Paulo #define IWN_BARRIER_READ_WRITE(sc) \ 23540f454b93SRui Paulo bus_space_barrier((sc)->sc_st, (sc)->sc_sh, 0, (sc)->sc_sz, \ 23550f454b93SRui Paulo BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE) 2356b876a4a3SAdrian Chadd 2357b876a4a3SAdrian Chadd #endif /* __IF_IWNREG_H__ */ 2358