Lines Matching +full:sens +full:-
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
6 * Copyright (c) 2005-2006 Sam Leffler, Errno Consulting
33 /*-
266 for (ident = iwi_ident_table; ident->name != NULL; ident++) { in iwi_probe()
267 if (pci_get_vendor(dev) == ident->vendor && in iwi_probe()
268 pci_get_device(dev) == ident->device) { in iwi_probe()
269 device_set_desc(dev, ident->name); in iwi_probe()
280 struct ieee80211com *ic = &sc->sc_ic; in iwi_attach()
284 sc->sc_dev = dev; in iwi_attach()
285 sc->sc_ledevent = ticks; in iwi_attach()
288 mbufq_init(&sc->sc_snd, ifqmaxlen); in iwi_attach()
290 sc->sc_unr = new_unrhdr(1, IWI_MAX_IBSSNODE-1, &sc->sc_mtx); in iwi_attach()
292 TASK_INIT(&sc->sc_radiontask, 0, iwi_radio_on, sc); in iwi_attach()
293 TASK_INIT(&sc->sc_radiofftask, 0, iwi_radio_off, sc); in iwi_attach()
294 TASK_INIT(&sc->sc_restarttask, 0, iwi_restart, sc); in iwi_attach()
295 TASK_INIT(&sc->sc_disassoctask, 0, iwi_disassoc, sc); in iwi_attach()
296 TASK_INIT(&sc->sc_monitortask, 0, iwi_monitor_scan, sc); in iwi_attach()
298 callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0); in iwi_attach()
299 callout_init_mtx(&sc->sc_rftimer, &sc->sc_mtx, 0); in iwi_attach()
303 /* enable bus-mastering */ in iwi_attach()
307 sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &i, RF_ACTIVE); in iwi_attach()
308 if (sc->mem == NULL) { in iwi_attach()
313 sc->sc_st = rman_get_bustag(sc->mem); in iwi_attach()
314 sc->sc_sh = rman_get_bushandle(sc->mem); in iwi_attach()
317 sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &i, in iwi_attach()
319 if (sc->irq == NULL) { in iwi_attach()
332 if (iwi_alloc_cmd_ring(sc, &sc->cmdq, IWI_CMD_RING_COUNT) != 0) { in iwi_attach()
338 error = iwi_alloc_tx_ring(sc, &sc->txq[i], IWI_TX_RING_COUNT, in iwi_attach()
348 if (iwi_alloc_rx_ring(sc, &sc->rxq, IWI_RX_RING_COUNT) != 0) { in iwi_attach()
355 ic->ic_softc = sc; in iwi_attach()
356 ic->ic_name = device_get_nameunit(dev); in iwi_attach()
357 ic->ic_opmode = IEEE80211_M_STA; in iwi_attach()
358 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ in iwi_attach()
361 ic->ic_caps = in iwi_attach()
374 ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD; in iwi_attach()
378 ic->ic_macaddr[0] = val & 0xff; in iwi_attach()
379 ic->ic_macaddr[1] = val >> 8; in iwi_attach()
381 ic->ic_macaddr[2] = val & 0xff; in iwi_attach()
382 ic->ic_macaddr[3] = val >> 8; in iwi_attach()
384 ic->ic_macaddr[4] = val & 0xff; in iwi_attach()
385 ic->ic_macaddr[5] = val >> 8; in iwi_attach()
387 iwi_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans, in iwi_attach()
388 ic->ic_channels); in iwi_attach()
392 ic->ic_node_alloc = iwi_node_alloc; in iwi_attach()
393 sc->sc_node_free = ic->ic_node_free; in iwi_attach()
394 ic->ic_node_free = iwi_node_free; in iwi_attach()
395 ic->ic_raw_xmit = iwi_raw_xmit; in iwi_attach()
396 ic->ic_scan_start = iwi_scan_start; in iwi_attach()
397 ic->ic_scan_end = iwi_scan_end; in iwi_attach()
398 ic->ic_set_channel = iwi_set_channel; in iwi_attach()
399 ic->ic_scan_curchan = iwi_scan_curchan; in iwi_attach()
400 ic->ic_scan_mindwell = iwi_scan_mindwell; in iwi_attach()
401 ic->ic_wme.wme_update = iwi_wme_update; in iwi_attach()
403 ic->ic_vap_create = iwi_vap_create; in iwi_attach()
404 ic->ic_vap_delete = iwi_vap_delete; in iwi_attach()
405 ic->ic_ioctl = iwi_ioctl; in iwi_attach()
406 ic->ic_transmit = iwi_transmit; in iwi_attach()
407 ic->ic_parent = iwi_parent; in iwi_attach()
408 ic->ic_getradiocaps = iwi_getradiocaps; in iwi_attach()
411 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), in iwi_attach()
413 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), in iwi_attach()
422 error = bus_setup_intr(dev, sc->irq, INTR_TYPE_NET | INTR_MPSAFE, in iwi_attach()
423 NULL, iwi_intr, sc, &sc->sc_ih); in iwi_attach()
443 struct ieee80211com *ic = &sc->sc_ic; in iwi_detach()
445 bus_teardown_intr(dev, sc->irq, sc->sc_ih); in iwi_detach()
448 ieee80211_draintask(ic, &sc->sc_radiontask); in iwi_detach()
449 ieee80211_draintask(ic, &sc->sc_radiofftask); in iwi_detach()
450 ieee80211_draintask(ic, &sc->sc_restarttask); in iwi_detach()
451 ieee80211_draintask(ic, &sc->sc_disassoctask); in iwi_detach()
452 ieee80211_draintask(ic, &sc->sc_monitortask); in iwi_detach()
461 iwi_free_cmd_ring(sc, &sc->cmdq); in iwi_detach()
462 iwi_free_tx_ring(sc, &sc->txq[0]); in iwi_detach()
463 iwi_free_tx_ring(sc, &sc->txq[1]); in iwi_detach()
464 iwi_free_tx_ring(sc, &sc->txq[2]); in iwi_detach()
465 iwi_free_tx_ring(sc, &sc->txq[3]); in iwi_detach()
466 iwi_free_rx_ring(sc, &sc->rxq); in iwi_detach()
468 bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->irq), sc->irq); in iwi_detach()
470 bus_release_resource(dev, SYS_RES_MEMORY, rman_get_rid(sc->mem), in iwi_detach()
471 sc->mem); in iwi_detach()
473 delete_unrhdr(sc->sc_unr); in iwi_detach()
474 mbufq_drain(&sc->sc_snd); in iwi_detach()
487 struct iwi_softc *sc = ic->ic_softc; in iwi_vap_create()
492 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ in iwi_vap_create()
500 i = sc->fw_fw.size; in iwi_vap_create()
501 if (sc->fw_boot.size > i) in iwi_vap_create()
502 i = sc->fw_boot.size; in iwi_vap_create()
504 if (sc->fw_uc.size > i) in iwi_vap_create()
505 i = sc->fw_uc.size; in iwi_vap_create()
510 vap = &ivp->iwi_vap; in iwi_vap_create()
513 vap->iv_bmissthreshold = 24; in iwi_vap_create()
515 ivp->iwi_newstate = vap->iv_newstate; in iwi_vap_create()
516 vap->iv_newstate = iwi_newstate; in iwi_vap_create()
521 ic->ic_opmode = opmode; in iwi_vap_create()
550 ring->count = count; in iwi_alloc_cmd_ring()
551 ring->queued = 0; in iwi_alloc_cmd_ring()
552 ring->cur = ring->next = 0; in iwi_alloc_cmd_ring()
554 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, in iwi_alloc_cmd_ring()
557 NULL, NULL, &ring->desc_dmat); in iwi_alloc_cmd_ring()
559 device_printf(sc->sc_dev, "could not create desc DMA tag\n"); in iwi_alloc_cmd_ring()
563 error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc, in iwi_alloc_cmd_ring()
564 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); in iwi_alloc_cmd_ring()
566 device_printf(sc->sc_dev, "could not allocate DMA memory\n"); in iwi_alloc_cmd_ring()
570 error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc, in iwi_alloc_cmd_ring()
571 count * IWI_CMD_DESC_SIZE, iwi_dma_map_addr, &ring->physaddr, 0); in iwi_alloc_cmd_ring()
573 device_printf(sc->sc_dev, "could not load desc DMA map\n"); in iwi_alloc_cmd_ring()
586 ring->queued = 0; in iwi_reset_cmd_ring()
587 ring->cur = ring->next = 0; in iwi_reset_cmd_ring()
593 if (ring->desc != NULL) { in iwi_free_cmd_ring()
594 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, in iwi_free_cmd_ring()
596 bus_dmamap_unload(ring->desc_dmat, ring->desc_map); in iwi_free_cmd_ring()
597 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map); in iwi_free_cmd_ring()
600 if (ring->desc_dmat != NULL) in iwi_free_cmd_ring()
601 bus_dma_tag_destroy(ring->desc_dmat); in iwi_free_cmd_ring()
610 ring->count = count; in iwi_alloc_tx_ring()
611 ring->queued = 0; in iwi_alloc_tx_ring()
612 ring->cur = ring->next = 0; in iwi_alloc_tx_ring()
613 ring->csr_ridx = csr_ridx; in iwi_alloc_tx_ring()
614 ring->csr_widx = csr_widx; in iwi_alloc_tx_ring()
616 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, in iwi_alloc_tx_ring()
619 NULL, &ring->desc_dmat); in iwi_alloc_tx_ring()
621 device_printf(sc->sc_dev, "could not create desc DMA tag\n"); in iwi_alloc_tx_ring()
625 error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc, in iwi_alloc_tx_ring()
626 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); in iwi_alloc_tx_ring()
628 device_printf(sc->sc_dev, "could not allocate DMA memory\n"); in iwi_alloc_tx_ring()
632 error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc, in iwi_alloc_tx_ring()
633 count * IWI_TX_DESC_SIZE, iwi_dma_map_addr, &ring->physaddr, 0); in iwi_alloc_tx_ring()
635 device_printf(sc->sc_dev, "could not load desc DMA map\n"); in iwi_alloc_tx_ring()
639 ring->data = malloc(count * sizeof (struct iwi_tx_data), M_DEVBUF, in iwi_alloc_tx_ring()
641 if (ring->data == NULL) { in iwi_alloc_tx_ring()
642 device_printf(sc->sc_dev, "could not allocate soft data\n"); in iwi_alloc_tx_ring()
647 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, in iwi_alloc_tx_ring()
649 IWI_MAX_NSEG, MCLBYTES, 0, NULL, NULL, &ring->data_dmat); in iwi_alloc_tx_ring()
651 device_printf(sc->sc_dev, "could not create data DMA tag\n"); in iwi_alloc_tx_ring()
656 error = bus_dmamap_create(ring->data_dmat, 0, in iwi_alloc_tx_ring()
657 &ring->data[i].map); in iwi_alloc_tx_ring()
659 device_printf(sc->sc_dev, "could not create DMA map\n"); in iwi_alloc_tx_ring()
676 for (i = 0; i < ring->count; i++) { in iwi_reset_tx_ring()
677 data = &ring->data[i]; in iwi_reset_tx_ring()
679 if (data->m != NULL) { in iwi_reset_tx_ring()
680 bus_dmamap_sync(ring->data_dmat, data->map, in iwi_reset_tx_ring()
682 bus_dmamap_unload(ring->data_dmat, data->map); in iwi_reset_tx_ring()
683 m_freem(data->m); in iwi_reset_tx_ring()
684 data->m = NULL; in iwi_reset_tx_ring()
687 if (data->ni != NULL) { in iwi_reset_tx_ring()
688 ieee80211_free_node(data->ni); in iwi_reset_tx_ring()
689 data->ni = NULL; in iwi_reset_tx_ring()
693 ring->queued = 0; in iwi_reset_tx_ring()
694 ring->cur = ring->next = 0; in iwi_reset_tx_ring()
703 if (ring->desc != NULL) { in iwi_free_tx_ring()
704 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, in iwi_free_tx_ring()
706 bus_dmamap_unload(ring->desc_dmat, ring->desc_map); in iwi_free_tx_ring()
707 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map); in iwi_free_tx_ring()
710 if (ring->desc_dmat != NULL) in iwi_free_tx_ring()
711 bus_dma_tag_destroy(ring->desc_dmat); in iwi_free_tx_ring()
713 if (ring->data != NULL) { in iwi_free_tx_ring()
714 for (i = 0; i < ring->count; i++) { in iwi_free_tx_ring()
715 data = &ring->data[i]; in iwi_free_tx_ring()
717 if (data->m != NULL) { in iwi_free_tx_ring()
718 bus_dmamap_sync(ring->data_dmat, data->map, in iwi_free_tx_ring()
720 bus_dmamap_unload(ring->data_dmat, data->map); in iwi_free_tx_ring()
721 m_freem(data->m); in iwi_free_tx_ring()
724 if (data->ni != NULL) in iwi_free_tx_ring()
725 ieee80211_free_node(data->ni); in iwi_free_tx_ring()
727 if (data->map != NULL) in iwi_free_tx_ring()
728 bus_dmamap_destroy(ring->data_dmat, data->map); in iwi_free_tx_ring()
731 free(ring->data, M_DEVBUF); in iwi_free_tx_ring()
734 if (ring->data_dmat != NULL) in iwi_free_tx_ring()
735 bus_dma_tag_destroy(ring->data_dmat); in iwi_free_tx_ring()
744 ring->count = count; in iwi_alloc_rx_ring()
745 ring->cur = 0; in iwi_alloc_rx_ring()
747 ring->data = malloc(count * sizeof (struct iwi_rx_data), M_DEVBUF, in iwi_alloc_rx_ring()
749 if (ring->data == NULL) { in iwi_alloc_rx_ring()
750 device_printf(sc->sc_dev, "could not allocate soft data\n"); in iwi_alloc_rx_ring()
755 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, in iwi_alloc_rx_ring()
757 1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat); in iwi_alloc_rx_ring()
759 device_printf(sc->sc_dev, "could not create data DMA tag\n"); in iwi_alloc_rx_ring()
764 data = &ring->data[i]; in iwi_alloc_rx_ring()
766 error = bus_dmamap_create(ring->data_dmat, 0, &data->map); in iwi_alloc_rx_ring()
768 device_printf(sc->sc_dev, "could not create DMA map\n"); in iwi_alloc_rx_ring()
772 data->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); in iwi_alloc_rx_ring()
773 if (data->m == NULL) { in iwi_alloc_rx_ring()
774 device_printf(sc->sc_dev, in iwi_alloc_rx_ring()
780 error = bus_dmamap_load(ring->data_dmat, data->map, in iwi_alloc_rx_ring()
781 mtod(data->m, void *), MCLBYTES, iwi_dma_map_addr, in iwi_alloc_rx_ring()
782 &data->physaddr, 0); in iwi_alloc_rx_ring()
784 device_printf(sc->sc_dev, in iwi_alloc_rx_ring()
789 data->reg = IWI_CSR_RX_BASE + i * 4; in iwi_alloc_rx_ring()
801 ring->cur = 0; in iwi_reset_rx_ring()
810 if (ring->data != NULL) { in iwi_free_rx_ring()
811 for (i = 0; i < ring->count; i++) { in iwi_free_rx_ring()
812 data = &ring->data[i]; in iwi_free_rx_ring()
814 if (data->m != NULL) { in iwi_free_rx_ring()
815 bus_dmamap_sync(ring->data_dmat, data->map, in iwi_free_rx_ring()
817 bus_dmamap_unload(ring->data_dmat, data->map); in iwi_free_rx_ring()
818 m_freem(data->m); in iwi_free_rx_ring()
821 if (data->map != NULL) in iwi_free_rx_ring()
822 bus_dmamap_destroy(ring->data_dmat, data->map); in iwi_free_rx_ring()
825 free(ring->data, M_DEVBUF); in iwi_free_rx_ring()
828 if (ring->data_dmat != NULL) in iwi_free_rx_ring()
829 bus_dma_tag_destroy(ring->data_dmat); in iwi_free_rx_ring()
847 struct ieee80211com *ic = &sc->sc_ic; in iwi_suspend()
857 struct ieee80211com *ic = &sc->sc_ic; in iwi_resume()
874 in->in_station = -1; in iwi_node_alloc()
876 return &in->in_node; in iwi_node_alloc()
882 struct ieee80211com *ic = ni->ni_ic; in iwi_node_free()
883 struct iwi_softc *sc = ic->ic_softc; in iwi_node_free()
886 if (in->in_station != -1) { in iwi_node_free()
888 ni->ni_macaddr, ":", in->in_station)); in iwi_node_free()
889 free_unr(sc->sc_unr, in->in_station); in iwi_node_free()
892 sc->sc_node_free(ni); in iwi_node_free()
926 struct ieee80211com *ic = vap->iv_ic; in iwi_media_status()
927 struct iwi_softc *sc = ic->ic_softc; in iwi_media_status()
931 ni = ieee80211_ref_node(vap->iv_bss); in iwi_media_status()
942 struct ieee80211com *ic = vap->iv_ic; in iwi_newstate()
943 struct iwi_softc *sc = ic->ic_softc; in iwi_newstate()
946 DPRINTF(("%s: %s -> %s flags 0x%x\n", __func__, in iwi_newstate()
947 ieee80211_state_name[vap->iv_state], in iwi_newstate()
948 ieee80211_state_name[nstate], sc->flags)); in iwi_newstate()
958 if (vap->iv_state == IEEE80211_S_RUN && in iwi_newstate()
959 (sc->flags & IWI_FLAG_FW_INITED)) in iwi_newstate()
966 if (vap->iv_opmode == IEEE80211_M_IBSS && in iwi_newstate()
967 vap->iv_state == IEEE80211_S_SCAN) { in iwi_newstate()
970 * with a SCAN -> RUN transition on scan complete. in iwi_newstate()
973 * AUTH -> RUN transition and we want to do nothing. in iwi_newstate()
977 } else if (vap->iv_opmode == IEEE80211_M_MONITOR) in iwi_newstate()
978 ieee80211_runtask(ic, &sc->sc_monitortask); in iwi_newstate()
986 if (vap->iv_state == IEEE80211_S_AUTH) in iwi_newstate()
995 return ivp->iwi_newstate(vap, nstate, arg); in iwi_newstate()
1016 #define IWI_EXP2(v) htole16((1 << (v)) - 1)
1025 memset(sc->wme, 0, sizeof sc->wme); in iwi_wme_init()
1029 sc->wme[1].aifsn[ac] = wmep->wmep_aifsn; in iwi_wme_init()
1030 sc->wme[1].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin); in iwi_wme_init()
1031 sc->wme[1].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax); in iwi_wme_init()
1032 sc->wme[1].burst[ac] = IWI_USEC(wmep->wmep_txopLimit); in iwi_wme_init()
1033 sc->wme[1].acm[ac] = wmep->wmep_acm; in iwi_wme_init()
1037 sc->wme[2].aifsn[ac] = wmep->wmep_aifsn; in iwi_wme_init()
1038 sc->wme[2].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin); in iwi_wme_init()
1039 sc->wme[2].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax); in iwi_wme_init()
1040 sc->wme[2].burst[ac] = IWI_USEC(wmep->wmep_txopLimit); in iwi_wme_init()
1041 sc->wme[2].acm[ac] = wmep->wmep_acm; in iwi_wme_init()
1048 struct ieee80211com *ic = &sc->sc_ic; in iwi_wme_setparams()
1058 sc->wme[0].aifsn[ac] = wmep->wmep_aifsn; in iwi_wme_setparams()
1059 sc->wme[0].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin); in iwi_wme_setparams()
1060 sc->wme[0].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax); in iwi_wme_setparams()
1061 sc->wme[0].burst[ac] = IWI_USEC(wmep->wmep_txopLimit); in iwi_wme_setparams()
1062 sc->wme[0].acm[ac] = wmep->wmep_acm; in iwi_wme_setparams()
1066 return iwi_cmd(sc, IWI_CMD_SET_WME_PARAMS, sc->wme, sizeof sc->wme); in iwi_wme_setparams()
1074 struct iwi_softc *sc = ic->ic_softc; in iwi_wme_update()
1075 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwi_wme_update()
1086 if (vap->iv_state == IEEE80211_S_RUN) { in iwi_wme_update()
1101 wme.wme_len = sizeof (struct ieee80211_wme_info) - 2; in iwi_wme_setie()
1140 /* write address A7-A0 */ in iwi_read_prom_word()
1141 for (n = 7; n >= 0; n--) { in iwi_read_prom_word()
1150 /* read data Q15-Q0 */ in iwi_read_prom_word()
1152 for (n = 15; n >= 0; n--) { in iwi_read_prom_word()
1172 struct ieee80211com *ic = &sc->sc_ic; in iwi_setcurchan()
1174 sc->curchan = chan; in iwi_setcurchan()
1182 struct ieee80211com *ic = &sc->sc_ic; in iwi_frame_intr()
1189 framelen = le16toh(frame->len); in iwi_frame_intr()
1199 le16toh(frame->len), frame->chan, frame->rssi, in iwi_frame_intr()
1200 frame->rssi_dbm)); in iwi_frame_intr()
1205 le16toh(frame->len), frame->chan, frame->rssi, frame->rssi_dbm)); in iwi_frame_intr()
1207 if (frame->chan != sc->curchan) in iwi_frame_intr()
1208 iwi_setcurchan(sc, frame->chan); in iwi_frame_intr()
1218 counter_u64_add(ic->ic_ierrors, 1); in iwi_frame_intr()
1222 bus_dmamap_unload(sc->rxq.data_dmat, data->map); in iwi_frame_intr()
1224 error = bus_dmamap_load(sc->rxq.data_dmat, data->map, in iwi_frame_intr()
1225 mtod(mnew, void *), MCLBYTES, iwi_dma_map_addr, &data->physaddr, in iwi_frame_intr()
1231 error = bus_dmamap_load(sc->rxq.data_dmat, data->map, in iwi_frame_intr()
1232 mtod(data->m, void *), MCLBYTES, iwi_dma_map_addr, in iwi_frame_intr()
1233 &data->physaddr, 0); in iwi_frame_intr()
1237 device_get_name(sc->sc_dev)); in iwi_frame_intr()
1239 counter_u64_add(ic->ic_ierrors, 1); in iwi_frame_intr()
1247 m = data->m; in iwi_frame_intr()
1248 data->m = mnew; in iwi_frame_intr()
1249 CSR_WRITE_4(sc, data->reg, data->physaddr); in iwi_frame_intr()
1252 m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) + in iwi_frame_intr()
1257 rssi = frame->rssi_dbm; in iwi_frame_intr()
1258 nf = -95; in iwi_frame_intr()
1260 struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap; in iwi_frame_intr()
1262 tap->wr_flags = 0; in iwi_frame_intr()
1263 tap->wr_antsignal = rssi; in iwi_frame_intr()
1264 tap->wr_antnoise = nf; in iwi_frame_intr()
1265 tap->wr_rate = iwi_cvtrate(frame->rate); in iwi_frame_intr()
1266 tap->wr_antenna = frame->antenna; in iwi_frame_intr()
1278 if (sc->sc_softled) { in iwi_frame_intr()
1281 * heartbeat-style blink when idle. The latter in iwi_frame_intr()
1286 sc->sc_rxrate = frame->rate; in iwi_frame_intr()
1288 } else if (ticks - sc->sc_ledevent >= sc->sc_ledidle) in iwi_frame_intr()
1305 #define SUBTYPE(wh) ((wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) in iwi_checkforqos()
1334 while (efrm - frm > 1) { in iwi_checkforqos()
1335 IEEE80211_VERIFY_LENGTH(efrm - frm, frm[1] + 2, return); in iwi_checkforqos()
1345 ni = ieee80211_ref_node(vap->iv_bss); in iwi_checkforqos()
1346 ni->ni_capinfo = capinfo; in iwi_checkforqos()
1347 ni->ni_associd = associd & 0x3fff; in iwi_checkforqos()
1349 ni->ni_flags |= IEEE80211_NODE_QOS; in iwi_checkforqos()
1351 ni->ni_flags &= ~IEEE80211_NODE_QOS; in iwi_checkforqos()
1362 len = le16toh(notif->len); in iwi_notif_link_quality()
1364 DPRINTFN(5, ("Notification (%u) - len=%d, sizeof=%zu\n", in iwi_notif_link_quality()
1365 notif->type, in iwi_notif_link_quality()
1373 notif->type, in iwi_notif_link_quality()
1379 memcpy(&sc->sc_linkqual, lq, sizeof(sc->sc_linkqual)); in iwi_notif_link_quality()
1380 sc->sc_linkqual_valid = 1; in iwi_notif_link_quality()
1390 struct ieee80211com *ic = &sc->sc_ic; in iwi_notification_intr()
1391 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwi_notification_intr()
1398 switch (notif->type) { in iwi_notification_intr()
1403 ieee80211_ieee2mhz(chan->nchan, 0), chan->nchan)); in iwi_notification_intr()
1406 sc->sc_state_timer = 3; in iwi_notification_intr()
1412 DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan, in iwi_notification_intr()
1413 scan->status)); in iwi_notification_intr()
1424 if (vap->iv_opmode == IEEE80211_M_MONITOR) { in iwi_notification_intr()
1425 ieee80211_runtask(ic, &sc->sc_monitortask); in iwi_notification_intr()
1429 if (scan->status == IWI_SCAN_COMPLETED) { in iwi_notification_intr()
1437 switch (auth->state) { in iwi_notification_intr()
1440 ieee80211_new_state(vap, IEEE80211_S_ASSOC, -1); in iwi_notification_intr()
1448 sc->flags &= ~IWI_FLAG_ASSOCIATED; in iwi_notification_intr()
1449 if (vap->iv_state != IEEE80211_S_RUN) { in iwi_notification_intr()
1451 vap->iv_stats.is_rx_auth_fail++; in iwi_notification_intr()
1455 vap->iv_stats.is_rx_deauth++; in iwi_notification_intr()
1457 ieee80211_new_state(vap, IEEE80211_S_SCAN, -1); in iwi_notification_intr()
1466 vap->iv_stats.is_rx_auth_fail++; in iwi_notification_intr()
1471 device_printf(sc->sc_dev, in iwi_notification_intr()
1472 "unknown authentication state %u\n", auth->state); in iwi_notification_intr()
1479 switch (assoc->state) { in iwi_notification_intr()
1481 /* re-association, do nothing */ in iwi_notification_intr()
1485 sc->flags |= IWI_FLAG_ASSOCIATED; in iwi_notification_intr()
1489 le16toh(notif->len) - sizeof(*assoc) - 1); in iwi_notification_intr()
1490 ieee80211_new_state(vap, IEEE80211_S_RUN, -1); in iwi_notification_intr()
1493 sc->flags &= ~IWI_FLAG_ASSOCIATED; in iwi_notification_intr()
1494 switch (sc->fw_state) { in iwi_notification_intr()
1498 ieee80211_new_state(vap, IEEE80211_S_SCAN, -1); in iwi_notification_intr()
1504 vap->iv_stats.is_rx_disassoc++; in iwi_notification_intr()
1505 ieee80211_new_state(vap, IEEE80211_S_SCAN, -1); in iwi_notification_intr()
1510 device_printf(sc->sc_dev, in iwi_notification_intr()
1511 "unknown association state %u\n", assoc->state); in iwi_notification_intr()
1521 beacon->state, le32toh(beacon->number))); in iwi_notification_intr()
1523 if (beacon->state == IWI_BEACON_MISS) { in iwi_notification_intr()
1531 if (le32toh(beacon->number) >= vap->iv_bmissthreshold) { in iwi_notification_intr()
1533 le32toh(beacon->number), in iwi_notification_intr()
1534 vap->iv_bmissthreshold)); in iwi_notification_intr()
1535 vap->iv_stats.is_beacon_miss++; in iwi_notification_intr()
1544 ieee80211_runtask(ic, &sc->sc_disassoctask); in iwi_notification_intr()
1552 DPRINTFN(5, ("Notification (%u)\n", notif->type)); in iwi_notification_intr()
1560 notif->type, notif->flags, le16toh(notif->len))); in iwi_notification_intr()
1574 for (; sc->rxq.cur != hw;) { in iwi_rx_intr()
1575 data = &sc->rxq.data[sc->rxq.cur]; in iwi_rx_intr()
1577 bus_dmamap_sync(sc->rxq.data_dmat, data->map, in iwi_rx_intr()
1580 hdr = mtod(data->m, struct iwi_hdr *); in iwi_rx_intr()
1582 switch (hdr->type) { in iwi_rx_intr()
1584 iwi_frame_intr(sc, data, sc->rxq.cur, in iwi_rx_intr()
1594 device_printf(sc->sc_dev, "unknown hdr type %u\n", in iwi_rx_intr()
1595 hdr->type); in iwi_rx_intr()
1598 DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur)); in iwi_rx_intr()
1600 sc->rxq.cur = (sc->rxq.cur + 1) % IWI_RX_RING_COUNT; in iwi_rx_intr()
1604 hw = (hw == 0) ? IWI_RX_RING_COUNT - 1 : hw - 1; in iwi_rx_intr()
1614 hw = CSR_READ_4(sc, txq->csr_ridx); in iwi_tx_intr()
1616 while (txq->next != hw) { in iwi_tx_intr()
1617 data = &txq->data[txq->next]; in iwi_tx_intr()
1618 DPRINTFN(15, ("tx done idx=%u\n", txq->next)); in iwi_tx_intr()
1619 bus_dmamap_sync(txq->data_dmat, data->map, in iwi_tx_intr()
1621 bus_dmamap_unload(txq->data_dmat, data->map); in iwi_tx_intr()
1622 ieee80211_tx_complete(data->ni, data->m, 0); in iwi_tx_intr()
1623 data->ni = NULL; in iwi_tx_intr()
1624 data->m = NULL; in iwi_tx_intr()
1625 txq->queued--; in iwi_tx_intr()
1626 txq->next = (txq->next + 1) % IWI_TX_RING_COUNT; in iwi_tx_intr()
1628 sc->sc_tx_timer = 0; in iwi_tx_intr()
1629 if (sc->sc_softled) in iwi_tx_intr()
1637 struct ieee80211com *ic = &sc->sc_ic; in iwi_fatal_error_intr()
1638 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwi_fatal_error_intr()
1640 device_printf(sc->sc_dev, "firmware error\n"); in iwi_fatal_error_intr()
1643 ieee80211_runtask(ic, &sc->sc_restarttask); in iwi_fatal_error_intr()
1645 sc->flags &= ~IWI_FLAG_BUSY; in iwi_fatal_error_intr()
1646 sc->sc_busy_timer = 0; in iwi_fatal_error_intr()
1654 ieee80211_runtask(&sc->sc_ic, &sc->sc_radiofftask); in iwi_radio_off_intr()
1688 sc->flags &= ~IWI_FLAG_BUSY; in iwi_intr()
1689 sc->sc_busy_timer = 0; in iwi_intr()
1694 iwi_tx_intr(sc, &sc->txq[0]); in iwi_intr()
1697 iwi_tx_intr(sc, &sc->txq[1]); in iwi_intr()
1700 iwi_tx_intr(sc, &sc->txq[2]); in iwi_intr()
1703 iwi_tx_intr(sc, &sc->txq[3]); in iwi_intr()
1709 /* XXX rate-limit */ in iwi_intr()
1710 device_printf(sc->sc_dev, "parity error\n"); in iwi_intr()
1723 if (sc->flags & IWI_FLAG_BUSY) { in iwi_cmd()
1724 device_printf(sc->sc_dev, "%s: cmd %d not sent, busy\n", in iwi_cmd()
1728 sc->flags |= IWI_FLAG_BUSY; in iwi_cmd()
1729 sc->sc_busy_timer = 2; in iwi_cmd()
1731 desc = &sc->cmdq.desc[sc->cmdq.cur]; in iwi_cmd()
1733 desc->hdr.type = IWI_HDR_TYPE_COMMAND; in iwi_cmd()
1734 desc->hdr.flags = IWI_HDR_FLAG_IRQ; in iwi_cmd()
1735 desc->type = type; in iwi_cmd()
1736 desc->len = len; in iwi_cmd()
1737 memcpy(desc->data, data, len); in iwi_cmd()
1739 bus_dmamap_sync(sc->cmdq.desc_dmat, sc->cmdq.desc_map, in iwi_cmd()
1742 DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur, in iwi_cmd()
1745 sc->cmdq.cur = (sc->cmdq.cur + 1) % IWI_CMD_RING_COUNT; in iwi_cmd()
1746 CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur); in iwi_cmd()
1748 return msleep(sc, &sc->sc_mtx, 0, "iwicmd", hz); in iwi_cmd()
1772 struct ieee80211vap *vap = ni->ni_vap; in iwi_tx_start()
1776 struct iwi_tx_ring *txq = &sc->txq[ac]; in iwi_tx_start()
1788 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in iwi_tx_start()
1793 if (vap->iv_flags & IEEE80211_F_SHPREAMBLE) in iwi_tx_start()
1805 if (vap->iv_opmode == IEEE80211_M_IBSS) { in iwi_tx_start()
1807 if (in->in_station == -1) { in iwi_tx_start()
1808 in->in_station = alloc_unr(sc->sc_unr); in iwi_tx_start()
1809 if (in->in_station == -1) { in iwi_tx_start()
1811 if_inc_counter(ni->ni_vap->iv_ifp, in iwi_tx_start()
1818 ni->ni_macaddr, in->in_station); in iwi_tx_start()
1820 staid = in->in_station; in iwi_tx_start()
1830 if (!IEEE80211_ADDR_EQ(wh->i_addr1, sc->sc_mcast)) { in iwi_tx_start()
1831 IEEE80211_ADDR_COPY(sc->sc_mcast, wh->i_addr1); in iwi_tx_start()
1832 iwi_write_ibssnode(sc, sc->sc_mcast, 0); in iwi_tx_start()
1839 ieee80211_output_seqno_assign(ni, -1, m0); in iwi_tx_start()
1841 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in iwi_tx_start()
1853 struct iwi_tx_radiotap_header *tap = &sc->sc_txtap; in iwi_tx_start()
1855 tap->wt_flags = 0; in iwi_tx_start()
1860 data = &txq->data[txq->cur]; in iwi_tx_start()
1861 desc = &txq->desc[txq->cur]; in iwi_tx_start()
1864 m_copydata(m0, 0, hdrlen, (caddr_t)&desc->wh); in iwi_tx_start()
1867 error = bus_dmamap_load_mbuf_sg(txq->data_dmat, data->map, m0, segs, in iwi_tx_start()
1870 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n", in iwi_tx_start()
1878 device_printf(sc->sc_dev, in iwi_tx_start()
1885 error = bus_dmamap_load_mbuf_sg(txq->data_dmat, data->map, in iwi_tx_start()
1888 device_printf(sc->sc_dev, in iwi_tx_start()
1895 data->m = m0; in iwi_tx_start()
1896 data->ni = ni; in iwi_tx_start()
1898 desc->hdr.type = IWI_HDR_TYPE_DATA; in iwi_tx_start()
1899 desc->hdr.flags = IWI_HDR_FLAG_IRQ; in iwi_tx_start()
1900 desc->station = staid; in iwi_tx_start()
1901 desc->cmd = IWI_DATA_CMD_TX; in iwi_tx_start()
1902 desc->len = htole16(m0->m_pkthdr.len); in iwi_tx_start()
1903 desc->flags = flags; in iwi_tx_start()
1904 desc->xflags = xflags; in iwi_tx_start()
1907 if (vap->iv_flags & IEEE80211_F_PRIVACY) in iwi_tx_start()
1908 desc->wep_txkey = vap->iv_def_txkey; in iwi_tx_start()
1911 desc->flags |= IWI_DATA_FLAG_NO_WEP; in iwi_tx_start()
1913 desc->nseg = htole32(nsegs); in iwi_tx_start()
1915 desc->seg_addr[i] = htole32(segs[i].ds_addr); in iwi_tx_start()
1916 desc->seg_len[i] = htole16(segs[i].ds_len); in iwi_tx_start()
1919 bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE); in iwi_tx_start()
1920 bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_PREWRITE); in iwi_tx_start()
1923 ac, txq->cur, le16toh(desc->len), nsegs)); in iwi_tx_start()
1925 txq->queued++; in iwi_tx_start()
1926 txq->cur = (txq->cur + 1) % IWI_TX_RING_COUNT; in iwi_tx_start()
1927 CSR_WRITE_4(sc, txq->csr_widx, txq->cur); in iwi_tx_start()
1945 struct iwi_softc *sc = ic->ic_softc; in iwi_transmit()
1950 if (!sc->sc_running) { in iwi_transmit()
1954 error = mbufq_enqueue(&sc->sc_snd, m); in iwi_transmit()
1973 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in iwi_start()
1975 if (sc->txq[ac].queued > IWI_TX_RING_COUNT - 8) { in iwi_start()
1978 mbufq_prepend(&sc->sc_snd, m); in iwi_start()
1981 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; in iwi_start()
1983 if_inc_counter(ni->ni_vap->iv_ifp, in iwi_start()
1988 sc->sc_tx_timer = 5; in iwi_start()
1996 struct ieee80211com *ic = &sc->sc_ic; in iwi_watchdog()
2000 if (sc->sc_tx_timer > 0) { in iwi_watchdog()
2001 if (--sc->sc_tx_timer == 0) { in iwi_watchdog()
2002 device_printf(sc->sc_dev, "device timeout\n"); in iwi_watchdog()
2003 counter_u64_add(ic->ic_oerrors, 1); in iwi_watchdog()
2004 ieee80211_runtask(ic, &sc->sc_restarttask); in iwi_watchdog()
2007 if (sc->sc_state_timer > 0) { in iwi_watchdog()
2008 if (--sc->sc_state_timer == 0) { in iwi_watchdog()
2009 device_printf(sc->sc_dev, in iwi_watchdog()
2011 sc->fw_state); in iwi_watchdog()
2012 if (sc->fw_state == IWI_FW_SCANNING) in iwi_watchdog()
2013 ieee80211_cancel_scan(TAILQ_FIRST(&ic->ic_vaps)); in iwi_watchdog()
2014 ieee80211_runtask(ic, &sc->sc_restarttask); in iwi_watchdog()
2015 sc->sc_state_timer = 3; in iwi_watchdog()
2018 if (sc->sc_busy_timer > 0) { in iwi_watchdog()
2019 if (--sc->sc_busy_timer == 0) { in iwi_watchdog()
2020 device_printf(sc->sc_dev, in iwi_watchdog()
2022 ieee80211_runtask(ic, &sc->sc_restarttask); in iwi_watchdog()
2025 callout_reset(&sc->sc_wdtimer, hz, iwi_watchdog, sc); in iwi_watchdog()
2031 struct iwi_softc *sc = ic->ic_softc; in iwi_parent()
2036 if (ic->ic_nrunning > 0) { in iwi_parent()
2037 if (!sc->sc_running) { in iwi_parent()
2041 } else if (sc->sc_running) in iwi_parent()
2052 struct iwi_softc *sc = ic->ic_softc; in iwi_ioctl()
2060 error = copyout(&sc->sc_linkqual, ifr_data_get_ptr(ifr), in iwi_ioctl()
2064 memset(&sc->sc_linkqual, 0, in iwi_ioctl()
2093 device_printf(sc->sc_dev, "timeout waiting for master\n"); in iwi_stop_master()
2098 sc->flags &= ~IWI_FLAG_FW_INITED; in iwi_stop_master()
2121 device_printf(sc->sc_dev, in iwi_reset()
2145 const struct firmware *fp = fw->fp; in iwi_setup_ofw()
2148 if (fp->datasize < sizeof (struct iwi_firmware_ohdr)) { in iwi_setup_ofw()
2149 device_printf(sc->sc_dev, "image '%s' too small\n", fp->name); in iwi_setup_ofw()
2152 hdr = (const struct iwi_firmware_ohdr *)fp->data; in iwi_setup_ofw()
2153 if ((IWI_FW_GET_MAJOR(le32toh(hdr->version)) != IWI_FW_REQ_MAJOR) || in iwi_setup_ofw()
2154 (IWI_FW_GET_MINOR(le32toh(hdr->version)) != IWI_FW_REQ_MINOR)) { in iwi_setup_ofw()
2155 device_printf(sc->sc_dev, "version for '%s' %d.%d != %d.%d\n", in iwi_setup_ofw()
2156 fp->name, IWI_FW_GET_MAJOR(le32toh(hdr->version)), in iwi_setup_ofw()
2157 IWI_FW_GET_MINOR(le32toh(hdr->version)), IWI_FW_REQ_MAJOR, in iwi_setup_ofw()
2161 fw->data = ((const char *) fp->data) + sizeof(struct iwi_firmware_ohdr); in iwi_setup_ofw()
2162 fw->size = fp->datasize - sizeof(struct iwi_firmware_ohdr); in iwi_setup_ofw()
2163 fw->name = fp->name; in iwi_setup_ofw()
2173 if (hdr != NULL && le32toh(hdr->mode) != IWI_FW_MODE_UCODE) { in iwi_setup_oucode()
2174 device_printf(sc->sc_dev, "%s is not a ucode image\n", in iwi_setup_oucode()
2175 fw->name); in iwi_setup_oucode()
2185 if (fw->fp == NULL) in iwi_getfw()
2186 fw->fp = firmware_get(fwname); in iwi_getfw()
2187 /* NB: pre-3.0 ucode is packaged separately */ in iwi_getfw()
2188 if (uc->fp == NULL && fw->fp != NULL && fw->fp->version < 300) in iwi_getfw()
2189 uc->fp = firmware_get(ucname); in iwi_getfw()
2196 * This is necessary because we re-init the device sometimes
2198 * (e.g. from the taskqueue thread when rfkill is re-enabled).
2213 if (sc->fw_mode != opmode) in iwi_get_firmware()
2218 iwi_getfw(&sc->fw_fw, "iwi_bss", &sc->fw_uc, "iwi_ucode_bss"); in iwi_get_firmware()
2221 iwi_getfw(&sc->fw_fw, "iwi_ibss", &sc->fw_uc, "iwi_ucode_ibss"); in iwi_get_firmware()
2224 iwi_getfw(&sc->fw_fw, "iwi_monitor", in iwi_get_firmware()
2225 &sc->fw_uc, "iwi_ucode_monitor"); in iwi_get_firmware()
2228 device_printf(sc->sc_dev, "unknown opmode %d\n", opmode); in iwi_get_firmware()
2231 fp = sc->fw_fw.fp; in iwi_get_firmware()
2233 device_printf(sc->sc_dev, "could not load firmware\n"); in iwi_get_firmware()
2236 if (fp->version < 300) { in iwi_get_firmware()
2244 * safeguard against mis-packaging. in iwi_get_firmware()
2246 if (sc->fw_uc.fp == NULL) { in iwi_get_firmware()
2247 device_printf(sc->sc_dev, "could not load ucode\n"); in iwi_get_firmware()
2250 if (sc->fw_boot.fp == NULL) { in iwi_get_firmware()
2251 sc->fw_boot.fp = firmware_get("iwi_boot"); in iwi_get_firmware()
2252 if (sc->fw_boot.fp == NULL) { in iwi_get_firmware()
2253 device_printf(sc->sc_dev, in iwi_get_firmware()
2258 if (sc->fw_boot.fp->version != sc->fw_fw.fp->version || in iwi_get_firmware()
2259 sc->fw_boot.fp->version != sc->fw_uc.fp->version) { in iwi_get_firmware()
2260 device_printf(sc->sc_dev, in iwi_get_firmware()
2263 sc->fw_boot.fp->name, sc->fw_boot.fp->version, in iwi_get_firmware()
2264 sc->fw_uc.fp->name, sc->fw_uc.fp->version, in iwi_get_firmware()
2265 sc->fw_fw.fp->name, sc->fw_fw.fp->version in iwi_get_firmware()
2272 if (iwi_setup_oucode(sc, &sc->fw_uc) == NULL || in iwi_get_firmware()
2273 iwi_setup_ofw(sc, &sc->fw_boot) == NULL || in iwi_get_firmware()
2274 iwi_setup_ofw(sc, &sc->fw_fw) == NULL) in iwi_get_firmware()
2280 if (fp->datasize < sizeof(struct iwi_firmware_hdr)) { in iwi_get_firmware()
2281 device_printf(sc->sc_dev, "image '%s' too small\n", in iwi_get_firmware()
2282 fp->name); in iwi_get_firmware()
2285 hdr = (const struct iwi_firmware_hdr *)fp->data; in iwi_get_firmware()
2286 if (fp->datasize < sizeof(*hdr) + le32toh(hdr->bsize) + le32toh(hdr->usize) in iwi_get_firmware()
2287 + le32toh(hdr->fsize)) { in iwi_get_firmware()
2288 device_printf(sc->sc_dev, "image '%s' too small (2)\n", in iwi_get_firmware()
2289 fp->name); in iwi_get_firmware()
2292 sc->fw_boot.data = ((const char *) fp->data) + sizeof(*hdr); in iwi_get_firmware()
2293 sc->fw_boot.size = le32toh(hdr->bsize); in iwi_get_firmware()
2294 sc->fw_boot.name = fp->name; in iwi_get_firmware()
2295 sc->fw_uc.data = sc->fw_boot.data + sc->fw_boot.size; in iwi_get_firmware()
2296 sc->fw_uc.size = le32toh(hdr->usize); in iwi_get_firmware()
2297 sc->fw_uc.name = fp->name; in iwi_get_firmware()
2298 sc->fw_fw.data = sc->fw_uc.data + sc->fw_uc.size; in iwi_get_firmware()
2299 sc->fw_fw.size = le32toh(hdr->fsize); in iwi_get_firmware()
2300 sc->fw_fw.name = fp->name; in iwi_get_firmware()
2303 device_printf(sc->sc_dev, "boot %d ucode %d fw %d bytes\n", in iwi_get_firmware()
2304 sc->fw_boot.size, sc->fw_uc.size, sc->fw_fw.size); in iwi_get_firmware()
2307 sc->fw_mode = opmode; in iwi_get_firmware()
2317 if (fw->fp != NULL) { in iwi_put_fw()
2318 firmware_put(fw->fp, FIRMWARE_UNLOAD); in iwi_put_fw()
2319 fw->fp = NULL; in iwi_put_fw()
2321 fw->data = NULL; in iwi_put_fw()
2322 fw->size = 0; in iwi_put_fw()
2323 fw->name = NULL; in iwi_put_fw()
2332 iwi_put_fw(&sc->fw_uc); in iwi_put_firmware()
2333 iwi_put_fw(&sc->fw_fw); in iwi_put_firmware()
2334 iwi_put_fw(&sc->fw_boot); in iwi_put_firmware()
2342 const char *uc = fw->data; in iwi_load_ucode()
2343 size_t size = fw->size; in iwi_load_ucode()
2356 device_printf(sc->sc_dev, "timeout waiting for master\n"); in iwi_load_ucode()
2380 for (w = (const uint16_t *)uc; size > 0; w++, size -= 2) in iwi_load_ucode()
2393 device_printf(sc->sc_dev, in iwi_load_ucode()
2422 memcpy(sc->fw_virtaddr, fw->data, fw->size); in iwi_load_firmware()
2424 /* make sure the adapter will get up-to-date values */ in iwi_load_firmware()
2425 bus_dmamap_sync(sc->fw_dmat, sc->fw_map, BUS_DMASYNC_PREWRITE); in iwi_load_firmware()
2435 src = sc->fw_physaddr; in iwi_load_firmware()
2436 p = sc->fw_virtaddr; in iwi_load_firmware()
2437 end = p + fw->size; in iwi_load_firmware()
2459 len -= mlen; in iwi_load_firmware()
2481 bus_dmamap_sync(sc->fw_dmat, sc->fw_map, BUS_DMASYNC_POSTWRITE); in iwi_load_firmware()
2483 device_printf(sc->sc_dev, in iwi_load_firmware()
2485 fw->name); in iwi_load_firmware()
2502 if ((error = msleep(sc, &sc->sc_mtx, 0, "iwiinit", hz)) != 0) { in iwi_load_firmware()
2503 device_printf(sc->sc_dev, "timeout waiting for %s firmware " in iwi_load_firmware()
2504 "initialization to complete\n", fw->name); in iwi_load_firmware()
2515 if (vap->iv_flags & IEEE80211_F_PMGTON) { in iwi_setpowermode()
2516 /* XXX set more fine-grained operation */ in iwi_setpowermode()
2533 wk = &vap->iv_nw_keys[i]; in iwi_setwepkeys()
2537 wepkey.len = wk->wk_keylen; in iwi_setwepkeys()
2539 memcpy(wepkey.key, wk->wk_key, wk->wk_keylen); in iwi_setwepkeys()
2559 rs.nrates = net_rs->rs_nrates; in iwi_set_rateset()
2565 memcpy(rs.rates, net_rs->rs_rates, rs.nrates); in iwi_set_rateset()
2578 struct ieee80211com *ic = &sc->sc_ic; in iwi_config()
2579 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in iwi_config()
2588 macaddr = vap ? vap->iv_myaddr : ic->ic_macaddr; in iwi_config()
2596 config.bluetooth_coexistence = sc->bluetooth; in iwi_config()
2598 config.antenna = sc->antenna; in iwi_config()
2600 config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0; in iwi_config()
2603 if (ic->ic_opmode == IEEE80211_M_MONITOR) { in iwi_config()
2612 if (ic->ic_opmode == IEEE80211_M_IBSS) { in iwi_config()
2631 error = iwi_set_rateset(sc, &ic->ic_sup_rates[IEEE80211_MODE_11G], in iwi_config()
2636 error = iwi_set_rateset(sc, &ic->ic_sup_rates[IEEE80211_MODE_11A], in iwi_config()
2655 uint8_t *st = &scan->scan_type[ix / 2]; in set_scan_type()
2667 if (ss->ss_nssid != 0) in scan_type()
2669 if ((ss->ss_flags & IEEE80211_SCAN_ACTIVE) && in scan_type()
2670 (chan->ic_flags & IEEE80211_CHAN_PASSIVE) == 0) in scan_type()
2698 struct ieee80211com *ic = &sc->sc_ic; in iwi_scanchan()
2705 if (sc->fw_state == IWI_FW_SCANNING) { in iwi_scanchan()
2710 DPRINTF(("%s: called too early - still scanning\n", __func__)); in iwi_scanchan()
2715 ss = ic->ic_scan; in iwi_scanchan()
2718 scan.full_scan_index = htole32(++sc->sc_scangen); in iwi_scanchan()
2720 if (ic->ic_flags_ext & IEEE80211_FEXT_BGSCAN) { in iwi_scanchan()
2724 * be handled with early-termination as done by net80211 but in iwi_scanchan()
2735 if (ss->ss_nssid != 0) { in iwi_scanchan()
2736 error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ss->ss_ssid[0].ssid, in iwi_scanchan()
2737 ss->ss_ssid[0].len); in iwi_scanchan()
2745 * Convert scan list to run-length encoded channel list in iwi_scanchan()
2752 band = -1; /* NB: impossible value */ in iwi_scanchan()
2753 KASSERT(ss->ss_last > 0, ("no channels")); in iwi_scanchan()
2754 for (i = 0; i < ss->ss_last; i++) { in iwi_scanchan()
2755 chan = ss->ss_chans[i]; in iwi_scanchan()
2758 if (band != -1) in iwi_scanchan()
2760 (next - bstart) | band; in iwi_scanchan()
2761 /* NB: this allocates a slot for the run-len */ in iwi_scanchan()
2772 scan.channels[bstart] = (next - bstart) | band; in iwi_scanchan()
2775 chan = ic->ic_curchan; in iwi_scanchan()
2798 for (run &= 0x3f, i++; run > 0; run--, i++) { in iwi_scanchan()
2814 struct iwi_sensitivity sens; in iwi_set_sensitivity() local
2818 memset(&sens, 0, sizeof sens); in iwi_set_sensitivity()
2819 sens.rssi = htole16(rssi_dbm); in iwi_set_sensitivity()
2820 return iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &sens, sizeof sens); in iwi_set_sensitivity()
2826 struct ieee80211com *ic = vap->iv_ic; in iwi_auth_and_assoc()
2827 if_t ifp = vap->iv_ifp; in iwi_auth_and_assoc()
2830 struct iwi_associate *assoc = &sc->assoc; in iwi_auth_and_assoc()
2837 if (sc->flags & IWI_FLAG_ASSOCIATED) { in iwi_auth_and_assoc()
2839 return (-1); in iwi_auth_and_assoc()
2842 ni = ieee80211_ref_node(vap->iv_bss); in iwi_auth_and_assoc()
2848 if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) in iwi_auth_and_assoc()
2850 else if (IEEE80211_IS_CHAN_G(ic->ic_curchan)) in iwi_auth_and_assoc()
2852 if (IEEE80211_IS_CHAN_B(ic->ic_curchan)) in iwi_auth_and_assoc()
2855 if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) { in iwi_auth_and_assoc()
2857 config.bluetooth_coexistence = sc->bluetooth; in iwi_auth_and_assoc()
2858 config.antenna = sc->antenna; in iwi_auth_and_assoc()
2863 (vap->iv_opmode == IEEE80211_M_IBSS) ? 1 : 0; in iwi_auth_and_assoc()
2875 ieee80211_print_essid(ni->ni_essid, ni->ni_esslen); in iwi_auth_and_assoc()
2879 error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen); in iwi_auth_and_assoc()
2887 data = htole32(vap->iv_rtsthreshold); in iwi_auth_and_assoc()
2893 data = htole32(vap->iv_fragthreshold); in iwi_auth_and_assoc()
2900 error = iwi_set_rateset(sc, &ni->ni_rates, mode, in iwi_auth_and_assoc()
2907 if ((vap->iv_flags & IEEE80211_F_WME) && ni->ni_ies.wme_ie != NULL) { in iwi_auth_and_assoc()
2910 assoc->policy |= htole16(IWI_POLICY_WME); in iwi_auth_and_assoc()
2914 if (vap->iv_appie_wpa != NULL) { in iwi_auth_and_assoc()
2915 struct ieee80211_appie *ie = vap->iv_appie_wpa; in iwi_auth_and_assoc()
2917 DPRINTF(("Setting optional IE (len=%u)\n", ie->ie_len)); in iwi_auth_and_assoc()
2918 error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ie->ie_data, ie->ie_len); in iwi_auth_and_assoc()
2923 error = iwi_set_sensitivity(sc, ic->ic_node_getrssi(ni)); in iwi_auth_and_assoc()
2927 assoc->mode = mode; in iwi_auth_and_assoc()
2928 assoc->chan = ic->ic_curchan->ic_ieee; in iwi_auth_and_assoc()
2933 if ((vap->iv_flags & IEEE80211_F_PRIVACY) && in iwi_auth_and_assoc()
2934 ni->ni_authmode == IEEE80211_AUTH_SHARED) { in iwi_auth_and_assoc()
2935 assoc->auth = IWI_AUTH_SHARED; in iwi_auth_and_assoc()
2942 if (vap->iv_def_txkey != IEEE80211_KEYIX_NONE) in iwi_auth_and_assoc()
2943 assoc->auth |= vap->iv_def_txkey << 4; in iwi_auth_and_assoc()
2949 if (vap->iv_flags & IEEE80211_F_WPA) in iwi_auth_and_assoc()
2950 assoc->policy |= htole16(IWI_POLICY_WPA); in iwi_auth_and_assoc()
2951 if (vap->iv_opmode == IEEE80211_M_IBSS && ni->ni_tstamp.tsf == 0) in iwi_auth_and_assoc()
2952 assoc->type = IWI_HC_IBSS_START; in iwi_auth_and_assoc()
2954 assoc->type = IWI_HC_ASSOC; in iwi_auth_and_assoc()
2955 memcpy(assoc->tstamp, ni->ni_tstamp.data, 8); in iwi_auth_and_assoc()
2957 if (vap->iv_opmode == IEEE80211_M_IBSS) in iwi_auth_and_assoc()
2961 if (vap->iv_flags & IEEE80211_F_PRIVACY) in iwi_auth_and_assoc()
2963 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && in iwi_auth_and_assoc()
2964 IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) in iwi_auth_and_assoc()
2966 if (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_SLOTTIME) in iwi_auth_and_assoc()
2968 assoc->capinfo = htole16(capinfo); in iwi_auth_and_assoc()
2970 assoc->lintval = htole16(ic->ic_lintval); in iwi_auth_and_assoc()
2971 assoc->intval = htole16(ni->ni_intval); in iwi_auth_and_assoc()
2972 IEEE80211_ADDR_COPY(assoc->bssid, ni->ni_bssid); in iwi_auth_and_assoc()
2973 if (vap->iv_opmode == IEEE80211_M_IBSS) in iwi_auth_and_assoc()
2974 IEEE80211_ADDR_COPY(assoc->dst, if_getbroadcastaddr(ifp)); in iwi_auth_and_assoc()
2976 IEEE80211_ADDR_COPY(assoc->dst, ni->ni_bssid); in iwi_auth_and_assoc()
2980 assoc->type == IWI_HC_IBSS_START ? "Start" : "Join", in iwi_auth_and_assoc()
2981 assoc->bssid, ":", assoc->dst, ":", in iwi_auth_and_assoc()
2982 assoc->chan, le16toh(assoc->policy), assoc->auth, in iwi_auth_and_assoc()
2983 le16toh(assoc->capinfo), le16toh(assoc->lintval), in iwi_auth_and_assoc()
2984 le16toh(assoc->intval))); in iwi_auth_and_assoc()
3008 struct iwi_associate *assoc = &sc->assoc; in iwi_disassociate()
3010 if ((sc->flags & IWI_FLAG_ASSOCIATED) == 0) { in iwi_disassociate()
3012 return (-1); in iwi_disassociate()
3018 assoc->type = IWI_HC_DISASSOC_QUIET; in iwi_disassociate()
3020 assoc->type = IWI_HC_DISASSOC; in iwi_disassociate()
3023 assoc->bssid, ":", assoc->chan)); in iwi_disassociate()
3033 if (sc->fw_flags & IWI_FW_HAVE_PHY) in iwi_release_fw_dma()
3034 bus_dmamap_unload(sc->fw_dmat, sc->fw_map); in iwi_release_fw_dma()
3035 if (sc->fw_flags & IWI_FW_HAVE_MAP) in iwi_release_fw_dma()
3036 bus_dmamem_free(sc->fw_dmat, sc->fw_virtaddr, sc->fw_map); in iwi_release_fw_dma()
3037 if (sc->fw_flags & IWI_FW_HAVE_DMAT) in iwi_release_fw_dma()
3038 bus_dma_tag_destroy(sc->fw_dmat); in iwi_release_fw_dma()
3040 sc->fw_flags = 0; in iwi_release_fw_dma()
3041 sc->fw_dma_size = 0; in iwi_release_fw_dma()
3042 sc->fw_dmat = NULL; in iwi_release_fw_dma()
3043 sc->fw_map = NULL; in iwi_release_fw_dma()
3044 sc->fw_physaddr = 0; in iwi_release_fw_dma()
3045 sc->fw_virtaddr = NULL; in iwi_release_fw_dma()
3056 if (sc->fw_dma_size >= size) in iwi_init_fw_dma()
3058 if (bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, in iwi_init_fw_dma()
3060 size, 1, size, 0, NULL, NULL, &sc->fw_dmat) != 0) { in iwi_init_fw_dma()
3061 device_printf(sc->sc_dev, in iwi_init_fw_dma()
3065 sc->fw_flags |= IWI_FW_HAVE_DMAT; in iwi_init_fw_dma()
3066 if (bus_dmamem_alloc(sc->fw_dmat, &sc->fw_virtaddr, 0, in iwi_init_fw_dma()
3067 &sc->fw_map) != 0) { in iwi_init_fw_dma()
3068 device_printf(sc->sc_dev, in iwi_init_fw_dma()
3072 sc->fw_flags |= IWI_FW_HAVE_MAP; in iwi_init_fw_dma()
3073 if (bus_dmamap_load(sc->fw_dmat, sc->fw_map, sc->fw_virtaddr, in iwi_init_fw_dma()
3074 size, iwi_dma_map_addr, &sc->fw_physaddr, 0) != 0) { in iwi_init_fw_dma()
3075 device_printf(sc->sc_dev, "could not load firmware DMA map\n"); in iwi_init_fw_dma()
3078 sc->fw_flags |= IWI_FW_HAVE_PHY; in iwi_init_fw_dma()
3079 sc->fw_dma_size = size; in iwi_init_fw_dma()
3095 if (sc->fw_state == IWI_FW_LOADING) { in iwi_init_locked()
3096 device_printf(sc->sc_dev, "%s: already loading\n", __func__); in iwi_init_locked()
3105 device_printf(sc->sc_dev, "could not reset adapter\n"); in iwi_init_locked()
3108 if (iwi_load_firmware(sc, &sc->fw_boot) != 0) { in iwi_init_locked()
3109 device_printf(sc->sc_dev, in iwi_init_locked()
3110 "could not load boot firmware %s\n", sc->fw_boot.name); in iwi_init_locked()
3113 if (iwi_load_ucode(sc, &sc->fw_uc) != 0) { in iwi_init_locked()
3114 device_printf(sc->sc_dev, in iwi_init_locked()
3115 "could not load microcode %s\n", sc->fw_uc.name); in iwi_init_locked()
3121 CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.physaddr); in iwi_init_locked()
3122 CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count); in iwi_init_locked()
3123 CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur); in iwi_init_locked()
3125 CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq[0].physaddr); in iwi_init_locked()
3126 CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq[0].count); in iwi_init_locked()
3127 CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq[0].cur); in iwi_init_locked()
3129 CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq[1].physaddr); in iwi_init_locked()
3130 CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq[1].count); in iwi_init_locked()
3131 CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq[1].cur); in iwi_init_locked()
3133 CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq[2].physaddr); in iwi_init_locked()
3134 CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq[2].count); in iwi_init_locked()
3135 CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq[2].cur); in iwi_init_locked()
3137 CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq[3].physaddr); in iwi_init_locked()
3138 CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq[3].count); in iwi_init_locked()
3139 CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq[3].cur); in iwi_init_locked()
3141 for (i = 0; i < sc->rxq.count; i++) { in iwi_init_locked()
3142 data = &sc->rxq.data[i]; in iwi_init_locked()
3143 CSR_WRITE_4(sc, data->reg, data->physaddr); in iwi_init_locked()
3146 CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count - 1); in iwi_init_locked()
3148 if (iwi_load_firmware(sc, &sc->fw_fw) != 0) { in iwi_init_locked()
3149 device_printf(sc->sc_dev, in iwi_init_locked()
3150 "could not load main firmware %s\n", sc->fw_fw.name); in iwi_init_locked()
3153 sc->flags |= IWI_FLAG_FW_INITED; in iwi_init_locked()
3158 device_printf(sc->sc_dev, "unable to enable adapter\n"); in iwi_init_locked()
3162 callout_reset(&sc->sc_wdtimer, hz, iwi_watchdog, sc); in iwi_init_locked()
3163 sc->sc_running = 1; in iwi_init_locked()
3175 struct ieee80211com *ic = &sc->sc_ic; in iwi_init()
3182 if (sc->sc_running) in iwi_init()
3193 sc->sc_running = 0; in iwi_stop_locked()
3195 if (sc->sc_softled) { in iwi_stop_locked()
3196 callout_stop(&sc->sc_ledtimer); in iwi_stop_locked()
3197 sc->sc_blinking = 0; in iwi_stop_locked()
3199 callout_stop(&sc->sc_wdtimer); in iwi_stop_locked()
3200 callout_stop(&sc->sc_rftimer); in iwi_stop_locked()
3207 iwi_reset_cmd_ring(sc, &sc->cmdq); in iwi_stop_locked()
3208 iwi_reset_tx_ring(sc, &sc->txq[0]); in iwi_stop_locked()
3209 iwi_reset_tx_ring(sc, &sc->txq[1]); in iwi_stop_locked()
3210 iwi_reset_tx_ring(sc, &sc->txq[2]); in iwi_stop_locked()
3211 iwi_reset_tx_ring(sc, &sc->txq[3]); in iwi_stop_locked()
3212 iwi_reset_rx_ring(sc, &sc->rxq); in iwi_stop_locked()
3214 sc->sc_tx_timer = 0; in iwi_stop_locked()
3215 sc->sc_state_timer = 0; in iwi_stop_locked()
3216 sc->sc_busy_timer = 0; in iwi_stop_locked()
3217 sc->flags &= ~(IWI_FLAG_BUSY | IWI_FLAG_ASSOCIATED); in iwi_stop_locked()
3218 sc->fw_state = IWI_FW_IDLE; in iwi_stop_locked()
3254 struct ieee80211com *ic = &sc->sc_ic; in iwi_radio_on()
3256 device_printf(sc->sc_dev, "radio turned on\n"); in iwi_radio_on()
3275 ieee80211_runtask(&sc->sc_ic, &sc->sc_radiontask); in iwi_rfkill_poll()
3278 callout_reset(&sc->sc_rftimer, 2*hz, iwi_rfkill_poll, sc); in iwi_rfkill_poll()
3285 struct ieee80211com *ic = &sc->sc_ic; in iwi_radio_off()
3288 device_printf(sc->sc_dev, "radio turned off\n"); in iwi_radio_off()
3306 if (!(sc->flags & IWI_FLAG_FW_INITED)) in iwi_sysctl_stats()
3309 size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1); in iwi_sysctl_stats()
3330 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev); in iwi_sysctlattach()
3331 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev); in iwi_sysctlattach()
3342 sc->bluetooth = 0; in iwi_sysctlattach()
3344 CTLFLAG_RW, &sc->bluetooth, 0, "bluetooth coexistence"); in iwi_sysctlattach()
3346 sc->antenna = IWI_ANTENNA_AUTO; in iwi_sysctlattach()
3348 CTLFLAG_RW, &sc->antenna, 0, "antenna (0=auto)"); in iwi_sysctlattach()
3385 sc->sc_blinking = 0; in iwi_led_done()
3399 v &= ~sc->sc_ledpin; in iwi_led_off()
3401 callout_reset(&sc->sc_ledtimer, sc->sc_ledoff, iwi_led_done, sc); in iwi_led_off()
3413 v |= sc->sc_ledpin; in iwi_led_blink()
3415 sc->sc_blinking = 1; in iwi_led_blink()
3416 sc->sc_ledoff = off; in iwi_led_blink()
3417 callout_reset(&sc->sc_ledtimer, on, iwi_led_off, sc); in iwi_led_blink()
3447 sc->sc_ledevent = ticks; /* time of last event */ in iwi_led_event()
3448 if (sc->sc_blinking) /* don't interrupt active blink */ in iwi_led_event()
3452 j = nitems(blinkrates)-1; in iwi_led_event()
3457 if (blinkrates[sc->sc_txrix].rate != txrate) { in iwi_led_event()
3458 for (j = 0; j < nitems(blinkrates)-1; j++) in iwi_led_event()
3461 sc->sc_txrix = j; in iwi_led_event()
3463 j = sc->sc_txrix; in iwi_led_event()
3466 if (blinkrates[sc->sc_rxrix].rate != sc->sc_rxrate) { in iwi_led_event()
3467 for (j = 0; j < nitems(blinkrates)-1; j++) in iwi_led_event()
3468 if (blinkrates[j].rate == sc->sc_rxrate) in iwi_led_event()
3470 sc->sc_rxrix = j; in iwi_led_event()
3472 j = sc->sc_rxrix; in iwi_led_event()
3484 int softled = sc->sc_softled; in iwi_sysctl_softled()
3488 if (error || !req->newptr) in iwi_sysctl_softled()
3491 if (softled != sc->sc_softled) { in iwi_sysctl_softled()
3494 v &= ~sc->sc_ledpin; in iwi_sysctl_softled()
3497 sc->sc_softled = softled; in iwi_sysctl_softled()
3505 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev); in iwi_ledattach()
3506 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev); in iwi_ledattach()
3508 sc->sc_blinking = 0; in iwi_ledattach()
3509 sc->sc_ledstate = 1; in iwi_ledattach()
3510 sc->sc_ledidle = (2700*hz)/1000; /* 2.7sec */ in iwi_ledattach()
3511 callout_init_mtx(&sc->sc_ledtimer, &sc->sc_mtx, 0); in iwi_ledattach()
3517 "ledpin", CTLFLAG_RW, &sc->sc_ledpin, 0, in iwi_ledattach()
3520 "ledidle", CTLFLAG_RW, &sc->sc_ledidle, 0, in iwi_ledattach()
3524 "nictype", CTLFLAG_RD, &sc->sc_nictype, 0, in iwi_ledattach()
3527 sc->sc_ledpin = IWI_RST_LED_ACTIVITY; in iwi_ledattach()
3528 sc->sc_softled = 1; in iwi_ledattach()
3530 sc->sc_nictype = (iwi_read_prom_word(sc, IWI_EEPROM_NIC) >> 8) & 0xff; in iwi_ledattach()
3531 if (sc->sc_nictype == 1) { in iwi_ledattach()
3535 sc->sc_ledpin = IWI_RST_LED_ASSOCIATED; in iwi_ledattach()
3548 struct iwi_softc *sc = ic->ic_softc; in iwi_set_channel()
3550 if (sc->fw_state == IWI_FW_IDLE) in iwi_set_channel()
3551 iwi_setcurchan(sc, ic->ic_curchan->ic_ieee); in iwi_set_channel()
3557 struct ieee80211vap *vap = ss->ss_vap; in iwi_scan_curchan()
3558 struct iwi_softc *sc = vap->iv_ic->ic_softc; in iwi_scan_curchan()
3576 struct iwi_softc *sc = ic->ic_softc; in iwi_scan_end()
3580 sc->flags &= ~IWI_FLAG_CHANNEL_SCAN; in iwi_scan_end()
3582 if (sc->fw_state == IWI_FW_SCANNING) in iwi_scan_end()
3590 struct iwi_softc *sc = ic->ic_softc; in iwi_collect_bands()
3591 device_t dev = sc->sc_dev; in iwi_collect_bands()