1 /* 2 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * Copyright (c) 1997, 1998, 1999 8 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by Bill Paul. 21 * 4. Neither the name of the author nor the names of any co-contributors 22 * may be used to endorse or promote products derived from this software 23 * without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 35 * THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 /* 39 * Hardware specific driver declarations for Lucent and PrismII 40 * chipsets. 41 */ 42 43 #ifndef _SYS_PCWL_H 44 #define _SYS_PCWL_H 45 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 49 50 #include <sys/list.h> 51 52 /* 53 * Encryption controls. We can enable or disable encryption as 54 * well as specify up to 4 encryption keys. We can also specify 55 * which of the four keys will be used for transmit encryption. 56 */ 57 #define WL_RID_ENCRYPTION 0xFC20 58 #define WL_RID_ENCRYPTION_P2 0xFC28 59 #define WL_RID_DEFLT_CRYPT_KEYS 0xFCB0 60 #define WL_RID_CRYPT_KEY0_P2 0xFC24 61 #define WL_RID_TX_CRYPT_KEY 0xFCB1 62 #define WL_RID_TX_CRYPT_KEY_P2 0xFC23 63 #define WL_RID_COMP_IDENT 0xFD20 /* version */ 64 #define WL_RID_WEP_AVAIL 0xFD4F 65 66 #define WL_RID_AUTHTYPE_P2 0xFC2A /* PRISM-II */ 67 #define WL_RID_AUTHTYPE_L 0xFC21 /* 0xFC21 on Lucent */ 68 #define WL_AUTHTYPE_SYS_P2 0x1 69 #define WL_AUTHTYPE_KEY_P2 0x2 70 #define WL_AUTHTYPE_ALL_P2 (WL_AUTHTYPE_SYS_P2 | WL_AUTHTYPE_KEY_P2) 71 72 #define WL_SPEED_1Mbps_P2 0x1 73 #define WL_SPEED_2Mbps_P2 0x2 74 #define WL_SPEED_55Mbps_P2 0x4 75 #define WL_SPEED_11Mbps_P2 0x8 76 77 /* 78 * PrismII Tx rate 79 */ 80 #define WL_P_TX_RATE_FIX_1M WL_SPEED_1Mbps_P2 81 #define WL_P_TX_RATE_FIX_2M WL_SPEED_2Mbps_P2 82 #define WL_P_TX_RATE_FIX_5M WL_SPEED_55Mbps_P2 83 #define WL_P_TX_RATE_FIX_11M WL_SPEED_11Mbps_P2 84 #define WL_P_TX_RATE_AUTO_H \ 85 (WL_SPEED_11Mbps_P2 | WL_SPEED_55Mbps_P2 | \ 86 WL_SPEED_2Mbps_P2 | WL_SPEED_1Mbps_P2) 87 #define WL_P_TX_RATE_AUTO_M \ 88 (WL_SPEED_55Mbps_P2 | WL_SPEED_2Mbps_P2 | \ 89 WL_SPEED_1Mbps_P2) 90 #define WL_P_TX_RATE_AUTO_L \ 91 (WL_SPEED_2Mbps_P2 | WL_SPEED_1Mbps_P2) 92 93 94 #define WL_TIMEOUT 500000 95 96 /* 97 * Default port: 0 (only 0 exists on stations) 98 */ 99 #define WL_DEFAULT_PORT 0 100 101 /* 102 * Lucent TX rate: Default 11Mbps 103 */ 104 #define WL_L_TX_RATE_FIX_1M 1 105 #define WL_L_TX_RATE_FIX_2M 2 106 #define WL_L_TX_RATE_AUTO_H 3 107 #define WL_L_TX_RATE_FIX_5M 4 /* 5.5M */ 108 #define WL_L_TX_RATE_FIX_11M 5 109 #define WL_L_TX_RATE_AUTO_L 6 110 #define WL_L_TX_RATE_AUTO_M 7 111 112 #define WL_TX_RATE_FIX_1M(p) \ 113 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 114 WL_P_TX_RATE_FIX_1M : WL_L_TX_RATE_FIX_1M) 115 #define WL_TX_RATE_FIX_2M(p) \ 116 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 117 WL_P_TX_RATE_FIX_2M : WL_L_TX_RATE_FIX_2M) 118 #define WL_TX_RATE_AUTO_H(p) \ 119 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 120 WL_P_TX_RATE_AUTO_H : WL_L_TX_RATE_AUTO_H) 121 #define WL_TX_RATE_FIX_5M(p) \ 122 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 123 WL_P_TX_RATE_FIX_5M : WL_L_TX_RATE_FIX_5M) 124 #define WL_TX_RATE_FIX_11M(p) \ 125 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 126 WL_P_TX_RATE_FIX_11M : WL_L_TX_RATE_FIX_11M) 127 #define WL_TX_RATE_AUTO_L(p) \ 128 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 129 WL_P_TX_RATE_AUTO_L : WL_L_TX_RATE_AUTO_L) 130 #define WL_TX_RATE_AUTO_M(p) \ 131 (p->pcwl_chip_type == PCWL_CHIP_PRISMII ? \ 132 WL_P_TX_RATE_AUTO_M : WL_L_TX_RATE_AUTO_M) 133 134 /* 135 * Default network name: empty string implies any 136 */ 137 #define WL_DEFAULT_NETNAME ("") 138 #define WL_DEFAULT_NODENAME ("solaris node") 139 #define WL_DEFAULT_AP_DENSITY 1 140 #define WL_DEFAULT_RTS_THRESH 2347 141 #define WL_DEFAULT_DATALEN 2304 142 #define WL_DEFAULT_CREATE_IBSS 0 143 #define WL_DEFAULT_PM_ENABLED 0 144 #define WL_DEFAULT_MAX_SLEEP 100 145 #define WL_DEFAULT_CHAN 3 146 #define WL_DEFAULT_TX_CRYPT_KEY 0 147 148 /* 149 * Size of Hermes I/O space. 150 */ 151 #define WL_IOSIZ 0x40 152 153 /* 154 * Hermes command/status registers. 155 */ 156 #define WL_COMMAND 0x00 157 #define WL_PARAM0 0x02 158 #define WL_PARAM1 0x04 159 #define WL_PARAM2 0x06 160 #define WL_STATUS 0x08 161 #define WL_RESP0 0x0A 162 #define WL_RESP1 0x0C 163 #define WL_RESP2 0x0E 164 165 /* 166 * Command register values. 167 */ 168 #define WL_CMD_BUSY 0x8000 /* busy bit */ 169 #define WL_CMD_INI 0x0000 /* initialize */ 170 #define WL_CMD_ENABLE 0x0001 /* enable */ 171 #define WL_CMD_DISABLE 0x0002 /* disable */ 172 #define WL_CMD_DIAG 0x0003 173 #define WL_CMD_ALLOC_MEM 0x000A /* allocate NIC memory */ 174 #define WL_CMD_TX 0x000B /* transmit */ 175 #define WL_CMD_NOTIFY 0x0010 176 #define WL_CMD_INQUIRE 0x0011 177 #define WL_CMD_ACCESS 0x0021 178 #define WL_CMD_PROGRAM 0x0022 179 180 #define WL_CMD_CODE_MASK 0x003F 181 182 /* 183 * Reclaim qualifier bit, applicable to the 184 * TX and INQUIRE commands. 185 */ 186 #define WL_RECLAIM 0x0100 /* reclaim NIC memory */ 187 188 /* 189 * ACCESS command qualifier bits. 190 */ 191 #define WL_ACCESS_READ 0x0000 192 #define WL_ACCESS_WRITE 0x0100 193 194 /* 195 * PROGRAM command qualifier bits. 196 */ 197 #define WL_PROGRAM_DISABLE 0x0000 198 #define WL_PROGRAM_ENABLE_RAM 0x0100 199 #define WL_PROGRAM_ENABLE_NVRAM 0x0200 200 #define WL_PROGRAM_NVRAM 0x0300 201 202 /* 203 * Status register values 204 */ 205 #define WL_STAT_CMD_CODE 0x003F 206 #define WL_STAT_DIAG_ERR 0x0100 207 #define WL_STAT_INQ_ERR 0x0500 208 #define WL_STAT_CMD_RESULT 0x7F00 209 210 /* 211 * memory handle management registers 212 */ 213 #define WL_INFO_FID 0x10 214 #define WL_RX_FID 0x20 215 #define WL_ALLOC_FID 0x22 216 #define WL_TX_CMP_FID 0x24 217 218 #define WL_INVALID_FID 0xffff 219 220 /* 221 * Buffer Access Path (BAP) registers. 222 * These are I/O channels. you can use each one for 223 * any desired purpose independently of the other. In general 224 * though, we use BAP1 for reading and writing LTV records and 225 * reading received data frames, and BAP0 for writing transmit 226 * frames. This is a convention though, not a rule. 227 * For PrismII chip, frequently overlap between BAP0 and BAP1 228 * may hang the hardware. this is a known bug, so just use BAP1 229 * for PrismII. 230 */ 231 #define WL_SEL0 0x18 232 #define WL_SEL1 0x1A 233 #define WL_OFF0 0x1C 234 #define WL_OFF1 0x1E 235 #define WL_DATA0 0x36 236 #define WL_DATA1 0x38 237 #define WL_BAP0 WL_DATA0 238 #define WL_BAP1 WL_DATA1 239 240 #define WL_OFF_BUSY 0x8000 241 #define WL_OFF_ERR 0x4000 242 #define WL_OFF_DATAOFF 0x0FFF 243 244 /* 245 * Event registers 246 */ 247 #define WL_EVENT_STAT 0x30 /* Event status */ 248 #define WL_INT_EN 0x32 /* Interrupt enable/disable */ 249 #define WL_EVENT_ACK 0x34 /* Ack event */ 250 251 /* 252 * Events 253 */ 254 #define WL_EV_TICK 0x8000 /* aux timer tick */ 255 #define WL_EV_RES 0x4000 /* controller h/w error (time out) */ 256 #define WL_EV_INFO_DROP 0x2000 /* no RAM to build unsolicited frame */ 257 #define WL_EV_NO_CARD 0x0800 /* card removed (hunh?) */ 258 #define WL_EV_DUIF_RX 0x0400 /* wavelan management packet received */ 259 #define WL_EV_INFO 0x0080 /* async info frame */ 260 #define WL_EV_CMD 0x0010 /* command completed */ 261 #define WL_EV_ALLOC 0x0008 /* async alloc/reclaim completed */ 262 #define WL_EV_TX_EXC 0x0004 /* async xmit completed with failure */ 263 #define WL_EV_TX 0x0002 /* async xmit completed succesfully */ 264 #define WL_EV_RX 0x0001 /* async rx completed */ 265 266 #define WL_EV_ALL 0xffff /* all events */ 267 #define WL_INTRS \ 268 (WL_EV_RX|WL_EV_TX|WL_EV_TX_EXC|WL_EV_ALLOC|WL_EV_INFO|WL_EV_INFO_DROP) 269 270 /* 271 * Host software registers 272 */ 273 #define WL_SW0 0x28 274 #define WL_SW1 0x2A 275 #define WL_SW2 0x2C 276 #define WL_SW3 0x2E 277 278 #define WL_CNTL 0x14 279 280 #define WL_CNTL_AUX_ENA 0xC000 281 #define WL_CNTL_AUX_ENA_STAT 0xC000 282 #define WL_CNTL_AUX_DIS_STAT 0x0000 283 #define WL_CNTL_AUX_ENA_CNTL 0x8000 284 #define WL_CNTL_AUX_DIS_CNTL 0x4000 285 286 #define WL_AUX_PAGE 0x3A 287 #define WL_AUX_OFFSET 0x3C 288 #define WL_AUX_DATA 0x3E 289 290 #define WL_RID_DNLD_BUF 0xFD01 291 292 /* 293 * Mem sizes (0xFD02). 294 */ 295 #define WL_RID_MEMSZ 0xFD02 296 #define WL_RID_FWIDENT_P2 0xFD02 297 298 /* 299 * NIC Identification (0xFD0B). 300 */ 301 #define WL_RID_CARD_ID 0xFD0B 302 303 typedef struct pcwl_ltv_ver { 304 uint16_t wl_compid; 305 uint16_t wl_variant; 306 uint16_t wl_major; 307 uint16_t wl_minor; 308 } pcwl_ltv_ver_t; 309 310 #define WL_RID_FWVER 0xFFFF 311 typedef struct pcwl_ltv_fwver { 312 uint16_t pri[7]; 313 uint16_t st[7]; 314 } pcwl_ltv_fwver_t; 315 316 #define WI_NIC_EVB2 0x8000 317 #define WI_NIC_HWB3763 0x8001 318 #define WI_NIC_HWB3163 0x8002 319 #define WI_NIC_HWB3163B 0x8003 320 #define WI_NIC_EVB3 0x8004 321 #define WI_NIC_HWB1153 0x8007 322 #define WI_NIC_P2_SST 0x8008 /* Prism2 with SST flush */ 323 #define WI_NIC_PRISM2_5 0x800C 324 #define WI_NIC_3874A 0x8013 /* Prism2.5 Mini-PCI */ 325 326 /* 327 * List of intended regulatory domains (0xFD11). 328 */ 329 #define WL_RID_DOMAINS 0xFD11 330 /* 331 * CIS struct (0xFD13). 332 */ 333 #define WL_RID_CIS 0xFD13 334 335 /* 336 * Current MAC port connection status 337 */ 338 #define WL_RID_PORTSTATUS 0xFD40 339 #define WL_PORT_DISABLED 1 340 #define WL_PORT_INITIAL 2 341 #define WL_PORT_TO_IBSS 3 342 #define WL_PORT_TO_BSS 4 343 #define WL_PORT_OOR 5 344 #define WL_PORT_RADIO_OFF 7 /* only for miniPci */ 345 346 /* 347 * Current Service Set the station is connected to 348 */ 349 #define WL_RID_SSID 0xFD41 350 351 /* 352 * MAC address used as identifier of the BSS the station 353 * is connected to 354 */ 355 #define WL_RID_BSSID 0xFD42 356 357 /* 358 * Communications quality (0xFD43). 359 */ 360 #define WL_RID_COMMQUAL 0xFD43 361 362 /* 363 * Actual system scale thresholds (0xFD46). 364 */ 365 #define WL_RID_SYSTEM_SCALE 0xFC06 366 367 /* 368 * Actual current transmission rate 369 */ 370 #define WL_RID_CUR_TX_RATE 0xFD44 371 372 /* 373 * Connection control characteristics. 374 * 1 == Basic Service Set (BSS), a.k.a IEEE 802.11 Infrastructure 375 * 2 == Wireless Distribudion System (WDS), Access Point only 376 * 3 == Pseudo IBSS / Ad Hoc 377 */ 378 #define WL_RID_PORTTYPE 0xFC00 379 #define WL_PORTTYPE_BSS 0x1 380 #define WL_PORTTYPE_WDS 0x2 381 #define WL_PORTTYPE_ADHOC 0x3 382 383 /* 384 * Mac addresses. 385 */ 386 #define WL_RID_MAC_NODE 0xFC01 387 #define WL_RID_MAC_WDS 0xFC08 388 389 /* 390 * Station set identification (SSID). 391 */ 392 #define WL_RID_DESIRED_SSID 0xFC02 393 #define WL_RID_OWN_SSID 0xFC04 394 395 /* 396 * Set communications channel (radio frequency). 397 */ 398 #define WL_RID_OWN_CHNL 0xFC03 399 #define WL_RID_CURRENT_CHNL 0xFDC1 400 401 /* 402 * Frame data size. 403 */ 404 #define WL_RID_MAX_DATALEN 0xFC07 405 406 /* 407 * ESS power management enable 408 */ 409 #define WL_RID_PM_ENABLED 0xFC09 410 411 /* 412 * ESS max PM sleep internal 413 */ 414 #define WL_RID_MAX_SLEEP 0xFC0C 415 416 /* 417 * Set our station name. 418 */ 419 #define WL_RID_NODENAME 0xFC0E 420 421 /* 422 * Multicast addresses to be put in filter. We're 423 * allowed up to 16 addresses in the filter. 424 */ 425 #define WL_RID_MCAST 0xFC80 426 427 /* 428 * Create IBSS. 429 */ 430 #define WL_RID_CREATE_IBSS 0xFC81 431 432 #define WL_RID_FRAG_THRESH 0xFC82 433 #define WL_RID_RTS_THRESH 0xFC83 434 435 /* 436 * TX rate control 437 * 0 == Fixed 1mbps 438 * 1 == Fixed 2mbps 439 * 2 == auto fallback 440 */ 441 #define WL_RID_TX_RATE 0xFC84 442 443 /* 444 * promiscuous mode. 445 */ 446 #define WL_RID_PROMISC 0xFC85 447 448 /* 449 * scan ssid 450 */ 451 #define WL_RID_SCAN_SSID 0xFCB2 452 453 /* 454 * Auxiliary Timer tick interval 455 */ 456 #define WL_RID_TICK_TIME 0xFCE0 457 458 /* 459 * PrismII scan 460 */ 461 #define WL_RID_SCAN_REQUEST 0xFCE1 462 #define WL_RID_HSCAN_REQUEST 0xFCE5 463 464 /* 465 * Information frame types. 466 */ 467 #define WL_INFO_NOTIFY 0xF000 /* Handover address */ 468 #define WL_INFO_COUNTERS 0xF100 /* Statistics counters */ 469 #define WL_INFO_SCAN_RESULTS 0xF101 /* Scan results */ 470 #define WL_INFO_HSCAN_RESULTS 0xF103 /* HostScan results */ 471 #define WL_INFO_LINK_STAT 0xF200 /* Link status */ 472 #define WL_INFO_ASSOC_STAT 0xF201 /* Association status */ 473 474 /* 475 * Link status 476 */ 477 #define WL_LINK_CONNECT 1 478 #define WL_LINK_DISCONNECT 2 479 #define WL_LINK_AP_CR 3 /* AP change */ 480 #define WL_LINK_AP_OOR 4 /* AP out of range */ 481 #define WL_LINK_AP_IR 5 /* AP in range */ 482 483 typedef struct wl_scan_result { 484 uint16_t wl_srt_chid; /* bss channel id */ 485 uint16_t wl_srt_anl; /* noise level */ 486 uint16_t wl_srt_sl; /* signal level */ 487 uint8_t wl_srt_bssid[6]; /* mac address of the bss */ 488 uint16_t wl_srt_bcnint; /* bss beacon interval */ 489 uint16_t wl_srt_cap; /* bss capability */ 490 491 uint16_t wl_srt_ssidlen; /* ssid name length */ 492 char wl_srt_ssid[32]; /* ssid */ 493 494 uint16_t wl_srt_suprates[5]; /* supported rates */ 495 uint16_t wl_srt_rate; /* actual data rate of the probe */ 496 uint16_t wl_srt_atim; 497 } wl_scan_result_t; 498 499 #define WL_SRT_MAX_NUM 32 /* max number of scan result stored */ 500 #define WL_SCAN_TIMEOUT_MAX 30 /* seconds after which the scan item ages */ 501 #define WL_SCAN_AGAIN_THRESHOLD 5 /* threshold below which card scan again */ 502 #define WL_MAX_SCAN_TIMES 2 /* max scan times per scan command */ 503 504 typedef struct wl_scan_list { 505 wl_scan_result_t wl_val; 506 uint32_t wl_timeout; 507 list_node_t wl_scan_node; 508 } wl_scan_list_t; 509 510 #define WL_FTYPE_MGMT 0x0000 511 #define WL_FTYPE_CTL 0x0004 512 #define WL_FTYPE_DATA 0x0008 513 514 /* 515 * SNAP (sub-network access protocol) constants for transmission 516 * of IP datagrams over IEEE 802 networks, taken from RFC1042. 517 * We need these for the LLC/SNAP header fields in the TX/RX frame 518 * structure. 519 */ 520 #define WL_SNAP_K1 0xaa /* assigned global SAP for SNAP */ 521 #define WL_SNAP_K2 0x00 522 #define WL_SNAP_CONTROL 0x03 /* unnumbered information format */ 523 #define WL_SNAP_WORD0 (WL_SNAP_K1 | (WL_SNAP_K1 << 8)) 524 #define WL_SNAP_WORD1 (WL_SNAP_K2 | (WL_SNAP_CONTROL << 8)) 525 #define WL_SNAPHDR_LEN 0x6 526 527 /* 528 * Hermes transmit/receive frame structure 529 */ 530 typedef struct wl_frame { 531 uint16_t wl_status; /* 0x00 */ 532 uint16_t wl_rsvd0; /* 0x02 */ 533 uint16_t wl_rsvd1; /* 0x04 */ 534 uint16_t wl_q_info; /* 0x06 */ 535 uint16_t wl_rsvd2; /* 0x08 */ 536 uint16_t wl_rsvd3; /* 0x0A */ 537 uint16_t wl_tx_ctl; /* 0x0C */ 538 uint16_t wl_frame_ctl; /* 0x0E */ 539 uint16_t wl_id; /* 0x10 */ 540 uint8_t wl_addr1[6]; /* 0x12 */ 541 uint8_t wl_addr2[6]; /* 0x18 */ 542 uint8_t wl_addr3[6]; /* 0x1E */ 543 uint16_t wl_seq_ctl; /* 0x24 */ 544 uint8_t wl_addr4[6]; /* 0x26 */ 545 uint16_t wl_dat_len; /* 0x2C */ 546 547 uint8_t wl_dst_addr[6]; /* 0x2E */ 548 uint8_t wl_src_addr[6]; /* 0x34 */ 549 uint16_t wl_len; /* 0x3A */ 550 uint16_t wl_dat[3]; /* 0x3C */ /* SNAP header */ 551 uint16_t wl_type; /* 0x42 */ 552 } wl_frame_t; 553 554 static wl_frame_t wl_frame_default = { 555 0, /* wl_status 0x00 */ 556 0, /* wl_rsvd0 0x02 */ 557 0, /* wl_rsvd1 0x04 */ 558 0, /* wl_q_info 0x06 */ 559 0, /* wl_rsvd2 0x08 */ 560 0, /* wl_rsvd3 0x0A */ 561 0, /* wl_tx_ctl 0x0C */ 562 WL_FTYPE_DATA, /* wl_frame_ctl 0x0E */ 563 0, /* wl_id 0x10 */ 564 { 0, 0, 0, 0, 0, 0 }, /* wl_addr1[6] 0x12 */ 565 { 0, 0, 0, 0, 0, 0 }, /* wl_addr2[6] 0x18 */ 566 { 0, 0, 0, 0, 0, 0 }, /* wl_addr3[6] 0x1E */ 567 0, /* wl_seq_ctl 0x24 */ 568 { 0, 0, 0, 0, 0, 0 }, /* wl_addr4[6] 0x26 */ 569 (uint16_t)-WL_SNAPHDR_LEN, /* wl_dat_len 0x2C */ 570 571 { 0, 0, 0, 0, 0, 0 }, /* wl_dst_addr[6] 0x2E */ 572 { 0, 0, 0, 0, 0, 0 }, /* wl_src_addr[6] 0x34 */ 573 (uint16_t)-WL_SNAPHDR_LEN, /* wl_len 0x3A */ 574 { WL_SNAP_WORD0, 575 WL_SNAP_WORD1, 0 }, /* wl_dat[3] 0x3C */ /* SNAP header */ 576 0 /* wl_type 0x42 */ 577 }; 578 579 #define MLEN(mp) ((mp)->b_wptr - (mp)->b_rptr) 580 #define ETH_HDRLEN (sizeof (struct ether_header)) 581 #define WL_802_3_HDRLEN 0x2E 582 #define WL_802_11_HDRLEN 0x44 583 #define WL_802_11_RAW_HDRLEN 0x3C 584 585 #define WL_STAT_BADCRC 0x0001 586 #define WL_STAT_UNDECRYPTABLE 0x0002 587 #define WL_STAT_ERRSTAT 0x0003 588 #define WL_STAT_MAC_PORT 0x0700 589 #define WL_STAT_1042 0x2000 /* RFC1042 encoded */ 590 #define WL_STAT_TUNNEL 0x4000 /* Bridge-tunnel encoded */ 591 #define WL_STAT_WMP_MSG 0x6000 /* WaveLAN-II management protocol */ 592 #define WL_RXSTAT_MSG_TYPE 0xE000 593 594 #define WL_ENC_TX_802_3 0x00 595 #define WL_ENC_TX_802_11 0x11 596 #define WL_ENC_TX_E_II 0x0E 597 598 #define WL_ENC_TX_1042 0x00 599 #define WL_ENC_TX_TUNNEL 0xF8 600 601 #define WL_TXCNTL_MACPORT 0x00FF 602 #define WL_TXCNTL_STRUCTTYPE 0xFF00 603 #define WL_TXCNTL_TXOK 0x2 604 #define WL_TXCNTL_TXEX 0x4 605 #define WL_TXCNTL_SET (WL_TXCNTL_TXOK | WL_TXCNTL_TXEX) 606 607 typedef struct rf_ckey { 608 uint16_t ckey_len; 609 uint8_t ckey_dat[14]; 610 } rf_ckey_t; 611 612 /* 613 * Configurable parameters of the RF interface 614 * All the info here is passed to the card through PIO. 615 */ 616 typedef struct pcwl_rf { 617 uint16_t rf_max_datalen; 618 uint16_t rf_create_ibss; 619 uint16_t rf_porttype; 620 uint16_t rf_rts_thresh; 621 uint16_t rf_tx_rate; 622 uint16_t rf_system_scale; 623 uint16_t rf_pm_enabled; 624 uint16_t rf_max_sleep; 625 uint16_t rf_own_chnl; 626 uint16_t rf_port_no; 627 char rf_own_ssid[34]; 628 char rf_desired_ssid[34]; 629 char rf_nodename[34]; 630 uint16_t rf_promiscuous; 631 uint16_t rf_encryption; /* use encryption? */ 632 uint16_t rf_authtype; /* prism2 only */ 633 uint16_t rf_tx_crypt_key; 634 rf_ckey_t rf_ckeys[4]; 635 } pcwl_rf_t; 636 637 #define PCWL_MCAST_ENTSHIFT 4 638 #define PCWL_MCAST_ENTRIES (1 << PCWL_MCAST_ENTSHIFT) 639 #define PCWL_MCBUF_LEN (ETHERADDRL << PCWL_MCAST_ENTSHIFT) 640 #define PCWL_MCBUF_WORDS (PCWL_MCBUF_LEN >> 1) 641 642 typedef enum { 643 WLC_TX_UNICAST_FRAMES, /* 0+ */ 644 WLC_TX_MULTICAST_FRAMES, /* 1+ */ 645 WLC_TX_FRAGMENTS, /* 2+ */ 646 WLC_TX_UNICAST_OCTETS, /* 3+ */ 647 WLC_TX_MULTICAST_OCTETS, /* 4 */ 648 WLC_TX_DEFERRED_XMITS, /* 5+ */ 649 WLC_TX_SINGLE_RETRIES, /* 6+ */ 650 WLC_TX_MULTI_RETRIES, /* 7+ */ 651 WLC_TX_RETRY_LIMIT, /* 8+ */ 652 WLC_TX_DISCARDS, /* 9+ */ 653 WLC_RX_UNICAST_FRAMES, /* 10+ */ 654 WLC_RX_MULTICAST_FRAMES, /* 11+ */ 655 WLC_RX_FRAGMENTS, /* 12+ */ 656 WLC_RX_UNICAST_OCTETS, /* 13+ */ 657 WLC_RX_MULTICAST_OCTETS, /* 14 */ 658 WLC_RX_FCS_ERRORS, /* 15+ */ 659 WLC_RX_DISCARDS_NOBUF, /* 16+ */ 660 WLC_TX_DISCARDS_WRONG_SA, /* 17+ */ 661 WLC_RX_WEP_CANT_DECRYPT, /* 18+ */ 662 WLC_RX_MSG_IN_MSG_FRAGS, /* 19+ */ 663 WLC_RX_MSG_IN_BAD_MSG_FRAGS, /* 20+ */ 664 WLC_STAT_CNT /* 21 - keep it as the last entry */ 665 } pcwl_cntr_offset; 666 667 #define WL_XMT_BUF_NUM 8 668 typedef struct wl_tx_ring_data { 669 uint16_t wl_tx_fids[WL_XMT_BUF_NUM]; 670 uint16_t wl_tx_ring[WL_XMT_BUF_NUM]; 671 int wl_tx_prod; 672 int wl_tx_cons; 673 kmutex_t wl_tx_lock; /* for send only */ 674 } pcwl_txring_t; 675 676 #define PCWL_DEVICE_PCI 0 677 #define PCWL_DEVICE_PCCARD 1 678 679 /* 680 * The macinfo is really used as the softstate structure. 681 * 682 * pcwl_mh - mac_handle_t structure 683 * pcwl_cslock - lock for card services request. Used with pcwl_cscv 684 * pcwl_cscv - condition variable to wait for card events 685 * pcwl_chdl - client handle, an uint32_t bit mask encoding for socket, 686 * function, and client info. 687 * See cs_priv.h MAKE_CLIENT_HANDLE. 688 * pcwl_log_sock - holds the logical to physical translation for this card. 689 * Specifically has physical adapter and socket #. 690 * Socket # is the same as part of the pcwl_chdl encoding. 691 * Physical adapter # is from card service socket impl. 692 */ 693 typedef struct pcwl_macinfo { 694 mac_handle_t pcwl_mh; 695 dev_info_t *pcwl_dip; 696 int pcwl_device_type; /* pci or pcmcia card */ 697 kmutex_t pcwl_cslock; /* for card services */ 698 kcondvar_t pcwl_cscv; /* for card services */ 699 client_handle_t pcwl_chdl; /* s,f,c encoding, cs_priv.h */ 700 map_log_socket_t pcwl_log_sock; /* logical/phys socket map */ 701 702 int pcwl_socket; /* socket number */ 703 int pcwl_config_hi; /* cfttbl index */ 704 int pcwl_config; /* default config index */ 705 int pcwl_vcc; /* vcc level */ 706 int pcwl_iodecode; /* # of address lines */ 707 int pcwl_chip_type; /* Lucent or Prism-II */ 708 709 uint8_t pcwl_mac_addr[ETHERADDRL]; 710 uint8_t pcwl_bssid[ETHERADDRL]; 711 uint16_t pcwl_has_wep; /* has encryption capability */ 712 uint32_t pcwl_flag; 713 uint32_t pcwl_reschedule_need; 714 pcwl_rf_t pcwl_rf; /* RF interface parameters */ 715 716 uint16_t pcwl_dmem_id; /* nic mem id for tx buffer */ 717 uint16_t pcwl_mgmt_id; /* nic mem id for mgmt buffer */ 718 pcwl_txring_t pcwl_txring; 719 720 uint16_t pcwl_mcast[PCWL_MCBUF_WORDS]; /* MC filters */ 721 722 kmutex_t pcwl_scanlist_lock; /* scanlist lock */ 723 kmutex_t pcwl_glock; /* generic lock */ 724 725 caddr_t pcwl_bar; /* for pci device only */ 726 ddi_acc_handle_t pcwl_handle; 727 caddr_t pcwl_cfg_base; 728 ddi_acc_handle_t pcwl_cfg_handle; 729 730 ddi_acc_handle_t pcwl_port; /* for pcmcia device only */ 731 732 ddi_iblock_cookie_t pcwl_ib_cookie; 733 ddi_softintr_t pcwl_softint_id; /* pcwl_intr soft intr id */ 734 735 uint16_t pcwl_cntrs_t[WLC_STAT_CNT]; 736 uint64_t pcwl_cntrs_s[WLC_STAT_CNT]; 737 uint64_t pcwl_noxmtbuf; 738 timeout_id_t pcwl_scanlist_timeout_id; 739 list_t pcwl_scan_list; 740 uint16_t pcwl_scan_num; 741 uint16_t pcwl_rssi; 742 timeout_id_t pcwl_connect_timeout_id; 743 } pcwl_maci_t; 744 745 #define PCWL_IDENT_STRING modldrv.drv_linkinfo 746 #define PCWL_CHIP_LUCENT 0 747 #define PCWL_CHIP_PRISMII 1 748 #define HDL(pcwl_p) ((pcwl_p)->pcwl_port) 749 #define GLD3(pcwl_p) ((pcwl_p)->pcwl_mh) 750 #define DIP(pcwl_p) ((pcwl_p)->pcwl_dip) 751 #define RF(pcwl_p) (&(pcwl_p)->pcwl_rf) 752 753 #define PCWL_CARD_INTREN 0x1 754 #define PCWL_SOFTINTR 0x2 /* high level and soft intr enabled */ 755 #define PCWL_CARD_LINKUP 0x4 /* link status of the STA */ 756 #define PCWL_CARD_GSTAT 0x8 757 #define PCWL_ATTACHED 0x10 758 #define PCWL_CS_REGISTERED 0x20 759 #define PCWL_ENABLED 0x40 760 #define PCWL_CARD_READY 0x80 761 #define PCWL_CARD_FAILED 0x100 762 #define PCWL_CARD_INTR 0x200 763 #define PCWL_CARD_PLUMBED 0x400 764 #define PCWL_CARD_SUSPEND 0x800 765 766 #define PCWL_STATE_IDLE 0x1 767 768 #define PCWL_NICMEM_SZ (2048) /* 80211MTU set as 1500, so 2k here */ 769 770 static int pcwl_probe(dev_info_t *dip); 771 static int pcwl_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); 772 static int pcwl_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); 773 774 static int pcwl_register_cs(dev_info_t *dip, pcwl_maci_t *pcwl_p); 775 static void pcwl_unregister_cs(pcwl_maci_t *pcwl_p); 776 static void pcwl_destroy_locks(pcwl_maci_t *pcwl_p); 777 static int pcwl_reset_backend(pcwl_maci_t *pcwl_p); 778 static int pcwl_get_cap(pcwl_maci_t *pcwl_p); 779 static int pcwl_card_insert(pcwl_maci_t *pcwl_p); 780 static int pcwl_ev_hdlr(event_t ev, int pri, event_callback_args_t *arg); 781 static void pcwl_card_remove(pcwl_maci_t *pcwl_p); 782 static int pcwl_init_nicmem(pcwl_maci_t *pcwl_p); 783 784 /* 785 * high level device access primitives, glock must held before calling 786 */ 787 static uint16_t pcwl_set_cmd(pcwl_maci_t *pcwl_p, uint16_t mode, uint16_t type); 788 static uint16_t pcwl_set_ch(pcwl_maci_t *, uint16_t, uint16_t, uint16_t); 789 static uint16_t pcwl_get_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, 790 uint16_t *val_p); 791 static uint16_t pcwl_put_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, 792 uint16_t *val_p); 793 static uint16_t pcwl_fil_ltv(pcwl_maci_t *pcwl_p, uint16_t len, uint16_t type, 794 uint16_t val); 795 static uint16_t pcwl_put_str(pcwl_maci_t *pcwl_p, uint16_t type, char *str_p); 796 static uint16_t pcwl_rdch0(pcwl_maci_t *pcwl_p, uint16_t type, uint16_t off, 797 uint16_t *buf_p, int len, int order); 798 static uint16_t pcwl_wrch1(pcwl_maci_t *pcwl_p, uint16_t type, uint16_t off, 799 uint16_t *buf_p, int len, int order); 800 static int pcwl_config_rf(pcwl_maci_t *pcwl_p); 801 static int pcwl_loaddef_rf(pcwl_maci_t *pcwl_p); 802 static void pcwl_start_locked(pcwl_maci_t *pcwl_p); 803 static void pcwl_stop_locked(pcwl_maci_t *pcwl_p); 804 static int pcwl_saddr_locked(pcwl_maci_t *pcwl_p); 805 static uint16_t pcwl_alloc_nicmem(pcwl_maci_t *pcwl_p, uint16_t len, 806 uint16_t *id_p); 807 static void pcwl_chip_type(pcwl_maci_t *pcwl_p); 808 809 /* 810 * Required driver entry points for mac 811 */ 812 static int pcwl_start(void *); 813 static void pcwl_stop(void *); 814 static int pcwl_saddr(void *, const uint8_t *); 815 static mblk_t *pcwl_tx(void *, mblk_t *); 816 static int pcwl_send(pcwl_maci_t *, mblk_t *); 817 static int pcwl_prom(void *, boolean_t); 818 static int pcwl_gstat(void *, uint_t, uint64_t *); 819 static int pcwl_sdmulti(void *, boolean_t, const uint8_t *); 820 static void pcwl_ioctl(void *, queue_t *, mblk_t *); 821 822 static uint_t pcwl_intr(caddr_t arg); 823 static uint_t pcwl_intr_hi(caddr_t arg); 824 static void pcwl_rcv(pcwl_maci_t *pcwl_p); 825 static uint32_t pcwl_txdone(pcwl_maci_t *pcwl_p); 826 static void pcwl_infodone(pcwl_maci_t *pcwl_p); 827 static void pcwl_ssid_scan(pcwl_maci_t *, uint16_t, uint16_t, uint16_t); 828 829 /* 830 * prototypes of the function for wifi ioctl 831 */ 832 static int pcwl_cfg_essid(mblk_t *, pcwl_maci_t *, uint32_t); 833 static int pcwl_cfg_bssid(mblk_t *, pcwl_maci_t *, uint32_t); 834 static int pcwl_cfg_scan(mblk_t *, pcwl_maci_t *, uint32_t); 835 static int pcwl_cfg_linkstatus(mblk_t *, pcwl_maci_t *, uint32_t); 836 static int pcwl_cfg_bsstype(mblk_t *, pcwl_maci_t *, uint32_t); 837 static int pcwl_cfg_phy(mblk_t *, pcwl_maci_t *, uint32_t); 838 static int pcwl_cfg_desiredrates(mblk_t *, pcwl_maci_t *, uint32_t); 839 static int pcwl_cfg_supportrates(mblk_t *, pcwl_maci_t *, uint32_t); 840 static int pcwl_cfg_powermode(mblk_t *, pcwl_maci_t *, uint32_t); 841 static int pcwl_cfg_authmode(mblk_t *, pcwl_maci_t *, uint32_t); 842 static int pcwl_cfg_encryption(mblk_t *, pcwl_maci_t *, uint32_t); 843 static int pcwl_cfg_wepkeyid(mblk_t *, pcwl_maci_t *, uint32_t); 844 static int pcwl_cfg_createibss(mblk_t *, pcwl_maci_t *, uint32_t); 845 static int pcwl_cfg_rssi(mblk_t *, pcwl_maci_t *, uint32_t); 846 static int pcwl_cfg_radio(mblk_t *, pcwl_maci_t *, uint32_t); 847 static int pcwl_cfg_wepkey(mblk_t *, pcwl_maci_t *, uint32_t); 848 static void pcwl_wlan_ioctl(pcwl_maci_t *, queue_t *, mblk_t *, uint32_t); 849 static int pcwl_getset(mblk_t *, pcwl_maci_t *, uint32_t); 850 851 static void pcwl_scanlist_timeout(void *); 852 static void pcwl_delete_scan_item(pcwl_maci_t *, wl_scan_list_t *); 853 static int pcwl_add_scan_item(pcwl_maci_t *, wl_scan_result_t); 854 static void pcwl_get_rssi(pcwl_maci_t *); 855 static void pcwl_connect_timeout(void *arg); 856 857 #define RDCH0(h, t, o, b_p, l) pcwl_rdch0(h, t, o, b_p, l, 1) 858 #define WRCH1(h, t, o, b_p, l) pcwl_wrch1(h, t, o, b_p, l, 1) 859 #define RDPKT(h, t, o, b_p, l) pcwl_rdch0(h, t, o, b_p, l, 0) 860 #define WRPKT(h, t, o, b_p, l) pcwl_wrch1(h, t, o, b_p, l, 0) 861 862 #define FIL_LTV(pcwl_p, len, type, val) \ 863 (void) pcwl_fil_ltv(pcwl_p, len, type, val) 864 #define PUT_LTV(pcwl_p, len, type, v_p) \ 865 (void) pcwl_put_ltv(pcwl_p, len, type, v_p) 866 #define PUT_STR(pcwl_p, type, str_p) \ 867 (void) pcwl_put_str(pcwl_p, type, str_p) 868 869 #define PCWL_READ(p, o, v) { \ 870 if (p->pcwl_device_type == PCWL_DEVICE_PCI) { \ 871 uint16_t t = ddi_get16(p->pcwl_handle, \ 872 (uint16_t *)(p->pcwl_bar + 2*(o))); \ 873 v = LE_16(t); \ 874 } else { \ 875 uint16_t t = csx_Get16(HDL(p), o); \ 876 v = LE_16(t); \ 877 }\ 878 } 879 #define PCWL_WRITE(p, o, v) { \ 880 if (p->pcwl_device_type == PCWL_DEVICE_PCI) { \ 881 ddi_put16(p->pcwl_handle, \ 882 (uint16_t *)(p->pcwl_bar + 2*(o)), LE_16(v)); \ 883 } else { \ 884 csx_Put16(HDL(p), o, LE_16(v)); \ 885 }\ 886 } 887 #define PCWL_READ_P(p, o, v, h) { \ 888 if (p->pcwl_device_type == PCWL_DEVICE_PCI) { \ 889 uint16_t t = ddi_get16(p->pcwl_handle, \ 890 (uint16_t *)(p->pcwl_bar + 2*(o))); \ 891 *(v) = h ? LE_16(t) : t; \ 892 } else { \ 893 uint16_t t = csx_Get16(HDL(p), o); \ 894 *(v) = h ? LE_16(t) : t; \ 895 }\ 896 } 897 #define PCWL_WRITE_P(p, o, v, h) { \ 898 if (p->pcwl_device_type == PCWL_DEVICE_PCI) { \ 899 ddi_put16(p->pcwl_handle, (uint16_t *)(p->pcwl_bar + 2*(o)), \ 900 h ? LE_16(*(v)) : (*(v))); \ 901 } else {\ 902 csx_Put16(HDL(p), o, h ? LE_16(*(v)) : (*(v))); \ 903 }\ 904 } 905 906 #ifdef _BIG_ENDIAN 907 #define PCWL_SWAP16(buf_p, len) { \ 908 int pcwl_swap_len = len; \ 909 for (pcwl_swap_len = (pcwl_swap_len + 1) >> 1; pcwl_swap_len; ) { \ 910 uint16_t val; \ 911 pcwl_swap_len--; \ 912 val = *((uint16_t *)(buf_p) + pcwl_swap_len); \ 913 *((uint16_t *)(buf_p) + pcwl_swap_len) = LE_16(val); \ 914 } \ 915 } 916 #else /* _BIG_ENDIAN */ 917 #define PCWL_SWAP16(buf_p, len) 918 #endif /* _BIG_ENDIAN */ 919 920 #define PCWL_ENABLE_INTR(pcwl_p) {\ 921 PCWL_WRITE(pcwl_p, WL_INT_EN, WL_INTRS);\ 922 } 923 #define PCWL_DISABLE_INTR(pcwl_p) { \ 924 PCWL_WRITE(pcwl_p, WL_INT_EN, 0); \ 925 PCWL_WRITE(pcwl_p, WL_EVENT_ACK, 0xffff);\ 926 } 927 928 /* 929 * 16-bit driver private status code 930 */ 931 #define PCWL_SUCCESS 0x0 932 #define PCWL_FAIL 0x1 933 #define PCWL_TIMEDOUT_CMD 0x10 934 #define PCWL_TIMEDOUT_ACCESS 0x11 935 #define PCWL_TIMEDOUT_TARGET 0x12 936 #define PCWL_BADLEN 0x13 937 #define PCWL_BADTYPE 0x14 938 #define PCWL_TIMEDOUT_ALLOC 0x15 939 #define PCWL_FAILURE_CMD 0x16 940 941 #define PCWL_STATUS_MAX 0xffff 942 #define N_PCWL 2 943 944 #ifdef __cplusplus 945 } 946 #endif 947 948 #endif /* _SYS_PCWL_H */