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