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

Annotation of sys/dev/ic/pgtreg.h, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: pgtreg.h,v 1.7 2006/10/11 12:10:19 claudio Exp $  */
                      2:
                      3: /*
                      4:  * Copyright (c) 2006 Claudio Jeker <claudio@openbsd.org>
                      5:  * Copyright (c) 2006 Marcus Glocker <mglocker@openbsd.org>
                      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: /*
                     21:  * Copyright (c) 2004 Fujitsu Laboratories of America, Inc.
                     22:  * Copyright (c) 2004 Brian Fundakowski Feldman
                     23:  * All rights reserved.
                     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:  * 1. Redistributions of source code must retain the above copyright
                     29:  *    notice, this list of conditions and the following disclaimer.
                     30:  * 2. Redistributions in binary form must reproduce the above copyright
                     31:  *    notice, this list of conditions and the following disclaimer in the
                     32:  *    documentation and/or other materials provided with the distribution.
                     33:  *
                     34:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     35:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     36:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     37:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     38:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     39:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     40:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     41:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     42:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     43:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     44:  * SUCH DAMAGE.
                     45:  */
                     46:
                     47: #ifndef __PGTREG_H__
                     48: #define __PGTREG_H__
                     49:
                     50: /* Sizes, delays, etc. */
                     51: #define        PGT_TX_LIST_CNT                 32
                     52: #define        PGT_RX_LIST_CNT                 8
                     53: #define        PGT_FRAG_SIZE                   1536    /* overkill for mgmt frames */
                     54: #define        PGT_DIRECT_MEMORY_OFFSET        0x1000
                     55: #define        PGT_DIRECT_MEMORY_SIZE          0x1000
                     56: #define        PGT_FIRMWARE_INTERNAL_OFFSET    0x20000
                     57: #define        PGT_WRITEIO_DELAY               10
                     58: #define        PGT_RESET_DELAY                 50000
                     59:
                     60: /* Registers */
                     61: #define PGT_REG_DEV_INT                        0x0000  /* device interrupt */
                     62: #define        PGT_DEV_INT_RESET               0x00000001
                     63: #define        PGT_DEV_INT_UPDATE              0x00000002
                     64: #define        PGT_DEV_INT_WAKEUP              0x00000008
                     65: #define        PGT_DEV_INT_SLEEP               0x00000010
                     66: #define        PGT_REG_INT_STAT                0x0010  /* interrupt status */
                     67: #define        PGT_INT_STAT_UPDATE             0x00000002
                     68: #define        PGT_INT_STAT_INIT               0x00000004
                     69: #define        PGT_INT_STAT_WAKEUP             0x00000008
                     70: #define        PGT_INT_STAT_SLEEP              0x00000010
                     71: #define        PGT_INT_STAT_UNKNOWN0           0x00004000
                     72: #define        PGT_INT_STAT_UNKNOWN1           0x80000000
                     73: #define        PGT_INT_STAT_SOURCES            0x8000401e
                     74: #define        PGT_REG_INT_ACK                 0x0014  /* interrupt acknowledgement */
                     75: #define        PGT_REG_INT_EN                  0x0018  /* interrupt enable */
                     76: #define        PGT_REG_CTRL_BLK_BASE           0x0020  /* control block address */
                     77: #define        PGT_REG_GEN_PURP_COM            0x0024
                     78: #define        PGT_REG_DIR_MEM_BASE            0x0030
                     79: #define        PGT_REG_CTRL_STAT               0x0078
                     80: #define        PGT_CTRL_STAT_SLEEPMODE         0x00000200
                     81: #define        PGT_CTRL_STAT_CLOCKRUN          0x00800000
                     82: #define        PGT_CTRL_STAT_RESET             0x10000000
                     83: #define        PGT_CTRL_STAT_RAMBOOT           0x20000000
                     84: #define        PGT_CTRL_STAT_STARTHALTED       0x40000000
                     85: #define        PGT_CTRL_STAT_HOST_OVERRIDE     0x80000000
                     86:
                     87: /*
                     88:  * The control block consists of a set of queues for low- and high-priority
                     89:  * data, and management, transmission and reception queues.  There is a
                     90:  * set of indices that gives the index (modulo queue size) of the current
                     91:  * progress in each.  Nearly all configuration is done from the management
                     92:  * queue interface.  Almost every structure is little-endian.
                     93:  */
                     94: enum pgt_queue {
                     95:        PGT_QUEUE_DATA_LOW_RX =         0,
                     96:        PGT_QUEUE_DATA_LOW_TX =         1,
                     97:        PGT_QUEUE_DATA_HIGH_RX =        2,
                     98:        PGT_QUEUE_DATA_HIGH_TX =        3,
                     99:        PGT_QUEUE_MGMT_RX =             4,
                    100:        PGT_QUEUE_MGMT_TX =             5
                    101: };
                    102:
                    103: #define        PGT_QUEUE_COUNT                 6
                    104: #define        PGT_QUEUE_DATA_RX_SIZE          8
                    105: #define        PGT_QUEUE_DATA_TX_SIZE          32
                    106: #define        PGT_QUEUE_MGMT_SIZE             4
                    107: #define        PGT_QUEUE_FULL_THRESHOLD        8
                    108:
                    109: struct pgt_frag {
                    110:        uint32_t pf_addr;               /* physical host address */
                    111:        uint16_t pf_size;
                    112:        uint16_t pf_flags;
                    113: #define        PF_FLAG_MF      0x0001          /* more frags (frame continues) */
                    114: };
                    115:
                    116: struct pgt_control_block {
                    117:        uint32_t        pcb_driver_curfrag[PGT_QUEUE_COUNT];
                    118:        uint32_t        pcb_device_curfrag[PGT_QUEUE_COUNT];
                    119:        struct pgt_frag pcb_data_low_rx[PGT_QUEUE_DATA_RX_SIZE];
                    120:        struct pgt_frag pcb_data_low_tx[PGT_QUEUE_DATA_TX_SIZE];
                    121:        struct pgt_frag pcb_data_high_rx[PGT_QUEUE_DATA_RX_SIZE];
                    122:        struct pgt_frag pcb_data_high_tx[PGT_QUEUE_DATA_TX_SIZE];
                    123:        struct pgt_frag pcb_mgmt_rx[PGT_QUEUE_MGMT_SIZE];
                    124:        struct pgt_frag pcb_mgmt_tx[PGT_QUEUE_MGMT_SIZE];
                    125:        uint32_t        pcb_padding;
                    126: };
                    127:
                    128: /*
                    129:  * Unlike the rest of the structures, this is big-endian by default.
                    130:  * The Linux driver defines a PIMFOR_ETHERTYPE as 0x8828 (why?)
                    131:  */
                    132: enum pgt_mgmt_operation {
                    133:        PMF_OP_GET =            0,
                    134:        PMF_OP_SET =            1,
                    135:        PMF_OP_RESPONSE =       2,
                    136:        PMF_OP_ERROR =          3,
                    137:        PMF_OP_TRAP =           4
                    138:        /* may be more */
                    139: };
                    140:
                    141: struct pgt_mgmt_frame {
                    142:        uint8_t         pmf_version;
                    143: #define        PMF_VER         0x01
                    144:        uint8_t         pmf_operation;
                    145:        uint32_t        pmf_oid;
                    146:        uint8_t         pmf_device;
                    147: #define PMF_DEV                0x00
                    148:        uint8_t         pmf_flags;
                    149: #define        PMF_FLAG_APP    0x01            /* application origin (?) */
                    150: #define        PMF_FLAG_LE     0x02            /* little-endian */
                    151: #define        PMF_FLAG_VALID  (PMF_FLAG_APP | PMF_FLAG_LE)
                    152:        uint32_t        pmf_size;
                    153:        /*              data[];                 */
                    154: } __packed;
                    155:
                    156: struct pgt_rx_header {
                    157:        uint16_t                pra_unknown0;   /* always 0x0000 */
                    158:        uint16_t                pra_length;     /* always 0x1400 */
                    159:        uint32_t                pra_clock;      /* 1MHz timestamp */
                    160:        uint8_t                 pra_flags;
                    161: #define        PRA_FLAG_BAD            0x01
                    162:        uint8_t                 pra_unknown1;
                    163:        uint8_t                 pra_rate;
                    164:        uint8_t                 pra_unknown2;
                    165:        uint16_t                pra_frequency;
                    166:        uint16_t                pra_unknown3;
                    167:        uint8_t                 pra_rssi;
                    168:        uint8_t                 pra_pad[3];
                    169: } __packed;
                    170:
                    171: struct pgt_rx_annex {
                    172:        uint8_t                 pra_ether_dhost[ETHER_ADDR_LEN];
                    173:        uint8_t                 pra_ether_shost[ETHER_ADDR_LEN];
                    174:        struct pgt_rx_header    pra_header;
                    175:        uint16_t                pra_ether_type;
                    176: } __packed;
                    177:
                    178: /*
                    179:  * OIDs used to communicate management information.
                    180:  */
                    181: enum pgt_oid {
                    182:        PGT_OID_MAC_ADDRESS =                           0x00000000,
                    183:        /* uint8_t ether[6]; */
                    184:        PGT_OID_LINK_STATE =                            0x00000001,
                    185:        /* uint32_t rate; (500kbps units) */
                    186:        PGT_OID_BSS_TYPE =                              0x10000000,
                    187:        /* uint32_t network; */
                    188: #define        PGT_BSS_TYPE_NONE                       0
                    189: #define        PGT_BSS_TYPE_STA                        1
                    190: #define        PGT_BSS_TYPE_IBSS                       2
                    191: #define        PGT_BSS_TYPE_ANY                        3
                    192:        PGT_OID_BSSID =                                 0x10000001,
                    193:        /* uint8_t bssid[6]; */
                    194:        PGT_OID_SSID =                                  0x10000002,
                    195:        /* struct pgt_obj_ssid; */
                    196:        PGT_OID_COUNTRY =                               0x10000005,
                    197:        /* uint32_t country; guessing until I see some foreign hardware... */
                    198: #define        PGT_COUNTRY_USA                         0
                    199:        PGT_OID_SSID_OVERRIDE =                         0x10000006,
                    200:        /* struct pgt_obj_ssid; */
                    201:        PGT_OID_AUTH_MODE =                             0x12000000,
                    202:        /* uint32_t auth; */
                    203: #define        PGT_AUTH_MODE_NONE                      0
                    204: #define        PGT_AUTH_MODE_OPEN                      1
                    205: #define        PGT_AUTH_MODE_SHARED                    2
                    206: #define        PGT_AUTH_MODE_BOTH                      3
                    207:        PGT_OID_PRIVACY_INVOKED =                       0x12000001,
                    208:        /* uint32_t privacy; */
                    209:        PGT_OID_EXCLUDE_UNENCRYPTED =                   0x12000002,
                    210:        /* uint32_t exunencrypted; */
                    211:        PGT_OID_DEFAULT_KEYNUM =                        0x12000003,
                    212:        /* uint32_t defkey; */
                    213:        PGT_OID_DEFAULT_KEY0 =                          0x12000004,
                    214:        /* struct pgt_obj_key; */
                    215:        PGT_OID_DEFAULT_KEY1 =                          0x12000005,
                    216:        /* struct pgt_obj_key; */
                    217:        PGT_OID_DEFAULT_KEY2 =                          0x12000006,
                    218:        /* struct pgt_obj_key; */
                    219:        PGT_OID_DEFAULT_KEY3 =                          0x12000007,
                    220:        /* struct pgt_obj_key; */
                    221:        PGT_OID_STA_KEY =                               0x12000008,
                    222:        PGT_OID_PSM =                                   0x14000000,
                    223:        /* uint32_t powersave; */
                    224:        PGT_OID_EAPAUTHSTA =                            0x150007de,
                    225:        /* uint8_t sta[6]; */
                    226:        PGT_OID_EAPUNAUTHSTA =                          0x150007df,
                    227:        /* uint8_t sta[6]; */
                    228:        PGT_OID_DOT1X =                                 0x150007e0,
                    229:        /* uint32_t dot1x; */
                    230: #define        PGT_DOT1X_AUTH_NONE                     0
                    231: #define        PGT_DOT1X_AUTH_ENABLED                  1
                    232: #define        PGT_DOT1X_KEYTX_ENABLED                 2
                    233:        PGT_OID_SLOT_TIME =                             0x17000000,
                    234:        /* uint32_t slottime; */
                    235:        PGT_OID_CHANNEL =                               0x17000007,
                    236:        /* uint32_t channel; */
                    237:        PGT_OID_PREAMBLE_MODE =                         0x17000009,
                    238:        /* uint32_t preamble; */
                    239: #define        PGT_OID_PREAMBLE_MODE_LONG              0
                    240: #define        PGT_OID_PREAMBLE_MODE_SHORT             1
                    241: #define        PGT_OID_PREAMBLE_MODE_DYNAMIC           2
                    242:        PGT_OID_RATES =                                 0x1700000a,
                    243:        /* uint8_t rates[]; nul terminated */
                    244:        PGT_OID_RSSI_VECTOR =                           0x1700000d,
                    245:        PGT_OID_OUTPUT_POWER_TABLE =                    0x1700000e,
                    246:        PGT_OID_OUTPUT_POWER =                          0x1700000f,
                    247:        PGT_OID_SUPPORTED_RATES =                       0x17000010,
                    248:        /* uint8_t rates[]; nul terminated */
                    249:        PGT_OID_NOISE_FLOOR =                           0x17000013,
                    250:        /* uint32_t noise; */
                    251:        PGT_OID_SLOT_MODE =                             0x17000017,
                    252:        /* uint32_t slot; */
                    253: #define        PGT_OID_SLOT_MODE_LONG                  0
                    254: #define        PGT_OID_SLOT_MODE_SHORT                 1
                    255: #define        PGT_OID_SLOT_MODE_DYNAMIC               2
                    256:        PGT_OID_EXTENDED_RATES =                        0x17000020,
                    257:        /* uint8_t rates[]; nul terminated */
                    258:        PGT_OID_FREQUENCY =                             0x17000011,
                    259:        /* uint32_t frequency; */
                    260:        PGT_OID_SUPPORTED_FREQUENCIES =                 0x17000012,
                    261:        /* struct pgt_obj_freq; */
                    262:        PGT_OID_PROFILE =                               0x17000019,
                    263:        /* uint32_t profile; */
                    264: #define        PGT_PROFILE_B_ONLY                      0
                    265: #define        PGT_PROFILE_MIXED_G_WIFI                1
                    266: #define        PGT_PROFILE_MIXED_LONG                  2
                    267: #define        PGT_PROFILE_G_ONLY                      3
                    268: #define        PGT_PROFILE_TEST                        4
                    269: #define        PGT_PROFILE_B_WIFI                      5
                    270: #define        PGT_PROFILE_A_ONLY                      6
                    271: #define        PGT_PROFILE_MIXED_SHORT                 7
                    272:        PGT_OID_DEAUTHENTICATE =                        0x18000000,
                    273:        /* struct pgt_obj_mlme; */
                    274:        PGT_OID_AUTHENTICATE =                          0x18000001,
                    275:        /* struct pgt_obj_mlme; */
                    276:        PGT_OID_DISASSOCIATE =                          0x18000002,
                    277:        /* struct pgt_obj_mlme; */
                    278:        PGT_OID_ASSOCIATE =                             0x18000003,
                    279:        /* struct pgt_obj_mlme; */
                    280:        PGT_OID_SCAN =                                  0x18000004,
                    281:        PGT_OID_BEACON =                                0x18000005,
                    282:        /* struct pgt_obj_mlmeex; */
                    283:        PGT_OID_PROBE =                                 0x18000006,
                    284:        /* struct pgt_obj_mlmeex; */
                    285:        PGT_OID_DEAUTHENTICATEEX =                      0x18000007,
                    286:        /* struct pgt_obj_mlmeex; */
                    287:        PGT_OID_AUTHENTICATEEX =                        0x18000008,
                    288:        /* struct pgt_obj_mlmeex; */
                    289:        PGT_OID_DISASSOCIATEEX =                        0x18000009,
                    290:        /* struct pgt_obj_mlmeex; */
                    291:        PGT_OID_ASSOCIATEEX =                           0x1800000a,
                    292:        /* struct pgt_obj_mlmeex; */
                    293:        PGT_OID_REASSOCIATE =                           0x1800000b,
                    294:        /* struct pgt_obj_mlmeex; */
                    295:        PGT_OID_REASSOCIATEEX =                         0x1800000c,
                    296:        /* struct pgt_obj_mlmeex; */
                    297:        PGT_OID_MLME_AUTO_LEVEL =                       0x19000001,
                    298:        /* uint32_t mlme; */
                    299: #define        PGT_MLME_AUTO_LEVEL_AUTO                0
                    300: #define        PGT_MLME_AUTO_LEVEL_INTERMEDIATE        1
                    301: #define        PGT_MLME_AUTO_LEVEL_EXTENDED            2
                    302:        /* struct pgt_obj_buffer;*/
                    303:        PGT_OID_PSM_BUFFER =                            0x19000004,
                    304:        /* struct pgt_obj_buffer;*/
                    305: #define        PGT_PSM_BUFFER_FRAME_COUNT              64
                    306:        PGT_OID_MAX_FRAME_BURST =                       0x1b000008,
                    307:        /* uint32_t max_usec_grouped; */
                    308:        PGT_OID_BSS_FIND =                              0x1c000042,
                    309:        /* struct pgt_obj_bss; */
                    310:        PGT_OID_BSS_LIST =                              0x1c000043,
                    311:        /* struct pgt_obj_bsslist; */
                    312:        /* Initial settings. */
                    313:        PGT_OID_MODE =                                  0xff020003,
                    314:        /* uint32_t mode; */
                    315: #define        PGT_MODE_PROMISCUOUS                    0
                    316: #define        PGT_MODE_CLIENT                         1
                    317: #define        PGT_MODE_AP                             2
                    318: #define        PGT_MODE_SNIFFER                        3
                    319:        PGT_OID_CONFIG =                                0xff020008,
                    320:        /* uint32_t flags; */
                    321: #define        PGT_CONFIG_MANUAL_RUN                   0x00000001
                    322: #define        PGT_CONFIG_FRAME_TRAP                   0x00000002
                    323: #define        PGT_CONFIG_RX_ANNEX                     0x00000004
                    324: #define        PGT_CONFIG_TX_ANNEX                     0x00000008
                    325: #define        PGT_CONFIG_WDS                          0x00000010
                    326:        PGT_OID_PHY =                                   0xff02000d,
                    327: #define        PGT_OID_PHY_2400MHZ                     0x00000001
                    328: #define        PGT_OID_PHY_5000MHZ                     0x00000002
                    329: #define        PGT_OID_PHY_FAA                         0x80000000
                    330: };
                    331:
                    332: /*
                    333:  * Structures used to communicate via the OIDs.
                    334:  */
                    335: struct pgt_obj_ssid {
                    336:        uint8_t                 pos_length;
                    337:        char                    pos_ssid[33];
                    338: } __packed;
                    339:
                    340: struct pgt_obj_key {
                    341:        uint8_t                 pok_type;
                    342: #define        PGT_OBJ_KEY_TYPE_WEP    0
                    343: #define        PGT_OBJ_KEY_TYPE_TKIP   1
                    344:        uint8_t                 pok_length;
                    345:        uint8_t                 pok_key[32];
                    346: } __packed;
                    347:
                    348: /*
                    349:  * Each mlme received includes the current 802.11 state.
                    350:  */
                    351: #define        PGT_MLME_STATE_NONE     0
                    352: #define        PGT_MLME_STATE_AUTHING  1
                    353: #define        PGT_MLME_STATE_AUTH     2
                    354: #define        PGT_MLME_STATE_ASSOCING 3
                    355:
                    356: #define        PGT_MLME_STATE_ASSOC    5
                    357: #define        PGT_MLME_STATE_IBSS     6
                    358: #define        PGT_MLME_STATE_WDS      7
                    359:
                    360: struct pgt_obj_mlme {
                    361:        uint8_t                 pom_address[6];
                    362:        uint16_t                pom_id;         /* 802.11 association number */
                    363:        uint16_t                pom_state;
                    364:        uint16_t                pom_code;       /* 802.11 reason code */
                    365: } __packed;
                    366:
                    367: struct pgt_obj_mlmeex {
                    368:        uint8_t                 pom_address[6];
                    369:        uint16_t                pom_id;
                    370:        uint16_t                pom_state;
                    371:        uint16_t                pom_code;
                    372:        uint16_t                pom_size;
                    373:        uint8_t                 pom_data[0];
                    374: } __packed;
                    375:
                    376: struct pgt_obj_buffer {
                    377:        uint32_t                pob_size;
                    378:        uint32_t                pob_addr;
                    379: } __packed;
                    380:
                    381: struct pgt_obj_bss {
                    382:        uint8_t                 pob_address[6];
                    383:        uint16_t                pob_padding0;
                    384:        uint8_t                 pob_state;
                    385:        uint8_t                 pob_reserved;
                    386:        uint16_t                pob_age;
                    387:        uint8_t                 pob_quality;
                    388:        uint8_t                 pob_rssi;
                    389:        struct pgt_obj_ssid     pob_ssid;
                    390:        uint16_t                pob_channel;
                    391:        uint8_t                 pob_beacon_period;
                    392:        uint8_t                 pob_dtim_period;
                    393:        uint16_t                pob_capinfo;
                    394:        uint16_t                pob_rates;
                    395:        uint16_t                pob_basic_rates;
                    396:        uint16_t                pob_padding1;
                    397: } __packed;
                    398:
                    399: struct pgt_obj_bsslist {
                    400:        uint32_t                pob_count;
                    401:        struct pgt_obj_bss      pob_bsslist[0];
                    402: #define        PGT_OBJ_BSSLIST_NBSS    24
                    403: } __packed;
                    404:
                    405: struct pgt_obj_frequencies {
                    406:        uint16_t                pof_count;
                    407:        uint16_t                pof_freqlist_mhz[0];
                    408: } __packed;
                    409:
                    410: #endif

CVSweb