xref: /openbsd-src/sys/dev/ic/if_wireg.h (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: if_wireg.h,v 1.5 2001/06/25 18:04:23 drahn Exp $	*/
2 
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  *	From: if_wireg.h,v 1.5 1999/07/20 20:03:42 wpaul Exp $
35  */
36 
37 #define WI_TIMEOUT	50000	/* XXX just a guess at a good value.  */
38 
39 #define WI_PORT0	0
40 #define WI_PORT1	1
41 #define WI_PORT2	2
42 #define WI_PORT3	3
43 #define WI_PORT4	4
44 #define WI_PORT5	5
45 
46 /* Default port: 0 (only 0 exists on stations) */
47 #define WI_DEFAULT_PORT	(WI_PORT0 << 8)
48 
49 /* Default TX rate: 2Mbps, auto fallback */
50 #define WI_DEFAULT_TX_RATE	3
51 
52 /* Default network name (wildcard) */
53 #define WI_DEFAULT_NETNAME	""
54 
55 #define WI_DEFAULT_AP_DENSITY	1
56 
57 #define WI_DEFAULT_RTS_THRESH	2347
58 
59 #define WI_DEFAULT_DATALEN	2304
60 
61 #define WI_DEFAULT_CREATE_IBSS	0
62 
63 #define WI_DEFAULT_PM_ENABLED	0
64 
65 #define WI_DEFAULT_MAX_SLEEP	100
66 
67 #define WI_DEFAULT_NODENAME	"WaveLAN/IEEE node"
68 
69 #define WI_DEFAULT_IBSS		"IBSS"
70 
71 #define WI_DEFAULT_CHAN		3
72 
73 #define	WI_DEFAULT_ROAMING	1
74 
75 #define	WI_DEFAULT_AUTHTYPE	1
76 
77 /*
78  * register space access macros
79  */
80 #define CSR_WRITE_4(sc, reg, val)	\
81 	bus_space_write_4(sc->wi_btag, sc->wi_bhandle, reg, val)
82 #define CSR_WRITE_2(sc, reg, val)	\
83 	bus_space_write_2(sc->wi_btag, sc->wi_bhandle, reg, val)
84 #define CSR_WRITE_1(sc, reg, val)	\
85 	bus_space_write_1(sc->wi_btag, sc->wi_bhandle, reg, val)
86 
87 #define CSR_READ_4(sc, reg)		\
88 	bus_space_read_4(sc->wi_btag, sc->wi_bhandle, reg)
89 #define CSR_READ_2(sc, reg)		\
90 	bus_space_read_2(sc->wi_btag, sc->wi_bhandle, reg)
91 #define CSR_READ_1(sc, reg)		\
92 	bus_space_read_1(sc->wi_btag, sc->wi_bhandle, reg)
93 
94 #define CSR_READ_RAW_2(sc, ba, dst, sz) \
95 	bus_space_read_raw_multi_2((sc)->wi_btag, (sc)->wi_bhandle, (ba), \
96 		(dst), (sz))
97 #define CSR_WRITE_RAW_2(sc, ba, dst, sz) \
98 	bus_space_write_raw_multi_2((sc)->wi_btag, (sc)->wi_bhandle, (ba), \
99 		(dst), (sz))
100 
101 /*
102  * The WaveLAN/IEEE cards contain an 802.11 MAC controller which Lucent
103  * calls 'Hermes.' In typical fashion, getting documentation about this
104  * controller is about as easy as squeezing blood from a stone. Here
105  * is more or less what I know:
106  *
107  * - The Hermes controller is firmware driven, and the host interacts
108  *   with the Hermes via a firmware interface, which can change.
109  *
110  * - The Hermes is described in a document called: "Hermes Firmware
111  *   WaveLAN/IEEE Station Functions," document #010245, which of course
112  *   Lucent will not release without an NDA.
113  *
114  * - Lucent has created a library called HCF (Hardware Control Functions)
115  *   though which it wants developers to interact with the card. The HCF
116  *   is needlessly complex, ill conceived and badly documented. Actually,
117  *   the comments in the HCP code itself aren't bad, but the publically
118  *   available manual that comes with it is awful, probably due largely to
119  *   the fact that it has been emasculated in order to hide information
120  *   that Lucent wants to keep proprietary. The purpose of the HCF seems
121  *   to be to insulate the driver programmer from the Hermes itself so that
122  *   Lucent has an excuse not to release programming in for it.
123  *
124  * - Lucent only makes available documentation and code for 'HCF Light'
125  *   which is a stripped down version of HCF with certain features not
126  *   implemented, most notably support for 802.11 frames.
127  *
128  * - The HCF code which I have seen blows goats. Whoever decided to
129  *   use a 132 column format should be shot.
130  *
131  * Rather than actually use the Lucent HCF library, I have stripped all
132  * the useful information from it and used it to create a driver in the
133  * usual BSD form. Note: I don't want to hear anybody whining about the
134  * fact that the Lucent code is GPLed and mine isn't. I did not actually
135  * put any of Lucent's code in this driver: I only used it as a reference
136  * to obtain information about the underlying hardware. The Hermes
137  * programming interface is not GPLed, so bite me.
138  */
139 
140 /*
141  * Size of Hermes I/O space.
142  */
143 #define WI_IOSIZ		0x40
144 
145 /*
146  * Hermes register definitions and what little I know about them.
147  */
148 
149 /* Hermes command/status registers. */
150 #define WI_COMMAND		0x00
151 #define WI_PARAM0		0x02
152 #define WI_PARAM1		0x04
153 #define WI_PARAM2		0x06
154 #define WI_STATUS		0x08
155 #define WI_RESP0		0x0A
156 #define WI_RESP1		0x0C
157 #define WI_RESP2		0x0E
158 
159 /* Command register values. */
160 #define WI_CMD_BUSY		0x8000 /* busy bit */
161 #define WI_CMD_INI		0x0000 /* initialize */
162 #define WI_CMD_ENABLE		0x0001 /* enable */
163 #define WI_CMD_DISABLE		0x0002 /* disable */
164 #define WI_CMD_DIAG		0x0003
165 #define WI_CMD_ALLOC_MEM	0x000A /* allocate NIC memory */
166 #define WI_CMD_TX		0x000B /* transmit */
167 #define WI_CMD_NOTIFY		0x0010
168 #define WI_CMD_INQUIRE		0x0011
169 #define WI_CMD_ACCESS		0x0021
170 #define WI_CMD_PROGRAM		0x0022
171 
172 #define WI_CMD_CODE_MASK	0x003F
173 
174 /*
175  * Reclaim qualifier bit, applicable to the
176  * TX and INQUIRE commands.
177  */
178 #define WI_RECLAIM		0x0100 /* reclaim NIC memory */
179 
180 /*
181  * ACCESS command qualifier bits.
182  */
183 #define WI_ACCESS_READ		0x0000
184 #define WI_ACCESS_WRITE		0x0100
185 
186 /*
187  * PROGRAM command qualifier bits.
188  */
189 #define WI_PROGRAM_DISABLE	0x0000
190 #define WI_PROGRAM_ENABLE_RAM	0x0100
191 #define WI_PROGRAM_ENABLE_NVRAM	0x0200
192 #define WI_PROGRAM_NVRAM	0x0300
193 
194 /* Status register values */
195 #define WI_STAT_CMD_CODE	0x003F
196 #define WI_STAT_DIAG_ERR	0x0100
197 #define WI_STAT_INQ_ERR		0x0500
198 #define WI_STAT_CMD_RESULT	0x7F00
199 
200 /* memory handle management registers */
201 #define WI_INFO_FID		0x10
202 #define WI_RX_FID		0x20
203 #define WI_ALLOC_FID		0x22
204 #define WI_TX_CMP_FID		0x24
205 
206 /*
207  * Buffer Access Path (BAP) registers.
208  * These are I/O channels. I believe you can use each one for
209  * any desired purpose independently of the other. In general
210  * though, we use BAP1 for reading and writing LTV records and
211  * reading received data frames, and BAP0 for writing transmit
212  * frames. This is a convention though, not a rule.
213  */
214 #define WI_SEL0			0x18
215 #define WI_SEL1			0x1A
216 #define WI_OFF0			0x1C
217 #define WI_OFF1			0x1E
218 #define WI_DATA0		0x36
219 #define WI_DATA1		0x38
220 #define WI_BAP0			WI_DATA0
221 #define WI_BAP1			WI_DATA1
222 
223 #define WI_OFF_BUSY		0x8000
224 #define WI_OFF_ERR		0x4000
225 #define WI_OFF_DATAOFF		0x0FFF
226 
227 /* Event registers */
228 #define WI_EVENT_STAT		0x30	/* Event status */
229 #define WI_INT_EN		0x32	/* Interrupt enable/disable */
230 #define WI_EVENT_ACK		0x34	/* Ack event */
231 
232 /* Events */
233 #define WI_EV_TICK		0x8000	/* aux timer tick */
234 #define WI_EV_RES		0x4000	/* controller h/w error (time out) */
235 #define WI_EV_INFO_DROP		0x2000	/* no RAM to build unsolicited frame */
236 #define WI_EV_NO_CARD		0x0800	/* card removed (hunh?) */
237 #define WI_EV_DUIF_RX		0x0400	/* wavelan management packet received */
238 #define WI_EV_INFO		0x0080	/* async info frame */
239 #define WI_EV_CMD		0x0010	/* command completed */
240 #define WI_EV_ALLOC		0x0008	/* async alloc/reclaim completed */
241 #define WI_EV_TX_EXC		0x0004	/* async xmit completed with failure */
242 #define WI_EV_TX		0x0002	/* async xmit completed succesfully */
243 #define WI_EV_RX		0x0001	/* async rx completed */
244 
245 #define WI_INTRS	\
246 	(WI_EV_RX|WI_EV_TX|WI_EV_TX_EXC|WI_EV_ALLOC|WI_EV_INFO|WI_EV_INFO_DROP)
247 
248 /* Host software registers */
249 #define WI_SW0			0x28
250 #define WI_SW1			0x2A
251 #define WI_SW2			0x2C
252 #define WI_SW3			0x2E
253 
254 #define WI_CNTL			0x14
255 
256 #define WI_CNTL_AUX_ENA		0xC000
257 #define WI_CNTL_AUX_ENA_STAT	0xC000
258 #define WI_CNTL_AUX_DIS_STAT	0x0000
259 #define WI_CNTL_AUX_ENA_CNTL	0x8000
260 #define WI_CNTL_AUX_DIS_CNTL	0x4000
261 
262 #define WI_AUX_PAGE		0x3A
263 #define WI_AUX_OFFSET		0x3C
264 #define WI_AUX_DATA		0x3E
265 
266 #define WI_COR_OFFSET		0x3E0
267 #define WI_COR_VALUE		0x41
268 
269 /*
270  * One form of communication with the Hermes is with what Lucent calls
271  * LTV records, where LTV stands for Length, Type and Value. The length
272  * and type are 16 bits and are in native byte order. The value is in
273  * multiples of 16 bits and is in little endian byte order.
274  */
275 struct wi_ltv_gen {
276 	u_int16_t		wi_len;
277 	u_int16_t		wi_type;
278 	u_int16_t		wi_val;
279 };
280 
281 struct wi_ltv_str {
282 	u_int16_t		wi_len;
283 	u_int16_t		wi_type;
284 	u_int16_t		wi_str[17];
285 };
286 
287 #define WI_SETVAL(recno, val)			\
288 	do {					\
289 		struct wi_ltv_gen	g;	\
290 						\
291 		g.wi_len = 2;			\
292 		g.wi_type = recno;		\
293 		g.wi_val = htole16(val);	\
294 		wi_write_record(sc, &g);	\
295 	} while (0)
296 
297 #define WI_SETSTR(recno, str)					\
298 	do {							\
299 		struct wi_ltv_str	s;			\
300 		int			l;			\
301 								\
302 		l = (strlen(str) + 1) & ~0x1;			\
303 		bzero((char *)&s, sizeof(s));			\
304 		s.wi_len = (l / 2) + 2;				\
305 		s.wi_type = recno;				\
306 		s.wi_str[0] = htole16(strlen(str));		\
307 		bcopy(str, (char *)&s.wi_str[1], strlen(str));	\
308 		wi_write_record(sc, (struct wi_ltv_gen *)&s);	\
309 	} while (0)
310 
311 /*
312  * Download buffer location and length (0xFD01).
313  */
314 #define WI_RID_DNLD_BUF		0xFD01
315 struct wi_ltv_dnld_buf {
316 	u_int16_t		wi_len;
317 	u_int16_t		wi_type;
318 	u_int16_t		wi_buf_pg; /* page addr of intermediate dl buf*/
319 	u_int16_t		wi_buf_off; /* offset of idb */
320 	u_int16_t		wi_buf_len; /* len of idb */
321 };
322 
323 /*
324  * Mem sizes (0xFD02).
325  */
326 #define WI_RID_MEMSZ		0xFD02
327 struct wi_ltv_memsz {
328 	u_int16_t		wi_len;
329 	u_int16_t		wi_type;
330 	u_int16_t		wi_mem_ram;
331 	u_int16_t		wi_mem_nvram;
332 };
333 
334 /*
335  * NIC Identification (0xFD0B == WI_RID_CARD_ID)
336  */
337 struct wi_ltv_ver {
338 	u_int16_t	wi_len;
339 	u_int16_t	wi_type;
340 	u_int16_t	wi_ver[4];
341 #define	WI_NIC_EVB2	0x8000
342 #define	WI_NIC_HWB3763	0x8001
343 #define	WI_NIC_HWB3163	0x8002
344 #define	WI_NIC_HWB3163B	0x8003
345 #define	WI_NIC_EVB3	0x8004
346 #define	WI_NIC_HWB1153	0x8007
347 #define	WI_NIC_P2_SST	0x8008  /* Prism2 with SST flush */
348 #define	WI_NIC_PRISM2_5	0x800C
349 };
350 
351 /*
352  * List of intended regulatory domains (WI_RID_DOMAINS = 0xFD11).
353  */
354 struct wi_ltv_domains {
355 	u_int16_t		wi_len;
356 	u_int16_t		wi_type;
357 	u_int16_t		wi_domains[6];
358 };
359 
360 /*
361  * CIS struct (0xFD13 == WI_RID_CIS).
362  */
363 struct wi_ltv_cis {
364 	u_int16_t		wi_len;
365 	u_int16_t		wi_type;
366 	u_int16_t		wi_cis[240];
367 };
368 
369 /*
370  * Communications quality (0xFD43 == WI_RID_COMMQUAL).
371  */
372 struct wi_ltv_commqual {
373 	u_int16_t		wi_len;
374 	u_int16_t		wi_type;
375 	u_int16_t		wi_coms_qual;
376 	u_int16_t		wi_sig_lvl;
377 	u_int16_t		wi_noise_lvl;
378 };
379 
380 /*
381  * Actual system scale thresholds (0xFD46 == WI_RID_SCALETHRESH).
382  */
383 struct wi_ltv_scalethresh {
384 	u_int16_t		wi_len;
385 	u_int16_t		wi_type;
386 	u_int16_t		wi_energy_detect;
387 	u_int16_t		wi_carrier_detect;
388 	u_int16_t		wi_defer;
389 	u_int16_t		wi_cell_search;
390 	u_int16_t		wi_out_of_range;
391 	u_int16_t		wi_delta_snr;
392 };
393 
394 /*
395  * PCF info struct (0xFD87 == WI_RID_PCF).
396  */
397 struct wi_ltv_pcf {
398 	u_int16_t		wi_len;
399 	u_int16_t		wi_type;
400 	u_int16_t		wi_energy_detect;
401 	u_int16_t		wi_carrier_detect;
402 	u_int16_t		wi_defer;
403 	u_int16_t		wi_cell_search;
404 	u_int16_t		wi_range;
405 };
406 
407 /*
408  * Connection control characteristics (0xFC00 == WI_RID_PORTTYPE).
409  * 1 == Basic Service Set (BSS)
410  * 2 == Wireless Distribudion System (WDS)
411  * 3 == Pseudo IBSS
412  */
413 #define WI_PORTTYPE_BSS		0x1
414 #define WI_PORTTYPE_WDS		0x2
415 #define WI_PORTTYPE_ADHOC	0x3
416 
417 /*
418  * Mac addresses.
419  */
420 struct wi_ltv_macaddr {
421 	u_int16_t		wi_len;
422 	u_int16_t		wi_type;
423 	u_int16_t		wi_mac_addr[3];
424 };
425 
426 /*
427  * Station set identification (SSID).
428  */
429 struct wi_ltv_ssid {
430 	u_int16_t		wi_len;
431 	u_int16_t		wi_type;
432 	u_int16_t		wi_id[17];
433 };
434 
435 /*
436  * Set our station name (0xFC0E == WI_RID_NODENAME).
437  */
438 struct wi_ltv_nodename {
439 	u_int16_t		wi_len;
440 	u_int16_t		wi_type;
441 	u_int16_t		wi_nodename[17];
442 };
443 
444 /*
445  * Multicast addresses to be put in filter. We're allowed up
446  * to 16 addresses in the filter (0xFC80 == WI_RID_MCAST).
447  */
448 struct wi_ltv_mcast {
449 	u_int16_t		wi_len;
450 	u_int16_t		wi_type;
451 	struct ether_addr	wi_mcast[16];
452 };
453 
454 /*
455  * Information frame types.
456  */
457 #define WI_INFO_NOTIFY		0xF000	/* Handover address */
458 #define WI_INFO_COUNTERS	0xF100	/* Statistics counters */
459 #define WI_INFO_SCAN_RESULTS	0xF101	/* Scan results */
460 #define WI_INFO_LINK_STAT	0xF200	/* Link status */
461 #define WI_INFO_ASSOC_STAT	0xF201	/* Association status */
462 
463 /*
464  * Hermes transmit/receive frame structure
465  */
466 struct wi_frame {
467 	u_int16_t		wi_status;	/* 0x00 */
468 	u_int16_t		wi_rsvd0;	/* 0x02 */
469 	u_int16_t		wi_rsvd1;	/* 0x04 */
470 	u_int16_t		wi_q_info;	/* 0x06 */
471 	u_int16_t		wi_rsvd2;	/* 0x08 */
472 	u_int16_t		wi_rsvd3;	/* 0x0A */
473 	u_int16_t		wi_tx_ctl;	/* 0x0C */
474 	u_int16_t		wi_frame_ctl;	/* 0x0E */
475 	u_int16_t		wi_id;		/* 0x10 */
476 	u_int8_t		wi_addr1[6];	/* 0x12 */
477 	u_int8_t		wi_addr2[6];	/* 0x18 */
478 	u_int8_t		wi_addr3[6];	/* 0x1E */
479 	u_int16_t		wi_seq_ctl;	/* 0x24 */
480 	u_int8_t		wi_addr4[6];	/* 0x26 */
481 	u_int16_t		wi_dat_len;	/* 0x2C */
482 	u_int8_t		wi_dst_addr[6];	/* 0x2E */
483 	u_int8_t		wi_src_addr[6];	/* 0x34 */
484 	u_int16_t		wi_len;		/* 0x3A */
485 	u_int16_t		wi_dat[3];	/* 0x3C */ /* SNAP header */
486 	u_int16_t		wi_type;	/* 0x42 */
487 };
488 
489 #define WI_802_3_OFFSET		0x2E
490 #define WI_802_11_OFFSET	0x44
491 #define WI_802_11_OFFSET_RAW	0x3C
492 
493 #define WI_STAT_BADCRC		0x0001
494 #define WI_STAT_UNDECRYPTABLE	0x0002
495 #define WI_STAT_ERRSTAT		0x0003
496 #define WI_STAT_MAC_PORT	0x0700
497 #define WI_STAT_1042		0x2000	/* RFC1042 encoded */
498 #define WI_STAT_TUNNEL		0x4000	/* Bridge-tunnel encoded */
499 #define WI_STAT_WMP_MSG		0x6000	/* WaveLAN-II management protocol */
500 #define WI_RXSTAT_MSG_TYPE	0xE000
501 
502 #define WI_ENC_TX_802_3		0x00
503 #define WI_ENC_TX_802_11	0x11
504 #define WI_ENC_TX_E_II		0x0E
505 
506 #define WI_ENC_TX_1042		0x00
507 #define WI_ENC_TX_TUNNEL	0xF8
508 
509 #define WI_TXCNTL_MACPORT	0x00FF
510 #define WI_TXCNTL_STRUCTTYPE	0xFF00
511 
512 /*
513  * SNAP (sub-network access protocol) constants for transmission
514  * of IP datagrams over IEEE 802 networks, taken from RFC1042.
515  * We need these for the LLC/SNAP header fields in the TX/RX frame
516  * structure.
517  */
518 #define WI_SNAP_K1		0xaa	/* assigned global SAP for SNAP */
519 #define WI_SNAP_K2		0x00
520 #define WI_SNAP_CONTROL		0x03	/* unnumbered information format */
521 #define WI_SNAP_WORD0		(WI_SNAP_K1 | (WI_SNAP_K1 << 8))
522 #define WI_SNAP_WORD1		(WI_SNAP_K2 | (WI_SNAP_CONTROL << 8))
523 #define WI_SNAPHDR_LEN		0x6
524