1*d0c50e91SJohannes Hofmann /* $FreeBSD$ */ 24db7dd1bSJoe Talbott 34db7dd1bSJoe Talbott /*- 44db7dd1bSJoe Talbott * Copyright (c) 2006,2007 54db7dd1bSJoe Talbott * Damien Bergamini <damien.bergamini@free.fr> 64db7dd1bSJoe Talbott * 74db7dd1bSJoe Talbott * Permission to use, copy, modify, and distribute this software for any 84db7dd1bSJoe Talbott * purpose with or without fee is hereby granted, provided that the above 94db7dd1bSJoe Talbott * copyright notice and this permission notice appear in all copies. 104db7dd1bSJoe Talbott * 114db7dd1bSJoe Talbott * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 124db7dd1bSJoe Talbott * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 134db7dd1bSJoe Talbott * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 144db7dd1bSJoe Talbott * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 154db7dd1bSJoe Talbott * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 164db7dd1bSJoe Talbott * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 174db7dd1bSJoe Talbott * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 184db7dd1bSJoe Talbott */ 194db7dd1bSJoe Talbott 204db7dd1bSJoe Talbott #define WPI_TX_RING_COUNT 256 214db7dd1bSJoe Talbott #define WPI_CMD_RING_COUNT 256 224db7dd1bSJoe Talbott #define WPI_RX_RING_COUNT 64 234db7dd1bSJoe Talbott 244db7dd1bSJoe Talbott /* 254db7dd1bSJoe Talbott * Rings must be aligned on a 16K boundary. 264db7dd1bSJoe Talbott */ 274db7dd1bSJoe Talbott #define WPI_RING_DMA_ALIGN 0x4000 284db7dd1bSJoe Talbott 294db7dd1bSJoe Talbott /* maximum scatter/gather */ 304db7dd1bSJoe Talbott #define WPI_MAX_SCATTER 4 314db7dd1bSJoe Talbott 324db7dd1bSJoe Talbott /* maximum Rx buffer size */ 334db7dd1bSJoe Talbott #define WPI_RBUF_SIZE ( 3 * 1024 ) /* XXX 3000 but must be aligned */ 344db7dd1bSJoe Talbott 354db7dd1bSJoe Talbott /* 364db7dd1bSJoe Talbott * Control and status registers. 374db7dd1bSJoe Talbott */ 384db7dd1bSJoe Talbott #define WPI_HWCONFIG 0x000 394db7dd1bSJoe Talbott #define WPI_INTR 0x008 404db7dd1bSJoe Talbott #define WPI_MASK 0x00c 414db7dd1bSJoe Talbott #define WPI_INTR_STATUS 0x010 424db7dd1bSJoe Talbott #define WPI_GPIO_STATUS 0x018 434db7dd1bSJoe Talbott #define WPI_RESET 0x020 444db7dd1bSJoe Talbott #define WPI_GPIO_CTL 0x024 454db7dd1bSJoe Talbott #define WPI_EEPROM_CTL 0x02c 464db7dd1bSJoe Talbott #define WPI_EEPROM_STATUS 0x030 474db7dd1bSJoe Talbott #define WPI_UCODE_SET 0x058 484db7dd1bSJoe Talbott #define WPI_UCODE_CLR 0x05c 494db7dd1bSJoe Talbott #define WPI_TEMPERATURE 0x060 504db7dd1bSJoe Talbott #define WPI_CHICKEN 0x100 514db7dd1bSJoe Talbott #define WPI_PLL_CTL 0x20c 524db7dd1bSJoe Talbott #define WPI_WRITE_MEM_ADDR 0x444 534db7dd1bSJoe Talbott #define WPI_READ_MEM_ADDR 0x448 544db7dd1bSJoe Talbott #define WPI_WRITE_MEM_DATA 0x44c 554db7dd1bSJoe Talbott #define WPI_READ_MEM_DATA 0x450 564db7dd1bSJoe Talbott #define WPI_TX_WIDX 0x460 574db7dd1bSJoe Talbott #define WPI_TX_CTL(qid) (0x940 + (qid) * 8) 584db7dd1bSJoe Talbott #define WPI_TX_BASE(qid) (0x944 + (qid) * 8) 594db7dd1bSJoe Talbott #define WPI_TX_DESC(qid) (0x980 + (qid) * 80) 604db7dd1bSJoe Talbott #define WPI_RX_CONFIG 0xc00 614db7dd1bSJoe Talbott #define WPI_RX_BASE 0xc04 624db7dd1bSJoe Talbott #define WPI_RX_WIDX 0xc20 634db7dd1bSJoe Talbott #define WPI_RX_RIDX_PTR 0xc24 644db7dd1bSJoe Talbott #define WPI_RX_CTL 0xcc0 654db7dd1bSJoe Talbott #define WPI_RX_STATUS 0xcc4 664db7dd1bSJoe Talbott #define WPI_TX_CONFIG(qid) (0xd00 + (qid) * 32) 674db7dd1bSJoe Talbott #define WPI_TX_CREDIT(qid) (0xd04 + (qid) * 32) 684db7dd1bSJoe Talbott #define WPI_TX_STATE(qid) (0xd08 + (qid) * 32) 694db7dd1bSJoe Talbott #define WPI_TX_BASE_PTR 0xe80 704db7dd1bSJoe Talbott #define WPI_MSG_CONFIG 0xe88 714db7dd1bSJoe Talbott #define WPI_TX_STATUS 0xe90 724db7dd1bSJoe Talbott 734db7dd1bSJoe Talbott 744db7dd1bSJoe Talbott /* 754db7dd1bSJoe Talbott * NIC internal memory offsets. 764db7dd1bSJoe Talbott */ 774db7dd1bSJoe Talbott #define WPI_MEM_MODE 0x2e00 784db7dd1bSJoe Talbott #define WPI_MEM_RA 0x2e04 794db7dd1bSJoe Talbott #define WPI_MEM_TXCFG 0x2e10 804db7dd1bSJoe Talbott #define WPI_MEM_MAGIC4 0x2e14 814db7dd1bSJoe Talbott #define WPI_MEM_MAGIC5 0x2e20 824db7dd1bSJoe Talbott #define WPI_MEM_BYPASS1 0x2e2c 834db7dd1bSJoe Talbott #define WPI_MEM_BYPASS2 0x2e30 844db7dd1bSJoe Talbott #define WPI_MEM_CLOCK1 0x3004 854db7dd1bSJoe Talbott #define WPI_MEM_CLOCK2 0x3008 864db7dd1bSJoe Talbott #define WPI_MEM_POWER 0x300c 874db7dd1bSJoe Talbott #define WPI_MEM_PCIDEV 0x3010 884db7dd1bSJoe Talbott #define WPI_MEM_HW_RADIO_OFF 0x3014 894db7dd1bSJoe Talbott #define WPI_MEM_UCODE_CTL 0x3400 904db7dd1bSJoe Talbott #define WPI_MEM_UCODE_SRC 0x3404 914db7dd1bSJoe Talbott #define WPI_MEM_UCODE_DST 0x3408 924db7dd1bSJoe Talbott #define WPI_MEM_UCODE_SIZE 0x340c 934db7dd1bSJoe Talbott #define WPI_MEM_UCODE_BASE 0x3800 944db7dd1bSJoe Talbott 954db7dd1bSJoe Talbott #define WPI_MEM_TEXT_BASE 0x3490 964db7dd1bSJoe Talbott #define WPI_MEM_TEXT_SIZE 0x3494 974db7dd1bSJoe Talbott #define WPI_MEM_DATA_BASE 0x3498 984db7dd1bSJoe Talbott #define WPI_MEM_DATA_SIZE 0x349c 994db7dd1bSJoe Talbott 1004db7dd1bSJoe Talbott 1014db7dd1bSJoe Talbott /* possible flags for register WPI_HWCONFIG */ 1024db7dd1bSJoe Talbott #define WPI_HW_ALM_MB (1 << 8) 1034db7dd1bSJoe Talbott #define WPI_HW_ALM_MM (1 << 9) 1044db7dd1bSJoe Talbott #define WPI_HW_SKU_MRC (1 << 10) 1054db7dd1bSJoe Talbott #define WPI_HW_REV_D (1 << 11) 1064db7dd1bSJoe Talbott #define WPI_HW_TYPE_B (1 << 12) 1074db7dd1bSJoe Talbott 1084db7dd1bSJoe Talbott /* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */ 1094db7dd1bSJoe Talbott #define WPI_MEM_4 ((sizeof (uint32_t) - 1) << 24) 1104db7dd1bSJoe Talbott 1114db7dd1bSJoe Talbott /* possible values for WPI_MEM_UCODE_DST */ 1124db7dd1bSJoe Talbott #define WPI_FW_TEXT 0x00000000 1134db7dd1bSJoe Talbott 1144db7dd1bSJoe Talbott /* possible flags for WPI_GPIO_STATUS */ 1154db7dd1bSJoe Talbott #define WPI_POWERED (1 << 9) 1164db7dd1bSJoe Talbott 1174db7dd1bSJoe Talbott /* possible flags for register WPI_RESET */ 1184db7dd1bSJoe Talbott #define WPI_NEVO_RESET (1 << 0) 1194db7dd1bSJoe Talbott #define WPI_SW_RESET (1 << 7) 1204db7dd1bSJoe Talbott #define WPI_MASTER_DISABLED (1 << 8) 1214db7dd1bSJoe Talbott #define WPI_STOP_MASTER (1 << 9) 1224db7dd1bSJoe Talbott 1234db7dd1bSJoe Talbott /* possible flags for register WPI_GPIO_CTL */ 1244db7dd1bSJoe Talbott #define WPI_GPIO_CLOCK (1 << 0) 1254db7dd1bSJoe Talbott #define WPI_GPIO_INIT (1 << 2) 1264db7dd1bSJoe Talbott #define WPI_GPIO_MAC (1 << 3) 1274db7dd1bSJoe Talbott #define WPI_GPIO_SLEEP (1 << 4) 1284db7dd1bSJoe Talbott #define WPI_GPIO_PWR_STATUS 0x07000000 1294db7dd1bSJoe Talbott #define WPI_GPIO_PWR_SLEEP (4 << 24) 1304db7dd1bSJoe Talbott 1314db7dd1bSJoe Talbott /* possible flags for register WPI_CHICKEN */ 1324db7dd1bSJoe Talbott #define WPI_CHICKEN_RXNOLOS (1 << 23) 1334db7dd1bSJoe Talbott 1344db7dd1bSJoe Talbott /* possible flags for register WPI_PLL_CTL */ 1354db7dd1bSJoe Talbott #define WPI_PLL_INIT (1 << 24) 1364db7dd1bSJoe Talbott 1374db7dd1bSJoe Talbott /* possible flags for register WPI_UCODE_CLR */ 1384db7dd1bSJoe Talbott #define WPI_RADIO_OFF (1 << 1) 1394db7dd1bSJoe Talbott #define WPI_DISABLE_CMD (1 << 2) 1404db7dd1bSJoe Talbott 1414db7dd1bSJoe Talbott /* possible flags for WPI_RX_STATUS */ 1424db7dd1bSJoe Talbott #define WPI_RX_IDLE (1 << 24) 1434db7dd1bSJoe Talbott 1444db7dd1bSJoe Talbott /* possible flags for register WPI_UC_CTL */ 1454db7dd1bSJoe Talbott #define WPI_UC_ENABLE (1 << 30) 146*d0c50e91SJohannes Hofmann #define WPI_UC_RUN (1U << 31) 1474db7dd1bSJoe Talbott 1484db7dd1bSJoe Talbott /* possible flags for register WPI_INTR_CSR */ 1494db7dd1bSJoe Talbott #define WPI_ALIVE_INTR (1 << 0) 1504db7dd1bSJoe Talbott #define WPI_WAKEUP_INTR (1 << 1) 1514db7dd1bSJoe Talbott #define WPI_SW_ERROR (1 << 25) 1524db7dd1bSJoe Talbott #define WPI_TX_INTR (1 << 27) 1534db7dd1bSJoe Talbott #define WPI_HW_ERROR (1 << 29) 154*d0c50e91SJohannes Hofmann #define WPI_RX_INTR (1U << 31) 1554db7dd1bSJoe Talbott 1564db7dd1bSJoe Talbott #define WPI_INTR_MASK \ 1574db7dd1bSJoe Talbott (WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR | \ 1584db7dd1bSJoe Talbott WPI_ALIVE_INTR | WPI_WAKEUP_INTR) 1594db7dd1bSJoe Talbott 1604db7dd1bSJoe Talbott /* possible flags for register WPI_TX_STATUS */ 1614db7dd1bSJoe Talbott #define WPI_TX_IDLE(qid) (1 << ((qid) + 24) | 1 << ((qid) + 16)) 1624db7dd1bSJoe Talbott 1634db7dd1bSJoe Talbott /* possible flags for register WPI_EEPROM_CTL */ 1644db7dd1bSJoe Talbott #define WPI_EEPROM_READY (1 << 0) 1654db7dd1bSJoe Talbott 1664db7dd1bSJoe Talbott /* possible flags for register WPI_EEPROM_STATUS */ 1674db7dd1bSJoe Talbott #define WPI_EEPROM_VERSION 0x00000007 1684db7dd1bSJoe Talbott #define WPI_EEPROM_LOCKED 0x00000180 1694db7dd1bSJoe Talbott 1704db7dd1bSJoe Talbott 1714db7dd1bSJoe Talbott struct wpi_shared { 1724db7dd1bSJoe Talbott uint32_t txbase[8]; 1734db7dd1bSJoe Talbott uint32_t next; 1744db7dd1bSJoe Talbott uint32_t reserved[2]; 1754db7dd1bSJoe Talbott } __packed; 1764db7dd1bSJoe Talbott 1774db7dd1bSJoe Talbott #define WPI_MAX_SEG_LEN 65520 1784db7dd1bSJoe Talbott struct wpi_tx_desc { 1794db7dd1bSJoe Talbott uint32_t flags; 1804db7dd1bSJoe Talbott #define WPI_PAD32(x) (roundup2(x, 4) - (x)) 1814db7dd1bSJoe Talbott 1824db7dd1bSJoe Talbott struct { 1834db7dd1bSJoe Talbott uint32_t addr; 1844db7dd1bSJoe Talbott uint32_t len; 1854db7dd1bSJoe Talbott } __attribute__((__packed__)) segs[WPI_MAX_SCATTER]; 1864db7dd1bSJoe Talbott uint8_t reserved[28]; 1874db7dd1bSJoe Talbott } __packed; 1884db7dd1bSJoe Talbott 1894db7dd1bSJoe Talbott struct wpi_tx_stat { 1904db7dd1bSJoe Talbott uint8_t nrts; 1914db7dd1bSJoe Talbott uint8_t ntries; 1924db7dd1bSJoe Talbott uint8_t nkill; 1934db7dd1bSJoe Talbott uint8_t rate; 1944db7dd1bSJoe Talbott uint32_t duration; 1954db7dd1bSJoe Talbott uint32_t status; 1964db7dd1bSJoe Talbott } __packed; 1974db7dd1bSJoe Talbott 1984db7dd1bSJoe Talbott struct wpi_rx_desc { 1994db7dd1bSJoe Talbott uint32_t len; 2004db7dd1bSJoe Talbott uint8_t type; 2014db7dd1bSJoe Talbott #define WPI_UC_READY 1 2024db7dd1bSJoe Talbott #define WPI_RX_DONE 27 2034db7dd1bSJoe Talbott #define WPI_TX_DONE 28 2044db7dd1bSJoe Talbott #define WPI_START_SCAN 130 2054db7dd1bSJoe Talbott #define WPI_SCAN_RESULTS 131 2064db7dd1bSJoe Talbott #define WPI_STOP_SCAN 132 2074db7dd1bSJoe Talbott #define WPI_STATE_CHANGED 161 2084db7dd1bSJoe Talbott #define WPI_MISSED_BEACON 162 2094db7dd1bSJoe Talbott 2104db7dd1bSJoe Talbott uint8_t flags; 2114db7dd1bSJoe Talbott uint8_t idx; 2124db7dd1bSJoe Talbott uint8_t qid; 2134db7dd1bSJoe Talbott } __packed; 2144db7dd1bSJoe Talbott 2154db7dd1bSJoe Talbott struct wpi_rx_stat { 2164db7dd1bSJoe Talbott uint8_t len; 2174db7dd1bSJoe Talbott #define WPI_STAT_MAXLEN 20 2184db7dd1bSJoe Talbott 2194db7dd1bSJoe Talbott uint8_t id; 2204db7dd1bSJoe Talbott uint8_t rssi; /* received signal strength */ 2214db7dd1bSJoe Talbott #define WPI_RSSI_OFFSET 95 2224db7dd1bSJoe Talbott 2234db7dd1bSJoe Talbott uint8_t agc; /* access gain control */ 2244db7dd1bSJoe Talbott uint16_t signal; 2254db7dd1bSJoe Talbott uint16_t noise; 2264db7dd1bSJoe Talbott } __packed; 2274db7dd1bSJoe Talbott 2284db7dd1bSJoe Talbott struct wpi_rx_head { 2294db7dd1bSJoe Talbott uint16_t chan; 2304db7dd1bSJoe Talbott uint16_t flags; 2314db7dd1bSJoe Talbott uint8_t reserved; 2324db7dd1bSJoe Talbott uint8_t rate; 2334db7dd1bSJoe Talbott uint16_t len; 2344db7dd1bSJoe Talbott } __packed; 2354db7dd1bSJoe Talbott 2364db7dd1bSJoe Talbott struct wpi_rx_tail { 2374db7dd1bSJoe Talbott uint32_t flags; 2384db7dd1bSJoe Talbott #define WPI_RX_NO_CRC_ERR (1 << 0) 2394db7dd1bSJoe Talbott #define WPI_RX_NO_OVFL_ERR (1 << 1) 2404db7dd1bSJoe Talbott /* shortcut for the above */ 2414db7dd1bSJoe Talbott #define WPI_RX_NOERROR (WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR) 2424db7dd1bSJoe Talbott uint64_t tstamp; 2434db7dd1bSJoe Talbott uint32_t tbeacon; 2444db7dd1bSJoe Talbott } __packed; 2454db7dd1bSJoe Talbott 2464db7dd1bSJoe Talbott struct wpi_tx_cmd { 2474db7dd1bSJoe Talbott uint8_t code; 2484db7dd1bSJoe Talbott #define WPI_CMD_CONFIGURE 16 2494db7dd1bSJoe Talbott #define WPI_CMD_ASSOCIATE 17 2504db7dd1bSJoe Talbott #define WPI_CMD_SET_WME 19 2514db7dd1bSJoe Talbott #define WPI_CMD_TSF 20 2524db7dd1bSJoe Talbott #define WPI_CMD_ADD_NODE 24 2534db7dd1bSJoe Talbott #define WPI_CMD_TX_DATA 28 2544db7dd1bSJoe Talbott #define WPI_CMD_MRR_SETUP 71 2554db7dd1bSJoe Talbott #define WPI_CMD_SET_LED 72 2564db7dd1bSJoe Talbott #define WPI_CMD_SET_POWER_MODE 119 2574db7dd1bSJoe Talbott #define WPI_CMD_SCAN 128 2584db7dd1bSJoe Talbott #define WPI_CMD_SET_BEACON 145 2594db7dd1bSJoe Talbott #define WPI_CMD_TXPOWER 151 2604db7dd1bSJoe Talbott #define WPI_CMD_BLUETOOTH 155 2614db7dd1bSJoe Talbott 2624db7dd1bSJoe Talbott uint8_t flags; 2634db7dd1bSJoe Talbott uint8_t idx; 2644db7dd1bSJoe Talbott uint8_t qid; 2654db7dd1bSJoe Talbott uint8_t data[360]; 2664db7dd1bSJoe Talbott } __packed; 2674db7dd1bSJoe Talbott 2684db7dd1bSJoe Talbott /* structure for WPI_CMD_CONFIGURE */ 2694db7dd1bSJoe Talbott struct wpi_config { 2704db7dd1bSJoe Talbott uint8_t myaddr[IEEE80211_ADDR_LEN]; 2714db7dd1bSJoe Talbott uint16_t reserved1; 2724db7dd1bSJoe Talbott uint8_t bssid[IEEE80211_ADDR_LEN]; 2734db7dd1bSJoe Talbott uint16_t reserved2; 2744db7dd1bSJoe Talbott uint8_t wlap_bssid_addr[6]; 2754db7dd1bSJoe Talbott uint16_t reserved3; 2764db7dd1bSJoe Talbott uint8_t mode; 2774db7dd1bSJoe Talbott #define WPI_MODE_HOSTAP 1 2784db7dd1bSJoe Talbott #define WPI_MODE_STA 3 2794db7dd1bSJoe Talbott #define WPI_MODE_IBSS 4 2804db7dd1bSJoe Talbott #define WPI_MODE_MONITOR 6 2814db7dd1bSJoe Talbott 2824db7dd1bSJoe Talbott uint8_t air_propogation; 2834db7dd1bSJoe Talbott uint16_t reserved4; 2844db7dd1bSJoe Talbott uint8_t ofdm_mask; 2854db7dd1bSJoe Talbott uint8_t cck_mask; 2864db7dd1bSJoe Talbott uint16_t associd; 2874db7dd1bSJoe Talbott uint32_t flags; 2884db7dd1bSJoe Talbott #define WPI_CONFIG_24GHZ (1 << 0) 2894db7dd1bSJoe Talbott #define WPI_CONFIG_CCK (1 << 1) 2904db7dd1bSJoe Talbott #define WPI_CONFIG_AUTO (1 << 2) 2914db7dd1bSJoe Talbott #define WPI_CONFIG_SHSLOT (1 << 4) 2924db7dd1bSJoe Talbott #define WPI_CONFIG_SHPREAMBLE (1 << 5) 2934db7dd1bSJoe Talbott #define WPI_CONFIG_NODIVERSITY (1 << 7) 2944db7dd1bSJoe Talbott #define WPI_CONFIG_ANTENNA_A (1 << 8) 2954db7dd1bSJoe Talbott #define WPI_CONFIG_ANTENNA_B (1 << 9) 2964db7dd1bSJoe Talbott #define WPI_CONFIG_TSF (1 << 15) 2974db7dd1bSJoe Talbott 2984db7dd1bSJoe Talbott uint32_t filter; 2994db7dd1bSJoe Talbott #define WPI_FILTER_PROMISC (1 << 0) 3004db7dd1bSJoe Talbott #define WPI_FILTER_CTL (1 << 1) 3014db7dd1bSJoe Talbott #define WPI_FILTER_MULTICAST (1 << 2) 3024db7dd1bSJoe Talbott #define WPI_FILTER_NODECRYPT (1 << 3) 3034db7dd1bSJoe Talbott #define WPI_FILTER_BSS (1 << 5) 3044db7dd1bSJoe Talbott #define WPI_FILTER_BEACON (1 << 6) 3054db7dd1bSJoe Talbott 3064db7dd1bSJoe Talbott uint8_t chan; 3074db7dd1bSJoe Talbott uint16_t reserved6; 3084db7dd1bSJoe Talbott } __packed; 3094db7dd1bSJoe Talbott 3104db7dd1bSJoe Talbott /* structure for command WPI_CMD_ASSOCIATE */ 3114db7dd1bSJoe Talbott struct wpi_assoc { 3124db7dd1bSJoe Talbott uint32_t flags; 3134db7dd1bSJoe Talbott uint32_t filter; 3144db7dd1bSJoe Talbott uint8_t ofdm_mask; 3154db7dd1bSJoe Talbott uint8_t cck_mask; 3164db7dd1bSJoe Talbott uint16_t reserved; 3174db7dd1bSJoe Talbott } __packed; 3184db7dd1bSJoe Talbott 3194db7dd1bSJoe Talbott /* structure for command WPI_CMD_SET_WME */ 3204db7dd1bSJoe Talbott struct wpi_wme_setup { 3214db7dd1bSJoe Talbott uint32_t flags; 3224db7dd1bSJoe Talbott struct { 3234db7dd1bSJoe Talbott uint16_t cwmin; 3244db7dd1bSJoe Talbott uint16_t cwmax; 3254db7dd1bSJoe Talbott uint8_t aifsn; 3264db7dd1bSJoe Talbott uint8_t reserved; 3274db7dd1bSJoe Talbott uint16_t txop; 3284db7dd1bSJoe Talbott } __packed ac[WME_NUM_AC]; 3294db7dd1bSJoe Talbott } __packed; 3304db7dd1bSJoe Talbott 3314db7dd1bSJoe Talbott /* structure for command WPI_CMD_TSF */ 3324db7dd1bSJoe Talbott struct wpi_cmd_tsf { 3334db7dd1bSJoe Talbott uint64_t tstamp; 3344db7dd1bSJoe Talbott uint16_t bintval; 3354db7dd1bSJoe Talbott uint16_t atim; 3364db7dd1bSJoe Talbott uint32_t binitval; 3374db7dd1bSJoe Talbott uint16_t lintval; 3384db7dd1bSJoe Talbott uint16_t reserved; 3394db7dd1bSJoe Talbott } __packed; 3404db7dd1bSJoe Talbott 3414db7dd1bSJoe Talbott /* structure for WPI_CMD_ADD_NODE */ 3424db7dd1bSJoe Talbott struct wpi_node_info { 3434db7dd1bSJoe Talbott uint8_t control; 3444db7dd1bSJoe Talbott #define WPI_NODE_UPDATE (1 << 0) 3454db7dd1bSJoe Talbott 3464db7dd1bSJoe Talbott uint8_t reserved1[3]; 3474db7dd1bSJoe Talbott uint8_t bssid[IEEE80211_ADDR_LEN]; 3484db7dd1bSJoe Talbott uint16_t reserved2; 3494db7dd1bSJoe Talbott uint8_t id; 3504db7dd1bSJoe Talbott #define WPI_ID_BSS 0 3514db7dd1bSJoe Talbott #define WPI_ID_BROADCAST 24 3524db7dd1bSJoe Talbott 3534db7dd1bSJoe Talbott uint8_t flags; 3544db7dd1bSJoe Talbott uint16_t reserved3; 3554db7dd1bSJoe Talbott uint16_t key_flags; 3564db7dd1bSJoe Talbott uint8_t tkip; 3574db7dd1bSJoe Talbott uint8_t reserved4; 3584db7dd1bSJoe Talbott uint16_t ttak[5]; 3594db7dd1bSJoe Talbott uint16_t reserved5; 3604db7dd1bSJoe Talbott uint8_t key[IEEE80211_KEYBUF_SIZE]; 3614db7dd1bSJoe Talbott uint32_t action; 3624db7dd1bSJoe Talbott #define WPI_ACTION_SET_RATE 4 3634db7dd1bSJoe Talbott uint32_t mask; 3644db7dd1bSJoe Talbott uint16_t tid; 3654db7dd1bSJoe Talbott uint8_t rate; 3664db7dd1bSJoe Talbott uint8_t antenna; 3674db7dd1bSJoe Talbott #define WPI_ANTENNA_A (1<<6) 3684db7dd1bSJoe Talbott #define WPI_ANTENNA_B (1<<7) 3694db7dd1bSJoe Talbott #define WPI_ANTENNA_BOTH (WPI_ANTENNA_A|WPI_ANTENNA_B) 3704db7dd1bSJoe Talbott uint8_t add_imm; 3714db7dd1bSJoe Talbott uint8_t del_imm; 3724db7dd1bSJoe Talbott uint16_t add_imm_start; 3734db7dd1bSJoe Talbott } __packed; 3744db7dd1bSJoe Talbott 3754db7dd1bSJoe Talbott /* structure for command WPI_CMD_TX_DATA */ 3764db7dd1bSJoe Talbott struct wpi_cmd_data { 3774db7dd1bSJoe Talbott uint16_t len; 3784db7dd1bSJoe Talbott uint16_t lnext; 3794db7dd1bSJoe Talbott uint32_t flags; 3804db7dd1bSJoe Talbott #define WPI_TX_NEED_RTS (1 << 1) 3814db7dd1bSJoe Talbott #define WPI_TX_NEED_CTS (1 << 2) 3824db7dd1bSJoe Talbott #define WPI_TX_NEED_ACK (1 << 3) 3834db7dd1bSJoe Talbott #define WPI_TX_FULL_TXOP (1 << 7) 3844db7dd1bSJoe Talbott #define WPI_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ 3854db7dd1bSJoe Talbott #define WPI_TX_AUTO_SEQ (1 << 13) 3864db7dd1bSJoe Talbott #define WPI_TX_INSERT_TSTAMP (1 << 16) 3874db7dd1bSJoe Talbott 3884db7dd1bSJoe Talbott uint8_t rate; 3894db7dd1bSJoe Talbott uint8_t id; 3904db7dd1bSJoe Talbott uint8_t tid; 3914db7dd1bSJoe Talbott uint8_t security; 3924db7dd1bSJoe Talbott uint8_t key[IEEE80211_KEYBUF_SIZE]; 3934db7dd1bSJoe Talbott uint8_t tkip[IEEE80211_WEP_MICLEN]; 3944db7dd1bSJoe Talbott uint32_t fnext; 3954db7dd1bSJoe Talbott uint32_t lifetime; 3964db7dd1bSJoe Talbott #define WPI_LIFETIME_INFINITE 0xffffffff 3974db7dd1bSJoe Talbott uint8_t ofdm_mask; 3984db7dd1bSJoe Talbott uint8_t cck_mask; 3994db7dd1bSJoe Talbott uint8_t rts_ntries; 4004db7dd1bSJoe Talbott uint8_t data_ntries; 4014db7dd1bSJoe Talbott uint16_t timeout; 4024db7dd1bSJoe Talbott uint16_t txop; 4034db7dd1bSJoe Talbott struct ieee80211_frame wh; 4044db7dd1bSJoe Talbott } __packed; 4054db7dd1bSJoe Talbott 4064db7dd1bSJoe Talbott /* structure for command WPI_CMD_SET_BEACON */ 4074db7dd1bSJoe Talbott struct wpi_cmd_beacon { 4084db7dd1bSJoe Talbott uint16_t len; 4094db7dd1bSJoe Talbott uint16_t reserved1; 4104db7dd1bSJoe Talbott uint32_t flags; /* same as wpi_cmd_data */ 4114db7dd1bSJoe Talbott uint8_t rate; 4124db7dd1bSJoe Talbott uint8_t id; 4134db7dd1bSJoe Talbott uint8_t reserved2[30]; 4144db7dd1bSJoe Talbott uint32_t lifetime; 4154db7dd1bSJoe Talbott uint8_t ofdm_mask; 4164db7dd1bSJoe Talbott uint8_t cck_mask; 4174db7dd1bSJoe Talbott uint16_t reserved3[3]; 4184db7dd1bSJoe Talbott uint16_t tim; 4194db7dd1bSJoe Talbott uint8_t timsz; 4204db7dd1bSJoe Talbott uint8_t reserved4; 4214db7dd1bSJoe Talbott struct ieee80211_frame wh; 4224db7dd1bSJoe Talbott } __packed; 4234db7dd1bSJoe Talbott 4244db7dd1bSJoe Talbott /* structure for notification WPI_MISSED_BEACON */ 4254db7dd1bSJoe Talbott struct wpi_missed_beacon { 4264db7dd1bSJoe Talbott uint32_t consecutive; 4274db7dd1bSJoe Talbott uint32_t total; 4284db7dd1bSJoe Talbott uint32_t expected; 4294db7dd1bSJoe Talbott uint32_t received; 4304db7dd1bSJoe Talbott } __packed; 4314db7dd1bSJoe Talbott 4324db7dd1bSJoe Talbott 4334db7dd1bSJoe Talbott /* structure for WPI_CMD_MRR_SETUP */ 4344db7dd1bSJoe Talbott struct wpi_mrr_setup { 4354db7dd1bSJoe Talbott uint8_t which; 4364db7dd1bSJoe Talbott #define WPI_MRR_CTL 0 4374db7dd1bSJoe Talbott #define WPI_MRR_DATA 1 4384db7dd1bSJoe Talbott 4394db7dd1bSJoe Talbott uint8_t reserved[3]; 4404db7dd1bSJoe Talbott 4414db7dd1bSJoe Talbott struct { 4424db7dd1bSJoe Talbott uint8_t signal; 4434db7dd1bSJoe Talbott uint8_t flags; 4444db7dd1bSJoe Talbott uint8_t ntries; 4454db7dd1bSJoe Talbott uint8_t next; 4464db7dd1bSJoe Talbott #define WPI_OFDM6 0 4474db7dd1bSJoe Talbott #define WPI_OFDM54 7 4484db7dd1bSJoe Talbott #define WPI_CCK1 8 4494db7dd1bSJoe Talbott #define WPI_CCK2 9 4504db7dd1bSJoe Talbott #define WPI_CCK11 11 4514db7dd1bSJoe Talbott 4524db7dd1bSJoe Talbott } __attribute__((__packed__)) rates[WPI_CCK11 + 1]; 4534db7dd1bSJoe Talbott } __packed; 4544db7dd1bSJoe Talbott 4554db7dd1bSJoe Talbott /* structure for WPI_CMD_SET_LED */ 4564db7dd1bSJoe Talbott struct wpi_cmd_led { 4574db7dd1bSJoe Talbott uint32_t unit; /* multiplier (in usecs) */ 4584db7dd1bSJoe Talbott uint8_t which; 4594db7dd1bSJoe Talbott #define WPI_LED_ACTIVITY 1 4604db7dd1bSJoe Talbott #define WPI_LED_LINK 2 4614db7dd1bSJoe Talbott 4624db7dd1bSJoe Talbott uint8_t off; 4634db7dd1bSJoe Talbott uint8_t on; 4644db7dd1bSJoe Talbott uint8_t reserved; 4654db7dd1bSJoe Talbott } __packed; 4664db7dd1bSJoe Talbott 4674db7dd1bSJoe Talbott /* structure for WPI_CMD_SET_POWER_MODE */ 4684db7dd1bSJoe Talbott struct wpi_power { 4694db7dd1bSJoe Talbott uint32_t flags; 4704db7dd1bSJoe Talbott #define WPI_POWER_CAM 0 /* constantly awake mode */ 4714db7dd1bSJoe Talbott uint32_t rx_timeout; 4724db7dd1bSJoe Talbott uint32_t tx_timeout; 4734db7dd1bSJoe Talbott uint32_t sleep[5]; 4744db7dd1bSJoe Talbott } __packed; 4754db7dd1bSJoe Talbott 4764db7dd1bSJoe Talbott /* structure for command WPI_CMD_SCAN */ 4774db7dd1bSJoe Talbott struct wpi_scan_hdr { 4784db7dd1bSJoe Talbott uint16_t len; 4794db7dd1bSJoe Talbott uint8_t reserved1; 4804db7dd1bSJoe Talbott uint8_t nchan; 4814db7dd1bSJoe Talbott uint16_t quiet; 4824db7dd1bSJoe Talbott uint16_t threshold; 4834db7dd1bSJoe Talbott uint16_t promotion; 4844db7dd1bSJoe Talbott uint16_t reserved2; 4854db7dd1bSJoe Talbott uint32_t maxtimeout; 4864db7dd1bSJoe Talbott uint32_t suspend; 4874db7dd1bSJoe Talbott uint32_t flags; 4884db7dd1bSJoe Talbott uint32_t filter; 4894db7dd1bSJoe Talbott 4904db7dd1bSJoe Talbott struct { 4914db7dd1bSJoe Talbott uint16_t len; 4924db7dd1bSJoe Talbott uint16_t lnext; 4934db7dd1bSJoe Talbott uint32_t flags; 4944db7dd1bSJoe Talbott uint8_t rate; 4954db7dd1bSJoe Talbott uint8_t id; 4964db7dd1bSJoe Talbott uint8_t tid; 4974db7dd1bSJoe Talbott uint8_t security; 4984db7dd1bSJoe Talbott uint8_t key[IEEE80211_KEYBUF_SIZE]; 4994db7dd1bSJoe Talbott uint8_t tkip[IEEE80211_WEP_MICLEN]; 5004db7dd1bSJoe Talbott uint32_t fnext; 5014db7dd1bSJoe Talbott uint32_t lifetime; 5024db7dd1bSJoe Talbott uint8_t ofdm_mask; 5034db7dd1bSJoe Talbott uint8_t cck_mask; 5044db7dd1bSJoe Talbott uint8_t rts_ntries; 5054db7dd1bSJoe Talbott uint8_t data_ntries; 5064db7dd1bSJoe Talbott uint16_t timeout; 5074db7dd1bSJoe Talbott uint16_t txop; 5084db7dd1bSJoe Talbott } tx __attribute__((__packed__)); 5094db7dd1bSJoe Talbott 5104db7dd1bSJoe Talbott #define WPI_SCAN_MAX_ESSIDS 4 5114db7dd1bSJoe Talbott struct { 5124db7dd1bSJoe Talbott uint8_t id; 5134db7dd1bSJoe Talbott uint8_t esslen; 514*d0c50e91SJohannes Hofmann uint8_t essid[IEEE80211_NWID_LEN]; 5154db7dd1bSJoe Talbott }scan_essids[WPI_SCAN_MAX_ESSIDS]; 5164db7dd1bSJoe Talbott /* followed by probe request body */ 5174db7dd1bSJoe Talbott /* followed by nchan x wpi_scan_chan */ 5184db7dd1bSJoe Talbott } __packed; 5194db7dd1bSJoe Talbott 5204db7dd1bSJoe Talbott struct wpi_scan_chan { 5214db7dd1bSJoe Talbott uint8_t flags; 5224db7dd1bSJoe Talbott uint8_t chan; 5234db7dd1bSJoe Talbott #define WPI_CHAN_ACTIVE (1 << 0) 5244db7dd1bSJoe Talbott #define WPI_CHAN_DIRECT (1 << 1) 5254db7dd1bSJoe Talbott uint8_t gain_radio; 5264db7dd1bSJoe Talbott uint8_t gain_dsp; 5274db7dd1bSJoe Talbott uint16_t active; /* msecs */ 5284db7dd1bSJoe Talbott uint16_t passive; /* msecs */ 5294db7dd1bSJoe Talbott } __packed; 5304db7dd1bSJoe Talbott 5314db7dd1bSJoe Talbott /* structure for WPI_CMD_BLUETOOTH */ 5324db7dd1bSJoe Talbott struct wpi_bluetooth { 5334db7dd1bSJoe Talbott uint8_t flags; 5344db7dd1bSJoe Talbott uint8_t lead; 5354db7dd1bSJoe Talbott uint8_t kill; 5364db7dd1bSJoe Talbott uint8_t reserved; 5374db7dd1bSJoe Talbott uint32_t ack; 5384db7dd1bSJoe Talbott uint32_t cts; 5394db7dd1bSJoe Talbott } __packed; 5404db7dd1bSJoe Talbott 5414db7dd1bSJoe Talbott /* structure for command WPI_CMD_TXPOWER */ 5424db7dd1bSJoe Talbott struct wpi_cmd_txpower { 5434db7dd1bSJoe Talbott 5444db7dd1bSJoe Talbott uint8_t band; 5454db7dd1bSJoe Talbott #define WPI_RATE_5GHZ 0 5464db7dd1bSJoe Talbott #define WPI_RATE_2GHZ 1 5474db7dd1bSJoe Talbott uint8_t reserved; 5484db7dd1bSJoe Talbott uint16_t channel; 5494db7dd1bSJoe Talbott 5504db7dd1bSJoe Talbott #define WPI_RATE_MAPPING_COUNT 12 5514db7dd1bSJoe Talbott struct { 5524db7dd1bSJoe Talbott uint8_t rate; 5534db7dd1bSJoe Talbott uint8_t gain_radio; 5544db7dd1bSJoe Talbott uint8_t gain_dsp; 5554db7dd1bSJoe Talbott uint8_t reserved; 5564db7dd1bSJoe Talbott } __packed rates [WPI_RATE_MAPPING_COUNT]; 5574db7dd1bSJoe Talbott 5584db7dd1bSJoe Talbott } __packed; 5594db7dd1bSJoe Talbott 5604db7dd1bSJoe Talbott 5614db7dd1bSJoe Talbott 5624db7dd1bSJoe Talbott #define WPI_FW_MAIN_TEXT_MAXSZ (80 * 1024 ) 5634db7dd1bSJoe Talbott #define WPI_FW_MAIN_DATA_MAXSZ (32 * 1024 ) 5644db7dd1bSJoe Talbott #define WPI_FW_INIT_TEXT_MAXSZ (80 * 1024 ) 5654db7dd1bSJoe Talbott #define WPI_FW_INIT_DATA_MAXSZ (32 * 1024 ) 5664db7dd1bSJoe Talbott #define WPI_FW_BOOT_TEXT_MAXSZ 1024 5674db7dd1bSJoe Talbott 5684db7dd1bSJoe Talbott #define WPI_FW_UPDATED (1 << 31 ) 5694db7dd1bSJoe Talbott 5704db7dd1bSJoe Talbott /* firmware image header */ 5714db7dd1bSJoe Talbott struct wpi_firmware_hdr { 5724db7dd1bSJoe Talbott 5734db7dd1bSJoe Talbott #define WPI_FW_MINVERSION 2144 5744db7dd1bSJoe Talbott 5754db7dd1bSJoe Talbott uint32_t version; 5764db7dd1bSJoe Talbott uint32_t rtextsz; 5774db7dd1bSJoe Talbott uint32_t rdatasz; 5784db7dd1bSJoe Talbott uint32_t itextsz; 5794db7dd1bSJoe Talbott uint32_t idatasz; 5804db7dd1bSJoe Talbott uint32_t btextsz; 5814db7dd1bSJoe Talbott } __packed; 5824db7dd1bSJoe Talbott 5834db7dd1bSJoe Talbott /* structure for WPI_UC_READY notification */ 5844db7dd1bSJoe Talbott struct wpi_ucode_info { 5854db7dd1bSJoe Talbott uint32_t version; 5864db7dd1bSJoe Talbott uint8_t revision[8]; 5874db7dd1bSJoe Talbott uint8_t type; 5884db7dd1bSJoe Talbott uint8_t subtype; 5894db7dd1bSJoe Talbott uint16_t reserved; 5904db7dd1bSJoe Talbott uint32_t logptr; 5914db7dd1bSJoe Talbott uint32_t errorptr; 5924db7dd1bSJoe Talbott uint32_t timestamp; 5934db7dd1bSJoe Talbott uint32_t valid; 5944db7dd1bSJoe Talbott } __packed; 5954db7dd1bSJoe Talbott 5964db7dd1bSJoe Talbott /* structure for WPI_START_SCAN notification */ 5974db7dd1bSJoe Talbott struct wpi_start_scan { 5984db7dd1bSJoe Talbott uint64_t tstamp; 5994db7dd1bSJoe Talbott uint32_t tbeacon; 6004db7dd1bSJoe Talbott uint8_t chan; 6014db7dd1bSJoe Talbott uint8_t band; 6024db7dd1bSJoe Talbott uint16_t reserved; 6034db7dd1bSJoe Talbott uint32_t status; 6044db7dd1bSJoe Talbott } __packed; 6054db7dd1bSJoe Talbott 6064db7dd1bSJoe Talbott /* structure for WPI_STOP_SCAN notification */ 6074db7dd1bSJoe Talbott struct wpi_stop_scan { 6084db7dd1bSJoe Talbott uint8_t nchan; 6094db7dd1bSJoe Talbott uint8_t status; 6104db7dd1bSJoe Talbott uint8_t reserved; 6114db7dd1bSJoe Talbott uint8_t chan; 6124db7dd1bSJoe Talbott uint64_t tsf; 6134db7dd1bSJoe Talbott } __packed; 6144db7dd1bSJoe Talbott 6154db7dd1bSJoe Talbott #define WPI_EEPROM_MAC 0x015 6164db7dd1bSJoe Talbott #define WPI_EEPROM_REVISION 0x035 6174db7dd1bSJoe Talbott #define WPI_EEPROM_CAPABILITIES 0x045 6184db7dd1bSJoe Talbott #define WPI_EEPROM_TYPE 0x04a 6194db7dd1bSJoe Talbott #define WPI_EEPROM_DOMAIN 0x060 6204db7dd1bSJoe Talbott #define WPI_EEPROM_BAND1 0x063 6214db7dd1bSJoe Talbott #define WPI_EEPROM_BAND2 0x072 6224db7dd1bSJoe Talbott #define WPI_EEPROM_BAND3 0x080 6234db7dd1bSJoe Talbott #define WPI_EEPROM_BAND4 0x08d 6244db7dd1bSJoe Talbott #define WPI_EEPROM_BAND5 0x099 6254db7dd1bSJoe Talbott #define WPI_EEPROM_POWER_GRP 0x100 6264db7dd1bSJoe Talbott 6274db7dd1bSJoe Talbott struct wpi_eeprom_chan { 6284db7dd1bSJoe Talbott uint8_t flags; 6294db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_VALID (1<<0) 6304db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_IBSS (1<<1) 6314db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_ACTIVE (1<<3) 6324db7dd1bSJoe Talbott #define WPI_EEPROM_CHAN_RADAR (1<<4) 6334db7dd1bSJoe Talbott 6344db7dd1bSJoe Talbott int8_t maxpwr; 6354db7dd1bSJoe Talbott } __packed; 6364db7dd1bSJoe Talbott 6374db7dd1bSJoe Talbott struct wpi_eeprom_sample { 6384db7dd1bSJoe Talbott uint8_t index; 6394db7dd1bSJoe Talbott int8_t power; 6404db7dd1bSJoe Talbott uint16_t volt; 6414db7dd1bSJoe Talbott }; 6424db7dd1bSJoe Talbott 6434db7dd1bSJoe Talbott #define WPI_POWER_GROUPS_COUNT 5 6444db7dd1bSJoe Talbott 6454db7dd1bSJoe Talbott struct wpi_eeprom_group { 6464db7dd1bSJoe Talbott struct wpi_eeprom_sample samples[5]; 6474db7dd1bSJoe Talbott int32_t coef[5]; 6484db7dd1bSJoe Talbott int32_t corr[5]; 6494db7dd1bSJoe Talbott int8_t maxpwr; 6504db7dd1bSJoe Talbott uint8_t chan; 6514db7dd1bSJoe Talbott int16_t temp; 6524db7dd1bSJoe Talbott } __packed; 6534db7dd1bSJoe Talbott 6544db7dd1bSJoe Talbott #define WPI_CHAN_BANDS_COUNT 5 6554db7dd1bSJoe Talbott #define WPI_MAX_CHAN_PER_BAND 14 6564db7dd1bSJoe Talbott 6574db7dd1bSJoe Talbott static const struct wpi_chan_band { 6584db7dd1bSJoe Talbott uint32_t addr; /* offset in EEPROM */ 6594db7dd1bSJoe Talbott uint8_t nchan; 6604db7dd1bSJoe Talbott uint8_t chan[WPI_MAX_CHAN_PER_BAND]; 6614db7dd1bSJoe Talbott } wpi_bands[5] = { 6624db7dd1bSJoe Talbott { WPI_EEPROM_BAND1, 14, 6634db7dd1bSJoe Talbott { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }}, 6644db7dd1bSJoe Talbott { WPI_EEPROM_BAND2, 13, 6654db7dd1bSJoe Talbott { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 }}, 6664db7dd1bSJoe Talbott { WPI_EEPROM_BAND3, 12, 6674db7dd1bSJoe Talbott { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 }}, 6684db7dd1bSJoe Talbott { WPI_EEPROM_BAND4, 11, 6694db7dd1bSJoe Talbott { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 }}, 6704db7dd1bSJoe Talbott { WPI_EEPROM_BAND5, 6, 6714db7dd1bSJoe Talbott { 145, 149, 153, 157, 161, 165 }} 6724db7dd1bSJoe Talbott }; 6734db7dd1bSJoe Talbott 6744db7dd1bSJoe Talbott #define WPI_MAX_PWR_INDEX 77 6754db7dd1bSJoe Talbott 6764db7dd1bSJoe Talbott /* 6774db7dd1bSJoe Talbott * RF Tx gain values from highest to lowest power (values obtained from 6784db7dd1bSJoe Talbott * the reference driver.) 6794db7dd1bSJoe Talbott */ 6804db7dd1bSJoe Talbott static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 6814db7dd1bSJoe Talbott 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 6824db7dd1bSJoe Talbott 0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3, 6834db7dd1bSJoe Talbott 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb, 6844db7dd1bSJoe Talbott 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b, 6854db7dd1bSJoe Talbott 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3, 6864db7dd1bSJoe Talbott 0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63, 6874db7dd1bSJoe Talbott 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03, 6884db7dd1bSJoe Talbott 0x03 6894db7dd1bSJoe Talbott }; 6904db7dd1bSJoe Talbott 6914db7dd1bSJoe Talbott static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 6924db7dd1bSJoe Talbott 0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b, 6934db7dd1bSJoe Talbott 0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b, 6944db7dd1bSJoe Talbott 0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33, 6954db7dd1bSJoe Talbott 0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b, 6964db7dd1bSJoe Talbott 0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b, 6974db7dd1bSJoe Talbott 0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63, 6984db7dd1bSJoe Talbott 0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 6994db7dd1bSJoe Talbott 0x03 7004db7dd1bSJoe Talbott }; 7014db7dd1bSJoe Talbott 7024db7dd1bSJoe Talbott /* 7034db7dd1bSJoe Talbott * DSP pre-DAC gain values from highest to lowest power (values obtained 7044db7dd1bSJoe Talbott * from the reference driver.) 7054db7dd1bSJoe Talbott */ 7064db7dd1bSJoe Talbott static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 7074db7dd1bSJoe Talbott 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c, 7084db7dd1bSJoe Talbott 0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b, 7094db7dd1bSJoe Talbott 0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d, 7104db7dd1bSJoe Talbott 0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74, 7114db7dd1bSJoe Talbott 0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71, 7124db7dd1bSJoe Talbott 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 7134db7dd1bSJoe Talbott 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 7144db7dd1bSJoe Talbott 0x5f 7154db7dd1bSJoe Talbott }; 7164db7dd1bSJoe Talbott 7174db7dd1bSJoe Talbott static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 7184db7dd1bSJoe Talbott 0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b, 7194db7dd1bSJoe Talbott 0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62, 7204db7dd1bSJoe Talbott 0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f, 7214db7dd1bSJoe Talbott 0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78, 7224db7dd1bSJoe Talbott 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 7234db7dd1bSJoe Talbott 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78, 7244db7dd1bSJoe Talbott 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 7254db7dd1bSJoe Talbott 0x78 7264db7dd1bSJoe Talbott }; 7274db7dd1bSJoe Talbott 7284db7dd1bSJoe Talbott 7294db7dd1bSJoe Talbott #define WPI_READ(sc, reg) \ 7304db7dd1bSJoe Talbott bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 7314db7dd1bSJoe Talbott 7324db7dd1bSJoe Talbott #define WPI_WRITE(sc, reg, val) \ 7334db7dd1bSJoe Talbott bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 7344db7dd1bSJoe Talbott 7354db7dd1bSJoe Talbott #define WPI_WRITE_REGION_4(sc, offset, datap, count) \ 7364db7dd1bSJoe Talbott bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ 7374db7dd1bSJoe Talbott (datap), (count)) 738