Lines Matching +full:timeout +full:- +full:tap +full:- +full:ms

2 /*-
20 /*-
70 if (sc->sc_debug > 0) \
74 if (sc->sc_debug >= (n)) \
204 struct ieee80211com *ic = &sc->sc_ic; in rt2661_attach()
208 sc->sc_id = id; in rt2661_attach()
209 sc->sc_dev = dev; in rt2661_attach()
211 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, in rt2661_attach()
214 callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0); in rt2661_attach()
215 mbufq_init(&sc->sc_snd, ifqmaxlen); in rt2661_attach()
224 device_printf(sc->sc_dev, in rt2661_attach()
225 "timeout waiting for NIC to initialize\n"); in rt2661_attach()
231 rt2661_read_eeprom(sc, ic->ic_macaddr); in rt2661_attach()
234 rt2661_get_rf(sc->rf_rev)); in rt2661_attach()
240 error = rt2661_alloc_tx_ring(sc, &sc->txq[ac], in rt2661_attach()
243 device_printf(sc->sc_dev, in rt2661_attach()
249 error = rt2661_alloc_tx_ring(sc, &sc->mgtq, RT2661_MGT_RING_COUNT); in rt2661_attach()
251 device_printf(sc->sc_dev, "could not allocate Mgt ring\n"); in rt2661_attach()
255 error = rt2661_alloc_rx_ring(sc, &sc->rxq, RT2661_RX_RING_COUNT); in rt2661_attach()
257 device_printf(sc->sc_dev, "could not allocate Rx ring\n"); in rt2661_attach()
261 ic->ic_softc = sc; in rt2661_attach()
262 ic->ic_name = device_get_nameunit(dev); in rt2661_attach()
263 ic->ic_opmode = IEEE80211_M_STA; in rt2661_attach()
264 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ in rt2661_attach()
267 ic->ic_caps = in rt2661_attach()
273 | IEEE80211_C_WDS /* 4-address traffic works */ in rt2661_attach()
285 ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD; in rt2661_attach()
287 rt2661_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans, in rt2661_attach()
288 ic->ic_channels); in rt2661_attach()
292 ic->ic_wme.wme_update = rt2661_wme_update; in rt2661_attach()
294 ic->ic_scan_start = rt2661_scan_start; in rt2661_attach()
295 ic->ic_scan_end = rt2661_scan_end; in rt2661_attach()
296 ic->ic_getradiocaps = rt2661_getradiocaps; in rt2661_attach()
297 ic->ic_set_channel = rt2661_set_channel; in rt2661_attach()
298 ic->ic_updateslot = rt2661_update_slot; in rt2661_attach()
299 ic->ic_update_promisc = rt2661_update_promisc; in rt2661_attach()
300 ic->ic_raw_xmit = rt2661_raw_xmit; in rt2661_attach()
301 ic->ic_transmit = rt2661_transmit; in rt2661_attach()
302 ic->ic_parent = rt2661_parent; in rt2661_attach()
303 ic->ic_vap_create = rt2661_vap_create; in rt2661_attach()
304 ic->ic_vap_delete = rt2661_vap_delete; in rt2661_attach()
307 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), in rt2661_attach()
309 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), in rt2661_attach()
315 "debug", CTLFLAG_RW, &sc->sc_debug, 0, "debug msgs"); in rt2661_attach()
322 fail3: rt2661_free_tx_ring(sc, &sc->mgtq); in rt2661_attach()
323 fail2: while (--ac >= 0) in rt2661_attach()
324 rt2661_free_tx_ring(sc, &sc->txq[ac]); in rt2661_attach()
325 fail1: mtx_destroy(&sc->sc_mtx); in rt2661_attach()
333 struct ieee80211com *ic = &sc->sc_ic; in rt2661_detach()
340 mbufq_drain(&sc->sc_snd); in rt2661_detach()
342 rt2661_free_tx_ring(sc, &sc->txq[0]); in rt2661_detach()
343 rt2661_free_tx_ring(sc, &sc->txq[1]); in rt2661_detach()
344 rt2661_free_tx_ring(sc, &sc->txq[2]); in rt2661_detach()
345 rt2661_free_tx_ring(sc, &sc->txq[3]); in rt2661_detach()
346 rt2661_free_tx_ring(sc, &sc->mgtq); in rt2661_detach()
347 rt2661_free_rx_ring(sc, &sc->rxq); in rt2661_detach()
349 mtx_destroy(&sc->sc_mtx); in rt2661_detach()
360 struct rt2661_softc *sc = ic->ic_softc; in rt2661_vap_create()
372 if (!TAILQ_EMPTY(&ic->ic_vaps)) { in rt2661_vap_create()
373 device_printf(sc->sc_dev, "only 1 vap supported\n"); in rt2661_vap_create()
380 if (TAILQ_EMPTY(&ic->ic_vaps) || in rt2661_vap_create()
381 ic->ic_opmode != IEEE80211_M_HOSTAP) { in rt2661_vap_create()
382 device_printf(sc->sc_dev, in rt2661_vap_create()
394 device_printf(sc->sc_dev, "unknown opmode %d\n", opmode); in rt2661_vap_create()
398 vap = &rvp->ral_vap; in rt2661_vap_create()
402 rvp->ral_newstate = vap->iv_newstate; in rt2661_vap_create()
403 vap->iv_newstate = rt2661_newstate; in rt2661_vap_create()
405 vap->iv_update_beacon = rt2661_beacon_update; in rt2661_vap_create()
412 if (TAILQ_FIRST(&ic->ic_vaps) == vap) in rt2661_vap_create()
413 ic->ic_opmode = opmode; in rt2661_vap_create()
448 if (sc->sc_ic.ic_nrunning > 0) in rt2661_resume()
469 ring->count = count; in rt2661_alloc_tx_ring()
470 ring->queued = 0; in rt2661_alloc_tx_ring()
471 ring->cur = ring->next = ring->stat = 0; in rt2661_alloc_tx_ring()
473 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, in rt2661_alloc_tx_ring()
476 0, NULL, NULL, &ring->desc_dmat); in rt2661_alloc_tx_ring()
478 device_printf(sc->sc_dev, "could not create desc DMA tag\n"); in rt2661_alloc_tx_ring()
482 error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc, in rt2661_alloc_tx_ring()
483 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); in rt2661_alloc_tx_ring()
485 device_printf(sc->sc_dev, "could not allocate DMA memory\n"); in rt2661_alloc_tx_ring()
489 error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc, in rt2661_alloc_tx_ring()
490 count * RT2661_TX_DESC_SIZE, rt2661_dma_map_addr, &ring->physaddr, in rt2661_alloc_tx_ring()
493 device_printf(sc->sc_dev, "could not load desc DMA map\n"); in rt2661_alloc_tx_ring()
497 ring->data = malloc(count * sizeof (struct rt2661_tx_data), M_DEVBUF, in rt2661_alloc_tx_ring()
499 if (ring->data == NULL) { in rt2661_alloc_tx_ring()
500 device_printf(sc->sc_dev, "could not allocate soft data\n"); in rt2661_alloc_tx_ring()
505 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, in rt2661_alloc_tx_ring()
507 RT2661_MAX_SCATTER, MCLBYTES, 0, NULL, NULL, &ring->data_dmat); in rt2661_alloc_tx_ring()
509 device_printf(sc->sc_dev, "could not create data DMA tag\n"); in rt2661_alloc_tx_ring()
514 error = bus_dmamap_create(ring->data_dmat, 0, in rt2661_alloc_tx_ring()
515 &ring->data[i].map); in rt2661_alloc_tx_ring()
517 device_printf(sc->sc_dev, "could not create DMA map\n"); in rt2661_alloc_tx_ring()
535 for (i = 0; i < ring->count; i++) { in rt2661_reset_tx_ring()
536 desc = &ring->desc[i]; in rt2661_reset_tx_ring()
537 data = &ring->data[i]; in rt2661_reset_tx_ring()
539 if (data->m != NULL) { in rt2661_reset_tx_ring()
540 bus_dmamap_sync(ring->data_dmat, data->map, in rt2661_reset_tx_ring()
542 bus_dmamap_unload(ring->data_dmat, data->map); in rt2661_reset_tx_ring()
543 m_freem(data->m); in rt2661_reset_tx_ring()
544 data->m = NULL; in rt2661_reset_tx_ring()
547 if (data->ni != NULL) { in rt2661_reset_tx_ring()
548 ieee80211_free_node(data->ni); in rt2661_reset_tx_ring()
549 data->ni = NULL; in rt2661_reset_tx_ring()
552 desc->flags = 0; in rt2661_reset_tx_ring()
555 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_reset_tx_ring()
557 ring->queued = 0; in rt2661_reset_tx_ring()
558 ring->cur = ring->next = ring->stat = 0; in rt2661_reset_tx_ring()
567 if (ring->desc != NULL) { in rt2661_free_tx_ring()
568 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, in rt2661_free_tx_ring()
570 bus_dmamap_unload(ring->desc_dmat, ring->desc_map); in rt2661_free_tx_ring()
571 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map); in rt2661_free_tx_ring()
574 if (ring->desc_dmat != NULL) in rt2661_free_tx_ring()
575 bus_dma_tag_destroy(ring->desc_dmat); in rt2661_free_tx_ring()
577 if (ring->data != NULL) { in rt2661_free_tx_ring()
578 for (i = 0; i < ring->count; i++) { in rt2661_free_tx_ring()
579 data = &ring->data[i]; in rt2661_free_tx_ring()
581 if (data->m != NULL) { in rt2661_free_tx_ring()
582 bus_dmamap_sync(ring->data_dmat, data->map, in rt2661_free_tx_ring()
584 bus_dmamap_unload(ring->data_dmat, data->map); in rt2661_free_tx_ring()
585 m_freem(data->m); in rt2661_free_tx_ring()
588 if (data->ni != NULL) in rt2661_free_tx_ring()
589 ieee80211_free_node(data->ni); in rt2661_free_tx_ring()
591 if (data->map != NULL) in rt2661_free_tx_ring()
592 bus_dmamap_destroy(ring->data_dmat, data->map); in rt2661_free_tx_ring()
595 free(ring->data, M_DEVBUF); in rt2661_free_tx_ring()
598 if (ring->data_dmat != NULL) in rt2661_free_tx_ring()
599 bus_dma_tag_destroy(ring->data_dmat); in rt2661_free_tx_ring()
611 ring->count = count; in rt2661_alloc_rx_ring()
612 ring->cur = ring->next = 0; in rt2661_alloc_rx_ring()
614 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 4, 0, in rt2661_alloc_rx_ring()
617 0, NULL, NULL, &ring->desc_dmat); in rt2661_alloc_rx_ring()
619 device_printf(sc->sc_dev, "could not create desc DMA tag\n"); in rt2661_alloc_rx_ring()
623 error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc, in rt2661_alloc_rx_ring()
624 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &ring->desc_map); in rt2661_alloc_rx_ring()
626 device_printf(sc->sc_dev, "could not allocate DMA memory\n"); in rt2661_alloc_rx_ring()
630 error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc, in rt2661_alloc_rx_ring()
631 count * RT2661_RX_DESC_SIZE, rt2661_dma_map_addr, &ring->physaddr, in rt2661_alloc_rx_ring()
634 device_printf(sc->sc_dev, "could not load desc DMA map\n"); in rt2661_alloc_rx_ring()
638 ring->data = malloc(count * sizeof (struct rt2661_rx_data), M_DEVBUF, in rt2661_alloc_rx_ring()
640 if (ring->data == NULL) { in rt2661_alloc_rx_ring()
641 device_printf(sc->sc_dev, "could not allocate soft data\n"); in rt2661_alloc_rx_ring()
647 * Pre-allocate Rx buffers and populate Rx ring. in rt2661_alloc_rx_ring()
649 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, in rt2661_alloc_rx_ring()
651 1, MCLBYTES, 0, NULL, NULL, &ring->data_dmat); in rt2661_alloc_rx_ring()
653 device_printf(sc->sc_dev, "could not create data DMA tag\n"); in rt2661_alloc_rx_ring()
658 desc = &sc->rxq.desc[i]; in rt2661_alloc_rx_ring()
659 data = &sc->rxq.data[i]; in rt2661_alloc_rx_ring()
661 error = bus_dmamap_create(ring->data_dmat, 0, &data->map); in rt2661_alloc_rx_ring()
663 device_printf(sc->sc_dev, "could not create DMA map\n"); in rt2661_alloc_rx_ring()
667 data->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); in rt2661_alloc_rx_ring()
668 if (data->m == NULL) { in rt2661_alloc_rx_ring()
669 device_printf(sc->sc_dev, in rt2661_alloc_rx_ring()
675 error = bus_dmamap_load(ring->data_dmat, data->map, in rt2661_alloc_rx_ring()
676 mtod(data->m, void *), MCLBYTES, rt2661_dma_map_addr, in rt2661_alloc_rx_ring()
679 device_printf(sc->sc_dev, in rt2661_alloc_rx_ring()
684 desc->flags = htole32(RT2661_RX_BUSY); in rt2661_alloc_rx_ring()
685 desc->physaddr = htole32(physaddr); in rt2661_alloc_rx_ring()
688 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_alloc_rx_ring()
701 for (i = 0; i < ring->count; i++) in rt2661_reset_rx_ring()
702 ring->desc[i].flags = htole32(RT2661_RX_BUSY); in rt2661_reset_rx_ring()
704 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_reset_rx_ring()
706 ring->cur = ring->next = 0; in rt2661_reset_rx_ring()
715 if (ring->desc != NULL) { in rt2661_free_rx_ring()
716 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, in rt2661_free_rx_ring()
718 bus_dmamap_unload(ring->desc_dmat, ring->desc_map); in rt2661_free_rx_ring()
719 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map); in rt2661_free_rx_ring()
722 if (ring->desc_dmat != NULL) in rt2661_free_rx_ring()
723 bus_dma_tag_destroy(ring->desc_dmat); in rt2661_free_rx_ring()
725 if (ring->data != NULL) { in rt2661_free_rx_ring()
726 for (i = 0; i < ring->count; i++) { in rt2661_free_rx_ring()
727 data = &ring->data[i]; in rt2661_free_rx_ring()
729 if (data->m != NULL) { in rt2661_free_rx_ring()
730 bus_dmamap_sync(ring->data_dmat, data->map, in rt2661_free_rx_ring()
732 bus_dmamap_unload(ring->data_dmat, data->map); in rt2661_free_rx_ring()
733 m_freem(data->m); in rt2661_free_rx_ring()
736 if (data->map != NULL) in rt2661_free_rx_ring()
737 bus_dmamap_destroy(ring->data_dmat, data->map); in rt2661_free_rx_ring()
740 free(ring->data, M_DEVBUF); in rt2661_free_rx_ring()
743 if (ring->data_dmat != NULL) in rt2661_free_rx_ring()
744 bus_dma_tag_destroy(ring->data_dmat); in rt2661_free_rx_ring()
751 struct ieee80211com *ic = vap->iv_ic; in rt2661_newstate()
752 struct rt2661_softc *sc = ic->ic_softc; in rt2661_newstate()
755 if (nstate == IEEE80211_S_INIT && vap->iv_state == IEEE80211_S_RUN) { in rt2661_newstate()
763 error = rvp->ral_newstate(vap, nstate, arg); in rt2661_newstate()
766 struct ieee80211_node *ni = vap->iv_bss; in rt2661_newstate()
768 if (vap->iv_opmode != IEEE80211_M_MONITOR) { in rt2661_newstate()
771 rt2661_set_basicrates(sc, &ni->ni_rates); in rt2661_newstate()
772 rt2661_set_bssid(sc, ni->ni_bssid); in rt2661_newstate()
775 if (vap->iv_opmode == IEEE80211_M_HOSTAP || in rt2661_newstate()
776 vap->iv_opmode == IEEE80211_M_IBSS || in rt2661_newstate()
777 vap->iv_opmode == IEEE80211_M_MBSS) { in rt2661_newstate()
782 if (vap->iv_opmode != IEEE80211_M_MONITOR) in rt2661_newstate()
818 /* write address (A5-A0 or A7-A0) */ in rt2661_eeprom_read()
820 for (; n >= 0; n--) { in rt2661_eeprom_read()
829 /* read data Q15-Q0 */ in rt2661_eeprom_read()
831 for (n = 15; n >= 0; n--) { in rt2661_eeprom_read()
851 struct ieee80211_ratectl_tx_status *txs = &sc->sc_txs; in rt2661_tx_intr()
857 txs->flags = IEEE80211_RATECTL_TX_FAIL_LONG; in rt2661_tx_intr()
868 txq = (qid <= 3) ? &sc->txq[qid] : &sc->mgtq; in rt2661_tx_intr()
871 data = &txq->data[txq->stat]; in rt2661_tx_intr()
872 m = data->m; in rt2661_tx_intr()
873 data->m = NULL; in rt2661_tx_intr()
874 ni = data->ni; in rt2661_tx_intr()
875 data->ni = NULL; in rt2661_tx_intr()
883 txs->status = IEEE80211_RATECTL_TX_SUCCESS; in rt2661_tx_intr()
884 txs->long_retries = RT2661_TX_RETRYCNT(val); in rt2661_tx_intr()
887 "%d retries\n", txs->long_retries); in rt2661_tx_intr()
888 if (data->rix != IEEE80211_FIXED_RATE_NONE) in rt2661_tx_intr()
894 txs->status = IEEE80211_RATECTL_TX_FAIL_LONG; in rt2661_tx_intr()
895 txs->long_retries = RT2661_TX_RETRYCNT(val); in rt2661_tx_intr()
899 if (data->rix != IEEE80211_FIXED_RATE_NONE) in rt2661_tx_intr()
906 device_printf(sc->sc_dev, in rt2661_tx_intr()
911 DPRINTFN(sc, 15, "tx done q=%d idx=%u\n", qid, txq->stat); in rt2661_tx_intr()
913 txq->queued--; in rt2661_tx_intr()
914 if (++txq->stat >= txq->count) /* faster than % count */ in rt2661_tx_intr()
915 txq->stat = 0; in rt2661_tx_intr()
920 sc->sc_tx_timer = 0; in rt2661_tx_intr()
931 bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_POSTREAD); in rt2661_tx_dma_intr()
934 desc = &txq->desc[txq->next]; in rt2661_tx_dma_intr()
935 data = &txq->data[txq->next]; in rt2661_tx_dma_intr()
937 if ((le32toh(desc->flags) & RT2661_TX_BUSY) || in rt2661_tx_dma_intr()
938 !(le32toh(desc->flags) & RT2661_TX_VALID)) in rt2661_tx_dma_intr()
941 bus_dmamap_sync(txq->data_dmat, data->map, in rt2661_tx_dma_intr()
943 bus_dmamap_unload(txq->data_dmat, data->map); in rt2661_tx_dma_intr()
946 desc->flags &= ~htole32(RT2661_TX_VALID); in rt2661_tx_dma_intr()
948 DPRINTFN(sc, 15, "tx dma done q=%p idx=%u\n", txq, txq->next); in rt2661_tx_dma_intr()
950 if (++txq->next >= txq->count) /* faster than % count */ in rt2661_tx_dma_intr()
951 txq->next = 0; in rt2661_tx_dma_intr()
954 bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_tx_dma_intr()
960 struct ieee80211com *ic = &sc->sc_ic; in rt2661_rx_intr()
969 bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map, in rt2661_rx_intr()
975 desc = &sc->rxq.desc[sc->rxq.cur]; in rt2661_rx_intr()
976 data = &sc->rxq.data[sc->rxq.cur]; in rt2661_rx_intr()
978 if (le32toh(desc->flags) & RT2661_RX_BUSY) in rt2661_rx_intr()
981 if ((le32toh(desc->flags) & RT2661_RX_PHY_ERROR) || in rt2661_rx_intr()
982 (le32toh(desc->flags) & RT2661_RX_CRC_ERROR)) { in rt2661_rx_intr()
988 le32toh(desc->flags)); in rt2661_rx_intr()
989 counter_u64_add(ic->ic_ierrors, 1); in rt2661_rx_intr()
993 if ((le32toh(desc->flags) & RT2661_RX_CIPHER_MASK) != 0) { in rt2661_rx_intr()
994 counter_u64_add(ic->ic_ierrors, 1); in rt2661_rx_intr()
1007 counter_u64_add(ic->ic_ierrors, 1); in rt2661_rx_intr()
1011 bus_dmamap_sync(sc->rxq.data_dmat, data->map, in rt2661_rx_intr()
1013 bus_dmamap_unload(sc->rxq.data_dmat, data->map); in rt2661_rx_intr()
1015 error = bus_dmamap_load(sc->rxq.data_dmat, data->map, in rt2661_rx_intr()
1022 error = bus_dmamap_load(sc->rxq.data_dmat, data->map, in rt2661_rx_intr()
1023 mtod(data->m, void *), MCLBYTES, in rt2661_rx_intr()
1028 device_get_name(sc->sc_dev)); in rt2661_rx_intr()
1030 counter_u64_add(ic->ic_ierrors, 1); in rt2661_rx_intr()
1038 m = data->m; in rt2661_rx_intr()
1039 data->m = mnew; in rt2661_rx_intr()
1040 desc->physaddr = htole32(physaddr); in rt2661_rx_intr()
1043 m->m_pkthdr.len = m->m_len = in rt2661_rx_intr()
1044 (le32toh(desc->flags) >> 16) & 0xfff; in rt2661_rx_intr()
1046 rssi = rt2661_get_rssi(sc, desc->rssi); in rt2661_rx_intr()
1049 rssi = -30; /* XXX ignored by net80211 */ in rt2661_rx_intr()
1053 struct rt2661_rx_radiotap_header *tap = &sc->sc_rxtap; in rt2661_rx_intr() local
1060 tap->wr_tsf = in rt2661_rx_intr()
1062 tap->wr_flags = 0; in rt2661_rx_intr()
1063 tap->wr_rate = ieee80211_plcp2rate(desc->rate, in rt2661_rx_intr()
1064 (desc->flags & htole32(RT2661_RX_OFDM)) ? in rt2661_rx_intr()
1066 tap->wr_antsignal = nf + rssi; in rt2661_rx_intr()
1067 tap->wr_antnoise = nf; in rt2661_rx_intr()
1069 sc->sc_flags |= RAL_INPUT_RUNNING; in rt2661_rx_intr()
1083 sc->sc_flags &= ~RAL_INPUT_RUNNING; in rt2661_rx_intr()
1085 skip: desc->flags |= htole32(RT2661_RX_BUSY); in rt2661_rx_intr()
1087 DPRINTFN(sc, 15, "rx intr idx=%u\n", sc->rxq.cur); in rt2661_rx_intr()
1089 sc->rxq.cur = (sc->rxq.cur + 1) % RT2661_RX_RING_COUNT; in rt2661_rx_intr()
1092 bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map, in rt2661_rx_intr()
1135 /* don't re-enable interrupts if we're shutting down */ in rt2661_intr()
1136 if (!(sc->sc_flags & RAL_RUNNING)) { in rt2661_intr()
1148 rt2661_tx_dma_intr(sc, &sc->mgtq); in rt2661_intr()
1154 rt2661_tx_dma_intr(sc, &sc->txq[0]); in rt2661_intr()
1157 rt2661_tx_dma_intr(sc, &sc->txq[1]); in rt2661_intr()
1160 rt2661_tx_dma_intr(sc, &sc->txq[2]); in rt2661_intr()
1163 rt2661_tx_dma_intr(sc, &sc->txq[3]); in rt2661_intr()
1177 /* re-enable MAC and MCU interrupts */ in rt2661_intr()
1188 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ in rt2661_plcp_signal()
1198 /* CCK rates (NB: not IEEE std, device-specific) */ in rt2661_plcp_signal()
1212 struct ieee80211com *ic = &sc->sc_ic; in rt2661_setup_tx_desc()
1216 desc->flags = htole32(flags); in rt2661_setup_tx_desc()
1217 desc->flags |= htole32(len << 16); in rt2661_setup_tx_desc()
1218 desc->flags |= htole32(RT2661_TX_BUSY | RT2661_TX_VALID); in rt2661_setup_tx_desc()
1220 desc->xflags = htole16(xflags); in rt2661_setup_tx_desc()
1221 desc->xflags |= htole16(nsegs << 13); in rt2661_setup_tx_desc()
1223 desc->wme = htole16( in rt2661_setup_tx_desc()
1234 desc->qid = ac; in rt2661_setup_tx_desc()
1237 desc->plcp_signal = rt2661_plcp_signal(rate); in rt2661_setup_tx_desc()
1238 desc->plcp_service = 4; in rt2661_setup_tx_desc()
1241 if (ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM) { in rt2661_setup_tx_desc()
1242 desc->flags |= htole32(RT2661_TX_OFDM); in rt2661_setup_tx_desc()
1245 desc->plcp_length_hi = plcp_length >> 6; in rt2661_setup_tx_desc()
1246 desc->plcp_length_lo = plcp_length & 0x3f; in rt2661_setup_tx_desc()
1252 desc->plcp_service |= RT2661_PLCP_LENGEXT; in rt2661_setup_tx_desc()
1254 desc->plcp_length_hi = plcp_length >> 8; in rt2661_setup_tx_desc()
1255 desc->plcp_length_lo = plcp_length & 0xff; in rt2661_setup_tx_desc()
1257 if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) in rt2661_setup_tx_desc()
1258 desc->plcp_signal |= 0x08; in rt2661_setup_tx_desc()
1263 desc->addr[i] = htole32(segs[i].ds_addr); in rt2661_setup_tx_desc()
1264 desc->len [i] = htole16(segs[i].ds_len); in rt2661_setup_tx_desc()
1272 struct ieee80211vap *vap = ni->ni_vap; in rt2661_tx_mgt()
1273 struct ieee80211com *ic = ni->ni_ic; in rt2661_tx_mgt()
1283 desc = &sc->mgtq.desc[sc->mgtq.cur]; in rt2661_tx_mgt()
1284 data = &sc->mgtq.data[sc->mgtq.cur]; in rt2661_tx_mgt()
1286 rate = ni->ni_txparms->mgmtrate; in rt2661_tx_mgt()
1289 ieee80211_output_seqno_assign(ni, -1, m0); in rt2661_tx_mgt()
1290 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in rt2661_tx_mgt()
1298 error = bus_dmamap_load_mbuf_sg(sc->mgtq.data_dmat, data->map, m0, in rt2661_tx_mgt()
1301 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n", in rt2661_tx_mgt()
1308 struct rt2661_tx_radiotap_header *tap = &sc->sc_txtap; in rt2661_tx_mgt() local
1310 tap->wt_flags = 0; in rt2661_tx_mgt()
1311 tap->wt_rate = rate; in rt2661_tx_mgt()
1316 data->m = m0; in rt2661_tx_mgt()
1317 data->ni = ni; in rt2661_tx_mgt()
1319 data->rix = IEEE80211_FIXED_RATE_NONE; in rt2661_tx_mgt()
1323 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_tx_mgt()
1326 dur = ieee80211_ack_duration(ic->ic_rt, in rt2661_tx_mgt()
1327 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE); in rt2661_tx_mgt()
1328 *(uint16_t *)wh->i_dur = htole16(dur); in rt2661_tx_mgt()
1336 m0->m_pkthdr.len, rate, segs, nsegs, RT2661_QID_MGT); in rt2661_tx_mgt()
1338 bus_dmamap_sync(sc->mgtq.data_dmat, data->map, BUS_DMASYNC_PREWRITE); in rt2661_tx_mgt()
1339 bus_dmamap_sync(sc->mgtq.desc_dmat, sc->mgtq.desc_map, in rt2661_tx_mgt()
1343 m0->m_pkthdr.len, sc->mgtq.cur, rate); in rt2661_tx_mgt()
1346 sc->mgtq.queued++; in rt2661_tx_mgt()
1347 sc->mgtq.cur = (sc->mgtq.cur + 1) % RT2661_MGT_RING_COUNT; in rt2661_tx_mgt()
1357 struct ieee80211com *ic = ni->ni_ic; in rt2661_sendprot()
1358 struct rt2661_tx_ring *txq = &sc->txq[ac]; in rt2661_sendprot()
1368 if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1); in rt2661_sendprot()
1369 device_printf(sc->sc_dev, in rt2661_sendprot()
1374 data = &txq->data[txq->cur]; in rt2661_sendprot()
1375 desc = &txq->desc[txq->cur]; in rt2661_sendprot()
1377 error = bus_dmamap_load_mbuf_sg(txq->data_dmat, data->map, mprot, segs, in rt2661_sendprot()
1380 device_printf(sc->sc_dev, in rt2661_sendprot()
1386 data->m = mprot; in rt2661_sendprot()
1387 data->ni = ieee80211_ref_node(ni); in rt2661_sendprot()
1389 data->rix = IEEE80211_FIXED_RATE_NONE; in rt2661_sendprot()
1391 protrate = ieee80211_ctl_rate(ic->ic_rt, rate); in rt2661_sendprot()
1396 rt2661_setup_tx_desc(sc, desc, flags, 0, mprot->m_pkthdr.len, in rt2661_sendprot()
1399 bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE); in rt2661_sendprot()
1400 bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_sendprot()
1402 txq->queued++; in rt2661_sendprot()
1403 txq->cur = (txq->cur + 1) % RT2661_TX_RING_COUNT; in rt2661_sendprot()
1412 struct ieee80211vap *vap = ni->ni_vap; in rt2661_tx_data()
1413 struct ieee80211com *ic = &sc->sc_ic; in rt2661_tx_data()
1414 struct rt2661_tx_ring *txq = &sc->txq[ac]; in rt2661_tx_data()
1418 const struct ieee80211_txparam *tp = ni->ni_txparms; in rt2661_tx_data()
1428 if (m0->m_flags & M_EAPOL) { in rt2661_tx_data()
1429 rate = tp->mgmtrate; in rt2661_tx_data()
1430 } else if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_tx_data()
1431 rate = tp->mcastrate; in rt2661_tx_data()
1432 } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { in rt2661_tx_data()
1433 rate = tp->ucastrate; in rt2661_tx_data()
1440 if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS_DATA) in rt2661_tx_data()
1443 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in rt2661_tx_data()
1455 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_tx_data()
1457 if (m0->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) in rt2661_tx_data()
1459 else if ((ic->ic_flags & IEEE80211_F_USEPROT) && in rt2661_tx_data()
1460 ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM) in rt2661_tx_data()
1461 prot = ic->ic_protmode; in rt2661_tx_data()
1472 data = &txq->data[txq->cur]; in rt2661_tx_data()
1473 desc = &txq->desc[txq->cur]; in rt2661_tx_data()
1475 error = bus_dmamap_load_mbuf_sg(txq->data_dmat, data->map, m0, segs, in rt2661_tx_data()
1478 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n", in rt2661_tx_data()
1486 device_printf(sc->sc_dev, in rt2661_tx_data()
1493 error = bus_dmamap_load_mbuf_sg(txq->data_dmat, data->map, m0, in rt2661_tx_data()
1496 device_printf(sc->sc_dev, in rt2661_tx_data()
1507 struct rt2661_tx_radiotap_header *tap = &sc->sc_txtap; in rt2661_tx_data() local
1509 tap->wt_flags = 0; in rt2661_tx_data()
1510 tap->wt_rate = rate; in rt2661_tx_data()
1515 data->m = m0; in rt2661_tx_data()
1516 data->ni = ni; in rt2661_tx_data()
1519 if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) { in rt2661_tx_data()
1520 data->rix = ieee80211_node_get_txrate_dot11rate(ni); in rt2661_tx_data()
1522 data->rssi = ic->ic_node_getrssi(ni); in rt2661_tx_data()
1524 data->rix = IEEE80211_FIXED_RATE_NONE; in rt2661_tx_data()
1526 if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_tx_data()
1529 dur = ieee80211_ack_duration(ic->ic_rt, in rt2661_tx_data()
1530 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE); in rt2661_tx_data()
1531 *(uint16_t *)wh->i_dur = htole16(dur); in rt2661_tx_data()
1534 rt2661_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate, segs, in rt2661_tx_data()
1537 bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE); in rt2661_tx_data()
1538 bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_PREWRITE); in rt2661_tx_data()
1541 m0->m_pkthdr.len, txq->cur, rate); in rt2661_tx_data()
1544 txq->queued++; in rt2661_tx_data()
1545 txq->cur = (txq->cur + 1) % RT2661_TX_RING_COUNT; in rt2661_tx_data()
1554 struct rt2661_softc *sc = ic->ic_softc; in rt2661_transmit()
1558 if ((sc->sc_flags & RAL_RUNNING) == 0) { in rt2661_transmit()
1562 error = mbufq_enqueue(&sc->sc_snd, m); in rt2661_transmit()
1583 if (!(sc->sc_flags & RAL_RUNNING) || sc->sc_invalid) in rt2661_start()
1586 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in rt2661_start()
1588 if (sc->txq[ac].queued >= RT2661_TX_RING_COUNT - 1) { in rt2661_start()
1590 mbufq_prepend(&sc->sc_snd, m); in rt2661_start()
1593 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; in rt2661_start()
1595 if_inc_counter(ni->ni_vap->iv_ifp, in rt2661_start()
1600 sc->sc_tx_timer = 5; in rt2661_start()
1608 struct ieee80211com *ic = ni->ni_ic; in rt2661_raw_xmit()
1609 struct rt2661_softc *sc = ic->ic_softc; in rt2661_raw_xmit()
1614 if (!(sc->sc_flags & RAL_RUNNING)) { in rt2661_raw_xmit()
1619 if (sc->mgtq.queued >= RT2661_MGT_RING_COUNT) { in rt2661_raw_xmit()
1632 sc->sc_tx_timer = 5; in rt2661_raw_xmit()
1649 KASSERT(sc->sc_flags & RAL_RUNNING, ("not running")); in rt2661_watchdog()
1651 if (sc->sc_invalid) /* card ejected */ in rt2661_watchdog()
1654 if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) { in rt2661_watchdog()
1655 device_printf(sc->sc_dev, "device timeout\n"); in rt2661_watchdog()
1657 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in rt2661_watchdog()
1661 callout_reset(&sc->watchdog_ch, hz, rt2661_watchdog, sc); in rt2661_watchdog()
1667 struct rt2661_softc *sc = ic->ic_softc; in rt2661_parent()
1671 if (ic->ic_nrunning > 0) { in rt2661_parent()
1672 if ((sc->sc_flags & RAL_RUNNING) == 0) { in rt2661_parent()
1677 } else if (sc->sc_flags & RAL_RUNNING) in rt2661_parent()
1696 device_printf(sc->sc_dev, "could not write to BBP\n"); in rt2661_bbp_write()
1703 DPRINTFN(sc, 15, "BBP R%u <- 0x%02x\n", reg, val); in rt2661_bbp_write()
1718 device_printf(sc->sc_dev, "could not read from BBP\n"); in rt2661_bbp_read()
1732 device_printf(sc->sc_dev, "could not read from BBP\n"); in rt2661_bbp_read()
1748 device_printf(sc->sc_dev, "could not write to RF\n"); in rt2661_rf_write()
1757 sc->rf_regs[reg] = val; in rt2661_rf_write()
1759 DPRINTFN(sc, 15, "RF R[%u] <- 0x%05x\n", reg & 3, val & 0x1fffff); in rt2661_rf_write()
1799 * Enable multi-rate retries for frames sent at OFDM rates.
1805 struct ieee80211com *ic = &sc->sc_ic; in rt2661_enable_mrr()
1811 if (!IEEE80211_IS_CHAN_5GHZ(ic->ic_bsschan)) in rt2661_enable_mrr()
1821 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_txpreamble()
1827 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) in rt2661_set_txpreamble()
1837 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_basicrates()
1842 for (i = 0; i < rs->rs_nrates; i++) { in rt2661_set_basicrates()
1843 rate = rs->rs_rates[i]; in rt2661_set_basicrates()
1848 mask |= 1 << ieee80211_legacy_rate_lookup(ic->ic_rt, in rt2661_set_basicrates()
1874 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || in rt2661_select_band()
1875 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { in rt2661_select_band()
1883 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || in rt2661_select_band()
1884 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { in rt2661_select_band()
1906 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_chan()
1916 rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2; in rt2661_set_chan()
1921 power = sc->txpow[i]; in rt2661_set_chan()
1926 bbp94 += power - 31; in rt2661_set_chan()
1932 * vice-versa, BBP registers need to be reprogrammed. in rt2661_set_chan()
1934 if (c->ic_flags != sc->sc_curchan->ic_flags) { in rt2661_set_chan()
1938 sc->sc_curchan = c; in rt2661_set_chan()
1943 rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
1950 rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
1957 rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
1959 /* enable smart mode for MIMO-capable RFs */ in rt2661_set_chan()
1963 if (sc->rf_rev == RT2661_RF_5325 || sc->rf_rev == RT2661_RF_2529) in rt2661_set_chan()
1971 /* 5GHz radio needs a 1ms delay here */ in rt2661_set_chan()
2003 struct rt2661_softc *sc = ic->ic_softc; in rt2661_update_promisc()
2009 if (ic->ic_promisc == 0) in rt2661_update_promisc()
2015 (ic->ic_promisc > 0) ? "entering" : "leaving"); in rt2661_update_promisc()
2024 struct rt2661_softc *sc = ic->ic_softc; in rt2661_wme_update()
2070 struct rt2661_softc *sc = ic->ic_softc; in rt2661_update_slot()
2114 sc->rf_rev = (val >> 11) & 0x1f; in rt2661_read_eeprom()
2115 sc->hw_radio = (val >> 10) & 0x1; in rt2661_read_eeprom()
2116 sc->rx_ant = (val >> 4) & 0x3; in rt2661_read_eeprom()
2117 sc->tx_ant = (val >> 2) & 0x3; in rt2661_read_eeprom()
2118 sc->nb_ant = val & 0x3; in rt2661_read_eeprom()
2120 DPRINTF(sc, "RF revision=%d\n", sc->rf_rev); in rt2661_read_eeprom()
2123 sc->ext_5ghz_lna = (val >> 6) & 0x1; in rt2661_read_eeprom()
2124 sc->ext_2ghz_lna = (val >> 4) & 0x1; in rt2661_read_eeprom()
2127 sc->ext_2ghz_lna, sc->ext_5ghz_lna); in rt2661_read_eeprom()
2131 sc->rssi_2ghz_corr = (int8_t)(val & 0xff); /* signed */ in rt2661_read_eeprom()
2133 /* Only [-10, 10] is valid */ in rt2661_read_eeprom()
2134 if (sc->rssi_2ghz_corr < -10 || sc->rssi_2ghz_corr > 10) in rt2661_read_eeprom()
2135 sc->rssi_2ghz_corr = 0; in rt2661_read_eeprom()
2139 sc->rssi_5ghz_corr = (int8_t)(val & 0xff); /* signed */ in rt2661_read_eeprom()
2141 /* Only [-10, 10] is valid */ in rt2661_read_eeprom()
2142 if (sc->rssi_5ghz_corr < -10 || sc->rssi_5ghz_corr > 10) in rt2661_read_eeprom()
2143 sc->rssi_5ghz_corr = 0; in rt2661_read_eeprom()
2145 /* adjust RSSI correction for external low-noise amplifier */ in rt2661_read_eeprom()
2146 if (sc->ext_2ghz_lna) in rt2661_read_eeprom()
2147 sc->rssi_2ghz_corr -= 14; in rt2661_read_eeprom()
2148 if (sc->ext_5ghz_lna) in rt2661_read_eeprom()
2149 sc->rssi_5ghz_corr -= 14; in rt2661_read_eeprom()
2152 sc->rssi_2ghz_corr, sc->rssi_5ghz_corr); in rt2661_read_eeprom()
2156 sc->rfprog = (val >> 8) & 0x3; in rt2661_read_eeprom()
2158 sc->rffreq = val & 0xff; in rt2661_read_eeprom()
2160 DPRINTF(sc, "RF prog=%d\nRF freq=%d\n", sc->rfprog, sc->rffreq); in rt2661_read_eeprom()
2165 sc->txpow[i * 2] = (int8_t)(val >> 8); /* signed */ in rt2661_read_eeprom()
2167 rt2661_rf5225_1[i * 2].chan, sc->txpow[i * 2]); in rt2661_read_eeprom()
2168 sc->txpow[i * 2 + 1] = (int8_t)(val & 0xff); /* signed */ in rt2661_read_eeprom()
2170 rt2661_rf5225_1[i * 2 + 1].chan, sc->txpow[i * 2 + 1]); in rt2661_read_eeprom()
2173 /* read vendor-specific BBP values */ in rt2661_read_eeprom()
2178 sc->bbp_prom[i].reg = val >> 8; in rt2661_read_eeprom()
2179 sc->bbp_prom[i].val = val & 0xff; in rt2661_read_eeprom()
2180 DPRINTF(sc, "BBP R%d=%02x\n", sc->bbp_prom[i].reg, in rt2661_read_eeprom()
2181 sc->bbp_prom[i].val); in rt2661_read_eeprom()
2199 device_printf(sc->sc_dev, "timeout waiting for BBP\n"); in rt2661_bbp_init()
2209 /* write vendor-specific BBP values (from EEPROM) */ in rt2661_bbp_init()
2211 if (sc->bbp_prom[i].reg == 0) in rt2661_bbp_init()
2213 rt2661_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val); in rt2661_bbp_init()
2222 struct ieee80211com *ic = &sc->sc_ic; in rt2661_init_locked()
2223 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in rt2661_init_locked()
2229 if ((sc->sc_flags & RAL_FW_LOADED) == 0) { in rt2661_init_locked()
2232 device_printf(sc->sc_dev, in rt2661_init_locked()
2237 sc->sc_flags |= RAL_FW_LOADED; in rt2661_init_locked()
2243 RAL_WRITE(sc, RT2661_AC1_BASE_CSR, sc->txq[1].physaddr); in rt2661_init_locked()
2244 RAL_WRITE(sc, RT2661_AC0_BASE_CSR, sc->txq[0].physaddr); in rt2661_init_locked()
2245 RAL_WRITE(sc, RT2661_AC2_BASE_CSR, sc->txq[2].physaddr); in rt2661_init_locked()
2246 RAL_WRITE(sc, RT2661_AC3_BASE_CSR, sc->txq[3].physaddr); in rt2661_init_locked()
2249 RAL_WRITE(sc, RT2661_MGT_BASE_CSR, sc->mgtq.physaddr); in rt2661_init_locked()
2252 RAL_WRITE(sc, RT2661_RX_BASE_CSR, sc->rxq.physaddr); in rt2661_init_locked()
2285 rt2661_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr); in rt2661_init_locked()
2298 printf("timeout waiting for BBP/RF to wakeup\n"); in rt2661_init_locked()
2309 sc->sc_curchan = ic->ic_curchan; in rt2661_init_locked()
2310 rt2661_select_band(sc, sc->sc_curchan); in rt2661_init_locked()
2312 rt2661_set_chan(sc, sc->sc_curchan); in rt2661_init_locked()
2318 if (ic->ic_opmode != IEEE80211_M_MONITOR) { in rt2661_init_locked()
2321 if (ic->ic_opmode != IEEE80211_M_HOSTAP && in rt2661_init_locked()
2322 ic->ic_opmode != IEEE80211_M_MBSS) in rt2661_init_locked()
2324 if (ic->ic_promisc == 0) in rt2661_init_locked()
2346 sc->sc_flags |= RAL_RUNNING; in rt2661_init_locked()
2348 callout_reset(&sc->watchdog_ch, hz, rt2661_watchdog, sc); in rt2661_init_locked()
2355 struct ieee80211com *ic = &sc->sc_ic; in rt2661_init()
2361 if (sc->sc_flags & RAL_RUNNING) in rt2661_init()
2368 volatile int *flags = &sc->sc_flags; in rt2661_stop_locked()
2372 msleep(sc, &sc->sc_mtx, 0, "ralrunning", hz/10); in rt2661_stop_locked()
2374 callout_stop(&sc->watchdog_ch); in rt2661_stop_locked()
2375 sc->sc_tx_timer = 0; in rt2661_stop_locked()
2377 if (sc->sc_flags & RAL_RUNNING) { in rt2661_stop_locked()
2378 sc->sc_flags &= ~RAL_RUNNING; in rt2661_stop_locked()
2400 rt2661_reset_tx_ring(sc, &sc->txq[0]); in rt2661_stop_locked()
2401 rt2661_reset_tx_ring(sc, &sc->txq[1]); in rt2661_stop_locked()
2402 rt2661_reset_tx_ring(sc, &sc->txq[2]); in rt2661_stop_locked()
2403 rt2661_reset_tx_ring(sc, &sc->txq[3]); in rt2661_stop_locked()
2404 rt2661_reset_tx_ring(sc, &sc->mgtq); in rt2661_stop_locked()
2405 rt2661_reset_rx_ring(sc, &sc->rxq); in rt2661_stop_locked()
2428 switch (sc->sc_id) { in rt2661_load_microcode()
2433 device_printf(sc->sc_dev, "%s: unexpected pci device id 0x%x, " in rt2661_load_microcode()
2435 __func__, sc->sc_id); in rt2661_load_microcode()
2442 device_printf(sc->sc_dev, in rt2661_load_microcode()
2461 RAL_WRITE_REGION_1(sc, RT2661_MCU_CODE_BASE, fp->data, fp->datasize); in rt2661_load_microcode()
2474 device_printf(sc->sc_dev, in rt2661_load_microcode()
2475 "%s: timeout waiting for MCU to initialize\n", __func__); in rt2661_load_microcode()
2499 * external low-noise amplifier. in rt2661_rx_tune()
2502 if (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan)) in rt2661_rx_tune()
2504 if ((IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan) && sc->ext_2ghz_lna) || in rt2661_rx_tune()
2505 (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan) && sc->ext_5ghz_lna)) in rt2661_rx_tune()
2512 if (dbm >= -35) { in rt2661_rx_tune()
2514 } else if (dbm >= -58) { in rt2661_rx_tune()
2516 } else if (dbm >= -66) { in rt2661_rx_tune()
2518 } else if (dbm >= -74) { in rt2661_rx_tune()
2521 /* RSSI < -74dBm, tune using false CCA count */ in rt2661_rx_tune()
2523 bbp17 = sc->bbp17; /* current value */ in rt2661_rx_tune()
2525 hi -= 2 * (-74 - dbm); in rt2661_rx_tune()
2536 if (--bbp17 < lo) in rt2661_rx_tune()
2541 if (bbp17 != sc->bbp17) { in rt2661_rx_tune()
2543 sc->bbp17 = bbp17; in rt2661_rx_tune()
2565 sc->bbp18 = rt2661_bbp_read(sc, 18); in rt2661_radar_start()
2566 sc->bbp21 = rt2661_bbp_read(sc, 21); in rt2661_radar_start()
2567 sc->bbp22 = rt2661_bbp_read(sc, 22); in rt2661_radar_start()
2568 sc->bbp16 = rt2661_bbp_read(sc, 16); in rt2661_radar_start()
2569 sc->bbp17 = rt2661_bbp_read(sc, 17); in rt2661_radar_start()
2570 sc->bbp64 = rt2661_bbp_read(sc, 64); in rt2661_radar_start()
2576 rt2661_bbp_write(sc, 17, sc->ext_5ghz_lna ? 0x44 : 0x34); in rt2661_radar_start()
2592 rt2661_bbp_write(sc, 16, sc->bbp16); in rt2661_radar_stop()
2593 rt2661_bbp_write(sc, 17, sc->bbp17); in rt2661_radar_stop()
2594 rt2661_bbp_write(sc, 18, sc->bbp18); in rt2661_radar_stop()
2595 rt2661_bbp_write(sc, 21, sc->bbp21); in rt2661_radar_stop()
2596 rt2661_bbp_write(sc, 22, sc->bbp22); in rt2661_radar_stop()
2597 rt2661_bbp_write(sc, 64, sc->bbp64); in rt2661_radar_stop()
2606 struct ieee80211com *ic = vap->iv_ic; in rt2661_prepare_beacon()
2611 if ((m0 = ieee80211_beacon_alloc(vap->iv_bss))== NULL) { in rt2661_prepare_beacon()
2612 device_printf(sc->sc_dev, "could not allocate beacon frame\n"); in rt2661_prepare_beacon()
2617 rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_bsschan) ? 12 : 2; in rt2661_prepare_beacon()
2620 m0->m_pkthdr.len, rate, NULL, 0, RT2661_QID_MGT); in rt2661_prepare_beacon()
2627 mtod(m0, uint8_t *), m0->m_pkthdr.len); in rt2661_prepare_beacon()
2641 struct ieee80211com *ic = &sc->sc_ic; in rt2661_enable_tsf_sync()
2642 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in rt2661_enable_tsf_sync()
2645 if (vap->iv_opmode != IEEE80211_M_STA) { in rt2661_enable_tsf_sync()
2647 * Change default 16ms TBTT adjustment to 8ms. in rt2661_enable_tsf_sync()
2655 /* set beacon interval (in 1/16ms unit) */ in rt2661_enable_tsf_sync()
2656 tmp |= vap->iv_bss->ni_intval * 16; in rt2661_enable_tsf_sync()
2659 if (vap->iv_opmode == IEEE80211_M_STA) in rt2661_enable_tsf_sync()
2692 * NB: Since RSSI is relative to noise floor, -1 is in rt2661_get_rssi()
2695 return -1; in rt2661_get_rssi()
2698 rssi = (2 * agc) - RT2661_NOISE_FLOOR; in rt2661_get_rssi()
2700 if (IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan)) { in rt2661_get_rssi()
2701 rssi += sc->rssi_2ghz_corr; in rt2661_get_rssi()
2704 rssi -= 64; in rt2661_get_rssi()
2706 rssi -= 74; in rt2661_get_rssi()
2708 rssi -= 90; in rt2661_get_rssi()
2710 rssi += sc->rssi_5ghz_corr; in rt2661_get_rssi()
2713 rssi -= 64; in rt2661_get_rssi()
2715 rssi -= 86; in rt2661_get_rssi()
2717 rssi -= 100; in rt2661_get_rssi()
2725 struct rt2661_softc *sc = ic->ic_softc; in rt2661_scan_start()
2737 struct rt2661_softc *sc = ic->ic_softc; in rt2661_scan_end()
2738 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in rt2661_scan_end()
2742 rt2661_set_bssid(sc, vap->iv_bss->ni_bssid); in rt2661_scan_end()
2749 struct rt2661_softc *sc = ic->ic_softc; in rt2661_getradiocaps()
2757 if (sc->rf_rev == RT2661_RF_5225 || sc->rf_rev == RT2661_RF_5325) { in rt2661_getradiocaps()
2767 struct rt2661_softc *sc = ic->ic_softc; in rt2661_set_channel()
2770 rt2661_set_chan(sc, ic->ic_curchan); in rt2661_set_channel()