1 /* 2 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * Copyright (c) 2008 Atheros Communications Inc. 8 * 9 * Permission to use, copy, modify, and/or distribute this software for any 10 * purpose with or without fee is hereby granted, provided that the above 11 * copyright notice and this permission notice appear in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20 */ 21 22 #include <sys/sysmacros.h> 23 #include <sys/param.h> 24 #include <sys/types.h> 25 #include <sys/signal.h> 26 #include <sys/stream.h> 27 #include <sys/termio.h> 28 #include <sys/errno.h> 29 #include <sys/file.h> 30 #include <sys/cmn_err.h> 31 #include <sys/stropts.h> 32 #include <sys/strsubr.h> 33 #include <sys/strtty.h> 34 #include <sys/kbio.h> 35 #include <sys/cred.h> 36 #include <sys/stat.h> 37 #include <sys/consdev.h> 38 #include <sys/kmem.h> 39 #include <sys/modctl.h> 40 #include <sys/ddi.h> 41 #include <sys/sunddi.h> 42 #include <sys/pci.h> 43 #include <sys/errno.h> 44 #include <sys/mac_provider.h> 45 #include <sys/dlpi.h> 46 #include <sys/ethernet.h> 47 #include <sys/list.h> 48 #include <sys/byteorder.h> 49 #include <sys/strsun.h> 50 #include <sys/policy.h> 51 #include <inet/common.h> 52 #include <inet/nd.h> 53 #include <inet/mi.h> 54 #include <inet/wifi_ioctl.h> 55 #include <sys/mac_wifi.h> 56 #include <sys/net80211.h> 57 #include <sys/net80211_proto.h> 58 #include <sys/net80211_ht.h> 59 60 61 #include "arn_ath9k.h" 62 #include "arn_core.h" 63 #include "arn_reg.h" 64 #include "arn_hw.h" 65 66 #define ARN_MAX_RSSI 45 /* max rssi */ 67 68 /* 69 * Default 11n reates supported by this station. 70 */ 71 extern struct ieee80211_htrateset ieee80211_rateset_11n; 72 73 /* 74 * PIO access attributes for registers 75 */ 76 static ddi_device_acc_attr_t arn_reg_accattr = { 77 DDI_DEVICE_ATTR_V0, 78 DDI_STRUCTURE_LE_ACC, 79 DDI_STRICTORDER_ACC, 80 DDI_DEFAULT_ACC 81 }; 82 83 /* 84 * DMA access attributes for descriptors: NOT to be byte swapped. 85 */ 86 static ddi_device_acc_attr_t arn_desc_accattr = { 87 DDI_DEVICE_ATTR_V0, 88 DDI_STRUCTURE_LE_ACC, 89 DDI_STRICTORDER_ACC, 90 DDI_DEFAULT_ACC 91 }; 92 93 /* 94 * Describes the chip's DMA engine 95 */ 96 static ddi_dma_attr_t arn_dma_attr = { 97 DMA_ATTR_V0, /* version number */ 98 0, /* low address */ 99 0xffffffffU, /* high address */ 100 0x3ffffU, /* counter register max */ 101 1, /* alignment */ 102 0xFFF, /* burst sizes */ 103 1, /* minimum transfer size */ 104 0x3ffffU, /* max transfer size */ 105 0xffffffffU, /* address register max */ 106 1, /* no scatter-gather */ 107 1, /* granularity of device */ 108 0, /* DMA flags */ 109 }; 110 111 static ddi_dma_attr_t arn_desc_dma_attr = { 112 DMA_ATTR_V0, /* version number */ 113 0, /* low address */ 114 0xffffffffU, /* high address */ 115 0xffffffffU, /* counter register max */ 116 0x1000, /* alignment */ 117 0xFFF, /* burst sizes */ 118 1, /* minimum transfer size */ 119 0xffffffffU, /* max transfer size */ 120 0xffffffffU, /* address register max */ 121 1, /* no scatter-gather */ 122 1, /* granularity of device */ 123 0, /* DMA flags */ 124 }; 125 126 #define ATH_DEF_CACHE_BYTES 32 /* default cache line size */ 127 128 static kmutex_t arn_loglock; 129 static void *arn_soft_state_p = NULL; 130 static int arn_dwelltime = 200; /* scan interval */ 131 132 static int arn_m_stat(void *, uint_t, uint64_t *); 133 static int arn_m_start(void *); 134 static void arn_m_stop(void *); 135 static int arn_m_promisc(void *, boolean_t); 136 static int arn_m_multicst(void *, boolean_t, const uint8_t *); 137 static int arn_m_unicst(void *, const uint8_t *); 138 static mblk_t *arn_m_tx(void *, mblk_t *); 139 static void arn_m_ioctl(void *, queue_t *, mblk_t *); 140 static int arn_m_setprop(void *, const char *, mac_prop_id_t, 141 uint_t, const void *); 142 static int arn_m_getprop(void *, const char *, mac_prop_id_t, 143 uint_t, void *); 144 static void arn_m_propinfo(void *, const char *, mac_prop_id_t, 145 mac_prop_info_handle_t); 146 147 /* MAC Callcack Functions */ 148 static mac_callbacks_t arn_m_callbacks = { 149 MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO, 150 arn_m_stat, 151 arn_m_start, 152 arn_m_stop, 153 arn_m_promisc, 154 arn_m_multicst, 155 arn_m_unicst, 156 arn_m_tx, 157 NULL, 158 arn_m_ioctl, 159 NULL, 160 NULL, 161 NULL, 162 arn_m_setprop, 163 arn_m_getprop, 164 arn_m_propinfo 165 }; 166 167 /* 168 * ARN_DBG_HW 169 * ARN_DBG_REG_IO 170 * ARN_DBG_QUEUE 171 * ARN_DBG_EEPROM 172 * ARN_DBG_XMIT 173 * ARN_DBG_RECV 174 * ARN_DBG_CALIBRATE 175 * ARN_DBG_CHANNEL 176 * ARN_DBG_INTERRUPT 177 * ARN_DBG_REGULATORY 178 * ARN_DBG_ANI 179 * ARN_DBG_POWER_MGMT 180 * ARN_DBG_KEYCACHE 181 * ARN_DBG_BEACON 182 * ARN_DBG_RATE 183 * ARN_DBG_INIT 184 * ARN_DBG_ATTACH 185 * ARN_DBG_DEATCH 186 * ARN_DBG_AGGR 187 * ARN_DBG_RESET 188 * ARN_DBG_FATAL 189 * ARN_DBG_ANY 190 * ARN_DBG_ALL 191 */ 192 uint32_t arn_dbg_mask = 0; 193 194 /* 195 * Exception/warning cases not leading to panic. 196 */ 197 void 198 arn_problem(const int8_t *fmt, ...) 199 { 200 va_list args; 201 202 mutex_enter(&arn_loglock); 203 204 va_start(args, fmt); 205 vcmn_err(CE_WARN, fmt, args); 206 va_end(args); 207 208 mutex_exit(&arn_loglock); 209 } 210 211 /* 212 * Normal log information independent of debug. 213 */ 214 void 215 arn_log(const int8_t *fmt, ...) 216 { 217 va_list args; 218 219 mutex_enter(&arn_loglock); 220 221 va_start(args, fmt); 222 vcmn_err(CE_CONT, fmt, args); 223 va_end(args); 224 225 mutex_exit(&arn_loglock); 226 } 227 228 void 229 arn_dbg(uint32_t dbg_flags, const int8_t *fmt, ...) 230 { 231 va_list args; 232 233 if (dbg_flags & arn_dbg_mask) { 234 mutex_enter(&arn_loglock); 235 va_start(args, fmt); 236 vcmn_err(CE_CONT, fmt, args); 237 va_end(args); 238 mutex_exit(&arn_loglock); 239 } 240 } 241 242 /* 243 * Read and write, they both share the same lock. We do this to serialize 244 * reads and writes on Atheros 802.11n PCI devices only. This is required 245 * as the FIFO on these devices can only accept sanely 2 requests. After 246 * that the device goes bananas. Serializing the reads/writes prevents this 247 * from happening. 248 */ 249 void 250 arn_iowrite32(struct ath_hal *ah, uint32_t reg_offset, uint32_t val) 251 { 252 struct arn_softc *sc = ah->ah_sc; 253 if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { 254 mutex_enter(&sc->sc_serial_rw); 255 ddi_put32(sc->sc_io_handle, 256 (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val); 257 mutex_exit(&sc->sc_serial_rw); 258 } else { 259 ddi_put32(sc->sc_io_handle, 260 (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val); 261 } 262 } 263 264 unsigned int 265 arn_ioread32(struct ath_hal *ah, uint32_t reg_offset) 266 { 267 uint32_t val; 268 struct arn_softc *sc = ah->ah_sc; 269 if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) { 270 mutex_enter(&sc->sc_serial_rw); 271 val = ddi_get32(sc->sc_io_handle, 272 (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset))); 273 mutex_exit(&sc->sc_serial_rw); 274 } else { 275 val = ddi_get32(sc->sc_io_handle, 276 (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset))); 277 } 278 279 return (val); 280 } 281 282 /* 283 * Allocate an area of memory and a DMA handle for accessing it 284 */ 285 static int 286 arn_alloc_dma_mem(dev_info_t *devinfo, ddi_dma_attr_t *dma_attr, size_t memsize, 287 ddi_device_acc_attr_t *attr_p, uint_t alloc_flags, 288 uint_t bind_flags, dma_area_t *dma_p) 289 { 290 int err; 291 292 /* 293 * Allocate handle 294 */ 295 err = ddi_dma_alloc_handle(devinfo, dma_attr, 296 DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl); 297 if (err != DDI_SUCCESS) 298 return (DDI_FAILURE); 299 300 /* 301 * Allocate memory 302 */ 303 err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p, 304 alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va, 305 &dma_p->alength, &dma_p->acc_hdl); 306 if (err != DDI_SUCCESS) 307 return (DDI_FAILURE); 308 309 /* 310 * Bind the two together 311 */ 312 err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL, 313 dma_p->mem_va, dma_p->alength, bind_flags, 314 DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies); 315 if (err != DDI_DMA_MAPPED) 316 return (DDI_FAILURE); 317 318 dma_p->nslots = ~0U; 319 dma_p->size = ~0U; 320 dma_p->token = ~0U; 321 dma_p->offset = 0; 322 return (DDI_SUCCESS); 323 } 324 325 /* 326 * Free one allocated area of DMAable memory 327 */ 328 static void 329 arn_free_dma_mem(dma_area_t *dma_p) 330 { 331 if (dma_p->dma_hdl != NULL) { 332 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); 333 if (dma_p->acc_hdl != NULL) { 334 ddi_dma_mem_free(&dma_p->acc_hdl); 335 dma_p->acc_hdl = NULL; 336 } 337 ddi_dma_free_handle(&dma_p->dma_hdl); 338 dma_p->ncookies = 0; 339 dma_p->dma_hdl = NULL; 340 } 341 } 342 343 /* 344 * Initialize tx, rx. or beacon buffer list. Allocate DMA memory for 345 * each buffer. 346 */ 347 static int 348 arn_buflist_setup(dev_info_t *devinfo, 349 struct arn_softc *sc, 350 list_t *bflist, 351 struct ath_buf **pbf, 352 struct ath_desc **pds, 353 int nbuf, 354 uint_t dmabflags, 355 uint32_t buflen) 356 { 357 int i, err; 358 struct ath_buf *bf = *pbf; 359 struct ath_desc *ds = *pds; 360 361 list_create(bflist, sizeof (struct ath_buf), 362 offsetof(struct ath_buf, bf_node)); 363 for (i = 0; i < nbuf; i++, bf++, ds++) { 364 bf->bf_desc = ds; 365 bf->bf_daddr = sc->sc_desc_dma.cookie.dmac_address + 366 ((uintptr_t)ds - (uintptr_t)sc->sc_desc); 367 list_insert_tail(bflist, bf); 368 369 /* alloc DMA memory */ 370 err = arn_alloc_dma_mem(devinfo, &arn_dma_attr, 371 buflen, &arn_desc_accattr, DDI_DMA_STREAMING, 372 dmabflags, &bf->bf_dma); 373 if (err != DDI_SUCCESS) 374 return (err); 375 } 376 *pbf = bf; 377 *pds = ds; 378 379 return (DDI_SUCCESS); 380 } 381 382 /* 383 * Destroy tx, rx or beacon buffer list. Free DMA memory. 384 */ 385 static void 386 arn_buflist_cleanup(list_t *buflist) 387 { 388 struct ath_buf *bf; 389 390 if (!buflist) 391 return; 392 393 bf = list_head(buflist); 394 while (bf != NULL) { 395 if (bf->bf_m != NULL) { 396 freemsg(bf->bf_m); 397 bf->bf_m = NULL; 398 } 399 /* Free DMA buffer */ 400 arn_free_dma_mem(&bf->bf_dma); 401 if (bf->bf_in != NULL) { 402 ieee80211_free_node(bf->bf_in); 403 bf->bf_in = NULL; 404 } 405 list_remove(buflist, bf); 406 bf = list_head(buflist); 407 } 408 list_destroy(buflist); 409 } 410 411 static void 412 arn_desc_free(struct arn_softc *sc) 413 { 414 arn_buflist_cleanup(&sc->sc_txbuf_list); 415 arn_buflist_cleanup(&sc->sc_rxbuf_list); 416 #ifdef ARN_IBSS 417 arn_buflist_cleanup(&sc->sc_bcbuf_list); 418 #endif 419 420 /* Free descriptor DMA buffer */ 421 arn_free_dma_mem(&sc->sc_desc_dma); 422 423 kmem_free((void *)sc->sc_vbufptr, sc->sc_vbuflen); 424 sc->sc_vbufptr = NULL; 425 } 426 427 static int 428 arn_desc_alloc(dev_info_t *devinfo, struct arn_softc *sc) 429 { 430 int err; 431 size_t size; 432 struct ath_desc *ds; 433 struct ath_buf *bf; 434 435 #ifdef ARN_IBSS 436 size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF + ATH_BCBUF); 437 #else 438 size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF); 439 #endif 440 441 err = arn_alloc_dma_mem(devinfo, &arn_desc_dma_attr, size, 442 &arn_desc_accattr, DDI_DMA_CONSISTENT, 443 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &sc->sc_desc_dma); 444 445 /* virtual address of the first descriptor */ 446 sc->sc_desc = (struct ath_desc *)sc->sc_desc_dma.mem_va; 447 448 ds = sc->sc_desc; 449 ARN_DBG((ARN_DBG_INIT, "arn: arn_desc_alloc(): DMA map: " 450 "%p (%d) -> %p\n", 451 sc->sc_desc, sc->sc_desc_dma.alength, 452 sc->sc_desc_dma.cookie.dmac_address)); 453 454 /* allocate data structures to describe TX/RX DMA buffers */ 455 #ifdef ARN_IBSS 456 sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF + 457 ATH_BCBUF); 458 #else 459 sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF); 460 #endif 461 bf = (struct ath_buf *)kmem_zalloc(sc->sc_vbuflen, KM_SLEEP); 462 sc->sc_vbufptr = bf; 463 464 /* DMA buffer size for each TX/RX packet */ 465 #ifdef ARN_TX_AGGREGRATION 466 sc->tx_dmabuf_size = 467 roundup((IEEE80211_MAX_MPDU_LEN + 3840 * 2), 468 min(sc->sc_cachelsz, (uint16_t)64)); 469 #else 470 sc->tx_dmabuf_size = 471 roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64)); 472 #endif 473 sc->rx_dmabuf_size = 474 roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64)); 475 476 /* create RX buffer list */ 477 err = arn_buflist_setup(devinfo, sc, &sc->sc_rxbuf_list, &bf, &ds, 478 ATH_RXBUF, DDI_DMA_READ | DDI_DMA_STREAMING, sc->rx_dmabuf_size); 479 if (err != DDI_SUCCESS) { 480 arn_desc_free(sc); 481 return (err); 482 } 483 484 /* create TX buffer list */ 485 err = arn_buflist_setup(devinfo, sc, &sc->sc_txbuf_list, &bf, &ds, 486 ATH_TXBUF, DDI_DMA_STREAMING, sc->tx_dmabuf_size); 487 if (err != DDI_SUCCESS) { 488 arn_desc_free(sc); 489 return (err); 490 } 491 492 /* create beacon buffer list */ 493 #ifdef ARN_IBSS 494 err = arn_buflist_setup(devinfo, sc, &sc->sc_bcbuf_list, &bf, &ds, 495 ATH_BCBUF, DDI_DMA_STREAMING); 496 if (err != DDI_SUCCESS) { 497 arn_desc_free(sc); 498 return (err); 499 } 500 #endif 501 502 return (DDI_SUCCESS); 503 } 504 505 static void 506 arn_setcurmode(struct arn_softc *sc, enum wireless_mode mode) 507 { 508 struct ath_rate_table *rt; 509 int i; 510 511 for (i = 0; i < sizeof (sc->asc_rixmap); i++) 512 sc->asc_rixmap[i] = 0xff; 513 514 rt = sc->hw_rate_table[mode]; 515 ASSERT(rt != NULL); 516 517 for (i = 0; i < rt->rate_cnt; i++) 518 sc->asc_rixmap[rt->info[i].dot11rate & 519 IEEE80211_RATE_VAL] = (uint8_t)i; /* LINT */ 520 521 sc->sc_currates = rt; 522 sc->sc_curmode = mode; 523 524 /* 525 * All protection frames are transmited at 2Mb/s for 526 * 11g, otherwise at 1Mb/s. 527 * XXX select protection rate index from rate table. 528 */ 529 sc->sc_protrix = (mode == ATH9K_MODE_11G ? 1 : 0); 530 } 531 532 static enum wireless_mode 533 arn_chan2mode(struct ath9k_channel *chan) 534 { 535 if (chan->chanmode == CHANNEL_A) 536 return (ATH9K_MODE_11A); 537 else if (chan->chanmode == CHANNEL_G) 538 return (ATH9K_MODE_11G); 539 else if (chan->chanmode == CHANNEL_B) 540 return (ATH9K_MODE_11B); 541 else if (chan->chanmode == CHANNEL_A_HT20) 542 return (ATH9K_MODE_11NA_HT20); 543 else if (chan->chanmode == CHANNEL_G_HT20) 544 return (ATH9K_MODE_11NG_HT20); 545 else if (chan->chanmode == CHANNEL_A_HT40PLUS) 546 return (ATH9K_MODE_11NA_HT40PLUS); 547 else if (chan->chanmode == CHANNEL_A_HT40MINUS) 548 return (ATH9K_MODE_11NA_HT40MINUS); 549 else if (chan->chanmode == CHANNEL_G_HT40PLUS) 550 return (ATH9K_MODE_11NG_HT40PLUS); 551 else if (chan->chanmode == CHANNEL_G_HT40MINUS) 552 return (ATH9K_MODE_11NG_HT40MINUS); 553 554 return (ATH9K_MODE_11B); 555 } 556 557 static void 558 arn_update_txpow(struct arn_softc *sc) 559 { 560 struct ath_hal *ah = sc->sc_ah; 561 uint32_t txpow; 562 563 if (sc->sc_curtxpow != sc->sc_config.txpowlimit) { 564 (void) ath9k_hw_set_txpowerlimit(ah, sc->sc_config.txpowlimit); 565 /* read back in case value is clamped */ 566 (void) ath9k_hw_getcapability(ah, ATH9K_CAP_TXPOW, 1, &txpow); 567 sc->sc_curtxpow = (uint32_t)txpow; 568 } 569 } 570 571 uint8_t 572 parse_mpdudensity(uint8_t mpdudensity) 573 { 574 /* 575 * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing": 576 * 0 for no restriction 577 * 1 for 1/4 us 578 * 2 for 1/2 us 579 * 3 for 1 us 580 * 4 for 2 us 581 * 5 for 4 us 582 * 6 for 8 us 583 * 7 for 16 us 584 */ 585 switch (mpdudensity) { 586 case 0: 587 return (0); 588 case 1: 589 case 2: 590 case 3: 591 /* 592 * Our lower layer calculations limit our 593 * precision to 1 microsecond 594 */ 595 return (1); 596 case 4: 597 return (2); 598 case 5: 599 return (4); 600 case 6: 601 return (8); 602 case 7: 603 return (16); 604 default: 605 return (0); 606 } 607 } 608 609 static void 610 arn_setup_rates(struct arn_softc *sc, uint32_t mode) 611 { 612 int i, maxrates; 613 struct ath_rate_table *rate_table = NULL; 614 struct ieee80211_rateset *rateset; 615 ieee80211com_t *ic = (ieee80211com_t *)sc; 616 617 /* rate_table = arn_get_ratetable(sc, mode); */ 618 switch (mode) { 619 case IEEE80211_MODE_11A: 620 rate_table = sc->hw_rate_table[ATH9K_MODE_11A]; 621 break; 622 case IEEE80211_MODE_11B: 623 rate_table = sc->hw_rate_table[ATH9K_MODE_11B]; 624 break; 625 case IEEE80211_MODE_11G: 626 rate_table = sc->hw_rate_table[ATH9K_MODE_11G]; 627 break; 628 #ifdef ARN_11N 629 case IEEE80211_MODE_11NA_HT20: 630 rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT20]; 631 break; 632 case IEEE80211_MODE_11NG_HT20: 633 rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT20]; 634 break; 635 case IEEE80211_MODE_11NA_HT40PLUS: 636 rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40PLUS]; 637 break; 638 case IEEE80211_MODE_11NA_HT40MINUS: 639 rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40MINUS]; 640 break; 641 case IEEE80211_MODE_11NG_HT40PLUS: 642 rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40PLUS]; 643 break; 644 case IEEE80211_MODE_11NG_HT40MINUS: 645 rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40MINUS]; 646 break; 647 #endif 648 default: 649 ARN_DBG((ARN_DBG_RATE, "arn: arn_get_ratetable(): " 650 "invalid mode %u\n", mode)); 651 break; 652 } 653 if (rate_table == NULL) 654 return; 655 if (rate_table->rate_cnt > ATH_RATE_MAX) { 656 ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): " 657 "rate table too small (%u > %u)\n", 658 rate_table->rate_cnt, IEEE80211_RATE_MAXSIZE)); 659 maxrates = ATH_RATE_MAX; 660 } else 661 maxrates = rate_table->rate_cnt; 662 663 ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): " 664 "maxrates is %d\n", maxrates)); 665 666 rateset = &ic->ic_sup_rates[mode]; 667 for (i = 0; i < maxrates; i++) { 668 rateset->ir_rates[i] = rate_table->info[i].dot11rate; 669 ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): " 670 "%d\n", rate_table->info[i].dot11rate)); 671 } 672 rateset->ir_nrates = (uint8_t)maxrates; /* ??? */ 673 } 674 675 static int 676 arn_setup_channels(struct arn_softc *sc) 677 { 678 struct ath_hal *ah = sc->sc_ah; 679 ieee80211com_t *ic = (ieee80211com_t *)sc; 680 int nchan, i, index; 681 uint8_t regclassids[ATH_REGCLASSIDS_MAX]; 682 uint32_t nregclass = 0; 683 struct ath9k_channel *c; 684 685 /* Fill in ah->ah_channels */ 686 if (!ath9k_regd_init_channels(ah, ATH_CHAN_MAX, (uint32_t *)&nchan, 687 regclassids, ATH_REGCLASSIDS_MAX, &nregclass, CTRY_DEFAULT, 688 B_FALSE, 1)) { 689 uint32_t rd = ah->ah_currentRD; 690 ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): " 691 "unable to collect channel list; " 692 "regdomain likely %u country code %u\n", 693 rd, CTRY_DEFAULT)); 694 return (EINVAL); 695 } 696 697 ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): " 698 "number of channel is %d\n", nchan)); 699 700 for (i = 0; i < nchan; i++) { 701 c = &ah->ah_channels[i]; 702 uint32_t flags; 703 index = ath9k_hw_mhz2ieee(ah, c->channel, c->channelFlags); 704 705 if (index > IEEE80211_CHAN_MAX) { 706 ARN_DBG((ARN_DBG_CHANNEL, 707 "arn: arn_setup_channels(): " 708 "bad hal channel %d (%u/%x) ignored\n", 709 index, c->channel, c->channelFlags)); 710 continue; 711 } 712 /* NB: flags are known to be compatible */ 713 if (index < 0) { 714 /* 715 * can't handle frequency <2400MHz (negative 716 * channels) right now 717 */ 718 ARN_DBG((ARN_DBG_CHANNEL, 719 "arn: arn_setup_channels(): " 720 "hal channel %d (%u/%x) " 721 "cannot be handled, ignored\n", 722 index, c->channel, c->channelFlags)); 723 continue; 724 } 725 726 /* 727 * Calculate net80211 flags; most are compatible 728 * but some need massaging. Note the static turbo 729 * conversion can be removed once net80211 is updated 730 * to understand static vs. dynamic turbo. 731 */ 732 733 flags = c->channelFlags & (CHANNEL_ALL | CHANNEL_PASSIVE); 734 735 if (ic->ic_sup_channels[index].ich_freq == 0) { 736 ic->ic_sup_channels[index].ich_freq = c->channel; 737 ic->ic_sup_channels[index].ich_flags = flags; 738 } else { 739 /* channels overlap; e.g. 11g and 11b */ 740 ic->ic_sup_channels[index].ich_flags |= flags; 741 } 742 if ((c->channelFlags & CHANNEL_G) == CHANNEL_G) { 743 sc->sc_have11g = 1; 744 ic->ic_caps |= IEEE80211_C_SHPREAMBLE | 745 IEEE80211_C_SHSLOT; /* short slot time */ 746 } 747 } 748 749 return (0); 750 } 751 752 uint32_t 753 arn_chan2flags(ieee80211com_t *isc, struct ieee80211_channel *chan) 754 { 755 uint32_t channel_mode; 756 switch (ieee80211_chan2mode(isc, chan)) { 757 case IEEE80211_MODE_11NA: 758 if (chan->ich_flags & IEEE80211_CHAN_HT40U) 759 channel_mode = CHANNEL_A_HT40PLUS; 760 else if (chan->ich_flags & IEEE80211_CHAN_HT40D) 761 channel_mode = CHANNEL_A_HT40MINUS; 762 else 763 channel_mode = CHANNEL_A_HT20; 764 break; 765 case IEEE80211_MODE_11NG: 766 if (chan->ich_flags & IEEE80211_CHAN_HT40U) 767 channel_mode = CHANNEL_G_HT40PLUS; 768 else if (chan->ich_flags & IEEE80211_CHAN_HT40D) 769 channel_mode = CHANNEL_G_HT40MINUS; 770 else 771 channel_mode = CHANNEL_G_HT20; 772 break; 773 case IEEE80211_MODE_TURBO_G: 774 case IEEE80211_MODE_STURBO_A: 775 case IEEE80211_MODE_TURBO_A: 776 channel_mode = 0; 777 break; 778 case IEEE80211_MODE_11A: 779 channel_mode = CHANNEL_A; 780 break; 781 case IEEE80211_MODE_11G: 782 channel_mode = CHANNEL_B; 783 break; 784 case IEEE80211_MODE_11B: 785 channel_mode = CHANNEL_G; 786 break; 787 case IEEE80211_MODE_FH: 788 channel_mode = 0; 789 break; 790 default: 791 break; 792 } 793 794 return (channel_mode); 795 } 796 797 /* 798 * Update internal state after a channel change. 799 */ 800 void 801 arn_chan_change(struct arn_softc *sc, struct ieee80211_channel *chan) 802 { 803 struct ieee80211com *ic = &sc->sc_isc; 804 enum ieee80211_phymode mode; 805 enum wireless_mode wlmode; 806 807 /* 808 * Change channels and update the h/w rate map 809 * if we're switching; e.g. 11a to 11b/g. 810 */ 811 mode = ieee80211_chan2mode(ic, chan); 812 switch (mode) { 813 case IEEE80211_MODE_11A: 814 wlmode = ATH9K_MODE_11A; 815 break; 816 case IEEE80211_MODE_11B: 817 wlmode = ATH9K_MODE_11B; 818 break; 819 case IEEE80211_MODE_11G: 820 wlmode = ATH9K_MODE_11B; 821 break; 822 default: 823 break; 824 } 825 if (wlmode != sc->sc_curmode) 826 arn_setcurmode(sc, wlmode); 827 828 } 829 830 /* 831 * Set/change channels. If the channel is really being changed, it's done 832 * by reseting the chip. To accomplish this we must first cleanup any pending 833 * DMA, then restart stuff. 834 */ 835 static int 836 arn_set_channel(struct arn_softc *sc, struct ath9k_channel *hchan) 837 { 838 struct ath_hal *ah = sc->sc_ah; 839 ieee80211com_t *ic = &sc->sc_isc; 840 boolean_t fastcc = B_TRUE; 841 boolean_t stopped; 842 struct ieee80211_channel chan; 843 enum wireless_mode curmode; 844 845 if (sc->sc_flags & SC_OP_INVALID) 846 return (EIO); 847 848 if (hchan->channel != sc->sc_ah->ah_curchan->channel || 849 hchan->channelFlags != sc->sc_ah->ah_curchan->channelFlags || 850 (sc->sc_flags & SC_OP_CHAINMASK_UPDATE) || 851 (sc->sc_flags & SC_OP_FULL_RESET)) { 852 int status; 853 854 /* 855 * This is only performed if the channel settings have 856 * actually changed. 857 * 858 * To switch channels clear any pending DMA operations; 859 * wait long enough for the RX fifo to drain, reset the 860 * hardware at the new frequency, and then re-enable 861 * the relevant bits of the h/w. 862 */ 863 (void) ath9k_hw_set_interrupts(ah, 0); /* disable interrupts */ 864 arn_draintxq(sc, B_FALSE); /* clear pending tx frames */ 865 stopped = arn_stoprecv(sc); /* turn off frame recv */ 866 867 /* 868 * XXX: do not flush receive queue here. We don't want 869 * to flush data frames already in queue because of 870 * changing channel. 871 */ 872 873 if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET)) 874 fastcc = B_FALSE; 875 876 ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_set_channel(): " 877 "(%u MHz) -> (%u MHz), cflags:%x, chanwidth: %d\n", 878 sc->sc_ah->ah_curchan->channel, 879 hchan->channel, hchan->channelFlags, sc->tx_chan_width)); 880 881 if (!ath9k_hw_reset(ah, hchan, sc->tx_chan_width, 882 sc->sc_tx_chainmask, sc->sc_rx_chainmask, 883 sc->sc_ht_extprotspacing, fastcc, &status)) { 884 ARN_DBG((ARN_DBG_FATAL, "arn: arn_set_channel(): " 885 "unable to reset channel %u (%uMhz) " 886 "flags 0x%x hal status %u\n", 887 ath9k_hw_mhz2ieee(ah, hchan->channel, 888 hchan->channelFlags), 889 hchan->channel, hchan->channelFlags, status)); 890 return (EIO); 891 } 892 893 sc->sc_curchan = *hchan; 894 895 sc->sc_flags &= ~SC_OP_CHAINMASK_UPDATE; 896 sc->sc_flags &= ~SC_OP_FULL_RESET; 897 898 if (arn_startrecv(sc) != 0) { 899 arn_problem("arn: arn_set_channel(): " 900 "unable to restart recv logic\n"); 901 return (EIO); 902 } 903 904 chan.ich_freq = hchan->channel; 905 chan.ich_flags = hchan->channelFlags; 906 ic->ic_ibss_chan = &chan; 907 908 /* 909 * Change channels and update the h/w rate map 910 * if we're switching; e.g. 11a to 11b/g. 911 */ 912 curmode = arn_chan2mode(hchan); 913 if (curmode != sc->sc_curmode) 914 arn_setcurmode(sc, arn_chan2mode(hchan)); 915 916 arn_update_txpow(sc); 917 918 (void) ath9k_hw_set_interrupts(ah, sc->sc_imask); 919 } 920 921 return (0); 922 } 923 924 /* 925 * This routine performs the periodic noise floor calibration function 926 * that is used to adjust and optimize the chip performance. This 927 * takes environmental changes (location, temperature) into account. 928 * When the task is complete, it reschedules itself depending on the 929 * appropriate interval that was calculated. 930 */ 931 static void 932 arn_ani_calibrate(void *arg) 933 { 934 ieee80211com_t *ic = (ieee80211com_t *)arg; 935 struct arn_softc *sc = (struct arn_softc *)ic; 936 struct ath_hal *ah = sc->sc_ah; 937 boolean_t longcal = B_FALSE; 938 boolean_t shortcal = B_FALSE; 939 boolean_t aniflag = B_FALSE; 940 unsigned int timestamp = drv_hztousec(ddi_get_lbolt())/1000; 941 uint32_t cal_interval; 942 943 /* 944 * don't calibrate when we're scanning. 945 * we are most likely not on our home channel. 946 */ 947 if (ic->ic_state != IEEE80211_S_RUN) 948 goto settimer; 949 950 /* Long calibration runs independently of short calibration. */ 951 if ((timestamp - sc->sc_ani.sc_longcal_timer) >= ATH_LONG_CALINTERVAL) { 952 longcal = B_TRUE; 953 ARN_DBG((ARN_DBG_CALIBRATE, "arn: " 954 "%s: longcal @%lu\n", __func__, drv_hztousec)); 955 sc->sc_ani.sc_longcal_timer = timestamp; 956 } 957 958 /* Short calibration applies only while sc_caldone is FALSE */ 959 if (!sc->sc_ani.sc_caldone) { 960 if ((timestamp - sc->sc_ani.sc_shortcal_timer) >= 961 ATH_SHORT_CALINTERVAL) { 962 shortcal = B_TRUE; 963 ARN_DBG((ARN_DBG_CALIBRATE, "arn: " 964 "%s: shortcal @%lu\n", 965 __func__, drv_hztousec)); 966 sc->sc_ani.sc_shortcal_timer = timestamp; 967 sc->sc_ani.sc_resetcal_timer = timestamp; 968 } 969 } else { 970 if ((timestamp - sc->sc_ani.sc_resetcal_timer) >= 971 ATH_RESTART_CALINTERVAL) { 972 ath9k_hw_reset_calvalid(ah, ah->ah_curchan, 973 &sc->sc_ani.sc_caldone); 974 if (sc->sc_ani.sc_caldone) 975 sc->sc_ani.sc_resetcal_timer = timestamp; 976 } 977 } 978 979 /* Verify whether we must check ANI */ 980 if ((timestamp - sc->sc_ani.sc_checkani_timer) >= 981 ATH_ANI_POLLINTERVAL) { 982 aniflag = B_TRUE; 983 sc->sc_ani.sc_checkani_timer = timestamp; 984 } 985 986 /* Skip all processing if there's nothing to do. */ 987 if (longcal || shortcal || aniflag) { 988 /* Call ANI routine if necessary */ 989 if (aniflag) 990 ath9k_hw_ani_monitor(ah, &sc->sc_halstats, 991 ah->ah_curchan); 992 993 /* Perform calibration if necessary */ 994 if (longcal || shortcal) { 995 boolean_t iscaldone = B_FALSE; 996 997 if (ath9k_hw_calibrate(ah, ah->ah_curchan, 998 sc->sc_rx_chainmask, longcal, &iscaldone)) { 999 if (longcal) 1000 sc->sc_ani.sc_noise_floor = 1001 ath9k_hw_getchan_noise(ah, 1002 ah->ah_curchan); 1003 1004 ARN_DBG((ARN_DBG_CALIBRATE, "arn: " 1005 "%s: calibrate chan %u/%x nf: %d\n", 1006 __func__, 1007 ah->ah_curchan->channel, 1008 ah->ah_curchan->channelFlags, 1009 sc->sc_ani.sc_noise_floor)); 1010 } else { 1011 ARN_DBG((ARN_DBG_CALIBRATE, "arn: " 1012 "%s: calibrate chan %u/%x failed\n", 1013 __func__, 1014 ah->ah_curchan->channel, 1015 ah->ah_curchan->channelFlags)); 1016 } 1017 sc->sc_ani.sc_caldone = iscaldone; 1018 } 1019 } 1020 1021 settimer: 1022 /* 1023 * Set timer interval based on previous results. 1024 * The interval must be the shortest necessary to satisfy ANI, 1025 * short calibration and long calibration. 1026 */ 1027 cal_interval = ATH_LONG_CALINTERVAL; 1028 if (sc->sc_ah->ah_config.enable_ani) 1029 cal_interval = 1030 min(cal_interval, (uint32_t)ATH_ANI_POLLINTERVAL); 1031 1032 if (!sc->sc_ani.sc_caldone) 1033 cal_interval = min(cal_interval, 1034 (uint32_t)ATH_SHORT_CALINTERVAL); 1035 1036 sc->sc_scan_timer = 0; 1037 sc->sc_scan_timer = timeout(arn_ani_calibrate, (void *)sc, 1038 drv_usectohz(cal_interval * 1000)); 1039 } 1040 1041 static void 1042 arn_stop_caltimer(struct arn_softc *sc) 1043 { 1044 timeout_id_t tmp_id = 0; 1045 1046 while ((sc->sc_cal_timer != 0) && (tmp_id != sc->sc_cal_timer)) { 1047 tmp_id = sc->sc_cal_timer; 1048 (void) untimeout(tmp_id); 1049 } 1050 sc->sc_cal_timer = 0; 1051 } 1052 1053 static uint_t 1054 arn_isr(caddr_t arg) 1055 { 1056 /* LINTED E_BAD_PTR_CAST_ALIGN */ 1057 struct arn_softc *sc = (struct arn_softc *)arg; 1058 struct ath_hal *ah = sc->sc_ah; 1059 enum ath9k_int status; 1060 ieee80211com_t *ic = (ieee80211com_t *)sc; 1061 1062 ARN_LOCK(sc); 1063 1064 if (sc->sc_flags & SC_OP_INVALID) { 1065 /* 1066 * The hardware is not ready/present, don't 1067 * touch anything. Note this can happen early 1068 * on if the IRQ is shared. 1069 */ 1070 ARN_UNLOCK(sc); 1071 return (DDI_INTR_UNCLAIMED); 1072 } 1073 if (!ath9k_hw_intrpend(ah)) { /* shared irq, not for us */ 1074 ARN_UNLOCK(sc); 1075 return (DDI_INTR_UNCLAIMED); 1076 } 1077 1078 /* 1079 * Figure out the reason(s) for the interrupt. Note 1080 * that the hal returns a pseudo-ISR that may include 1081 * bits we haven't explicitly enabled so we mask the 1082 * value to insure we only process bits we requested. 1083 */ 1084 (void) ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */ 1085 1086 status &= sc->sc_imask; /* discard unasked-for bits */ 1087 1088 /* 1089 * If there are no status bits set, then this interrupt was not 1090 * for me (should have been caught above). 1091 */ 1092 if (!status) { 1093 ARN_UNLOCK(sc); 1094 return (DDI_INTR_UNCLAIMED); 1095 } 1096 1097 sc->sc_intrstatus = status; 1098 1099 if (status & ATH9K_INT_FATAL) { 1100 /* need a chip reset */ 1101 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1102 "ATH9K_INT_FATAL\n")); 1103 goto reset; 1104 } else if (status & ATH9K_INT_RXORN) { 1105 /* need a chip reset */ 1106 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1107 "ATH9K_INT_RXORN\n")); 1108 goto reset; 1109 } else { 1110 if (status & ATH9K_INT_RXEOL) { 1111 /* 1112 * NB: the hardware should re-read the link when 1113 * RXE bit is written, but it doesn't work 1114 * at least on older hardware revs. 1115 */ 1116 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1117 "ATH9K_INT_RXEOL\n")); 1118 sc->sc_rxlink = NULL; 1119 } 1120 if (status & ATH9K_INT_TXURN) { 1121 /* bump tx trigger level */ 1122 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1123 "ATH9K_INT_TXURN\n")); 1124 (void) ath9k_hw_updatetxtriglevel(ah, B_TRUE); 1125 } 1126 /* XXX: optimize this */ 1127 if (status & ATH9K_INT_RX) { 1128 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1129 "ATH9K_INT_RX\n")); 1130 sc->sc_rx_pend = 1; 1131 ddi_trigger_softintr(sc->sc_softint_id); 1132 } 1133 if (status & ATH9K_INT_TX) { 1134 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1135 "ATH9K_INT_TX\n")); 1136 if (ddi_taskq_dispatch(sc->sc_tq, 1137 arn_tx_int_proc, sc, DDI_NOSLEEP) != 1138 DDI_SUCCESS) { 1139 arn_problem("arn: arn_isr(): " 1140 "No memory for tx taskq\n"); 1141 } 1142 } 1143 #ifdef ARN_ATH9K_INT_MIB 1144 if (status & ATH9K_INT_MIB) { 1145 /* 1146 * Disable interrupts until we service the MIB 1147 * interrupt; otherwise it will continue to 1148 * fire. 1149 */ 1150 (void) ath9k_hw_set_interrupts(ah, 0); 1151 /* 1152 * Let the hal handle the event. We assume 1153 * it will clear whatever condition caused 1154 * the interrupt. 1155 */ 1156 ath9k_hw_procmibevent(ah, &sc->sc_halstats); 1157 (void) ath9k_hw_set_interrupts(ah, sc->sc_imask); 1158 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1159 "ATH9K_INT_MIB\n")); 1160 } 1161 #endif 1162 1163 #ifdef ARN_ATH9K_INT_TIM_TIMER 1164 if (status & ATH9K_INT_TIM_TIMER) { 1165 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1166 "ATH9K_INT_TIM_TIMER\n")); 1167 if (!(ah->ah_caps.hw_caps & 1168 ATH9K_HW_CAP_AUTOSLEEP)) { 1169 /* 1170 * Clear RxAbort bit so that we can 1171 * receive frames 1172 */ 1173 ath9k_hw_setrxabort(ah, 0); 1174 goto reset; 1175 } 1176 } 1177 #endif 1178 1179 if (status & ATH9K_INT_BMISS) { 1180 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1181 "ATH9K_INT_BMISS\n")); 1182 #ifdef ARN_HW_BEACON_MISS_HANDLE 1183 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1184 "handle beacon mmiss by H/W mechanism\n")); 1185 if (ddi_taskq_dispatch(sc->sc_tq, arn_bmiss_proc, 1186 sc, DDI_NOSLEEP) != DDI_SUCCESS) { 1187 arn_problem("arn: arn_isr(): " 1188 "No memory available for bmiss taskq\n"); 1189 } 1190 #else 1191 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1192 "handle beacon mmiss by S/W mechanism\n")); 1193 #endif /* ARN_HW_BEACON_MISS_HANDLE */ 1194 } 1195 1196 ARN_UNLOCK(sc); 1197 1198 #ifdef ARN_ATH9K_INT_CST 1199 /* carrier sense timeout */ 1200 if (status & ATH9K_INT_CST) { 1201 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1202 "ATH9K_INT_CST\n")); 1203 return (DDI_INTR_CLAIMED); 1204 } 1205 #endif 1206 1207 if (status & ATH9K_INT_SWBA) { 1208 ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): " 1209 "ATH9K_INT_SWBA\n")); 1210 /* This will occur only in Host-AP or Ad-Hoc mode */ 1211 return (DDI_INTR_CLAIMED); 1212 } 1213 } 1214 1215 return (DDI_INTR_CLAIMED); 1216 reset: 1217 ARN_DBG((ARN_DBG_INTERRUPT, "Rset for fatal err\n")); 1218 (void) arn_reset(ic); 1219 ARN_UNLOCK(sc); 1220 return (DDI_INTR_CLAIMED); 1221 } 1222 1223 static int 1224 arn_get_channel(struct arn_softc *sc, struct ieee80211_channel *chan) 1225 { 1226 int i; 1227 1228 for (i = 0; i < sc->sc_ah->ah_nchan; i++) { 1229 if (sc->sc_ah->ah_channels[i].channel == chan->ich_freq) 1230 return (i); 1231 } 1232 1233 return (-1); 1234 } 1235 1236 int 1237 arn_reset(ieee80211com_t *ic) 1238 { 1239 struct arn_softc *sc = (struct arn_softc *)ic; 1240 struct ath_hal *ah = sc->sc_ah; 1241 int status; 1242 int error = 0; 1243 1244 (void) ath9k_hw_set_interrupts(ah, 0); 1245 arn_draintxq(sc, 0); 1246 (void) arn_stoprecv(sc); 1247 1248 if (!ath9k_hw_reset(ah, sc->sc_ah->ah_curchan, sc->tx_chan_width, 1249 sc->sc_tx_chainmask, sc->sc_rx_chainmask, 1250 sc->sc_ht_extprotspacing, B_FALSE, &status)) { 1251 ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): " 1252 "unable to reset hardware; hal status %u\n", status)); 1253 error = EIO; 1254 } 1255 1256 if (arn_startrecv(sc) != 0) 1257 ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): " 1258 "unable to start recv logic\n")); 1259 1260 /* 1261 * We may be doing a reset in response to a request 1262 * that changes the channel so update any state that 1263 * might change as a result. 1264 */ 1265 arn_setcurmode(sc, arn_chan2mode(sc->sc_ah->ah_curchan)); 1266 1267 arn_update_txpow(sc); 1268 1269 if (sc->sc_flags & SC_OP_BEACONS) 1270 arn_beacon_config(sc); /* restart beacons */ 1271 1272 (void) ath9k_hw_set_interrupts(ah, sc->sc_imask); 1273 1274 return (error); 1275 } 1276 1277 int 1278 arn_get_hal_qnum(uint16_t queue, struct arn_softc *sc) 1279 { 1280 int qnum; 1281 1282 switch (queue) { 1283 case WME_AC_VO: 1284 qnum = sc->sc_haltype2q[ATH9K_WME_AC_VO]; 1285 break; 1286 case WME_AC_VI: 1287 qnum = sc->sc_haltype2q[ATH9K_WME_AC_VI]; 1288 break; 1289 case WME_AC_BE: 1290 qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE]; 1291 break; 1292 case WME_AC_BK: 1293 qnum = sc->sc_haltype2q[ATH9K_WME_AC_BK]; 1294 break; 1295 default: 1296 qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE]; 1297 break; 1298 } 1299 1300 return (qnum); 1301 } 1302 1303 static struct { 1304 uint32_t version; 1305 const char *name; 1306 } ath_mac_bb_names[] = { 1307 { AR_SREV_VERSION_5416_PCI, "5416" }, 1308 { AR_SREV_VERSION_5416_PCIE, "5418" }, 1309 { AR_SREV_VERSION_9100, "9100" }, 1310 { AR_SREV_VERSION_9160, "9160" }, 1311 { AR_SREV_VERSION_9280, "9280" }, 1312 { AR_SREV_VERSION_9285, "9285" } 1313 }; 1314 1315 static struct { 1316 uint16_t version; 1317 const char *name; 1318 } ath_rf_names[] = { 1319 { 0, "5133" }, 1320 { AR_RAD5133_SREV_MAJOR, "5133" }, 1321 { AR_RAD5122_SREV_MAJOR, "5122" }, 1322 { AR_RAD2133_SREV_MAJOR, "2133" }, 1323 { AR_RAD2122_SREV_MAJOR, "2122" } 1324 }; 1325 1326 /* 1327 * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown. 1328 */ 1329 1330 static const char * 1331 arn_mac_bb_name(uint32_t mac_bb_version) 1332 { 1333 int i; 1334 1335 for (i = 0; i < ARRAY_SIZE(ath_mac_bb_names); i++) { 1336 if (ath_mac_bb_names[i].version == mac_bb_version) { 1337 return (ath_mac_bb_names[i].name); 1338 } 1339 } 1340 1341 return ("????"); 1342 } 1343 1344 /* 1345 * Return the RF name. "????" is returned if the RF is unknown. 1346 */ 1347 1348 static const char * 1349 arn_rf_name(uint16_t rf_version) 1350 { 1351 int i; 1352 1353 for (i = 0; i < ARRAY_SIZE(ath_rf_names); i++) { 1354 if (ath_rf_names[i].version == rf_version) { 1355 return (ath_rf_names[i].name); 1356 } 1357 } 1358 1359 return ("????"); 1360 } 1361 1362 static void 1363 arn_next_scan(void *arg) 1364 { 1365 ieee80211com_t *ic = arg; 1366 struct arn_softc *sc = (struct arn_softc *)ic; 1367 1368 sc->sc_scan_timer = 0; 1369 if (ic->ic_state == IEEE80211_S_SCAN) { 1370 sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc, 1371 drv_usectohz(arn_dwelltime * 1000)); 1372 ieee80211_next_scan(ic); 1373 } 1374 } 1375 1376 static void 1377 arn_stop_scantimer(struct arn_softc *sc) 1378 { 1379 timeout_id_t tmp_id = 0; 1380 1381 while ((sc->sc_scan_timer != 0) && (tmp_id != sc->sc_scan_timer)) { 1382 tmp_id = sc->sc_scan_timer; 1383 (void) untimeout(tmp_id); 1384 } 1385 sc->sc_scan_timer = 0; 1386 } 1387 1388 static int32_t 1389 arn_newstate(ieee80211com_t *ic, enum ieee80211_state nstate, int arg) 1390 { 1391 struct arn_softc *sc = (struct arn_softc *)ic; 1392 struct ath_hal *ah = sc->sc_ah; 1393 struct ieee80211_node *in; 1394 int32_t i, error; 1395 uint8_t *bssid; 1396 uint32_t rfilt; 1397 enum ieee80211_state ostate; 1398 struct ath9k_channel *channel; 1399 int pos; 1400 1401 /* Should set up & init LED here */ 1402 1403 if (sc->sc_flags & SC_OP_INVALID) 1404 return (0); 1405 1406 ostate = ic->ic_state; 1407 ARN_DBG((ARN_DBG_INIT, "arn: arn_newstate(): " 1408 "%x -> %x!\n", ostate, nstate)); 1409 1410 ARN_LOCK(sc); 1411 1412 if (nstate != IEEE80211_S_SCAN) 1413 arn_stop_scantimer(sc); 1414 if (nstate != IEEE80211_S_RUN) 1415 arn_stop_caltimer(sc); 1416 1417 /* Should set LED here */ 1418 1419 if (nstate == IEEE80211_S_INIT) { 1420 sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); 1421 /* 1422 * Disable interrupts. 1423 */ 1424 (void) ath9k_hw_set_interrupts 1425 (ah, sc->sc_imask &~ ATH9K_INT_GLOBAL); 1426 1427 #ifdef ARN_IBSS 1428 if (ic->ic_opmode == IEEE80211_M_IBSS) { 1429 (void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq); 1430 arn_beacon_return(sc); 1431 } 1432 #endif 1433 ARN_UNLOCK(sc); 1434 ieee80211_stop_watchdog(ic); 1435 goto done; 1436 } 1437 in = ic->ic_bss; 1438 1439 pos = arn_get_channel(sc, ic->ic_curchan); 1440 1441 if (pos == -1) { 1442 ARN_DBG((ARN_DBG_FATAL, "arn: " 1443 "%s: Invalid channel\n", __func__)); 1444 error = EINVAL; 1445 ARN_UNLOCK(sc); 1446 goto bad; 1447 } 1448 1449 if (in->in_htcap & IEEE80211_HTCAP_CHWIDTH40) { 1450 arn_update_chainmask(sc); 1451 sc->tx_chan_width = ATH9K_HT_MACMODE_2040; 1452 } else 1453 sc->tx_chan_width = ATH9K_HT_MACMODE_20; 1454 1455 sc->sc_ah->ah_channels[pos].chanmode = 1456 arn_chan2flags(ic, ic->ic_curchan); 1457 channel = &sc->sc_ah->ah_channels[pos]; 1458 if (channel == NULL) { 1459 arn_problem("arn_newstate(): channel == NULL"); 1460 ARN_UNLOCK(sc); 1461 goto bad; 1462 } 1463 error = arn_set_channel(sc, channel); 1464 if (error != 0) { 1465 if (nstate != IEEE80211_S_SCAN) { 1466 ARN_UNLOCK(sc); 1467 ieee80211_reset_chan(ic); 1468 goto bad; 1469 } 1470 } 1471 1472 /* 1473 * Get the receive filter according to the 1474 * operating mode and state 1475 */ 1476 rfilt = arn_calcrxfilter(sc); 1477 1478 if (nstate == IEEE80211_S_SCAN) 1479 bssid = ic->ic_macaddr; 1480 else 1481 bssid = in->in_bssid; 1482 1483 ath9k_hw_setrxfilter(ah, rfilt); 1484 1485 if (nstate == IEEE80211_S_RUN && ic->ic_opmode != IEEE80211_M_IBSS) 1486 ath9k_hw_write_associd(ah, bssid, in->in_associd); 1487 else 1488 ath9k_hw_write_associd(ah, bssid, 0); 1489 1490 /* Check for WLAN_CAPABILITY_PRIVACY ? */ 1491 if (ic->ic_flags & IEEE80211_F_PRIVACY) { 1492 for (i = 0; i < IEEE80211_WEP_NKID; i++) { 1493 if (ath9k_hw_keyisvalid(ah, (uint16_t)i)) 1494 (void) ath9k_hw_keysetmac(ah, (uint16_t)i, 1495 bssid); 1496 } 1497 } 1498 1499 if (nstate == IEEE80211_S_RUN) { 1500 switch (ic->ic_opmode) { 1501 #ifdef ARN_IBSS 1502 case IEEE80211_M_IBSS: 1503 /* 1504 * Allocate and setup the beacon frame. 1505 * Stop any previous beacon DMA. 1506 */ 1507 (void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq); 1508 arn_beacon_return(sc); 1509 error = arn_beacon_alloc(sc, in); 1510 if (error != 0) { 1511 ARN_UNLOCK(sc); 1512 goto bad; 1513 } 1514 /* 1515 * If joining an adhoc network defer beacon timer 1516 * configuration to the next beacon frame so we 1517 * have a current TSF to use. Otherwise we're 1518 * starting an ibss/bss so there's no need to delay. 1519 */ 1520 if (ic->ic_opmode == IEEE80211_M_IBSS && 1521 ic->ic_bss->in_tstamp.tsf != 0) { 1522 sc->sc_bsync = 1; 1523 } else { 1524 arn_beacon_config(sc); 1525 } 1526 break; 1527 #endif /* ARN_IBSS */ 1528 case IEEE80211_M_STA: 1529 if (ostate != IEEE80211_S_RUN) { 1530 /* 1531 * Defer beacon timer configuration to the next 1532 * beacon frame so we have a current TSF to use. 1533 * Any TSF collected when scanning is likely old 1534 */ 1535 #ifdef ARN_IBSS 1536 sc->sc_bsync = 1; 1537 #else 1538 /* Configure the beacon and sleep timers. */ 1539 arn_beacon_config(sc); 1540 /* Reset rssi stats */ 1541 sc->sc_halstats.ns_avgbrssi = 1542 ATH_RSSI_DUMMY_MARKER; 1543 sc->sc_halstats.ns_avgrssi = 1544 ATH_RSSI_DUMMY_MARKER; 1545 sc->sc_halstats.ns_avgtxrssi = 1546 ATH_RSSI_DUMMY_MARKER; 1547 sc->sc_halstats.ns_avgtxrate = 1548 ATH_RATE_DUMMY_MARKER; 1549 /* end */ 1550 1551 #endif /* ARN_IBSS */ 1552 } 1553 break; 1554 default: 1555 break; 1556 } 1557 } else { 1558 sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); 1559 (void) ath9k_hw_set_interrupts(ah, sc->sc_imask); 1560 } 1561 1562 /* 1563 * Reset the rate control state. 1564 */ 1565 arn_rate_ctl_reset(sc, nstate); 1566 1567 ARN_UNLOCK(sc); 1568 done: 1569 /* 1570 * Invoke the parent method to complete the work. 1571 */ 1572 error = sc->sc_newstate(ic, nstate, arg); 1573 1574 /* 1575 * Finally, start any timers. 1576 */ 1577 if (nstate == IEEE80211_S_RUN) { 1578 ieee80211_start_watchdog(ic, 1); 1579 ASSERT(sc->sc_cal_timer == 0); 1580 sc->sc_cal_timer = timeout(arn_ani_calibrate, (void *)sc, 1581 drv_usectohz(100 * 1000)); 1582 } else if ((nstate == IEEE80211_S_SCAN) && (ostate != nstate)) { 1583 /* start ap/neighbor scan timer */ 1584 /* ASSERT(sc->sc_scan_timer == 0); */ 1585 if (sc->sc_scan_timer != 0) { 1586 (void) untimeout(sc->sc_scan_timer); 1587 sc->sc_scan_timer = 0; 1588 } 1589 sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc, 1590 drv_usectohz(arn_dwelltime * 1000)); 1591 } 1592 1593 bad: 1594 return (error); 1595 } 1596 1597 static void 1598 arn_watchdog(void *arg) 1599 { 1600 struct arn_softc *sc = arg; 1601 ieee80211com_t *ic = &sc->sc_isc; 1602 int ntimer = 0; 1603 1604 ARN_LOCK(sc); 1605 ic->ic_watchdog_timer = 0; 1606 if (sc->sc_flags & SC_OP_INVALID) { 1607 ARN_UNLOCK(sc); 1608 return; 1609 } 1610 1611 if (ic->ic_state == IEEE80211_S_RUN) { 1612 /* 1613 * Start the background rate control thread if we 1614 * are not configured to use a fixed xmit rate. 1615 */ 1616 #ifdef ARN_LEGACY_RC 1617 if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) { 1618 sc->sc_stats.ast_rate_calls ++; 1619 if (ic->ic_opmode == IEEE80211_M_STA) 1620 arn_rate_ctl(ic, ic->ic_bss); 1621 else 1622 ieee80211_iterate_nodes(&ic->ic_sta, 1623 arn_rate_ctl, sc); 1624 } 1625 #endif /* ARN_LEGACY_RC */ 1626 1627 #ifdef ARN_HW_BEACON_MISS_HANDLE 1628 /* nothing to do here */ 1629 #else 1630 /* currently set 10 seconds as beacon miss threshold */ 1631 if (ic->ic_beaconmiss++ > 100) { 1632 ARN_DBG((ARN_DBG_BEACON, "arn_watchdog():" 1633 "Beacon missed for 10 seconds, run" 1634 "ieee80211_new_state(ic, IEEE80211_S_INIT, -1)\n")); 1635 ARN_UNLOCK(sc); 1636 (void) ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 1637 return; 1638 } 1639 #endif /* ARN_HW_BEACON_MISS_HANDLE */ 1640 1641 ntimer = 1; 1642 } 1643 ARN_UNLOCK(sc); 1644 1645 ieee80211_watchdog(ic); 1646 if (ntimer != 0) 1647 ieee80211_start_watchdog(ic, ntimer); 1648 } 1649 1650 /* ARGSUSED */ 1651 static struct ieee80211_node * 1652 arn_node_alloc(ieee80211com_t *ic) 1653 { 1654 struct ath_node *an; 1655 #ifdef ARN_TX_AGGREGATION 1656 struct arn_softc *sc = (struct arn_softc *)ic; 1657 #endif 1658 1659 an = kmem_zalloc(sizeof (struct ath_node), KM_SLEEP); 1660 1661 /* legacy rate control */ 1662 #ifdef ARN_LEGACY_RC 1663 arn_rate_update(sc, &an->an_node, 0); 1664 #endif 1665 1666 #ifdef ARN_TX_AGGREGATION 1667 if (sc->sc_flags & SC_OP_TXAGGR) { 1668 arn_tx_node_init(sc, an); 1669 } 1670 #endif /* ARN_TX_AGGREGATION */ 1671 1672 an->last_rssi = ATH_RSSI_DUMMY_MARKER; 1673 1674 return ((an != NULL) ? &an->an_node : NULL); 1675 } 1676 1677 static void 1678 arn_node_free(struct ieee80211_node *in) 1679 { 1680 ieee80211com_t *ic = in->in_ic; 1681 struct arn_softc *sc = (struct arn_softc *)ic; 1682 struct ath_buf *bf; 1683 struct ath_txq *txq; 1684 int32_t i; 1685 1686 #ifdef ARN_TX_AGGREGATION 1687 if (sc->sc_flags & SC_OP_TXAGGR) 1688 arn_tx_node_cleanup(sc, in); 1689 #endif /* TX_AGGREGATION */ 1690 1691 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 1692 if (ARN_TXQ_SETUP(sc, i)) { 1693 txq = &sc->sc_txq[i]; 1694 mutex_enter(&txq->axq_lock); 1695 bf = list_head(&txq->axq_list); 1696 while (bf != NULL) { 1697 if (bf->bf_in == in) { 1698 bf->bf_in = NULL; 1699 } 1700 bf = list_next(&txq->axq_list, bf); 1701 } 1702 mutex_exit(&txq->axq_lock); 1703 } 1704 } 1705 1706 ic->ic_node_cleanup(in); 1707 1708 if (in->in_wpa_ie != NULL) 1709 ieee80211_free(in->in_wpa_ie); 1710 1711 if (in->in_wme_ie != NULL) 1712 ieee80211_free(in->in_wme_ie); 1713 1714 if (in->in_htcap_ie != NULL) 1715 ieee80211_free(in->in_htcap_ie); 1716 1717 kmem_free(in, sizeof (struct ath_node)); 1718 } 1719 1720 /* 1721 * Allocate tx/rx key slots for TKIP. We allocate one slot for 1722 * each key. MIC is right after the decrypt/encrypt key. 1723 */ 1724 static uint16_t 1725 arn_key_alloc_pair(struct arn_softc *sc, ieee80211_keyix *txkeyix, 1726 ieee80211_keyix *rxkeyix) 1727 { 1728 uint16_t i, keyix; 1729 1730 ASSERT(!sc->sc_splitmic); 1731 for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) { 1732 uint8_t b = sc->sc_keymap[i]; 1733 if (b == 0xff) 1734 continue; 1735 for (keyix = i * NBBY; keyix < (i + 1) * NBBY; 1736 keyix++, b >>= 1) { 1737 if ((b & 1) || is_set(keyix+64, sc->sc_keymap)) { 1738 /* full pair unavailable */ 1739 continue; 1740 } 1741 set_bit(keyix, sc->sc_keymap); 1742 set_bit(keyix+64, sc->sc_keymap); 1743 ARN_DBG((ARN_DBG_KEYCACHE, 1744 "arn_key_alloc_pair(): key pair %u,%u\n", 1745 keyix, keyix+64)); 1746 *txkeyix = *rxkeyix = keyix; 1747 return (1); 1748 } 1749 } 1750 ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_pair():" 1751 " out of pair space\n")); 1752 1753 return (0); 1754 } 1755 1756 /* 1757 * Allocate tx/rx key slots for TKIP. We allocate two slots for 1758 * each key, one for decrypt/encrypt and the other for the MIC. 1759 */ 1760 static int 1761 arn_key_alloc_2pair(struct arn_softc *sc, ieee80211_keyix *txkeyix, 1762 ieee80211_keyix *rxkeyix) 1763 { 1764 uint16_t i, keyix; 1765 1766 ASSERT(sc->sc_splitmic); 1767 for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) { 1768 uint8_t b = sc->sc_keymap[i]; 1769 if (b != 0xff) { 1770 /* 1771 * One or more slots in this byte are free. 1772 */ 1773 keyix = i*NBBY; 1774 while (b & 1) { 1775 again: 1776 keyix++; 1777 b >>= 1; 1778 } 1779 /* XXX IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV */ 1780 if (is_set(keyix+32, sc->sc_keymap) || 1781 is_set(keyix+64, sc->sc_keymap) || 1782 is_set(keyix+32+64, sc->sc_keymap)) { 1783 /* full pair unavailable */ 1784 if (keyix == (i+1)*NBBY) { 1785 /* no slots were appropriate, advance */ 1786 continue; 1787 } 1788 goto again; 1789 } 1790 set_bit(keyix, sc->sc_keymap); 1791 set_bit(keyix+64, sc->sc_keymap); 1792 set_bit(keyix+32, sc->sc_keymap); 1793 set_bit(keyix+32+64, sc->sc_keymap); 1794 ARN_DBG((ARN_DBG_KEYCACHE, 1795 "arn_key_alloc_2pair(): key pair %u,%u %u,%u\n", 1796 keyix, keyix+64, 1797 keyix+32, keyix+32+64)); 1798 *txkeyix = *rxkeyix = keyix; 1799 return (1); 1800 } 1801 } 1802 ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_2pair(): " 1803 " out of pair space\n")); 1804 1805 return (0); 1806 } 1807 /* 1808 * Allocate a single key cache slot. 1809 */ 1810 static int 1811 arn_key_alloc_single(struct arn_softc *sc, ieee80211_keyix *txkeyix, 1812 ieee80211_keyix *rxkeyix) 1813 { 1814 uint16_t i, keyix; 1815 1816 /* try i,i+32,i+64,i+32+64 to minimize key pair conflicts */ 1817 for (i = 0; i < ARRAY_SIZE(sc->sc_keymap); i++) { 1818 uint8_t b = sc->sc_keymap[i]; 1819 1820 if (b != 0xff) { 1821 /* 1822 * One or more slots are free. 1823 */ 1824 keyix = i*NBBY; 1825 while (b & 1) 1826 keyix++, b >>= 1; 1827 set_bit(keyix, sc->sc_keymap); 1828 ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_single(): " 1829 "key %u\n", keyix)); 1830 *txkeyix = *rxkeyix = keyix; 1831 return (1); 1832 } 1833 } 1834 return (0); 1835 } 1836 1837 /* 1838 * Allocate one or more key cache slots for a unicast key. The 1839 * key itself is needed only to identify the cipher. For hardware 1840 * TKIP with split cipher+MIC keys we allocate two key cache slot 1841 * pairs so that we can setup separate TX and RX MIC keys. Note 1842 * that the MIC key for a TKIP key at slot i is assumed by the 1843 * hardware to be at slot i+64. This limits TKIP keys to the first 1844 * 64 entries. 1845 */ 1846 /* ARGSUSED */ 1847 int 1848 arn_key_alloc(ieee80211com_t *ic, const struct ieee80211_key *k, 1849 ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix) 1850 { 1851 struct arn_softc *sc = (struct arn_softc *)ic; 1852 1853 /* 1854 * We allocate two pair for TKIP when using the h/w to do 1855 * the MIC. For everything else, including software crypto, 1856 * we allocate a single entry. Note that s/w crypto requires 1857 * a pass-through slot on the 5211 and 5212. The 5210 does 1858 * not support pass-through cache entries and we map all 1859 * those requests to slot 0. 1860 */ 1861 if (k->wk_flags & IEEE80211_KEY_SWCRYPT) { 1862 return (arn_key_alloc_single(sc, keyix, rxkeyix)); 1863 } else if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP && 1864 (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) { 1865 if (sc->sc_splitmic) 1866 return (arn_key_alloc_2pair(sc, keyix, rxkeyix)); 1867 else 1868 return (arn_key_alloc_pair(sc, keyix, rxkeyix)); 1869 } else { 1870 return (arn_key_alloc_single(sc, keyix, rxkeyix)); 1871 } 1872 } 1873 1874 /* 1875 * Delete an entry in the key cache allocated by ath_key_alloc. 1876 */ 1877 int 1878 arn_key_delete(ieee80211com_t *ic, const struct ieee80211_key *k) 1879 { 1880 struct arn_softc *sc = (struct arn_softc *)ic; 1881 struct ath_hal *ah = sc->sc_ah; 1882 const struct ieee80211_cipher *cip = k->wk_cipher; 1883 ieee80211_keyix keyix = k->wk_keyix; 1884 1885 ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_delete():" 1886 " delete key %u ic_cipher=0x%x\n", keyix, cip->ic_cipher)); 1887 1888 (void) ath9k_hw_keyreset(ah, keyix); 1889 /* 1890 * Handle split tx/rx keying required for TKIP with h/w MIC. 1891 */ 1892 if (cip->ic_cipher == IEEE80211_CIPHER_TKIP && 1893 (k->wk_flags & IEEE80211_KEY_SWMIC) == 0 && sc->sc_splitmic) 1894 (void) ath9k_hw_keyreset(ah, keyix+32); /* RX key */ 1895 1896 if (keyix >= IEEE80211_WEP_NKID) { 1897 /* 1898 * Don't touch keymap entries for global keys so 1899 * they are never considered for dynamic allocation. 1900 */ 1901 clr_bit(keyix, sc->sc_keymap); 1902 if (cip->ic_cipher == IEEE80211_CIPHER_TKIP && 1903 (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) { 1904 /* 1905 * If splitmic is true +64 is TX key MIC, 1906 * else +64 is RX key + RX key MIC. 1907 */ 1908 clr_bit(keyix+64, sc->sc_keymap); 1909 if (sc->sc_splitmic) { 1910 /* Rx key */ 1911 clr_bit(keyix+32, sc->sc_keymap); 1912 /* RX key MIC */ 1913 clr_bit(keyix+32+64, sc->sc_keymap); 1914 } 1915 } 1916 } 1917 return (1); 1918 } 1919 1920 /* 1921 * Set a TKIP key into the hardware. This handles the 1922 * potential distribution of key state to multiple key 1923 * cache slots for TKIP. 1924 */ 1925 static int 1926 arn_keyset_tkip(struct arn_softc *sc, const struct ieee80211_key *k, 1927 struct ath9k_keyval *hk, const uint8_t mac[IEEE80211_ADDR_LEN]) 1928 { 1929 uint8_t *key_rxmic = NULL; 1930 uint8_t *key_txmic = NULL; 1931 uint8_t *key = (uint8_t *)&(k->wk_key[0]); 1932 struct ath_hal *ah = sc->sc_ah; 1933 1934 key_txmic = key + 16; 1935 key_rxmic = key + 24; 1936 1937 if (mac == NULL) { 1938 /* Group key installation */ 1939 (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic)); 1940 return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, 1941 mac, B_FALSE)); 1942 } 1943 if (!sc->sc_splitmic) { 1944 /* 1945 * data key goes at first index, 1946 * the hal handles the MIC keys at index+64. 1947 */ 1948 (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic)); 1949 (void) memcpy(hk->kv_txmic, key_txmic, sizeof (hk->kv_txmic)); 1950 return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, 1951 mac, B_FALSE)); 1952 } 1953 /* 1954 * TX key goes at first index, RX key at +32. 1955 * The hal handles the MIC keys at index+64. 1956 */ 1957 (void) memcpy(hk->kv_mic, key_txmic, sizeof (hk->kv_mic)); 1958 if (!(ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, NULL, 1959 B_FALSE))) { 1960 /* Txmic entry failed. No need to proceed further */ 1961 ARN_DBG((ARN_DBG_KEYCACHE, 1962 "%s Setting TX MIC Key Failed\n", __func__)); 1963 return (0); 1964 } 1965 1966 (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic)); 1967 1968 /* XXX delete tx key on failure? */ 1969 return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, mac, B_FALSE)); 1970 1971 } 1972 1973 int 1974 arn_key_set(ieee80211com_t *ic, const struct ieee80211_key *k, 1975 const uint8_t mac[IEEE80211_ADDR_LEN]) 1976 { 1977 struct arn_softc *sc = (struct arn_softc *)ic; 1978 const struct ieee80211_cipher *cip = k->wk_cipher; 1979 struct ath9k_keyval hk; 1980 1981 /* cipher table */ 1982 static const uint8_t ciphermap[] = { 1983 ATH9K_CIPHER_WEP, /* IEEE80211_CIPHER_WEP */ 1984 ATH9K_CIPHER_TKIP, /* IEEE80211_CIPHER_TKIP */ 1985 ATH9K_CIPHER_AES_OCB, /* IEEE80211_CIPHER_AES_OCB */ 1986 ATH9K_CIPHER_AES_CCM, /* IEEE80211_CIPHER_AES_CCM */ 1987 ATH9K_CIPHER_CKIP, /* IEEE80211_CIPHER_CKIP */ 1988 ATH9K_CIPHER_CLR, /* IEEE80211_CIPHER_NONE */ 1989 }; 1990 1991 bzero(&hk, sizeof (hk)); 1992 1993 /* 1994 * Software crypto uses a "clear key" so non-crypto 1995 * state kept in the key cache are maintainedd so that 1996 * rx frames have an entry to match. 1997 */ 1998 if ((k->wk_flags & IEEE80211_KEY_SWCRYPT) == 0) { 1999 ASSERT(cip->ic_cipher < 6); 2000 hk.kv_type = ciphermap[cip->ic_cipher]; 2001 hk.kv_len = k->wk_keylen; 2002 bcopy(k->wk_key, hk.kv_val, k->wk_keylen); 2003 } else { 2004 hk.kv_type = ATH9K_CIPHER_CLR; 2005 } 2006 2007 if (hk.kv_type == ATH9K_CIPHER_TKIP && 2008 (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) { 2009 return (arn_keyset_tkip(sc, k, &hk, mac)); 2010 } else { 2011 return (ath9k_hw_set_keycache_entry(sc->sc_ah, 2012 k->wk_keyix, &hk, mac, B_FALSE)); 2013 } 2014 } 2015 2016 /* 2017 * Enable/Disable short slot timing 2018 */ 2019 void 2020 arn_set_shortslot(ieee80211com_t *ic, int onoff) 2021 { 2022 struct ath_hal *ah = ((struct arn_softc *)ic)->sc_ah; 2023 2024 if (onoff) 2025 (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9); 2026 else 2027 (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_20); 2028 } 2029 2030 static int 2031 arn_open(struct arn_softc *sc) 2032 { 2033 ieee80211com_t *ic = (ieee80211com_t *)sc; 2034 struct ieee80211_channel *curchan = ic->ic_curchan; 2035 struct ath9k_channel *init_channel; 2036 int error = 0, pos, status; 2037 2038 ARN_LOCK_ASSERT(sc); 2039 2040 pos = arn_get_channel(sc, curchan); 2041 if (pos == -1) { 2042 ARN_DBG((ARN_DBG_FATAL, "arn: " 2043 "%s: Invalid channel\n", __func__)); 2044 error = EINVAL; 2045 goto error; 2046 } 2047 2048 sc->tx_chan_width = ATH9K_HT_MACMODE_20; 2049 2050 if (sc->sc_curmode == ATH9K_MODE_11A) { 2051 sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_A; 2052 } else { 2053 sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_G; 2054 } 2055 2056 init_channel = &sc->sc_ah->ah_channels[pos]; 2057 2058 /* Reset SERDES registers */ 2059 ath9k_hw_configpcipowersave(sc->sc_ah, 0); 2060 2061 /* 2062 * The basic interface to setting the hardware in a good 2063 * state is ``reset''. On return the hardware is known to 2064 * be powered up and with interrupts disabled. This must 2065 * be followed by initialization of the appropriate bits 2066 * and then setup of the interrupt mask. 2067 */ 2068 if (!ath9k_hw_reset(sc->sc_ah, init_channel, 2069 sc->tx_chan_width, sc->sc_tx_chainmask, 2070 sc->sc_rx_chainmask, sc->sc_ht_extprotspacing, 2071 B_FALSE, &status)) { 2072 ARN_DBG((ARN_DBG_FATAL, "arn: " 2073 "%s: unable to reset hardware; hal status %u " 2074 "(freq %u flags 0x%x)\n", __func__, status, 2075 init_channel->channel, init_channel->channelFlags)); 2076 2077 error = EIO; 2078 goto error; 2079 } 2080 2081 /* 2082 * This is needed only to setup initial state 2083 * but it's best done after a reset. 2084 */ 2085 arn_update_txpow(sc); 2086 2087 /* 2088 * Setup the hardware after reset: 2089 * The receive engine is set going. 2090 * Frame transmit is handled entirely 2091 * in the frame output path; there's nothing to do 2092 * here except setup the interrupt mask. 2093 */ 2094 if (arn_startrecv(sc) != 0) { 2095 ARN_DBG((ARN_DBG_INIT, "arn: " 2096 "%s: unable to start recv logic\n", __func__)); 2097 error = EIO; 2098 goto error; 2099 } 2100 2101 /* Setup our intr mask. */ 2102 sc->sc_imask = ATH9K_INT_RX | ATH9K_INT_TX | 2103 ATH9K_INT_RXEOL | ATH9K_INT_RXORN | 2104 ATH9K_INT_FATAL | ATH9K_INT_GLOBAL; 2105 #ifdef ARN_ATH9K_HW_CAP_GTT 2106 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_GTT) 2107 sc->sc_imask |= ATH9K_INT_GTT; 2108 #endif 2109 2110 #ifdef ARN_ATH9K_HW_CAP_GTT 2111 if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) 2112 sc->sc_imask |= ATH9K_INT_CST; 2113 #endif 2114 2115 /* 2116 * Enable MIB interrupts when there are hardware phy counters. 2117 * Note we only do this (at the moment) for station mode. 2118 */ 2119 #ifdef ARN_ATH9K_INT_MIB 2120 if (ath9k_hw_phycounters(sc->sc_ah) && 2121 ((sc->sc_ah->ah_opmode == ATH9K_M_STA) || 2122 (sc->sc_ah->ah_opmode == ATH9K_M_IBSS))) 2123 sc->sc_imask |= ATH9K_INT_MIB; 2124 #endif 2125 /* 2126 * Some hardware processes the TIM IE and fires an 2127 * interrupt when the TIM bit is set. For hardware 2128 * that does, if not overridden by configuration, 2129 * enable the TIM interrupt when operating as station. 2130 */ 2131 #ifdef ARN_ATH9K_INT_TIM 2132 if ((sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_ENHANCEDPM) && 2133 (sc->sc_ah->ah_opmode == ATH9K_M_STA) && 2134 !sc->sc_config.swBeaconProcess) 2135 sc->sc_imask |= ATH9K_INT_TIM; 2136 #endif 2137 if (arn_chan2mode(init_channel) != sc->sc_curmode) 2138 arn_setcurmode(sc, arn_chan2mode(init_channel)); 2139 ARN_DBG((ARN_DBG_INIT, "arn: " 2140 "%s: current mode after arn_setcurmode is %d\n", 2141 __func__, sc->sc_curmode)); 2142 2143 sc->sc_isrunning = 1; 2144 2145 /* Disable BMISS interrupt when we're not associated */ 2146 sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); 2147 (void) ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask); 2148 2149 return (0); 2150 2151 error: 2152 return (error); 2153 } 2154 2155 static void 2156 arn_close(struct arn_softc *sc) 2157 { 2158 ieee80211com_t *ic = (ieee80211com_t *)sc; 2159 struct ath_hal *ah = sc->sc_ah; 2160 2161 ARN_LOCK_ASSERT(sc); 2162 2163 if (!sc->sc_isrunning) 2164 return; 2165 2166 /* 2167 * Shutdown the hardware and driver 2168 * Note that some of this work is not possible if the 2169 * hardware is gone (invalid). 2170 */ 2171 ARN_UNLOCK(sc); 2172 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 2173 ieee80211_stop_watchdog(ic); 2174 ARN_LOCK(sc); 2175 2176 /* 2177 * make sure h/w will not generate any interrupt 2178 * before setting the invalid flag. 2179 */ 2180 (void) ath9k_hw_set_interrupts(ah, 0); 2181 2182 if (!(sc->sc_flags & SC_OP_INVALID)) { 2183 arn_draintxq(sc, 0); 2184 (void) arn_stoprecv(sc); 2185 (void) ath9k_hw_phy_disable(ah); 2186 } else { 2187 sc->sc_rxlink = NULL; 2188 } 2189 2190 sc->sc_isrunning = 0; 2191 } 2192 2193 /* 2194 * MAC callback functions 2195 */ 2196 static int 2197 arn_m_stat(void *arg, uint_t stat, uint64_t *val) 2198 { 2199 struct arn_softc *sc = arg; 2200 ieee80211com_t *ic = (ieee80211com_t *)sc; 2201 struct ieee80211_node *in; 2202 struct ieee80211_rateset *rs; 2203 2204 ARN_LOCK(sc); 2205 switch (stat) { 2206 case MAC_STAT_IFSPEED: 2207 in = ic->ic_bss; 2208 rs = &in->in_rates; 2209 *val = (rs->ir_rates[in->in_txrate] & IEEE80211_RATE_VAL) / 2 * 2210 1000000ull; 2211 break; 2212 case MAC_STAT_NOXMTBUF: 2213 *val = sc->sc_stats.ast_tx_nobuf + 2214 sc->sc_stats.ast_tx_nobufmgt; 2215 break; 2216 case MAC_STAT_IERRORS: 2217 *val = sc->sc_stats.ast_rx_tooshort; 2218 break; 2219 case MAC_STAT_RBYTES: 2220 *val = ic->ic_stats.is_rx_bytes; 2221 break; 2222 case MAC_STAT_IPACKETS: 2223 *val = ic->ic_stats.is_rx_frags; 2224 break; 2225 case MAC_STAT_OBYTES: 2226 *val = ic->ic_stats.is_tx_bytes; 2227 break; 2228 case MAC_STAT_OPACKETS: 2229 *val = ic->ic_stats.is_tx_frags; 2230 break; 2231 case MAC_STAT_OERRORS: 2232 case WIFI_STAT_TX_FAILED: 2233 *val = sc->sc_stats.ast_tx_fifoerr + 2234 sc->sc_stats.ast_tx_xretries + 2235 sc->sc_stats.ast_tx_discard; 2236 break; 2237 case WIFI_STAT_TX_RETRANS: 2238 *val = sc->sc_stats.ast_tx_xretries; 2239 break; 2240 case WIFI_STAT_FCS_ERRORS: 2241 *val = sc->sc_stats.ast_rx_crcerr; 2242 break; 2243 case WIFI_STAT_WEP_ERRORS: 2244 *val = sc->sc_stats.ast_rx_badcrypt; 2245 break; 2246 case WIFI_STAT_TX_FRAGS: 2247 case WIFI_STAT_MCAST_TX: 2248 case WIFI_STAT_RTS_SUCCESS: 2249 case WIFI_STAT_RTS_FAILURE: 2250 case WIFI_STAT_ACK_FAILURE: 2251 case WIFI_STAT_RX_FRAGS: 2252 case WIFI_STAT_MCAST_RX: 2253 case WIFI_STAT_RX_DUPS: 2254 ARN_UNLOCK(sc); 2255 return (ieee80211_stat(ic, stat, val)); 2256 default: 2257 ARN_UNLOCK(sc); 2258 return (ENOTSUP); 2259 } 2260 ARN_UNLOCK(sc); 2261 2262 return (0); 2263 } 2264 2265 int 2266 arn_m_start(void *arg) 2267 { 2268 struct arn_softc *sc = arg; 2269 int err = 0; 2270 2271 ARN_LOCK(sc); 2272 2273 /* 2274 * Stop anything previously setup. This is safe 2275 * whether this is the first time through or not. 2276 */ 2277 2278 arn_close(sc); 2279 2280 if ((err = arn_open(sc)) != 0) { 2281 ARN_UNLOCK(sc); 2282 return (err); 2283 } 2284 2285 /* H/W is reday now */ 2286 sc->sc_flags &= ~SC_OP_INVALID; 2287 2288 ARN_UNLOCK(sc); 2289 2290 return (0); 2291 } 2292 2293 static void 2294 arn_m_stop(void *arg) 2295 { 2296 struct arn_softc *sc = arg; 2297 2298 ARN_LOCK(sc); 2299 arn_close(sc); 2300 2301 /* disable HAL and put h/w to sleep */ 2302 (void) ath9k_hw_disable(sc->sc_ah); 2303 ath9k_hw_configpcipowersave(sc->sc_ah, 1); 2304 2305 /* XXX: hardware will not be ready in suspend state */ 2306 sc->sc_flags |= SC_OP_INVALID; 2307 ARN_UNLOCK(sc); 2308 } 2309 2310 static int 2311 arn_m_promisc(void *arg, boolean_t on) 2312 { 2313 struct arn_softc *sc = arg; 2314 struct ath_hal *ah = sc->sc_ah; 2315 uint32_t rfilt; 2316 2317 ARN_LOCK(sc); 2318 2319 rfilt = ath9k_hw_getrxfilter(ah); 2320 if (on) 2321 rfilt |= ATH9K_RX_FILTER_PROM; 2322 else 2323 rfilt &= ~ATH9K_RX_FILTER_PROM; 2324 sc->sc_promisc = on; 2325 ath9k_hw_setrxfilter(ah, rfilt); 2326 2327 ARN_UNLOCK(sc); 2328 2329 return (0); 2330 } 2331 2332 static int 2333 arn_m_multicst(void *arg, boolean_t add, const uint8_t *mca) 2334 { 2335 struct arn_softc *sc = arg; 2336 struct ath_hal *ah = sc->sc_ah; 2337 uint32_t val, index, bit; 2338 uint8_t pos; 2339 uint32_t *mfilt = sc->sc_mcast_hash; 2340 2341 ARN_LOCK(sc); 2342 2343 /* calculate XOR of eight 6bit values */ 2344 val = ARN_LE_READ_32(mca + 0); 2345 pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val; 2346 val = ARN_LE_READ_32(mca + 3); 2347 pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val; 2348 pos &= 0x3f; 2349 index = pos / 32; 2350 bit = 1 << (pos % 32); 2351 2352 if (add) { /* enable multicast */ 2353 sc->sc_mcast_refs[pos]++; 2354 mfilt[index] |= bit; 2355 } else { /* disable multicast */ 2356 if (--sc->sc_mcast_refs[pos] == 0) 2357 mfilt[index] &= ~bit; 2358 } 2359 ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]); 2360 2361 ARN_UNLOCK(sc); 2362 return (0); 2363 } 2364 2365 static int 2366 arn_m_unicst(void *arg, const uint8_t *macaddr) 2367 { 2368 struct arn_softc *sc = arg; 2369 struct ath_hal *ah = sc->sc_ah; 2370 ieee80211com_t *ic = (ieee80211com_t *)sc; 2371 2372 ARN_DBG((ARN_DBG_XMIT, "ath: ath_gld_saddr(): " 2373 "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", 2374 macaddr[0], macaddr[1], macaddr[2], 2375 macaddr[3], macaddr[4], macaddr[5])); 2376 2377 ARN_LOCK(sc); 2378 IEEE80211_ADDR_COPY(sc->sc_isc.ic_macaddr, macaddr); 2379 (void) ath9k_hw_setmac(ah, sc->sc_isc.ic_macaddr); 2380 (void) arn_reset(ic); 2381 ARN_UNLOCK(sc); 2382 return (0); 2383 } 2384 2385 static mblk_t * 2386 arn_m_tx(void *arg, mblk_t *mp) 2387 { 2388 struct arn_softc *sc = arg; 2389 int error = 0; 2390 mblk_t *next; 2391 ieee80211com_t *ic = (ieee80211com_t *)sc; 2392 2393 /* 2394 * No data frames go out unless we're associated; this 2395 * should not happen as the 802.11 layer does not enable 2396 * the xmit queue until we enter the RUN state. 2397 */ 2398 if (ic->ic_state != IEEE80211_S_RUN) { 2399 ARN_DBG((ARN_DBG_XMIT, "arn: arn_m_tx(): " 2400 "discard, state %u\n", ic->ic_state)); 2401 sc->sc_stats.ast_tx_discard++; 2402 freemsgchain(mp); 2403 return (NULL); 2404 } 2405 2406 while (mp != NULL) { 2407 next = mp->b_next; 2408 mp->b_next = NULL; 2409 error = arn_tx(ic, mp, IEEE80211_FC0_TYPE_DATA); 2410 if (error != 0) { 2411 mp->b_next = next; 2412 if (error == ENOMEM) { 2413 break; 2414 } else { 2415 freemsgchain(mp); 2416 return (NULL); 2417 } 2418 } 2419 mp = next; 2420 } 2421 2422 return (mp); 2423 } 2424 2425 static void 2426 arn_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) 2427 { 2428 struct arn_softc *sc = arg; 2429 int32_t err; 2430 2431 err = ieee80211_ioctl(&sc->sc_isc, wq, mp); 2432 2433 ARN_LOCK(sc); 2434 if (err == ENETRESET) { 2435 if (!(sc->sc_flags & SC_OP_INVALID)) { 2436 ARN_UNLOCK(sc); 2437 2438 (void) arn_m_start(sc); 2439 2440 (void) ieee80211_new_state(&sc->sc_isc, 2441 IEEE80211_S_SCAN, -1); 2442 ARN_LOCK(sc); 2443 } 2444 } 2445 ARN_UNLOCK(sc); 2446 } 2447 2448 static int 2449 arn_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 2450 uint_t wldp_length, const void *wldp_buf) 2451 { 2452 struct arn_softc *sc = arg; 2453 int err; 2454 2455 err = ieee80211_setprop(&sc->sc_isc, pr_name, wldp_pr_num, 2456 wldp_length, wldp_buf); 2457 2458 ARN_LOCK(sc); 2459 2460 if (err == ENETRESET) { 2461 if (!(sc->sc_flags & SC_OP_INVALID)) { 2462 ARN_UNLOCK(sc); 2463 (void) arn_m_start(sc); 2464 (void) ieee80211_new_state(&sc->sc_isc, 2465 IEEE80211_S_SCAN, -1); 2466 ARN_LOCK(sc); 2467 } 2468 err = 0; 2469 } 2470 2471 ARN_UNLOCK(sc); 2472 2473 return (err); 2474 } 2475 2476 /* ARGSUSED */ 2477 static int 2478 arn_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 2479 uint_t wldp_length, void *wldp_buf) 2480 { 2481 struct arn_softc *sc = arg; 2482 int err = 0; 2483 2484 err = ieee80211_getprop(&sc->sc_isc, pr_name, wldp_pr_num, 2485 wldp_length, wldp_buf); 2486 2487 return (err); 2488 } 2489 2490 static void 2491 arn_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 2492 mac_prop_info_handle_t prh) 2493 { 2494 struct arn_softc *sc = arg; 2495 2496 ieee80211_propinfo(&sc->sc_isc, pr_name, wldp_pr_num, prh); 2497 } 2498 2499 /* return bus cachesize in 4B word units */ 2500 static void 2501 arn_pci_config_cachesize(struct arn_softc *sc) 2502 { 2503 uint8_t csz; 2504 2505 /* 2506 * Cache line size is used to size and align various 2507 * structures used to communicate with the hardware. 2508 */ 2509 csz = pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ); 2510 if (csz == 0) { 2511 /* 2512 * We must have this setup properly for rx buffer 2513 * DMA to work so force a reasonable value here if it 2514 * comes up zero. 2515 */ 2516 csz = ATH_DEF_CACHE_BYTES / sizeof (uint32_t); 2517 pci_config_put8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ, 2518 csz); 2519 } 2520 sc->sc_cachelsz = csz << 2; 2521 } 2522 2523 static int 2524 arn_pci_setup(struct arn_softc *sc) 2525 { 2526 uint16_t command; 2527 2528 /* 2529 * Enable memory mapping and bus mastering 2530 */ 2531 ASSERT(sc != NULL); 2532 command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM); 2533 command |= PCI_COMM_MAE | PCI_COMM_ME; 2534 pci_config_put16(sc->sc_cfg_handle, PCI_CONF_COMM, command); 2535 command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM); 2536 if ((command & PCI_COMM_MAE) == 0) { 2537 arn_problem("arn: arn_pci_setup(): " 2538 "failed to enable memory mapping\n"); 2539 return (EIO); 2540 } 2541 if ((command & PCI_COMM_ME) == 0) { 2542 arn_problem("arn: arn_pci_setup(): " 2543 "failed to enable bus mastering\n"); 2544 return (EIO); 2545 } 2546 ARN_DBG((ARN_DBG_INIT, "arn: arn_pci_setup(): " 2547 "set command reg to 0x%x \n", command)); 2548 2549 return (0); 2550 } 2551 2552 static void 2553 arn_get_hw_encap(struct arn_softc *sc) 2554 { 2555 ieee80211com_t *ic; 2556 struct ath_hal *ah; 2557 2558 ic = (ieee80211com_t *)sc; 2559 ah = sc->sc_ah; 2560 2561 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 2562 ATH9K_CIPHER_AES_CCM, NULL)) 2563 ic->ic_caps |= IEEE80211_C_AES_CCM; 2564 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 2565 ATH9K_CIPHER_AES_OCB, NULL)) 2566 ic->ic_caps |= IEEE80211_C_AES; 2567 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 2568 ATH9K_CIPHER_TKIP, NULL)) 2569 ic->ic_caps |= IEEE80211_C_TKIP; 2570 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 2571 ATH9K_CIPHER_WEP, NULL)) 2572 ic->ic_caps |= IEEE80211_C_WEP; 2573 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 2574 ATH9K_CIPHER_MIC, NULL)) 2575 ic->ic_caps |= IEEE80211_C_TKIPMIC; 2576 } 2577 2578 static void 2579 arn_setup_ht_cap(struct arn_softc *sc) 2580 { 2581 #define ATH9K_HT_CAP_MAXRXAMPDU_65536 0x3 /* 2 ^ 16 */ 2582 #define ATH9K_HT_CAP_MPDUDENSITY_8 0x6 /* 8 usec */ 2583 2584 uint8_t rx_streams; 2585 2586 arn_ht_conf *ht_info = &sc->sc_ht_conf; 2587 2588 ht_info->ht_supported = B_TRUE; 2589 2590 /* Todo: IEEE80211_HTCAP_SMPS */ 2591 ht_info->cap = IEEE80211_HTCAP_CHWIDTH40| 2592 IEEE80211_HTCAP_SHORTGI40 | 2593 IEEE80211_HTCAP_DSSSCCK40; 2594 2595 ht_info->ampdu_factor = ATH9K_HT_CAP_MAXRXAMPDU_65536; 2596 ht_info->ampdu_density = ATH9K_HT_CAP_MPDUDENSITY_8; 2597 2598 /* set up supported mcs set */ 2599 (void) memset(&ht_info->rx_mcs_mask, 0, sizeof (ht_info->rx_mcs_mask)); 2600 rx_streams = ISP2(sc->sc_ah->ah_caps.rx_chainmask) ? 1 : 2; 2601 2602 ht_info->rx_mcs_mask[0] = 0xff; 2603 if (rx_streams >= 2) 2604 ht_info->rx_mcs_mask[1] = 0xff; 2605 } 2606 2607 /* xxx should be used for ht rate set negotiating ? */ 2608 static void 2609 arn_overwrite_11n_rateset(struct arn_softc *sc) 2610 { 2611 uint8_t *ht_rs = sc->sc_ht_conf.rx_mcs_mask; 2612 int mcs_idx, mcs_count = 0; 2613 int i, j; 2614 2615 (void) memset(&ieee80211_rateset_11n, 0, 2616 sizeof (ieee80211_rateset_11n)); 2617 for (i = 0; i < 10; i++) { 2618 for (j = 0; j < 8; j++) { 2619 if (ht_rs[i] & (1 << j)) { 2620 mcs_idx = i * 8 + j; 2621 if (mcs_idx >= IEEE80211_HTRATE_MAXSIZE) { 2622 break; 2623 } 2624 2625 ieee80211_rateset_11n.rs_rates[mcs_idx] = 2626 (uint8_t)mcs_idx; 2627 mcs_count++; 2628 } 2629 } 2630 } 2631 2632 ieee80211_rateset_11n.rs_nrates = (uint8_t)mcs_count; 2633 2634 ARN_DBG((ARN_DBG_RATE, "arn_overwrite_11n_rateset(): " 2635 "MCS rate set supported by this station is as follows:\n")); 2636 2637 for (i = 0; i < ieee80211_rateset_11n.rs_nrates; i++) { 2638 ARN_DBG((ARN_DBG_RATE, "MCS rate %d is %d\n", 2639 i, ieee80211_rateset_11n.rs_rates[i])); 2640 } 2641 2642 } 2643 2644 /* 2645 * Update WME parameters for a transmit queue. 2646 */ 2647 static int 2648 arn_tx_queue_update(struct arn_softc *sc, int ac) 2649 { 2650 #define ATH_EXPONENT_TO_VALUE(v) ((1<<v)-1) 2651 #define ATH_TXOP_TO_US(v) (v<<5) 2652 ieee80211com_t *ic = (ieee80211com_t *)sc; 2653 struct ath_txq *txq; 2654 struct wmeParams *wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac]; 2655 struct ath_hal *ah = sc->sc_ah; 2656 struct ath9k_tx_queue_info qi; 2657 2658 txq = &sc->sc_txq[arn_get_hal_qnum(ac, sc)]; 2659 (void) ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi); 2660 2661 /* 2662 * TXQ_FLAG_TXOKINT_ENABLE = 0x0001 2663 * TXQ_FLAG_TXERRINT_ENABLE = 0x0001 2664 * TXQ_FLAG_TXDESCINT_ENABLE = 0x0002 2665 * TXQ_FLAG_TXEOLINT_ENABLE = 0x0004 2666 * TXQ_FLAG_TXURNINT_ENABLE = 0x0008 2667 * TXQ_FLAG_BACKOFF_DISABLE = 0x0010 2668 * TXQ_FLAG_COMPRESSION_ENABLE = 0x0020 2669 * TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040 2670 * TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080 2671 */ 2672 2673 /* xxx should update these flags here? */ 2674 #if 0 2675 qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE | 2676 TXQ_FLAG_TXERRINT_ENABLE | 2677 TXQ_FLAG_TXDESCINT_ENABLE | 2678 TXQ_FLAG_TXURNINT_ENABLE; 2679 #endif 2680 2681 qi.tqi_aifs = wmep->wmep_aifsn; 2682 qi.tqi_cwmin = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmin); 2683 qi.tqi_cwmax = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmax); 2684 qi.tqi_readyTime = 0; 2685 qi.tqi_burstTime = ATH_TXOP_TO_US(wmep->wmep_txopLimit); 2686 2687 ARN_DBG((ARN_DBG_INIT, 2688 "%s:" 2689 "Q%u" 2690 "qflags 0x%x" 2691 "aifs %u" 2692 "cwmin %u" 2693 "cwmax %u" 2694 "burstTime %u\n", 2695 __func__, 2696 txq->axq_qnum, 2697 qi.tqi_qflags, 2698 qi.tqi_aifs, 2699 qi.tqi_cwmin, 2700 qi.tqi_cwmax, 2701 qi.tqi_burstTime)); 2702 2703 if (!ath9k_hw_set_txq_props(ah, txq->axq_qnum, &qi)) { 2704 arn_problem("unable to update hardware queue " 2705 "parameters for %s traffic!\n", 2706 ieee80211_wme_acnames[ac]); 2707 return (0); 2708 } else { 2709 /* push to H/W */ 2710 (void) ath9k_hw_resettxqueue(ah, txq->axq_qnum); 2711 return (1); 2712 } 2713 2714 #undef ATH_TXOP_TO_US 2715 #undef ATH_EXPONENT_TO_VALUE 2716 } 2717 2718 /* Update WME parameters */ 2719 static int 2720 arn_wme_update(ieee80211com_t *ic) 2721 { 2722 struct arn_softc *sc = (struct arn_softc *)ic; 2723 2724 /* updateing */ 2725 return (!arn_tx_queue_update(sc, WME_AC_BE) || 2726 !arn_tx_queue_update(sc, WME_AC_BK) || 2727 !arn_tx_queue_update(sc, WME_AC_VI) || 2728 !arn_tx_queue_update(sc, WME_AC_VO) ? EIO : 0); 2729 } 2730 2731 /* 2732 * Update tx/rx chainmask. For legacy association, 2733 * hard code chainmask to 1x1, for 11n association, use 2734 * the chainmask configuration. 2735 */ 2736 void 2737 arn_update_chainmask(struct arn_softc *sc) 2738 { 2739 boolean_t is_ht = B_FALSE; 2740 sc->sc_flags |= SC_OP_CHAINMASK_UPDATE; 2741 2742 is_ht = sc->sc_ht_conf.ht_supported; 2743 if (is_ht) { 2744 sc->sc_tx_chainmask = sc->sc_ah->ah_caps.tx_chainmask; 2745 sc->sc_rx_chainmask = sc->sc_ah->ah_caps.rx_chainmask; 2746 } else { 2747 sc->sc_tx_chainmask = 1; 2748 sc->sc_rx_chainmask = 1; 2749 } 2750 2751 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2752 "tx_chainmask = %d, rx_chainmask = %d\n", 2753 sc->sc_tx_chainmask, sc->sc_rx_chainmask)); 2754 } 2755 2756 static int 2757 arn_resume(dev_info_t *devinfo) 2758 { 2759 struct arn_softc *sc; 2760 int ret = DDI_SUCCESS; 2761 2762 sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo)); 2763 if (sc == NULL) { 2764 ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): " 2765 "failed to get soft state\n")); 2766 return (DDI_FAILURE); 2767 } 2768 2769 ARN_LOCK(sc); 2770 /* 2771 * Set up config space command register(s). Refuse 2772 * to resume on failure. 2773 */ 2774 if (arn_pci_setup(sc) != 0) { 2775 ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): " 2776 "ath_pci_setup() failed\n")); 2777 ARN_UNLOCK(sc); 2778 return (DDI_FAILURE); 2779 } 2780 2781 if (!(sc->sc_flags & SC_OP_INVALID)) 2782 ret = arn_open(sc); 2783 ARN_UNLOCK(sc); 2784 2785 return (ret); 2786 } 2787 2788 static int 2789 arn_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) 2790 { 2791 struct arn_softc *sc; 2792 int instance; 2793 int status; 2794 int32_t err; 2795 uint16_t vendor_id; 2796 uint16_t device_id; 2797 uint32_t i; 2798 uint32_t val; 2799 char strbuf[32]; 2800 ieee80211com_t *ic; 2801 struct ath_hal *ah; 2802 wifi_data_t wd = { 0 }; 2803 mac_register_t *macp; 2804 2805 switch (cmd) { 2806 case DDI_ATTACH: 2807 break; 2808 case DDI_RESUME: 2809 return (arn_resume(devinfo)); 2810 default: 2811 return (DDI_FAILURE); 2812 } 2813 2814 instance = ddi_get_instance(devinfo); 2815 if (ddi_soft_state_zalloc(arn_soft_state_p, instance) != DDI_SUCCESS) { 2816 ARN_DBG((ARN_DBG_ATTACH, "arn: " 2817 "%s: Unable to alloc softstate\n", __func__)); 2818 return (DDI_FAILURE); 2819 } 2820 2821 sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo)); 2822 ic = (ieee80211com_t *)sc; 2823 sc->sc_dev = devinfo; 2824 2825 mutex_init(&sc->sc_genlock, NULL, MUTEX_DRIVER, NULL); 2826 mutex_init(&sc->sc_serial_rw, NULL, MUTEX_DRIVER, NULL); 2827 mutex_init(&sc->sc_txbuflock, NULL, MUTEX_DRIVER, NULL); 2828 mutex_init(&sc->sc_rxbuflock, NULL, MUTEX_DRIVER, NULL); 2829 mutex_init(&sc->sc_resched_lock, NULL, MUTEX_DRIVER, NULL); 2830 #ifdef ARN_IBSS 2831 mutex_init(&sc->sc_bcbuflock, NULL, MUTEX_DRIVER, NULL); 2832 #endif 2833 2834 sc->sc_flags |= SC_OP_INVALID; 2835 2836 err = pci_config_setup(devinfo, &sc->sc_cfg_handle); 2837 if (err != DDI_SUCCESS) { 2838 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2839 "pci_config_setup() failed")); 2840 goto attach_fail0; 2841 } 2842 2843 if (arn_pci_setup(sc) != 0) 2844 goto attach_fail1; 2845 2846 /* Cache line size set up */ 2847 arn_pci_config_cachesize(sc); 2848 2849 vendor_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_VENID); 2850 device_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_DEVID); 2851 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): vendor 0x%x, " 2852 "device id 0x%x, cache size %d\n", 2853 vendor_id, device_id, 2854 pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ))); 2855 2856 pci_config_put8(sc->sc_cfg_handle, PCI_CONF_LATENCY_TIMER, 0xa8); 2857 val = pci_config_get32(sc->sc_cfg_handle, 0x40); 2858 if ((val & 0x0000ff00) != 0) 2859 pci_config_put32(sc->sc_cfg_handle, 0x40, val & 0xffff00ff); 2860 2861 err = ddi_regs_map_setup(devinfo, 1, 2862 &sc->mem, 0, 0, &arn_reg_accattr, &sc->sc_io_handle); 2863 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2864 "regs map1 = %x err=%d\n", sc->mem, err)); 2865 if (err != DDI_SUCCESS) { 2866 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2867 "ddi_regs_map_setup() failed")); 2868 goto attach_fail1; 2869 } 2870 2871 ah = ath9k_hw_attach(device_id, sc, sc->mem, &status); 2872 if (ah == NULL) { 2873 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2874 "unable to attach hw: H/W status %u\n", 2875 status)); 2876 goto attach_fail2; 2877 } 2878 sc->sc_ah = ah; 2879 2880 ath9k_hw_getmac(ah, ic->ic_macaddr); 2881 2882 /* Get the hardware key cache size. */ 2883 sc->sc_keymax = ah->ah_caps.keycache_size; 2884 if (sc->sc_keymax > ATH_KEYMAX) { 2885 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2886 "Warning, using only %u entries in %u key cache\n", 2887 ATH_KEYMAX, sc->sc_keymax)); 2888 sc->sc_keymax = ATH_KEYMAX; 2889 } 2890 2891 /* 2892 * Reset the key cache since some parts do not 2893 * reset the contents on initial power up. 2894 */ 2895 for (i = 0; i < sc->sc_keymax; i++) 2896 (void) ath9k_hw_keyreset(ah, (uint16_t)i); 2897 /* 2898 * Mark key cache slots associated with global keys 2899 * as in use. If we knew TKIP was not to be used we 2900 * could leave the +32, +64, and +32+64 slots free. 2901 * XXX only for splitmic. 2902 */ 2903 for (i = 0; i < IEEE80211_WEP_NKID; i++) { 2904 set_bit(i, sc->sc_keymap); 2905 set_bit(i + 32, sc->sc_keymap); 2906 set_bit(i + 64, sc->sc_keymap); 2907 set_bit(i + 32 + 64, sc->sc_keymap); 2908 } 2909 2910 /* Collect the channel list using the default country code */ 2911 err = arn_setup_channels(sc); 2912 if (err == EINVAL) { 2913 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2914 "ERR:arn_setup_channels\n")); 2915 goto attach_fail3; 2916 } 2917 2918 /* default to STA mode */ 2919 sc->sc_ah->ah_opmode = ATH9K_M_STA; 2920 2921 /* Setup rate tables */ 2922 arn_rate_attach(sc); 2923 arn_setup_rates(sc, IEEE80211_MODE_11A); 2924 arn_setup_rates(sc, IEEE80211_MODE_11B); 2925 arn_setup_rates(sc, IEEE80211_MODE_11G); 2926 2927 /* Setup current mode here */ 2928 arn_setcurmode(sc, ATH9K_MODE_11G); 2929 2930 /* 802.11g features */ 2931 if (sc->sc_have11g) 2932 ic->ic_caps |= IEEE80211_C_SHPREAMBLE | 2933 IEEE80211_C_SHSLOT; /* short slot time */ 2934 2935 /* Temp workaround */ 2936 sc->sc_mrretry = 1; 2937 sc->sc_config.ath_aggr_prot = 0; 2938 2939 /* Setup tx/rx descriptors */ 2940 err = arn_desc_alloc(devinfo, sc); 2941 if (err != DDI_SUCCESS) { 2942 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2943 "failed to allocate descriptors: %d\n", err)); 2944 goto attach_fail3; 2945 } 2946 2947 if ((sc->sc_tq = ddi_taskq_create(devinfo, "ath_taskq", 1, 2948 TASKQ_DEFAULTPRI, 0)) == NULL) { 2949 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2950 "ERR:ddi_taskq_create\n")); 2951 goto attach_fail4; 2952 } 2953 2954 /* 2955 * Allocate hardware transmit queues: one queue for 2956 * beacon frames and one data queue for each QoS 2957 * priority. Note that the hal handles reseting 2958 * these queues at the needed time. 2959 */ 2960 #ifdef ARN_IBSS 2961 sc->sc_beaconq = arn_beaconq_setup(ah); 2962 if (sc->sc_beaconq == (-1)) { 2963 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2964 "unable to setup a beacon xmit queue\n")); 2965 goto attach_fail4; 2966 } 2967 #endif 2968 #ifdef ARN_HOSTAP 2969 sc->sc_cabq = arn_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0); 2970 if (sc->sc_cabq == NULL) { 2971 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2972 "unable to setup CAB xmit queue\n")); 2973 goto attach_fail4; 2974 } 2975 2976 sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME; 2977 ath_cabq_update(sc); 2978 #endif 2979 2980 for (i = 0; i < ARRAY_SIZE(sc->sc_haltype2q); i++) 2981 sc->sc_haltype2q[i] = -1; 2982 2983 /* Setup data queues */ 2984 /* NB: ensure BK queue is the lowest priority h/w queue */ 2985 if (!arn_tx_setup(sc, ATH9K_WME_AC_BK)) { 2986 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2987 "unable to setup xmit queue for BK traffic\n")); 2988 goto attach_fail4; 2989 } 2990 if (!arn_tx_setup(sc, ATH9K_WME_AC_BE)) { 2991 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2992 "unable to setup xmit queue for BE traffic\n")); 2993 goto attach_fail4; 2994 } 2995 if (!arn_tx_setup(sc, ATH9K_WME_AC_VI)) { 2996 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 2997 "unable to setup xmit queue for VI traffic\n")); 2998 goto attach_fail4; 2999 } 3000 if (!arn_tx_setup(sc, ATH9K_WME_AC_VO)) { 3001 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3002 "unable to setup xmit queue for VO traffic\n")); 3003 goto attach_fail4; 3004 } 3005 3006 /* 3007 * Initializes the noise floor to a reasonable default value. 3008 * Later on this will be updated during ANI processing. 3009 */ 3010 3011 sc->sc_ani.sc_noise_floor = ATH_DEFAULT_NOISE_FLOOR; 3012 3013 3014 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 3015 ATH9K_CIPHER_TKIP, NULL)) { 3016 /* 3017 * Whether we should enable h/w TKIP MIC. 3018 * XXX: if we don't support WME TKIP MIC, then we wouldn't 3019 * report WMM capable, so it's always safe to turn on 3020 * TKIP MIC in this case. 3021 */ 3022 (void) ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC, 3023 0, 1, NULL); 3024 } 3025 3026 /* Get cipher releated capability information */ 3027 arn_get_hw_encap(sc); 3028 3029 /* 3030 * Check whether the separate key cache entries 3031 * are required to handle both tx+rx MIC keys. 3032 * With split mic keys the number of stations is limited 3033 * to 27 otherwise 59. 3034 */ 3035 if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 3036 ATH9K_CIPHER_TKIP, NULL) && 3037 ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER, 3038 ATH9K_CIPHER_MIC, NULL) && 3039 ath9k_hw_getcapability(ah, ATH9K_CAP_TKIP_SPLIT, 3040 0, NULL)) 3041 sc->sc_splitmic = 1; 3042 3043 /* turn on mcast key search if possible */ 3044 if (!ath9k_hw_getcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL)) 3045 (void) ath9k_hw_setcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 1, 3046 1, NULL); 3047 3048 sc->sc_config.txpowlimit = ATH_TXPOWER_MAX; 3049 sc->sc_config.txpowlimit_override = 0; 3050 3051 /* 11n Capabilities */ 3052 if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) { 3053 sc->sc_flags |= SC_OP_TXAGGR; 3054 sc->sc_flags |= SC_OP_RXAGGR; 3055 arn_setup_ht_cap(sc); 3056 arn_overwrite_11n_rateset(sc); 3057 } 3058 3059 sc->sc_tx_chainmask = 1; 3060 sc->sc_rx_chainmask = 1; 3061 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3062 "tx_chainmask = %d, rx_chainmask = %d\n", 3063 sc->sc_tx_chainmask, sc->sc_rx_chainmask)); 3064 3065 /* arn_update_chainmask(sc); */ 3066 3067 (void) ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, B_TRUE, NULL); 3068 sc->sc_defant = ath9k_hw_getdefantenna(ah); 3069 3070 ath9k_hw_getmac(ah, sc->sc_myaddr); 3071 if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) { 3072 ath9k_hw_getbssidmask(ah, sc->sc_bssidmask); 3073 ATH_SET_VAP_BSSID_MASK(sc->sc_bssidmask); 3074 (void) ath9k_hw_setbssidmask(ah, sc->sc_bssidmask); 3075 } 3076 3077 /* set default value to short slot time */ 3078 sc->sc_slottime = ATH9K_SLOT_TIME_9; 3079 (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9); 3080 3081 /* initialize beacon slots */ 3082 for (i = 0; i < ARRAY_SIZE(sc->sc_bslot); i++) 3083 sc->sc_bslot[i] = ATH_IF_ID_ANY; 3084 3085 /* Save MISC configurations */ 3086 sc->sc_config.swBeaconProcess = 1; 3087 3088 /* Support QoS/WME */ 3089 ic->ic_caps |= IEEE80211_C_WME; 3090 ic->ic_wme.wme_update = arn_wme_update; 3091 3092 /* Support 802.11n/HT */ 3093 if (sc->sc_ht_conf.ht_supported) { 3094 ic->ic_htcaps = 3095 IEEE80211_HTCAP_CHWIDTH40 | 3096 IEEE80211_HTCAP_SHORTGI40 | 3097 IEEE80211_HTCAP_DSSSCCK40 | 3098 IEEE80211_HTCAP_MAXAMSDU_7935 | 3099 IEEE80211_HTC_HT | 3100 IEEE80211_HTC_AMSDU | 3101 IEEE80211_HTCAP_RXSTBC_2STREAM; 3102 3103 #ifdef ARN_TX_AGGREGATION 3104 ic->ic_htcaps |= IEEE80211_HTC_AMPDU; 3105 #endif 3106 } 3107 3108 /* Header padding requested by driver */ 3109 ic->ic_flags |= IEEE80211_F_DATAPAD; 3110 /* Support WPA/WPA2 */ 3111 ic->ic_caps |= IEEE80211_C_WPA; 3112 #if 0 3113 ic->ic_caps |= IEEE80211_C_TXFRAG; /* handle tx frags */ 3114 ic->ic_caps |= IEEE80211_C_BGSCAN; /* capable of bg scanning */ 3115 #endif 3116 ic->ic_phytype = IEEE80211_T_HT; 3117 ic->ic_opmode = IEEE80211_M_STA; 3118 ic->ic_state = IEEE80211_S_INIT; 3119 ic->ic_maxrssi = ARN_MAX_RSSI; 3120 ic->ic_set_shortslot = arn_set_shortslot; 3121 ic->ic_xmit = arn_tx; 3122 ieee80211_attach(ic); 3123 3124 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3125 "ic->ic_curchan->ich_freq: %d\n", ic->ic_curchan->ich_freq)); 3126 3127 /* different instance has different WPA door */ 3128 (void) snprintf(ic->ic_wpadoor, MAX_IEEE80211STR, "%s_%s%d", WPA_DOOR, 3129 ddi_driver_name(devinfo), 3130 ddi_get_instance(devinfo)); 3131 3132 if (sc->sc_ht_conf.ht_supported) { 3133 sc->sc_recv_action = ic->ic_recv_action; 3134 ic->ic_recv_action = arn_ampdu_recv_action; 3135 // sc->sc_send_action = ic->ic_send_action; 3136 // ic->ic_send_action = arn_ampdu_send_action; 3137 3138 ic->ic_ampdu_rxmax = sc->sc_ht_conf.ampdu_factor; 3139 ic->ic_ampdu_density = sc->sc_ht_conf.ampdu_density; 3140 ic->ic_ampdu_limit = ic->ic_ampdu_rxmax; 3141 } 3142 3143 /* Override 80211 default routines */ 3144 sc->sc_newstate = ic->ic_newstate; 3145 ic->ic_newstate = arn_newstate; 3146 #ifdef ARN_IBSS 3147 sc->sc_recv_mgmt = ic->ic_recv_mgmt; 3148 ic->ic_recv_mgmt = arn_recv_mgmt; 3149 #endif 3150 ic->ic_watchdog = arn_watchdog; 3151 ic->ic_node_alloc = arn_node_alloc; 3152 ic->ic_node_free = arn_node_free; 3153 ic->ic_crypto.cs_key_alloc = arn_key_alloc; 3154 ic->ic_crypto.cs_key_delete = arn_key_delete; 3155 ic->ic_crypto.cs_key_set = arn_key_set; 3156 3157 ieee80211_media_init(ic); 3158 3159 /* 3160 * initialize default tx key 3161 */ 3162 ic->ic_def_txkey = 0; 3163 3164 sc->sc_rx_pend = 0; 3165 (void) ath9k_hw_set_interrupts(sc->sc_ah, 0); 3166 err = ddi_add_softintr(devinfo, DDI_SOFTINT_LOW, 3167 &sc->sc_softint_id, NULL, 0, arn_softint_handler, (caddr_t)sc); 3168 if (err != DDI_SUCCESS) { 3169 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3170 "ddi_add_softintr() failed....\n")); 3171 goto attach_fail5; 3172 } 3173 3174 if (ddi_get_iblock_cookie(devinfo, 0, &sc->sc_iblock) 3175 != DDI_SUCCESS) { 3176 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3177 "Can not get iblock cookie for INT\n")); 3178 goto attach_fail6; 3179 } 3180 3181 if (ddi_add_intr(devinfo, 0, NULL, NULL, arn_isr, 3182 (caddr_t)sc) != DDI_SUCCESS) { 3183 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3184 "Can not set intr for ARN driver\n")); 3185 goto attach_fail6; 3186 } 3187 3188 /* 3189 * Provide initial settings for the WiFi plugin; whenever this 3190 * information changes, we need to call mac_plugindata_update() 3191 */ 3192 wd.wd_opmode = ic->ic_opmode; 3193 wd.wd_secalloc = WIFI_SEC_NONE; 3194 IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid); 3195 3196 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3197 "IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid)" 3198 "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", 3199 wd.wd_bssid[0], wd.wd_bssid[1], wd.wd_bssid[2], 3200 wd.wd_bssid[3], wd.wd_bssid[4], wd.wd_bssid[5])); 3201 3202 if ((macp = mac_alloc(MAC_VERSION)) == NULL) { 3203 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3204 "MAC version mismatch\n")); 3205 goto attach_fail7; 3206 } 3207 3208 macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI; 3209 macp->m_driver = sc; 3210 macp->m_dip = devinfo; 3211 macp->m_src_addr = ic->ic_macaddr; 3212 macp->m_callbacks = &arn_m_callbacks; 3213 macp->m_min_sdu = 0; 3214 macp->m_max_sdu = IEEE80211_MTU; 3215 macp->m_pdata = &wd; 3216 macp->m_pdata_size = sizeof (wd); 3217 3218 err = mac_register(macp, &ic->ic_mach); 3219 mac_free(macp); 3220 if (err != 0) { 3221 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3222 "mac_register err %x\n", err)); 3223 goto attach_fail7; 3224 } 3225 3226 /* Create minor node of type DDI_NT_NET_WIFI */ 3227 (void) snprintf(strbuf, sizeof (strbuf), "%s%d", 3228 ARN_NODENAME, instance); 3229 err = ddi_create_minor_node(devinfo, strbuf, S_IFCHR, 3230 instance + 1, DDI_NT_NET_WIFI, 0); 3231 if (err != DDI_SUCCESS) 3232 ARN_DBG((ARN_DBG_ATTACH, "WARN: arn: arn_attach(): " 3233 "Create minor node failed - %d\n", err)); 3234 3235 /* Notify link is down now */ 3236 mac_link_update(ic->ic_mach, LINK_STATE_DOWN); 3237 3238 sc->sc_promisc = B_FALSE; 3239 bzero(sc->sc_mcast_refs, sizeof (sc->sc_mcast_refs)); 3240 bzero(sc->sc_mcast_hash, sizeof (sc->sc_mcast_hash)); 3241 3242 ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): " 3243 "Atheros AR%s MAC/BB Rev:%x " 3244 "AR%s RF Rev:%x: mem=0x%lx\n", 3245 arn_mac_bb_name(ah->ah_macVersion), 3246 ah->ah_macRev, 3247 arn_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)), 3248 ah->ah_phyRev, 3249 (unsigned long)sc->mem)); 3250 3251 /* XXX: hardware will not be ready until arn_open() being called */ 3252 sc->sc_flags |= SC_OP_INVALID; 3253 sc->sc_isrunning = 0; 3254 3255 return (DDI_SUCCESS); 3256 3257 attach_fail7: 3258 ddi_remove_intr(devinfo, 0, sc->sc_iblock); 3259 attach_fail6: 3260 ddi_remove_softintr(sc->sc_softint_id); 3261 attach_fail5: 3262 (void) ieee80211_detach(ic); 3263 attach_fail4: 3264 arn_desc_free(sc); 3265 if (sc->sc_tq) 3266 ddi_taskq_destroy(sc->sc_tq); 3267 attach_fail3: 3268 ath9k_hw_detach(ah); 3269 attach_fail2: 3270 ddi_regs_map_free(&sc->sc_io_handle); 3271 attach_fail1: 3272 pci_config_teardown(&sc->sc_cfg_handle); 3273 attach_fail0: 3274 sc->sc_flags |= SC_OP_INVALID; 3275 /* cleanup tx queues */ 3276 mutex_destroy(&sc->sc_txbuflock); 3277 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 3278 if (ARN_TXQ_SETUP(sc, i)) { 3279 /* arn_tx_cleanupq(asc, &asc->sc_txq[i]); */ 3280 mutex_destroy(&((&sc->sc_txq[i])->axq_lock)); 3281 } 3282 } 3283 mutex_destroy(&sc->sc_rxbuflock); 3284 mutex_destroy(&sc->sc_serial_rw); 3285 mutex_destroy(&sc->sc_genlock); 3286 mutex_destroy(&sc->sc_resched_lock); 3287 #ifdef ARN_IBSS 3288 mutex_destroy(&sc->sc_bcbuflock); 3289 #endif 3290 3291 ddi_soft_state_free(arn_soft_state_p, instance); 3292 3293 return (DDI_FAILURE); 3294 3295 } 3296 3297 /* 3298 * Suspend transmit/receive for powerdown 3299 */ 3300 static int 3301 arn_suspend(struct arn_softc *sc) 3302 { 3303 ARN_LOCK(sc); 3304 arn_close(sc); 3305 ARN_UNLOCK(sc); 3306 3307 return (DDI_SUCCESS); 3308 } 3309 3310 static int32_t 3311 arn_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) 3312 { 3313 struct arn_softc *sc; 3314 int i; 3315 3316 sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo)); 3317 ASSERT(sc != NULL); 3318 3319 switch (cmd) { 3320 case DDI_DETACH: 3321 break; 3322 3323 case DDI_SUSPEND: 3324 return (arn_suspend(sc)); 3325 3326 default: 3327 return (DDI_FAILURE); 3328 } 3329 3330 if (mac_disable(sc->sc_isc.ic_mach) != 0) 3331 return (DDI_FAILURE); 3332 3333 arn_stop_scantimer(sc); 3334 arn_stop_caltimer(sc); 3335 3336 /* disable interrupts */ 3337 (void) ath9k_hw_set_interrupts(sc->sc_ah, 0); 3338 3339 /* 3340 * Unregister from the MAC layer subsystem 3341 */ 3342 (void) mac_unregister(sc->sc_isc.ic_mach); 3343 3344 /* free intterrupt resources */ 3345 ddi_remove_intr(devinfo, 0, sc->sc_iblock); 3346 ddi_remove_softintr(sc->sc_softint_id); 3347 3348 /* 3349 * NB: the order of these is important: 3350 * o call the 802.11 layer before detaching the hal to 3351 * insure callbacks into the driver to delete global 3352 * key cache entries can be handled 3353 * o reclaim the tx queue data structures after calling 3354 * the 802.11 layer as we'll get called back to reclaim 3355 * node state and potentially want to use them 3356 * o to cleanup the tx queues the hal is called, so detach 3357 * it last 3358 */ 3359 ieee80211_detach(&sc->sc_isc); 3360 3361 arn_desc_free(sc); 3362 3363 ddi_taskq_destroy(sc->sc_tq); 3364 3365 if (!(sc->sc_flags & SC_OP_INVALID)) 3366 (void) ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); 3367 3368 /* cleanup tx queues */ 3369 mutex_destroy(&sc->sc_txbuflock); 3370 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 3371 if (ARN_TXQ_SETUP(sc, i)) { 3372 arn_tx_cleanupq(sc, &sc->sc_txq[i]); 3373 mutex_destroy(&((&sc->sc_txq[i])->axq_lock)); 3374 } 3375 } 3376 3377 ath9k_hw_detach(sc->sc_ah); 3378 3379 /* free io handle */ 3380 ddi_regs_map_free(&sc->sc_io_handle); 3381 pci_config_teardown(&sc->sc_cfg_handle); 3382 3383 /* destroy locks */ 3384 mutex_destroy(&sc->sc_genlock); 3385 mutex_destroy(&sc->sc_serial_rw); 3386 mutex_destroy(&sc->sc_rxbuflock); 3387 mutex_destroy(&sc->sc_resched_lock); 3388 #ifdef ARN_IBSS 3389 mutex_destroy(&sc->sc_bcbuflock); 3390 #endif 3391 3392 ddi_remove_minor_node(devinfo, NULL); 3393 ddi_soft_state_free(arn_soft_state_p, ddi_get_instance(devinfo)); 3394 3395 return (DDI_SUCCESS); 3396 } 3397 3398 /* 3399 * quiesce(9E) entry point. 3400 * 3401 * This function is called when the system is single-threaded at high 3402 * PIL with preemption disabled. Therefore, this function must not be 3403 * blocked. 3404 * 3405 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. 3406 * DDI_FAILURE indicates an error condition and should almost never happen. 3407 */ 3408 static int32_t 3409 arn_quiesce(dev_info_t *devinfo) 3410 { 3411 struct arn_softc *sc; 3412 int i; 3413 struct ath_hal *ah; 3414 3415 sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo)); 3416 3417 if (sc == NULL || (ah = sc->sc_ah) == NULL) 3418 return (DDI_FAILURE); 3419 3420 /* 3421 * Disable interrupts 3422 */ 3423 (void) ath9k_hw_set_interrupts(ah, 0); 3424 3425 /* 3426 * Disable TX HW 3427 */ 3428 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 3429 if (ARN_TXQ_SETUP(sc, i)) 3430 (void) ath9k_hw_stoptxdma(ah, sc->sc_txq[i].axq_qnum); 3431 } 3432 3433 /* 3434 * Disable RX HW 3435 */ 3436 ath9k_hw_stoppcurecv(ah); 3437 ath9k_hw_setrxfilter(ah, 0); 3438 (void) ath9k_hw_stopdmarecv(ah); 3439 drv_usecwait(3000); 3440 3441 /* 3442 * Power down HW 3443 */ 3444 (void) ath9k_hw_phy_disable(ah); 3445 3446 return (DDI_SUCCESS); 3447 } 3448 3449 DDI_DEFINE_STREAM_OPS(arn_dev_ops, nulldev, nulldev, arn_attach, arn_detach, 3450 nodev, NULL, D_MP, NULL, arn_quiesce); 3451 3452 static struct modldrv arn_modldrv = { 3453 &mod_driverops, /* Type of module. This one is a driver */ 3454 "Atheros 9000 series driver", /* short description */ 3455 &arn_dev_ops /* driver specific ops */ 3456 }; 3457 3458 static struct modlinkage modlinkage = { 3459 MODREV_1, (void *)&arn_modldrv, NULL 3460 }; 3461 3462 int 3463 _info(struct modinfo *modinfop) 3464 { 3465 return (mod_info(&modlinkage, modinfop)); 3466 } 3467 3468 int 3469 _init(void) 3470 { 3471 int status; 3472 3473 status = ddi_soft_state_init 3474 (&arn_soft_state_p, sizeof (struct arn_softc), 1); 3475 if (status != 0) 3476 return (status); 3477 3478 mutex_init(&arn_loglock, NULL, MUTEX_DRIVER, NULL); 3479 mac_init_ops(&arn_dev_ops, "arn"); 3480 status = mod_install(&modlinkage); 3481 if (status != 0) { 3482 mac_fini_ops(&arn_dev_ops); 3483 mutex_destroy(&arn_loglock); 3484 ddi_soft_state_fini(&arn_soft_state_p); 3485 } 3486 3487 return (status); 3488 } 3489 3490 int 3491 _fini(void) 3492 { 3493 int status; 3494 3495 status = mod_remove(&modlinkage); 3496 if (status == 0) { 3497 mac_fini_ops(&arn_dev_ops); 3498 mutex_destroy(&arn_loglock); 3499 ddi_soft_state_fini(&arn_soft_state_p); 3500 } 3501 return (status); 3502 }