]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/wi/if_wireg.h
This commit was generated by cvs2svn to compensate for changes in r58809,
[FreeBSD/FreeBSD.git] / sys / dev / wi / if_wireg.h
1 /*
2  * Copyright (c) 1997, 1998, 1999
3  *      Bill Paul <wpaul@ctr.columbia.edu>.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by Bill Paul.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
24  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * $FreeBSD$
33  */
34
35 struct wi_counters {
36         u_int32_t               wi_tx_unicast_frames;
37         u_int32_t               wi_tx_multicast_frames;
38         u_int32_t               wi_tx_fragments;
39         u_int32_t               wi_tx_unicast_octets;
40         u_int32_t               wi_tx_multicast_octets;
41         u_int32_t               wi_tx_deferred_xmits;
42         u_int32_t               wi_tx_single_retries;
43         u_int32_t               wi_tx_multi_retries;
44         u_int32_t               wi_tx_retry_limit;
45         u_int32_t               wi_tx_discards;
46         u_int32_t               wi_rx_unicast_frames;
47         u_int32_t               wi_rx_multicast_frames;
48         u_int32_t               wi_rx_fragments;
49         u_int32_t               wi_rx_unicast_octets;
50         u_int32_t               wi_rx_multicast_octets;
51         u_int32_t               wi_rx_fcs_errors;
52         u_int32_t               wi_rx_discards_nobuf;
53         u_int32_t               wi_tx_discards_wrong_sa;
54         u_int32_t               wi_rx_WEP_cant_decrypt;
55         u_int32_t               wi_rx_msg_in_msg_frags;
56         u_int32_t               wi_rx_msg_in_bad_msg_frags;
57 };
58
59 /*
60  * Encryption controls. We can enable or disable encryption as
61  * well as specify up to 4 encryption keys. We can also specify
62  * which of the four keys will be used for transmit encryption.
63  */
64 #define WI_RID_ENCRYPTION       0xFC20
65 #define WI_RID_AUTHTYPE         0xFC21
66 #define WI_RID_DEFLT_CRYPT_KEYS 0xFCB0
67 #define WI_RID_TX_CRYPT_KEY     0xFCB1
68 #define WI_RID_WEP_AVAIL        0xFD4F
69 struct wi_key {
70         u_int16_t               wi_keylen;
71         u_int8_t                wi_keydat[14];
72 };
73
74 struct wi_ltv_keys {
75         u_int16_t               wi_len;
76         u_int16_t               wi_type;
77         struct wi_key           wi_keys[4];
78 };
79
80 struct wi_softc {
81         struct arpcom           arpcom;
82         struct ifmedia          ifmedia;
83         device_t                dev;
84         int                     wi_unit;
85         struct resource *       iobase;
86         struct resource *       irq;
87         bus_space_handle_t      wi_bhandle;
88         bus_space_tag_t         wi_btag;
89         void *                  wi_intrhand;
90         int                     wi_io_addr;    
91         int                     wi_tx_data_id;
92         int                     wi_tx_mgmt_id;
93         int                     wi_gone;
94         int                     wi_if_flags;
95         u_int16_t               wi_ptype;
96         u_int16_t               wi_portnum;
97         u_int16_t               wi_max_data_len;
98         u_int16_t               wi_rts_thresh;
99         u_int16_t               wi_ap_density;
100         u_int16_t               wi_tx_rate;
101         u_int16_t               wi_create_ibss;
102         u_int16_t               wi_channel;
103         u_int16_t               wi_pm_enabled;
104         u_int16_t               wi_max_sleep;
105         char                    wi_node_name[32];
106         char                    wi_net_name[32];
107         char                    wi_ibss_name[32];
108         u_int8_t                wi_txbuf[1596];
109         struct wi_counters      wi_stats;
110         int                     wi_has_wep;
111         int                     wi_use_wep;
112         int                     wi_tx_key;
113         struct wi_ltv_keys      wi_keys;
114 #ifdef WICACHE
115         int                     wi_sigitems;
116         struct wi_sigcache      wi_sigcache[MAXWICACHE];
117         int                     wi_nextitem;
118 #endif
119         struct callout_handle   wi_stat_ch;
120 };
121
122 #define WI_TIMEOUT      65536
123
124 #define WI_PORT0        0
125 #define WI_PORT1        1
126 #define WI_PORT2        2
127 #define WI_PORT3        3
128 #define WI_PORT4        4
129 #define WI_PORT5        5
130
131 /* Default port: 0 (only 0 exists on stations) */
132 #define WI_DEFAULT_PORT (WI_PORT0 << 8)
133
134 /* Default TX rate: 2Mbps, auto fallback */
135 #define WI_DEFAULT_TX_RATE      3
136
137 /* Default network name: empty string implies any */
138 #define WI_DEFAULT_NETNAME      ""
139
140 #define WI_DEFAULT_AP_DENSITY   1
141
142 #define WI_DEFAULT_RTS_THRESH   2347
143         
144 #define WI_DEFAULT_DATALEN      2304
145
146 #define WI_DEFAULT_CREATE_IBSS  0
147
148 #define WI_DEFAULT_PM_ENABLED   0
149
150 #define WI_DEFAULT_MAX_SLEEP    100
151
152 #define WI_DEFAULT_NODENAME     "FreeBSD WaveLAN/IEEE node"
153
154 #define WI_DEFAULT_IBSS         "FreeBSD IBSS"
155
156 #define WI_DEFAULT_CHAN         3
157
158 /*
159  * register space access macros
160  */
161 #define CSR_WRITE_4(sc, reg, val)       \
162         bus_space_write_4(sc->wi_btag, sc->wi_bhandle, reg, val)
163 #define CSR_WRITE_2(sc, reg, val)       \
164         bus_space_write_2(sc->wi_btag, sc->wi_bhandle, reg, val)
165 #define CSR_WRITE_1(sc, reg, val)       \
166         bus_space_write_1(sc->wi_btag, sc->wi_bhandle, reg, val)
167
168 #define CSR_READ_4(sc, reg)             \
169         bus_space_read_4(sc->wi_btag, sc->wi_bhandle, reg)
170 #define CSR_READ_2(sc, reg)             \
171         bus_space_read_2(sc->wi_btag, sc->wi_bhandle, reg)
172 #define CSR_READ_1(sc, reg)             \
173         bus_space_read_1(sc->wi_btag, sc->wi_bhandle, reg)
174
175 /*
176  * The WaveLAN/IEEE cards contain an 802.11 MAC controller which Lucent
177  * calls 'Hermes.' In typical fashion, getting documentation about this
178  * controller is about as easy as squeezing blood from a stone. Here
179  * is more or less what I know:
180  *
181  * - The Hermes controller is firmware driven, and the host interacts
182  *   with the Hermes via a firmware interface, which can change.
183  *
184  * - The Hermes is described in a document called: "Hermes Firmware
185  *   WaveLAN/IEEE Station Functions," document #010245, which of course
186  *   Lucent will not release without an NDA.
187  *
188  * - Lucent has created a library called HCF (Hardware Control Functions)
189  *   though which it wants developers to interact with the card. The HCF
190  *   is needlessly complex, ill conceived and badly documented. Actually,
191  *   the comments in the HCP code itself aren't bad, but the publically
192  *   available manual that comes with it is awful, probably due largely to
193  *   the fact that it has been emasculated in order to hide information
194  *   that Lucent wants to keep proprietary. The purpose of the HCF seems
195  *   to be to insulate the driver programmer from the Hermes itself so that
196  *   Lucent has an excuse not to release programming in for it.
197  *
198  * - Lucent only makes available documentation and code for 'HCF Light'
199  *   which is a stripped down version of HCF with certain features not
200  *   implemented, most notably support for 802.11 frames.
201  *
202  * - The HCF code which I have seen blows goats. Whoever decided to
203  *   use a 132 column format should be shot.
204  *
205  * Rather than actually use the Lucent HCF library, I have stripped all
206  * the useful information from it and used it to create a driver in the
207  * usual BSD form. Note: I don't want to hear anybody whining about the
208  * fact that the Lucent code is GPLed and mine isn't. I did not actually
209  * put any of Lucent's code in this driver: I only used it as a reference
210  * to obtain information about the underlying hardware. The Hermes
211  * programming interface is not GPLed, so bite me.
212  */
213
214 /*
215  * Size of Hermes I/O space.
216  */
217 #define WI_IOSIZ                0x40
218
219 /*
220  * Hermes register definitions and what little I know about them.
221  */
222
223 /* Hermes command/status registers. */
224 #define WI_COMMAND              0x00
225 #define WI_PARAM0               0x02
226 #define WI_PARAM1               0x04
227 #define WI_PARAM2               0x06
228 #define WI_STATUS               0x08
229 #define WI_RESP0                0x0A
230 #define WI_RESP1                0x0C
231 #define WI_RESP2                0x0E
232
233 /* Command register values. */
234 #define WI_CMD_BUSY             0x8000 /* busy bit */
235 #define WI_CMD_INI              0x0000 /* initialize */
236 #define WI_CMD_ENABLE           0x0001 /* enable */
237 #define WI_CMD_DISABLE          0x0002 /* disable */
238 #define WI_CMD_DIAG             0x0003
239 #define WI_CMD_ALLOC_MEM        0x000A /* allocate NIC memory */
240 #define WI_CMD_TX               0x000B /* transmit */
241 #define WI_CMD_NOTIFY           0x0010
242 #define WI_CMD_INQUIRE          0x0011
243 #define WI_CMD_ACCESS           0x0021
244 #define WI_CMD_PROGRAM          0x0022
245
246 #define WI_CMD_CODE_MASK        0x003F
247
248 /*
249  * Reclaim qualifier bit, applicable to the
250  * TX and INQUIRE commands.
251  */
252 #define WI_RECLAIM              0x0100 /* reclaim NIC memory */
253
254 /*
255  * ACCESS command qualifier bits.
256  */
257 #define WI_ACCESS_READ          0x0000
258 #define WI_ACCESS_WRITE         0x0100
259
260 /*
261  * PROGRAM command qualifier bits.
262  */
263 #define WI_PROGRAM_DISABLE      0x0000
264 #define WI_PROGRAM_ENABLE_RAM   0x0100
265 #define WI_PROGRAM_ENABLE_NVRAM 0x0200
266 #define WI_PROGRAM_NVRAM        0x0300
267
268 /* Status register values */
269 #define WI_STAT_CMD_CODE        0x003F
270 #define WI_STAT_DIAG_ERR        0x0100
271 #define WI_STAT_INQ_ERR         0x0500
272 #define WI_STAT_CMD_RESULT      0x7F00
273
274 /* memory handle management registers */
275 #define WI_INFO_FID             0x10
276 #define WI_RX_FID               0x20
277 #define WI_ALLOC_FID            0x22
278 #define WI_TX_CMP_FID           0x24
279
280 /*
281  * Buffer Access Path (BAP) registers.
282  * These are I/O channels. I believe you can use each one for
283  * any desired purpose independently of the other. In general
284  * though, we use BAP1 for reading and writing LTV records and
285  * reading received data frames, and BAP0 for writing transmit
286  * frames. This is a convention though, not a rule.
287  */
288 #define WI_SEL0                 0x18
289 #define WI_SEL1                 0x1A
290 #define WI_OFF0                 0x1C
291 #define WI_OFF1                 0x1E
292 #define WI_DATA0                0x36
293 #define WI_DATA1                0x38
294 #define WI_BAP0                 WI_DATA0
295 #define WI_BAP1                 WI_DATA1
296
297 #define WI_OFF_BUSY             0x8000
298 #define WI_OFF_ERR              0x4000
299 #define WI_OFF_DATAOFF          0x0FFF
300
301 /* Event registers */
302 #define WI_EVENT_STAT           0x30    /* Event status */
303 #define WI_INT_EN               0x32    /* Interrupt enable/disable */
304 #define WI_EVENT_ACK            0x34    /* Ack event */
305
306 /* Events */
307 #define WI_EV_TICK              0x8000  /* aux timer tick */
308 #define WI_EV_RES               0x4000  /* controller h/w error (time out) */
309 #define WI_EV_INFO_DROP         0x2000  /* no RAM to build unsolicited frame */
310 #define WI_EV_NO_CARD           0x0800  /* card removed (hunh?) */
311 #define WI_EV_DUIF_RX           0x0400  /* wavelan management packet received */
312 #define WI_EV_INFO              0x0080  /* async info frame */
313 #define WI_EV_CMD               0x0010  /* command completed */
314 #define WI_EV_ALLOC             0x0008  /* async alloc/reclaim completed */
315 #define WI_EV_TX_EXC            0x0004  /* async xmit completed with failure */
316 #define WI_EV_TX                0x0002  /* async xmit completed succesfully */
317 #define WI_EV_RX                0x0001  /* async rx completed */
318
319 #define WI_INTRS        \
320         (WI_EV_RX|WI_EV_TX|WI_EV_TX_EXC|WI_EV_ALLOC|WI_EV_INFO|WI_EV_INFO_DROP)
321
322 /* Host software registers */
323 #define WI_SW0                  0x28
324 #define WI_SW1                  0x2A
325 #define WI_SW2                  0x2C
326 #define WI_SW3                  0x2E
327
328 #define WI_CNTL                 0x14
329
330 #define WI_CNTL_AUX_ENA         0xC000
331 #define WI_CNTL_AUX_ENA_STAT    0xC000
332 #define WI_CNTL_AUX_DIS_STAT    0x0000
333 #define WI_CNTL_AUX_ENA_CNTL    0x8000
334 #define WI_CNTL_AUX_DIS_CNTL    0x4000
335
336 #define WI_AUX_PAGE             0x3A
337 #define WI_AUX_OFFSET           0x3C
338 #define WI_AUX_DATA             0x3E
339
340 /*
341  * One form of communication with the Hermes is with what Lucent calls
342  * LTV records, where LTV stands for Length, Type and Value. The length
343  * and type are 16 bits and are in native byte order. The value is in
344  * multiples of 16 bits and is in little endian byte order.
345  */
346 struct wi_ltv_gen {
347         u_int16_t               wi_len;
348         u_int16_t               wi_type;
349         u_int16_t               wi_val;
350 };
351
352 struct wi_ltv_str {
353         u_int16_t               wi_len;
354         u_int16_t               wi_type;
355         u_int16_t               wi_str[17];
356 };
357
358 #define WI_SETVAL(recno, val)                   \
359         do {                                    \
360                 struct wi_ltv_gen       g;      \
361                                                 \
362                 g.wi_len = 2;                   \
363                 g.wi_type = recno;              \
364                 g.wi_val = val;                 \
365                 wi_write_record(sc, &g);        \
366         } while (0)
367
368 #define WI_SETSTR(recno, str)                                   \
369         do {                                                    \
370                 struct wi_ltv_str       s;                      \
371                 int                     l;                      \
372                                                                 \
373                 l = (strlen(str) + 1) & ~0x1;                   \
374                 bzero((char *)&s, sizeof(s));                   \
375                 s.wi_len = (l / 2) + 2;                         \
376                 s.wi_type = recno;                              \
377                 s.wi_str[0] = strlen(str);                      \
378                 bcopy(str, (char *)&s.wi_str[1], strlen(str));  \
379                 wi_write_record(sc, (struct wi_ltv_gen *)&s);   \
380         } while (0)
381
382 /*
383  * Download buffer location and length (0xFD01).
384  */
385 #define WI_RID_DNLD_BUF         0xFD01
386 struct wi_ltv_dnld_buf {
387         u_int16_t               wi_len;
388         u_int16_t               wi_type;
389         u_int16_t               wi_buf_pg; /* page addr of intermediate dl buf*/
390         u_int16_t               wi_buf_off; /* offset of idb */
391         u_int16_t               wi_buf_len; /* len of idb */
392 };
393
394 /*
395  * Mem sizes (0xFD02).
396  */
397 #define WI_RID_MEMSZ            0xFD02
398 struct wi_ltv_memsz {
399         u_int16_t               wi_len;
400         u_int16_t               wi_type;
401         u_int16_t               wi_mem_ram;
402         u_int16_t               wi_mem_nvram;
403 };
404
405 /*
406  * List of intended regulatory domains (0xFD11).
407  */
408 #define WI_RID_DOMAINS          0xFD11
409 struct wi_ltv_domains {
410         u_int16_t               wi_len;
411         u_int16_t               wi_type;
412         u_int16_t               wi_domains[6];
413 };
414
415 /*
416  * CIS struct (0xFD13).
417  */
418 #define WI_RID_CIS              0xFD13
419 struct wi_ltv_cis {
420         u_int16_t               wi_len;
421         u_int16_t               wi_type;
422         u_int16_t               wi_cis[240];
423 };
424
425 /*
426  * Communications quality (0xFD43).
427  */
428 #define WI_RID_COMMQUAL         0xFD43
429 struct wi_ltv_commqual {
430         u_int16_t               wi_len;
431         u_int16_t               wi_type;
432         u_int16_t               wi_coms_qual;
433         u_int16_t               wi_sig_lvl;
434         u_int16_t               wi_noise_lvl;
435 };
436
437 /*
438  * Actual system scale thresholds (0xFD46).
439  */
440 #define WI_RID_SYSTEM_SCALE     0xFC06
441 #define WI_RID_SCALETHRESH      0xFD46
442 struct wi_ltv_scalethresh {
443         u_int16_t               wi_len;
444         u_int16_t               wi_type;
445         u_int16_t               wi_energy_detect;
446         u_int16_t               wi_carrier_detect;
447         u_int16_t               wi_defer;
448         u_int16_t               wi_cell_search;
449         u_int16_t               wi_out_of_range;
450         u_int16_t               wi_delta_snr;
451 };
452
453 /*
454  * PCF info struct (0xFD87).
455  */
456 #define WI_RID_PCF              0xFD87
457 struct wi_ltv_pcf {
458         u_int16_t               wi_len;
459         u_int16_t               wi_type;
460         u_int16_t               wi_energy_detect;
461         u_int16_t               wi_carrier_detect;
462         u_int16_t               wi_defer;
463         u_int16_t               wi_cell_search;
464         u_int16_t               wi_range;
465 };
466
467 /*
468  * Connection control characteristics.
469  * 1 == Basic Service Set (BSS)
470  * 2 == Wireless Distribudion System (WDS)
471  * 3 == Pseudo IBSS
472  */
473 #define WI_RID_PORTTYPE         0xFC00
474 #define WI_PORTTYPE_BSS         0x1
475 #define WI_PORTTYPE_WDS         0x2
476 #define WI_PORTTYPE_ADHOC       0x3
477
478 /*
479  * Mac addresses.
480  */
481 #define WI_RID_MAC_NODE         0xFC01
482 #define WI_RID_MAC_WDS          0xFC08
483 struct wi_ltv_macaddr {
484         u_int16_t               wi_len;
485         u_int16_t               wi_type;
486         u_int16_t               wi_mac_addr[3];
487 };
488
489 /*
490  * Station set identification (SSID).
491  */
492 #define WI_RID_DESIRED_SSID     0xFC02
493 #define WI_RID_OWN_SSID         0xFC04
494 struct wi_ltv_ssid {
495         u_int16_t               wi_len;
496         u_int16_t               wi_type;
497         u_int16_t               wi_id[17];
498 };
499
500 /*
501  * Set communications channel (radio frequency).
502  */
503 #define WI_RID_OWN_CHNL         0xFC03
504
505 /*
506  * Frame data size.
507  */
508 #define WI_RID_MAX_DATALEN      0xFC07
509
510 /*
511  * ESS power management enable
512  */
513 #define WI_RID_PM_ENABLED       0xFC09
514
515 /*
516  * ESS max PM sleep internal
517  */
518 #define WI_RID_MAX_SLEEP        0xFC0C
519
520 /*
521  * Set our station name.
522  */
523 #define WI_RID_NODENAME         0xFC0E
524 struct wi_ltv_nodename {
525         u_int16_t               wi_len;
526         u_int16_t               wi_type;
527         u_int16_t               wi_nodename[17];
528 };
529
530 /*
531  * Multicast addresses to be put in filter. We're
532  * allowed up to 16 addresses in the filter.
533  */
534 #define WI_RID_MCAST            0xFC80
535 struct wi_ltv_mcast {
536         u_int16_t               wi_len;
537         u_int16_t               wi_type;
538         struct ether_addr       wi_mcast[16];
539 };
540
541 /*
542  * Create IBSS.
543  */
544 #define WI_RID_CREATE_IBSS      0xFC81
545
546 #define WI_RID_FRAG_THRESH      0xFC82
547 #define WI_RID_RTS_THRESH       0xFC83
548
549 /*
550  * TX rate control
551  * 0 == Fixed 1mbps
552  * 1 == Fixed 2mbps
553  * 2 == auto fallback
554  */
555 #define WI_RID_TX_RATE          0xFC84
556
557 /*
558  * promiscuous mode.
559  */
560 #define WI_RID_PROMISC          0xFC85
561
562 /*
563  * Auxiliary Timer tick interval
564  */
565 #define WI_RID_TICK_TIME        0xFCE0
566
567 /*
568  * Information frame types.
569  */
570 #define WI_INFO_NOTIFY          0xF000  /* Handover address */
571 #define WI_INFO_COUNTERS        0xF100  /* Statistics counters */
572 #define WI_INFO_SCAN_RESULTS    0xF101  /* Scan results */
573 #define WI_INFO_LINK_STAT       0xF200  /* Link status */
574 #define WI_INFO_ASSOC_STAT      0xF201  /* Association status */
575
576 /*
577  * Hermes transmit/receive frame structure
578  */
579 struct wi_frame {
580         u_int16_t               wi_status;      /* 0x00 */
581         u_int16_t               wi_rsvd0;       /* 0x02 */
582         u_int16_t               wi_rsvd1;       /* 0x04 */
583         u_int16_t               wi_q_info;      /* 0x06 */
584         u_int16_t               wi_rsvd2;       /* 0x08 */
585         u_int16_t               wi_rsvd3;       /* 0x0A */
586         u_int16_t               wi_tx_ctl;      /* 0x0C */
587         u_int16_t               wi_frame_ctl;   /* 0x0E */
588         u_int16_t               wi_id;          /* 0x10 */
589         u_int8_t                wi_addr1[6];    /* 0x12 */
590         u_int8_t                wi_addr2[6];    /* 0x18 */
591         u_int8_t                wi_addr3[6];    /* 0x1E */
592         u_int16_t               wi_seq_ctl;     /* 0x24 */
593         u_int8_t                wi_addr4[6];    /* 0x26 */
594         u_int16_t               wi_dat_len;     /* 0x2C */
595         u_int8_t                wi_dst_addr[6]; /* 0x2E */
596         u_int8_t                wi_src_addr[6]; /* 0x34 */
597         u_int16_t               wi_len;         /* 0x3A */
598         u_int16_t               wi_dat[3];      /* 0x3C */ /* SNAP header */
599         u_int16_t               wi_type;        /* 0x42 */
600 };
601
602 #define WI_802_3_OFFSET         0x2E
603 #define WI_802_11_OFFSET        0x44
604 #define WI_802_11_OFFSET_RAW    0x3C
605
606 #define WI_STAT_BADCRC          0x0001
607 #define WI_STAT_UNDECRYPTABLE   0x0002
608 #define WI_STAT_ERRSTAT         0x0003
609 #define WI_STAT_MAC_PORT        0x0700
610 #define WI_STAT_1042            0x2000  /* RFC1042 encoded */
611 #define WI_STAT_TUNNEL          0x4000  /* Bridge-tunnel encoded */
612 #define WI_STAT_WMP_MSG         0x6000  /* WaveLAN-II management protocol */
613 #define WI_RXSTAT_MSG_TYPE      0xE000
614
615 #define WI_ENC_TX_802_3         0x00
616 #define WI_ENC_TX_802_11        0x11
617 #define WI_ENC_TX_E_II          0x0E
618
619 #define WI_ENC_TX_1042          0x00
620 #define WI_ENC_TX_TUNNEL        0xF8
621
622 #define WI_TXCNTL_MACPORT       0x00FF
623 #define WI_TXCNTL_STRUCTTYPE    0xFF00
624
625 /*
626  * SNAP (sub-network access protocol) constants for transmission
627  * of IP datagrams over IEEE 802 networks, taken from RFC1042.
628  * We need these for the LLC/SNAP header fields in the TX/RX frame
629  * structure.
630  */
631 #define WI_SNAP_K1              0xaa    /* assigned global SAP for SNAP */
632 #define WI_SNAP_K2              0x00
633 #define WI_SNAP_CONTROL         0x03    /* unnumbered information format */
634 #define WI_SNAP_WORD0           (WI_SNAP_K1 | (WI_SNAP_K1 << 8))
635 #define WI_SNAP_WORD1           (WI_SNAP_K2 | (WI_SNAP_CONTROL << 8))
636 #define WI_SNAPHDR_LEN          0x6