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