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