[BACK]Return to if_wpireg.h CVS log [TXT][DIR] Up to [local] / sys / dev / pci

Annotation of sys/dev/pci/if_wpireg.h, Revision 1.1.1.1

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

CVSweb