if_wireg.h revision 330897
1/*-
2 * SPDX-License-Identifier: BSD-4-Clause
3 *
4 * Copyright (c) 1997, 1998, 1999
5 *	Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *	This product includes software developed by Bill Paul.
18 * 4. Neither the name of the author nor the names of any co-contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 * THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * $FreeBSD: stable/11/sys/dev/wi/if_wireg.h 330897 2018-03-14 03:19:51Z eadler $
35 */
36
37#define WI_DELAY	5
38#define WI_TIMEOUT	(500000/WI_DELAY)	/* 500 ms */
39
40#define WI_PORT0	(0 << 8)
41#define WI_PORT1	(1 << 8)
42#define WI_PORT2	(2 << 8)
43#define WI_PORT3	(3 << 8)
44#define WI_PORT4	(4 << 8)
45#define WI_PORT5	(5 << 8)
46
47#define WI_PCI_LMEMRES	0x10	/* PCI Memory (native PCI implementations) */
48#define WI_PCI_LOCALRES	0x14	/* The PLX chip's local registers */
49#define WI_PCI_MEMRES	0x18	/* The PCCard's attribute memory */
50#define WI_PCI_IORES	0x1C	/* The PCCard's I/O space */
51
52#define WI_LOCAL_INTCSR		0x4c
53#define WI_LOCAL_INTEN		0x40
54#define WI_HFA384X_SWSUPPORT0_OFF	0x28
55#define WI_PRISM2STA_MAGIC		0x4A2D
56#define WI_PCICOR_OFF		0x26
57#define WI_PCICOR_RESET		0x0080
58
59/* Default port: 0 (only 0 exists on stations) */
60#define WI_DEFAULT_PORT	WI_PORT0
61
62/* Default network name: ANY */
63/*
64 * [sommerfeld 1999/07/15] Changed from "ANY" to ""; according to Bill Fenner,
65 * ANY is used in MS driver user interfaces, while "" is used over the
66 * wire..
67 */
68#define WI_DEFAULT_NETNAME	""
69
70#define WI_DEFAULT_AP_DENSITY	1
71
72#define WI_DEFAULT_RTS_THRESH	2347
73
74#define WI_DEFAULT_DATALEN	2304
75
76#define WI_DEFAULT_CREATE_IBSS	0
77
78#define WI_DEFAULT_PM_ENABLED	0
79
80#define WI_DEFAULT_MAX_SLEEP	100
81
82#define WI_DEFAULT_ROAMING	1
83
84#define WI_DEFAULT_AUTHTYPE	1
85
86#ifdef __NetBSD__
87#define OS_STRING_NAME	"NetBSD"
88#endif
89#ifdef __FreeBSD__
90#define OS_STRING_NAME	"FreeBSD"
91#endif
92#ifdef __OpenBSD__
93#define OS_STRING_NAME	"OpenBSD"
94#endif
95
96#define WI_DEFAULT_NODENAME	OS_STRING_NAME " WaveLAN/IEEE node"
97
98#define WI_DEFAULT_IBSS		OS_STRING_NAME " IBSS"
99
100#define WI_BUS_PCCARD		0	/* pccard device */
101#define WI_BUS_PCI_PLX		1	/* PCI card w/ PLX PCI/PCMICA bridge */
102#define WI_BUS_PCI_NATIVE	2	/* native PCI device (Prism 2.5) */
103
104/*
105 * register space access macros
106 */
107#define CSR_WRITE_4(sc, reg, val)				\
108	bus_space_write_4((sc)->wi_btag, (sc)->wi_bhandle, 	\
109	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg), val)
110#define CSR_WRITE_2(sc, reg, val)				\
111	bus_space_write_2((sc)->wi_btag, (sc)->wi_bhandle,	\
112 	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg), val)
113#define CSR_WRITE_1(sc, reg, val)				\
114	bus_space_write_1((sc)->wi_btag, (sc)->wi_bhandle,	\
115 	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg), val)
116
117#define CSR_READ_4(sc, reg)					\
118	bus_space_read_4((sc)->wi_btag, (sc)->wi_bhandle,	\
119 	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg))
120#define CSR_READ_2(sc, reg)					\
121	bus_space_read_2((sc)->wi_btag, (sc)->wi_bhandle,	\
122 	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg))
123#define CSR_READ_1(sc, reg)					\
124	bus_space_read_1((sc)->wi_btag, (sc)->wi_bhandle,	\
125 	    (sc)->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg)*2 : (reg))
126
127#define CSM_WRITE_1(sc, off, val)	\
128	bus_space_write_1((sc)->wi_bmemtag, (sc)->wi_bmemhandle, off, val)
129
130#define CSM_READ_1(sc, off)		\
131	bus_space_read_1((sc)->wi_bmemtag, (sc)->wi_bmemhandle, off)
132
133#define CSR_WRITE_STREAM_2(sc, reg, val)	\
134	bus_space_write_stream_2(sc->wi_btag, sc->wi_bhandle,	\
135	    (sc->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg) * 2 : (reg)), val)
136#define CSR_WRITE_MULTI_STREAM_2(sc, reg, val, count)	\
137	bus_space_write_multi_stream_2(sc->wi_btag, sc->wi_bhandle,	\
138	    (sc->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg) * 2 : (reg)), val, count)
139#define CSR_READ_STREAM_2(sc, reg)		\
140	bus_space_read_stream_2(sc->wi_btag, sc->wi_bhandle,	\
141	    (sc->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg) * 2 : (reg)))
142#define CSR_READ_MULTI_STREAM_2(sc, reg, buf, count)		\
143	bus_space_read_multi_stream_2(sc->wi_btag, sc->wi_bhandle,	\
144	    (sc->wi_bus_type == WI_BUS_PCI_NATIVE ? (reg) * 2 : (reg)), buf, count)
145
146/*
147 * The WaveLAN/IEEE cards contain an 802.11 MAC controller which Lucent
148 * calls 'Hermes.' In typical fashion, getting documentation about this
149 * controller is about as easy as squeezing blood from a stone. Here
150 * is more or less what I know:
151 *
152 * - The Hermes controller is firmware driven, and the host interacts
153 *   with the Hermes via a firmware interface, which can change.
154 *
155 * - The Hermes is described in a document called: "Hermes Firmware
156 *   WaveLAN/IEEE Station Functions," document #010245, which of course
157 *   Lucent will not release without an NDA.
158 *
159 * - Lucent has created a library called HCF (Hardware Control Functions)
160 *   though which it wants developers to interact with the card. The HCF
161 *   is needlessly complex, ill conceived and badly documented. Actually,
162 *   the comments in the HCP code itself aren't bad, but the publicly
163 *   available manual that comes with it is awful, probably due largely to
164 *   the fact that it has been emasculated in order to hide information
165 *   that Lucent wants to keep proprietary. The purpose of the HCF seems
166 *   to be to insulate the driver programmer from the Hermes itself so that
167 *   Lucent has an excuse not to release programming in for it.
168 *
169 * - Lucent only makes available documentation and code for 'HCF Light'
170 *   which is a stripped down version of HCF with certain features not
171 *   implemented, most notably support for 802.11 frames.
172 *
173 * - The HCF code which I have seen blows goats. Whoever decided to
174 *   use a 132 column format should be shot.
175 *
176 * Rather than actually use the Lucent HCF library, I have stripped all
177 * the useful information from it and used it to create a driver in the
178 * usual BSD form. Note: I don't want to hear anybody whining about the
179 * fact that the Lucent code is GPLed and mine isn't. I did not actually
180 * put any of Lucent's code in this driver: I only used it as a reference
181 * to obtain information about the underlying hardware. The Hermes
182 * programming interface is not GPLed, so bite me.
183 */
184
185/*
186 * Size of Hermes & Prism2 I/O space.
187 */
188#define WI_IOSIZ		0x40
189
190/*
191 * Hermes & Prism2 register definitions
192 */
193
194/* Hermes command/status registers. */
195#define WI_COMMAND		0x00
196#define WI_PARAM0		0x02
197#define WI_PARAM1		0x04
198#define WI_PARAM2		0x06
199#define WI_STATUS		0x08
200#define WI_RESP0		0x0A
201#define WI_RESP1		0x0C
202#define WI_RESP2		0x0E
203
204/* Command register values. */
205#define WI_CMD_BUSY		0x8000 /* busy bit */
206#define WI_CMD_INI		0x0000 /* initialize */
207#define WI_CMD_ENABLE		0x0001 /* enable */
208#define WI_CMD_DISABLE		0x0002 /* disable */
209#define WI_CMD_DIAG		0x0003
210#define WI_CMD_ALLOC_MEM	0x000A /* allocate NIC memory */
211#define WI_CMD_TX		0x000B /* transmit */
212#define WI_CMD_NOTIFY		0x0010
213#define WI_CMD_INQUIRE		0x0011
214#define WI_CMD_ACCESS		0x0021
215#define WI_CMD_ACCESS_WRITE	0x0121
216#define WI_CMD_PROGRAM		0x0022
217#define WI_CMD_READEE		0x0030	/* symbol only */
218#define WI_CMD_READMIF		0x0030	/* prism2 */
219#define WI_CMD_WRITEMIF		0x0031	/* prism2 */
220#define WI_CMD_DEBUG		0x0038	/* Various test commands */
221
222#define WI_CMD_CODE_MASK	0x003F
223
224/*
225 * Various cmd test stuff.
226 */
227#define WI_TEST_MONITOR		0x0B
228#define WI_TEST_STOP		0x0F
229#define WI_TEST_CFG_BITS	0x15
230#define WI_TEST_CFG_BIT_ALC	0x08
231
232/*
233 * Reclaim qualifier bit, applicable to the
234 * TX and INQUIRE commands.
235 */
236#define WI_RECLAIM		0x0100 /* reclaim NIC memory */
237
238/*
239 * ACCESS command qualifier bits.
240 */
241#define WI_ACCESS_READ		0x0000
242#define WI_ACCESS_WRITE		0x0100
243
244/*
245 * PROGRAM command qualifier bits.
246 */
247#define WI_PROGRAM_DISABLE	0x0000
248#define WI_PROGRAM_ENABLE_RAM	0x0100
249#define WI_PROGRAM_ENABLE_NVRAM	0x0200
250#define WI_PROGRAM_NVRAM	0x0300
251
252/* Status register values */
253#define WI_STAT_CMD_CODE	0x003F
254#define WI_STAT_DIAG_ERR	0x0100
255#define WI_STAT_INQ_ERR		0x0500
256#define WI_STAT_CMD_RESULT	0x7F00
257
258/* memory handle management registers */
259#define WI_INFO_FID		0x10
260#define WI_RX_FID		0x20
261#define WI_ALLOC_FID		0x22
262#define WI_TX_CMP_FID		0x24
263
264/*
265 * Buffer Access Path (BAP) registers.
266 * These are I/O channels. I believe you can use each one for
267 * any desired purpose independently of the other. In general
268 * though, we use BAP1 for reading and writing LTV records and
269 * reading received data frames, and BAP0 for writing transmit
270 * frames. This is a convention though, not a rule.
271 */
272#define WI_SEL0			0x18
273#define WI_SEL1			0x1A
274#define WI_OFF0			0x1C
275#define WI_OFF1			0x1E
276#define WI_DATA0		0x36
277#define WI_DATA1		0x38
278#define WI_BAP0			WI_DATA0
279#define WI_BAP1			WI_DATA1
280
281#define WI_OFF_BUSY		0x8000
282#define WI_OFF_ERR		0x4000
283#define WI_OFF_DATAOFF		0x0FFF
284
285/* Event registers */
286#define WI_EVENT_STAT		0x30	/* Event status */
287#define WI_INT_EN		0x32	/* Interrupt enable/disable */
288#define WI_EVENT_ACK		0x34	/* Ack event */
289
290/* Events */
291#define WI_EV_TICK		0x8000	/* aux timer tick */
292#define WI_EV_RES		0x4000	/* controller h/w error (time out) */
293#define WI_EV_INFO_DROP		0x2000	/* no RAM to build unsolicited frame */
294#define WI_EV_NO_CARD		0x0800	/* card removed (hunh?) */
295#define WI_EV_DUIF_RX		0x0400	/* wavelan management packet received */
296#define WI_EV_INFO		0x0080	/* async info frame */
297#define WI_EV_CMD		0x0010	/* command completed */
298#define WI_EV_ALLOC		0x0008	/* async alloc/reclaim completed */
299#define WI_EV_TX_EXC		0x0004	/* async xmit completed with failure */
300#define	WI_EV_TX		0x0002	/* async xmit completed successfully */
301#define WI_EV_RX		0x0001	/* async rx completed */
302
303/* Host software registers */
304#define WI_SW0			0x28
305#define WI_SW1			0x2A
306#define WI_SW2			0x2C
307#define WI_SW3			0x2E 	/* does not appear in Prism2 */
308
309#define WI_CNTL			0x14
310
311#define WI_CNTL_AUX_ENA		0xC000
312#define WI_CNTL_AUX_ENA_STAT	0xC000
313#define WI_CNTL_AUX_DIS_STAT	0x0000
314#define WI_CNTL_AUX_ENA_CNTL	0x8000
315#define WI_CNTL_AUX_DIS_CNTL	0x4000
316
317#define WI_AUX_PAGE		0x3A
318#define WI_AUX_OFFSET		0x3C
319#define WI_AUX_DATA		0x3E
320
321#define WI_AUX_PGSZ		128
322#define WI_AUX_KEY0		0xfe01
323#define WI_AUX_KEY1		0xdc23
324#define WI_AUX_KEY2		0xba45
325
326#define WI_COR			0x40	/* only for Symbol */
327#define WI_COR_RESET		0x0080
328#define WI_COR_IOMODE		0x0041
329
330#define WI_HCR			0x42	/* only for Symbol */
331#define WI_HCR_4WIRE		0x0010
332#define WI_HCR_RUN		0x0007
333#define WI_HCR_HOLD		0x000f
334#define WI_HCR_EEHOLD		0x00ce
335
336#define WI_COR_OFFSET	0x3e0	/* OK for PCI, default COR for Prism PC Card */
337#define WI_COR_VALUE	0x41
338
339/*
340 * One form of communication with the Hermes is with what Lucent calls
341 * LTV records, where LTV stands for Length, Type and Value. The length
342 * and type are 16 bits and are in native byte order. The value is in
343 * multiples of 16 bits and is in little endian byte order.
344 */
345struct wi_lt_hdr {
346	u_int16_t		wi_len;
347	u_int16_t		wi_type;
348	/* value is vary depends on resource id */
349};
350
351/*
352 * Download buffer location and length (0xFD01).
353 */
354struct wi_dnld_buf {
355	u_int16_t		wi_buf_pg; /* page addr of intermediate dl buf*/
356	u_int16_t		wi_buf_off; /* offset of idb */
357	u_int16_t		wi_buf_len; /* len of idb */
358};
359
360/*
361 * Mem sizes (0xFD02).
362 */
363struct wi_memsz {
364	u_int16_t		wi_mem_ram;
365	u_int16_t		wi_mem_nvram;
366};
367
368/*
369 * NIC Identification (0xFD0B, 0xFD20)
370 */
371struct wi_ver {
372	u_int16_t		wi_ver[4];
373};
374
375/* define card ident */
376#define	WI_NIC_LUCENT_ID	0x0001
377#define	WI_NIC_LUCENT_STR	"Lucent Technologies, WaveLAN/IEEE"
378
379#define	WI_NIC_SONY_ID		0x0002
380#define	WI_NIC_SONY_STR		"Sony WaveLAN/IEEE"
381
382#define	WI_NIC_LUCENT_EMB_ID	0x0005
383#define	WI_NIC_LUCENT_EMB_STR	"Lucent Embedded WaveLAN/IEEE"
384
385#define	WI_NIC_EVB2_ID		0x8000
386#define	WI_NIC_EVB2_STR		"RF:PRISM2 MAC:HFA3841"
387
388#define	WI_NIC_HWB3763_ID	0x8001
389#define	WI_NIC_HWB3763_STR	"RF:PRISM2 MAC:HFA3841 CARD:HWB3763 rev.B"
390
391#define	WI_NIC_HWB3163_ID	0x8002
392#define	WI_NIC_HWB3163_STR	"RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.A"
393
394#define	WI_NIC_HWB3163B_ID	0x8003
395#define	WI_NIC_HWB3163B_STR	"RF:PRISM2 MAC:HFA3841 CARD:HWB3163 rev.B"
396
397#define	WI_NIC_EVB3_ID		0x8004
398#define	WI_NIC_EVB3_STR		"RF:PRISM2 MAC:HFA3842 CARD:HFA3842 EVAL"
399
400#define	WI_NIC_HWB1153_ID	0x8007
401#define	WI_NIC_HWB1153_STR	"RF:PRISM1 MAC:HFA3841 CARD:HWB1153"
402
403#define	WI_NIC_P2_SST_ID	0x8008	/* Prism2 with SST flush */
404#define	WI_NIC_P2_SST_STR	"RF:PRISM2 MAC:HFA3841 CARD:HWB3163-SST-flash"
405
406#define	WI_NIC_EVB2_SST_ID	0x8009
407#define	WI_NIC_EVB2_SST_STR	"RF:PRISM2 MAC:HFA3841 CARD:HWB3163-SST-flash"
408
409#define	WI_NIC_3842_EVA_ID	0x800A	/* 3842 Evaluation Board */
410#define	WI_NIC_3842_EVA_STR	"RF:PRISM2 MAC:HFA3842 CARD:HFA3842 EVAL"
411
412#define	WI_NIC_3842_PCMCIA_AMD_ID	0x800B	/* Prism2.5 PCMCIA */
413#define	WI_NIC_3842_PCMCIA_SST_ID	0x800C
414#define	WI_NIC_3842_PCMCIA_ATL_ID	0x800D
415#define	WI_NIC_3842_PCMCIA_ATS_ID	0x800E
416#define	WI_NIC_3842_PCMCIA_STR		"RF:PRISM2.5 MAC:ISL3873"
417
418#define	WI_NIC_3842_MINI_AMD_ID		0x8012	/* Prism2.5 Mini-PCI */
419#define	WI_NIC_3842_MINI_SST_ID		0x8013
420#define	WI_NIC_3842_MINI_ATL_ID		0x8014
421#define	WI_NIC_3842_MINI_ATS_ID		0x8015
422#define	WI_NIC_3842_MINI_STR		"RF:PRISM2.5 MAC:ISL3874A(Mini-PCI)"
423
424#define	WI_NIC_3842_PCI_AMD_ID		0x8016	/* Prism2.5 PCI-bridge */
425#define	WI_NIC_3842_PCI_SST_ID		0x8017
426#define	WI_NIC_3842_PCI_ATL_ID		0x8018
427#define	WI_NIC_3842_PCI_ATS_ID		0x8019
428#define	WI_NIC_3842_PCI_STR		"RF:PRISM2.5 MAC:ISL3874A(PCI-bridge)"
429
430#define	WI_NIC_P3_PCMCIA_AMD_ID		0x801A	/* Prism3 PCMCIA */
431#define	WI_NIC_P3_PCMCIA_SST_ID		0x801B
432#define	WI_NIC_P3_PCMCIA_ATL_ID		0x801C
433#define	WI_NIC_P3_PCMCIA_ATS_ID		0x801D
434#define	WI_NIC_P3_PCMCIA_STR		"RF:PRISM3(PCMCIA)"
435
436#define WI_NIC_P3_USB_AMD_ID		0x801E
437#define WI_NIC_P3_USB_SST_ID		0x801F
438#define	WI_NIC_P3_USB_ATL_ID		0x8020
439
440#define	WI_NIC_P3_MINI_AMD_ID		0x8021	/* Prism3 Mini-PCI */
441#define	WI_NIC_P3_MINI_SST_ID		0x8022
442#define	WI_NIC_P3_MINI_ATL_ID		0x8023
443#define	WI_NIC_P3_MINI_ATS_ID		0x8024
444#define	WI_NIC_P3_MINI_STR		"RF:PRISM3(Mini-PCI)"
445
446/*
447 * List of intended regulatory domains (0xFD11).
448 */
449struct wi_ltv_domains {
450	u_int16_t		wi_len;
451	u_int16_t		wi_type;
452	u_int16_t		wi_num_dom;
453	u_int8_t		wi_domains[10];
454};
455
456/*
457 * CIS struct (0xFD13).
458 */
459struct wi_cis {
460	u_int16_t		wi_cis[240];
461};
462
463/*
464 * Communications quality (0xFD43).
465 */
466struct wi_commqual {
467	u_int16_t		wi_coms_qual;
468	u_int16_t		wi_sig_lvl;
469	u_int16_t		wi_noise_lvl;
470};
471
472/*
473 * Actual system scale thresholds (0xFC06, 0xFD46).
474 */
475struct wi_scalethresh {
476	u_int16_t		wi_energy_detect;
477	u_int16_t		wi_carrier_detect;
478	u_int16_t		wi_defer;
479	u_int16_t		wi_cell_search;
480	u_int16_t		wi_out_of_range;
481	u_int16_t		wi_delta_snr;
482};
483
484/*
485 * PCF info struct (0xFD87).
486 */
487struct wi_pcf {
488	u_int16_t		wi_medium_occupancy_limit;
489	u_int16_t		wi_cfp_period;
490	u_int16_t		wi_cfp_max_duration;
491};
492
493/*
494 * Connection control characteristics. (0xFC00)
495 * 0 == IBSS (802.11 compliant mode) (Only PRISM2)
496 * 1 == Basic Service Set (BSS)
497 * 2 == Wireless Distribudion System (WDS)
498 * 3 == Pseudo IBSS
499 *	(Only PRISM2; not 802.11 compliant mode, testing use only)
500 * 6 == HOST AP (Only PRISM2)
501 */
502#define	WI_PORTTYPE_IBSS	0x0
503#define WI_PORTTYPE_BSS		0x1
504#define WI_PORTTYPE_WDS		0x2
505#define WI_PORTTYPE_ADHOC	0x3
506#define WI_PORTTYPE_APSILENT	0x5
507#define	WI_PORTTYPE_HOSTAP	0x6
508
509/*
510 * Mac addresses. (0xFC01, 0xFC08)
511 */
512struct wi_macaddr {
513	u_int8_t		wi_mac_addr[6];
514};
515
516/*
517 * Station set identification (SSID). (0xFC02, 0xFC04)
518 */
519struct wi_ssid {
520	u_int16_t		wi_len;
521	u_int8_t		wi_ssid[32];
522};
523
524/*
525 * Set our station name. (0xFC0E)
526 */
527struct wi_nodename {
528	u_int16_t		wi_nodelen;
529	u_int8_t		wi_nodename[32];
530};
531
532/*
533 * Multicast addresses to be put in filter. We're
534 * allowed up to 16 addresses in the filter. (0xFC80)
535 */
536struct wi_mcast {
537	struct ether_addr	wi_mcast[16];
538};
539
540/*
541 * Join request. (0xFCE2)
542 */
543struct wi_joinreq {
544	struct ether_addr	wi_bssid;
545	u_int16_t		wi_chan;
546};
547
548/*
549 * supported rates. (0xFCB4)
550 */
551#define WI_SUPPRATES_1M		0x0001
552#define WI_SUPPRATES_2M		0x0002
553#define WI_SUPPRATES_5M		0x0004
554#define WI_SUPPRATES_11M	0x0008
555#define	WI_RATES_BITS	"\20\0011M\0022M\0035.5M\00411M"
556
557/*
558 * Information frame types.
559 */
560#define WI_INFO_NOTIFY		0xF000	/* Handover address */
561#define WI_INFO_COUNTERS	0xF100	/* Statistics counters */
562#define WI_INFO_SCAN_RESULTS	0xF101	/* Scan results */
563#define WI_INFO_HOST_SCAN_RESULTS	0xF104	/* Scan results */
564#define WI_INFO_LINK_STAT	0xF200	/* Link status */
565#define	WI_INFO_LINK_STAT_CONNECTED	1
566#define	WI_INFO_LINK_STAT_DISCONNECTED	2
567#define	WI_INFO_LINK_STAT_AP_CHG	3	/* AP Change */
568#define	WI_INFO_LINK_STAT_AP_OOR	4	/* AP Out Of Range */
569#define	WI_INFO_LINK_STAT_AP_INR	5	/* AP In Range */
570#define	WI_INFO_LINK_STAT_ASSOC_FAILED	6
571#define WI_INFO_ASSOC_STAT	0xF201	/* Association status */
572#define	WI_INFO_AUTH_REQUEST	0xF202	/* Authentication Request (AP) */
573#define	WI_INFO_POWERSAVE_COUNT	0xF203	/* PowerSave User Count (AP) */
574
575struct wi_assoc {
576	u_int16_t		wi_assoc_stat;	/* Association Status */
577#define	ASSOC		1
578#define	REASSOC		2
579#define	DISASSOC	3
580#define	ASSOCFAIL	4
581#define	AUTHFAIL	5
582	u_int8_t		wi_assoc_sta[6];	/* Station Address */
583	u_int8_t		wi_assoc_osta[6];	/* OLD Station Address */
584	u_int16_t		wi_assoc_reason;	/* Reason */
585	u_int16_t		wi_assoc_reserve;	/* Reserved */
586};
587
588/*
589 * Scan Results of Prism2 chip
590 */
591
592struct wi_scan_header {
593	u_int16_t		wi_reserve;	/* future use */
594	u_int16_t		wi_reason;	/* The reason this scan was initiated
595						   1: Host initiated
596						   2: Firmware initiated
597						   3: Inquiry request from host */
598};
599
600struct wi_scan_data_p2 {
601	u_int16_t		wi_chid;	/* BSS Channel ID from Probe Res.(PR)*/
602	u_int16_t		wi_noise;	/* Average Noise Level of the PR */
603	u_int16_t		wi_signal;	/* Signal Level on the PR */
604	u_int8_t		wi_bssid[6];	/* MACaddress of BSS responder from PR */
605	u_int16_t		wi_interval;	/* BSS beacon interval */
606	u_int16_t		wi_capinfo;	/* BSS Capability Information
607						   IEEE Std 802.11(1997) ,see 7.3.1.4 */
608	u_int16_t		wi_namelen;	/* Length of SSID strings */
609	u_int8_t		wi_name[32];	/* SSID strings */
610	u_int16_t		wi_suprate[5];	/* Supported Rates element from the PR
611						   IEEE Std 802.11(1997) ,see 7.3.2.2 */
612	u_int16_t		wi_rate;	/* Data rate of the PR */
613#define	WI_APRATE_1		0x0A		/* 1 Mbps */
614#define	WI_APRATE_2		0x14		/* 2 Mbps */
615#define	WI_APRATE_5		0x37		/* 5.5 Mbps */
616#define	WI_APRATE_11		0x6E		/* 11 Mbps */
617};
618
619/*
620 * Scan Results of Lucent chip
621 */
622struct wi_scan_data {
623	u_int16_t		wi_chid;	/* BSS Channel ID from PR */
624	u_int16_t		wi_noise;	/* Average Noise Level of the PR */
625	u_int16_t		wi_signal;	/* Signal Level on the PR */
626	u_int8_t		wi_bssid[6];	/* MACaddress of BSS responder from PR */
627	u_int16_t		wi_interval;	/* BSS beacon interval */
628	u_int16_t		wi_capinfo;	/* BSS Capability Information
629						   IEEE Std 802.11(1997) ,see 7.3.1.4 */
630	u_int16_t		wi_namelen;	/* Length of SSID strings */
631	u_int8_t		wi_name[32];	/* SSID strings */
632};
633
634/*
635 * transmit/receive frame structure
636 */
637struct wi_frame {
638	u_int16_t		wi_status;	/* 0x00 */
639	u_int16_t		wi_rx_tstamp1;	/* 0x02 */
640	u_int16_t		wi_rx_tstamp0;	/* 0x04 */
641	u_int8_t		wi_rx_silence;	/* 0x06 */
642	u_int8_t		wi_rx_signal;	/* 0x07 */
643	u_int8_t		wi_rx_rate;	/* 0x08 */
644	u_int8_t		wi_rx_flow;	/* 0x09 */
645	u_int8_t		wi_tx_rtry;	/* 0x0a */ /* Prism2 AP Only */
646	u_int8_t		wi_tx_rate;	/* 0x0b */ /* Prism2 AP Only */
647	u_int16_t		wi_tx_ctl;	/* 0x0c */
648	struct ieee80211_frame_addr4 wi_whdr;	/* 0x0e */
649	u_int16_t		wi_dat_len;	/* 0x2c */
650	struct ether_header	wi_ehdr;	/* 0x2e */
651} __attribute__((__packed__));
652
653/* Tx Status Field */
654#define	WI_TXSTAT_RET_ERR	0x0001
655#define	WI_TXSTAT_AGED_ERR	0x0002
656#define	WI_TXSTAT_DISCONNECT	0x0004
657#define	WI_TXSTAT_FORM_ERR	0x0008
658
659/* Rx Status Field */
660#define WI_STAT_BADCRC		0x0001
661#define WI_STAT_UNDECRYPTABLE	0x0002
662#define WI_STAT_ERRSTAT		0x0003
663#define WI_STAT_MAC_PORT	0x0700
664#define	WI_STAT_PCF		0x1000
665#define WI_RXSTAT_MSG_TYPE	0xE000
666#define  WI_STAT_1042		0x2000	/* RFC1042 encoded */
667#define  WI_STAT_TUNNEL		0x4000	/* Bridge-tunnel encoded */
668#define  WI_STAT_WMP_MSG	0x6000	/* WaveLAN-II management protocol */
669#define	 WI_STAT_MGMT		0x8000	/* 802.11b management frames */
670
671#define WI_ENC_TX_E_II		0x0E
672
673#define WI_ENC_TX_1042		0x00
674#define WI_ENC_TX_TUNNEL	0xF8
675
676/* TxControl Field (enhanced) */
677#define	WI_TXCNTL_TX_OK		0x0002
678#define	WI_TXCNTL_TX_EX		0x0004
679#define	WI_TXCNTL_STRUCT_TYPE	0x0018
680#define	 WI_ENC_TX_802_3	0x00
681#define	 WI_ENC_TX_802_11	0x08
682#define	WI_TXCNTL_ALTRTRY	0x0020
683#define	WI_TXCNTL_NOCRYPT	0x0080
684
685/*
686 * HFA3861/3863 (BBP) Control Registers
687 */
688#define WI_HFA386X_CR_A_D_TEST_MODES2 0x1A
689#define WI_HFA386X_CR_MANUAL_TX_POWER 0x3E
690
691#ifdef IEEE80211_RADIOTAP_F_CFP
692/*
693 * Radio capture format for Prism.
694 */
695#define WI_RX_RADIOTAP_PRESENT \
696	((1 << IEEE80211_RADIOTAP_TSFT) | \
697	 (1 << IEEE80211_RADIOTAP_FLAGS) | \
698	 (1 << IEEE80211_RADIOTAP_RATE) | \
699	 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
700	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
701	 (1 << IEEE80211_RADIOTAP_DB_ANTNOISE))
702
703struct wi_rx_radiotap_header {
704	struct ieee80211_radiotap_header wr_ihdr;
705	u_int64_t	wr_tsf;
706	u_int8_t	wr_flags;
707	u_int8_t	wr_rate;
708	u_int16_t	wr_chan_freq;
709	u_int16_t	wr_chan_flags;
710	u_int8_t	wr_antsignal;
711	u_int8_t	wr_antnoise;
712};
713
714#define WI_TX_RADIOTAP_PRESENT \
715	((1 << IEEE80211_RADIOTAP_FLAGS) | \
716	 (1 << IEEE80211_RADIOTAP_RATE) | \
717	 (1 << IEEE80211_RADIOTAP_CHANNEL))
718
719struct wi_tx_radiotap_header {
720	struct ieee80211_radiotap_header wt_ihdr;
721	u_int8_t	wt_flags;
722	u_int8_t	wt_rate;
723	u_int16_t	wt_chan_freq;
724	u_int16_t	wt_chan_flags;
725};
726#endif /* IEEE80211_RADIOTAP_F_CFP */
727