Lines Matching refs:sc

279 static void	wpi_destroy_locks(wpi_sc_t *sc);
281 static void wpi_thread(wpi_sc_t *sc);
282 static int wpi_fast_recover(wpi_sc_t *sc);
405 wpi_sc_t *sc; in wpi_attach() local
418 sc = ddi_get_soft_state(wpi_soft_state_p, in wpi_attach()
420 ASSERT(sc != NULL); in wpi_attach()
422 mutex_enter(&sc->sc_glock); in wpi_attach()
423 sc->sc_flags &= ~WPI_F_SUSPEND; in wpi_attach()
424 mutex_exit(&sc->sc_glock); in wpi_attach()
426 if (sc->sc_flags & WPI_F_RUNNING) in wpi_attach()
427 (void) wpi_init(sc); in wpi_attach()
429 mutex_enter(&sc->sc_glock); in wpi_attach()
430 sc->sc_flags |= WPI_F_LAZY_RESUME; in wpi_attach()
431 mutex_exit(&sc->sc_glock); in wpi_attach()
447 sc = ddi_get_soft_state(wpi_soft_state_p, instance); in wpi_attach()
448 sc->sc_dip = dip; in wpi_attach()
457 sc->sc_rev = ddi_get8(cfg_handle, in wpi_attach()
460 sc->sc_clsz = ddi_get16(cfg_handle, in wpi_attach()
463 if (!sc->sc_clsz) in wpi_attach()
464 sc->sc_clsz = 16; in wpi_attach()
465 sc->sc_clsz = (sc->sc_clsz << 2); in wpi_attach()
466 sc->sc_dmabuf_sz = roundup(0x1000 + sizeof (struct ieee80211_frame) + in wpi_attach()
469 IEEE80211_WEP_CRCLEN), sc->sc_clsz); in wpi_attach()
473 err = ddi_regs_map_setup(dip, 1, &sc->sc_base, in wpi_attach()
474 0, 0, &wpi_reg_accattr, &sc->sc_handle); in wpi_attach()
484 err = wpi_alloc_shared(sc); in wpi_attach()
493 wpi_read_eeprom(sc); in wpi_attach()
494 err = wpi_ring_init(sc); in wpi_attach()
501 sc->sc_hdr = (const wpi_firmware_hdr_t *)wpi_fw_bin; in wpi_attach()
504 sc->sc_text = (const char *)(sc->sc_hdr + 1); in wpi_attach()
505 sc->sc_data = sc->sc_text + LE_32(sc->sc_hdr->textsz); in wpi_attach()
506 sc->sc_boot = sc->sc_data + LE_32(sc->sc_hdr->datasz); in wpi_attach()
507 err = wpi_alloc_fw_dma(sc); in wpi_attach()
517 err = ddi_get_iblock_cookie(dip, 0, &sc->sc_iblk); in wpi_attach()
523 mutex_init(&sc->sc_glock, NULL, MUTEX_DRIVER, sc->sc_iblk); in wpi_attach()
524 mutex_init(&sc->sc_tx_lock, NULL, MUTEX_DRIVER, sc->sc_iblk); in wpi_attach()
525 cv_init(&sc->sc_fw_cv, NULL, CV_DRIVER, NULL); in wpi_attach()
526 cv_init(&sc->sc_cmd_cv, NULL, CV_DRIVER, NULL); in wpi_attach()
531 mutex_init(&sc->sc_mt_lock, NULL, MUTEX_DRIVER, in wpi_attach()
532 (void *) sc->sc_iblk); in wpi_attach()
533 cv_init(&sc->sc_mt_cv, NULL, CV_DRIVER, NULL); in wpi_attach()
534 sc->sc_mf_thread = NULL; in wpi_attach()
535 sc->sc_mf_thread_switch = 0; in wpi_attach()
540 ic = &sc->sc_ic; in wpi_attach()
581 sc->sc_newstate = ic->ic_newstate; in wpi_attach()
593 &sc->sc_notif_softint_id, &sc->sc_iblk, NULL, wpi_notif_softintr, in wpi_attach()
594 (caddr_t)sc); in wpi_attach()
604 err = ddi_add_intr(dip, 0, &sc->sc_iblk, NULL, in wpi_attach()
605 wpi_intr, (caddr_t)sc); in wpi_attach()
627 macp->m_driver = sc; in wpi_attach()
667 sc->sc_mf_thread_switch = 1; in wpi_attach()
668 if (sc->sc_mf_thread == NULL) in wpi_attach()
669 sc->sc_mf_thread = thread_create((caddr_t)NULL, 0, in wpi_attach()
670 wpi_thread, sc, 0, &p0, TS_RUN, minclsyspri); in wpi_attach()
672 sc->sc_flags |= WPI_F_ATTACHED; in wpi_attach()
676 ddi_remove_intr(dip, 0, sc->sc_iblk); in wpi_attach()
678 ddi_remove_softintr(sc->sc_notif_softint_id); in wpi_attach()
679 sc->sc_notif_softint_id = NULL; in wpi_attach()
682 wpi_destroy_locks(sc); in wpi_attach()
684 wpi_free_fw_dma(sc); in wpi_attach()
686 wpi_ring_free(sc); in wpi_attach()
688 wpi_free_shared(sc); in wpi_attach()
690 ddi_regs_map_free(&sc->sc_handle); in wpi_attach()
700 wpi_sc_t *sc; in wpi_detach() local
703 sc = ddi_get_soft_state(wpi_soft_state_p, ddi_get_instance(dip)); in wpi_detach()
704 ASSERT(sc != NULL); in wpi_detach()
710 mutex_enter(&sc->sc_glock); in wpi_detach()
711 sc->sc_flags |= WPI_F_SUSPEND; in wpi_detach()
712 mutex_exit(&sc->sc_glock); in wpi_detach()
714 if (sc->sc_flags & WPI_F_RUNNING) { in wpi_detach()
715 wpi_stop(sc); in wpi_detach()
723 if (!(sc->sc_flags & WPI_F_ATTACHED)) in wpi_detach()
726 err = mac_disable(sc->sc_ic.ic_mach); in wpi_detach()
733 mutex_enter(&sc->sc_mt_lock); in wpi_detach()
734 sc->sc_mf_thread_switch = 0; in wpi_detach()
735 while (sc->sc_mf_thread != NULL) { in wpi_detach()
736 if (cv_wait_sig(&sc->sc_mt_cv, &sc->sc_mt_lock) == 0) in wpi_detach()
739 mutex_exit(&sc->sc_mt_lock); in wpi_detach()
741 wpi_stop(sc); in wpi_detach()
746 (void) mac_unregister(sc->sc_ic.ic_mach); in wpi_detach()
748 mutex_enter(&sc->sc_glock); in wpi_detach()
749 wpi_free_fw_dma(sc); in wpi_detach()
750 wpi_ring_free(sc); in wpi_detach()
751 wpi_free_shared(sc); in wpi_detach()
752 mutex_exit(&sc->sc_glock); in wpi_detach()
754 ddi_remove_intr(dip, 0, sc->sc_iblk); in wpi_detach()
755 ddi_remove_softintr(sc->sc_notif_softint_id); in wpi_detach()
756 sc->sc_notif_softint_id = NULL; in wpi_detach()
761 ieee80211_detach(&sc->sc_ic); in wpi_detach()
763 wpi_destroy_locks(sc); in wpi_detach()
765 ddi_regs_map_free(&sc->sc_handle); in wpi_detach()
773 wpi_destroy_locks(wpi_sc_t *sc) in wpi_destroy_locks() argument
775 cv_destroy(&sc->sc_mt_cv); in wpi_destroy_locks()
776 mutex_destroy(&sc->sc_mt_lock); in wpi_destroy_locks()
777 cv_destroy(&sc->sc_cmd_cv); in wpi_destroy_locks()
778 cv_destroy(&sc->sc_fw_cv); in wpi_destroy_locks()
779 mutex_destroy(&sc->sc_tx_lock); in wpi_destroy_locks()
780 mutex_destroy(&sc->sc_glock); in wpi_destroy_locks()
787 wpi_alloc_dma_mem(wpi_sc_t *sc, size_t memsize, ddi_dma_attr_t *dma_attr_p, in wpi_alloc_dma_mem() argument
796 err = ddi_dma_alloc_handle(sc->sc_dip, dma_attr_p, in wpi_alloc_dma_mem()
869 wpi_alloc_fw_dma(wpi_sc_t *sc) in wpi_alloc_fw_dma() argument
874 err = wpi_alloc_dma_mem(sc, LE_32(sc->sc_hdr->textsz), in wpi_alloc_fw_dma()
877 &sc->sc_dma_fw_text); in wpi_alloc_fw_dma()
878 dma_p = &sc->sc_dma_fw_text; in wpi_alloc_fw_dma()
890 sc->sc_fw_text_cookie[i] = *c; in wpi_alloc_fw_dma()
892 err = wpi_alloc_dma_mem(sc, LE_32(sc->sc_hdr->datasz), in wpi_alloc_fw_dma()
895 &sc->sc_dma_fw_data); in wpi_alloc_fw_dma()
896 dma_p = &sc->sc_dma_fw_data; in wpi_alloc_fw_dma()
908 sc->sc_fw_data_cookie[i] = *c; in wpi_alloc_fw_dma()
915 wpi_free_fw_dma(wpi_sc_t *sc) in wpi_free_fw_dma() argument
917 wpi_free_dma_mem(&sc->sc_dma_fw_text); in wpi_free_fw_dma()
918 wpi_free_dma_mem(&sc->sc_dma_fw_data); in wpi_free_fw_dma()
925 wpi_alloc_shared(wpi_sc_t *sc) in wpi_alloc_shared() argument
930 err = wpi_alloc_dma_mem(sc, sizeof (wpi_shared_t), in wpi_alloc_shared()
933 &sc->sc_dma_sh); in wpi_alloc_shared()
936 sc->sc_shared = (wpi_shared_t *)sc->sc_dma_sh.mem_va; in wpi_alloc_shared()
940 wpi_free_shared(sc); in wpi_alloc_shared()
945 wpi_free_shared(wpi_sc_t *sc) in wpi_free_shared() argument
947 wpi_free_dma_mem(&sc->sc_dma_sh); in wpi_free_shared()
951 wpi_alloc_rx_ring(wpi_sc_t *sc) in wpi_alloc_rx_ring() argument
957 ring = &sc->sc_rxq; in wpi_alloc_rx_ring()
960 err = wpi_alloc_dma_mem(sc, WPI_RX_RING_COUNT * sizeof (uint32_t), in wpi_alloc_rx_ring()
975 err = wpi_alloc_dma_mem(sc, sc->sc_dmabuf_sz, in wpi_alloc_rx_ring()
993 wpi_free_rx_ring(sc); in wpi_alloc_rx_ring()
998 wpi_reset_rx_ring(wpi_sc_t *sc) in wpi_reset_rx_ring() argument
1002 wpi_mem_lock(sc); in wpi_reset_rx_ring()
1004 WPI_WRITE(sc, WPI_RX_CONFIG, 0); in wpi_reset_rx_ring()
1006 if (WPI_READ(sc, WPI_RX_STATUS) & WPI_RX_IDLE) in wpi_reset_rx_ring()
1013 wpi_mem_unlock(sc); in wpi_reset_rx_ring()
1015 sc->sc_rxq.cur = 0; in wpi_reset_rx_ring()
1019 wpi_free_rx_ring(wpi_sc_t *sc) in wpi_free_rx_ring() argument
1024 if (sc->sc_rxq.data[i].dma_data.dma_hdl) in wpi_free_rx_ring()
1025 WPI_DMA_SYNC(sc->sc_rxq.data[i].dma_data, in wpi_free_rx_ring()
1027 wpi_free_dma_mem(&sc->sc_rxq.data[i].dma_data); in wpi_free_rx_ring()
1030 if (sc->sc_rxq.dma_desc.dma_hdl) in wpi_free_rx_ring()
1031 WPI_DMA_SYNC(sc->sc_rxq.dma_desc, DDI_DMA_SYNC_FORDEV); in wpi_free_rx_ring()
1032 wpi_free_dma_mem(&sc->sc_rxq.dma_desc); in wpi_free_rx_ring()
1036 wpi_alloc_tx_ring(wpi_sc_t *sc, wpi_tx_ring_t *ring, int count, int qid) in wpi_alloc_tx_ring() argument
1050 err = wpi_alloc_dma_mem(sc, count * sizeof (wpi_tx_desc_t), in wpi_alloc_tx_ring()
1061 sc->sc_shared->txbase[qid] = ring->dma_desc.cookie.dmac_address; in wpi_alloc_tx_ring()
1066 err = wpi_alloc_dma_mem(sc, count * sizeof (wpi_tx_cmd_t), in wpi_alloc_tx_ring()
1090 err = wpi_alloc_dma_mem(sc, sc->sc_dmabuf_sz, in wpi_alloc_tx_ring()
1111 wpi_free_tx_ring(sc, ring); in wpi_alloc_tx_ring()
1116 wpi_reset_tx_ring(wpi_sc_t *sc, wpi_tx_ring_t *ring) in wpi_reset_tx_ring() argument
1121 wpi_mem_lock(sc); in wpi_reset_tx_ring()
1123 WPI_WRITE(sc, WPI_TX_CONFIG(ring->qid), 0); in wpi_reset_tx_ring()
1125 if (WPI_READ(sc, WPI_TX_STATUS) & WPI_TX_IDLE(ring->qid)) in wpi_reset_tx_ring()
1135 wpi_mem_unlock(sc); in wpi_reset_tx_ring()
1137 if (!(sc->sc_flags & WPI_F_QUIESCED)) { in wpi_reset_tx_ring()
1150 wpi_free_tx_ring(wpi_sc_t *sc, wpi_tx_ring_t *ring) in wpi_free_tx_ring() argument
1175 wpi_ring_init(wpi_sc_t *sc) in wpi_ring_init() argument
1180 err = wpi_alloc_tx_ring(sc, &sc->sc_txq[i], WPI_TX_RING_COUNT, in wpi_ring_init()
1185 err = wpi_alloc_tx_ring(sc, &sc->sc_cmdq, WPI_CMD_RING_COUNT, 4); in wpi_ring_init()
1188 err = wpi_alloc_tx_ring(sc, &sc->sc_svcq, WPI_SVC_RING_COUNT, 5); in wpi_ring_init()
1191 err = wpi_alloc_rx_ring(sc); in wpi_ring_init()
1201 wpi_ring_free(wpi_sc_t *sc) in wpi_ring_free() argument
1205 wpi_free_rx_ring(sc); in wpi_ring_free()
1206 wpi_free_tx_ring(sc, &sc->sc_svcq); in wpi_ring_free()
1207 wpi_free_tx_ring(sc, &sc->sc_cmdq); in wpi_ring_free()
1209 wpi_free_tx_ring(sc, &sc->sc_txq[i]); in wpi_ring_free()
1240 wpi_sc_t *sc = (wpi_sc_t *)ic; in wpi_newstate() local
1245 mutex_enter(&sc->sc_glock); in wpi_newstate()
1254 sc->sc_flags |= WPI_F_SCANNING; in wpi_newstate()
1255 sc->sc_scan_next = 0; in wpi_newstate()
1258 wpi_set_led(sc, WPI_LED_LINK, 20, 2); in wpi_newstate()
1264 sc->sc_config.state = 0; in wpi_newstate()
1265 sc->sc_config.filter &= ~LE_32(WPI_FILTER_BSS); in wpi_newstate()
1269 sc->sc_config.chan, sc->sc_config.flags, in wpi_newstate()
1270 sc->sc_config.filter)); in wpi_newstate()
1272 err = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->sc_config, in wpi_newstate()
1277 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1278 mutex_exit(&sc->sc_glock); in wpi_newstate()
1287 err = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, in wpi_newstate()
1292 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1293 mutex_exit(&sc->sc_glock); in wpi_newstate()
1299 mutex_exit(&sc->sc_glock); in wpi_newstate()
1301 err = sc->sc_newstate(ic, nstate, arg); in wpi_newstate()
1302 mutex_enter(&sc->sc_glock); in wpi_newstate()
1303 if ((err != 0) || ((err = wpi_scan(sc)) != 0)) { in wpi_newstate()
1306 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1309 mutex_exit(&sc->sc_glock); in wpi_newstate()
1314 sc->sc_clk = 0; in wpi_newstate()
1319 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1323 sc->sc_config.state = 0; in wpi_newstate()
1324 sc->sc_config.filter &= ~LE_32(WPI_FILTER_BSS); in wpi_newstate()
1326 if ((err = wpi_auth(sc)) != 0) { in wpi_newstate()
1329 mutex_exit(&sc->sc_glock); in wpi_newstate()
1336 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1341 wpi_set_led(sc, WPI_LED_LINK, 5, 5); in wpi_newstate()
1346 (void) wpi_auth(sc); in wpi_newstate()
1352 sc->sc_config.state = LE_16(WPI_CONFIG_ASSOCIATED); in wpi_newstate()
1354 sc->sc_config.flags &= ~LE_32(WPI_CONFIG_SHPREAMBLE | in wpi_newstate()
1357 sc->sc_config.flags |= LE_32(WPI_CONFIG_SHSLOT); in wpi_newstate()
1359 sc->sc_config.flags |= LE_32(WPI_CONFIG_SHPREAMBLE); in wpi_newstate()
1360 sc->sc_config.filter |= LE_32(WPI_FILTER_BSS); in wpi_newstate()
1362 sc->sc_config.filter |= LE_32(WPI_FILTER_BEACON); in wpi_newstate()
1365 sc->sc_config.chan, sc->sc_config.flags)); in wpi_newstate()
1366 err = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->sc_config, in wpi_newstate()
1371 mutex_exit(&sc->sc_glock); in wpi_newstate()
1376 mutex_enter(&sc->sc_mt_lock); in wpi_newstate()
1378 sc->sc_flags |= WPI_F_RATE_AUTO_CTL; in wpi_newstate()
1385 sc->sc_flags &= ~WPI_F_RATE_AUTO_CTL; in wpi_newstate()
1387 mutex_exit(&sc->sc_mt_lock); in wpi_newstate()
1390 wpi_set_led(sc, WPI_LED_LINK, 0, 1); in wpi_newstate()
1394 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1398 sc->sc_flags &= ~WPI_F_SCANNING; in wpi_newstate()
1402 mutex_exit(&sc->sc_glock); in wpi_newstate()
1403 return (sc->sc_newstate(ic, nstate, arg)); in wpi_newstate()
1410 wpi_sc_t *sc = (wpi_sc_t *)ic; in wpi_key_set() local
1423 sc->sc_config.filter &= ~(WPI_FILTER_NODECRYPTUNI | in wpi_key_set()
1426 mutex_enter(&sc->sc_glock); in wpi_key_set()
1448 err = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof (node), 1); in wpi_key_set()
1452 mutex_exit(&sc->sc_glock); in wpi_key_set()
1455 mutex_exit(&sc->sc_glock); in wpi_key_set()
1463 wpi_mem_lock(wpi_sc_t *sc) in wpi_mem_lock() argument
1468 tmp = WPI_READ(sc, WPI_GPIO_CTL); in wpi_mem_lock()
1469 WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_MAC); in wpi_mem_lock()
1473 if ((WPI_READ(sc, WPI_GPIO_CTL) & in wpi_mem_lock()
1486 wpi_mem_unlock(wpi_sc_t *sc) in wpi_mem_unlock() argument
1488 uint32_t tmp = WPI_READ(sc, WPI_GPIO_CTL); in wpi_mem_unlock()
1489 WPI_WRITE(sc, WPI_GPIO_CTL, tmp & ~WPI_GPIO_MAC); in wpi_mem_unlock()
1493 wpi_mem_read(wpi_sc_t *sc, uint16_t addr) in wpi_mem_read() argument
1495 WPI_WRITE(sc, WPI_READ_MEM_ADDR, WPI_MEM_4 | addr); in wpi_mem_read()
1496 return (WPI_READ(sc, WPI_READ_MEM_DATA)); in wpi_mem_read()
1500 wpi_mem_write(wpi_sc_t *sc, uint16_t addr, uint32_t data) in wpi_mem_write() argument
1502 WPI_WRITE(sc, WPI_WRITE_MEM_ADDR, WPI_MEM_4 | addr); in wpi_mem_write()
1503 WPI_WRITE(sc, WPI_WRITE_MEM_DATA, data); in wpi_mem_write()
1507 wpi_mem_write_region_4(wpi_sc_t *sc, uint16_t addr, in wpi_mem_write_region_4() argument
1511 wpi_mem_write(sc, addr, *data); in wpi_mem_write_region_4()
1519 wpi_read_prom_word(wpi_sc_t *sc, uint32_t addr) in wpi_read_prom_word() argument
1524 WPI_WRITE(sc, WPI_EEPROM_CTL, addr << 2); in wpi_read_prom_word()
1526 wpi_mem_lock(sc); in wpi_read_prom_word()
1528 if ((val = WPI_READ(sc, WPI_EEPROM_CTL)) & WPI_EEPROM_READY) in wpi_read_prom_word()
1532 wpi_mem_unlock(sc); in wpi_read_prom_word()
1546 wpi_load_microcode(wpi_sc_t *sc) in wpi_load_microcode() argument
1551 ucode = sc->sc_boot; in wpi_load_microcode()
1552 size = LE_32(sc->sc_hdr->bootsz); in wpi_load_microcode()
1559 wpi_mem_lock(sc); in wpi_load_microcode()
1562 wpi_mem_write_region_4(sc, WPI_MEM_UCODE_BASE, (const uint32_t *)ucode, in wpi_load_microcode()
1565 wpi_mem_write(sc, WPI_MEM_UCODE_SRC, 0); in wpi_load_microcode()
1566 wpi_mem_write(sc, WPI_MEM_UCODE_DST, WPI_FW_TEXT); in wpi_load_microcode()
1567 wpi_mem_write(sc, WPI_MEM_UCODE_SIZE, size); in wpi_load_microcode()
1570 wpi_mem_write(sc, WPI_MEM_UCODE_CTL, WPI_UC_RUN); in wpi_load_microcode()
1572 wpi_mem_unlock(sc); in wpi_load_microcode()
1584 wpi_load_firmware(wpi_sc_t *sc, uint32_t target) in wpi_load_firmware() argument
1595 fw = sc->sc_text; in wpi_load_firmware()
1596 size = LE_32(sc->sc_hdr->textsz); in wpi_load_firmware()
1597 dma_p = &sc->sc_dma_fw_text; in wpi_load_firmware()
1598 cookie = sc->sc_fw_text_cookie; in wpi_load_firmware()
1600 fw = sc->sc_data; in wpi_load_firmware()
1601 size = LE_32(sc->sc_hdr->datasz); in wpi_load_firmware()
1602 dma_p = &sc->sc_dma_fw_data; in wpi_load_firmware()
1603 cookie = sc->sc_fw_data_cookie; in wpi_load_firmware()
1621 wpi_mem_lock(sc); in wpi_load_firmware()
1624 WPI_WRITE(sc, WPI_FW_TARGET, target); in wpi_load_firmware()
1626 WPI_WRITE(sc, WPI_TX_CONFIG(6), 0); in wpi_load_firmware()
1629 WPI_WRITE_REGION_4(sc, WPI_TX_DESC(6), (uint32_t *)&desc, in wpi_load_firmware()
1632 WPI_WRITE(sc, WPI_TX_CREDIT(6), 0xfffff); in wpi_load_firmware()
1633 WPI_WRITE(sc, WPI_TX_STATE(6), 0x4001); in wpi_load_firmware()
1634 WPI_WRITE(sc, WPI_TX_CONFIG(6), 0x80000001); in wpi_load_firmware()
1638 if (WPI_READ(sc, WPI_TX_STATUS) & WPI_TX_IDLE(6)) in wpi_load_firmware()
1647 WPI_WRITE(sc, WPI_TX_CREDIT(6), 0); in wpi_load_firmware()
1649 wpi_mem_unlock(sc); in wpi_load_firmware()
1656 wpi_rx_intr(wpi_sc_t *sc, wpi_rx_desc_t *desc, wpi_rx_data_t *data) argument
1658 ieee80211com_t *ic = &sc->sc_ic;
1659 wpi_rx_ring_t *ring = &sc->sc_rxq;
1685 if ((len < 20) || (len > sc->sc_dmabuf_sz)) {
1686 sc->sc_rx_err++;
1696 sc->sc_rx_err++;
1705 if (sc->sc_drvbpf != NULL) {
1707 if (bpf_peers_present(sc->sc_drvbpf)) {
1709 struct wpi_rx_radiotap_header *tap = &sc->sc_rxtap;
1742 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
1762 sc->sc_rx_nobuf++;
1772 wpi_tx_intr(wpi_sc_t *sc, wpi_rx_desc_t *desc, wpi_rx_data_t *data) argument
1774 ieee80211com_t *ic = &sc->sc_ic;
1775 wpi_tx_ring_t *ring = &sc->sc_txq[desc->qid & 0x3];
1789 sc->sc_tx_retries++;
1794 sc->sc_tx_timer = 0;
1796 mutex_enter(&sc->sc_tx_lock);
1800 if ((sc->sc_need_reschedule) && (ring->queued <= (ring->count << 3))) {
1801 sc->sc_need_reschedule = 0;
1802 mutex_exit(&sc->sc_tx_lock);
1804 mutex_enter(&sc->sc_tx_lock);
1806 mutex_exit(&sc->sc_tx_lock);
1810 wpi_cmd_intr(wpi_sc_t *sc, wpi_rx_desc_t *desc) argument
1815 mutex_enter(&sc->sc_glock);
1816 sc->sc_flags |= WPI_F_CMD_DONE;
1817 cv_signal(&sc->sc_cmd_cv);
1818 mutex_exit(&sc->sc_glock);
1824 wpi_sc_t *sc = (wpi_sc_t *)arg; local
1829 mutex_enter(&sc->sc_glock);
1830 if (sc->sc_notif_softint_pending != 1) {
1831 mutex_exit(&sc->sc_glock);
1834 mutex_exit(&sc->sc_glock);
1836 hw = LE_32(sc->sc_shared->next);
1838 while (sc->sc_rxq.cur != hw) {
1839 data = &sc->sc_rxq.data[sc->sc_rxq.cur];
1844 hw, sc->sc_rxq.cur, desc->qid, desc->idx, desc->flags,
1848 wpi_cmd_intr(sc, desc);
1853 wpi_rx_intr(sc, desc, data);
1858 wpi_tx_intr(sc, desc, data);
1895 sc->sc_ostate = sc->sc_ic.ic_state;
1896 ieee80211_new_state(&sc->sc_ic,
1898 sc->sc_flags |=
1923 sc->sc_scan_pending = 0;
1924 sc->sc_scan_next++;
1931 sc->sc_rxq.cur = (sc->sc_rxq.cur + 1) % WPI_RX_RING_COUNT;
1936 WPI_WRITE(sc, WPI_RX_WIDX, hw & (~7));
1937 mutex_enter(&sc->sc_glock);
1938 sc->sc_notif_softint_pending = 0;
1939 mutex_exit(&sc->sc_glock);
1947 wpi_sc_t *sc = (wpi_sc_t *)arg; local
1950 mutex_enter(&sc->sc_glock);
1951 if (sc->sc_flags & WPI_F_SUSPEND) {
1952 mutex_exit(&sc->sc_glock);
1956 r = WPI_READ(sc, WPI_INTR);
1958 mutex_exit(&sc->sc_glock);
1964 rfh = WPI_READ(sc, WPI_INTR_STATUS);
1966 WPI_WRITE(sc, WPI_MASK, 0);
1968 WPI_WRITE(sc, WPI_INTR, r);
1969 WPI_WRITE(sc, WPI_INTR_STATUS, rfh);
1971 if (sc->sc_notif_softint_id == NULL) {
1972 mutex_exit(&sc->sc_glock);
1978 mutex_exit(&sc->sc_glock);
1979 wpi_stop(sc);
1980 if (!(sc->sc_flags & WPI_F_HW_ERR_RECOVER)) {
1981 sc->sc_ostate = sc->sc_ic.ic_state;
1985 if (!WPI_CHK_FAST_RECOVER(sc))
1986 ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
1988 sc->sc_flags |= WPI_F_HW_ERR_RECOVER;
1994 sc->sc_notif_softint_pending = 1;
1995 ddi_trigger_softintr(sc->sc_notif_softint_id);
1999 sc->sc_flags |= WPI_F_FW_INIT;
2000 cv_signal(&sc->sc_fw_cv);
2004 WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK);
2005 mutex_exit(&sc->sc_glock);
2039 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2040 ieee80211com_t *ic = &sc->sc_ic;
2043 if (sc->sc_flags & WPI_F_SUSPEND) {
2053 if ((sc->sc_flags & WPI_F_HW_ERR_RECOVER) &&
2054 WPI_CHK_FAST_RECOVER(sc)) {
2075 wpi_sc_t *sc = (wpi_sc_t *)ic; local
2088 (&sc->sc_txq[0]) : (&sc->sc_txq[1]);
2095 mutex_enter(&sc->sc_tx_lock);
2096 if (sc->sc_flags & WPI_F_SUSPEND) {
2097 mutex_exit(&sc->sc_tx_lock);
2108 sc->sc_need_reschedule = 1;
2109 mutex_exit(&sc->sc_tx_lock);
2114 sc->sc_tx_nobuf++;
2118 mutex_exit(&sc->sc_tx_lock);
2144 sc->sc_tx_err++;
2168 sc->sc_tx_err++;
2206 if (sc->sc_drvbpf != NULL) {
2208 if (bpf_peers_present(sc->sc_drvbpf)) {
2210 struct wpi_tx_radiotap_header *tap = &sc->sc_txtap;
2219 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
2278 mutex_enter(&sc->sc_tx_lock);
2280 mutex_exit(&sc->sc_tx_lock);
2284 WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
2292 if (sc->sc_tx_timer == 0)
2293 sc->sc_tx_timer = 5;
2301 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2302 ieee80211com_t *ic = &sc->sc_ic;
2316 if (sc->sc_flags & WPI_F_RUNNING) {
2317 wpi_m_stop(sc);
2318 (void) wpi_m_start(sc);
2335 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2337 err = ieee80211_getprop(&sc->sc_ic, pr_name, wldp_pr_name,
2347 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2349 ieee80211_propinfo(&sc->sc_ic, pr_name, wldp_pr_num, mph);
2357 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2358 ieee80211com_t *ic = &sc->sc_ic;
2365 if (sc->sc_flags & WPI_F_RUNNING) {
2366 wpi_m_stop(sc);
2367 (void) wpi_m_start(sc);
2383 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2384 ieee80211com_t *ic = &sc->sc_ic;
2387 mutex_enter(&sc->sc_glock);
2396 *val = sc->sc_tx_nobuf;
2399 *val = sc->sc_rx_nobuf;
2402 *val = sc->sc_rx_err;
2418 *val = sc->sc_tx_err;
2421 *val = sc->sc_tx_retries;
2433 mutex_exit(&sc->sc_glock);
2436 mutex_exit(&sc->sc_glock);
2439 mutex_exit(&sc->sc_glock);
2448 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2449 ieee80211com_t *ic = &sc->sc_ic;
2452 err = wpi_init(sc);
2454 wpi_stop(sc);
2456 err = wpi_init(sc);
2465 mutex_enter(&sc->sc_glock);
2466 sc->sc_flags |= WPI_F_HW_ERR_RECOVER;
2467 mutex_exit(&sc->sc_glock);
2471 mutex_enter(&sc->sc_glock);
2472 sc->sc_flags |= WPI_F_RUNNING;
2473 mutex_exit(&sc->sc_glock);
2481 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2482 ieee80211com_t *ic = &sc->sc_ic;
2484 wpi_stop(sc);
2486 mutex_enter(&sc->sc_mt_lock);
2487 sc->sc_flags &= ~WPI_F_HW_ERR_RECOVER;
2488 sc->sc_flags &= ~WPI_F_RATE_AUTO_CTL;
2489 mutex_exit(&sc->sc_mt_lock);
2490 mutex_enter(&sc->sc_glock);
2491 sc->sc_flags &= ~WPI_F_RUNNING;
2492 mutex_exit(&sc->sc_glock);
2499 wpi_sc_t *sc = (wpi_sc_t *)arg; local
2500 ieee80211com_t *ic = &sc->sc_ic;
2505 mutex_enter(&sc->sc_glock);
2506 err = wpi_config(sc);
2507 mutex_exit(&sc->sc_glock);
2535 wpi_thread(wpi_sc_t *sc) argument
2537 ieee80211com_t *ic = &sc->sc_ic;
2542 mutex_enter(&sc->sc_mt_lock);
2543 while (sc->sc_mf_thread_switch) {
2544 tmp = WPI_READ(sc, WPI_GPIO_CTL);
2546 sc->sc_flags &= ~WPI_F_RADIO_OFF;
2548 sc->sc_flags |= WPI_F_RADIO_OFF;
2553 if ((sc->sc_flags & WPI_F_SUSPEND) ||
2554 (sc->sc_flags & WPI_F_RADIO_OFF)) {
2555 mutex_exit(&sc->sc_mt_lock);
2557 mutex_enter(&sc->sc_mt_lock);
2565 (sc->sc_flags & WPI_F_HW_ERR_RECOVER)) {
2571 wpi_stop(sc);
2573 if (WPI_CHK_FAST_RECOVER(sc)) {
2575 bcopy(&sc->sc_config, &sc->sc_config_save,
2576 sizeof (sc->sc_config));
2578 mutex_exit(&sc->sc_mt_lock);
2581 mutex_enter(&sc->sc_mt_lock);
2584 err = wpi_init(sc);
2592 sc->sc_flags |= WPI_F_RUNNING;
2594 if (!WPI_CHK_FAST_RECOVER(sc) ||
2595 wpi_fast_recover(sc) != WPI_SUCCESS) {
2596 sc->sc_flags &= ~WPI_F_HW_ERR_RECOVER;
2598 mutex_exit(&sc->sc_mt_lock);
2600 if (sc->sc_ostate != IEEE80211_S_INIT)
2603 mutex_enter(&sc->sc_mt_lock);
2607 if (ic->ic_mach && (sc->sc_flags & WPI_F_LAZY_RESUME)) {
2611 sc->sc_flags &= ~WPI_F_LAZY_RESUME;
2612 mutex_exit(&sc->sc_mt_lock);
2619 ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
2620 mutex_enter(&sc->sc_mt_lock);
2627 (sc->sc_flags & WPI_F_SCANNING) && sc->sc_scan_next) {
2633 sc->sc_scan_next--;
2634 mutex_exit(&sc->sc_mt_lock);
2636 if (sc->sc_flags & WPI_F_SCANNING)
2638 mutex_enter(&sc->sc_mt_lock);
2645 (sc->sc_flags & WPI_F_RATE_AUTO_CTL)) {
2647 if (clk > sc->sc_clk + drv_usectohz(500000)) {
2648 wpi_amrr_timeout(sc);
2651 mutex_exit(&sc->sc_mt_lock);
2653 mutex_enter(&sc->sc_mt_lock);
2654 if (sc->sc_tx_timer) {
2657 sc->sc_tx_timer--;
2658 if (sc->sc_tx_timer == 0) {
2659 sc->sc_flags |= WPI_F_HW_ERR_RECOVER;
2660 sc->sc_ostate = IEEE80211_S_RUN;
2668 sc->sc_mf_thread = NULL;
2669 cv_signal(&sc->sc_mt_cv);
2670 mutex_exit(&sc->sc_mt_lock);
2677 wpi_read_eeprom(wpi_sc_t *sc) argument
2679 ieee80211com_t *ic = &sc->sc_ic;
2684 val = wpi_read_prom_word(sc, WPI_EEPROM_MAC + 0);
2687 val = wpi_read_prom_word(sc, WPI_EEPROM_MAC + 1);
2690 val = wpi_read_prom_word(sc, WPI_EEPROM_MAC + 2);
2701 sc->sc_pwr1[i] = wpi_read_prom_word(sc, WPI_EEPROM_PWR1 + i);
2702 sc->sc_pwr2[i] = wpi_read_prom_word(sc, WPI_EEPROM_PWR2 + i);
2705 sc->sc_pwr1[i], sc->sc_pwr2[i]));
2713 wpi_cmd(wpi_sc_t *sc, int code, const void *buf, int size, int async) argument
2715 wpi_tx_ring_t *ring = &sc->sc_cmdq;
2720 ASSERT(mutex_owned(&sc->sc_glock));
2738 WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
2744 sc->sc_flags &= ~WPI_F_CMD_DONE;
2746 while (!(sc->sc_flags & WPI_F_CMD_DONE)) {
2747 if (cv_timedwait(&sc->sc_cmd_cv, &sc->sc_glock, clk)
2751 if (sc->sc_flags & WPI_F_CMD_DONE)
2762 wpi_mrr_setup(wpi_sc_t *sc) argument
2789 err = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof (mrr), 1);
2798 err = wpi_cmd(sc, WPI_CMD_MRR_SETUP, &mrr, sizeof (mrr), 1);
2809 wpi_set_led(wpi_sc_t *sc, uint8_t which, uint8_t off, uint8_t on) argument
2818 (void) wpi_cmd(sc, WPI_CMD_SET_LED, &led, sizeof (led), 1);
2822 wpi_auth(wpi_sc_t *sc) argument
2824 ieee80211com_t *ic = &sc->sc_ic;
2830 IEEE80211_ADDR_COPY(sc->sc_config.bssid, in->in_bssid);
2831 sc->sc_config.chan = ieee80211_chan2ieee(ic, in->in_chan);
2833 sc->sc_config.cck_mask = 0x03;
2834 sc->sc_config.ofdm_mask = 0;
2837 sc->sc_config.cck_mask = 0;
2838 sc->sc_config.ofdm_mask = 0x15;
2840 sc->sc_config.cck_mask = 0x0f;
2841 sc->sc_config.ofdm_mask = 0xff;
2846 sc->sc_config.chan, sc->sc_config.flags,
2847 sc->sc_config.cck_mask, sc->sc_config.ofdm_mask,
2848 sc->sc_config.bssid[0], sc->sc_config.bssid[1],
2849 sc->sc_config.bssid[2], sc->sc_config.bssid[3],
2850 sc->sc_config.bssid[4], sc->sc_config.bssid[5]));
2851 err = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->sc_config,
2855 sc->sc_config.chan);
2864 err = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof (node), 1);
2870 err = wpi_mrr_setup(sc);
2883 wpi_scan(wpi_sc_t *sc) argument
2885 ieee80211com_t *ic = &sc->sc_ic;
2886 wpi_tx_ring_t *ring = &sc->sc_cmdq;
2901 if (sc->sc_scan_pending) {
3024 WPI_WRITE(sc, WPI_TX_WIDX, ring->qid << 8 | ring->cur);
3026 sc->sc_scan_pending = 1;
3032 wpi_config(wpi_sc_t *sc) argument
3034 ieee80211com_t *ic = &sc->sc_ic;
3047 (void) memcpy(txpower.pwr1, sc->sc_pwr1, 14 * sizeof (uint16_t));
3048 (void) memcpy(txpower.pwr2, sc->sc_pwr2, 14 * sizeof (uint16_t));
3049 err = wpi_cmd(sc, WPI_CMD_TXPOWER, &txpower, sizeof (txpower), 0);
3058 err = wpi_cmd(sc, WPI_CMD_SET_POWER_MODE, &power, sizeof (power), 0);
3069 err = wpi_cmd(sc, WPI_CMD_BLUETOOTH, &bluetooth,
3079 (void) memset(&sc->sc_config, 0, sizeof (wpi_config_t));
3080 IEEE80211_ADDR_COPY(sc->sc_config.myaddr, ic->ic_macaddr);
3081 sc->sc_config.chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
3082 sc->sc_config.flags = LE_32(WPI_CONFIG_TSF | WPI_CONFIG_AUTO |
3084 sc->sc_config.filter = 0;
3087 sc->sc_config.mode = WPI_MODE_STA;
3088 sc->sc_config.filter |= LE_32(WPI_FILTER_MULTICAST);
3092 sc->sc_config.mode = WPI_MODE_IBSS;
3095 sc->sc_config.mode = WPI_MODE_HOSTAP;
3098 sc->sc_config.mode = WPI_MODE_MONITOR;
3099 sc->sc_config.filter |= LE_32(WPI_FILTER_MULTICAST |
3103 sc->sc_config.cck_mask = 0x0f; /* not yet negotiated */
3104 sc->sc_config.ofdm_mask = 0xff; /* not yet negotiated */
3105 err = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->sc_config,
3118 err = wpi_cmd(sc, WPI_CMD_ADD_NODE, &node, sizeof (node), 0);
3129 wpi_stop_master(wpi_sc_t *sc) argument
3134 tmp = WPI_READ(sc, WPI_RESET);
3135 WPI_WRITE(sc, WPI_RESET, tmp | WPI_STOP_MASTER);
3137 tmp = WPI_READ(sc, WPI_GPIO_CTL);
3142 if (WPI_READ(sc, WPI_RESET) & WPI_MASTER_DISABLED)
3151 wpi_power_up(wpi_sc_t *sc) argument
3156 wpi_mem_lock(sc);
3157 tmp = wpi_mem_read(sc, WPI_MEM_POWER);
3158 wpi_mem_write(sc, WPI_MEM_POWER, tmp & ~0x03000000);
3159 wpi_mem_unlock(sc);
3162 if (WPI_READ(sc, WPI_GPIO_STATUS) & WPI_POWERED)
3175 wpi_reset(wpi_sc_t *sc) argument
3181 WPI_WRITE(sc, WPI_INTR, 0xffffffff);
3183 tmp = WPI_READ(sc, WPI_PLL_CTL);
3184 WPI_WRITE(sc, WPI_PLL_CTL, tmp | WPI_PLL_INIT);
3186 tmp = WPI_READ(sc, WPI_CHICKEN);
3187 WPI_WRITE(sc, WPI_CHICKEN, tmp | WPI_CHICKEN_RXNOLOS);
3189 tmp = WPI_READ(sc, WPI_GPIO_CTL);
3190 WPI_WRITE(sc, WPI_GPIO_CTL, tmp | WPI_GPIO_INIT);
3194 if (WPI_READ(sc, WPI_GPIO_CTL) & WPI_GPIO_CLOCK)
3205 tmp = WPI_READ(sc, WPI_EEPROM_STATUS);
3210 WPI_WRITE(sc, WPI_EEPROM_STATUS, tmp & ~WPI_EEPROM_LOCKED);
3216 wpi_hw_config(wpi_sc_t *sc) argument
3222 hw = WPI_READ(sc, WPI_HWCONFIG);
3224 if ((sc->sc_rev & 0xc0) == 0x40)
3226 else if (!(sc->sc_rev & 0x80))
3229 val = wpi_read_prom_word(sc, WPI_EEPROM_CAPABILITIES);
3233 val = wpi_read_prom_word(sc, WPI_EEPROM_REVISION);
3238 val = wpi_read_prom_word(sc, WPI_EEPROM_TYPE);
3243 WPI_WRITE(sc, WPI_HWCONFIG, hw);
3247 wpi_init(wpi_sc_t *sc) argument
3253 mutex_enter(&sc->sc_glock);
3254 sc->sc_flags &= ~WPI_F_FW_INIT;
3256 (void) wpi_reset(sc);
3258 wpi_mem_lock(sc);
3259 wpi_mem_write(sc, WPI_MEM_CLOCK1, 0xa00);
3261 tmp = wpi_mem_read(sc, WPI_MEM_PCIDEV);
3262 wpi_mem_write(sc, WPI_MEM_PCIDEV, tmp | 0x800);
3263 wpi_mem_unlock(sc);
3265 (void) wpi_power_up(sc);
3266 wpi_hw_config(sc);
3268 tmp = WPI_READ(sc, WPI_GPIO_CTL);
3275 wpi_mem_lock(sc);
3276 WPI_WRITE(sc, WPI_RX_BASE, sc->sc_rxq.dma_desc.cookie.dmac_address);
3277 WPI_WRITE(sc, WPI_RX_RIDX_PTR,
3278 (uint32_t)(sc->sc_dma_sh.cookie.dmac_address +
3280 WPI_WRITE(sc, WPI_RX_WIDX, (WPI_RX_RING_COUNT - 1) & (~7));
3281 WPI_WRITE(sc, WPI_RX_CONFIG, 0xa9601010);
3282 wpi_mem_unlock(sc);
3285 wpi_mem_lock(sc);
3286 wpi_mem_write(sc, WPI_MEM_MODE, 2); /* bypass mode */
3287 wpi_mem_write(sc, WPI_MEM_RA, 1); /* enable RA0 */
3288 wpi_mem_write(sc, WPI_MEM_TXCFG, 0x3f); /* enable all 6 Tx rings */
3289 wpi_mem_write(sc, WPI_MEM_BYPASS1, 0x10000);
3290 wpi_mem_write(sc, WPI_MEM_BYPASS2, 0x30002);
3291 wpi_mem_write(sc, WPI_MEM_MAGIC4, 4);
3292 wpi_mem_write(sc, WPI_MEM_MAGIC5, 5);
3294 WPI_WRITE(sc, WPI_TX_BASE_PTR, sc->sc_dma_sh.cookie.dmac_address);
3295 WPI_WRITE(sc, WPI_MSG_CONFIG, 0xffff05a5);
3298 WPI_WRITE(sc, WPI_TX_CTL(qid), 0);
3299 WPI_WRITE(sc, WPI_TX_BASE(qid), 0);
3300 WPI_WRITE(sc, WPI_TX_CONFIG(qid), 0x80200008);
3302 wpi_mem_unlock(sc);
3305 WPI_WRITE(sc, WPI_UCODE_CLR, WPI_RADIO_OFF);
3306 WPI_WRITE(sc, WPI_UCODE_CLR, WPI_DISABLE_CMD);
3309 WPI_WRITE(sc, WPI_INTR, 0xffffffff);
3312 WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK);
3315 err = wpi_load_microcode(sc);
3322 err = wpi_load_firmware(sc, WPI_FW_TEXT);
3330 err = wpi_load_firmware(sc, WPI_FW_DATA);
3338 tmp = WPI_READ(sc, WPI_RESET);
3340 WPI_WRITE(sc, WPI_RESET, tmp);
3344 while (!(sc->sc_flags & WPI_F_FW_INIT)) {
3345 if (cv_timedwait(&sc->sc_fw_cv, &sc->sc_glock, clk) < 0)
3348 if (!(sc->sc_flags & WPI_F_FW_INIT)) {
3356 if (WPI_READ(sc, WPI_TEMPERATURE) != 0)
3368 (int)WPI_READ(sc, WPI_TEMPERATURE)));
3370 err = wpi_config(sc);
3376 mutex_exit(&sc->sc_glock);
3381 mutex_exit(&sc->sc_glock);
3386 wpi_fast_recover(wpi_sc_t *sc) argument
3388 ieee80211com_t *ic = &sc->sc_ic;
3391 mutex_enter(&sc->sc_glock);
3394 bcopy(&sc->sc_config_save, &sc->sc_config,
3395 sizeof (sc->sc_config));
3397 sc->sc_config.state = 0;
3398 sc->sc_config.filter &= ~LE_32(WPI_FILTER_BSS);
3400 if ((err = wpi_auth(sc)) != 0) {
3403 mutex_exit(&sc->sc_glock);
3407 sc->sc_config.state = LE_16(WPI_CONFIG_ASSOCIATED);
3408 sc->sc_config.flags &= ~LE_32(WPI_CONFIG_SHPREAMBLE |
3411 sc->sc_config.flags |= LE_32(WPI_CONFIG_SHSLOT);
3413 sc->sc_config.flags |= LE_32(WPI_CONFIG_SHPREAMBLE);
3414 sc->sc_config.filter |= LE_32(WPI_FILTER_BSS);
3416 sc->sc_config.filter |= LE_32(WPI_FILTER_BEACON);
3419 sc->sc_config.chan, sc->sc_config.flags));
3420 err = wpi_cmd(sc, WPI_CMD_CONFIGURE, &sc->sc_config,
3424 mutex_exit(&sc->sc_glock);
3428 wpi_set_led(sc, WPI_LED_LINK, 0, 1);
3430 mutex_exit(&sc->sc_glock);
3448 sc->sc_flags &= ~WPI_F_HW_ERR_RECOVER;
3468 wpi_sc_t *sc; local
3470 sc = ddi_get_soft_state(wpi_soft_state_p, ddi_get_instance(dip));
3471 if (sc == NULL)
3483 sc->sc_flags |= WPI_F_QUIESCED;
3488 wpi_stop(sc);
3493 wpi_stop(wpi_sc_t *sc) argument
3499 if (!(sc->sc_flags & WPI_F_QUIESCED))
3500 mutex_enter(&sc->sc_glock);
3503 WPI_WRITE(sc, WPI_MASK, 0);
3504 WPI_WRITE(sc, WPI_INTR, WPI_INTR_MASK);
3505 WPI_WRITE(sc, WPI_INTR_STATUS, 0xff);
3506 WPI_WRITE(sc, WPI_INTR_STATUS, 0x00070000);
3508 wpi_mem_lock(sc);
3509 wpi_mem_write(sc, WPI_MEM_MODE, 0);
3510 wpi_mem_unlock(sc);
3514 wpi_reset_tx_ring(sc, &sc->sc_txq[ac]);
3515 wpi_reset_tx_ring(sc, &sc->sc_cmdq);
3516 wpi_reset_tx_ring(sc, &sc->sc_svcq);
3519 wpi_reset_rx_ring(sc);
3521 wpi_mem_lock(sc);
3522 wpi_mem_write(sc, WPI_MEM_CLOCK2, 0x200);
3523 wpi_mem_unlock(sc);
3527 wpi_stop_master(sc);
3529 sc->sc_tx_timer = 0;
3530 sc->sc_flags &= ~WPI_F_SCANNING;
3531 sc->sc_scan_pending = 0;
3532 sc->sc_scan_next = 0;
3534 tmp = WPI_READ(sc, WPI_RESET);
3535 WPI_WRITE(sc, WPI_RESET, tmp | WPI_SW_RESET);
3538 if (!(sc->sc_flags & WPI_F_QUIESCED))
3539 mutex_exit(&sc->sc_glock);
3579 wpi_amrr_timeout(wpi_sc_t *sc) argument
3581 ieee80211com_t *ic = &sc->sc_ic;
3588 sc->sc_clk = ddi_get_lbolt();