Annotation of sys/dev/ic/acxreg.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: acxreg.h,v 1.11 2007/03/29 12:37:47 claudio Exp $ */
2:
3: /*
4: * Copyright (c) 2006 Jonathan Gray <jsg@openbsd.org>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: /*
20: * Copyright (c) 2006 The DragonFly Project. All rights reserved.
21: *
22: * This code is derived from software contributed to The DragonFly Project
23: * by Sepherosa Ziehau <sepherosa@gmail.com>
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: *
29: * 1. Redistributions of source code must retain the above copyright
30: * notice, this list of conditions and the following disclaimer.
31: * 2. Redistributions in binary form must reproduce the above copyright
32: * notice, this list of conditions and the following disclaimer in
33: * the documentation and/or other materials provided with the
34: * distribution.
35: * 3. Neither the name of The DragonFly Project nor the names of its
36: * contributors may be used to endorse or promote products derived
37: * from this software without specific, prior written permission.
38: *
39: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
40: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
41: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
42: * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
43: * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
44: * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
45: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
47: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
48: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
49: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50: * SUCH DAMAGE.
51: */
52:
53: #ifndef _ACXREG_H
54: #define _ACXREG_H
55:
56: /*
57: * IO register index
58: */
59: #define ACXREG_SOFT_RESET 0
60: #define ACXREG_FWMEM_ADDR 1
61: #define ACXREG_FWMEM_DATA 2
62: #define ACXREG_FWMEM_CTRL 3
63: #define ACXREG_FWMEM_START 4
64: #define ACXREG_EVENT_MASK 5
65: #define ACXREG_INTR_TRIG 6
66: #define ACXREG_INTR_MASK 7
67: #define ACXREG_INTR_STATUS 8
68: #define ACXREG_INTR_STATUS_CLR 9 /* cleared after being read */
69: #define ACXREG_INTR_ACK 10
70: #define ACXREG_HINTR_TRIG 11 /* XXX what's this? */
71: #define ACXREG_RADIO_ENABLE 12
72: #define ACXREG_EEPROM_INIT 13
73: #define ACXREG_EEPROM_CTRL 14
74: #define ACXREG_EEPROM_ADDR 15
75: #define ACXREG_EEPROM_DATA 16
76: #define ACXREG_EEPROM_CONF 17
77: #define ACXREG_EEPROM_INFO 18
78: #define ACXREG_PHY_ADDR 19
79: #define ACXREG_PHY_DATA 20
80: #define ACXREG_PHY_CTRL 21
81: #define ACXREG_GPIO_OUT_ENABLE 22
82: #define ACXREG_GPIO_OUT 23
83: #define ACXREG_CMD_REG_OFFSET 24
84: #define ACXREG_INFO_REG_OFFSET 25
85: #define ACXREG_RESET_SENSE 26
86: #define ACXREG_ECPU_CTRL 27
87: #define ACXREG_MAX 28
88: #define ACXREG(reg, val) [ACXREG_##reg] = val
89:
90: /*
91: * Value read from ACXREG_EEPROM_INFO
92: * upper 8bits are radio type
93: * lower 8bits are form factor
94: */
95: #define ACX_EEINFO_RADIO_TYPE_SHIFT 8
96: #define ACX_EEINFO_RADIO_TYPE_MASK (0xff << ACX_EEINFO_RADIO_TYPE_SHIFT)
97: #define ACX_EEINFO_FORM_FACTOR_MASK 0xff
98:
99: #define ACX_EEINFO_HAS_RADIO_TYPE(info) ((info) & ACX_EEINFO_RADIO_TYPE_MASK)
100: #define ACX_EEINFO_RADIO_TYPE(info) ((info) >> ACX_EEINFO_RADIO_TYPE_SHIFT)
101: #define ACX_EEINFO_FORM_FACTOR(info) ((info) & ACX_EEINFO_FORM_FACTOR_MASK)
102:
103: /*
104: * Size of command register whose location is obtained
105: * from ACXREG_CMD_REG_OFFSET IO register
106: */
107: #define ACX_CMD_REG_SIZE 4 /* 4 bytes */
108:
109: /*
110: * Size of infomation register whose location is obtained
111: * from ACXREG_INFO_REG_OFFSET IO register
112: */
113: #define ACX_INFO_REG_SIZE 4 /* 4 bytes */
114:
115: /*
116: * Offset of EEPROM variables
117: */
118: #define ACX_EE_VERSION_OFS 0x05
119:
120: /*
121: * Possible values for various IO registers
122: */
123:
124: /* ACXREG_SOFT_RESET */
125: #define ACXRV_SOFT_RESET 0x1
126:
127: /* ACXREG_FWMEM_START */
128: #define ACXRV_FWMEM_START_OP 0x0
129:
130: /* ACXREG_FWMEM_CTRL */
131: #define ACXRV_FWMEM_ADDR_AUTOINC 0x10000
132:
133: /* ACXREG_EVENT_MASK */
134: #define ACXRV_EVENT_DISABLE 0x8000 /* XXX What's this?? */
135:
136: /* ACXREG_INTR_TRIG */
137: #define ACXRV_TRIG_CMD_FINI 0x0001
138: #define ACXRV_TRIG_TX_FINI 0x0004
139:
140: /* ACXREG_INTR_MASK */
141: #define ACXRV_INTR_RX_DATA 0x0001
142: #define ACXRV_INTR_TX_FINI 0x0002
143: #define ACXRV_INTR_TX_XFER 0x0004
144: #define ACXRV_INTR_RX_FINI 0x0008
145: #define ACXRV_INTR_DTIM 0x0010
146: #define ACXRV_INTR_BEACON 0x0020
147: #define ACXRV_INTR_TIMER 0x0040
148: #define ACXRV_INTR_KEY_MISS 0x0080
149: #define ACXRV_INTR_WEP_FAIL 0x0100
150: #define ACXRV_INTR_CMD_FINI 0x0200
151: #define ACXRV_INTR_INFO 0x0400
152: #define ACXRV_INTR_OVERFLOW 0x0800 /* XXX */
153: #define ACXRV_INTR_PROC_ERR 0x1000 /* XXX */
154: #define ACXRV_INTR_SCAN_FINI 0x2000
155: #define ACXRV_INTR_FCS_THRESH 0x4000 /* XXX */
156: #define ACXRV_INTR_UNKN 0x8000
157: #define ACXRV_INTR_ALL 0xffff
158:
159: /* ACXREG_EEPROM_INIT */
160: #define ACXRV_EEPROM_INIT 0x1
161:
162: /* ACXREG_EEPROM_CTRL */
163: #define ACXRV_EEPROM_READ 0x2
164:
165: /* ACXREG_PHY_CTRL */
166: #define ACXRV_PHY_WRITE 0x1
167: #define ACXRV_PHY_READ 0x2
168:
169: /* ACXREG_PHY_ADDR */
170: #define ACXRV_PHYREG_TXPOWER 0x11 /* axc100 */
171: #define ACXRV_PHYREG_SENSITIVITY 0x30
172:
173: /* ACXREG_ECPU_CTRL */
174: #define ACXRV_ECPU_HALT 0x1
175: #define ACXRV_ECPU_START 0x0
176:
177: /* Commands */
178: #define ACXCMD_GET_CONF 0x01
179: #define ACXCMD_SET_CONF 0x02
180: #define ACXCMD_ENABLE_RXCHAN 0x03
181: #define ACXCMD_ENABLE_TXCHAN 0x04
182: #define ACXCMD_TMPLT_TIM 0x0a
183: #define ACXCMD_JOIN_BSS 0x0b
184: #define ACXCMD_WEP_MGMT 0x0c /* acx111 */
185: #define ACXCMD_SLEEP 0x0f
186: #define ACXCMD_WAKEUP 0x10
187: #define ACXCMD_INIT_MEM 0x12 /* acx100 */
188: #define ACXCMD_TMPLT_BEACON 0x13
189: #define ACXCMD_TMPLT_PROBE_RESP 0x14
190: #define ACXCMD_TMPLT_NULL_DATA 0x15
191: #define ACXCMD_TMPLT_PROBE_REQ 0x16
192: #define ACXCMD_INIT_RADIO 0x18
193:
194: #if 0
195: /*
196: * acx111 does not agree with acx100 about
197: * the meaning of following values. So they
198: * are put into chip specific files.
199: */
200: #define ACX_CONF_FW_RING 0x0003
201: #define ACX_CONF_MEMOPT 0x0005
202: #endif
203: #define ACX_CONF_MEMBLK_SIZE 0x0004 /* acx100 */
204: #define ACX_CONF_RATE_FALLBACK 0x0006
205: #define ACX_CONF_WEPOPT 0x0007 /* acx100 */
206: #define ACX_CONF_MMAP 0x0008
207: #define ACX_CONF_FWREV 0x000d
208: #define ACX_CONF_RXOPT 0x0010
209: #define ACX_CONF_OPTION 0x0015 /* acx111 */
210: #define ACX_CONF_EADDR 0x1001
211: #define ACX_CONF_NRETRY_SHORT 0x1005
212: #define ACX_CONF_NRETRY_LONG 0x1006
213: #define ACX_CONF_WEPKEY 0x1007 /* acx100 */
214: #define ACX_CONF_MSDU_LIFETIME 0x1008
215: #define ACX_CONF_REGDOM 0x100a
216: #define ACX_CONF_ANTENNA 0x100b
217: #define ACX_CONF_TXPOWER 0x100d /* acx111 */
218: #define ACX_CONF_CCA_MODE 0x100e
219: #define ACX_CONF_ED_THRESH 0x100f
220: #define ACX_CONF_WEP_TXKEY 0x1010
221:
222: /*
223: * NOTE:
224: * Following structs' fields are little endian
225: */
226:
227: struct acx_conf {
228: uint16_t conf_id; /* see ACXCONF_ (_acxcmd.h) */
229: uint16_t conf_data_len;
230: } __packed;
231:
232: struct acx_conf_mmap {
233: struct acx_conf confcom;
234: uint32_t code_start;
235: uint32_t code_end;
236: uint32_t wep_cache_start;
237: uint32_t wep_cache_end;
238: uint32_t pkt_tmplt_start;
239: uint32_t pkt_tmplt_end;
240: uint32_t fw_desc_start;
241: uint32_t fw_desc_end;
242: uint32_t memblk_start;
243: uint32_t memblk_end;
244: } __packed;
245:
246: struct acx_conf_wepopt {
247: struct acx_conf confcom;
248: uint16_t nkey;
249: uint8_t opt; /* see WEPOPT_ */
250: } __packed;
251:
252: #define WEPOPT_HDWEP 0 /* hardware WEP */
253:
254: struct acx_conf_eaddr {
255: struct acx_conf confcom;
256: uint8_t eaddr[IEEE80211_ADDR_LEN];
257: } __packed;
258:
259: struct acx_conf_regdom {
260: struct acx_conf confcom;
261: uint8_t regdom;
262: uint8_t unknown;
263: } __packed;
264:
265: struct acx_conf_antenna {
266: struct acx_conf confcom;
267: uint8_t antenna;
268: } __packed;
269:
270: struct acx_conf_fwrev {
271: struct acx_conf confcom;
272: #define ACX_FWREV_LEN 20
273: /*
274: * "Rev xx.xx.xx.xx"
275: * '\0' terminated
276: */
277: char fw_rev[ACX_FWREV_LEN];
278: uint32_t hw_id;
279: } __packed;
280:
281: struct acx_conf_nretry_long {
282: struct acx_conf confcom;
283: uint8_t nretry;
284: } __packed;
285:
286: struct acx_conf_nretry_short {
287: struct acx_conf confcom;
288: uint8_t nretry;
289: } __packed;
290:
291: struct acx_conf_msdu_lifetime {
292: struct acx_conf confcom;
293: uint32_t lifetime;
294: } __packed;
295:
296: struct acx_conf_rate_fallback {
297: struct acx_conf confcom;
298: uint8_t ratefb_enable; /* 0/1 */
299: } __packed;
300:
301: struct acx_conf_rxopt {
302: struct acx_conf confcom;
303: uint16_t opt1; /* see RXOPT1_ */
304: uint16_t opt2; /* see RXOPT2_ */
305: } __packed;
306:
307: #define RXOPT1_INCL_RXBUF_HDR 0x2000 /* rxbuf with acx_rxbuf_hdr */
308: #define RXOPT1_RECV_SSID 0x0400 /* recv frame for joined SSID */
309: #define RXOPT1_FILT_BCAST 0x0200 /* filt broadcast pkt */
310: #define RXOPT1_RECV_MCAST1 0x0100 /* recv pkt for multicast addr1 */
311: #define RXOPT1_RECV_MCAST0 0x0080 /* recv pkt for multicast addr0 */
312: #define RXOPT1_FILT_ALLMULTI 0x0040 /* filt allmulti pkt */
313: #define RXOPT1_FILT_FSSID 0x0020 /* filt frame for foreign SSID */
314: #define RXOPT1_FILT_FDEST 0x0010 /* filt frame for foreign dest addr */
315: #define RXOPT1_PROMISC 0x0008 /* promisc mode */
316: #define RXOPT1_INCL_FCS 0x0004
317: #define RXOPT1_INCL_PHYHDR 0x0000 /* XXX 0x0002 */
318:
319: #define RXOPT2_RECV_ASSOC_REQ 0x0800
320: #define RXOPT2_RECV_AUTH 0x0400
321: #define RXOPT2_RECV_BEACON 0x0200
322: #define RXOPT2_RECV_CF 0x0100
323: #define RXOPT2_RECV_CTRL 0x0080
324: #define RXOPT2_RECV_DATA 0x0040
325: #define RXOPT2_RECV_BROKEN 0x0020 /* broken frame */
326: #define RXOPT2_RECV_MGMT 0x0010
327: #define RXOPT2_RECV_PROBE_REQ 0x0008
328: #define RXOPT2_RECV_PROBE_RESP 0x0004
329: #define RXOPT2_RECV_ACK 0x0002 /* RTS/CTS/ACK */
330: #define RXOPT2_RECV_OTHER 0x0001
331:
332: struct acx_conf_wep_txkey {
333: struct acx_conf confcom;
334: uint8_t wep_txkey;
335: } __packed;
336:
337:
338: struct acx_tmplt_null_data {
339: uint16_t size;
340: struct ieee80211_frame data;
341: } __packed;
342:
343: struct acx_tmplt_probe_req {
344: uint16_t size;
345: union {
346: struct {
347: struct ieee80211_frame f;
348: uint8_t var[1];
349: } __packed u_data;
350: uint8_t u_mem[0x44];
351: } data;
352: } __packed;
353:
354: #define ACX_TMPLT_PROBE_REQ_SIZ(var_len) \
355: (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + (var_len))
356:
357: struct acx_tmplt_probe_resp {
358: uint16_t size;
359: union {
360: struct {
361: struct ieee80211_frame f;
362: uint8_t time_stamp[8];
363: uint16_t beacon_intvl;
364: uint16_t cap;
365: uint8_t var[1];
366: } __packed u_data;
367: uint8_t u_mem[0x54];
368: } data;
369: } __packed;
370:
371: #define ACX_TMPLT_PROBE_RESP_SIZ(var_len) \
372: (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + \
373: 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len))
374:
375: /* XXX same as acx_tmplt_probe_resp */
376: struct acx_tmplt_beacon {
377: uint16_t size;
378: union {
379: struct {
380: struct ieee80211_frame f;
381: uint8_t time_stamp[8];
382: uint16_t beacon_intvl;
383: uint16_t cap;
384: uint8_t var[1];
385: } __packed u_data;
386: uint8_t u_mem[0x54];
387: } data;
388: } __packed;
389:
390: /* XXX C&P of ACX_TMPLT_PROVE_RESP_SIZ() */
391: #define ACX_TMPLT_BEACON_SIZ(var_len) \
392: (sizeof(uint16_t) + sizeof(struct ieee80211_frame) + \
393: 8 * sizeof(uint8_t) + sizeof(uint16_t) + sizeof(uint16_t) + (var_len))
394:
395: /* XXX do NOT belong here */
396: struct tim_head {
397: uint8_t eid;
398: uint8_t len;
399: uint8_t dtim_count;
400: uint8_t dtim_period;
401: uint8_t bitmap_ctrl;
402: } __packed;
403:
404: /* For tim_head.len (tim_head - eid - len + bitmap) */
405: #define ACX_TIM_LEN(bitmap_len) \
406: (sizeof(struct tim_head) - (2 * sizeof(uint8_t)) + (bitmap_len))
407: #define ACX_TIM_BITMAP_LEN 1
408:
409: struct acx_tmplt_tim {
410: uint16_t size;
411: union {
412: struct {
413: struct tim_head th;
414: uint8_t bitmap[1];
415: } __packed u_data;
416: uint8_t u_mem[0x100];
417: } data;
418: #define tim_eid data.u_data.th.eid
419: #define tim_len data.u_data.th.len
420: #define tim_dtim_count data.u_data.th.dtim_count
421: #define tim_dtim_period data.u_data.th.dtim_period
422: #define tim_bitmap_ctrl data.u_data.th.bitmap_ctrl
423: #define tim_bitmap data.u_data.bitmap
424: } __packed;
425:
426: #define ACX_TMPLT_TIM_SIZ(bitmap_len) \
427: (sizeof(uint16_t) + sizeof(struct tim_head) + (bitmap_len))
428:
429: #define CMDPRM_WRITE_REGION_1(sc, r, rlen) \
430: bus_space_write_region_1((sc)->sc_mem2_bt, \
431: (sc)->sc_mem2_bh, \
432: (sc)->sc_cmd_param, \
433: (const uint8_t *)(r), (rlen))
434:
435: #define CMDPRM_READ_REGION_1(sc, r, rlen) \
436: bus_space_read_region_1((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
437: (sc)->sc_cmd_param, (uint8_t *)(r), (rlen))
438:
439: /*
440: * This will clear previous command's
441: * execution status too
442: */
443: #define CMD_WRITE_4(sc, val) \
444: bus_space_write_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, \
445: (sc)->sc_cmd, (val))
446: #define CMD_READ_4(sc) \
447: bus_space_read_4((sc)->sc_mem2_bt, (sc)->sc_mem2_bh, (sc)->sc_cmd)
448:
449: /*
450: * acx command register layerout:
451: * upper 16bits are command execution status
452: * lower 16bits are command to be executed
453: */
454: #define ACX_CMD_STATUS_SHIFT 16
455: #define ACX_CMD_STATUS_OK 1
456:
457: struct radio_init {
458: uint32_t radio_ofs; /* radio firmware offset */
459: uint32_t radio_len; /* radio firmware length */
460: } __packed;
461:
462: struct bss_join_hdr {
463: uint8_t bssid[IEEE80211_ADDR_LEN];
464: uint16_t beacon_intvl;
465: uint8_t chip_spec[3];
466: uint8_t ndata_txrate; /* see ACX_NDATA_TXRATE_ */
467: uint8_t ndata_txopt; /* see ACX_NDATA_TXOPT_ */
468: uint8_t mode; /* see ACX_MODE_ */
469: uint8_t channel;
470: uint8_t esslen;
471: char essid[1];
472: } __packed;
473:
474: /*
475: * non-data frame tx rate
476: */
477: #define ACX_NDATA_TXRATE_2 20 /* 2Mbits/s */
478:
479: /*
480: * non-data frame tx options
481: */
482: #define ACX_NDATA_TXOPT_PBCC 0x40
483: #define ACX_NDATA_TXOPT_OFDM 0x20
484: #define ACX_NDATA_TXOPT_SHORT_PREAMBLE 0x10
485:
486: #define BSS_JOIN_BUFLEN \
487: (sizeof(struct bss_join_hdr) + IEEE80211_NWID_LEN - 1)
488: #define BSS_JOIN_PARAM_SIZE(bj) \
489: (sizeof(struct bss_join_hdr) + (bj)->esslen - 1)
490:
491:
492: #define PCIR_BAR(x) (PCI_MAPS + (x) * 4)
493:
494: #endif /* !_ACXREG_H */
CVSweb