1 /* 2 * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* 7 * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer, 15 * without modification. 16 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 17 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 18 * redistribution must be conditioned upon including a substantially 19 * similar Disclaimer requirement for further binary redistribution. 20 * 3. Neither the names of the above-listed copyright holders nor the names 21 * of any contributors may be used to endorse or promote products derived 22 * from this software without specific prior written permission. 23 * 24 * NO WARRANTY 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 27 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 28 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 29 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 30 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 33 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 35 * THE POSSIBILITY OF SUCH DAMAGES. 36 * 37 */ 38 39 /* 40 * Driver for the Atheros Wireless LAN controller. 41 * 42 * The Atheros driver calls into net80211 module for IEEE80211 protocol 43 * management functionalities. The driver includes a LLD(Low Level Driver) 44 * part to implement H/W related operations. 45 * The following is the high level structure of ath driver. 46 * (The arrows between modules indicate function call direction.) 47 * 48 * 49 * | 50 * | GLD thread 51 * V 52 * ================== ========================================= 53 * | | |[1] | 54 * | | | GLDv3 Callback functions registered | 55 * | Net80211 | ========================= by | 56 * | module | | | driver | 57 * | | V | | 58 * | |======================== | | 59 * | Functions exported by net80211 | | | 60 * | | | | 61 * ========================================== ================= 62 * | | 63 * V | 64 * +----------------------------------+ | 65 * |[2] | | 66 * | Net80211 Callback functions | | 67 * | registered by LLD | | 68 * +----------------------------------+ | 69 * | | 70 * V v 71 * +-----------------------------------------------------------+ 72 * |[3] | 73 * | LLD Internal functions | 74 * | | 75 * +-----------------------------------------------------------+ 76 * ^ 77 * | Software interrupt thread 78 * | 79 * 80 * The short description of each module is as below: 81 * Module 1: GLD callback functions, which are intercepting the calls from 82 * GLD to LLD. 83 * Module 2: Net80211 callback functions registered by LLD, which 84 * calls into LLD for H/W related functions needed by net80211. 85 * Module 3: LLD Internal functions, which are responsible for allocing 86 * descriptor/buffer, handling interrupt and other H/W 87 * operations. 88 * 89 * All functions are running in 3 types of thread: 90 * 1. GLD callbacks threads, such as ioctl, intr, etc. 91 * 2. Clock interruptt thread which is responsible for scan, rate control and 92 * calibration. 93 * 3. Software Interrupt thread originated in LLD. 94 * 95 * The lock strategy is as below: 96 * There have 4 queues for tx, each queue has one asc_txqlock[i] to 97 * prevent conflicts access to queue resource from different thread. 98 * 99 * All the transmit buffers are contained in asc_txbuf which are 100 * protected by asc_txbuflock. 101 * 102 * Each receive buffers are contained in asc_rxbuf which are protected 103 * by asc_rxbuflock. 104 * 105 * In ath struct, asc_genlock is a general lock, protecting most other 106 * operational data in ath_softc struct and HAL accesses. 107 * It is acquired by the interupt handler and most "mode-ctrl" routines. 108 * 109 * Any of the locks can be acquired singly, but where multiple 110 * locks are acquired, they *must* be in the order: 111 * asc_genlock >> asc_txqlock[i] >> asc_txbuflock >> asc_rxbuflock 112 */ 113 114 #include <sys/param.h> 115 #include <sys/types.h> 116 #include <sys/signal.h> 117 #include <sys/stream.h> 118 #include <sys/termio.h> 119 #include <sys/errno.h> 120 #include <sys/file.h> 121 #include <sys/cmn_err.h> 122 #include <sys/stropts.h> 123 #include <sys/strsubr.h> 124 #include <sys/strtty.h> 125 #include <sys/kbio.h> 126 #include <sys/cred.h> 127 #include <sys/stat.h> 128 #include <sys/consdev.h> 129 #include <sys/kmem.h> 130 #include <sys/modctl.h> 131 #include <sys/ddi.h> 132 #include <sys/sunddi.h> 133 #include <sys/pci.h> 134 #include <sys/errno.h> 135 #include <sys/mac_provider.h> 136 #include <sys/dlpi.h> 137 #include <sys/ethernet.h> 138 #include <sys/list.h> 139 #include <sys/byteorder.h> 140 #include <sys/strsun.h> 141 #include <sys/policy.h> 142 #include <inet/common.h> 143 #include <inet/nd.h> 144 #include <inet/mi.h> 145 #include <inet/wifi_ioctl.h> 146 #include <sys/mac_wifi.h> 147 #include "ath_hal.h" 148 #include "ath_impl.h" 149 #include "ath_aux.h" 150 #include "ath_rate.h" 151 152 #define ATH_MAX_RSSI 63 /* max rssi */ 153 154 extern void ath_halfix_init(void); 155 extern void ath_halfix_finit(void); 156 extern int32_t ath_getset(ath_t *asc, mblk_t *mp, uint32_t cmd); 157 158 /* 159 * PIO access attributes for registers 160 */ 161 static ddi_device_acc_attr_t ath_reg_accattr = { 162 DDI_DEVICE_ATTR_V0, 163 DDI_STRUCTURE_LE_ACC, 164 DDI_STRICTORDER_ACC 165 }; 166 167 /* 168 * DMA access attributes for descriptors: NOT to be byte swapped. 169 */ 170 static ddi_device_acc_attr_t ath_desc_accattr = { 171 DDI_DEVICE_ATTR_V0, 172 DDI_STRUCTURE_LE_ACC, 173 DDI_STRICTORDER_ACC 174 }; 175 176 /* 177 * DMA attributes for rx/tx buffers 178 */ 179 static ddi_dma_attr_t ath_dma_attr = { 180 DMA_ATTR_V0, /* version number */ 181 0, /* low address */ 182 0xffffffffU, /* high address */ 183 0x3ffffU, /* counter register max */ 184 1, /* alignment */ 185 0xFFF, /* burst sizes */ 186 1, /* minimum transfer size */ 187 0x3ffffU, /* max transfer size */ 188 0xffffffffU, /* address register max */ 189 1, /* no scatter-gather */ 190 1, /* granularity of device */ 191 0, /* DMA flags */ 192 }; 193 194 static ddi_dma_attr_t ath_desc_dma_attr = { 195 DMA_ATTR_V0, /* version number */ 196 0, /* low address */ 197 0xffffffffU, /* high address */ 198 0xffffffffU, /* counter register max */ 199 0x1000, /* alignment */ 200 0xFFF, /* burst sizes */ 201 1, /* minimum transfer size */ 202 0xffffffffU, /* max transfer size */ 203 0xffffffffU, /* address register max */ 204 1, /* no scatter-gather */ 205 1, /* granularity of device */ 206 0, /* DMA flags */ 207 }; 208 209 static kmutex_t ath_loglock; 210 static void *ath_soft_state_p = NULL; 211 static int ath_dwelltime = 150; /* scan interval, ms */ 212 213 static int ath_m_stat(void *, uint_t, uint64_t *); 214 static int ath_m_start(void *); 215 static void ath_m_stop(void *); 216 static int ath_m_promisc(void *, boolean_t); 217 static int ath_m_multicst(void *, boolean_t, const uint8_t *); 218 static int ath_m_unicst(void *, const uint8_t *); 219 static mblk_t *ath_m_tx(void *, mblk_t *); 220 static void ath_m_ioctl(void *, queue_t *, mblk_t *); 221 static int ath_m_setprop(void *, const char *, mac_prop_id_t, 222 uint_t, const void *); 223 static int ath_m_getprop(void *, const char *, mac_prop_id_t, 224 uint_t, void *); 225 static void ath_m_propinfo(void *, const char *, mac_prop_id_t, 226 mac_prop_info_handle_t); 227 228 static mac_callbacks_t ath_m_callbacks = { 229 MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO, 230 ath_m_stat, 231 ath_m_start, 232 ath_m_stop, 233 ath_m_promisc, 234 ath_m_multicst, 235 ath_m_unicst, 236 ath_m_tx, 237 NULL, 238 ath_m_ioctl, 239 NULL, /* mc_getcapab */ 240 NULL, 241 NULL, 242 ath_m_setprop, 243 ath_m_getprop, 244 ath_m_propinfo 245 }; 246 247 /* 248 * Available debug flags: 249 * ATH_DBG_INIT, ATH_DBG_GLD, ATH_DBG_HAL, ATH_DBG_INT, ATH_DBG_ATTACH, 250 * ATH_DBG_DETACH, ATH_DBG_AUX, ATH_DBG_WIFICFG, ATH_DBG_OSDEP 251 */ 252 uint32_t ath_dbg_flags = 0; 253 254 /* 255 * Exception/warning cases not leading to panic. 256 */ 257 void 258 ath_problem(const int8_t *fmt, ...) 259 { 260 va_list args; 261 262 mutex_enter(&ath_loglock); 263 264 va_start(args, fmt); 265 vcmn_err(CE_WARN, fmt, args); 266 va_end(args); 267 268 mutex_exit(&ath_loglock); 269 } 270 271 /* 272 * Normal log information independent of debug. 273 */ 274 void 275 ath_log(const int8_t *fmt, ...) 276 { 277 va_list args; 278 279 mutex_enter(&ath_loglock); 280 281 va_start(args, fmt); 282 vcmn_err(CE_CONT, fmt, args); 283 va_end(args); 284 285 mutex_exit(&ath_loglock); 286 } 287 288 void 289 ath_dbg(uint32_t dbg_flags, const int8_t *fmt, ...) 290 { 291 va_list args; 292 293 if (dbg_flags & ath_dbg_flags) { 294 mutex_enter(&ath_loglock); 295 va_start(args, fmt); 296 vcmn_err(CE_CONT, fmt, args); 297 va_end(args); 298 mutex_exit(&ath_loglock); 299 } 300 } 301 302 void 303 ath_setup_desc(ath_t *asc, struct ath_buf *bf) 304 { 305 struct ath_desc *ds; 306 307 ds = bf->bf_desc; 308 ds->ds_link = bf->bf_daddr; 309 ds->ds_data = bf->bf_dma.cookie.dmac_address; 310 ATH_HAL_SETUPRXDESC(asc->asc_ah, ds, 311 bf->bf_dma.alength, /* buffer size */ 312 0); 313 314 if (asc->asc_rxlink != NULL) 315 *asc->asc_rxlink = bf->bf_daddr; 316 asc->asc_rxlink = &ds->ds_link; 317 } 318 319 320 /* 321 * Allocate an area of memory and a DMA handle for accessing it 322 */ 323 static int 324 ath_alloc_dma_mem(dev_info_t *devinfo, ddi_dma_attr_t *dma_attr, size_t memsize, 325 ddi_device_acc_attr_t *attr_p, uint_t alloc_flags, 326 uint_t bind_flags, dma_area_t *dma_p) 327 { 328 int err; 329 330 /* 331 * Allocate handle 332 */ 333 err = ddi_dma_alloc_handle(devinfo, dma_attr, 334 DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl); 335 if (err != DDI_SUCCESS) 336 return (DDI_FAILURE); 337 338 /* 339 * Allocate memory 340 */ 341 err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p, 342 alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va, 343 &dma_p->alength, &dma_p->acc_hdl); 344 if (err != DDI_SUCCESS) 345 return (DDI_FAILURE); 346 347 /* 348 * Bind the two together 349 */ 350 err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL, 351 dma_p->mem_va, dma_p->alength, bind_flags, 352 DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies); 353 if (err != DDI_DMA_MAPPED) 354 return (DDI_FAILURE); 355 356 dma_p->nslots = ~0U; 357 dma_p->size = ~0U; 358 dma_p->token = ~0U; 359 dma_p->offset = 0; 360 return (DDI_SUCCESS); 361 } 362 363 /* 364 * Free one allocated area of DMAable memory 365 */ 366 static void 367 ath_free_dma_mem(dma_area_t *dma_p) 368 { 369 if (dma_p->dma_hdl != NULL) { 370 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); 371 if (dma_p->acc_hdl != NULL) { 372 ddi_dma_mem_free(&dma_p->acc_hdl); 373 dma_p->acc_hdl = NULL; 374 } 375 ddi_dma_free_handle(&dma_p->dma_hdl); 376 dma_p->ncookies = 0; 377 dma_p->dma_hdl = NULL; 378 } 379 } 380 381 382 /* 383 * Initialize tx/rx buffer list. Allocate DMA memory for 384 * each buffer. 385 */ 386 static int 387 ath_buflist_setup(dev_info_t *devinfo, ath_t *asc, list_t *bflist, 388 struct ath_buf **pbf, struct ath_desc **pds, int nbuf, uint_t dmabflags) 389 { 390 int i, err; 391 struct ath_buf *bf = *pbf; 392 struct ath_desc *ds = *pds; 393 394 list_create(bflist, sizeof (struct ath_buf), 395 offsetof(struct ath_buf, bf_node)); 396 for (i = 0; i < nbuf; i++, bf++, ds++) { 397 bf->bf_desc = ds; 398 bf->bf_daddr = asc->asc_desc_dma.cookie.dmac_address + 399 ((uintptr_t)ds - (uintptr_t)asc->asc_desc); 400 list_insert_tail(bflist, bf); 401 402 /* alloc DMA memory */ 403 err = ath_alloc_dma_mem(devinfo, &ath_dma_attr, 404 asc->asc_dmabuf_size, &ath_desc_accattr, DDI_DMA_STREAMING, 405 dmabflags, &bf->bf_dma); 406 if (err != DDI_SUCCESS) 407 return (err); 408 } 409 *pbf = bf; 410 *pds = ds; 411 412 return (DDI_SUCCESS); 413 } 414 415 /* 416 * Destroy tx/rx buffer list. Free DMA memory. 417 */ 418 static void 419 ath_buflist_cleanup(list_t *buflist) 420 { 421 struct ath_buf *bf; 422 423 if (!buflist) 424 return; 425 426 bf = list_head(buflist); 427 while (bf != NULL) { 428 if (bf->bf_m != NULL) { 429 freemsg(bf->bf_m); 430 bf->bf_m = NULL; 431 } 432 /* Free DMA buffer */ 433 ath_free_dma_mem(&bf->bf_dma); 434 if (bf->bf_in != NULL) { 435 ieee80211_free_node(bf->bf_in); 436 bf->bf_in = NULL; 437 } 438 list_remove(buflist, bf); 439 bf = list_head(buflist); 440 } 441 list_destroy(buflist); 442 } 443 444 445 static void 446 ath_desc_free(ath_t *asc) 447 { 448 ath_buflist_cleanup(&asc->asc_txbuf_list); 449 ath_buflist_cleanup(&asc->asc_rxbuf_list); 450 451 /* Free descriptor DMA buffer */ 452 ath_free_dma_mem(&asc->asc_desc_dma); 453 454 kmem_free((void *)asc->asc_vbufptr, asc->asc_vbuflen); 455 asc->asc_vbufptr = NULL; 456 } 457 458 static int 459 ath_desc_alloc(dev_info_t *devinfo, ath_t *asc) 460 { 461 int err; 462 size_t size; 463 struct ath_desc *ds; 464 struct ath_buf *bf; 465 466 size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF); 467 468 err = ath_alloc_dma_mem(devinfo, &ath_desc_dma_attr, size, 469 &ath_desc_accattr, DDI_DMA_CONSISTENT, 470 DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &asc->asc_desc_dma); 471 472 /* virtual address of the first descriptor */ 473 asc->asc_desc = (struct ath_desc *)asc->asc_desc_dma.mem_va; 474 475 ds = asc->asc_desc; 476 ATH_DEBUG((ATH_DBG_INIT, "ath: ath_desc_alloc(): DMA map: " 477 "%p (%d) -> %p\n", 478 asc->asc_desc, asc->asc_desc_dma.alength, 479 asc->asc_desc_dma.cookie.dmac_address)); 480 481 /* allocate data structures to describe TX/RX DMA buffers */ 482 asc->asc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF); 483 bf = (struct ath_buf *)kmem_zalloc(asc->asc_vbuflen, KM_SLEEP); 484 asc->asc_vbufptr = bf; 485 486 /* DMA buffer size for each TX/RX packet */ 487 asc->asc_dmabuf_size = roundup(1000 + sizeof (struct ieee80211_frame) + 488 IEEE80211_MTU + IEEE80211_CRC_LEN + 489 (IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN + 490 IEEE80211_WEP_CRCLEN), asc->asc_cachelsz); 491 492 /* create RX buffer list */ 493 err = ath_buflist_setup(devinfo, asc, &asc->asc_rxbuf_list, &bf, &ds, 494 ATH_RXBUF, DDI_DMA_READ | DDI_DMA_STREAMING); 495 if (err != DDI_SUCCESS) { 496 ath_desc_free(asc); 497 return (err); 498 } 499 500 /* create TX buffer list */ 501 err = ath_buflist_setup(devinfo, asc, &asc->asc_txbuf_list, &bf, &ds, 502 ATH_TXBUF, DDI_DMA_STREAMING); 503 if (err != DDI_SUCCESS) { 504 ath_desc_free(asc); 505 return (err); 506 } 507 508 509 return (DDI_SUCCESS); 510 } 511 512 static void 513 ath_printrxbuf(struct ath_buf *bf, int32_t done) 514 { 515 struct ath_desc *ds = bf->bf_desc; 516 const struct ath_rx_status *rs = &bf->bf_status.ds_rxstat; 517 518 ATH_DEBUG((ATH_DBG_RECV, "ath: R (%p %p) %08x %08x %08x " 519 "%08x %08x %08x %c\n", 520 ds, bf->bf_daddr, 521 ds->ds_link, ds->ds_data, 522 ds->ds_ctl0, ds->ds_ctl1, 523 ds->ds_hw[0], ds->ds_hw[1], 524 !done ? ' ' : (rs->rs_status == 0) ? '*' : '!')); 525 } 526 527 static void 528 ath_rx_handler(ath_t *asc) 529 { 530 ieee80211com_t *ic = (ieee80211com_t *)asc; 531 struct ath_buf *bf; 532 struct ath_hal *ah = asc->asc_ah; 533 struct ath_desc *ds; 534 struct ath_rx_status *rs; 535 mblk_t *rx_mp; 536 struct ieee80211_frame *wh; 537 int32_t len, loop = 1; 538 uint8_t phyerr; 539 HAL_STATUS status; 540 HAL_NODE_STATS hal_node_stats; 541 struct ieee80211_node *in; 542 543 do { 544 mutex_enter(&asc->asc_rxbuflock); 545 bf = list_head(&asc->asc_rxbuf_list); 546 if (bf == NULL) { 547 ATH_DEBUG((ATH_DBG_RECV, "ath: ath_rx_handler(): " 548 "no buffer\n")); 549 mutex_exit(&asc->asc_rxbuflock); 550 break; 551 } 552 ASSERT(bf->bf_dma.cookie.dmac_address != 0); 553 ds = bf->bf_desc; 554 if (ds->ds_link == bf->bf_daddr) { 555 /* 556 * Never process the self-linked entry at the end, 557 * this may be met at heavy load. 558 */ 559 mutex_exit(&asc->asc_rxbuflock); 560 break; 561 } 562 563 rs = &bf->bf_status.ds_rxstat; 564 status = ATH_HAL_RXPROCDESC(ah, ds, 565 bf->bf_daddr, 566 ATH_PA2DESC(asc, ds->ds_link), rs); 567 if (status == HAL_EINPROGRESS) { 568 mutex_exit(&asc->asc_rxbuflock); 569 break; 570 } 571 list_remove(&asc->asc_rxbuf_list, bf); 572 mutex_exit(&asc->asc_rxbuflock); 573 574 if (rs->rs_status != 0) { 575 if (rs->rs_status & HAL_RXERR_CRC) 576 asc->asc_stats.ast_rx_crcerr++; 577 if (rs->rs_status & HAL_RXERR_FIFO) 578 asc->asc_stats.ast_rx_fifoerr++; 579 if (rs->rs_status & HAL_RXERR_DECRYPT) 580 asc->asc_stats.ast_rx_badcrypt++; 581 if (rs->rs_status & HAL_RXERR_PHY) { 582 asc->asc_stats.ast_rx_phyerr++; 583 phyerr = rs->rs_phyerr & 0x1f; 584 asc->asc_stats.ast_rx_phy[phyerr]++; 585 } 586 goto rx_next; 587 } 588 len = rs->rs_datalen; 589 590 /* less than sizeof(struct ieee80211_frame) */ 591 if (len < 20) { 592 asc->asc_stats.ast_rx_tooshort++; 593 goto rx_next; 594 } 595 596 if ((rx_mp = allocb(asc->asc_dmabuf_size, BPRI_MED)) == NULL) { 597 ath_problem("ath: ath_rx_handler(): " 598 "allocing mblk buffer failed.\n"); 599 return; 600 } 601 602 ATH_DMA_SYNC(bf->bf_dma, DDI_DMA_SYNC_FORCPU); 603 bcopy(bf->bf_dma.mem_va, rx_mp->b_rptr, len); 604 605 rx_mp->b_wptr += len; 606 wh = (struct ieee80211_frame *)rx_mp->b_rptr; 607 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == 608 IEEE80211_FC0_TYPE_CTL) { 609 /* 610 * Ignore control frame received in promisc mode. 611 */ 612 freemsg(rx_mp); 613 goto rx_next; 614 } 615 /* Remove the CRC at the end of IEEE80211 frame */ 616 rx_mp->b_wptr -= IEEE80211_CRC_LEN; 617 #ifdef DEBUG 618 ath_printrxbuf(bf, status == HAL_OK); 619 #endif /* DEBUG */ 620 /* 621 * Locate the node for sender, track state, and then 622 * pass the (referenced) node up to the 802.11 layer 623 * for its use. 624 */ 625 in = ieee80211_find_rxnode(ic, wh); 626 627 /* 628 * Send frame up for processing. 629 */ 630 (void) ieee80211_input(ic, rx_mp, in, 631 rs->rs_rssi, rs->rs_tstamp); 632 633 ieee80211_free_node(in); 634 635 rx_next: 636 mutex_enter(&asc->asc_rxbuflock); 637 list_insert_tail(&asc->asc_rxbuf_list, bf); 638 mutex_exit(&asc->asc_rxbuflock); 639 ath_setup_desc(asc, bf); 640 } while (loop); 641 642 /* rx signal state monitoring */ 643 ATH_HAL_RXMONITOR(ah, &hal_node_stats, &asc->asc_curchan); 644 } 645 646 static void 647 ath_printtxbuf(struct ath_buf *bf, int done) 648 { 649 struct ath_desc *ds = bf->bf_desc; 650 const struct ath_tx_status *ts = &bf->bf_status.ds_txstat; 651 652 ATH_DEBUG((ATH_DBG_SEND, "ath: T(%p %p) %08x %08x %08x %08x %08x" 653 " %08x %08x %08x %c\n", 654 ds, bf->bf_daddr, 655 ds->ds_link, ds->ds_data, 656 ds->ds_ctl0, ds->ds_ctl1, 657 ds->ds_hw[0], ds->ds_hw[1], ds->ds_hw[2], ds->ds_hw[3], 658 !done ? ' ' : (ts->ts_status == 0) ? '*' : '!')); 659 } 660 661 /* 662 * The input parameter mp has following assumption: 663 * For data packets, GLDv3 mac_wifi plugin allocates and fills the 664 * ieee80211 header. For management packets, net80211 allocates and 665 * fills the ieee80211 header. In both cases, enough spaces in the 666 * header are left for encryption option. 667 */ 668 static int32_t 669 ath_tx_start(ath_t *asc, struct ieee80211_node *in, struct ath_buf *bf, 670 mblk_t *mp) 671 { 672 ieee80211com_t *ic = (ieee80211com_t *)asc; 673 struct ieee80211_frame *wh; 674 struct ath_hal *ah = asc->asc_ah; 675 uint32_t subtype, flags, ctsduration; 676 int32_t keyix, iswep, hdrlen, pktlen, mblen, mbslen, try0; 677 uint8_t rix, cix, txrate, ctsrate; 678 struct ath_desc *ds; 679 struct ath_txq *txq; 680 HAL_PKT_TYPE atype; 681 const HAL_RATE_TABLE *rt; 682 HAL_BOOL shortPreamble; 683 struct ath_node *an; 684 caddr_t dest; 685 686 /* 687 * CRC are added by H/W, not encaped by driver, 688 * but we must count it in pkt length. 689 */ 690 pktlen = IEEE80211_CRC_LEN; 691 692 wh = (struct ieee80211_frame *)mp->b_rptr; 693 iswep = wh->i_fc[1] & IEEE80211_FC1_WEP; 694 keyix = HAL_TXKEYIX_INVALID; 695 hdrlen = sizeof (struct ieee80211_frame); 696 if (iswep != 0) { 697 const struct ieee80211_cipher *cip; 698 struct ieee80211_key *k; 699 700 /* 701 * Construct the 802.11 header+trailer for an encrypted 702 * frame. The only reason this can fail is because of an 703 * unknown or unsupported cipher/key type. 704 */ 705 k = ieee80211_crypto_encap(ic, mp); 706 if (k == NULL) { 707 ATH_DEBUG((ATH_DBG_AUX, "crypto_encap failed\n")); 708 /* 709 * This can happen when the key is yanked after the 710 * frame was queued. Just discard the frame; the 711 * 802.11 layer counts failures and provides 712 * debugging/diagnostics. 713 */ 714 return (EIO); 715 } 716 cip = k->wk_cipher; 717 /* 718 * Adjust the packet + header lengths for the crypto 719 * additions and calculate the h/w key index. When 720 * a s/w mic is done the frame will have had any mic 721 * added to it prior to entry so m0->m_pkthdr.len above will 722 * account for it. Otherwise we need to add it to the 723 * packet length. 724 */ 725 hdrlen += cip->ic_header; 726 pktlen += cip->ic_trailer; 727 if ((k->wk_flags & IEEE80211_KEY_SWMIC) == 0) 728 pktlen += cip->ic_miclen; 729 keyix = k->wk_keyix; 730 731 /* packet header may have moved, reset our local pointer */ 732 wh = (struct ieee80211_frame *)mp->b_rptr; 733 } 734 735 dest = bf->bf_dma.mem_va; 736 for (; mp != NULL; mp = mp->b_cont) { 737 mblen = MBLKL(mp); 738 bcopy(mp->b_rptr, dest, mblen); 739 dest += mblen; 740 } 741 mbslen = (uintptr_t)dest - (uintptr_t)bf->bf_dma.mem_va; 742 pktlen += mbslen; 743 744 bf->bf_in = in; 745 746 /* setup descriptors */ 747 ds = bf->bf_desc; 748 rt = asc->asc_currates; 749 ASSERT(rt != NULL); 750 751 /* 752 * The 802.11 layer marks whether or not we should 753 * use short preamble based on the current mode and 754 * negotiated parameters. 755 */ 756 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && 757 (in->in_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE)) { 758 shortPreamble = AH_TRUE; 759 asc->asc_stats.ast_tx_shortpre++; 760 } else { 761 shortPreamble = AH_FALSE; 762 } 763 764 an = ATH_NODE(in); 765 766 /* 767 * Calculate Atheros packet type from IEEE80211 packet header 768 * and setup for rate calculations. 769 */ 770 switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { 771 case IEEE80211_FC0_TYPE_MGT: 772 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; 773 if (subtype == IEEE80211_FC0_SUBTYPE_BEACON) 774 atype = HAL_PKT_TYPE_BEACON; 775 else if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP) 776 atype = HAL_PKT_TYPE_PROBE_RESP; 777 else if (subtype == IEEE80211_FC0_SUBTYPE_ATIM) 778 atype = HAL_PKT_TYPE_ATIM; 779 else 780 atype = HAL_PKT_TYPE_NORMAL; 781 rix = 0; /* lowest rate */ 782 try0 = ATH_TXMAXTRY; 783 if (shortPreamble) 784 txrate = an->an_tx_mgtratesp; 785 else 786 txrate = an->an_tx_mgtrate; 787 /* force all ctl frames to highest queue */ 788 txq = asc->asc_ac2q[WME_AC_VO]; 789 break; 790 case IEEE80211_FC0_TYPE_CTL: 791 atype = HAL_PKT_TYPE_PSPOLL; 792 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; 793 rix = 0; /* lowest rate */ 794 try0 = ATH_TXMAXTRY; 795 if (shortPreamble) 796 txrate = an->an_tx_mgtratesp; 797 else 798 txrate = an->an_tx_mgtrate; 799 /* force all ctl frames to highest queue */ 800 txq = asc->asc_ac2q[WME_AC_VO]; 801 break; 802 case IEEE80211_FC0_TYPE_DATA: 803 atype = HAL_PKT_TYPE_NORMAL; 804 rix = an->an_tx_rix0; 805 try0 = an->an_tx_try0; 806 if (shortPreamble) 807 txrate = an->an_tx_rate0sp; 808 else 809 txrate = an->an_tx_rate0; 810 /* Always use background queue */ 811 txq = asc->asc_ac2q[WME_AC_BK]; 812 break; 813 default: 814 /* Unknown 802.11 frame */ 815 asc->asc_stats.ast_tx_invalid++; 816 return (1); 817 } 818 /* 819 * Calculate miscellaneous flags. 820 */ 821 flags = HAL_TXDESC_CLRDMASK; 822 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { 823 flags |= HAL_TXDESC_NOACK; /* no ack on broad/multicast */ 824 asc->asc_stats.ast_tx_noack++; 825 } else if (pktlen > ic->ic_rtsthreshold) { 826 flags |= HAL_TXDESC_RTSENA; /* RTS based on frame length */ 827 asc->asc_stats.ast_tx_rts++; 828 } 829 830 /* 831 * Calculate duration. This logically belongs in the 802.11 832 * layer but it lacks sufficient information to calculate it. 833 */ 834 if ((flags & HAL_TXDESC_NOACK) == 0 && 835 (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != 836 IEEE80211_FC0_TYPE_CTL) { 837 uint16_t dur; 838 dur = ath_hal_computetxtime(ah, rt, IEEE80211_ACK_SIZE, 839 rix, shortPreamble); 840 /* LINTED E_BAD_PTR_CAST_ALIGN */ 841 *(uint16_t *)wh->i_dur = LE_16(dur); 842 } 843 844 /* 845 * Calculate RTS/CTS rate and duration if needed. 846 */ 847 ctsduration = 0; 848 if (flags & (HAL_TXDESC_RTSENA|HAL_TXDESC_CTSENA)) { 849 /* 850 * CTS transmit rate is derived from the transmit rate 851 * by looking in the h/w rate table. We must also factor 852 * in whether or not a short preamble is to be used. 853 */ 854 cix = rt->info[rix].controlRate; 855 ctsrate = rt->info[cix].rateCode; 856 if (shortPreamble) 857 ctsrate |= rt->info[cix].shortPreamble; 858 /* 859 * Compute the transmit duration based on the size 860 * of an ACK frame. We call into the HAL to do the 861 * computation since it depends on the characteristics 862 * of the actual PHY being used. 863 */ 864 if (flags & HAL_TXDESC_RTSENA) { /* SIFS + CTS */ 865 ctsduration += ath_hal_computetxtime(ah, 866 rt, IEEE80211_ACK_SIZE, cix, shortPreamble); 867 } 868 /* SIFS + data */ 869 ctsduration += ath_hal_computetxtime(ah, 870 rt, pktlen, rix, shortPreamble); 871 if ((flags & HAL_TXDESC_NOACK) == 0) { /* SIFS + ACK */ 872 ctsduration += ath_hal_computetxtime(ah, 873 rt, IEEE80211_ACK_SIZE, cix, shortPreamble); 874 } 875 } else 876 ctsrate = 0; 877 878 if (++txq->axq_intrcnt >= ATH_TXINTR_PERIOD) { 879 flags |= HAL_TXDESC_INTREQ; 880 txq->axq_intrcnt = 0; 881 } 882 883 /* 884 * Formulate first tx descriptor with tx controls. 885 */ 886 ATH_HAL_SETUPTXDESC(ah, ds, 887 pktlen, /* packet length */ 888 hdrlen, /* header length */ 889 atype, /* Atheros packet type */ 890 MIN(in->in_txpower, 60), /* txpower */ 891 txrate, try0, /* series 0 rate/tries */ 892 keyix, /* key cache index */ 893 an->an_tx_antenna, /* antenna mode */ 894 flags, /* flags */ 895 ctsrate, /* rts/cts rate */ 896 ctsduration); /* rts/cts duration */ 897 bf->bf_flags = flags; 898 899 /* LINTED E_BAD_PTR_CAST_ALIGN */ 900 ATH_DEBUG((ATH_DBG_SEND, "ath: ath_xmit(): to %s totlen=%d " 901 "an->an_tx_rate1sp=%d tx_rate2sp=%d tx_rate3sp=%d " 902 "qnum=%d rix=%d sht=%d dur = %d\n", 903 ieee80211_macaddr_sprintf(wh->i_addr1), mbslen, an->an_tx_rate1sp, 904 an->an_tx_rate2sp, an->an_tx_rate3sp, 905 txq->axq_qnum, rix, shortPreamble, *(uint16_t *)wh->i_dur)); 906 907 /* 908 * Setup the multi-rate retry state only when we're 909 * going to use it. This assumes ath_hal_setuptxdesc 910 * initializes the descriptors (so we don't have to) 911 * when the hardware supports multi-rate retry and 912 * we don't use it. 913 */ 914 if (try0 != ATH_TXMAXTRY) 915 ATH_HAL_SETUPXTXDESC(ah, ds, 916 an->an_tx_rate1sp, 2, /* series 1 */ 917 an->an_tx_rate2sp, 2, /* series 2 */ 918 an->an_tx_rate3sp, 2); /* series 3 */ 919 920 ds->ds_link = 0; 921 ds->ds_data = bf->bf_dma.cookie.dmac_address; 922 ATH_HAL_FILLTXDESC(ah, ds, 923 mbslen, /* segment length */ 924 AH_TRUE, /* first segment */ 925 AH_TRUE, /* last segment */ 926 ds); /* first descriptor */ 927 928 ATH_DMA_SYNC(bf->bf_dma, DDI_DMA_SYNC_FORDEV); 929 930 mutex_enter(&txq->axq_lock); 931 list_insert_tail(&txq->axq_list, bf); 932 if (txq->axq_link == NULL) { 933 ATH_HAL_PUTTXBUF(ah, txq->axq_qnum, bf->bf_daddr); 934 } else { 935 *txq->axq_link = bf->bf_daddr; 936 } 937 txq->axq_link = &ds->ds_link; 938 mutex_exit(&txq->axq_lock); 939 940 ATH_HAL_TXSTART(ah, txq->axq_qnum); 941 942 ic->ic_stats.is_tx_frags++; 943 ic->ic_stats.is_tx_bytes += pktlen; 944 945 return (0); 946 } 947 948 /* 949 * Transmit a management frame. On failure we reclaim the skbuff. 950 * Note that management frames come directly from the 802.11 layer 951 * and do not honor the send queue flow control. Need to investigate 952 * using priority queueing so management frames can bypass data. 953 */ 954 static int 955 ath_xmit(ieee80211com_t *ic, mblk_t *mp, uint8_t type) 956 { 957 ath_t *asc = (ath_t *)ic; 958 struct ath_hal *ah = asc->asc_ah; 959 struct ieee80211_node *in = NULL; 960 struct ath_buf *bf = NULL; 961 struct ieee80211_frame *wh; 962 int error = 0; 963 964 ASSERT(mp->b_next == NULL); 965 966 if (!ATH_IS_RUNNING(asc)) { 967 if ((type & IEEE80211_FC0_TYPE_MASK) != 968 IEEE80211_FC0_TYPE_DATA) { 969 freemsg(mp); 970 } 971 return (ENXIO); 972 } 973 974 /* Grab a TX buffer */ 975 mutex_enter(&asc->asc_txbuflock); 976 bf = list_head(&asc->asc_txbuf_list); 977 if (bf != NULL) 978 list_remove(&asc->asc_txbuf_list, bf); 979 if (list_empty(&asc->asc_txbuf_list)) { 980 ATH_DEBUG((ATH_DBG_SEND, "ath: ath_mgmt_send(): " 981 "stop queue\n")); 982 asc->asc_stats.ast_tx_qstop++; 983 } 984 mutex_exit(&asc->asc_txbuflock); 985 if (bf == NULL) { 986 ATH_DEBUG((ATH_DBG_SEND, "ath: ath_mgmt_send(): discard, " 987 "no xmit buf\n")); 988 ic->ic_stats.is_tx_nobuf++; 989 if ((type & IEEE80211_FC0_TYPE_MASK) == 990 IEEE80211_FC0_TYPE_DATA) { 991 asc->asc_stats.ast_tx_nobuf++; 992 mutex_enter(&asc->asc_resched_lock); 993 asc->asc_resched_needed = B_TRUE; 994 mutex_exit(&asc->asc_resched_lock); 995 } else { 996 asc->asc_stats.ast_tx_nobufmgt++; 997 freemsg(mp); 998 } 999 return (ENOMEM); 1000 } 1001 1002 wh = (struct ieee80211_frame *)mp->b_rptr; 1003 1004 /* Locate node */ 1005 in = ieee80211_find_txnode(ic, wh->i_addr1); 1006 if (in == NULL) { 1007 error = EIO; 1008 goto bad; 1009 } 1010 1011 in->in_inact = 0; 1012 switch (type & IEEE80211_FC0_TYPE_MASK) { 1013 case IEEE80211_FC0_TYPE_DATA: 1014 (void) ieee80211_encap(ic, mp, in); 1015 break; 1016 default: 1017 if ((wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == 1018 IEEE80211_FC0_SUBTYPE_PROBE_RESP) { 1019 /* fill time stamp */ 1020 uint64_t tsf; 1021 uint32_t *tstamp; 1022 1023 tsf = ATH_HAL_GETTSF64(ah); 1024 /* adjust 100us delay to xmit */ 1025 tsf += 100; 1026 /* LINTED E_BAD_PTR_CAST_ALIGN */ 1027 tstamp = (uint32_t *)&wh[1]; 1028 tstamp[0] = LE_32(tsf & 0xffffffff); 1029 tstamp[1] = LE_32(tsf >> 32); 1030 } 1031 asc->asc_stats.ast_tx_mgmt++; 1032 break; 1033 } 1034 1035 error = ath_tx_start(asc, in, bf, mp); 1036 if (error != 0) { 1037 bad: 1038 ic->ic_stats.is_tx_failed++; 1039 if (bf != NULL) { 1040 mutex_enter(&asc->asc_txbuflock); 1041 list_insert_tail(&asc->asc_txbuf_list, bf); 1042 mutex_exit(&asc->asc_txbuflock); 1043 } 1044 } 1045 if (in != NULL) 1046 ieee80211_free_node(in); 1047 if ((type & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_DATA || 1048 error == 0) { 1049 freemsg(mp); 1050 } 1051 1052 return (error); 1053 } 1054 1055 static mblk_t * 1056 ath_m_tx(void *arg, mblk_t *mp) 1057 { 1058 ath_t *asc = arg; 1059 ieee80211com_t *ic = (ieee80211com_t *)asc; 1060 mblk_t *next; 1061 int error = 0; 1062 1063 /* 1064 * No data frames go out unless we're associated; this 1065 * should not happen as the 802.11 layer does not enable 1066 * the xmit queue until we enter the RUN state. 1067 */ 1068 if (ic->ic_state != IEEE80211_S_RUN) { 1069 ATH_DEBUG((ATH_DBG_SEND, "ath: ath_m_tx(): " 1070 "discard, state %u\n", ic->ic_state)); 1071 asc->asc_stats.ast_tx_discard++; 1072 freemsgchain(mp); 1073 return (NULL); 1074 } 1075 1076 while (mp != NULL) { 1077 next = mp->b_next; 1078 mp->b_next = NULL; 1079 error = ath_xmit(ic, mp, IEEE80211_FC0_TYPE_DATA); 1080 if (error != 0) { 1081 mp->b_next = next; 1082 if (error == ENOMEM) { 1083 break; 1084 } else { 1085 freemsgchain(mp); /* CR6501759 issues */ 1086 return (NULL); 1087 } 1088 } 1089 mp = next; 1090 } 1091 1092 return (mp); 1093 } 1094 1095 static int 1096 ath_tx_processq(ath_t *asc, struct ath_txq *txq) 1097 { 1098 ieee80211com_t *ic = (ieee80211com_t *)asc; 1099 struct ath_hal *ah = asc->asc_ah; 1100 struct ath_buf *bf; 1101 struct ath_desc *ds; 1102 struct ieee80211_node *in; 1103 int32_t sr, lr, nacked = 0; 1104 struct ath_tx_status *ts; 1105 HAL_STATUS status; 1106 struct ath_node *an; 1107 1108 for (;;) { 1109 mutex_enter(&txq->axq_lock); 1110 bf = list_head(&txq->axq_list); 1111 if (bf == NULL) { 1112 txq->axq_link = NULL; 1113 mutex_exit(&txq->axq_lock); 1114 break; 1115 } 1116 ds = bf->bf_desc; /* last decriptor */ 1117 ts = &bf->bf_status.ds_txstat; 1118 status = ATH_HAL_TXPROCDESC(ah, ds, ts); 1119 #ifdef DEBUG 1120 ath_printtxbuf(bf, status == HAL_OK); 1121 #endif 1122 if (status == HAL_EINPROGRESS) { 1123 mutex_exit(&txq->axq_lock); 1124 break; 1125 } 1126 list_remove(&txq->axq_list, bf); 1127 mutex_exit(&txq->axq_lock); 1128 in = bf->bf_in; 1129 if (in != NULL) { 1130 an = ATH_NODE(in); 1131 /* Successful transmition */ 1132 if (ts->ts_status == 0) { 1133 an->an_tx_ok++; 1134 an->an_tx_antenna = ts->ts_antenna; 1135 if (ts->ts_rate & HAL_TXSTAT_ALTRATE) 1136 asc->asc_stats.ast_tx_altrate++; 1137 asc->asc_stats.ast_tx_rssidelta = 1138 ts->ts_rssi - asc->asc_stats.ast_tx_rssi; 1139 asc->asc_stats.ast_tx_rssi = ts->ts_rssi; 1140 } else { 1141 an->an_tx_err++; 1142 if (ts->ts_status & HAL_TXERR_XRETRY) 1143 asc->asc_stats.ast_tx_xretries++; 1144 if (ts->ts_status & HAL_TXERR_FIFO) 1145 asc->asc_stats.ast_tx_fifoerr++; 1146 if (ts->ts_status & HAL_TXERR_FILT) 1147 asc->asc_stats.ast_tx_filtered++; 1148 an->an_tx_antenna = 0; /* invalidate */ 1149 } 1150 sr = ts->ts_shortretry; 1151 lr = ts->ts_longretry; 1152 asc->asc_stats.ast_tx_shortretry += sr; 1153 asc->asc_stats.ast_tx_longretry += lr; 1154 /* 1155 * Hand the descriptor to the rate control algorithm. 1156 */ 1157 if ((ts->ts_status & HAL_TXERR_FILT) == 0 && 1158 (bf->bf_flags & HAL_TXDESC_NOACK) == 0) { 1159 /* 1160 * If frame was ack'd update the last rx time 1161 * used to workaround phantom bmiss interrupts. 1162 */ 1163 if (ts->ts_status == 0) { 1164 nacked++; 1165 an->an_tx_ok++; 1166 } else { 1167 an->an_tx_err++; 1168 } 1169 an->an_tx_retr += sr + lr; 1170 } 1171 } 1172 bf->bf_in = NULL; 1173 mutex_enter(&asc->asc_txbuflock); 1174 list_insert_tail(&asc->asc_txbuf_list, bf); 1175 mutex_exit(&asc->asc_txbuflock); 1176 /* 1177 * Reschedule stalled outbound packets 1178 */ 1179 mutex_enter(&asc->asc_resched_lock); 1180 if (asc->asc_resched_needed) { 1181 asc->asc_resched_needed = B_FALSE; 1182 mac_tx_update(ic->ic_mach); 1183 } 1184 mutex_exit(&asc->asc_resched_lock); 1185 } 1186 return (nacked); 1187 } 1188 1189 1190 static void 1191 ath_tx_handler(ath_t *asc) 1192 { 1193 int i; 1194 1195 /* 1196 * Process each active queue. 1197 */ 1198 for (i = 0; i < HAL_NUM_TX_QUEUES; i++) { 1199 if (ATH_TXQ_SETUP(asc, i)) { 1200 (void) ath_tx_processq(asc, &asc->asc_txq[i]); 1201 } 1202 } 1203 } 1204 1205 static struct ieee80211_node * 1206 ath_node_alloc(ieee80211com_t *ic) 1207 { 1208 struct ath_node *an; 1209 ath_t *asc = (ath_t *)ic; 1210 1211 an = kmem_zalloc(sizeof (struct ath_node), KM_SLEEP); 1212 ath_rate_update(asc, &an->an_node, 0); 1213 return (&an->an_node); 1214 } 1215 1216 static void 1217 ath_node_free(struct ieee80211_node *in) 1218 { 1219 ieee80211com_t *ic = in->in_ic; 1220 ath_t *asc = (ath_t *)ic; 1221 struct ath_buf *bf; 1222 struct ath_txq *txq; 1223 int32_t i; 1224 1225 for (i = 0; i < HAL_NUM_TX_QUEUES; i++) { 1226 if (ATH_TXQ_SETUP(asc, i)) { 1227 txq = &asc->asc_txq[i]; 1228 mutex_enter(&txq->axq_lock); 1229 bf = list_head(&txq->axq_list); 1230 while (bf != NULL) { 1231 if (bf->bf_in == in) { 1232 bf->bf_in = NULL; 1233 } 1234 bf = list_next(&txq->axq_list, bf); 1235 } 1236 mutex_exit(&txq->axq_lock); 1237 } 1238 } 1239 ic->ic_node_cleanup(in); 1240 if (in->in_wpa_ie != NULL) 1241 ieee80211_free(in->in_wpa_ie); 1242 kmem_free(in, sizeof (struct ath_node)); 1243 } 1244 1245 static void 1246 ath_next_scan(void *arg) 1247 { 1248 ieee80211com_t *ic = arg; 1249 ath_t *asc = (ath_t *)ic; 1250 1251 asc->asc_scan_timer = 0; 1252 if (ic->ic_state == IEEE80211_S_SCAN) { 1253 asc->asc_scan_timer = timeout(ath_next_scan, (void *)asc, 1254 drv_usectohz(ath_dwelltime * 1000)); 1255 ieee80211_next_scan(ic); 1256 } 1257 } 1258 1259 static void 1260 ath_stop_scantimer(ath_t *asc) 1261 { 1262 timeout_id_t tmp_id = 0; 1263 1264 while ((asc->asc_scan_timer != 0) && (tmp_id != asc->asc_scan_timer)) { 1265 tmp_id = asc->asc_scan_timer; 1266 (void) untimeout(tmp_id); 1267 } 1268 asc->asc_scan_timer = 0; 1269 } 1270 1271 static int32_t 1272 ath_newstate(ieee80211com_t *ic, enum ieee80211_state nstate, int arg) 1273 { 1274 ath_t *asc = (ath_t *)ic; 1275 struct ath_hal *ah = asc->asc_ah; 1276 struct ieee80211_node *in; 1277 int32_t i, error; 1278 uint8_t *bssid; 1279 uint32_t rfilt; 1280 enum ieee80211_state ostate; 1281 1282 static const HAL_LED_STATE leds[] = { 1283 HAL_LED_INIT, /* IEEE80211_S_INIT */ 1284 HAL_LED_SCAN, /* IEEE80211_S_SCAN */ 1285 HAL_LED_AUTH, /* IEEE80211_S_AUTH */ 1286 HAL_LED_ASSOC, /* IEEE80211_S_ASSOC */ 1287 HAL_LED_RUN, /* IEEE80211_S_RUN */ 1288 }; 1289 if (!ATH_IS_RUNNING(asc)) 1290 return (0); 1291 1292 ostate = ic->ic_state; 1293 if (nstate != IEEE80211_S_SCAN) 1294 ath_stop_scantimer(asc); 1295 1296 ATH_LOCK(asc); 1297 ATH_HAL_SETLEDSTATE(ah, leds[nstate]); /* set LED */ 1298 1299 if (nstate == IEEE80211_S_INIT) { 1300 asc->asc_imask &= ~(HAL_INT_SWBA | HAL_INT_BMISS); 1301 /* 1302 * Disable interrupts. 1303 */ 1304 ATH_HAL_INTRSET(ah, asc->asc_imask &~ HAL_INT_GLOBAL); 1305 ATH_UNLOCK(asc); 1306 goto done; 1307 } 1308 in = ic->ic_bss; 1309 error = ath_chan_set(asc, ic->ic_curchan); 1310 if (error != 0) { 1311 if (nstate != IEEE80211_S_SCAN) { 1312 ATH_UNLOCK(asc); 1313 ieee80211_reset_chan(ic); 1314 goto bad; 1315 } 1316 } 1317 1318 rfilt = ath_calcrxfilter(asc); 1319 1320 if (nstate == IEEE80211_S_SCAN) 1321 bssid = ic->ic_macaddr; 1322 else 1323 bssid = in->in_bssid; 1324 ATH_HAL_SETRXFILTER(ah, rfilt); 1325 1326 if (nstate == IEEE80211_S_RUN && ic->ic_opmode != IEEE80211_M_IBSS) 1327 ATH_HAL_SETASSOCID(ah, bssid, in->in_associd); 1328 else 1329 ATH_HAL_SETASSOCID(ah, bssid, 0); 1330 if (ic->ic_flags & IEEE80211_F_PRIVACY) { 1331 for (i = 0; i < IEEE80211_WEP_NKID; i++) { 1332 if (ATH_HAL_KEYISVALID(ah, i)) 1333 ATH_HAL_KEYSETMAC(ah, i, bssid); 1334 } 1335 } 1336 1337 if ((nstate == IEEE80211_S_RUN) && 1338 (ostate != IEEE80211_S_RUN)) { 1339 /* Configure the beacon and sleep timers. */ 1340 ath_beacon_config(asc); 1341 } else { 1342 asc->asc_imask &= ~(HAL_INT_SWBA | HAL_INT_BMISS); 1343 ATH_HAL_INTRSET(ah, asc->asc_imask); 1344 } 1345 /* 1346 * Reset the rate control state. 1347 */ 1348 ath_rate_ctl_reset(asc, nstate); 1349 1350 ATH_UNLOCK(asc); 1351 done: 1352 /* 1353 * Invoke the parent method to complete the work. 1354 */ 1355 error = asc->asc_newstate(ic, nstate, arg); 1356 /* 1357 * Finally, start any timers. 1358 */ 1359 if (nstate == IEEE80211_S_RUN) { 1360 ieee80211_start_watchdog(ic, 1); 1361 } else if ((nstate == IEEE80211_S_SCAN) && (ostate != nstate)) { 1362 /* start ap/neighbor scan timer */ 1363 ASSERT(asc->asc_scan_timer == 0); 1364 asc->asc_scan_timer = timeout(ath_next_scan, (void *)asc, 1365 drv_usectohz(ath_dwelltime * 1000)); 1366 } 1367 bad: 1368 return (error); 1369 } 1370 1371 /* 1372 * Periodically recalibrate the PHY to account 1373 * for temperature/environment changes. 1374 */ 1375 static void 1376 ath_calibrate(ath_t *asc) 1377 { 1378 struct ath_hal *ah = asc->asc_ah; 1379 HAL_BOOL iqcaldone; 1380 1381 asc->asc_stats.ast_per_cal++; 1382 1383 if (ATH_HAL_GETRFGAIN(ah) == HAL_RFGAIN_NEED_CHANGE) { 1384 /* 1385 * Rfgain is out of bounds, reset the chip 1386 * to load new gain values. 1387 */ 1388 ATH_DEBUG((ATH_DBG_HAL, "ath: ath_calibrate(): " 1389 "Need change RFgain\n")); 1390 asc->asc_stats.ast_per_rfgain++; 1391 (void) ath_reset(&asc->asc_isc); 1392 } 1393 if (!ATH_HAL_CALIBRATE(ah, &asc->asc_curchan, &iqcaldone)) { 1394 ATH_DEBUG((ATH_DBG_HAL, "ath: ath_calibrate(): " 1395 "calibration of channel %u failed\n", 1396 asc->asc_curchan.channel)); 1397 asc->asc_stats.ast_per_calfail++; 1398 } 1399 } 1400 1401 static void 1402 ath_watchdog(void *arg) 1403 { 1404 ath_t *asc = arg; 1405 ieee80211com_t *ic = &asc->asc_isc; 1406 int ntimer = 0; 1407 1408 ATH_LOCK(asc); 1409 ic->ic_watchdog_timer = 0; 1410 if (!ATH_IS_RUNNING(asc)) { 1411 ATH_UNLOCK(asc); 1412 return; 1413 } 1414 1415 if (ic->ic_state == IEEE80211_S_RUN) { 1416 /* periodic recalibration */ 1417 ath_calibrate(asc); 1418 1419 /* 1420 * Start the background rate control thread if we 1421 * are not configured to use a fixed xmit rate. 1422 */ 1423 if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) { 1424 asc->asc_stats.ast_rate_calls ++; 1425 if (ic->ic_opmode == IEEE80211_M_STA) 1426 ath_rate_ctl(ic, ic->ic_bss); 1427 else 1428 ieee80211_iterate_nodes(&ic->ic_sta, 1429 ath_rate_ctl, asc); 1430 } 1431 1432 ntimer = 1; 1433 } 1434 ATH_UNLOCK(asc); 1435 1436 ieee80211_watchdog(ic); 1437 if (ntimer != 0) 1438 ieee80211_start_watchdog(ic, ntimer); 1439 } 1440 1441 static void 1442 ath_tx_proc(void *arg) 1443 { 1444 ath_t *asc = arg; 1445 ath_tx_handler(asc); 1446 } 1447 1448 1449 static uint_t 1450 ath_intr(caddr_t arg) 1451 { 1452 /* LINTED E_BAD_PTR_CAST_ALIGN */ 1453 ath_t *asc = (ath_t *)arg; 1454 struct ath_hal *ah = asc->asc_ah; 1455 HAL_INT status; 1456 ieee80211com_t *ic = (ieee80211com_t *)asc; 1457 1458 ATH_LOCK(asc); 1459 1460 if (!ATH_IS_RUNNING(asc)) { 1461 /* 1462 * The hardware is not ready/present, don't touch anything. 1463 * Note this can happen early on if the IRQ is shared. 1464 */ 1465 ATH_UNLOCK(asc); 1466 return (DDI_INTR_UNCLAIMED); 1467 } 1468 1469 if (!ATH_HAL_INTRPEND(ah)) { /* shared irq, not for us */ 1470 ATH_UNLOCK(asc); 1471 return (DDI_INTR_UNCLAIMED); 1472 } 1473 1474 ATH_HAL_GETISR(ah, &status); 1475 status &= asc->asc_imask; 1476 if (status & HAL_INT_FATAL) { 1477 asc->asc_stats.ast_hardware++; 1478 goto reset; 1479 } else if (status & HAL_INT_RXORN) { 1480 asc->asc_stats.ast_rxorn++; 1481 goto reset; 1482 } else { 1483 if (status & HAL_INT_RXEOL) { 1484 asc->asc_stats.ast_rxeol++; 1485 asc->asc_rxlink = NULL; 1486 } 1487 if (status & HAL_INT_TXURN) { 1488 asc->asc_stats.ast_txurn++; 1489 ATH_HAL_UPDATETXTRIGLEVEL(ah, AH_TRUE); 1490 } 1491 1492 if (status & HAL_INT_RX) { 1493 asc->asc_rx_pend = 1; 1494 ddi_trigger_softintr(asc->asc_softint_id); 1495 } 1496 if (status & HAL_INT_TX) { 1497 if (ddi_taskq_dispatch(asc->asc_tq, ath_tx_proc, 1498 asc, DDI_NOSLEEP) != DDI_SUCCESS) { 1499 ath_problem("ath: ath_intr(): " 1500 "No memory available for tx taskq\n"); 1501 } 1502 } 1503 ATH_UNLOCK(asc); 1504 1505 if (status & HAL_INT_SWBA) { 1506 /* This will occur only in Host-AP or Ad-Hoc mode */ 1507 return (DDI_INTR_CLAIMED); 1508 } 1509 1510 if (status & HAL_INT_BMISS) { 1511 if (ic->ic_state == IEEE80211_S_RUN) { 1512 (void) ieee80211_new_state(ic, 1513 IEEE80211_S_ASSOC, -1); 1514 } 1515 } 1516 1517 } 1518 1519 return (DDI_INTR_CLAIMED); 1520 reset: 1521 (void) ath_reset(ic); 1522 ATH_UNLOCK(asc); 1523 return (DDI_INTR_CLAIMED); 1524 } 1525 1526 static uint_t 1527 ath_softint_handler(caddr_t data) 1528 { 1529 /* LINTED E_BAD_PTR_CAST_ALIGN */ 1530 ath_t *asc = (ath_t *)data; 1531 1532 /* 1533 * Check if the soft interrupt is triggered by another 1534 * driver at the same level. 1535 */ 1536 ATH_LOCK(asc); 1537 if (asc->asc_rx_pend) { /* Soft interrupt for this driver */ 1538 asc->asc_rx_pend = 0; 1539 ATH_UNLOCK(asc); 1540 ath_rx_handler(asc); 1541 return (DDI_INTR_CLAIMED); 1542 } 1543 ATH_UNLOCK(asc); 1544 return (DDI_INTR_UNCLAIMED); 1545 } 1546 1547 /* 1548 * following are gld callback routine 1549 * ath_gld_send, ath_gld_ioctl, ath_gld_gstat 1550 * are listed in other corresponding sections. 1551 * reset the hardware w/o losing operational state. this is 1552 * basically a more efficient way of doing ath_gld_stop, ath_gld_start, 1553 * followed by state transitions to the current 802.11 1554 * operational state. used to recover from errors rx overrun 1555 * and to reset the hardware when rf gain settings must be reset. 1556 */ 1557 1558 static void 1559 ath_stop_locked(ath_t *asc) 1560 { 1561 ieee80211com_t *ic = (ieee80211com_t *)asc; 1562 struct ath_hal *ah = asc->asc_ah; 1563 1564 ATH_LOCK_ASSERT(asc); 1565 if (!asc->asc_isrunning) 1566 return; 1567 1568 /* 1569 * Shutdown the hardware and driver: 1570 * reset 802.11 state machine 1571 * turn off timers 1572 * disable interrupts 1573 * turn off the radio 1574 * clear transmit machinery 1575 * clear receive machinery 1576 * drain and release tx queues 1577 * reclaim beacon resources 1578 * power down hardware 1579 * 1580 * Note that some of this work is not possible if the 1581 * hardware is gone (invalid). 1582 */ 1583 ATH_UNLOCK(asc); 1584 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 1585 ieee80211_stop_watchdog(ic); 1586 ATH_LOCK(asc); 1587 ATH_HAL_INTRSET(ah, 0); 1588 ath_draintxq(asc); 1589 if (!asc->asc_invalid) { 1590 ath_stoprecv(asc); 1591 ATH_HAL_PHYDISABLE(ah); 1592 } else { 1593 asc->asc_rxlink = NULL; 1594 } 1595 asc->asc_isrunning = 0; 1596 } 1597 1598 static void 1599 ath_m_stop(void *arg) 1600 { 1601 ath_t *asc = arg; 1602 struct ath_hal *ah = asc->asc_ah; 1603 1604 ATH_LOCK(asc); 1605 ath_stop_locked(asc); 1606 ATH_HAL_SETPOWER(ah, HAL_PM_AWAKE); 1607 asc->asc_invalid = 1; 1608 ATH_UNLOCK(asc); 1609 } 1610 1611 static int 1612 ath_start_locked(ath_t *asc) 1613 { 1614 ieee80211com_t *ic = (ieee80211com_t *)asc; 1615 struct ath_hal *ah = asc->asc_ah; 1616 HAL_STATUS status; 1617 1618 ATH_LOCK_ASSERT(asc); 1619 1620 /* 1621 * The basic interface to setting the hardware in a good 1622 * state is ``reset''. On return the hardware is known to 1623 * be powered up and with interrupts disabled. This must 1624 * be followed by initialization of the appropriate bits 1625 * and then setup of the interrupt mask. 1626 */ 1627 asc->asc_curchan.channel = ic->ic_curchan->ich_freq; 1628 asc->asc_curchan.channelFlags = ath_chan2flags(ic, ic->ic_curchan); 1629 if (!ATH_HAL_RESET(ah, (HAL_OPMODE)ic->ic_opmode, 1630 &asc->asc_curchan, AH_FALSE, &status)) { 1631 ATH_DEBUG((ATH_DBG_HAL, "ath: ath_m_start(): " 1632 "reset hardware failed: '%s' (HAL status %u)\n", 1633 ath_get_hal_status_desc(status), status)); 1634 return (ENOTACTIVE); 1635 } 1636 1637 (void) ath_startrecv(asc); 1638 1639 /* 1640 * Enable interrupts. 1641 */ 1642 asc->asc_imask = HAL_INT_RX | HAL_INT_TX 1643 | HAL_INT_RXEOL | HAL_INT_RXORN 1644 | HAL_INT_FATAL | HAL_INT_GLOBAL; 1645 ATH_HAL_INTRSET(ah, asc->asc_imask); 1646 1647 /* 1648 * The hardware should be ready to go now so it's safe 1649 * to kick the 802.11 state machine as it's likely to 1650 * immediately call back to us to send mgmt frames. 1651 */ 1652 ath_chan_change(asc, ic->ic_curchan); 1653 1654 asc->asc_isrunning = 1; 1655 1656 return (0); 1657 } 1658 1659 int 1660 ath_m_start(void *arg) 1661 { 1662 ath_t *asc = arg; 1663 int err; 1664 1665 ATH_LOCK(asc); 1666 /* 1667 * Stop anything previously setup. This is safe 1668 * whether this is the first time through or not. 1669 */ 1670 ath_stop_locked(asc); 1671 1672 if ((err = ath_start_locked(asc)) != 0) { 1673 ATH_UNLOCK(asc); 1674 return (err); 1675 } 1676 1677 asc->asc_invalid = 0; 1678 ATH_UNLOCK(asc); 1679 1680 return (0); 1681 } 1682 1683 1684 static int 1685 ath_m_unicst(void *arg, const uint8_t *macaddr) 1686 { 1687 ath_t *asc = arg; 1688 struct ath_hal *ah = asc->asc_ah; 1689 1690 ATH_DEBUG((ATH_DBG_GLD, "ath: ath_gld_saddr(): " 1691 "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", 1692 macaddr[0], macaddr[1], macaddr[2], 1693 macaddr[3], macaddr[4], macaddr[5])); 1694 1695 ATH_LOCK(asc); 1696 IEEE80211_ADDR_COPY(asc->asc_isc.ic_macaddr, macaddr); 1697 ATH_HAL_SETMAC(ah, asc->asc_isc.ic_macaddr); 1698 1699 (void) ath_reset(&asc->asc_isc); 1700 ATH_UNLOCK(asc); 1701 return (0); 1702 } 1703 1704 static int 1705 ath_m_promisc(void *arg, boolean_t on) 1706 { 1707 ath_t *asc = arg; 1708 struct ath_hal *ah = asc->asc_ah; 1709 uint32_t rfilt; 1710 1711 ATH_LOCK(asc); 1712 rfilt = ATH_HAL_GETRXFILTER(ah); 1713 if (on) 1714 rfilt |= HAL_RX_FILTER_PROM; 1715 else 1716 rfilt &= ~HAL_RX_FILTER_PROM; 1717 asc->asc_promisc = on; 1718 ATH_HAL_SETRXFILTER(ah, rfilt); 1719 ATH_UNLOCK(asc); 1720 1721 return (0); 1722 } 1723 1724 static int 1725 ath_m_multicst(void *arg, boolean_t add, const uint8_t *mca) 1726 { 1727 ath_t *asc = arg; 1728 struct ath_hal *ah = asc->asc_ah; 1729 uint32_t val, index, bit; 1730 uint8_t pos; 1731 uint32_t *mfilt = asc->asc_mcast_hash; 1732 1733 ATH_LOCK(asc); 1734 1735 /* calculate XOR of eight 6bit values */ 1736 val = ATH_LE_READ_4(mca + 0); 1737 pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val; 1738 val = ATH_LE_READ_4(mca + 3); 1739 pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val; 1740 pos &= 0x3f; 1741 index = pos / 32; 1742 bit = 1 << (pos % 32); 1743 1744 if (add) { /* enable multicast */ 1745 asc->asc_mcast_refs[pos]++; 1746 mfilt[index] |= bit; 1747 } else { /* disable multicast */ 1748 if (--asc->asc_mcast_refs[pos] == 0) 1749 mfilt[index] &= ~bit; 1750 } 1751 ATH_HAL_SETMCASTFILTER(ah, mfilt[0], mfilt[1]); 1752 1753 ATH_UNLOCK(asc); 1754 return (0); 1755 } 1756 /* 1757 * callback functions for /get/set properties 1758 */ 1759 static int 1760 ath_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 1761 uint_t wldp_length, const void *wldp_buf) 1762 { 1763 ath_t *asc = arg; 1764 int err; 1765 1766 err = ieee80211_setprop(&asc->asc_isc, pr_name, wldp_pr_num, 1767 wldp_length, wldp_buf); 1768 1769 ATH_LOCK(asc); 1770 1771 if (err == ENETRESET) { 1772 if (ATH_IS_RUNNING(asc)) { 1773 ATH_UNLOCK(asc); 1774 (void) ath_m_start(asc); 1775 (void) ieee80211_new_state(&asc->asc_isc, 1776 IEEE80211_S_SCAN, -1); 1777 ATH_LOCK(asc); 1778 } 1779 err = 0; 1780 } 1781 1782 ATH_UNLOCK(asc); 1783 1784 return (err); 1785 } 1786 1787 static int 1788 ath_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 1789 uint_t wldp_length, void *wldp_buf) 1790 { 1791 ath_t *asc = arg; 1792 int err = 0; 1793 1794 err = ieee80211_getprop(&asc->asc_isc, pr_name, wldp_pr_num, 1795 wldp_length, wldp_buf); 1796 1797 return (err); 1798 } 1799 1800 static void 1801 ath_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num, 1802 mac_prop_info_handle_t mph) 1803 { 1804 ath_t *asc = arg; 1805 1806 ieee80211_propinfo(&asc->asc_isc, pr_name, wldp_pr_num, mph); 1807 } 1808 1809 static void 1810 ath_m_ioctl(void *arg, queue_t *wq, mblk_t *mp) 1811 { 1812 ath_t *asc = arg; 1813 int32_t err; 1814 1815 err = ieee80211_ioctl(&asc->asc_isc, wq, mp); 1816 ATH_LOCK(asc); 1817 if (err == ENETRESET) { 1818 if (ATH_IS_RUNNING(asc)) { 1819 ATH_UNLOCK(asc); 1820 (void) ath_m_start(asc); 1821 (void) ieee80211_new_state(&asc->asc_isc, 1822 IEEE80211_S_SCAN, -1); 1823 ATH_LOCK(asc); 1824 } 1825 } 1826 ATH_UNLOCK(asc); 1827 } 1828 1829 static int 1830 ath_m_stat(void *arg, uint_t stat, uint64_t *val) 1831 { 1832 ath_t *asc = arg; 1833 ieee80211com_t *ic = (ieee80211com_t *)asc; 1834 struct ieee80211_node *in = ic->ic_bss; 1835 struct ieee80211_rateset *rs = &in->in_rates; 1836 1837 ATH_LOCK(asc); 1838 switch (stat) { 1839 case MAC_STAT_IFSPEED: 1840 *val = (rs->ir_rates[in->in_txrate] & IEEE80211_RATE_VAL) / 2 * 1841 1000000ull; 1842 break; 1843 case MAC_STAT_NOXMTBUF: 1844 *val = asc->asc_stats.ast_tx_nobuf + 1845 asc->asc_stats.ast_tx_nobufmgt; 1846 break; 1847 case MAC_STAT_IERRORS: 1848 *val = asc->asc_stats.ast_rx_tooshort; 1849 break; 1850 case MAC_STAT_RBYTES: 1851 *val = ic->ic_stats.is_rx_bytes; 1852 break; 1853 case MAC_STAT_IPACKETS: 1854 *val = ic->ic_stats.is_rx_frags; 1855 break; 1856 case MAC_STAT_OBYTES: 1857 *val = ic->ic_stats.is_tx_bytes; 1858 break; 1859 case MAC_STAT_OPACKETS: 1860 *val = ic->ic_stats.is_tx_frags; 1861 break; 1862 case MAC_STAT_OERRORS: 1863 case WIFI_STAT_TX_FAILED: 1864 *val = asc->asc_stats.ast_tx_fifoerr + 1865 asc->asc_stats.ast_tx_xretries + 1866 asc->asc_stats.ast_tx_discard; 1867 break; 1868 case WIFI_STAT_TX_RETRANS: 1869 *val = asc->asc_stats.ast_tx_xretries; 1870 break; 1871 case WIFI_STAT_FCS_ERRORS: 1872 *val = asc->asc_stats.ast_rx_crcerr; 1873 break; 1874 case WIFI_STAT_WEP_ERRORS: 1875 *val = asc->asc_stats.ast_rx_badcrypt; 1876 break; 1877 case WIFI_STAT_TX_FRAGS: 1878 case WIFI_STAT_MCAST_TX: 1879 case WIFI_STAT_RTS_SUCCESS: 1880 case WIFI_STAT_RTS_FAILURE: 1881 case WIFI_STAT_ACK_FAILURE: 1882 case WIFI_STAT_RX_FRAGS: 1883 case WIFI_STAT_MCAST_RX: 1884 case WIFI_STAT_RX_DUPS: 1885 ATH_UNLOCK(asc); 1886 return (ieee80211_stat(ic, stat, val)); 1887 default: 1888 ATH_UNLOCK(asc); 1889 return (ENOTSUP); 1890 } 1891 ATH_UNLOCK(asc); 1892 1893 return (0); 1894 } 1895 1896 static int 1897 ath_pci_setup(ath_t *asc) 1898 { 1899 uint16_t command; 1900 1901 /* 1902 * Enable memory mapping and bus mastering 1903 */ 1904 ASSERT(asc != NULL); 1905 command = pci_config_get16(asc->asc_cfg_handle, PCI_CONF_COMM); 1906 command |= PCI_COMM_MAE | PCI_COMM_ME; 1907 pci_config_put16(asc->asc_cfg_handle, PCI_CONF_COMM, command); 1908 command = pci_config_get16(asc->asc_cfg_handle, PCI_CONF_COMM); 1909 if ((command & PCI_COMM_MAE) == 0) { 1910 ath_problem("ath: ath_pci_setup(): " 1911 "failed to enable memory mapping\n"); 1912 return (EIO); 1913 } 1914 if ((command & PCI_COMM_ME) == 0) { 1915 ath_problem("ath: ath_pci_setup(): " 1916 "failed to enable bus mastering\n"); 1917 return (EIO); 1918 } 1919 ATH_DEBUG((ATH_DBG_INIT, "ath: ath_pci_setup(): " 1920 "set command reg to 0x%x \n", command)); 1921 1922 return (0); 1923 } 1924 1925 static int 1926 ath_resume(dev_info_t *devinfo) 1927 { 1928 ath_t *asc; 1929 int ret = DDI_SUCCESS; 1930 1931 asc = ddi_get_soft_state(ath_soft_state_p, ddi_get_instance(devinfo)); 1932 if (asc == NULL) { 1933 ATH_DEBUG((ATH_DBG_SUSPEND, "ath: ath_resume(): " 1934 "failed to get soft state\n")); 1935 return (DDI_FAILURE); 1936 } 1937 1938 ATH_LOCK(asc); 1939 /* 1940 * Set up config space command register(s). Refuse 1941 * to resume on failure. 1942 */ 1943 if (ath_pci_setup(asc) != 0) { 1944 ATH_DEBUG((ATH_DBG_SUSPEND, "ath: ath_resume(): " 1945 "ath_pci_setup() failed\n")); 1946 ATH_UNLOCK(asc); 1947 return (DDI_FAILURE); 1948 } 1949 1950 if (!asc->asc_invalid) 1951 ret = ath_start_locked(asc); 1952 ATH_UNLOCK(asc); 1953 1954 return (ret); 1955 } 1956 1957 static int 1958 ath_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd) 1959 { 1960 ath_t *asc; 1961 ieee80211com_t *ic; 1962 struct ath_hal *ah; 1963 uint8_t csz; 1964 HAL_STATUS status; 1965 caddr_t regs; 1966 uint32_t i, val; 1967 uint16_t vendor_id, device_id; 1968 const char *athname; 1969 int32_t ath_countrycode = CTRY_DEFAULT; /* country code */ 1970 int32_t err, ath_regdomain = 0; /* regulatory domain */ 1971 char strbuf[32]; 1972 int instance; 1973 wifi_data_t wd = { 0 }; 1974 mac_register_t *macp; 1975 1976 switch (cmd) { 1977 case DDI_ATTACH: 1978 break; 1979 1980 case DDI_RESUME: 1981 return (ath_resume(devinfo)); 1982 1983 default: 1984 return (DDI_FAILURE); 1985 } 1986 1987 instance = ddi_get_instance(devinfo); 1988 if (ddi_soft_state_zalloc(ath_soft_state_p, instance) != DDI_SUCCESS) { 1989 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 1990 "Unable to alloc softstate\n")); 1991 return (DDI_FAILURE); 1992 } 1993 1994 asc = ddi_get_soft_state(ath_soft_state_p, ddi_get_instance(devinfo)); 1995 ic = (ieee80211com_t *)asc; 1996 asc->asc_dev = devinfo; 1997 1998 mutex_init(&asc->asc_genlock, NULL, MUTEX_DRIVER, NULL); 1999 mutex_init(&asc->asc_txbuflock, NULL, MUTEX_DRIVER, NULL); 2000 mutex_init(&asc->asc_rxbuflock, NULL, MUTEX_DRIVER, NULL); 2001 mutex_init(&asc->asc_resched_lock, NULL, MUTEX_DRIVER, NULL); 2002 2003 err = pci_config_setup(devinfo, &asc->asc_cfg_handle); 2004 if (err != DDI_SUCCESS) { 2005 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2006 "pci_config_setup() failed")); 2007 goto attach_fail0; 2008 } 2009 2010 if (ath_pci_setup(asc) != 0) 2011 goto attach_fail1; 2012 2013 /* 2014 * Cache line size is used to size and align various 2015 * structures used to communicate with the hardware. 2016 */ 2017 csz = pci_config_get8(asc->asc_cfg_handle, PCI_CONF_CACHE_LINESZ); 2018 if (csz == 0) { 2019 /* 2020 * We must have this setup properly for rx buffer 2021 * DMA to work so force a reasonable value here if it 2022 * comes up zero. 2023 */ 2024 csz = ATH_DEF_CACHE_BYTES / sizeof (uint32_t); 2025 pci_config_put8(asc->asc_cfg_handle, PCI_CONF_CACHE_LINESZ, 2026 csz); 2027 } 2028 asc->asc_cachelsz = csz << 2; 2029 vendor_id = pci_config_get16(asc->asc_cfg_handle, PCI_CONF_VENID); 2030 device_id = pci_config_get16(asc->asc_cfg_handle, PCI_CONF_DEVID); 2031 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): vendor 0x%x, " 2032 "device id 0x%x, cache size %d\n", vendor_id, device_id, csz)); 2033 2034 athname = ath_hal_probe(vendor_id, device_id); 2035 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): athname: %s\n", 2036 athname ? athname : "Atheros ???")); 2037 2038 pci_config_put8(asc->asc_cfg_handle, PCI_CONF_LATENCY_TIMER, 0xa8); 2039 val = pci_config_get32(asc->asc_cfg_handle, 0x40); 2040 if ((val & 0x0000ff00) != 0) 2041 pci_config_put32(asc->asc_cfg_handle, 0x40, val & 0xffff00ff); 2042 2043 err = ddi_regs_map_setup(devinfo, 1, 2044 ®s, 0, 0, &ath_reg_accattr, &asc->asc_io_handle); 2045 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2046 "regs map1 = %x err=%d\n", regs, err)); 2047 if (err != DDI_SUCCESS) { 2048 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2049 "ddi_regs_map_setup() failed")); 2050 goto attach_fail1; 2051 } 2052 2053 ah = ath_hal_attach(device_id, asc, 0, regs, &status); 2054 if (ah == NULL) { 2055 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2056 "unable to attach hw: '%s' (HAL status %u)\n", 2057 ath_get_hal_status_desc(status), status)); 2058 goto attach_fail2; 2059 } 2060 ATH_DEBUG((ATH_DBG_ATTACH, "mac %d.%d phy %d.%d", 2061 ah->ah_macVersion, ah->ah_macRev, 2062 ah->ah_phyRev >> 4, ah->ah_phyRev & 0xf)); 2063 ATH_HAL_INTRSET(ah, 0); 2064 asc->asc_ah = ah; 2065 2066 if (ah->ah_abi != HAL_ABI_VERSION) { 2067 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2068 "HAL ABI mismatch detected (0x%x != 0x%x)\n", 2069 ah->ah_abi, HAL_ABI_VERSION)); 2070 goto attach_fail3; 2071 } 2072 2073 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2074 "HAL ABI version 0x%x\n", ah->ah_abi)); 2075 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2076 "HAL mac version %d.%d, phy version %d.%d\n", 2077 ah->ah_macVersion, ah->ah_macRev, 2078 ah->ah_phyRev >> 4, ah->ah_phyRev & 0xf)); 2079 if (ah->ah_analog5GhzRev) 2080 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2081 "HAL 5ghz radio version %d.%d\n", 2082 ah->ah_analog5GhzRev >> 4, 2083 ah->ah_analog5GhzRev & 0xf)); 2084 if (ah->ah_analog2GhzRev) 2085 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2086 "HAL 2ghz radio version %d.%d\n", 2087 ah->ah_analog2GhzRev >> 4, 2088 ah->ah_analog2GhzRev & 0xf)); 2089 2090 /* 2091 * Check if the MAC has multi-rate retry support. 2092 * We do this by trying to setup a fake extended 2093 * descriptor. MAC's that don't have support will 2094 * return false w/o doing anything. MAC's that do 2095 * support it will return true w/o doing anything. 2096 */ 2097 asc->asc_mrretry = ATH_HAL_SETUPXTXDESC(ah, NULL, 0, 0, 0, 0, 0, 0); 2098 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2099 "multi rate retry support=%x\n", 2100 asc->asc_mrretry)); 2101 2102 /* 2103 * Get the hardware key cache size. 2104 */ 2105 asc->asc_keymax = ATH_HAL_KEYCACHESIZE(ah); 2106 if (asc->asc_keymax > sizeof (asc->asc_keymap) * NBBY) { 2107 ATH_DEBUG((ATH_DBG_ATTACH, "ath_attach:" 2108 " Warning, using only %u entries in %u key cache\n", 2109 sizeof (asc->asc_keymap) * NBBY, asc->asc_keymax)); 2110 asc->asc_keymax = sizeof (asc->asc_keymap) * NBBY; 2111 } 2112 /* 2113 * Reset the key cache since some parts do not 2114 * reset the contents on initial power up. 2115 */ 2116 for (i = 0; i < asc->asc_keymax; i++) 2117 ATH_HAL_KEYRESET(ah, i); 2118 2119 ATH_HAL_GETREGDOMAIN(ah, (uint32_t *)&ath_regdomain); 2120 ATH_HAL_GETCOUNTRYCODE(ah, &ath_countrycode); 2121 /* 2122 * Collect the channel list using the default country 2123 * code and including outdoor channels. The 802.11 layer 2124 * is resposible for filtering this list to a set of 2125 * channels that it considers ok to use. 2126 */ 2127 asc->asc_have11g = 0; 2128 2129 /* enable outdoor use, enable extended channels */ 2130 err = ath_getchannels(asc, ath_countrycode, AH_FALSE, AH_TRUE); 2131 if (err != 0) 2132 goto attach_fail3; 2133 2134 /* 2135 * Setup rate tables for all potential media types. 2136 */ 2137 ath_rate_setup(asc, IEEE80211_MODE_11A); 2138 ath_rate_setup(asc, IEEE80211_MODE_11B); 2139 ath_rate_setup(asc, IEEE80211_MODE_11G); 2140 ath_rate_setup(asc, IEEE80211_MODE_TURBO_A); 2141 2142 /* Setup here so ath_rate_update is happy */ 2143 ath_setcurmode(asc, IEEE80211_MODE_11A); 2144 2145 err = ath_desc_alloc(devinfo, asc); 2146 if (err != DDI_SUCCESS) { 2147 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2148 "failed to allocate descriptors: %d\n", err)); 2149 goto attach_fail3; 2150 } 2151 2152 if ((asc->asc_tq = ddi_taskq_create(devinfo, "ath_taskq", 1, 2153 TASKQ_DEFAULTPRI, 0)) == NULL) { 2154 goto attach_fail4; 2155 } 2156 /* Setup transmit queues in the HAL */ 2157 if (ath_txq_setup(asc)) 2158 goto attach_fail4; 2159 2160 ATH_HAL_GETMAC(ah, ic->ic_macaddr); 2161 2162 /* 2163 * Initialize pointers to device specific functions which 2164 * will be used by the generic layer. 2165 */ 2166 /* 11g support is identified when we fetch the channel set */ 2167 if (asc->asc_have11g) 2168 ic->ic_caps |= IEEE80211_C_SHPREAMBLE | 2169 IEEE80211_C_SHSLOT; /* short slot time */ 2170 /* 2171 * Query the hal to figure out h/w crypto support. 2172 */ 2173 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_WEP)) 2174 ic->ic_caps |= IEEE80211_C_WEP; 2175 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_AES_OCB)) 2176 ic->ic_caps |= IEEE80211_C_AES; 2177 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_AES_CCM)) { 2178 ATH_DEBUG((ATH_DBG_ATTACH, "Atheros support H/W CCMP\n")); 2179 ic->ic_caps |= IEEE80211_C_AES_CCM; 2180 } 2181 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_CKIP)) 2182 ic->ic_caps |= IEEE80211_C_CKIP; 2183 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_TKIP)) { 2184 ATH_DEBUG((ATH_DBG_ATTACH, "Atheros support H/W TKIP\n")); 2185 ic->ic_caps |= IEEE80211_C_TKIP; 2186 /* 2187 * Check if h/w does the MIC and/or whether the 2188 * separate key cache entries are required to 2189 * handle both tx+rx MIC keys. 2190 */ 2191 if (ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_MIC)) { 2192 ATH_DEBUG((ATH_DBG_ATTACH, "Support H/W TKIP MIC\n")); 2193 ic->ic_caps |= IEEE80211_C_TKIPMIC; 2194 } 2195 2196 /* 2197 * If the h/w supports storing tx+rx MIC keys 2198 * in one cache slot automatically enable use. 2199 */ 2200 if (ATH_HAL_HASTKIPSPLIT(ah) || 2201 !ATH_HAL_SETTKIPSPLIT(ah, AH_FALSE)) { 2202 asc->asc_splitmic = 1; 2203 } 2204 } 2205 ic->ic_caps |= IEEE80211_C_WPA; /* Support WPA/WPA2 */ 2206 2207 asc->asc_hasclrkey = ATH_HAL_CIPHERSUPPORTED(ah, HAL_CIPHER_CLR); 2208 /* 2209 * Mark key cache slots associated with global keys 2210 * as in use. If we knew TKIP was not to be used we 2211 * could leave the +32, +64, and +32+64 slots free. 2212 */ 2213 for (i = 0; i < IEEE80211_WEP_NKID; i++) { 2214 setbit(asc->asc_keymap, i); 2215 setbit(asc->asc_keymap, i+64); 2216 if (asc->asc_splitmic) { 2217 setbit(asc->asc_keymap, i+32); 2218 setbit(asc->asc_keymap, i+32+64); 2219 } 2220 } 2221 2222 ic->ic_phytype = IEEE80211_T_OFDM; 2223 ic->ic_opmode = IEEE80211_M_STA; 2224 ic->ic_state = IEEE80211_S_INIT; 2225 ic->ic_maxrssi = ATH_MAX_RSSI; 2226 ic->ic_set_shortslot = ath_set_shortslot; 2227 ic->ic_xmit = ath_xmit; 2228 ieee80211_attach(ic); 2229 2230 /* different instance has different WPA door */ 2231 (void) snprintf(ic->ic_wpadoor, MAX_IEEE80211STR, "%s_%s%d", WPA_DOOR, 2232 ddi_driver_name(devinfo), 2233 ddi_get_instance(devinfo)); 2234 2235 /* Override 80211 default routines */ 2236 ic->ic_reset = ath_reset; 2237 asc->asc_newstate = ic->ic_newstate; 2238 ic->ic_newstate = ath_newstate; 2239 ic->ic_watchdog = ath_watchdog; 2240 ic->ic_node_alloc = ath_node_alloc; 2241 ic->ic_node_free = ath_node_free; 2242 ic->ic_crypto.cs_key_alloc = ath_key_alloc; 2243 ic->ic_crypto.cs_key_delete = ath_key_delete; 2244 ic->ic_crypto.cs_key_set = ath_key_set; 2245 ieee80211_media_init(ic); 2246 /* 2247 * initialize default tx key 2248 */ 2249 ic->ic_def_txkey = 0; 2250 2251 asc->asc_rx_pend = 0; 2252 ATH_HAL_INTRSET(ah, 0); 2253 err = ddi_add_softintr(devinfo, DDI_SOFTINT_LOW, 2254 &asc->asc_softint_id, NULL, 0, ath_softint_handler, (caddr_t)asc); 2255 if (err != DDI_SUCCESS) { 2256 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2257 "ddi_add_softintr() failed\n")); 2258 goto attach_fail5; 2259 } 2260 2261 if (ddi_get_iblock_cookie(devinfo, 0, &asc->asc_iblock) 2262 != DDI_SUCCESS) { 2263 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2264 "Can not get iblock cookie for INT\n")); 2265 goto attach_fail6; 2266 } 2267 2268 if (ddi_add_intr(devinfo, 0, NULL, NULL, ath_intr, 2269 (caddr_t)asc) != DDI_SUCCESS) { 2270 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2271 "Can not set intr for ATH driver\n")); 2272 goto attach_fail6; 2273 } 2274 2275 /* 2276 * Provide initial settings for the WiFi plugin; whenever this 2277 * information changes, we need to call mac_plugindata_update() 2278 */ 2279 wd.wd_opmode = ic->ic_opmode; 2280 wd.wd_secalloc = WIFI_SEC_NONE; 2281 IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid); 2282 2283 if ((macp = mac_alloc(MAC_VERSION)) == NULL) { 2284 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2285 "MAC version mismatch\n")); 2286 goto attach_fail7; 2287 } 2288 2289 macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI; 2290 macp->m_driver = asc; 2291 macp->m_dip = devinfo; 2292 macp->m_src_addr = ic->ic_macaddr; 2293 macp->m_callbacks = &ath_m_callbacks; 2294 macp->m_min_sdu = 0; 2295 macp->m_max_sdu = IEEE80211_MTU; 2296 macp->m_pdata = &wd; 2297 macp->m_pdata_size = sizeof (wd); 2298 2299 err = mac_register(macp, &ic->ic_mach); 2300 mac_free(macp); 2301 if (err != 0) { 2302 ATH_DEBUG((ATH_DBG_ATTACH, "ath: ath_attach(): " 2303 "mac_register err %x\n", err)); 2304 goto attach_fail7; 2305 } 2306 2307 /* Create minor node of type DDI_NT_NET_WIFI */ 2308 (void) snprintf(strbuf, sizeof (strbuf), "%s%d", 2309 ATH_NODENAME, instance); 2310 err = ddi_create_minor_node(devinfo, strbuf, S_IFCHR, 2311 instance + 1, DDI_NT_NET_WIFI, 0); 2312 if (err != DDI_SUCCESS) 2313 ATH_DEBUG((ATH_DBG_ATTACH, "WARN: ath: ath_attach(): " 2314 "Create minor node failed - %d\n", err)); 2315 2316 mac_link_update(ic->ic_mach, LINK_STATE_DOWN); 2317 asc->asc_invalid = 1; 2318 asc->asc_isrunning = 0; 2319 asc->asc_promisc = B_FALSE; 2320 bzero(asc->asc_mcast_refs, sizeof (asc->asc_mcast_refs)); 2321 bzero(asc->asc_mcast_hash, sizeof (asc->asc_mcast_hash)); 2322 return (DDI_SUCCESS); 2323 attach_fail7: 2324 ddi_remove_intr(devinfo, 0, asc->asc_iblock); 2325 attach_fail6: 2326 ddi_remove_softintr(asc->asc_softint_id); 2327 attach_fail5: 2328 (void) ieee80211_detach(ic); 2329 attach_fail4: 2330 ath_desc_free(asc); 2331 if (asc->asc_tq) 2332 ddi_taskq_destroy(asc->asc_tq); 2333 attach_fail3: 2334 ah->ah_detach(asc->asc_ah); 2335 attach_fail2: 2336 ddi_regs_map_free(&asc->asc_io_handle); 2337 attach_fail1: 2338 pci_config_teardown(&asc->asc_cfg_handle); 2339 attach_fail0: 2340 asc->asc_invalid = 1; 2341 mutex_destroy(&asc->asc_txbuflock); 2342 for (i = 0; i < HAL_NUM_TX_QUEUES; i++) { 2343 if (ATH_TXQ_SETUP(asc, i)) { 2344 struct ath_txq *txq = &asc->asc_txq[i]; 2345 mutex_destroy(&txq->axq_lock); 2346 } 2347 } 2348 mutex_destroy(&asc->asc_rxbuflock); 2349 mutex_destroy(&asc->asc_genlock); 2350 mutex_destroy(&asc->asc_resched_lock); 2351 ddi_soft_state_free(ath_soft_state_p, instance); 2352 2353 return (DDI_FAILURE); 2354 } 2355 2356 /* 2357 * Suspend transmit/receive for powerdown 2358 */ 2359 static int 2360 ath_suspend(ath_t *asc) 2361 { 2362 ATH_LOCK(asc); 2363 ath_stop_locked(asc); 2364 ATH_UNLOCK(asc); 2365 ATH_DEBUG((ATH_DBG_SUSPEND, "ath: suspended.\n")); 2366 2367 return (DDI_SUCCESS); 2368 } 2369 2370 static int32_t 2371 ath_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd) 2372 { 2373 ath_t *asc; 2374 2375 asc = ddi_get_soft_state(ath_soft_state_p, ddi_get_instance(devinfo)); 2376 ASSERT(asc != NULL); 2377 2378 switch (cmd) { 2379 case DDI_DETACH: 2380 break; 2381 2382 case DDI_SUSPEND: 2383 return (ath_suspend(asc)); 2384 2385 default: 2386 return (DDI_FAILURE); 2387 } 2388 2389 if (mac_disable(asc->asc_isc.ic_mach) != 0) 2390 return (DDI_FAILURE); 2391 2392 ath_stop_scantimer(asc); 2393 2394 /* disable interrupts */ 2395 ATH_HAL_INTRSET(asc->asc_ah, 0); 2396 2397 /* 2398 * Unregister from the MAC layer subsystem 2399 */ 2400 (void) mac_unregister(asc->asc_isc.ic_mach); 2401 2402 /* free intterrupt resources */ 2403 ddi_remove_intr(devinfo, 0, asc->asc_iblock); 2404 ddi_remove_softintr(asc->asc_softint_id); 2405 2406 /* 2407 * NB: the order of these is important: 2408 * o call the 802.11 layer before detaching the hal to 2409 * insure callbacks into the driver to delete global 2410 * key cache entries can be handled 2411 * o reclaim the tx queue data structures after calling 2412 * the 802.11 layer as we'll get called back to reclaim 2413 * node state and potentially want to use them 2414 * o to cleanup the tx queues the hal is called, so detach 2415 * it last 2416 */ 2417 ieee80211_detach(&asc->asc_isc); 2418 ath_desc_free(asc); 2419 ddi_taskq_destroy(asc->asc_tq); 2420 ath_txq_cleanup(asc); 2421 asc->asc_ah->ah_detach(asc->asc_ah); 2422 2423 /* free io handle */ 2424 ddi_regs_map_free(&asc->asc_io_handle); 2425 pci_config_teardown(&asc->asc_cfg_handle); 2426 2427 /* destroy locks */ 2428 mutex_destroy(&asc->asc_rxbuflock); 2429 mutex_destroy(&asc->asc_genlock); 2430 mutex_destroy(&asc->asc_resched_lock); 2431 2432 ddi_remove_minor_node(devinfo, NULL); 2433 ddi_soft_state_free(ath_soft_state_p, ddi_get_instance(devinfo)); 2434 2435 return (DDI_SUCCESS); 2436 } 2437 2438 /* 2439 * quiesce(9E) entry point. 2440 * 2441 * This function is called when the system is single-threaded at high 2442 * PIL with preemption disabled. Therefore, this function must not be 2443 * blocked. 2444 * 2445 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. 2446 * DDI_FAILURE indicates an error condition and should almost never happen. 2447 */ 2448 static int32_t 2449 ath_quiesce(dev_info_t *devinfo) 2450 { 2451 ath_t *asc; 2452 struct ath_hal *ah; 2453 int i; 2454 2455 asc = ddi_get_soft_state(ath_soft_state_p, ddi_get_instance(devinfo)); 2456 2457 if (asc == NULL || (ah = asc->asc_ah) == NULL) 2458 return (DDI_FAILURE); 2459 2460 /* 2461 * Disable interrupts 2462 */ 2463 ATH_HAL_INTRSET(ah, 0); 2464 2465 /* 2466 * Disable TX HW 2467 */ 2468 for (i = 0; i < HAL_NUM_TX_QUEUES; i++) { 2469 if (ATH_TXQ_SETUP(asc, i)) { 2470 ATH_HAL_STOPTXDMA(ah, asc->asc_txq[i].axq_qnum); 2471 } 2472 } 2473 2474 /* 2475 * Disable RX HW 2476 */ 2477 ATH_HAL_STOPPCURECV(ah); 2478 ATH_HAL_SETRXFILTER(ah, 0); 2479 ATH_HAL_STOPDMARECV(ah); 2480 drv_usecwait(3000); 2481 2482 /* 2483 * Power down HW 2484 */ 2485 ATH_HAL_PHYDISABLE(ah); 2486 2487 return (DDI_SUCCESS); 2488 } 2489 2490 DDI_DEFINE_STREAM_OPS(ath_dev_ops, nulldev, nulldev, ath_attach, ath_detach, 2491 nodev, NULL, D_MP, NULL, ath_quiesce); 2492 2493 static struct modldrv ath_modldrv = { 2494 &mod_driverops, /* Type of module. This one is a driver */ 2495 "ath driver 1.4/HAL 0.10.5.6", /* short description */ 2496 &ath_dev_ops /* driver specific ops */ 2497 }; 2498 2499 static struct modlinkage modlinkage = { 2500 MODREV_1, (void *)&ath_modldrv, NULL 2501 }; 2502 2503 2504 int 2505 _info(struct modinfo *modinfop) 2506 { 2507 return (mod_info(&modlinkage, modinfop)); 2508 } 2509 2510 int 2511 _init(void) 2512 { 2513 int status; 2514 2515 status = ddi_soft_state_init(&ath_soft_state_p, sizeof (ath_t), 1); 2516 if (status != 0) 2517 return (status); 2518 2519 mutex_init(&ath_loglock, NULL, MUTEX_DRIVER, NULL); 2520 ath_halfix_init(); 2521 mac_init_ops(&ath_dev_ops, "ath"); 2522 status = mod_install(&modlinkage); 2523 if (status != 0) { 2524 mac_fini_ops(&ath_dev_ops); 2525 ath_halfix_finit(); 2526 mutex_destroy(&ath_loglock); 2527 ddi_soft_state_fini(&ath_soft_state_p); 2528 } 2529 2530 return (status); 2531 } 2532 2533 int 2534 _fini(void) 2535 { 2536 int status; 2537 2538 status = mod_remove(&modlinkage); 2539 if (status == 0) { 2540 mac_fini_ops(&ath_dev_ops); 2541 ath_halfix_finit(); 2542 mutex_destroy(&ath_loglock); 2543 ddi_soft_state_fini(&ath_soft_state_p); 2544 } 2545 return (status); 2546 } 2547