1 1.13 jakllsch /* $NetBSD: if_wpireg.h,v 1.13 2014/07/02 00:15:41 jakllsch Exp $ */ 2 1.13 jakllsch /* $OpenBSD: if_wpireg.h,v 1.19 2007/09/10 20:53:22 damien Exp $ */ 3 1.1 simonb 4 1.1 simonb /*- 5 1.10 jakllsch * Copyright (c) 2006, 2007 6 1.1 simonb * Damien Bergamini <damien.bergamini (at) free.fr> 7 1.1 simonb * 8 1.1 simonb * Permission to use, copy, modify, and distribute this software for any 9 1.1 simonb * purpose with or without fee is hereby granted, provided that the above 10 1.1 simonb * copyright notice and this permission notice appear in all copies. 11 1.1 simonb * 12 1.1 simonb * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 1.1 simonb * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 1.1 simonb * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 1.1 simonb * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 1.1 simonb * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 1.1 simonb * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 1.1 simonb * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 1.1 simonb */ 20 1.1 simonb 21 1.1 simonb #define WPI_TX_RING_COUNT 256 22 1.1 simonb #define WPI_CMD_RING_COUNT 256 23 1.1 simonb #define WPI_RX_RING_COUNT 64 24 1.1 simonb 25 1.10 jakllsch #define WPI_BUF_ALIGN 4096 26 1.3 degroote 27 1.1 simonb /* 28 1.10 jakllsch * Rings must be aligned on a 16K boundary. 29 1.1 simonb * I had a hard time figuring this out. 30 1.1 simonb */ 31 1.1 simonb #define WPI_RING_DMA_ALIGN 0x4000 32 1.1 simonb 33 1.1 simonb /* maximum scatter/gather */ 34 1.1 simonb #define WPI_MAX_SCATTER 4 35 1.1 simonb 36 1.4 degroote /* maximum Rx buffer size (larger than MCLBYTES) */ 37 1.3 degroote #define WPI_RBUF_SIZE (3 * 1024) /* XXX 3000 but must be aligned! */ 38 1.3 degroote 39 1.1 simonb /* 40 1.1 simonb * Control and status registers. 41 1.1 simonb */ 42 1.1 simonb #define WPI_HWCONFIG 0x000 43 1.1 simonb #define WPI_INTR 0x008 44 1.1 simonb #define WPI_MASK 0x00c 45 1.1 simonb #define WPI_INTR_STATUS 0x010 46 1.1 simonb #define WPI_GPIO_STATUS 0x018 47 1.1 simonb #define WPI_RESET 0x020 48 1.1 simonb #define WPI_GPIO_CTL 0x024 49 1.1 simonb #define WPI_EEPROM_CTL 0x02c 50 1.1 simonb #define WPI_EEPROM_STATUS 0x030 51 1.1 simonb #define WPI_UCODE_CLR 0x05c 52 1.1 simonb #define WPI_TEMPERATURE 0x060 53 1.1 simonb #define WPI_CHICKEN 0x100 54 1.1 simonb #define WPI_PLL_CTL 0x20c 55 1.10 jakllsch #define WPI_WRITE_MEM_ADDR 0x444 56 1.10 jakllsch #define WPI_READ_MEM_ADDR 0x448 57 1.10 jakllsch #define WPI_WRITE_MEM_DATA 0x44c 58 1.10 jakllsch #define WPI_READ_MEM_DATA 0x450 59 1.1 simonb #define WPI_TX_WIDX 0x460 60 1.1 simonb #define WPI_TX_CTL(qid) (0x940 + (qid) * 8) 61 1.1 simonb #define WPI_TX_BASE(qid) (0x944 + (qid) * 8) 62 1.1 simonb #define WPI_TX_DESC(qid) (0x980 + (qid) * 80) 63 1.1 simonb #define WPI_RX_CONFIG 0xc00 64 1.1 simonb #define WPI_RX_BASE 0xc04 65 1.1 simonb #define WPI_RX_WIDX 0xc20 66 1.1 simonb #define WPI_RX_RIDX_PTR 0xc24 67 1.1 simonb #define WPI_RX_CTL 0xcc0 68 1.1 simonb #define WPI_RX_STATUS 0xcc4 69 1.1 simonb #define WPI_TX_CONFIG(qid) (0xd00 + (qid) * 32) 70 1.1 simonb #define WPI_TX_CREDIT(qid) (0xd04 + (qid) * 32) 71 1.1 simonb #define WPI_TX_STATE(qid) (0xd08 + (qid) * 32) 72 1.1 simonb #define WPI_TX_BASE_PTR 0xe80 73 1.1 simonb #define WPI_MSG_CONFIG 0xe88 74 1.1 simonb #define WPI_TX_STATUS 0xe90 75 1.1 simonb 76 1.1 simonb 77 1.1 simonb /* 78 1.1 simonb * NIC internal memory offsets. 79 1.1 simonb */ 80 1.1 simonb #define WPI_MEM_MODE 0x2e00 81 1.1 simonb #define WPI_MEM_RA 0x2e04 82 1.1 simonb #define WPI_MEM_TXCFG 0x2e10 83 1.1 simonb #define WPI_MEM_MAGIC4 0x2e14 84 1.1 simonb #define WPI_MEM_MAGIC5 0x2e20 85 1.1 simonb #define WPI_MEM_BYPASS1 0x2e2c 86 1.1 simonb #define WPI_MEM_BYPASS2 0x2e30 87 1.1 simonb #define WPI_MEM_CLOCK1 0x3004 88 1.1 simonb #define WPI_MEM_CLOCK2 0x3008 89 1.1 simonb #define WPI_MEM_POWER 0x300c 90 1.1 simonb #define WPI_MEM_PCIDEV 0x3010 91 1.8 degroote #define WPI_MEM_RFKILL 0x3014 92 1.1 simonb #define WPI_MEM_UCODE_CTL 0x3400 93 1.1 simonb #define WPI_MEM_UCODE_SRC 0x3404 94 1.1 simonb #define WPI_MEM_UCODE_DST 0x3408 95 1.1 simonb #define WPI_MEM_UCODE_SIZE 0x340c 96 1.1 simonb #define WPI_MEM_UCODE_BASE 0x3800 97 1.1 simonb 98 1.5 degroote #define WPI_MEM_TEXT_BASE 0x3490 99 1.5 degroote #define WPI_MEM_TEXT_SIZE 0x3494 100 1.5 degroote #define WPI_MEM_DATA_BASE 0x3498 101 1.5 degroote #define WPI_MEM_DATA_SIZE 0x349c 102 1.1 simonb 103 1.10 jakllsch 104 1.1 simonb /* possible flags for register WPI_HWCONFIG */ 105 1.1 simonb #define WPI_HW_ALM_MB (1 << 8) 106 1.1 simonb #define WPI_HW_ALM_MM (1 << 9) 107 1.1 simonb #define WPI_HW_SKU_MRC (1 << 10) 108 1.1 simonb #define WPI_HW_REV_D (1 << 11) 109 1.1 simonb #define WPI_HW_TYPE_B (1 << 12) 110 1.1 simonb 111 1.1 simonb /* possible flags for registers WPI_READ_MEM_ADDR/WPI_WRITE_MEM_ADDR */ 112 1.1 simonb #define WPI_MEM_4 ((sizeof (uint32_t) - 1) << 24) 113 1.1 simonb 114 1.5 degroote /* possible values for WPI_MEM_UCODE_DST */ 115 1.1 simonb #define WPI_FW_TEXT 0x00000000 116 1.1 simonb 117 1.1 simonb /* possible flags for WPI_GPIO_STATUS */ 118 1.1 simonb #define WPI_POWERED (1 << 9) 119 1.1 simonb 120 1.1 simonb /* possible flags for register WPI_RESET */ 121 1.1 simonb #define WPI_NEVO_RESET (1 << 0) 122 1.1 simonb #define WPI_SW_RESET (1 << 7) 123 1.1 simonb #define WPI_MASTER_DISABLED (1 << 8) 124 1.1 simonb #define WPI_STOP_MASTER (1 << 9) 125 1.1 simonb 126 1.1 simonb /* possible flags for register WPI_GPIO_CTL */ 127 1.1 simonb #define WPI_GPIO_CLOCK (1 << 0) 128 1.1 simonb #define WPI_GPIO_INIT (1 << 2) 129 1.1 simonb #define WPI_GPIO_MAC (1 << 3) 130 1.1 simonb #define WPI_GPIO_SLEEP (1 << 4) 131 1.1 simonb #define WPI_GPIO_PWR_STATUS 0x07000000 132 1.1 simonb #define WPI_GPIO_PWR_SLEEP (4 << 24) 133 1.1 simonb 134 1.1 simonb /* possible flags for register WPI_CHICKEN */ 135 1.1 simonb #define WPI_CHICKEN_RXNOLOS (1 << 23) 136 1.1 simonb 137 1.1 simonb /* possible flags for register WPI_PLL_CTL */ 138 1.1 simonb #define WPI_PLL_INIT (1 << 24) 139 1.1 simonb 140 1.1 simonb /* possible flags for register WPI_UCODE_CLR */ 141 1.1 simonb #define WPI_RADIO_OFF (1 << 1) 142 1.1 simonb #define WPI_DISABLE_CMD (1 << 2) 143 1.1 simonb 144 1.1 simonb /* possible flags for WPI_RX_STATUS */ 145 1.1 simonb #define WPI_RX_IDLE (1 << 24) 146 1.1 simonb 147 1.1 simonb /* possible flags for register WPI_UC_CTL */ 148 1.5 degroote #define WPI_UC_ENABLE (1 << 30) 149 1.10 jakllsch #define WPI_UC_RUN (1 << 31) 150 1.1 simonb 151 1.1 simonb /* possible flags for register WPI_INTR_CSR */ 152 1.1 simonb #define WPI_ALIVE_INTR (1 << 0) 153 1.1 simonb #define WPI_WAKEUP_INTR (1 << 1) 154 1.1 simonb #define WPI_SW_ERROR (1 << 25) 155 1.1 simonb #define WPI_TX_INTR (1 << 27) 156 1.1 simonb #define WPI_HW_ERROR (1 << 29) 157 1.1 simonb #define WPI_RX_INTR (1 << 31) 158 1.1 simonb 159 1.1 simonb #define WPI_INTR_MASK \ 160 1.1 simonb (WPI_SW_ERROR | WPI_HW_ERROR | WPI_TX_INTR | WPI_RX_INTR | \ 161 1.1 simonb WPI_ALIVE_INTR | WPI_WAKEUP_INTR) 162 1.1 simonb 163 1.1 simonb /* possible flags for register WPI_TX_STATUS */ 164 1.1 simonb #define WPI_TX_IDLE(qid) (1 << ((qid) + 24) | 1 << ((qid) + 16)) 165 1.1 simonb 166 1.1 simonb /* possible flags for register WPI_EEPROM_CTL */ 167 1.1 simonb #define WPI_EEPROM_READY (1 << 0) 168 1.1 simonb 169 1.1 simonb /* possible flags for register WPI_EEPROM_STATUS */ 170 1.1 simonb #define WPI_EEPROM_VERSION 0x00000007 171 1.1 simonb #define WPI_EEPROM_LOCKED 0x00000180 172 1.1 simonb 173 1.1 simonb 174 1.1 simonb struct wpi_shared { 175 1.1 simonb uint32_t txbase[8]; 176 1.1 simonb uint32_t next; 177 1.1 simonb uint32_t reserved[2]; 178 1.9 perry } __packed; 179 1.1 simonb 180 1.1 simonb #define WPI_MAX_SEG_LEN 65520 181 1.1 simonb struct wpi_tx_desc { 182 1.1 simonb uint32_t flags; 183 1.1 simonb #define WPI_PAD32(x) ((((x) + 3) & ~3) - (x)) 184 1.1 simonb 185 1.1 simonb struct { 186 1.1 simonb uint32_t addr; 187 1.1 simonb uint32_t len; 188 1.9 perry } __packed segs[WPI_MAX_SCATTER]; 189 1.1 simonb uint8_t reserved[28]; 190 1.9 perry } __packed; 191 1.1 simonb 192 1.1 simonb struct wpi_tx_stat { 193 1.1 simonb uint8_t nrts; 194 1.1 simonb uint8_t ntries; 195 1.1 simonb uint8_t nkill; 196 1.1 simonb uint8_t rate; 197 1.1 simonb uint32_t duration; 198 1.1 simonb uint32_t status; 199 1.9 perry } __packed; 200 1.1 simonb 201 1.1 simonb struct wpi_rx_desc { 202 1.1 simonb uint32_t len; 203 1.1 simonb uint8_t type; 204 1.1 simonb #define WPI_UC_READY 1 205 1.11 jakllsch #define WPI_ADD_NODE_DONE 24 206 1.1 simonb #define WPI_RX_DONE 27 207 1.1 simonb #define WPI_TX_DONE 28 208 1.1 simonb #define WPI_START_SCAN 130 209 1.1 simonb #define WPI_STOP_SCAN 132 210 1.1 simonb #define WPI_STATE_CHANGED 161 211 1.1 simonb 212 1.1 simonb uint8_t flags; 213 1.1 simonb uint8_t idx; 214 1.1 simonb uint8_t qid; 215 1.9 perry } __packed; 216 1.1 simonb 217 1.1 simonb struct wpi_rx_stat { 218 1.1 simonb uint8_t len; 219 1.1 simonb #define WPI_STAT_MAXLEN 20 220 1.1 simonb 221 1.1 simonb uint8_t id; 222 1.1 simonb uint8_t rssi; /* received signal strength */ 223 1.1 simonb #define WPI_RSSI_OFFSET 95 224 1.1 simonb 225 1.1 simonb uint8_t agc; /* access gain control */ 226 1.1 simonb uint16_t signal; 227 1.1 simonb uint16_t noise; 228 1.9 perry } __packed; 229 1.1 simonb 230 1.1 simonb struct wpi_rx_head { 231 1.1 simonb uint16_t chan; 232 1.1 simonb uint16_t flags; 233 1.1 simonb uint8_t reserved; 234 1.1 simonb uint8_t rate; 235 1.1 simonb uint16_t len; 236 1.9 perry } __packed; 237 1.1 simonb 238 1.1 simonb struct wpi_rx_tail { 239 1.1 simonb uint32_t flags; 240 1.1 simonb #define WPI_RX_NO_CRC_ERR (1 << 0) 241 1.1 simonb #define WPI_RX_NO_OVFL_ERR (1 << 1) 242 1.1 simonb /* shortcut for the above */ 243 1.1 simonb #define WPI_RX_NOERROR (WPI_RX_NO_CRC_ERR | WPI_RX_NO_OVFL_ERR) 244 1.1 simonb 245 1.1 simonb uint64_t tstamp; 246 1.1 simonb uint32_t tbeacon; 247 1.9 perry } __packed; 248 1.1 simonb 249 1.1 simonb struct wpi_tx_cmd { 250 1.1 simonb uint8_t code; 251 1.1 simonb #define WPI_CMD_CONFIGURE 16 252 1.1 simonb #define WPI_CMD_ASSOCIATE 17 253 1.10 jakllsch #define WPI_CMD_SET_WME 19 254 1.1 simonb #define WPI_CMD_TSF 20 255 1.1 simonb #define WPI_CMD_ADD_NODE 24 256 1.1 simonb #define WPI_CMD_TX_DATA 28 257 1.1 simonb #define WPI_CMD_MRR_SETUP 71 258 1.1 simonb #define WPI_CMD_SET_LED 72 259 1.1 simonb #define WPI_CMD_SET_POWER_MODE 119 260 1.1 simonb #define WPI_CMD_SCAN 128 261 1.1 simonb #define WPI_CMD_SET_BEACON 145 262 1.4 degroote #define WPI_CMD_TXPOWER 151 263 1.1 simonb #define WPI_CMD_BLUETOOTH 155 264 1.1 simonb 265 1.1 simonb uint8_t flags; 266 1.1 simonb uint8_t idx; 267 1.1 simonb uint8_t qid; 268 1.1 simonb uint8_t data[124]; 269 1.9 perry } __packed; 270 1.1 simonb 271 1.1 simonb /* structure for WPI_CMD_CONFIGURE */ 272 1.1 simonb struct wpi_config { 273 1.1 simonb uint8_t myaddr[IEEE80211_ADDR_LEN]; 274 1.1 simonb uint16_t reserved1; 275 1.1 simonb uint8_t bssid[IEEE80211_ADDR_LEN]; 276 1.1 simonb uint16_t reserved2; 277 1.1 simonb uint32_t reserved3[2]; 278 1.1 simonb uint8_t mode; 279 1.1 simonb #define WPI_MODE_HOSTAP 1 280 1.1 simonb #define WPI_MODE_STA 3 281 1.1 simonb #define WPI_MODE_IBSS 4 282 1.1 simonb #define WPI_MODE_MONITOR 6 283 1.1 simonb 284 1.1 simonb uint8_t reserved4[3]; 285 1.1 simonb uint8_t ofdm_mask; 286 1.1 simonb uint8_t cck_mask; 287 1.4 degroote uint16_t associd; 288 1.1 simonb uint32_t flags; 289 1.1 simonb #define WPI_CONFIG_24GHZ (1 << 0) 290 1.1 simonb #define WPI_CONFIG_CCK (1 << 1) 291 1.1 simonb #define WPI_CONFIG_AUTO (1 << 2) 292 1.1 simonb #define WPI_CONFIG_SHSLOT (1 << 4) 293 1.1 simonb #define WPI_CONFIG_SHPREAMBLE (1 << 5) 294 1.1 simonb #define WPI_CONFIG_NODIVERSITY (1 << 7) 295 1.1 simonb #define WPI_CONFIG_ANTENNA_A (1 << 8) 296 1.1 simonb #define WPI_CONFIG_ANTENNA_B (1 << 9) 297 1.1 simonb #define WPI_CONFIG_TSF (1 << 15) 298 1.1 simonb 299 1.1 simonb uint32_t filter; 300 1.1 simonb #define WPI_FILTER_PROMISC (1 << 0) 301 1.1 simonb #define WPI_FILTER_CTL (1 << 1) 302 1.1 simonb #define WPI_FILTER_MULTICAST (1 << 2) 303 1.1 simonb #define WPI_FILTER_NODECRYPT (1 << 3) 304 1.1 simonb #define WPI_FILTER_BSS (1 << 5) 305 1.1 simonb #define WPI_FILTER_BEACON (1 << 6) 306 1.1 simonb 307 1.1 simonb uint8_t chan; 308 1.1 simonb uint8_t reserved6[3]; 309 1.9 perry } __packed; 310 1.1 simonb 311 1.1 simonb /* structure for command WPI_CMD_ASSOCIATE */ 312 1.1 simonb struct wpi_assoc { 313 1.1 simonb uint32_t flags; 314 1.1 simonb uint32_t filter; 315 1.1 simonb uint8_t ofdm_mask; 316 1.1 simonb uint8_t cck_mask; 317 1.1 simonb uint16_t reserved; 318 1.9 perry } __packed; 319 1.1 simonb 320 1.1 simonb /* structure for command WPI_CMD_SET_WME */ 321 1.1 simonb struct wpi_wme_setup { 322 1.1 simonb uint32_t flags; 323 1.1 simonb struct { 324 1.1 simonb uint16_t cwmin; 325 1.1 simonb uint16_t cwmax; 326 1.1 simonb uint8_t aifsn; 327 1.1 simonb uint8_t reserved; 328 1.1 simonb uint16_t txop; 329 1.1 simonb } __packed ac[WME_NUM_AC]; 330 1.9 perry } __packed; 331 1.1 simonb 332 1.1 simonb /* structure for command WPI_CMD_TSF */ 333 1.1 simonb struct wpi_cmd_tsf { 334 1.1 simonb uint64_t tstamp; 335 1.1 simonb uint16_t bintval; 336 1.1 simonb uint16_t atim; 337 1.1 simonb uint32_t binitval; 338 1.1 simonb uint16_t lintval; 339 1.1 simonb uint16_t reserved; 340 1.9 perry } __packed; 341 1.1 simonb 342 1.1 simonb /* structure for WPI_CMD_ADD_NODE */ 343 1.2 joerg struct wpi_node_info { 344 1.1 simonb uint8_t control; 345 1.11 jakllsch #define WPI_NODE_UPDATE (1 << 0) 346 1.1 simonb 347 1.1 simonb uint8_t reserved1[3]; 348 1.1 simonb uint8_t bssid[IEEE80211_ADDR_LEN]; 349 1.1 simonb uint16_t reserved2; 350 1.1 simonb uint8_t id; 351 1.1 simonb #define WPI_ID_BSS 0 352 1.1 simonb #define WPI_ID_BROADCAST 24 353 1.1 simonb 354 1.4 degroote uint8_t flags; 355 1.11 jakllsch #define WPI_FLAG_SET_KEY (1 << 0) 356 1.11 jakllsch 357 1.1 simonb uint16_t reserved3; 358 1.11 jakllsch uint16_t security; 359 1.1 simonb uint8_t tkip; 360 1.1 simonb uint8_t reserved4; 361 1.1 simonb uint16_t ttak[5]; 362 1.1 simonb uint16_t reserved5; 363 1.1 simonb uint8_t key[IEEE80211_KEYBUF_SIZE]; 364 1.4 degroote uint32_t action; 365 1.11 jakllsch #define WPI_ACTION_SET_RATE (1 << 2) 366 1.4 degroote 367 1.1 simonb uint32_t mask; 368 1.1 simonb uint16_t tid; 369 1.1 simonb uint8_t rate; 370 1.4 degroote uint8_t antenna; 371 1.4 degroote #define WPI_ANTENNA_A (1 << 6) 372 1.4 degroote #define WPI_ANTENNA_B (1 << 7) 373 1.4 degroote #define WPI_ANTENNA_BOTH (WPI_ANTENNA_A | WPI_ANTENNA_B) 374 1.4 degroote 375 1.1 simonb uint8_t add_imm; 376 1.1 simonb uint8_t del_imm; 377 1.1 simonb uint16_t add_imm_start; 378 1.9 perry } __packed; 379 1.1 simonb 380 1.1 simonb /* structure for command WPI_CMD_TX_DATA */ 381 1.1 simonb struct wpi_cmd_data { 382 1.1 simonb uint16_t len; 383 1.1 simonb uint16_t lnext; 384 1.1 simonb uint32_t flags; 385 1.1 simonb #define WPI_TX_NEED_RTS (1 << 1) 386 1.10 jakllsch #define WPI_TX_NEED_CTS (1 << 2) 387 1.1 simonb #define WPI_TX_NEED_ACK (1 << 3) 388 1.1 simonb #define WPI_TX_FULL_TXOP (1 << 7) 389 1.4 degroote #define WPI_TX_BT_DISABLE (1 << 12) /* bluetooth coexistence */ 390 1.1 simonb #define WPI_TX_AUTO_SEQ (1 << 13) 391 1.1 simonb #define WPI_TX_INSERT_TSTAMP (1 << 16) 392 1.1 simonb 393 1.1 simonb uint8_t rate; 394 1.1 simonb uint8_t id; 395 1.1 simonb uint8_t tid; 396 1.1 simonb uint8_t security; 397 1.11 jakllsch #define WPI_CIPHER_WEP40 1 398 1.11 jakllsch #define WPI_CIPHER_CCMP 2 399 1.11 jakllsch #define WPI_CIPHER_TKIP 3 400 1.11 jakllsch #define WPI_CIPHER_WEP104 9 401 1.11 jakllsch 402 1.1 simonb uint8_t key[IEEE80211_KEYBUF_SIZE]; 403 1.1 simonb uint8_t tkip[IEEE80211_WEP_MICLEN]; 404 1.1 simonb uint32_t fnext; 405 1.1 simonb uint32_t lifetime; 406 1.4 degroote #define WPI_LIFETIME_INFINITE 0xffffffff 407 1.4 degroote 408 1.1 simonb uint8_t ofdm_mask; 409 1.1 simonb uint8_t cck_mask; 410 1.1 simonb uint8_t rts_ntries; 411 1.1 simonb uint8_t data_ntries; 412 1.1 simonb uint16_t timeout; 413 1.1 simonb uint16_t txop; 414 1.9 perry } __packed; 415 1.1 simonb 416 1.1 simonb /* structure for command WPI_CMD_SET_BEACON */ 417 1.1 simonb struct wpi_cmd_beacon { 418 1.1 simonb uint16_t len; 419 1.1 simonb uint16_t reserved1; 420 1.1 simonb uint32_t flags; /* same as wpi_cmd_data */ 421 1.1 simonb uint8_t rate; 422 1.1 simonb uint8_t id; 423 1.1 simonb uint8_t reserved2[30]; 424 1.1 simonb uint32_t lifetime; 425 1.1 simonb uint8_t ofdm_mask; 426 1.1 simonb uint8_t cck_mask; 427 1.1 simonb uint16_t reserved3[3]; 428 1.1 simonb uint16_t tim; 429 1.1 simonb uint8_t timsz; 430 1.1 simonb uint8_t reserved4; 431 1.1 simonb struct ieee80211_frame wh; 432 1.9 perry } __packed; 433 1.1 simonb 434 1.1 simonb /* structure for WPI_CMD_MRR_SETUP */ 435 1.1 simonb struct wpi_mrr_setup { 436 1.1 simonb uint32_t which; 437 1.1 simonb #define WPI_MRR_CTL 0 438 1.1 simonb #define WPI_MRR_DATA 1 439 1.1 simonb 440 1.1 simonb struct { 441 1.1 simonb uint8_t plcp; 442 1.1 simonb uint8_t flags; 443 1.1 simonb uint8_t ntries; 444 1.1 simonb uint8_t next; 445 1.1 simonb #define WPI_OFDM6 0 446 1.1 simonb #define WPI_OFDM54 7 447 1.1 simonb #define WPI_CCK1 8 448 1.1 simonb #define WPI_CCK2 9 449 1.1 simonb #define WPI_CCK11 11 450 1.1 simonb 451 1.9 perry } __packed rates[WPI_CCK11 + 1]; 452 1.9 perry } __packed; 453 1.1 simonb 454 1.1 simonb /* structure for WPI_CMD_SET_LED */ 455 1.1 simonb struct wpi_cmd_led { 456 1.1 simonb uint32_t unit; /* multiplier (in usecs) */ 457 1.1 simonb uint8_t which; 458 1.1 simonb #define WPI_LED_ACTIVITY 1 459 1.1 simonb #define WPI_LED_LINK 2 460 1.1 simonb 461 1.1 simonb uint8_t off; 462 1.1 simonb uint8_t on; 463 1.1 simonb uint8_t reserved; 464 1.9 perry } __packed; 465 1.1 simonb 466 1.1 simonb /* structure for WPI_CMD_SET_POWER_MODE */ 467 1.1 simonb struct wpi_power { 468 1.1 simonb uint32_t flags; 469 1.4 degroote #define WPI_POWER_CAM 0 /* constantly awake mode */ 470 1.4 degroote 471 1.1 simonb uint32_t rx_timeout; 472 1.1 simonb uint32_t tx_timeout; 473 1.1 simonb uint32_t sleep[5]; 474 1.9 perry } __packed; 475 1.1 simonb 476 1.10 jakllsch /* structures for command WPI_CMD_SCAN */ 477 1.4 degroote struct wpi_scan_essid { 478 1.4 degroote uint8_t id; 479 1.4 degroote uint8_t len; 480 1.4 degroote uint8_t data[IEEE80211_NWID_LEN]; 481 1.9 perry } __packed; 482 1.4 degroote 483 1.1 simonb struct wpi_scan_hdr { 484 1.4 degroote uint16_t len; 485 1.1 simonb uint8_t reserved1; 486 1.1 simonb uint8_t nchan; 487 1.1 simonb uint16_t quiet; 488 1.4 degroote uint16_t plcp_threshold; 489 1.4 degroote uint16_t crc_threshold; 490 1.4 degroote uint16_t reserved2; 491 1.4 degroote uint32_t max_svc; /* background scans */ 492 1.4 degroote uint32_t pause_svc; /* background scans */ 493 1.1 simonb uint32_t flags; 494 1.1 simonb uint32_t filter; 495 1.4 degroote 496 1.12 jakllsch /* followed by a struct wpi_cmd_data */ 497 1.12 jakllsch struct wpi_cmd_data cmd; 498 1.4 degroote 499 1.12 jakllsch /* followed by an array of 4x struct wpi_scan_essid */ 500 1.4 degroote struct wpi_scan_essid essid[4]; 501 1.1 simonb 502 1.1 simonb /* followed by probe request body */ 503 1.1 simonb /* followed by nchan x wpi_scan_chan */ 504 1.9 perry } __packed; 505 1.1 simonb 506 1.1 simonb struct wpi_scan_chan { 507 1.1 simonb uint8_t flags; 508 1.4 degroote #define WPI_CHAN_ACTIVE (1 << 0) 509 1.4 degroote #define WPI_CHAN_DIRECT (1 << 1) 510 1.4 degroote 511 1.10 jakllsch uint8_t chan; 512 1.4 degroote uint8_t rf_gain; 513 1.4 degroote uint8_t dsp_gain; 514 1.1 simonb uint16_t active; /* msecs */ 515 1.1 simonb uint16_t passive; /* msecs */ 516 1.9 perry } __packed; 517 1.1 simonb 518 1.4 degroote /* structure for WPI_CMD_TXPOWER */ 519 1.4 degroote struct wpi_cmd_txpower { 520 1.4 degroote uint8_t band; 521 1.4 degroote #define WPI_BAND_5GHZ 0 522 1.4 degroote #define WPI_BAND_2GHZ 1 523 1.4 degroote 524 1.4 degroote uint8_t reserved; 525 1.4 degroote uint16_t chan; 526 1.4 degroote struct { 527 1.4 degroote uint8_t plcp; 528 1.4 degroote uint8_t rf_gain; 529 1.4 degroote uint8_t dsp_gain; 530 1.4 degroote uint8_t reserved; 531 1.10 jakllsch } __packed rates[WPI_CCK11 + 1]; 532 1.9 perry } __packed; 533 1.4 degroote 534 1.1 simonb /* structure for WPI_CMD_BLUETOOTH */ 535 1.1 simonb struct wpi_bluetooth { 536 1.1 simonb uint8_t flags; 537 1.1 simonb uint8_t lead; 538 1.1 simonb uint8_t kill; 539 1.1 simonb uint8_t reserved; 540 1.1 simonb uint32_t ack; 541 1.1 simonb uint32_t cts; 542 1.9 perry } __packed; 543 1.1 simonb 544 1.1 simonb 545 1.1 simonb /* structure for WPI_UC_READY notification */ 546 1.1 simonb struct wpi_ucode_info { 547 1.1 simonb uint32_t version; 548 1.1 simonb uint8_t revision[8]; 549 1.1 simonb uint8_t type; 550 1.1 simonb uint8_t subtype; 551 1.1 simonb uint16_t reserved; 552 1.1 simonb uint32_t logptr; 553 1.1 simonb uint32_t errorptr; 554 1.1 simonb uint32_t timestamp; 555 1.1 simonb uint32_t valid; 556 1.9 perry } __packed; 557 1.1 simonb 558 1.1 simonb /* structure for WPI_START_SCAN notification */ 559 1.1 simonb struct wpi_start_scan { 560 1.1 simonb uint64_t tstamp; 561 1.1 simonb uint32_t tbeacon; 562 1.1 simonb uint8_t chan; 563 1.1 simonb uint8_t band; 564 1.1 simonb uint16_t reserved; 565 1.1 simonb uint32_t status; 566 1.9 perry } __packed; 567 1.1 simonb 568 1.1 simonb /* structure for WPI_STOP_SCAN notification */ 569 1.1 simonb struct wpi_stop_scan { 570 1.1 simonb uint8_t nchan; 571 1.1 simonb uint8_t status; 572 1.1 simonb uint8_t reserved; 573 1.1 simonb uint8_t chan; 574 1.1 simonb uint64_t tsf; 575 1.9 perry } __packed; 576 1.4 degroote 577 1.10 jakllsch 578 1.4 degroote /* firmware image header */ 579 1.4 degroote struct wpi_firmware_hdr { 580 1.4 degroote uint32_t version; 581 1.4 degroote uint32_t main_textsz; 582 1.4 degroote uint32_t main_datasz; 583 1.10 jakllsch uint32_t init_textsz; 584 1.5 degroote uint32_t init_datasz; 585 1.4 degroote uint32_t boot_textsz; 586 1.9 perry } __packed; 587 1.4 degroote 588 1.4 degroote #define WPI_FW_MAIN_TEXT_MAXSZ (80 * 1024) 589 1.4 degroote #define WPI_FW_MAIN_DATA_MAXSZ (32 * 1024) 590 1.10 jakllsch #define WPI_FW_INIT_TEXT_MAXSZ (80 * 1024) 591 1.10 jakllsch #define WPI_FW_INIT_DATA_MAXSZ (32 * 1024) 592 1.13 jakllsch #define WPI_FW_BOOT_TEXT_MAXSZ 1024 593 1.4 degroote 594 1.10 jakllsch #define WPI_FW_UPDATED (1 << 31) 595 1.10 jakllsch 596 1.4 degroote /* 597 1.10 jakllsch * Offsets into EEPROM. 598 1.10 jakllsch */ 599 1.1 simonb #define WPI_EEPROM_MAC 0x015 600 1.1 simonb #define WPI_EEPROM_REVISION 0x035 601 1.1 simonb #define WPI_EEPROM_CAPABILITIES 0x045 602 1.1 simonb #define WPI_EEPROM_TYPE 0x04a 603 1.10 jakllsch #define WPI_EEPROM_DOMAIN 0x060 604 1.4 degroote #define WPI_EEPROM_BAND1 0x063 605 1.4 degroote #define WPI_EEPROM_BAND2 0x072 606 1.4 degroote #define WPI_EEPROM_BAND3 0x080 607 1.4 degroote #define WPI_EEPROM_BAND4 0x08d 608 1.4 degroote #define WPI_EEPROM_BAND5 0x099 609 1.4 degroote #define WPI_EEPROM_POWER_GRP 0x100 610 1.4 degroote 611 1.4 degroote struct wpi_eeprom_chan { 612 1.4 degroote uint8_t flags; 613 1.4 degroote #define WPI_EEPROM_CHAN_VALID (1 << 0) 614 1.4 degroote #define WPI_EEPROM_CHAN_IBSS (1 << 1) 615 1.4 degroote #define WPI_EEPROM_CHAN_ACTIVE (1 << 3) 616 1.4 degroote #define WPI_EEPROM_CHAN_RADAR (1 << 4) 617 1.4 degroote 618 1.4 degroote int8_t maxpwr; 619 1.9 perry } __packed; 620 1.4 degroote 621 1.4 degroote struct wpi_eeprom_sample { 622 1.4 degroote uint8_t index; 623 1.4 degroote int8_t power; 624 1.4 degroote uint16_t volt; 625 1.9 perry } __packed; 626 1.4 degroote 627 1.4 degroote #define WPI_POWER_GROUPS_COUNT 5 628 1.4 degroote struct wpi_eeprom_group { 629 1.4 degroote struct wpi_eeprom_sample samples[5]; 630 1.4 degroote int32_t coef[5]; 631 1.4 degroote int32_t corr[5]; 632 1.4 degroote int8_t maxpwr; 633 1.4 degroote uint8_t chan; 634 1.4 degroote int16_t temp; 635 1.9 perry } __packed; 636 1.4 degroote 637 1.4 degroote #define WPI_CHAN_BANDS_COUNT 5 638 1.4 degroote #define WPI_MAX_CHAN_PER_BAND 14 639 1.4 degroote static const struct wpi_chan_band { 640 1.4 degroote uint32_t addr; /* offset in EEPROM */ 641 1.4 degroote uint8_t nchan; 642 1.4 degroote uint8_t chan[WPI_MAX_CHAN_PER_BAND]; 643 1.4 degroote } wpi_bands[5] = { 644 1.4 degroote { WPI_EEPROM_BAND1, 14, 645 1.4 degroote { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 } }, 646 1.4 degroote { WPI_EEPROM_BAND2, 13, 647 1.4 degroote { 183, 184, 185, 187, 188, 189, 192, 196, 7, 8, 11, 12, 16 } }, 648 1.4 degroote { WPI_EEPROM_BAND3, 12, 649 1.4 degroote { 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64 } }, 650 1.4 degroote { WPI_EEPROM_BAND4, 11, 651 1.4 degroote { 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 } }, 652 1.4 degroote { WPI_EEPROM_BAND5, 6, 653 1.4 degroote { 145, 149, 153, 157, 161, 165 } } 654 1.4 degroote }; 655 1.4 degroote 656 1.4 degroote /* convert rate index (device view) into rate in 500Kbps unit */ 657 1.4 degroote static const uint8_t wpi_ridx_to_rate[] = { 658 1.4 degroote 12, 18, 24, 36, 48, 72, 96, 108, /* OFDM */ 659 1.4 degroote 2, 4, 11, 22 /* CCK */ 660 1.4 degroote }; 661 1.4 degroote 662 1.4 degroote /* convert rate index (device view) into PLCP code */ 663 1.4 degroote static const uint8_t wpi_ridx_to_plcp[] = { 664 1.4 degroote 0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, /* OFDM R1-R4 */ 665 1.4 degroote 10, 20, 55, 110 /* CCK */ 666 1.4 degroote }; 667 1.4 degroote 668 1.4 degroote #define WPI_MAX_PWR_INDEX 77 669 1.4 degroote /* 670 1.4 degroote * RF Tx gain values from highest to lowest power (values obtained from 671 1.4 degroote * the reference driver.) 672 1.4 degroote */ 673 1.4 degroote static const uint8_t wpi_rf_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 674 1.4 degroote 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xbb, 0xbb, 0xbb, 675 1.4 degroote 0xbb, 0xf3, 0xf3, 0xf3, 0xf3, 0xf3, 0xd3, 0xd3, 0xb3, 0xb3, 0xb3, 676 1.4 degroote 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x93, 0x73, 0xeb, 0xeb, 0xeb, 677 1.4 degroote 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xcb, 0xab, 0xab, 0xab, 0x8b, 678 1.4 degroote 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xe3, 0xc3, 0xc3, 0xc3, 0xc3, 0xa3, 679 1.4 degroote 0xa3, 0xa3, 0xa3, 0x83, 0x83, 0x83, 0x83, 0x63, 0x63, 0x63, 0x63, 680 1.4 degroote 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 0x03, 0x03, 0x03, 681 1.4 degroote 0x03 682 1.4 degroote }; 683 1.4 degroote 684 1.4 degroote static const uint8_t wpi_rf_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 685 1.4 degroote 0xfb, 0xfb, 0xfb, 0xdb, 0xdb, 0xbb, 0xbb, 0x9b, 0x9b, 0x7b, 0x7b, 686 1.4 degroote 0x7b, 0x7b, 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1b, 0x1b, 687 1.4 degroote 0x1b, 0x73, 0x73, 0x73, 0x53, 0x53, 0x53, 0x53, 0x53, 0x33, 0x33, 688 1.4 degroote 0x33, 0x33, 0x13, 0x13, 0x13, 0x13, 0x13, 0xab, 0xab, 0xab, 0x8b, 689 1.4 degroote 0x8b, 0x8b, 0x8b, 0x6b, 0x6b, 0x6b, 0x6b, 0x4b, 0x4b, 0x4b, 0x4b, 690 1.4 degroote 0x2b, 0x2b, 0x2b, 0x2b, 0x0b, 0x0b, 0x0b, 0x0b, 0x83, 0x83, 0x63, 691 1.4 degroote 0x63, 0x63, 0x63, 0x43, 0x43, 0x43, 0x43, 0x23, 0x23, 0x23, 0x23, 692 1.4 degroote 0x03 693 1.4 degroote }; 694 1.4 degroote 695 1.4 degroote /* 696 1.4 degroote * DSP pre-DAC gain values from highest to lowest power (values obtained 697 1.4 degroote * from the reference driver.) 698 1.4 degroote */ 699 1.4 degroote static const uint8_t wpi_dsp_gain_2ghz[WPI_MAX_PWR_INDEX + 1] = { 700 1.4 degroote 0x7f, 0x7f, 0x7f, 0x7f, 0x7d, 0x6e, 0x69, 0x62, 0x7d, 0x73, 0x6c, 701 1.4 degroote 0x63, 0x77, 0x6f, 0x69, 0x61, 0x5c, 0x6a, 0x64, 0x78, 0x71, 0x6b, 702 1.4 degroote 0x7d, 0x77, 0x70, 0x6a, 0x65, 0x61, 0x5b, 0x6b, 0x79, 0x73, 0x6d, 703 1.4 degroote 0x7f, 0x79, 0x73, 0x6c, 0x66, 0x60, 0x5c, 0x6e, 0x68, 0x62, 0x74, 704 1.4 degroote 0x7d, 0x77, 0x71, 0x6b, 0x65, 0x60, 0x71, 0x6a, 0x66, 0x5f, 0x71, 705 1.4 degroote 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 706 1.4 degroote 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 0x5f, 0x71, 0x6a, 0x66, 707 1.4 degroote 0x5f 708 1.4 degroote }; 709 1.4 degroote 710 1.4 degroote static const uint8_t wpi_dsp_gain_5ghz[WPI_MAX_PWR_INDEX + 1] = { 711 1.4 degroote 0x7f, 0x78, 0x72, 0x77, 0x65, 0x71, 0x66, 0x72, 0x67, 0x75, 0x6b, 712 1.4 degroote 0x63, 0x5c, 0x6c, 0x7d, 0x76, 0x6d, 0x66, 0x60, 0x5a, 0x68, 0x62, 713 1.4 degroote 0x5c, 0x76, 0x6f, 0x68, 0x7e, 0x79, 0x71, 0x69, 0x63, 0x76, 0x6f, 714 1.4 degroote 0x68, 0x62, 0x74, 0x6d, 0x66, 0x62, 0x5d, 0x71, 0x6b, 0x63, 0x78, 715 1.4 degroote 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 716 1.4 degroote 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x6b, 0x63, 0x78, 717 1.4 degroote 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 0x78, 0x71, 0x6b, 0x63, 718 1.4 degroote 0x78 719 1.4 degroote }; 720 1.1 simonb 721 1.1 simonb #define WPI_READ(sc, reg) \ 722 1.1 simonb bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg)) 723 1.1 simonb 724 1.1 simonb #define WPI_WRITE(sc, reg, val) \ 725 1.1 simonb bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val)) 726 1.1 simonb 727 1.1 simonb #define WPI_WRITE_REGION_4(sc, offset, datap, count) \ 728 1.1 simonb bus_space_write_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \ 729 1.10 jakllsch (datap), (count)) 730