1 /* $OpenBSD: acxreg.h,v 1.13 2022/01/09 05:42:38 jsg Exp $ */ 2 3 /* 4 * Copyright (c) 2006 Jonathan Gray <jsg@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /* 20 * Copyright (c) 2006 The DragonFly Project. All rights reserved. 21 * 22 * This code is derived from software contributed to The DragonFly Project 23 * by Sepherosa Ziehau <sepherosa@gmail.com> 24 * 25 * Redistribution and use in source and binary forms, with or without 26 * modification, are permitted provided that the following conditions 27 * are met: 28 * 29 * 1. Redistributions of source code must retain the above copyright 30 * notice, this list of conditions and the following disclaimer. 31 * 2. Redistributions in binary form must reproduce the above copyright 32 * notice, this list of conditions and the following disclaimer in 33 * the documentation and/or other materials provided with the 34 * distribution. 35 * 3. Neither the name of The DragonFly Project nor the names of its 36 * contributors may be used to endorse or promote products derived 37 * from this software without specific, prior written permission. 38 * 39 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 40 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 41 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 42 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 43 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 44 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, 45 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 47 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 48 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 49 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 50 * SUCH DAMAGE. 51 */ 52 53 #ifndef _ACXREG_H 54 #define _ACXREG_H 55 56 /* 57 * IO register index 58 */ 59 #define ACXREG_SOFT_RESET 0 60 #define ACXREG_FWMEM_ADDR 1 61 #define ACXREG_FWMEM_DATA 2 62 #define ACXREG_FWMEM_CTRL 3 63 #define ACXREG_FWMEM_START 4 64 #define ACXREG_EVENT_MASK 5 65 #define ACXREG_INTR_TRIG 6 66 #define ACXREG_INTR_MASK 7 67 #define ACXREG_INTR_STATUS 8 68 #define ACXREG_INTR_STATUS_CLR 9 /* cleared after being read */ 69 #define ACXREG_INTR_ACK 10 70 #define ACXREG_HINTR_TRIG 11 /* XXX what's this? */ 71 #define ACXREG_RADIO_ENABLE 12 72 #define ACXREG_EEPROM_INIT 13 73 #define ACXREG_EEPROM_CTRL 14 74 #define ACXREG_EEPROM_ADDR 15 75 #define ACXREG_EEPROM_DATA 16 76 #define ACXREG_EEPROM_CONF 17 77 #define ACXREG_EEPROM_INFO 18 78 #define ACXREG_PHY_ADDR 19 79 #define ACXREG_PHY_DATA 20 80 #define ACXREG_PHY_CTRL 21 81 #define ACXREG_GPIO_OUT_ENABLE 22 82 #define ACXREG_GPIO_OUT 23 83 #define ACXREG_CMD_REG_OFFSET 24 84 #define ACXREG_INFO_REG_OFFSET 25 85 #define ACXREG_RESET_SENSE 26 86 #define ACXREG_ECPU_CTRL 27 87 #define ACXREG_MAX 28 88 #define ACXREG(reg, val) [ACXREG_##reg] = val 89 90 /* 91 * Value read from ACXREG_EEPROM_INFO 92 * upper 8bits are radio type 93 * lower 8bits are form factor 94 */ 95 #define ACX_EEINFO_RADIO_TYPE_SHIFT 8 96 #define ACX_EEINFO_RADIO_TYPE_MASK (0xff << ACX_EEINFO_RADIO_TYPE_SHIFT) 97 #define ACX_EEINFO_FORM_FACTOR_MASK 0xff 98 99 #define ACX_EEINFO_HAS_RADIO_TYPE(info) ((info) & ACX_EEINFO_RADIO_TYPE_MASK) 100 #define ACX_EEINFO_RADIO_TYPE(info) ((info) >> ACX_EEINFO_RADIO_TYPE_SHIFT) 101 #define ACX_EEINFO_FORM_FACTOR(info) ((info) & ACX_EEINFO_FORM_FACTOR_MASK) 102 103 /* 104 * Size of command register whose location is obtained 105 * from ACXREG_CMD_REG_OFFSET IO register 106 */ 107 #define ACX_CMD_REG_SIZE 4 /* 4 bytes */ 108 109 /* 110 * Size of information register whose location is obtained 111 * from ACXREG_INFO_REG_OFFSET IO register 112 */ 113 #define ACX_INFO_REG_SIZE 4 /* 4 bytes */ 114 115 /* 116 * Offset of EEPROM variables 117 */ 118 #define ACX_EE_VERSION_OFS 0x05 119 120 /* 121 * Possible values for various IO registers 122 */ 123 124 /* ACXREG_SOFT_RESET */ 125 #define ACXRV_SOFT_RESET 0x1 126 127 /* ACXREG_FWMEM_START */ 128 #define ACXRV_FWMEM_START_OP 0x0 129 130 /* ACXREG_FWMEM_CTRL */ 131 #define ACXRV_FWMEM_ADDR_AUTOINC 0x10000 132 133 /* ACXREG_EVENT_MASK */ 134 #define ACXRV_EVENT_DISABLE 0x8000 /* XXX What's this?? */ 135 136 /* ACXREG_INTR_TRIG */ 137 #define ACXRV_TRIG_CMD_FINI 0x0001 138 #define ACXRV_TRIG_TX_FINI 0x0004 139 140 /* ACXREG_INTR_MASK */ 141 #define ACXRV_INTR_RX_DATA 0x0001 142 #define ACXRV_INTR_TX_FINI 0x0002 143 #define ACXRV_INTR_TX_XFER 0x0004 144 #define ACXRV_INTR_RX_FINI 0x0008 145 #define ACXRV_INTR_DTIM 0x0010 146 #define ACXRV_INTR_BEACON 0x0020 147 #define ACXRV_INTR_TIMER 0x0040 148 #define ACXRV_INTR_KEY_MISS 0x0080 149 #define ACXRV_INTR_WEP_FAIL 0x0100 150 #define ACXRV_INTR_CMD_FINI 0x0200 151 #define ACXRV_INTR_INFO 0x0400 152 #define ACXRV_INTR_OVERFLOW 0x0800 /* XXX */ 153 #define ACXRV_INTR_PROC_ERR 0x1000 /* XXX */ 154 #define ACXRV_INTR_SCAN_FINI 0x2000 155 #define ACXRV_INTR_FCS_THRESH 0x4000 /* XXX */ 156 #define ACXRV_INTR_UNKN 0x8000 157 #define ACXRV_INTR_ALL 0xffff 158 159 /* ACXREG_EEPROM_INIT */ 160 #define ACXRV_EEPROM_INIT 0x1 161 162 /* ACXREG_EEPROM_CTRL */ 163 #define ACXRV_EEPROM_READ 0x2 164 165 /* ACXREG_PHY_CTRL */ 166 #define ACXRV_PHY_WRITE 0x1 167 #define ACXRV_PHY_READ 0x2 168 169 /* ACXREG_PHY_ADDR */ 170 #define ACXRV_PHYREG_TXPOWER 0x11 /* axc100 */ 171 #define ACXRV_PHYREG_SENSITIVITY 0x30 172 173 /* ACXREG_ECPU_CTRL */ 174 #define ACXRV_ECPU_HALT 0x1 175 #define ACXRV_ECPU_START 0x0 176 177 /* Commands */ 178 #define ACXCMD_GET_CONF 0x01 179 #define ACXCMD_SET_CONF 0x02 180 #define ACXCMD_ENABLE_RXCHAN 0x03 181 #define ACXCMD_ENABLE_TXCHAN 0x04 182 #define ACXCMD_TMPLT_TIM 0x0a 183 #define ACXCMD_JOIN_BSS 0x0b 184 #define ACXCMD_WEP_MGMT 0x0c /* acx111 */ 185 #define ACXCMD_SLEEP 0x0f 186 #define ACXCMD_WAKEUP 0x10 187 #define ACXCMD_INIT_MEM 0x12 /* acx100 */ 188 #define ACXCMD_TMPLT_BEACON 0x13 189 #define ACXCMD_TMPLT_PROBE_RESP 0x14 190 #define ACXCMD_TMPLT_NULL_DATA 0x15 191 #define ACXCMD_TMPLT_PROBE_REQ 0x16 192 #define ACXCMD_INIT_RADIO 0x18 193 194 #if 0 195 /* 196 * acx111 does not agree with acx100 about 197 * the meaning of following values. So they 198 * are put into chip specific files. 199 */ 200 #define ACX_CONF_FW_RING 0x0003 201 #define ACX_CONF_MEMOPT 0x0005 202 #endif 203 #define ACX_CONF_MEMBLK_SIZE 0x0004 /* acx100 */ 204 #define ACX_CONF_RATE_FALLBACK 0x0006 205 #define ACX_CONF_WEPOPT 0x0007 /* acx100 */ 206 #define ACX_CONF_MMAP 0x0008 207 #define ACX_CONF_FWREV 0x000d 208 #define ACX_CONF_RXOPT 0x0010 209 #define ACX_CONF_OPTION 0x0015 /* acx111 */ 210 #define ACX_CONF_EADDR 0x1001 211 #define ACX_CONF_NRETRY_SHORT 0x1005 212 #define ACX_CONF_NRETRY_LONG 0x1006 213 #define ACX_CONF_WEPKEY 0x1007 /* acx100 */ 214 #define ACX_CONF_MSDU_LIFETIME 0x1008 215 #define ACX_CONF_REGDOM 0x100a 216 #define ACX_CONF_ANTENNA 0x100b 217 #define ACX_CONF_TXPOWER 0x100d /* acx111 */ 218 #define ACX_CONF_CCA_MODE 0x100e 219 #define ACX_CONF_ED_THRESH 0x100f 220 #define ACX_CONF_WEP_TXKEY 0x1010 221 222 /* 223 * NOTE: 224 * Following structs' fields are little endian 225 */ 226 227 struct acx_conf { 228 uint16_t conf_id; /* see ACXCONF_ (_acxcmd.h) */ 229 uint16_t conf_data_len; 230 } __packed; 231 232 struct acx_conf_mmap { 233 struct acx_conf confcom; 234 uint32_t code_start; 235 uint32_t code_end; 236 uint32_t wep_cache_start; 237 uint32_t wep_cache_end; 238 uint32_t pkt_tmplt_start; 239 uint32_t pkt_tmplt_end; 240 uint32_t fw_desc_start; 241 uint32_t fw_desc_end; 242 uint32_t memblk_start; 243 uint32_t memblk_end; 244 } __packed; 245 246 struct acx_conf_wepopt { 247 struct acx_conf confcom; 248 uint16_t nkey; 249 uint8_t opt; /* see WEPOPT_ */ 250 } __packed; 251 252 #define WEPOPT_HDWEP 0 /* hardware WEP */ 253 254 struct acx_conf_eaddr { 255 struct acx_conf confcom; 256 uint8_t eaddr[IEEE80211_ADDR_LEN]; 257 } __packed; 258 259 struct acx_conf_regdom { 260 struct acx_conf confcom; 261 uint8_t regdom; 262 uint8_t unknown; 263 } __packed; 264 265 struct acx_conf_antenna { 266 struct acx_conf confcom; 267 uint8_t antenna; 268 } __packed; 269 270 struct acx_conf_fwrev { 271 struct acx_conf confcom; 272 #define ACX_FWREV_LEN 20 273 /* 274 * "Rev xx.xx.xx.xx" 275 * '\0' terminated 276 */ 277 char fw_rev[ACX_FWREV_LEN]; 278 uint32_t hw_id; 279 } __packed; 280 281 struct acx_conf_nretry_long { 282 struct acx_conf confcom; 283 uint8_t nretry; 284 } __packed; 285 286 struct acx_conf_nretry_short { 287 struct acx_conf confcom; 288 uint8_t nretry; 289 } __packed; 290 291 struct acx_conf_msdu_lifetime { 292 struct acx_conf confcom; 293 uint32_t lifetime; 294 } __packed; 295 296 struct acx_conf_rate_fallback { 297 struct acx_conf confcom; 298 uint8_t ratefb_enable; /* 0/1 */ 299 } __packed; 300 301 struct acx_conf_rxopt { 302 struct acx_conf confcom; 303 uint16_t opt1; /* see RXOPT1_ */ 304 uint16_t opt2; /* see RXOPT2_ */ 305 } __packed; 306 307 #define RXOPT1_INCL_RXBUF_HDR 0x2000 /* rxbuf with acx_rxbuf_hdr */ 308 #define RXOPT1_RECV_SSID 0x0400 /* recv frame for joined SSID */ 309 #define RXOPT1_FILT_BCAST 0x0200 /* filt broadcast pkt */ 310 #define RXOPT1_RECV_MCAST1 0x0100 /* recv pkt for multicast addr1 */ 311 #define RXOPT1_RECV_MCAST0 0x0080 /* recv pkt for multicast addr0 */ 312 #define RXOPT1_FILT_ALLMULTI 0x0040 /* filt allmulti pkt */ 313 #define RXOPT1_FILT_FSSID 0x0020 /* filt frame for foreign SSID */ 314 #define RXOPT1_FILT_FDEST 0x0010 /* filt frame for foreign dest addr */ 315 #define RXOPT1_PROMISC 0x0008 /* promisc mode */ 316 #define RXOPT1_INCL_FCS 0x0004 317 #define RXOPT1_INCL_PHYHDR 0x0000 /* XXX 0x0002 */ 318 319 #define RXOPT2_RECV_ASSOC_REQ 0x0800 320 #define RXOPT2_RECV_AUTH 0x0400 321 #define RXOPT2_RECV_BEACON 0x0200 322 #define RXOPT2_RECV_CF 0x0100 323 #define RXOPT2_RECV_CTRL 0x0080 324 #define RXOPT2_RECV_DATA 0x0040 325 #define RXOPT2_RECV_BROKEN 0x0020 /* broken frame */ 326 #define RXOPT2_RECV_MGMT 0x0010 327 #define RXOPT2_RECV_PROBE_REQ 0x0008 328 #define RXOPT2_RECV_PROBE_RESP 0x0004 329 #define RXOPT2_RECV_ACK 0x0002 /* RTS/CTS/ACK */ 330 #define RXOPT2_RECV_OTHER 0x0001 331 332 struct acx_conf_wep_txkey { 333 struct acx_conf confcom; 334 uint8_t wep_txkey; 335 } __packed; 336 337 338 struct acx_tmplt_null_data { 339 uint16_t size; 340 struct ieee80211_frame data; 341 } __packed; 342 343 struct acx_tmplt_probe_req { 344 uint16_t size; 345 union { 346 struct { 347 struct ieee80211_frame f; 348 uint8_t var[1]; 349 } __packed u_data; 350 uint8_t u_mem[0x44]; 351 } data; 352 } __packed; 353 354 #define ACX_TMPLT_PROBE_REQ_SIZ(var_len) \ 355 (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + (var_len)) 356 357 struct acx_tmplt_probe_resp { 358 uint16_t size; 359 union { 360 struct { 361 struct ieee80211_frame f; 362 uint8_t time_stamp[8]; 363 uint16_t beacon_intvl; 364 uint16_t cap; 365 uint8_t var[1]; 366 } __packed u_data; 367 uint8_t u_mem[0x54]; 368 } data; 369 } __packed; 370 371 #define ACX_TMPLT_PROBE_RESP_SIZ(var_len) \ 372 (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + \ 373 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len)) 374 375 /* XXX same as acx_tmplt_probe_resp */ 376 struct acx_tmplt_beacon { 377 uint16_t size; 378 union { 379 struct { 380 struct ieee80211_frame f; 381 uint8_t time_stamp[8]; 382 uint16_t beacon_intvl; 383 uint16_t cap; 384 uint8_t var[1]; 385 } __packed u_data; 386 uint8_t u_mem[0x54]; 387 } data; 388 } __packed; 389 390 /* XXX C&P of ACX_TMPLT_PROVE_RESP_SIZ() */ 391 #define ACX_TMPLT_BEACON_SIZ(var_len) \ 392 (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + \ 393 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len)) 394 395 /* XXX do NOT belong here */ 396 struct tim_head { 397 uint8_t eid; 398 uint8_t len; 399 uint8_t dtim_count; 400 uint8_t dtim_period; 401 uint8_t bitmap_ctrl; 402 } __packed; 403 404 /* For tim_head.len (tim_head - eid - len + bitmap) */ 405 #define ACX_TIM_LEN(bitmap_len) \ 406 (sizeof(struct tim_head) - (2 * sizeof(uint8_t)) + (bitmap_len)) 407 #define ACX_TIM_BITMAP_LEN 1 408 409 struct acx_tmplt_tim { 410 uint16_t size; 411 union { 412 struct { 413 struct tim_head th; 414 uint8_t bitmap[1]; 415 } __packed u_data; 416 uint8_t u_mem[0x100]; 417 } data; 418 #define tim_eid data.u_data.th.eid 419 #define tim_len data.u_data.th.len 420 #define tim_dtim_count data.u_data.th.dtim_count 421 #define tim_dtim_period data.u_data.th.dtim_period 422 #define tim_bitmap_ctrl data.u_data.th.bitmap_ctrl 423 #define tim_bitmap data.u_data.bitmap 424 } __packed; 425 426 #define ACX_TMPLT_TIM_SIZ(bitmap_len) \ 427 (sizeof(uint16_t) + sizeof(struct tim_head) + (bitmap_len)) 428 429 #define CMDPRM_WRITE_REGION_1(sc, r, rlen) \ 430 bus_space_write_region_1((sc)->sc_mem2_bt, \ 431 (sc)->sc_mem2_bh, \ 432 (sc)->sc_cmd_param, \ 433 (const uint8_t *)(r), (rlen)) 434 435 #define CMDPRM_READ_REGION_1(sc, r, rlen) \ 436 bus_space_read_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 437 (sc)->sc_cmd_param, (uint8_t *)(r), (rlen)) 438 439 /* 440 * This will clear previous command's 441 * execution status too 442 */ 443 #define CMD_WRITE_4(sc, val) \ 444 bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \ 445 (sc)->sc_cmd, (val)) 446 #define CMD_READ_4(sc) \ 447 bus_space_read_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (sc)->sc_cmd) 448 449 /* 450 * acx command register layerout: 451 * upper 16bits are command execution status 452 * lower 16bits are command to be executed 453 */ 454 #define ACX_CMD_STATUS_SHIFT 16 455 #define ACX_CMD_STATUS_OK 1 456 457 struct radio_init { 458 uint32_t radio_ofs; /* radio firmware offset */ 459 uint32_t radio_len; /* radio firmware length */ 460 } __packed; 461 462 struct bss_join_hdr { 463 uint8_t bssid[IEEE80211_ADDR_LEN]; 464 uint16_t beacon_intvl; 465 uint8_t chip_spec[3]; 466 uint8_t ndata_txrate; /* see ACX_NDATA_TXRATE_ */ 467 uint8_t ndata_txopt; /* see ACX_NDATA_TXOPT_ */ 468 uint8_t mode; /* see ACX_MODE_ */ 469 uint8_t channel; 470 uint8_t esslen; 471 char essid[1]; 472 } __packed; 473 474 /* 475 * non-data frame tx rate 476 */ 477 #define ACX_NDATA_TXRATE_1 10 /* 1Mbits/s */ 478 #define ACX_NDATA_TXRATE_2 20 /* 2Mbits/s */ 479 480 /* 481 * non-data frame tx options 482 */ 483 #define ACX_NDATA_TXOPT_PBCC 0x40 484 #define ACX_NDATA_TXOPT_OFDM 0x20 485 #define ACX_NDATA_TXOPT_SHORT_PREAMBLE 0x10 486 487 #define BSS_JOIN_BUFLEN \ 488 (sizeof(struct bss_join_hdr) + IEEE80211_NWID_LEN - 1) 489 #define BSS_JOIN_PARAM_SIZE(bj) \ 490 (sizeof(struct bss_join_hdr) + (bj)->esslen - 1) 491 492 493 #define PCIR_BAR(x) (PCI_MAPS + (x) * 4) 494 495 #endif /* !_ACXREG_H */ 496