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