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 #ifndef _SYS_PCAN_H 40 #define _SYS_PCAN_H 41 42 #ifdef __cplusplus 43 extern "C" { 44 #endif 45 46 #define AN_TIMEOUT 600000 47 48 /* 49 * Size of Aironet I/O space. 50 */ 51 #define AN_IOSIZ 0x40 52 53 #define PCAN_DEVICE_PCI 0x100 54 #define PCAN_DEVICE_PCCARD 0x200 55 56 /* 57 * Hermes register definitions and what little I know about them. 58 */ 59 60 /* 61 * Hermes command/status registers. 62 */ 63 #define AN_COMMAND(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x00 : 0x00) 64 #define AN_PARAM0(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x04 : 0x02) 65 #define AN_PARAM1(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x08 : 0x04) 66 #define AN_PARAM2(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x0c : 0x06) 67 #define AN_STATUS(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x10 : 0x08) 68 #define AN_RESP0(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x14 : 0x0A) 69 #define AN_RESP1(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x18 : 0x0C) 70 #define AN_RESP2(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x1c : 0x0E) 71 #define AN_LINKSTAT(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x20 : 0x10) 72 73 /* 74 * Command register 75 */ 76 #define AN_CMD_BUSY 0x8000 /* busy bit */ 77 #define AN_CMD_NO_ACK 0x0080 /* don't acknowledge command */ 78 #define AN_CMD_CODE_MASK 0x003F 79 #define AN_CMD_QUAL_MASK 0x7F00 80 81 /* 82 * Command codes 83 */ 84 #define AN_CMD_NOOP 0x0000 /* no-op */ 85 #define AN_CMD_ENABLE 0x0001 /* enable */ 86 #define AN_CMD_DISABLE 0x0002 /* disable */ 87 #define AN_CMD_FORCE_SYNCLOSS 0x0003 /* force loss of sync */ 88 #define AN_CMD_FW_RESTART 0x0004 /* firmware resrart */ 89 #define AN_CMD_HOST_SLEEP 0x0005 90 #define AN_CMD_MAGIC_PKT 0x0006 91 #define AN_CMD_READCFG 0x0008 92 #define AN_CMD_ALLOC_MEM 0x000A /* allocate NIC memory */ 93 #define AN_CMD_TX 0x000B /* transmit */ 94 #define AN_CMD_DEALLOC_MEM 0x000C 95 #define AN_CMD_NOOP2 0x0010 96 #define AN_CMD_ALLOC_DESC 0x0020 97 #define AN_CMD_ACCESS 0x0021 98 #define AN_CMD_ALLOC_BUF 0x0028 99 #define AN_CMD_PSP_NODES 0x0030 100 #define AN_CMD_SET_PHYREG 0x003E 101 #define AN_CMD_TX_TEST 0x003F 102 #define AN_CMD_SLEEP 0x0085 103 #define AN_CMD_SCAN 0x0103 104 #define AN_CMD_SAVECFG 0x0108 105 106 /* 107 * Reclaim qualifier bit, applicable to the 108 * TX command. 109 */ 110 #define AN_RECLAIM 0x0100 /* reclaim NIC memory */ 111 112 /* 113 * MPI 350 DMA descriptor information 114 */ 115 #define AN_DESCRIPTOR_TX 0x01 116 #define AN_DESCRIPTOR_RX 0x02 117 #define AN_DESCRIPTOR_TXCMP 0x04 118 #define AN_DESCRIPTOR_HOSTWRITE 0x08 119 #define AN_DESCRIPTOR_HOSTREAD 0x10 120 #define AN_DESCRIPTOR_HOSTRW 0x20 121 122 #define AN_MAX_RX_DESC 1 123 #define AN_MAX_TX_DESC 1 124 #define AN_HOSTBUFSIZ 1840 125 126 /* 127 * dma descriptor definition for miniPci card. 128 * the miniPci card only works on x86. 129 */ 130 struct an_card_rid_desc 131 { 132 uint32_t an_rid:16; 133 uint32_t an_len:15; 134 uint32_t an_valid:1; 135 uint64_t an_phys; 136 }; 137 138 struct an_card_rx_desc 139 { 140 uint32_t an_ctrl:15; 141 uint32_t an_done:1; 142 uint32_t an_len:15; 143 uint32_t an_valid:1; 144 uint64_t an_phys; 145 }; 146 147 struct an_card_tx_desc 148 { 149 uint32_t an_offset:15; 150 uint32_t an_eoc:1; 151 uint32_t an_len:15; 152 uint32_t an_valid:1; 153 uint64_t an_phys; 154 }; 155 156 #define AN_MAX_DATALEN 4096 157 #define AN_RID_BUFFER_SIZE AN_MAX_DATALEN 158 #define AN_RX_BUFFER_SIZE AN_HOSTBUFSIZ 159 #define AN_TX_BUFFER_SIZE AN_HOSTBUFSIZ 160 #define AN_HOST_DESC_OFFSET 0x800 161 #define AN_RX_DESC_OFFSET (AN_HOST_DESC_OFFSET + \ 162 sizeof (struct an_card_rid_desc)) 163 #define AN_TX_DESC_OFFSET (AN_RX_DESC_OFFSET + \ 164 (AN_MAX_RX_DESC * sizeof (struct an_card_rx_desc))) 165 166 /* 167 * ACCESS command qualifier bits. 168 */ 169 #define AN_ACCESS_READ 0x0000 170 #define AN_ACCESS_WRITE 0x0100 171 172 /* 173 * PROGRAM command qualifier bits. 174 */ 175 #define AN_PROGRAM_DISABLE 0x0000 176 #define AN_PROGRAM_ENABLE_RAM 0x0100 177 #define AN_PROGRAM_ENABLE_NVRAM 0x0200 178 #define AN_PROGRAM_NVRAM 0x0300 179 180 /* 181 * Status register values 182 */ 183 #define AN_STAT_CMD_CODE 0x003F 184 #define AN_STAT_CMD_RESULT 0x7F00 185 186 /* 187 * Linkstat register 188 */ 189 #define AN_LINKSTAT_ASSOCIATED 0x0400 190 #define AN_LINKSTAT_AUTHFAIL 0x0300 191 #define AN_LINKSTAT_ASSOC_FAIL 0x8400 /* (low byte is reason code) */ 192 #define AN_LINKSTAT_DISASSOC 0x8200 /* (low byte is reason code) */ 193 #define AN_LINKSTAT_DEAUTH 0x8100 /* (low byte is reason code) */ 194 #define AN_LINKSTAT_SYNCLOST_TSF 0x8004 195 #define AN_LINKSTAT_SYNCLOST_HOSTREQ 0x8003 196 #define AN_LINKSTAT_SYNCLOST_AVGRETRY 0x8002 197 #define AN_LINKSTAT_SYNCLOST_MAXRETRY 0x8001 198 #define AN_LINKSTAT_SYNCLOST_MISSBEACON 0x8000 199 200 /* 201 * Link stat low byte reason code 202 */ 203 #define AN_LINKSTAT_RC_RESERVED 0 /* Reserved return code */ 204 #define AN_LINKSTAT_RC_NOREASON 1 /* Unspecified reason */ 205 #define AN_LINKSTAT_RC_AUTHINV 2 /* Prev auth invalid */ 206 #define AN_LINKSTAT_RC_DEAUTH 3 /* Deauth due sender leaving */ 207 #define AN_LINKSTAT_RC_NOACT 4 /* Disassociated due inactivity */ 208 #define AN_LINKSTAT_RC_MAXLOAD 5 /* Disassociated due 2many stations */ 209 /* 210 * Class 2 frame received from non-Authenticated station 211 */ 212 #define AN_LINKSTAT_RC_BADCLASS2 6 213 /* 214 * Class 3 frame received from non-Associated station 215 */ 216 #define AN_LINKSTAT_RC_BADCLASS3 7 217 /* 218 * Disassociated because sending station is leaving BSS 219 */ 220 #define AN_LINKSTAT_RC_STATLEAVE 8 221 /* 222 * Station requesting (Re)Association not Authenticated w/responding station 223 */ 224 #define AN_LINKSTAT_RC_NOAUTH 9 225 226 /* 227 * memory handle management registers 228 */ 229 #define AN_RX_FID 0x20 230 #define AN_ALLOC_FID 0x22 231 #define AN_TX_CMP_FID(p) \ 232 (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x1a : 0x24) 233 234 #define AN_INVALID_FID 0xffff /* invalid fid value */ 235 236 /* 237 * Buffer Access Path (BAP) registers. 238 * These are I/O channels. I believe you can use each one for 239 * any desired purpose independently of the other. In general 240 * though, we use BAP1 for reading and writing LTV records and 241 * reading received data frames, and BAP0 for writing transmit 242 * frames. This is a convention though, not a rule. 243 */ 244 #define AN_SEL0 0x18 245 #define AN_SEL1 0x1A 246 #define AN_OFF0 0x1C 247 #define AN_OFF1 0x1E 248 #define AN_DATA0 0x36 249 #define AN_DATA1 0x38 250 #define AN_BAP0 AN_DATA0 251 #define AN_BAP1 AN_DATA1 252 253 #define AN_OFF_BUSY 0x8000 254 #define AN_OFF_ERR 0x4000 255 #define AN_OFF_DONE 0x2000 256 #define AN_OFF_DATAOFF 0x0FFF 257 258 /* 259 * Event registers 260 */ 261 #define AN_EVENT_STAT(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x60 : 0x30) 262 /* 263 * Interrupt enable/disable 264 */ 265 #define AN_INT_EN(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x64 : 0x32) 266 #define AN_EVENT_ACK(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x68 : 0x34) 267 268 /* 269 * Events - AN_EVENT_ACK register only 270 */ 271 #define AN_EV_CLR_STUCK_BUSY 0x4000 /* clear stuck busy bit */ 272 #define AN_EV_WAKEREQUEST 0x2000 /* awaken from PSP mode */ 273 /* Events shared by all 3 event regs: */ 274 #define AN_EV_MIC 0x1000 /* Message Integrity Check */ 275 #define AN_EV_AWAKE 0x0100 /* station woke up from PSP mode */ 276 #define AN_EV_LINKSTAT 0x0080 /* link status available */ 277 #define AN_EV_CMD 0x0010 /* command completed */ 278 #define AN_EV_ALLOC 0x0008 /* async alloc/reclaim completed */ 279 #define AN_EV_TX_EXC 0x0004 /* async xmit completed with failure */ 280 #define AN_EV_TX 0x0002 /* async xmit completed succesfully */ 281 #define AN_EV_RX 0x0001 /* async rx completed */ 282 #define AN_EV_TX_CPY 0x0400 283 284 #define AN_EV_ALL 0xffff /* all events */ 285 #define AN_INTRS(p) \ 286 (p->pcan_device_type == PCAN_DEVICE_PCI ? \ 287 (AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC|AN_EV_LINKSTAT|AN_EV_MIC \ 288 |AN_EV_TX_CPY) : \ 289 (AN_EV_RX|AN_EV_TX|AN_EV_TX_EXC|AN_EV_ALLOC|AN_EV_LINKSTAT|AN_EV_MIC)) 290 291 /* 292 * Host software registers 293 */ 294 #define AN_SW0(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x50 : 0x28) 295 #define AN_SW1(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x54 : 0x2A) 296 #define AN_SW2(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x58 : 0x2C) 297 #define AN_SW3(p) (p->pcan_device_type == PCAN_DEVICE_PCI ? 0x5c : 0x2E) 298 299 #define AN_CNTL 0x14 300 301 #define AN_CNTL_AUX_ENA 0xC000 302 #define AN_CNTL_AUX_ENA_STAT 0xC000 303 #define AN_CNTL_AUX_DIS_STAT 0x0000 304 #define AN_CNTL_AUX_ENA_CNTL 0x8000 305 #define AN_CNTL_AUX_DIS_CNTL 0x4000 306 307 #define AN_AUX_PAGE 0x3A 308 #define AN_AUX_OFFSET 0x3C 309 #define AN_AUX_DATA 0x3E 310 311 struct an_ltv_gen { 312 uint16_t an_len; 313 uint16_t an_type; 314 uint16_t an_val; 315 }; 316 317 /* 318 * General configuration information. 319 */ 320 #define AN_RID_GENCONFIG 0xFF10 321 struct an_ltv_genconfig { 322 uint16_t an_len; /* 0x00 */ 323 uint16_t an_opmode; /* 0x02 */ 324 uint16_t an_rxmode; /* 0x04 */ 325 uint16_t an_fragthresh; /* 0x06 */ 326 uint16_t an_rtsthresh; /* 0x08 */ 327 uint8_t an_macaddr[6]; /* 0x0A */ 328 uint8_t an_rates[8]; /* 0x10 */ 329 uint16_t an_shortretry_limit; /* 0x18 */ 330 uint16_t an_longretry_limit; /* 0x1A */ 331 uint16_t an_tx_msdu_lifetime; /* 0x1C */ 332 uint16_t an_rx_msdu_lifetime; /* 0x1E */ 333 uint16_t an_stationary; /* 0x20 */ 334 uint16_t an_ordering; /* 0x22 */ 335 uint16_t an_devtype; /* 0x24 */ 336 uint16_t an_rsvd0[5]; /* 0x26 */ 337 /* 338 * Scanning associating. 339 */ 340 uint16_t an_scanmode; /* 0x30 */ 341 uint16_t an_probedelay; /* 0x32 */ 342 uint16_t an_probe_energy_timeout; /* 0x34 */ 343 uint16_t an_probe_response_timeout; /* 0x36 */ 344 uint16_t an_beacon_listen_timeout; /* 0x38 */ 345 uint16_t an_ibss_join_net_timeout; /* 0x3A */ 346 uint16_t an_auth_timeout; /* 0x3C */ 347 uint16_t an_authtype; /* 0x3E */ 348 uint16_t an_assoc_timeout; /* 0x40 */ 349 uint16_t an_specified_ap_timeout; /* 0x42 */ 350 uint16_t an_offline_scan_interval; /* 0x44 */ 351 uint16_t an_offline_scan_duration; /* 0x46 */ 352 uint16_t an_link_loss_delay; /* 0x48 */ 353 uint16_t an_max_beacon_lost_time; /* 0x4A */ 354 uint16_t an_refresh_interval; /* 0x4C */ 355 uint16_t an_rsvd1; /* 0x4E */ 356 /* 357 * Power save operation 358 */ 359 uint16_t an_psave_mode; /* 0x50 */ 360 uint16_t an_sleep_for_dtims; /* 0x52 */ 361 uint16_t an_listen_interval; /* 0x54 */ 362 uint16_t an_fast_listen_interval; /* 0x56 */ 363 uint16_t an_listen_decay; /* 0x58 */ 364 uint16_t an_fast_listen_decay; /* 0x5A */ 365 uint16_t an_rsvd2[2]; /* 0x5C */ 366 /* 367 * Ad-hoc (or AP) operation. 368 */ 369 uint16_t an_beacon_period; /* 0x60 */ 370 uint16_t an_atim_duration; /* 0x62 */ 371 uint16_t an_rsvd3; /* 0x64 */ 372 uint16_t an_ds_channel; /* 0x66 */ 373 uint16_t an_rsvd4; /* 0x68 */ 374 uint16_t an_dtim_period; /* 0x6A */ 375 uint16_t an_rsvd5[2]; /* 0x6C */ 376 /* 377 * Radio operation. 378 */ 379 uint16_t an_radiotype; /* 0x70 */ 380 uint16_t an_diversity; /* 0x72 */ 381 uint16_t an_tx_power; /* 0x74 */ 382 uint16_t an_rss_thresh; /* 0x76 */ 383 uint16_t an_rsvd6[4]; /* 0x78 */ 384 /* 385 * Aironet extensions. 386 */ 387 uint8_t an_nodename[16]; /* 0x80 */ 388 uint16_t an_arl_thresh; /* 0x90 */ 389 uint16_t an_arl_decay; /* 0x92 */ 390 uint16_t an_arl_delay; /* 0x94 */ 391 uint8_t an_rsvd7; /* 0x96 */ 392 uint8_t an_rsvd8; /* 0x97 */ 393 uint8_t an_magic_packet_action; /* 0x98 */ 394 uint8_t an_magic_packet_ctl; /* 0x99 */ 395 uint16_t an_auto_wake; /* 0x9A */ 396 uint16_t an_pad[20]; 397 }; 398 399 #define AN_OPMODE_IBSS_ADHOC 0x0000 400 #define AN_OPMODE_INFR_STATION 0x0001 401 #define AN_OPMODE_AP 0x0002 402 #define AN_OPMODE_AP_REPEATER 0x0003 403 #define AN_OPMODE_UNMODIFIED_PAYLOAD 0x0100 404 #define AN_OPMODE_AIRONET_EXTENSIONS 0x0200 405 #define AN_OPMODE_AP_EXTENSIONS 0x0400 406 407 #define AN_RXMODE_BC_MC_ADDR 0x0000 408 #define AN_RXMODE_BC_ADDR 0x0001 409 #define AN_RXMODE_ADDR 0x0002 410 #define AN_RXMODE_80211_MONITOR_CURBSS 0x0003 411 #define AN_RXMODE_80211_MONITOR_ANYBSS 0x0004 412 #define AN_RXMODE_LAN_MONITOR_CURBSS 0x0005 413 #define AN_RXMODE_NO_8023_HEADER 0x0100 414 #define AN_RXMODE_USE_8023_HEADER 0x0000 415 416 #define AN_RATE_1MBPS 0x0002 417 #define AN_RATE_2MBPS 0x0004 418 #define AN_RATE_5_5MBPS 0x000B 419 #define AN_RATE_11MBPS 0x0016 420 421 #define AN_DEVTYPE_PC4500 0x0065 422 #define AN_DEVTYPE_PC4800 0x006D 423 424 #define AN_SCANMODE_ACTIVE 0x0000 425 #define AN_SCANMODE_PASSIVE 0x0001 426 #define AN_SCANMODE_AIRONET_ACTIVE 0x0002 427 428 #define AN_AUTHTYPE_NONE 0x0000 429 #define AN_AUTHTYPE_OPEN 0x0001 430 #define AN_AUTHTYPE_SHAREDKEY 0x0002 431 #define AN_AUTHTYPE_EXCLUDE_UNENCRYPTED 0x0004 432 #define AN_AUTHTYPE_ENABLEWEP 0x0100 433 #define AN_AUTHTYPE_ALLOW_UNENCRYPTED 0x0200 434 435 #define AN_PSAVE_NONE 0x0000 436 #define AN_PSAVE_CAM 0x0001 437 #define AN_PSAVE_PSP 0x0002 438 #define AN_PSAVE_PSP_CAM 0x0003 439 440 #define AN_RADIOTYPE_80211_FH 0x0001 441 #define AN_RADIOTYPE_80211_DS 0x0002 442 #define AN_RADIOTYPE_LM2000_DS 0x0004 443 444 #define AN_DIVERSITY_FACTORY_DEFAULT 0x0000 445 #define AN_DIVERSITY_ANTENNA_1_ONLY 0x0001 446 #define AN_DIVERSITY_ANTENNA_2_ONLY 0x0002 447 #define AN_DIVERSITY_ANTENNA_1_AND_2 0x0003 448 449 #define AN_TXPOWER_FACTORY_DEFAULT 0x0000 450 #define AN_TXPOWER_50MW 50 451 #define AN_TXPOWER_100MW 100 452 #define AN_TXPOWER_250MW 250 453 454 /* 455 * Valid SSID list. You can specify up to three SSIDs denoting 456 * the service sets that you want to join. The first SSID always 457 * defaults to "tsunami" which is a handy way to detect the 458 * card. 459 */ 460 #define AN_RID_SSIDLIST 0xFF11 461 struct an_ltv_ssidlist { 462 uint16_t an_len; 463 uint16_t an_ssid1_len; 464 char an_ssid1[32]; 465 uint16_t an_ssid2_len; 466 char an_ssid2[32]; 467 uint16_t an_ssid3_len; 468 char an_ssid3[32]; 469 uint8_t an_pad[748]; 470 }; 471 472 #define AN_DEF_SSID_LEN 7 473 #define AN_DEF_SSID "tsunami" 474 475 /* 476 * Valid AP list. 477 */ 478 #define AN_RID_APLIST 0xFF12 479 struct an_ltv_aplist { 480 uint16_t an_len; 481 uint8_t an_ap1[6]; 482 uint8_t an_ap2[6]; 483 uint8_t an_ap3[6]; 484 uint8_t an_ap4[6]; 485 }; 486 487 /* 488 * Driver name. 489 */ 490 #define AN_RID_DRVNAME 0xFF13 491 struct an_ltv_drvname { 492 uint16_t an_len; 493 uint8_t an_drvname[16]; 494 }; 495 496 /* 497 * Frame encapsulation. 498 */ 499 #define AN_RID_ENCAP 0xFF14 500 struct an_rid_encap { 501 uint16_t an_len; 502 uint16_t an_ethertype_default; 503 uint16_t an_action_default; 504 uint16_t an_ethertype0; 505 uint16_t an_action0; 506 uint16_t an_ethertype1; 507 uint16_t an_action1; 508 uint16_t an_ethertype2; 509 uint16_t an_action2; 510 uint16_t an_ethertype3; 511 uint16_t an_action3; 512 uint16_t an_ethertype4; 513 uint16_t an_action4; 514 uint16_t an_ethertype5; 515 uint16_t an_action5; 516 uint16_t an_ethertype6; 517 uint16_t an_action6; 518 }; 519 520 #define AN_ENCAP_ACTION_RX 0x0001 521 #define AN_ENCAP_ACTION_TX 0x0002 522 523 #define AN_RXENCAP_NONE 0x0000 524 #define AN_RXENCAP_RFC1024 0x0001 525 526 #define AN_TXENCAP_RFC1024 0x0000 527 #define AN_TXENCAP_80211 0x0002 528 529 #define AN_RID_WEPKEY 0xFF15 530 #define AN_RID_WEPKEY2 0xFF16 531 struct an_ltv_wepkey { 532 uint16_t an_len; 533 uint16_t an_index; 534 uint8_t an_macaddr[6]; 535 uint16_t an_keylen; /* WEP40: 5, WEP128: 13 bytes */ 536 uint8_t an_key[16]; /* key value */ 537 }; 538 539 #define AN_RID_CRYPT 0xFF18 540 struct an_ltv_crypt { 541 uint16_t an_operation; /* 0: enable 1: disable */ 542 uint8_t an_optionmask[2]; /* 1: WEP40 2: WEP128 */ 543 uint8_t an_filler[8]; /* put struct 6 bytes longer */ 544 }; 545 546 /* 547 * Actual config, same structure as general config (read only). 548 */ 549 #define AN_RID_ACTUALCFG 0xFF20 550 551 /* 552 * Card capabilities (read only). 553 */ 554 #define AN_RID_CAPABILITIES 0xFF00 555 struct an_ltv_caps { 556 uint16_t an_len; 557 uint8_t an_oui[3]; /* 0x02 */ 558 uint8_t an_pad0; /* 0x05 */ 559 uint16_t an_prodnum; /* 0x06 */ 560 uint8_t an_manufname[32]; /* 0x08 */ 561 uint8_t an_prodname[16]; /* 0x28 */ 562 uint8_t an_prodvers[8]; /* 0x38 */ 563 uint8_t an_oemaddr[6]; /* 0x40 */ 564 uint8_t an_aironetaddr[6]; /* 0x46 */ 565 uint16_t an_radiotype; /* 0x4C */ 566 uint16_t an_country; /* 0x4E */ 567 uint8_t an_callid[6]; /* 0x50 */ 568 uint8_t an_supported_rates[8]; /* 0x56 */ 569 uint8_t an_rx_diversity; /* 0x5E */ 570 uint8_t an_tx_diversity; /* 0x5F */ 571 uint16_t an_tx_powerlevels[8]; /* 0x60 */ 572 uint16_t an_hwver; /* 0x70 */ 573 uint16_t an_hwcaps; /* 0x72 */ 574 uint16_t an_temprange; /* 0x74 */ 575 uint16_t an_fwrev; /* 0x76 */ 576 uint16_t an_fwsubrev; /* 0x78 */ 577 uint16_t an_interfacerev; /* 0x7A */ 578 uint16_t an_softcap; /* 0x7C */ 579 uint16_t an_bootblockrev; /* 0x7E */ 580 uint16_t an_requiredhw; /* 0x80 */ 581 uint16_t an_pad; 582 }; 583 584 /* 585 * Access point (read only) 586 */ 587 #define AN_RID_APINFO 0xFF01 588 struct an_ltv_apinfo { 589 uint16_t an_len; 590 uint16_t an_tim_addr; 591 uint16_t an_airo_addr; 592 }; 593 594 /* 595 * Radio info (read only). 596 */ 597 #define AN_RID_RADIOINFO 0xFF02 598 struct an_ltv_radioinfo { 599 uint16_t an_len; 600 /* 601 * some more fields here, waiting for freebsd code update. 602 */ 603 }; 604 605 /* 606 * Status (read only). Note: the manual claims this RID is 108 bytes 607 * long (0x6A is the last datum, which is 2 bytes long) however when 608 * this RID is read from the NIC, it returns a length of 110. To be 609 * on the safe side, this structure is padded with an extra 16-bit 610 * word. (There is a misprint in the manual which says the macaddr 611 * field is 8 bytes long.) 612 * 613 * Also, the channel_set and current_channel fields appear to be 614 * reversed. Either that, or the hop_period field is unused. 615 */ 616 #define AN_RID_STATUS 0xFF50 617 struct an_ltv_status { 618 uint16_t an_len; 619 uint8_t an_macaddr[6]; /* 0x02 */ 620 uint16_t an_opmode; /* 0x08 */ 621 uint16_t an_errcode; /* 0x0A */ 622 uint16_t an_cur_signal_quality; /* 0x0C */ 623 uint16_t an_ssidlen; /* 0x0E */ 624 uint8_t an_ssid[32]; /* 0x10 */ 625 uint8_t an_ap_name[16]; /* 0x30 */ 626 uint8_t an_cur_bssid[6]; /* 0x40 */ 627 uint8_t an_prev_bssid1[6]; /* 0x46 */ 628 uint8_t an_prev_bssid2[6]; /* 0x4C */ 629 uint8_t an_prev_bssid3[6]; /* 0x52 */ 630 uint16_t an_beacon_period; /* 0x58 */ 631 uint16_t an_dtim_period; /* 0x5A */ 632 uint16_t an_atim_duration; /* 0x5C */ 633 uint16_t an_hop_period; /* 0x5E */ 634 uint16_t an_channel_set; /* 0x60 */ 635 uint16_t an_cur_channel; /* 0x62 */ 636 uint16_t an_hops_to_backbone; /* 0x64 */ 637 uint16_t an_ap_total_load; /* 0x66 */ 638 uint16_t an_our_generated_load; /* 0x68 */ 639 uint16_t an_accumulated_arl; /* 0x6A */ 640 uint16_t an_signale_quality; /* 0x6C */ 641 uint16_t an_cur_tx_rate; /* 0x6E */ 642 uint16_t an_ap_device; /* 0x70 */ 643 uint16_t an_normallized_rssi; /* 0x72 */ 644 uint16_t an_short_preamble; /* 0x74 */ 645 uint8_t an_ap_ip_address[4]; /* 0x76 */ 646 uint8_t an_noise_pct; /* 0x7A */ 647 uint8_t an_noise_dbm; /* 0x7B */ 648 uint8_t an_noise_average_pct; /* 0x7C */ 649 uint8_t an_noise_average_dbm; /* 0x7D */ 650 uint8_t an_noise_max_pct; /* 0x7E */ 651 uint8_t an_noise_max_dbm; /* 0x7F */ 652 uint16_t an_load; /* 0x80 */ 653 uint8_t an_carrier[4]; /* 0x82 */ 654 uint16_t an_assoc_status; /* 0x86 */ 655 uint16_t an_pad; 656 }; 657 658 #define AN_STATUS_OPMODE_CONFIGURED 0x0001 659 #define AN_STATUS_OPMODE_MAC_ENABLED 0x0002 660 #define AN_STATUS_OPMODE_RX_ENABLED 0x0004 661 #define AN_STATUS_OPMODE_IN_SYNC 0x0010 662 #define AN_STATUS_OPMODE_ASSOCIATED 0x0020 663 #define AN_STATUS_OPMODE_ERROR 0x8000 664 665 666 /* 667 * Statistics 668 */ 669 #define AN_RID_16BITS_CUM 0xFF60 /* Cumulative 16-bit stats counters */ 670 #define AN_RID_16BITS_DELTA 0xFF61 /* 16-bit stats (since last clear) */ 671 #define AN_RID_16BITS_DELTACLR 0xFF62 /* 16-bit stats, clear on read */ 672 #define AN_RID_32BITS_CUM 0xFF68 /* Cumulative 32-bit stats counters */ 673 #define AN_RID_32BITS_DELTA 0xFF69 /* 32-bit stats (since last clear) */ 674 #define AN_RID_32BITS_DELTACLR 0xFF6A /* 32-bit stats, clear on read */ 675 676 /* 677 * Grrr. The manual says the statistics record is 384 bytes in length, 678 * but the card says the record is 404 bytes. There's some padding left 679 * at the end of this structure to account for any discrepancies. 680 */ 681 struct an_ltv_stats { 682 uint16_t an_len; 683 uint16_t an_rx_overruns; /* 0x02 */ 684 uint16_t an_rx_plcp_csum_errs; /* 0x04 */ 685 uint16_t an_rx_plcp_format_errs; /* 0x06 */ 686 uint16_t an_rx_plcp_len_errs; /* 0x08 */ 687 uint16_t an_rx_mac_crc_errs; /* 0x0A */ 688 uint16_t an_rx_mac_crc_ok; /* 0x0C */ 689 uint16_t an_rx_wep_errs; /* 0x0E */ 690 uint16_t an_rx_wep_ok; /* 0x10 */ 691 uint16_t an_retry_long; /* 0x12 */ 692 uint16_t an_retry_short; /* 0x14 */ 693 uint16_t an_retry_max; /* 0x16 */ 694 uint16_t an_no_ack; /* 0x18 */ 695 uint16_t an_no_cts; /* 0x1A */ 696 uint16_t an_rx_ack_ok; /* 0x1C */ 697 uint16_t an_rx_cts_ok; /* 0x1E */ 698 uint16_t an_tx_ack_ok; /* 0x20 */ 699 uint16_t an_tx_rts_ok; /* 0x22 */ 700 uint16_t an_tx_cts_ok; /* 0x24 */ 701 uint16_t an_tx_lmac_mcasts; /* 0x26 */ 702 uint16_t an_tx_lmac_bcasts; /* 0x28 */ 703 uint16_t an_tx_lmac_ucast_frags; /* 0x2A */ 704 uint16_t an_tx_lmac_ucasts; /* 0x2C */ 705 uint16_t an_tx_beacons; /* 0x2E */ 706 uint16_t an_rx_beacons; /* 0x30 */ 707 uint16_t an_tx_single_cols; /* 0x32 */ 708 uint16_t an_tx_multi_cols; /* 0x34 */ 709 uint16_t an_tx_defers_no; /* 0x36 */ 710 uint16_t an_tx_defers_prot; /* 0x38 */ 711 uint16_t an_tx_defers_energy; /* 0x3A */ 712 uint16_t an_rx_dups; /* 0x3C */ 713 uint16_t an_rx_partial; /* 0x3E */ 714 uint16_t an_tx_too_old; /* 0x40 */ 715 uint16_t an_rx_too_old; /* 0x42 */ 716 uint16_t an_lostsync_max_retries; /* 0x44 */ 717 uint16_t an_lostsync_missed_beacons; /* 0x46 */ 718 uint16_t an_lostsync_arl_exceeded; /* 0x48 */ 719 uint16_t an_lostsync_deauthed; /* 0x4A */ 720 uint16_t an_lostsync_disassociated; /* 0x4C */ 721 uint16_t an_lostsync_tsf_timing; /* 0x4E */ 722 uint16_t an_tx_host_mcasts; /* 0x50 */ 723 uint16_t an_tx_host_bcasts; /* 0x52 */ 724 uint16_t an_tx_host_ucasts; /* 0x54 */ 725 uint16_t an_tx_host_failed; /* 0x56 */ 726 uint16_t an_rx_host_mcasts; /* 0x58 */ 727 uint16_t an_rx_host_bcasts; /* 0x5A */ 728 uint16_t an_rx_host_ucasts; /* 0x5C */ 729 uint16_t an_rx_host_discarded; /* 0x5E */ 730 uint16_t an_tx_hmac_mcasts; /* 0x60 */ 731 uint16_t an_tx_hmac_bcasts; /* 0x62 */ 732 uint16_t an_tx_hmac_ucasts; /* 0x64 */ 733 uint16_t an_tx_hmac_failed; /* 0x66 */ 734 uint16_t an_rx_hmac_mcasts; /* 0x68 */ 735 uint16_t an_rx_hmac_bcasts; /* 0x6A */ 736 uint16_t an_rx_hmac_ucasts; /* 0x6C */ 737 uint16_t an_rx_hmac_discarded; /* 0x6E */ 738 uint16_t an_tx_hmac_accepted; /* 0x70 */ 739 uint16_t an_ssid_mismatches; /* 0x72 */ 740 uint16_t an_ap_mismatches; /* 0x74 */ 741 uint16_t an_rates_mismatches; /* 0x76 */ 742 uint16_t an_auth_rejects; /* 0x78 */ 743 uint16_t an_auth_timeouts; /* 0x7A */ 744 uint16_t an_assoc_rejects; /* 0x7C */ 745 uint16_t an_assoc_timeouts; /* 0x7E */ 746 uint16_t an_reason_outside_table; /* 0x80 */ 747 uint16_t an_reason1; /* 0x82 */ 748 uint16_t an_reason2; /* 0x84 */ 749 uint16_t an_reason3; /* 0x86 */ 750 uint16_t an_reason4; /* 0x88 */ 751 uint16_t an_reason5; /* 0x8A */ 752 uint16_t an_reason6; /* 0x8C */ 753 uint16_t an_reason7; /* 0x8E */ 754 uint16_t an_reason8; /* 0x90 */ 755 uint16_t an_reason9; /* 0x92 */ 756 uint16_t an_reason10; /* 0x94 */ 757 uint16_t an_reason11; /* 0x96 */ 758 uint16_t an_reason12; /* 0x98 */ 759 uint16_t an_reason13; /* 0x9A */ 760 uint16_t an_reason14; /* 0x9C */ 761 uint16_t an_reason15; /* 0x9E */ 762 uint16_t an_reason16; /* 0xA0 */ 763 uint16_t an_reason17; /* 0xA2 */ 764 uint16_t an_reason18; /* 0xA4 */ 765 uint16_t an_reason19; /* 0xA6 */ 766 uint16_t an_rx_mgmt_pkts; /* 0xA8 */ 767 uint16_t an_tx_mgmt_pkts; /* 0xAA */ 768 uint16_t an_rx_refresh_pkts; /* 0xAC */ 769 uint16_t an_tx_refresh_pkts; /* 0xAE */ 770 uint16_t an_rx_poll_pkts; /* 0xB0 */ 771 uint16_t an_tx_poll_pkts; /* 0xB2 */ 772 uint16_t an_host_retries; /* 0xB4 */ 773 uint16_t an_lostsync_hostreq; /* 0xB6 */ 774 uint16_t an_host_tx_bytes; /* 0xB8 */ 775 uint16_t an_host_rx_bytes; /* 0xBA */ 776 uint16_t an_uptime_usecs; /* 0xBC */ 777 uint16_t an_uptime_secs; /* 0xBE */ 778 uint16_t an_lostsync_better_ap; /* 0xC0 */ 779 uint16_t an_privacy_mismatch; /* 0xC2 */ 780 uint16_t an_jammed; /* 0xC4 */ 781 uint16_t an_rx_disc_wep_off; /* 0xC6 */ 782 uint16_t an_phy_ele_mismatch; /* 0xC8 */ 783 uint16_t an_leap_success; /* 0xCA */ 784 uint16_t an_leap_failure; /* 0xCC */ 785 uint16_t an_leap_timeouts; /* 0xCE */ 786 uint16_t an_leap_keylen_fail; /* 0xD0 */ 787 }; 788 789 #define AN_RID_ESSIDLIST_FIRST 0xFF72 790 #define AN_RID_ESSIDLIST_NEXT 0xFF73 791 792 struct an_ltv_scanresult { 793 uint16_t an_len; 794 uint16_t an_index; 795 uint16_t an_radiotype; 796 uint8_t an_bssid[6]; 797 #ifdef _BIG_ENDIAN 798 uint8_t an_ssidlen; 799 uint8_t an_zero; 800 #else 801 uint8_t an_zero; 802 uint8_t an_ssidlen; 803 #endif 804 char an_ssid[32]; 805 uint16_t an_rssi; 806 uint16_t an_cap; 807 uint16_t an_beaconinterval; 808 uint8_t an_rates[8]; 809 struct { 810 uint16_t dwell; 811 uint8_t hopset; 812 uint8_t hoppattern; 813 uint8_t hopindex; 814 uint8_t pad; 815 } an_fh; 816 uint16_t an_dschannel; 817 uint16_t an_atimwindow; 818 }; 819 820 /* 821 * seconds after which the scan item ages 822 */ 823 #define AN_SCAN_TIMEOUT_MAX 30 824 825 /* 826 * threshold of scan result items below which scan will run again. 827 */ 828 #define AN_SCAN_AGAIN_THRESHOLD 5 829 830 typedef struct an_scan_list { 831 struct an_ltv_scanresult an_val; 832 uint32_t an_timeout; 833 list_node_t an_scan_node; 834 } an_scan_list_t; 835 836 /* 837 * Receive frame structure. 838 */ 839 typedef struct an_rxframe { 840 uint32_t an_rx_time; /* 0x00 */ 841 uint16_t an_rx_status; /* 0x04 */ 842 uint16_t an_rx_payload_len; /* 0x06 */ 843 uint8_t an_rsvd0; /* 0x08 */ 844 uint8_t an_rx_signal_strength; /* 0x09 */ 845 uint8_t an_rx_rate; /* 0x0A */ 846 uint8_t an_rx_chan; /* 0x0B */ 847 uint8_t an_rx_assoc_cnt; /* 0x0C */ 848 uint8_t an_rsvd1[3]; /* 0x0D */ 849 uint8_t an_plcp_hdr[4]; /* 0x10 */ 850 uint16_t an_frame_ctl; /* 0x14 */ 851 uint16_t an_duration; /* 0x16 */ 852 uint8_t an_addr1[6]; /* 0x18 */ 853 uint8_t an_addr2[6]; /* 0x1E */ 854 uint8_t an_addr3[6]; /* 0x24 */ 855 uint16_t an_seq_ctl; /* 0x2A */ 856 uint8_t an_addr4[6]; /* 0x2C */ 857 uint16_t an_gaplen; /* 0x32 */ 858 } an_rxfrm_t; 859 860 #define AN_RXGAP_MAX 8 861 862 /* 863 * Transmit frame structure. 864 */ 865 typedef struct an_txframe { 866 uint32_t an_tx_sw; /* 0x00 */ 867 uint16_t an_tx_status; /* 0x04 */ 868 uint16_t an_tx_payload_len; /* 0x06 */ 869 uint16_t an_tx_ctl; /* 0x08 */ 870 uint16_t an_tx_assoc_id; /* 0x0A */ 871 uint16_t an_tx_retry; /* 0x0C */ 872 uint8_t an_tx_assoc_cnt; /* 0x0E */ 873 uint8_t an_tx_rate; /* 0x0F */ 874 uint8_t an_tx_max_long_retries; /* 0x10 */ 875 uint8_t an_tx_max_short_retries; /* 0x11 */ 876 uint8_t an_rsvd0[2]; /* 0x12 */ 877 uint16_t an_frame_ctl; /* 0x14 */ 878 uint16_t an_duration; /* 0x16 */ 879 uint8_t an_addr1[6]; /* 0x18 */ 880 uint8_t an_addr2[6]; /* 0x1E */ 881 uint8_t an_addr3[6]; /* 0x24 */ 882 uint16_t an_seq_ctl; /* 0x2A */ 883 uint8_t an_addr4[6]; /* 0x2C */ 884 uint16_t an_gaplen; /* 0x32 */ 885 } an_txfrm_t; 886 887 typedef struct an_frame { 888 union { 889 an_rxfrm_t rxfrm; 890 an_txfrm_t txfrm; 891 } frm; 892 } an_frm_t; 893 894 #define AN_TXSTAT_EXCESS_RETRY 0x0002 895 #define AN_TXSTAT_LIFE_EXCEEDED 0x0004 896 #define AN_TXSTAT_AID_FAIL 0x0008 897 #define AN_TXSTAT_MAC_DISABLED 0x0010 898 #define AN_TXSTAT_ASSOC_LOST 0x0020 899 900 #define AN_TXCTL_RSVD 0x0001 901 #define AN_TXCTL_TXOK_INTR 0x0002 902 #define AN_TXCTL_TXERR_INTR 0x0004 903 #define AN_TXCTL_HEADER_TYPE 0x0008 904 #define AN_TXCTL_PAYLOAD_TYPE 0x0010 905 #define AN_TXCTL_NORELEASE 0x0020 906 #define AN_TXCTL_NORETRIES 0x0040 907 #define AN_TXCTL_CLEAR_AID 0x0080 908 #define AN_TXCTL_STRICT_ORDER 0x0100 909 #define AN_TXCTL_USE_RTS 0x0200 910 911 #define AN_HEADERTYPE_8023 0x0000 912 #define AN_HEADERTYPE_80211 0x0008 913 914 #define AN_PAYLOADTYPE_ETHER 0x0000 915 #define AN_PAYLOADTYPE_LLC 0x0010 916 917 typedef enum { 918 ANC_RX_OVERRUNS, /* 0x04 */ 919 ANC_RX_PLCP_CSUM_ERRS, /* 0x08 */ 920 ANC_RX_PLCP_FORMAT_ERRS, /* 0x0c */ 921 ANC_RX_PLCP_LEN_ERRS, /* 0x10 */ 922 ANC_RX_MAC_CRC_ERRS, /* 0x14 */ 923 ANC_RX_MAC_CRC_OK, /* 0x18 */ 924 ANC_RX_WEP_ERRS, /* 0x1c */ 925 ANC_RX_WEP_OK, /* 0x20 */ 926 ANC_RETRY_LONG, /* 0x24 */ 927 ANC_RETRY_SHORT, /* 0x28 */ 928 ANC_RETRY_MAX, /* 0x2c */ 929 ANC_NO_ACK, /* 0x30 */ 930 ANC_NO_CTS, /* 0x34 */ 931 ANC_RX_ACK_OK, /* 0x38 */ 932 ANC_RX_CTS_OK, /* 0x3c */ 933 ANC_TX_ACK_OK, /* 0x40 */ 934 ANC_TX_RTS_OK, /* 0x44 */ 935 ANC_TX_CTS_OK, /* 0x48 */ 936 ANC_TX_LMAC_MCASTS, /* 0x4c */ 937 ANC_TX_LMAC_BCASTS, /* 0x50 */ 938 ANC_TX_LMAC_UCAST_FRAGS, /* 0x54 */ 939 ANC_TX_LMAC_UCASTS, /* 0x58 */ 940 ANC_TX_BEACONS, /* 0x5c */ 941 ANC_RX_BEACONS, /* 0x60 */ 942 ANC_TX_SINGLE_COLS, /* 0x64 */ 943 ANC_TX_MULTI_COLS, /* 0x68 */ 944 ANC_TX_DEFERS_NO, /* 0x6c */ 945 ANC_TX_DEFERS_PROT, /* 0x70 */ 946 ANC_TX_DEFERS_ENERGY, /* 0x74 */ 947 ANC_RX_DUPS, /* 0x78 */ 948 ANC_RX_PARTIAL, /* 0x7c */ 949 ANC_TX_TOO_OLD, /* 0x80 */ 950 ANC_RX_TOO_OLD, /* 0x84 */ 951 ANC_LOSTSYNC_MAX_RETRIES, /* 0x88 */ 952 ANC_LOSTSYNC_MISSED_BEACONS, /* 0x8c */ 953 ANC_LOSTSYNC_ARL_EXCEEDED, /* 0x90 */ 954 ANC_LOSTSYNC_DEAUTHED, /* 0x94 */ 955 ANC_LOSTSYNC_DISASSOCIATED, /* 0x98 */ 956 ANC_LOSTSYNC_TSF_TIMING, /* 0x9c */ 957 ANC_TX_HOST_MCASTS, /* 0xa0 */ 958 ANC_TX_HOST_BCASTS, /* 0xa4 */ 959 ANC_TX_HOST_UCASTS, /* 0xa8 */ 960 ANC_TX_HOST_FAILED, /* 0xac */ 961 ANC_RX_HOST_MCASTS, /* 0xb0 */ 962 ANC_RX_HOST_BCASTS, /* 0xb4 */ 963 ANC_RX_HOST_UCASTS, /* 0xb8 */ 964 ANC_RX_HOST_DISCARDED, /* 0xbc */ 965 ANC_TX_HMAC_MCASTS, /* 0xc0 */ 966 ANC_TX_HMAC_BCASTS, /* 0xc4 */ 967 ANC_TX_HMAC_UCASTS, /* 0xc8 */ 968 ANC_TX_HMAC_FAILED, /* 0xcc */ 969 ANC_RX_HMAC_MCASTS, /* 0xd0 */ 970 ANC_RX_HMAC_BCASTS, /* 0xd4 */ 971 ANC_RX_HMAC_UCASTS, /* 0xd8 */ 972 ANC_RX_HMAC_DISCARDED, /* 0xdc */ 973 ANC_TX_HMAC_ACCEPTED, /* 0xe0 */ 974 ANC_SSID_MISMATCHES, /* 0xe4 */ 975 ANC_AP_MISMATCHES, /* 0xe8 */ 976 ANC_RATES_MISMATCHES, /* 0xec */ 977 ANC_AUTH_REJECTS, /* 0xf0 */ 978 ANC_AUTH_TIMEOUTS, /* 0xf4 */ 979 ANC_ASSOC_REJECTS, /* 0xf8 */ 980 ANC_ASSOC_TIMEOUTS, /* 0xfc */ 981 ANC_REASON_OUTSIDE_TABLE, /* 0x100 */ 982 ANC_REASON1, /* 0x104 */ 983 ANC_REASON2, /* 0x108 */ 984 ANC_REASON3, /* 0x10c */ 985 ANC_REASON4, /* 0x110 */ 986 ANC_REASON5, /* 0x114 */ 987 ANC_REASON6, /* 0x118 */ 988 ANC_REASON7, /* 0x11c */ 989 ANC_REASON8, /* 0x120 */ 990 ANC_REASON9, /* 0x124 */ 991 ANC_REASON10, /* 0x128 */ 992 ANC_REASON11, /* 0x12c */ 993 ANC_REASON12, /* 0x130 */ 994 ANC_REASON13, /* 0x134 */ 995 ANC_REASON14, /* 0x138 */ 996 ANC_REASON15, /* 0x13c */ 997 ANC_REASON16, /* 0x140 */ 998 ANC_REASON17, /* 0x144 */ 999 ANC_REASON18, /* 0x148 */ 1000 ANC_REASON19, /* 0x14c */ 1001 ANC_RX_MGMT_PKTS, /* 0x150 */ 1002 ANC_TX_MGMT_PKTS, /* 0x154 */ 1003 ANC_RX_REFRESH_PKTS, /* 0x158 */ 1004 ANC_TX_REFRESH_PKTS, /* 0x15c */ 1005 ANC_RX_POLL_PKTS, /* 0x160 */ 1006 ANC_TX_POLL_PKTS, /* 0x164 */ 1007 ANC_HOST_RETRIES, /* 0x168 */ 1008 ANC_LOSTSYNC_HOSTREQ, /* 0x16c */ 1009 ANC_HOST_TX_BYTES, /* 0x170 */ 1010 ANC_HOST_RX_BYTES, /* 0x174 */ 1011 ANC_UPTIME_USECS, /* 0x178 */ 1012 ANC_UPTIME_SECS, /* 0x17c */ 1013 ANC_LOSTSYNC_BETTER_AP, /* 0x180 */ 1014 ANC_PRIVACY_MISMATCH, /* 0x184 */ 1015 ANC_JAMMED, /* 0x188 */ 1016 ANC_RX_DISC_WEP_OFF, /* 0x18c */ 1017 ANC_PHY_ELE_MISMATCH, /* 0x190 */ 1018 ANC_LEAP_SUCCESS, /* 0x194 */ 1019 ANC_LEAP_FAILURE, /* 0x198 */ 1020 ANC_LEAP_TIMEOUTS, /* 0x19c */ 1021 ANC_LEAP_KEYLEN_FAIL, /* 0x1a0 */ 1022 ANC_STAT_CNT /* - keep it as the last entry */ 1023 } pcan_cntr_offset; 1024 1025 #define AN_TXCTL_80211 (AN_TXCTL_TXOK_INTR | AN_TXCTL_TXERR_INTR | \ 1026 AN_HEADERTYPE_80211 | AN_PAYLOADTYPE_LLC | AN_TXCTL_NORELEASE) 1027 1028 #define AN_TXCTL_8023 (AN_TXCTL_TXOK_INTR | AN_TXCTL_TXERR_INTR |\ 1029 AN_HEADERTYPE_8023 | AN_PAYLOADTYPE_ETHER | AN_TXCTL_NORELEASE) 1030 1031 #define AN_TXGAP_80211 6 1032 #define AN_TXGAP_8023 0 1033 1034 #define AN_NORMAL_RXMODE (AN_RXMODE_BC_MC_ADDR | \ 1035 AN_RXMODE_USE_8023_HEADER) 1036 #define AN_MONITOR_RXMODE (AN_RXMODE_LAN_MONITOR_CURBSS | \ 1037 AN_RXMODE_USE_8023_HEADER) 1038 struct an_802_3_hdr { 1039 uint16_t an_8023_status; 1040 uint16_t an_8023_payload_len; 1041 uint8_t an_8023_dst_addr[6]; 1042 uint8_t an_8023_src_addr[6]; 1043 uint16_t an_8023_dat[3]; /* SNAP header */ 1044 uint16_t an_8023_type; 1045 }; 1046 1047 typedef struct an_snap_hdr { 1048 uint16_t an_snap_dat[3]; /* SNAP header */ 1049 uint16_t an_snap_type; 1050 } pcan_snaphdr_t; 1051 1052 #define AN_TX_RING_CNT 4 1053 #define AN_TX_RING_MASK (4 - 1) 1054 #define AN_INC(x, y) (x) = (x + 1) % (y) 1055 1056 typedef struct an_tx_ring_data { 1057 uint16_t an_tx_fids[AN_TX_RING_CNT]; 1058 uint16_t an_tx_ring[AN_TX_RING_CNT]; 1059 int an_tx_prod; 1060 int an_tx_cons; 1061 kmutex_t an_tx_lock; /* for send only */ 1062 } pcan_txring_t; 1063 1064 #define AN_802_3_OFFSET 0x2E 1065 #define AN_802_11_OFFSET 0x44 1066 #define AN_802_11_OFFSET_RAW 0x3C 1067 1068 #define AN_STAT_BADCRC 0x0001 1069 #define AN_STAT_UNDECRYPTABLE 0x0002 1070 #define AN_STAT_ERRSTAT 0x0003 1071 #define AN_STAT_MAC_PORT 0x0700 1072 #define AN_STAT_1042 0x2000 /* RFC1042 encoded */ 1073 #define AN_STAT_TUNNEL 0x4000 /* Bridge-tunnel encoded */ 1074 #define AN_STAT_WMP_MSG 0x6000 /* WaveLAN-II management protocol */ 1075 #define AN_RXSTAT_MSG_TYPE 0xE000 1076 1077 #define AN_ENC_TX_802_3 0x00 1078 #define AN_ENC_TX_802_11 0x11 1079 #define AN_ENC_TX_E_II 0x0E 1080 1081 #define AN_ENC_TX_1042 0x00 1082 #define AN_ENC_TX_TUNNEL 0xF8 1083 1084 #define AN_TXCNTL_MACPORT 0x00FF 1085 #define AN_TXCNTL_STRUCTTYPE 0xFF00 1086 1087 /* 1088 * SNAP (sub-network access protocol) constants for transmission 1089 * of IP datagrams over IEEE 802 networks, taken from RFC1042. 1090 * We need these for the LLC/SNAP header fields in the TX/RX frame 1091 * structure. 1092 */ 1093 #define AN_SNAP_K1 0xaa /* assigned global SAP for SNAP */ 1094 #define AN_SNAP_K2 0x00 1095 #define AN_SNAP_CONTROL 0x03 /* unnumbered information format */ 1096 #define AN_SNAP_WORD0 (AN_SNAP_K1 | (AN_SNAP_K1 << 8)) 1097 #define AN_SNAP_WORD1 (AN_SNAP_K2 | (AN_SNAP_CONTROL << 8)) 1098 #define AN_SNAPHDR_LEN 0x6 1099 1100 #define AN_FTYPE_DATA 0x8 1101 #define ETH_HDRLEN (sizeof (struct ether_header)) /* 14 bytes */ 1102 #define MLEN(mp) ((mp)->b_wptr - (mp)->b_rptr) 1103 1104 typedef struct pcan_dma_info { 1105 ddi_dma_handle_t dma_handle; 1106 ddi_acc_handle_t dma_acc_handle; 1107 uint32_t dma_physaddr; 1108 caddr_t dma_virtaddr; 1109 uint_t ncookies; 1110 } pcan_dma_info_t; 1111 1112 #define PCAN_DMA_SYNC(hdl, len, flag) ((void) ddi_dma_sync(hdl, 0, len, (flag))) 1113 1114 /* 1115 * The macinfo is really used as the softstate structure. 1116 * 1117 * pcan_mh - mac_handle_t structure 1118 * pcan_cslock - lock for card services request. Used with pcan_cscv 1119 * pcan_cscv - condition variable to wait for card events 1120 * pcan_chdl - client handle, an uint32_t bit mask encoding for socket, 1121 * function, and client info. 1122 * See cs_priv.h MAKE_CLIENT_HANDLE. 1123 * pcan_log_sock - holds the logical to physical translation for this card. 1124 * Specifically has physical adapter and socket #. 1125 * Socket # is the same as part of the pcan_chdl encoding. 1126 * Physical adapter # is from card service socket impl. 1127 */ 1128 typedef struct pcan_macinfo { 1129 mac_handle_t pcan_mh; 1130 dev_info_t *pcan_dip; 1131 1132 kmutex_t pcan_cslock; /* for card services */ 1133 kcondvar_t pcan_cscv; /* for card services */ 1134 client_handle_t pcan_chdl; /* s,f,c encoding, cs_priv.h */ 1135 map_log_socket_t pcan_log_sock; /* logical/phys socket map */ 1136 int pcan_socket; /* socket number */ 1137 int pcan_config_hi; /* cfttbl index */ 1138 int pcan_config; /* default config index */ 1139 int pcan_vcc; /* vcc level */ 1140 int pcan_iodecode; /* # of address lines */ 1141 int pcan_usewep; 1142 int pcan_reset_delay; 1143 1144 caddr_t pcan_cfg_base; 1145 ddi_acc_handle_t pcan_cfg_handle; 1146 caddr_t pcan_bar0; 1147 ddi_acc_handle_t pcan_handle0; 1148 caddr_t pcan_bar1; 1149 ddi_acc_handle_t pcan_handle1; 1150 caddr_t pcan_bar2; 1151 ddi_acc_handle_t pcan_handle2; 1152 int pcan_device_type; /* pci or pcmcia card */ 1153 1154 uint8_t pcan_mac_addr[ETHERADDRL]; 1155 uint32_t pcan_flag; 1156 uint32_t pcan_reschedule_need; 1157 uint32_t glds_nocarrier; 1158 uint32_t glds_noxmtbuf; 1159 uint32_t glds_norcvbuf; 1160 uint32_t glds_intr; 1161 1162 pcan_dma_info_t pcan_cmd; 1163 pcan_dma_info_t pcan_rx[AN_MAX_RX_DESC]; 1164 pcan_dma_info_t pcan_tx[AN_MAX_TX_DESC]; 1165 1166 kmutex_t pcan_glock; /* generic lock */ 1167 kmutex_t pcan_scanlist_lock; /* scanlist lock */ 1168 pcan_txring_t pcan_txring; 1169 1170 struct an_ltv_ssidlist an_ssidlist; 1171 struct an_ltv_aplist an_aplist; 1172 struct an_ltv_caps an_caps; 1173 struct an_ltv_crypt an_crypt; 1174 struct an_ltv_wepkey an_wepkey[4]; 1175 struct an_ltv_scanresult an_scanresult[32]; 1176 uint16_t an_cur_wepkey; 1177 uint16_t an_scan_num; 1178 timeout_id_t an_scanlist_timeout_id; 1179 list_t an_scan_list; 1180 struct an_ltv_status an_status; 1181 struct an_ltv_genconfig an_config; 1182 struct an_ltv_genconfig an_actual_config; 1183 struct an_ltv_stats an_stats; 1184 uint64_t pcan_cntrs_s[ANC_STAT_CNT]; 1185 1186 ddi_acc_handle_t pcan_port; 1187 ddi_iblock_cookie_t pcan_ib_cookie; 1188 ddi_softintr_t pcan_softint_id; 1189 1190 ddi_softintr_t pcan_info_softint_id; 1191 uint32_t pcan_info_softint_pending; 1192 1193 timeout_id_t pcan_connect_timeout_id; 1194 timeout_id_t pcan_linkdown_timeout_id; 1195 int pcan_badrids_len; 1196 prop_1275_cell_t *pcan_badrids; 1197 } pcan_maci_t; 1198 1199 #define PCAN_IDENT_STRING modldrv.drv_linkinfo 1200 1201 #define HDL(pcan_p) ((pcan_p)->pcan_port) 1202 #define GLD3(pcan_p) ((pcan_p)->pcan_mh) 1203 #define DIP(pcan_p) ((pcan_p)->pcan_dip) 1204 1205 #define PCAN_CARD_INTREN 0x1 1206 #define PCAN_CARD_LINKUP 0x2 1207 #define PCAN_ATTACHED 0x4 1208 #define PCAN_CS_REGISTERED 0x8 1209 #define PCAN_ENABLED 0x10 1210 #define PCAN_CARD_SEND 0x20 1211 #define PCAN_CARD_READY 0x40 1212 #define PCAN_CARD_FAILED 0x80 1213 #define PCAN_PLUMBED 0x100 1214 #define PCAN_SUSPENDED 0x200 1215 1216 #define PCAN_STATE_IDLE 0x1 1217 1218 #define PCAN_NICMEM_SZ (2048) /* 80211MTU set as 1500, so 2k here */ 1219 1220 static int pcan_probe(dev_info_t *dip); 1221 static int pcan_attach(dev_info_t *dip, ddi_attach_cmd_t cmd); 1222 static int pcan_detach(dev_info_t *dip, ddi_detach_cmd_t cmd); 1223 1224 static int pcan_register_cs(dev_info_t *dip, pcan_maci_t *pcan_p); 1225 static void pcan_unregister_cs(pcan_maci_t *pcan_p); 1226 static void pcan_destroy_locks(pcan_maci_t *pcan_p); 1227 static void pcan_reset_backend(pcan_maci_t *pcan_p, int timeout); 1228 static uint32_t pcan_get_cap(pcan_maci_t *pcan_p); 1229 static int pcan_card_insert(pcan_maci_t *pcan_p); 1230 static int pcan_ev_hdlr(event_t ev, int pri, event_callback_args_t *arg); 1231 static void pcan_card_remove(pcan_maci_t *pcan_p); 1232 static int pcan_init_nicmem(pcan_maci_t *pcan_p); 1233 static void pcan_do_suspend(pcan_maci_t *pcan_p); 1234 1235 /* 1236 * high level device access primitives, glock must held before calling 1237 */ 1238 static uint16_t pcan_set_cmd0(pcan_maci_t *pcan_p, uint16_t cmd, uint16_t p0, 1239 uint16_t p1, uint16_t p2); 1240 static uint16_t pcan_set_cmd(pcan_maci_t *pcan_p, uint16_t cmd, uint16_t param); 1241 static uint16_t pcan_set_ch(pcan_maci_t *, uint16_t, uint16_t, uint16_t); 1242 static int pcan_init_dma_desc(pcan_maci_t *pcan_p); 1243 static int pcan_init_dma(dev_info_t *dip, pcan_maci_t *pcan_p); 1244 static void pcan_free_dma(pcan_maci_t *pcan_p); 1245 static uint16_t pcan_put_ltv(pcan_maci_t *pcan_p, uint16_t len, uint16_t type, 1246 uint16_t *val_p); 1247 static uint16_t pcan_get_ltv(pcan_maci_t *pcan_p, uint16_t len, uint16_t type, 1248 uint16_t *val_p); 1249 #define PCAN_READ_LTV 0 1250 #define PCAN_WRITE_LTV 1 1251 static uint16_t pcan_status_ltv(int rw, pcan_maci_t *pcan_p, 1252 struct an_ltv_status *status_p); 1253 static uint16_t pcan_cfg_ltv(int rw, pcan_maci_t *pcan_p, 1254 struct an_ltv_genconfig *cfg_p); 1255 static uint16_t pcan_cap_ltv(int rw, pcan_maci_t *pcan_p); 1256 static uint16_t pcan_ssid_ltv(int rw, pcan_maci_t *pcan_p); 1257 static uint16_t pcan_aplist_ltv(int rw, pcan_maci_t *pcan_p); 1258 static uint16_t pcan_scanresult_ltv(int rw, pcan_maci_t *pcan_p, uint16_t type, 1259 struct an_ltv_scanresult *scanresult_p); 1260 static uint16_t pcan_wepkey_ltv(int rw, pcan_maci_t *pcan_p); 1261 static uint16_t pcan_rdch0(pcan_maci_t *pcan_p, uint16_t type, uint16_t off, 1262 uint16_t *buf_p, int len, int order); 1263 static uint16_t pcan_wrch1(pcan_maci_t *pcan_p, uint16_t type, uint16_t off, 1264 uint16_t *buf_p, int len, int order); 1265 static int pcan_config_mac(pcan_maci_t *pcan_p); 1266 static void pcan_start_locked(pcan_maci_t *pcan_p); 1267 static void pcan_stop_locked(pcan_maci_t *pcan_p); 1268 static uint16_t pcan_alloc_nicmem(pcan_maci_t *pcan_p, uint16_t len, 1269 uint16_t *id_p); 1270 1271 /* 1272 * Required driver entry points for gld 1273 */ 1274 static int pcan_start(void *); 1275 static void pcan_stop(void *); 1276 static int pcan_saddr(void *, const uint8_t *); 1277 static mblk_t *pcan_tx(void *, mblk_t *); 1278 static int pcan_send(pcan_maci_t *, mblk_t *); 1279 static int pcian_send(pcan_maci_t *, mblk_t *); 1280 static int pcan_prom(void *, boolean_t); 1281 static int pcan_gstat(void *, uint_t, uint64_t *); 1282 static int pcan_sdmulti(void *, boolean_t, const uint8_t *); 1283 static void pcan_ioctl(void *, queue_t *, mblk_t *); 1284 1285 static uint_t pcan_intr(caddr_t arg); 1286 static uint_t pcan_intr_hi(caddr_t arg); 1287 static void pcan_rcv(pcan_maci_t *pcan_p); 1288 static void pcian_rcv(pcan_maci_t *pcan_p); 1289 static uint_t pcan_info_softint(caddr_t arg); 1290 static uint32_t pcan_txdone(pcan_maci_t *pcan_p, uint16_t err); 1291 static int pcan_getset(mblk_t *mp, pcan_maci_t *pcan_p, uint32_t cmd); 1292 static void pcan_wlan_ioctl(pcan_maci_t *pcan_p, queue_t *wq, 1293 mblk_t *mp, uint32_t cmd); 1294 static int pcan_loaddef(pcan_maci_t *pcan_p); 1295 1296 static void pcan_scanlist_timeout(void *); 1297 static void pcan_delete_scan_item(pcan_maci_t *, an_scan_list_t *); 1298 static int pcan_add_scan_item(pcan_maci_t *, struct an_ltv_scanresult); 1299 static void pcan_connect_timeout(void *arg); 1300 1301 #define RDCH0(h, t, o, bufp, l) pcan_rdch0(h, t, o, bufp, l, 1) 1302 #define WRCH1(h, t, o, bufp, l) pcan_wrch1(h, t, o, bufp, l, 1) 1303 #define RDPKT(h, t, o, bufp, l) pcan_rdch0(h, t, o, bufp, l, 0) 1304 #define WRPKT(h, t, o, bufp, l) pcan_wrch1(h, t, o, bufp, l, 0) 1305 1306 #define PCAN_READ(p, o, v) { \ 1307 if (p->pcan_device_type == PCAN_DEVICE_PCI) { \ 1308 uint16_t t = ddi_get16(p->pcan_handle0, \ 1309 (uint16_t *)(p->pcan_bar0 + o)); \ 1310 v = LE_16(t); \ 1311 } else { \ 1312 uint16_t t = csx_Get16(HDL(p), o); \ 1313 v = LE_16(t); \ 1314 }\ 1315 } 1316 #define PCAN_WRITE(p, o, v) { \ 1317 if (p->pcan_device_type == PCAN_DEVICE_PCI) { \ 1318 ddi_put16(p->pcan_handle0, \ 1319 (uint16_t *)(p->pcan_bar0 + o), LE_16(v)); \ 1320 } else { \ 1321 csx_Put16(HDL(p), o, LE_16(v)); \ 1322 }\ 1323 } 1324 #define PCAN_READ_P(p, o, v, h) { \ 1325 if (p->pcan_device_type == PCAN_DEVICE_PCI) { \ 1326 uint16_t t = ddi_get16(p->pcan_handle0, \ 1327 (uint16_t *)(p->pcan_bar0 + o)); \ 1328 *(v) = h ? LE_16(t) : t; \ 1329 } else { \ 1330 uint16_t t = csx_Get16(HDL(p), o); \ 1331 *(v) = h ? LE_16(t) : t; \ 1332 }\ 1333 } 1334 #define PCAN_WRITE_P(p, o, v, h) { \ 1335 if (p->pcan_device_type == PCAN_DEVICE_PCI) { \ 1336 ddi_put16(p->pcan_handle0, (uint16_t *)(p->pcan_bar0 + o), \ 1337 h ? LE_16(*(v)) : (*(v))); \ 1338 } else {\ 1339 csx_Put16(HDL(p), o, h ? LE_16(*(v)) : (*(v))); \ 1340 }\ 1341 } 1342 1343 #ifdef _BIG_ENDIAN 1344 #define PCAN_SWAP16(buf_p, len) { \ 1345 uint16_t pcan_swap_len = len; \ 1346 for (pcan_swap_len = (pcan_swap_len + 1) >> 1; pcan_swap_len; ) { \ 1347 uint16_t val; \ 1348 pcan_swap_len--; \ 1349 val = *((uint16_t *)(buf_p) + pcan_swap_len); \ 1350 *((uint16_t *)(buf_p) + pcan_swap_len) = LE_16(val); \ 1351 } \ 1352 } 1353 #define PCAN_SWAP16_BUF(buf_p) PCAN_SWAP16(buf_p, sizeof (buf_p)) 1354 #else /* _BIG_ENDIAN */ 1355 #define PCAN_SWAP16(buf_p, len) 1356 #define PCAN_SWAP16_BUF(buf_p) 1357 #endif /* _BIG_ENDIAN */ 1358 1359 #define PCAN_ENABLE_INTR(pcan_p) {\ 1360 PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), AN_INTRS(pcan_p));\ 1361 } 1362 #define PCAN_DISABLE_INTR(pcan_p) { \ 1363 PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), 0); \ 1364 } 1365 #define PCAN_DISABLE_INTR_CLEAR(pcan_p) { \ 1366 PCAN_WRITE(pcan_p, AN_INT_EN(pcan_p), 0); \ 1367 PCAN_WRITE(pcan_p, AN_EVENT_ACK(pcan_p), 0xffff);\ 1368 } 1369 1370 #define PCAN_AUX_PUT32(p, o, v)\ 1371 ddi_put32(p->pcan_handle2, (uint32_t *)(p->pcan_bar2 + o), v) 1372 #define PCAN_AUX_GET32(p, o, v) {\ 1373 v = ddi_get32(p->pcan_handle2, (uint32_t *)(p->pcan_bar2 + o));\ 1374 } 1375 1376 /* 1377 * 16-bit driver private status code 1378 */ 1379 #define PCAN_SUCCESS 0 1380 #define PCAN_FAIL 1 1381 #define PCAN_TIMEDOUT_CMD 0x10 1382 #define PCAN_TIMEDOUT_ACCESS 0x11 1383 #define PCAN_TIMEDOUT_TARGET 0x12 1384 #define PCAN_BADLEN 0x13 1385 #define PCAN_BADTYPE 0x14 1386 #define PCAN_TIMEDOUT_ALLOC 0x15 1387 1388 #define PCAN_STATUS_MAX 0xffff 1389 1390 #ifdef __cplusplus 1391 } 1392 #endif 1393 1394 #endif /* _SYS_PCAN_H */