Annotation of sys/dev/ic/pgtreg.h, Revision 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