Annotation of sys/dev/pci/if_iwireg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: if_iwireg.h,v 1.25 2006/08/19 11:07:45 damien Exp $ */
! 2:
! 3: /*-
! 4: * Copyright (c) 2004-2006
! 5: * Damien Bergamini <damien.bergamini@free.fr>. All rights reserved.
! 6: *
! 7: * Redistribution and use in source and binary forms, with or without
! 8: * modification, are permitted provided that the following conditions
! 9: * are met:
! 10: * 1. Redistributions of source code must retain the above copyright
! 11: * notice unmodified, this list of conditions, and the following
! 12: * disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: *
! 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 18: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 19: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 20: * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
! 21: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 22: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 23: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 24: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 25: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 27: * SUCH DAMAGE.
! 28: */
! 29:
! 30: #define IWI_CMD_RING_COUNT 16
! 31: #define IWI_TX_RING_COUNT 64
! 32: #define IWI_RX_RING_COUNT 32
! 33:
! 34: #define IWI_CSR_INTR 0x0008
! 35: #define IWI_CSR_INTR_MASK 0x000c
! 36: #define IWI_CSR_INDIRECT_ADDR 0x0010
! 37: #define IWI_CSR_INDIRECT_DATA 0x0014
! 38: #define IWI_CSR_AUTOINC_ADDR 0x0018
! 39: #define IWI_CSR_AUTOINC_DATA 0x001c
! 40: #define IWI_CSR_RST 0x0020
! 41: #define IWI_CSR_CTL 0x0024
! 42: #define IWI_CSR_IO 0x0030
! 43: #define IWI_CSR_CMD_BASE 0x0200
! 44: #define IWI_CSR_CMD_SIZE 0x0204
! 45: #define IWI_CSR_TX1_BASE 0x0208
! 46: #define IWI_CSR_TX1_SIZE 0x020c
! 47: #define IWI_CSR_TX2_BASE 0x0210
! 48: #define IWI_CSR_TX2_SIZE 0x0214
! 49: #define IWI_CSR_TX3_BASE 0x0218
! 50: #define IWI_CSR_TX3_SIZE 0x021c
! 51: #define IWI_CSR_TX4_BASE 0x0220
! 52: #define IWI_CSR_TX4_SIZE 0x0224
! 53: #define IWI_CSR_CMD_RIDX 0x0280
! 54: #define IWI_CSR_TX1_RIDX 0x0284
! 55: #define IWI_CSR_TX2_RIDX 0x0288
! 56: #define IWI_CSR_TX3_RIDX 0x028c
! 57: #define IWI_CSR_TX4_RIDX 0x0290
! 58: #define IWI_CSR_RX_RIDX 0x02a0
! 59: #define IWI_CSR_RX_BASE 0x0500
! 60: #define IWI_CSR_TABLE0_SIZE 0x0700
! 61: #define IWI_CSR_TABLE0_BASE 0x0704
! 62: #define IWI_CSR_NODE_BASE 0x0c0c
! 63: #define IWI_CSR_CMD_WIDX 0x0f80
! 64: #define IWI_CSR_TX1_WIDX 0x0f84
! 65: #define IWI_CSR_TX2_WIDX 0x0f88
! 66: #define IWI_CSR_TX3_WIDX 0x0f8c
! 67: #define IWI_CSR_TX4_WIDX 0x0f90
! 68: #define IWI_CSR_RX_WIDX 0x0fa0
! 69: #define IWI_CSR_READ_INT 0x0ff4
! 70:
! 71: /* aliases */
! 72: #define IWI_CSR_CURRENT_TX_RATE IWI_CSR_TABLE0_BASE
! 73:
! 74: /* possible flags for IWI_CSR_INTR */
! 75: #define IWI_INTR_RX_DONE 0x00000002
! 76: #define IWI_INTR_CMD_DONE 0x00000800
! 77: #define IWI_INTR_TX1_DONE 0x00001000
! 78: #define IWI_INTR_TX2_DONE 0x00002000
! 79: #define IWI_INTR_TX3_DONE 0x00004000
! 80: #define IWI_INTR_TX4_DONE 0x00008000
! 81: #define IWI_INTR_FW_INITED 0x01000000
! 82: #define IWI_INTR_RADIO_OFF 0x04000000
! 83: #define IWI_INTR_FATAL_ERROR 0x40000000
! 84: #define IWI_INTR_PARITY_ERROR 0x80000000
! 85:
! 86: #define IWI_INTR_MASK \
! 87: (IWI_INTR_RX_DONE | IWI_INTR_CMD_DONE | IWI_INTR_TX1_DONE | \
! 88: IWI_INTR_TX2_DONE | IWI_INTR_TX3_DONE | IWI_INTR_TX4_DONE | \
! 89: IWI_INTR_FW_INITED | IWI_INTR_RADIO_OFF | \
! 90: IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)
! 91:
! 92: /* possible flags for register IWI_CSR_RST */
! 93: #define IWI_RST_PRINCETON_RESET 0x00000001
! 94: #define IWI_RST_SW_RESET 0x00000080
! 95: #define IWI_RST_MASTER_DISABLED 0x00000100
! 96: #define IWI_RST_STOP_MASTER 0x00000200
! 97:
! 98: /* possible flags for register IWI_CSR_CTL */
! 99: #define IWI_CTL_CLOCK_READY 0x00000001
! 100: #define IWI_CTL_ALLOW_STANDBY 0x00000002
! 101: #define IWI_CTL_INIT 0x00000004
! 102:
! 103: /* possible flags for register IWI_CSR_IO */
! 104: #define IWI_IO_RADIO_ENABLED 0x00010000
! 105:
! 106: /* possible flags for IWI_CSR_READ_INT */
! 107: #define IWI_READ_INT_INIT_HOST 0x20000000
! 108:
! 109: /* constants for command blocks */
! 110: #define IWI_CB_DEFAULT_CTL 0x8cea0000
! 111: #define IWI_CB_MAXDATALEN 8191
! 112:
! 113: /* firmware binary image header */
! 114: struct iwi_firmware_hdr {
! 115: uint8_t oldvermaj;
! 116: uint8_t oldvermin;
! 117: uint8_t vermaj;
! 118: uint8_t vermin;
! 119: uint32_t bootsz;
! 120: uint32_t ucodesz;
! 121: uint32_t mainsz;
! 122: } __packed;
! 123:
! 124: struct iwi_hdr {
! 125: uint8_t type;
! 126: #define IWI_HDR_TYPE_DATA 0
! 127: #define IWI_HDR_TYPE_COMMAND 1
! 128: #define IWI_HDR_TYPE_NOTIF 3
! 129: #define IWI_HDR_TYPE_FRAME 9
! 130:
! 131: uint8_t seq;
! 132: uint8_t flags;
! 133: #define IWI_HDR_FLAG_IRQ 0x04
! 134:
! 135: uint8_t reserved;
! 136: } __packed;
! 137:
! 138: struct iwi_notif {
! 139: uint32_t reserved[2];
! 140: uint8_t type;
! 141: #define IWI_NOTIF_TYPE_ASSOCIATION 10
! 142: #define IWI_NOTIF_TYPE_AUTHENTICATION 11
! 143: #define IWI_NOTIF_TYPE_SCAN_CHANNEL 12
! 144: #define IWI_NOTIF_TYPE_SCAN_COMPLETE 13
! 145: #define IWI_NOTIF_TYPE_BAD_LINK 15
! 146: #define IWI_NOTIF_TYPE_BEACON 17
! 147: #define IWI_NOTIF_TYPE_CALIBRATION 20
! 148: #define IWI_NOTIF_TYPE_NOISE 25
! 149:
! 150: uint8_t flags;
! 151: uint16_t len;
! 152: } __packed;
! 153:
! 154: /* structure for notification IWI_NOTIF_TYPE_AUTHENTICATION */
! 155: struct iwi_notif_authentication {
! 156: uint8_t state;
! 157: #define IWI_DEAUTHENTICATED 0
! 158: #define IWI_AUTHENTICATED 9
! 159: } __packed;
! 160:
! 161: /* structure for notification IWI_NOTIF_TYPE_ASSOCIATION */
! 162: struct iwi_notif_association {
! 163: uint8_t state;
! 164: #define IWI_DEASSOCIATED 0
! 165: #define IWI_ASSOCIATED 12
! 166:
! 167: struct ieee80211_frame frame;
! 168: uint16_t capinfo;
! 169: uint16_t status;
! 170: uint16_t associd;
! 171: } __packed;
! 172:
! 173: /* structure for notification IWI_NOTIF_TYPE_SCAN_CHANNEL */
! 174: struct iwi_notif_scan_channel {
! 175: uint8_t nchan;
! 176: uint8_t reserved[47];
! 177: } __packed;
! 178:
! 179: /* structure for notification IWI_NOTIF_TYPE_SCAN_COMPLETE */
! 180: struct iwi_notif_scan_complete {
! 181: uint8_t type;
! 182: uint8_t nchan;
! 183: uint8_t status;
! 184: uint8_t reserved;
! 185: } __packed;
! 186:
! 187: /* structure for notification IWI_NOTIF_TYPE_BEACON */
! 188: struct iwi_notif_beacon {
! 189: uint32_t status;
! 190: #define IWI_BEACON_MISSED 1
! 191:
! 192: uint32_t count;
! 193: };
! 194:
! 195: /* received frame header */
! 196: struct iwi_frame {
! 197: uint32_t reserved1[2];
! 198: uint8_t chan;
! 199: uint8_t status;
! 200: uint8_t rate;
! 201: uint8_t rssi; /* receiver signal strength indicator */
! 202: uint8_t agc; /* automatic gain control */
! 203: uint8_t rssi_dbm;
! 204: uint16_t signal;
! 205: uint16_t noise;
! 206: uint8_t antenna;
! 207: uint8_t control;
! 208: uint8_t reserved2[2];
! 209: uint16_t len;
! 210: } __packed;
! 211:
! 212: /* header for transmission */
! 213: struct iwi_tx_desc {
! 214: struct iwi_hdr hdr;
! 215: uint32_t reserved1;
! 216: uint8_t station;
! 217: uint8_t reserved2[3];
! 218: uint8_t cmd;
! 219: #define IWI_DATA_CMD_TX 0x0b
! 220:
! 221: uint8_t seq;
! 222: uint16_t len;
! 223: uint8_t priority;
! 224: uint8_t flags;
! 225: #define IWI_DATA_FLAG_SHPREAMBLE (1 << 2)
! 226: #define IWI_DATA_FLAG_NO_WEP (1 << 5)
! 227: #define IWI_DATA_FLAG_NEED_ACK (1 << 7)
! 228:
! 229: uint8_t xflags;
! 230: #define IWI_DATA_XFLAG_CCK (1 << 0)
! 231:
! 232: uint8_t wep_txkey;
! 233: #define IWI_DATA_KEY_WEP40 (1 << 6)
! 234: #define IWI_DATA_KEY_WEP104 (1 << 7)
! 235:
! 236: uint8_t wepkey[IEEE80211_KEYBUF_SIZE];
! 237: uint8_t rate;
! 238: uint8_t antenna;
! 239: uint8_t reserved3[10];
! 240:
! 241: struct ieee80211_qosframe_addr4 wh;
! 242: uint32_t iv[2];
! 243:
! 244: uint32_t nseg;
! 245: #define IWI_MAX_NSEG 6
! 246: #define IWI_MAX_SCATTER (IWI_MAX_NSEG - 2)
! 247:
! 248: uint32_t seg_addr[IWI_MAX_NSEG];
! 249: uint16_t seg_len[IWI_MAX_NSEG];
! 250: } __packed;
! 251:
! 252: /* command */
! 253: struct iwi_cmd_desc {
! 254: struct iwi_hdr hdr;
! 255: uint8_t type;
! 256: #define IWI_CMD_ENABLE 2
! 257: #define IWI_CMD_SET_CONFIG 6
! 258: #define IWI_CMD_SET_ESSID 8
! 259: #define IWI_CMD_SET_MAC_ADDRESS 11
! 260: #define IWI_CMD_SET_RTS_THRESHOLD 15
! 261: #define IWI_CMD_SET_FRAG_THRESHOLD 16
! 262: #define IWI_CMD_SET_POWER_MODE 17
! 263: #define IWI_CMD_SET_WEP_KEY 18
! 264: #define IWI_CMD_ASSOCIATE 21
! 265: #define IWI_CMD_SET_RATES 22
! 266: #define IWI_CMD_SCAN 26
! 267: #define IWI_CMD_DISABLE 33
! 268: #define IWI_CMD_SET_IV 34
! 269: #define IWI_CMD_SET_TX_POWER 35
! 270: #define IWI_CMD_SET_SENSITIVITY 42
! 271:
! 272: uint8_t len;
! 273: uint16_t reserved;
! 274: uint8_t data[120];
! 275: } __packed;
! 276:
! 277: /* node information (IBSS) */
! 278: struct iwi_node {
! 279: uint8_t bssid[IEEE80211_ADDR_LEN];
! 280: uint8_t reserved[2];
! 281: } __packed;
! 282:
! 283: /* constants for 'mode' fields */
! 284: #define IWI_MODE_11A 0
! 285: #define IWI_MODE_11B 1
! 286: #define IWI_MODE_11G 2
! 287:
! 288: /* possible values for command IWI_CMD_SET_POWER_MODE */
! 289: #define IWI_POWER_MODE_CAM 0
! 290:
! 291: /* structure for command IWI_CMD_SET_RATES */
! 292: struct iwi_rateset {
! 293: uint8_t mode;
! 294: uint8_t nrates;
! 295: uint8_t type;
! 296: #define IWI_RATESET_TYPE_NEGOTIATED 0
! 297: #define IWI_RATESET_TYPE_SUPPORTED 1
! 298:
! 299: uint8_t reserved;
! 300: uint8_t rates[12];
! 301: } __packed;
! 302:
! 303: /* structure for command IWI_CMD_SET_TX_POWER */
! 304: struct iwi_txpower {
! 305: uint8_t nchan;
! 306: uint8_t mode;
! 307: struct {
! 308: uint8_t chan;
! 309: uint8_t power;
! 310: #define IWI_TXPOWER_MAX 20
! 311: #define IWI_TXPOWER_RATIO (IEEE80211_TXPOWER_MAX / IWI_TXPOWER_MAX)
! 312: } __packed chan[37];
! 313: } __packed;
! 314:
! 315: /* structure for command IWI_CMD_ASSOCIATE */
! 316: struct iwi_associate {
! 317: uint8_t chan;
! 318: uint8_t auth;
! 319: #define IWI_AUTH_OPEN 0
! 320: #define IWI_AUTH_SHARED 1
! 321: #define IWI_AUTH_NONE 3
! 322:
! 323: uint8_t type;
! 324: #define IWI_ASSOC_ASSOCIATE 0
! 325: #define IWI_ASSOC_REASSOCIATE 1
! 326: #define IWI_ASSOC_DISASSOCIATE 2
! 327: #define IWI_ASSOC_SIBSS 3
! 328:
! 329: uint8_t reserved1;
! 330: uint16_t reserved2;
! 331: uint8_t plen;
! 332: #define IWI_ASSOC_SHPREAMBLE (1 << 2)
! 333:
! 334: uint8_t mode;
! 335: uint8_t bssid[IEEE80211_ADDR_LEN];
! 336: uint8_t tstamp[8];
! 337: uint16_t capinfo;
! 338: uint16_t lintval;
! 339: uint16_t intval;
! 340: uint8_t dst[IEEE80211_ADDR_LEN];
! 341: uint32_t reserved3;
! 342: uint16_t reserved4;
! 343: } __packed;
! 344:
! 345: /* structure for command IWI_CMD_SCAN */
! 346: struct iwi_scan {
! 347: uint32_t index;
! 348: uint8_t channels[54];
! 349: #define IWI_CHAN_5GHZ (0 << 6)
! 350: #define IWI_CHAN_2GHZ (1 << 6)
! 351:
! 352: uint8_t type[27];
! 353: #define IWI_SCAN_TYPE_PASSIVE 0x11
! 354: #define IWI_SCAN_TYPE_DIRECTED 0x22
! 355: #define IWI_SCAN_TYPE_BROADCAST 0x33
! 356: #define IWI_SCAN_TYPE_BDIRECTED 0x44
! 357:
! 358: uint8_t reserved1;
! 359: uint16_t reserved2;
! 360: uint16_t passive; /* dwell time */
! 361: uint16_t directed; /* dwell time */
! 362: uint16_t broadcast; /* dwell time */
! 363: uint16_t bdirected; /* dwell time */
! 364: } __packed;
! 365:
! 366: /* structure for command IWI_CMD_SET_CONFIGURATION */
! 367: struct iwi_configuration {
! 368: uint8_t bluetooth_coexistence;
! 369: uint8_t reserved1;
! 370: uint8_t answer_pbreq;
! 371: uint8_t allow_invalid_frames;
! 372: uint8_t multicast_enabled;
! 373: uint8_t exclude_unicast_unencrypted;
! 374: uint8_t disable_unicast_decryption;
! 375: uint8_t exclude_multicast_unencrypted;
! 376: uint8_t disable_multicast_decryption;
! 377: uint8_t antenna;
! 378: uint8_t reserved2;
! 379: uint8_t bg_autodetection;
! 380: uint8_t reserved3;
! 381: uint8_t enable_multicast_filtering;
! 382: uint8_t bluetooth_threshold;
! 383: uint8_t silence_threshold;
! 384: uint8_t allow_beacon_and_probe_resp;
! 385: uint8_t allow_mgt;
! 386: uint8_t report_noise;
! 387: uint8_t reserved5;
! 388: } __packed;
! 389:
! 390: /* structure for command IWI_CMD_SET_WEP_KEY */
! 391: struct iwi_wep_key {
! 392: uint8_t cmd;
! 393: #define IWI_WEP_KEY_CMD_SETKEY 0x08
! 394:
! 395: uint8_t seq;
! 396: uint8_t idx;
! 397: uint8_t len;
! 398: uint8_t key[IEEE80211_KEYBUF_SIZE];
! 399: } __packed;
! 400:
! 401: #define IWI_MEM_EEPROM_CTL 0x00300040
! 402: #define IWI_MEM_EVENT_CTL 0x00300004
! 403:
! 404: /* possible flags for register IWI_MEM_EVENT */
! 405: #define IWI_LED_ASSOC (1 << 5)
! 406: #define IWI_LED_MASK 0xd9fffffb
! 407:
! 408: /* EEPROM = Electrically Erasable Programmable Read-Only Memory */
! 409:
! 410: #define IWI_EEPROM_MAC 0x21
! 411:
! 412: #define IWI_EEPROM_DELAY 1 /* minimum hold time (microsecond) */
! 413:
! 414: #define IWI_EEPROM_C (1 << 0) /* Serial Clock */
! 415: #define IWI_EEPROM_S (1 << 1) /* Chip Select */
! 416: #define IWI_EEPROM_D (1 << 2) /* Serial data input */
! 417: #define IWI_EEPROM_Q (1 << 4) /* Serial data output */
! 418:
! 419: #define IWI_EEPROM_SHIFT_D 2
! 420: #define IWI_EEPROM_SHIFT_Q 4
! 421:
! 422: /*
! 423: * control and status registers access macros
! 424: */
! 425: #define CSR_READ_1(sc, reg) \
! 426: bus_space_read_1((sc)->sc_st, (sc)->sc_sh, (reg))
! 427:
! 428: #define CSR_READ_2(sc, reg) \
! 429: bus_space_read_2((sc)->sc_st, (sc)->sc_sh, (reg))
! 430:
! 431: #define CSR_READ_4(sc, reg) \
! 432: bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (reg))
! 433:
! 434: #define CSR_READ_REGION_4(sc, offset, datap, count) \
! 435: bus_space_read_region_4((sc)->sc_st, (sc)->sc_sh, (offset), \
! 436: (datap), (count))
! 437:
! 438: #define CSR_WRITE_1(sc, reg, val) \
! 439: bus_space_write_1((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 440:
! 441: #define CSR_WRITE_2(sc, reg, val) \
! 442: bus_space_write_2((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 443:
! 444: #define CSR_WRITE_4(sc, reg, val) \
! 445: bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (reg), (val))
! 446:
! 447: #define CSR_WRITE_REGION_1(sc, offset, datap, count) \
! 448: bus_space_write_region_1((sc)->sc_st, (sc)->sc_sh, (offset), \
! 449: (datap), (count))
! 450: /*
! 451: * indirect memory space access macros
! 452: */
! 453: #define MEM_WRITE_1(sc, addr, val) do { \
! 454: CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr)); \
! 455: CSR_WRITE_1((sc), IWI_CSR_INDIRECT_DATA, (val)); \
! 456: } while (/* CONSTCOND */0)
! 457:
! 458: #define MEM_WRITE_2(sc, addr, val) do { \
! 459: CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr)); \
! 460: CSR_WRITE_2((sc), IWI_CSR_INDIRECT_DATA, (val)); \
! 461: } while (/* CONSTCOND */0)
! 462:
! 463: #define MEM_WRITE_4(sc, addr, val) do { \
! 464: CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr)); \
! 465: CSR_WRITE_4((sc), IWI_CSR_INDIRECT_DATA, (val)); \
! 466: } while (/* CONSTCOND */0)
! 467:
! 468: #define MEM_WRITE_MULTI_1(sc, addr, buf, len) do { \
! 469: CSR_WRITE_4((sc), IWI_CSR_INDIRECT_ADDR, (addr)); \
! 470: CSR_WRITE_MULTI_1((sc), IWI_CSR_INDIRECT_DATA, (buf), (len)); \
! 471: } while (/* CONSTCOND */0)
! 472:
! 473: /*
! 474: * EEPROM access macro
! 475: */
! 476: #define IWI_EEPROM_CTL(sc, val) do { \
! 477: MEM_WRITE_4((sc), IWI_MEM_EEPROM_CTL, (val)); \
! 478: DELAY(IWI_EEPROM_DELAY); \
! 479: } while (/* CONSTCOND */0)
CVSweb