Lines Matching +full:fixed +full:- +full:rate

344 	/* write address (A5-A0 or A7-A0) */  in rt2661_eeprom_read()
346 for (; n >= 0; n--) { in rt2661_eeprom_read()
355 /* read data Q15-Q0 */ in rt2661_eeprom_read()
357 for (n = 15; n >= 0; n--) { in rt2661_eeprom_read()
378 struct ieee80211com *ic = &sc->sc_ic; in rt2661_read_eeprom()
384 ic->ic_macaddr[0] = val & 0xff; in rt2661_read_eeprom()
385 ic->ic_macaddr[1] = val >> 8; in rt2661_read_eeprom()
388 ic->ic_macaddr[2] = val & 0xff; in rt2661_read_eeprom()
389 ic->ic_macaddr[3] = val >> 8; in rt2661_read_eeprom()
392 ic->ic_macaddr[4] = val & 0xff; in rt2661_read_eeprom()
393 ic->ic_macaddr[5] = val >> 8; in rt2661_read_eeprom()
397 sc->rf_rev = (val >> 11) & 0x1f; in rt2661_read_eeprom()
398 sc->hw_radio = (val >> 10) & 0x1; in rt2661_read_eeprom()
399 sc->rx_ant = (val >> 4) & 0x3; in rt2661_read_eeprom()
400 sc->tx_ant = (val >> 2) & 0x3; in rt2661_read_eeprom()
401 sc->nb_ant = val & 0x3; in rt2661_read_eeprom()
404 "RF revision=%d\n", sc->rf_rev); in rt2661_read_eeprom()
407 sc->ext_5ghz_lna = (val >> 6) & 0x1; in rt2661_read_eeprom()
408 sc->ext_2ghz_lna = (val >> 4) & 0x1; in rt2661_read_eeprom()
412 sc->ext_2ghz_lna, sc->ext_5ghz_lna); in rt2661_read_eeprom()
416 sc->rssi_2ghz_corr = (int8_t)(val & 0xff); in rt2661_read_eeprom()
420 sc->rssi_5ghz_corr = (int8_t)(val & 0xff); in rt2661_read_eeprom()
422 /* adjust RSSI correction for external low-noise amplifier */ in rt2661_read_eeprom()
423 if (sc->ext_2ghz_lna) in rt2661_read_eeprom()
424 sc->rssi_2ghz_corr -= 14; in rt2661_read_eeprom()
425 if (sc->ext_5ghz_lna) in rt2661_read_eeprom()
426 sc->rssi_5ghz_corr -= 14; in rt2661_read_eeprom()
430 sc->rssi_2ghz_corr, sc->rssi_5ghz_corr); in rt2661_read_eeprom()
434 sc->rfprog = (val >> 8) & 0x3; in rt2661_read_eeprom()
436 sc->rffreq = val & 0xff; in rt2661_read_eeprom()
439 "RF prog=%d\nRF freq=%d\n", sc->rfprog, sc->rffreq); in rt2661_read_eeprom()
444 sc->txpow[i * 2] = (int8_t)(val >> 8); in rt2661_read_eeprom()
447 rt2661_rf5225_1[i * 2].chan, sc->txpow[i * 2]); in rt2661_read_eeprom()
448 sc->txpow[i * 2 + 1] = (int8_t)(val & 0xff); in rt2661_read_eeprom()
451 rt2661_rf5225_1[i * 2 + 1].chan, sc->txpow[i * 2 + 1]); in rt2661_read_eeprom()
454 /* read vendor-specific BBP values */ in rt2661_read_eeprom()
459 sc->bbp_prom[i].reg = val >> 8; in rt2661_read_eeprom()
460 sc->bbp_prom[i].val = val & 0xff; in rt2661_read_eeprom()
462 "BBP R%d=%02x\n", sc->bbp_prom[i].reg, in rt2661_read_eeprom()
463 sc->bbp_prom[i].val); in rt2661_read_eeprom()
542 DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl); in rt2661_alloc_dma_mem()
552 err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p, in rt2661_alloc_dma_mem()
553 alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va, in rt2661_alloc_dma_mem()
554 &dma_p->alength, &dma_p->acc_hdl); in rt2661_alloc_dma_mem()
564 err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL, in rt2661_alloc_dma_mem()
565 dma_p->mem_va, dma_p->alength, bind_flags, in rt2661_alloc_dma_mem()
566 DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies); in rt2661_alloc_dma_mem()
573 if (dma_p->ncookies != 1) { in rt2661_alloc_dma_mem()
579 dma_p->nslots = ~0U; in rt2661_alloc_dma_mem()
580 dma_p->size = ~0U; in rt2661_alloc_dma_mem()
581 dma_p->token = ~0U; in rt2661_alloc_dma_mem()
582 dma_p->offset = 0; in rt2661_alloc_dma_mem()
586 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); in rt2661_alloc_dma_mem()
588 ddi_dma_mem_free(&dma_p->acc_hdl); in rt2661_alloc_dma_mem()
590 ddi_dma_free_handle(&dma_p->dma_hdl); in rt2661_alloc_dma_mem()
598 if (dma_p->dma_hdl != NULL) { in rt2661_free_dma_mem()
599 (void) ddi_dma_unbind_handle(dma_p->dma_hdl); in rt2661_free_dma_mem()
600 if (dma_p->acc_hdl != NULL) { in rt2661_free_dma_mem()
601 ddi_dma_mem_free(&dma_p->acc_hdl); in rt2661_free_dma_mem()
602 dma_p->acc_hdl = NULL; in rt2661_free_dma_mem()
604 ddi_dma_free_handle(&dma_p->dma_hdl); in rt2661_free_dma_mem()
605 dma_p->ncookies = 0; in rt2661_free_dma_mem()
606 dma_p->dma_hdl = NULL; in rt2661_free_dma_mem()
622 ring->count = count; in rt2661_alloc_tx_ring()
623 ring->queued = 0; in rt2661_alloc_tx_ring()
624 ring->cur = 0; in rt2661_alloc_tx_ring()
625 ring->next = 0; in rt2661_alloc_tx_ring()
626 ring->stat = 0; in rt2661_alloc_tx_ring()
628 err = rt2661_alloc_dma_mem(sc->sc_dev, &rt2661_dma_attr, size, in rt2661_alloc_tx_ring()
631 &ring->txdesc_dma); in rt2661_alloc_tx_ring()
638 ring->desc = (struct rt2661_tx_desc *)ring->txdesc_dma.mem_va; in rt2661_alloc_tx_ring()
639 (void) bzero(ring->desc, size); in rt2661_alloc_tx_ring()
640 ring->paddr = ring->txdesc_dma.cookie.dmac_address; in rt2661_alloc_tx_ring()
642 ring->data = kmem_zalloc(len, KM_NOSLEEP); in rt2661_alloc_tx_ring()
643 if (ring->data == NULL) { in rt2661_alloc_tx_ring()
650 desc = &ring->desc[i]; in rt2661_alloc_tx_ring()
651 data = &ring->data[i]; in rt2661_alloc_tx_ring()
652 err = rt2661_alloc_dma_mem(sc->sc_dev, in rt2661_alloc_tx_ring()
653 &rt2661_dma_attr, sc->sc_dmabuf_size, in rt2661_alloc_tx_ring()
656 &data->txdata_dma); in rt2661_alloc_tx_ring()
662 rt2661_free_dma_mem(&ring->data[i].txdata_dma); in rt2661_alloc_tx_ring()
663 i--; in rt2661_alloc_tx_ring()
667 desc->addr[0] = data->txdata_dma.cookie.dmac_address; in rt2661_alloc_tx_ring()
668 data->buf = data->txdata_dma.mem_va; in rt2661_alloc_tx_ring()
669 data->paddr = data->txdata_dma.cookie.dmac_address; in rt2661_alloc_tx_ring()
672 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, in rt2661_alloc_tx_ring()
676 if (ring->data) in rt2661_alloc_tx_ring()
677 kmem_free(ring->data, in rt2661_alloc_tx_ring()
680 rt2661_free_dma_mem(&ring->txdesc_dma); in rt2661_alloc_tx_ring()
692 for (i = 0; i < ring->count; i++) { in rt2661_reset_tx_ring()
693 desc = &ring->desc[i]; in rt2661_reset_tx_ring()
694 data = &ring->data[i]; in rt2661_reset_tx_ring()
696 if (data->ni != NULL) { in rt2661_reset_tx_ring()
697 ieee80211_free_node(data->ni); in rt2661_reset_tx_ring()
698 data->ni = NULL; in rt2661_reset_tx_ring()
701 desc->flags = 0; in rt2661_reset_tx_ring()
705 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, 0, in rt2661_reset_tx_ring()
706 ring->count * sizeof (struct rt2661_tx_desc), in rt2661_reset_tx_ring()
709 ring->queued = 0; in rt2661_reset_tx_ring()
710 ring->cur = ring->next = ring->stat = 0; in rt2661_reset_tx_ring()
721 if (ring->desc != NULL) { in rt2661_free_tx_ring()
722 rt2661_free_dma_mem(&ring->txdesc_dma); in rt2661_free_tx_ring()
725 if (ring->data != NULL) { in rt2661_free_tx_ring()
726 for (i = 0; i < ring->count; i++) { in rt2661_free_tx_ring()
727 data = &ring->data[i]; in rt2661_free_tx_ring()
728 rt2661_free_dma_mem(&data->txdata_dma); in rt2661_free_tx_ring()
729 if (data->ni != NULL) { in rt2661_free_tx_ring()
730 ieee80211_free_node(data->ni); in rt2661_free_tx_ring()
731 data->ni = NULL; in rt2661_free_tx_ring()
734 kmem_free(ring->data, in rt2661_free_tx_ring()
735 ring->count * sizeof (struct rt2661_tx_data)); in rt2661_free_tx_ring()
751 ring->count = count; in rt2661_alloc_rx_ring()
752 ring->cur = 0; in rt2661_alloc_rx_ring()
753 ring->next = 0; in rt2661_alloc_rx_ring()
755 err = rt2661_alloc_dma_mem(sc->sc_dev, &rt2661_dma_attr, size, in rt2661_alloc_rx_ring()
758 &ring->rxdesc_dma); in rt2661_alloc_rx_ring()
765 ring->desc = (struct rt2661_rx_desc *)ring->rxdesc_dma.mem_va; in rt2661_alloc_rx_ring()
766 (void) bzero(ring->desc, size); in rt2661_alloc_rx_ring()
767 ring->paddr = ring->rxdesc_dma.cookie.dmac_address; in rt2661_alloc_rx_ring()
769 ring->data = kmem_zalloc(len, KM_NOSLEEP); in rt2661_alloc_rx_ring()
770 if (ring->data == NULL) { in rt2661_alloc_rx_ring()
777 desc = &ring->desc[i]; in rt2661_alloc_rx_ring()
778 data = &ring->data[i]; in rt2661_alloc_rx_ring()
779 err = rt2661_alloc_dma_mem(sc->sc_dev, in rt2661_alloc_rx_ring()
780 &rt2661_dma_attr, sc->sc_dmabuf_size, in rt2661_alloc_rx_ring()
783 &data->rxdata_dma); in rt2661_alloc_rx_ring()
789 rt2661_free_dma_mem(&ring->data[i].rxdata_dma); in rt2661_alloc_rx_ring()
790 i--; in rt2661_alloc_rx_ring()
794 data->buf = data->rxdata_dma.mem_va; in rt2661_alloc_rx_ring()
795 data->paddr = data->rxdata_dma.cookie.dmac_address; in rt2661_alloc_rx_ring()
796 desc->flags = LE_32(RT2661_RX_BUSY); in rt2661_alloc_rx_ring()
797 desc->physaddr = LE_32(data->paddr); in rt2661_alloc_rx_ring()
800 (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl, in rt2661_alloc_rx_ring()
804 if (ring->data) in rt2661_alloc_rx_ring()
805 kmem_free(ring->data, in rt2661_alloc_rx_ring()
808 rt2661_free_dma_mem(&ring->rxdesc_dma); in rt2661_alloc_rx_ring()
818 for (i = 0; i < ring->count; i++) in rt2661_reset_rx_ring()
819 ring->desc[i].flags = LE_32(RT2661_RX_BUSY); in rt2661_reset_rx_ring()
822 (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl, 0, in rt2661_reset_rx_ring()
823 ring->count * sizeof (struct rt2661_rx_ring), in rt2661_reset_rx_ring()
826 ring->cur = ring->next = 0; in rt2661_reset_rx_ring()
836 if (ring->desc != NULL) { in rt2661_free_rx_ring()
837 rt2661_free_dma_mem(&ring->rxdesc_dma); in rt2661_free_rx_ring()
840 if (ring->data != NULL) { in rt2661_free_rx_ring()
841 for (i = 0; i < ring->count; i++) { in rt2661_free_rx_ring()
842 data = &ring->data[i]; in rt2661_free_rx_ring()
843 rt2661_free_dma_mem(&data->rxdata_dma); in rt2661_free_rx_ring()
845 kmem_free(ring->data, in rt2661_free_rx_ring()
846 ring->count * sizeof (struct rt2661_rx_data)); in rt2661_free_rx_ring()
857 desc = &ring->desc[ring->next]; in rt2661_tx_dma_intr()
858 data = &ring->data[ring->next]; in rt2661_tx_dma_intr()
860 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, in rt2661_tx_dma_intr()
861 ring->next * RT2661_TX_DESC_SIZE, in rt2661_tx_dma_intr()
865 if ((LE_32(desc->flags) & RT2661_TX_BUSY) || in rt2661_tx_dma_intr()
866 !(LE_32(desc->flags) & RT2661_TX_VALID)) in rt2661_tx_dma_intr()
869 (void) ddi_dma_sync(data->txdata_dma.dma_hdl, in rt2661_tx_dma_intr()
870 0, sc->sc_dmabuf_size, in rt2661_tx_dma_intr()
874 desc->flags &= ~LE_32(RT2661_TX_VALID); in rt2661_tx_dma_intr()
876 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, in rt2661_tx_dma_intr()
877 ring->next * RT2661_TX_DESC_SIZE, in rt2661_tx_dma_intr()
882 "tx dma done q=%p idx=%u\n", ring, ring->next); in rt2661_tx_dma_intr()
884 if (++ring->next >= ring->count) /* faster than % count */ in rt2661_tx_dma_intr()
885 ring->next = 0; in rt2661_tx_dma_intr()
892 struct ieee80211com *ic = &sc->sc_ic; in rt2661_tx_intr()
907 ring = (qid <= 3) ? &sc->txq[qid] : &sc->mgtq; in rt2661_tx_intr()
909 /* retrieve rate control algorithm context */ in rt2661_tx_intr()
910 data = &ring->data[ring->stat]; in rt2661_tx_intr()
911 rn = (struct rt2661_node *)data->ni; in rt2661_tx_intr()
927 rn->amn.amn_txcnt++; in rt2661_tx_intr()
929 rn->amn.amn_retrycnt++; in rt2661_tx_intr()
930 sc->sc_tx_retries++; in rt2661_tx_intr()
936 rn->amn.amn_txcnt++; in rt2661_tx_intr()
937 rn->amn.amn_retrycnt++; in rt2661_tx_intr()
946 "tx done q=%d idx=%u\n", qid, ring->stat); in rt2661_tx_intr()
948 ieee80211_free_node(data->ni); in rt2661_tx_intr()
949 data->ni = NULL; in rt2661_tx_intr()
951 ring->queued--; in rt2661_tx_intr()
954 if (++ring->stat >= ring->count) in rt2661_tx_intr()
955 ring->stat = 0; in rt2661_tx_intr()
957 if (sc->sc_need_sched) { in rt2661_tx_intr()
958 sc->sc_need_sched = 0; in rt2661_tx_intr()
959 mac_tx_update(ic->ic_mach); in rt2661_tx_intr()
962 sc->sc_tx_timer = 0; in rt2661_tx_intr()
968 struct ieee80211com *ic = &sc->sc_ic; in rt2661_rx_intr()
979 mutex_enter(&sc->sc_rxlock); in rt2661_rx_intr()
980 ring = &sc->rxq; in rt2661_rx_intr()
985 desc = &ring->desc[ring->cur]; in rt2661_rx_intr()
986 data = &ring->data[ring->cur]; in rt2661_rx_intr()
988 (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl, in rt2661_rx_intr()
989 ring->cur * RT2661_RX_DESC_SIZE, in rt2661_rx_intr()
994 if (LE_32(desc->flags) & RT2661_RX_BUSY) in rt2661_rx_intr()
997 if ((LE_32(desc->flags) & RT2661_RX_PHY_ERROR) || in rt2661_rx_intr()
998 (LE_32(desc->flags) & RT2661_RX_CRC_ERROR)) { in rt2661_rx_intr()
1005 LE_32(desc->flags)); in rt2661_rx_intr()
1006 sc->sc_rx_err++; in rt2661_rx_intr()
1010 if ((LE_32(desc->flags) & RT2661_RX_CIPHER_MASK) != 0) { in rt2661_rx_intr()
1011 sc->sc_rx_err++; in rt2661_rx_intr()
1015 (void) ddi_dma_sync(data->rxdata_dma.dma_hdl, in rt2661_rx_intr()
1016 0, sc->sc_dmabuf_size, in rt2661_rx_intr()
1019 rxbuf = (uint8_t *)data->rxdata_dma.mem_va; in rt2661_rx_intr()
1020 desc->physaddr = LE_32(data->rxdata_dma.cookie.dmac_address); in rt2661_rx_intr()
1021 pktlen = (LE_32(desc->flags) >> 16) & 0xfff; in rt2661_rx_intr()
1023 (pktlen > sc->sc_dmabuf_size)) { in rt2661_rx_intr()
1026 sc->sc_rx_err++; in rt2661_rx_intr()
1033 sc->sc_rx_nobuf++; in rt2661_rx_intr()
1037 bcopy(rxbuf, m->b_rptr, pktlen); in rt2661_rx_intr()
1038 m->b_wptr += pktlen; in rt2661_rx_intr()
1040 wh = (struct ieee80211_frame *)m->b_rptr; in rt2661_rx_intr()
1043 rssi = rt2661_get_rssi(sc, desc->rssi); in rt2661_rx_intr()
1047 sc->avg_rssi = (rssi + 7 * sc->avg_rssi) / 8; in rt2661_rx_intr()
1052 desc->flags |= LE_32(RT2661_RX_BUSY); in rt2661_rx_intr()
1054 (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl, in rt2661_rx_intr()
1055 ring->cur * RT2661_RX_DESC_SIZE, in rt2661_rx_intr()
1060 "rx intr idx=%u\n", sc->rxq.cur); in rt2661_rx_intr()
1061 ring->cur = (ring->cur + 1) % RT2661_RX_RING_COUNT; in rt2661_rx_intr()
1063 mutex_exit(&sc->sc_rxlock); in rt2661_rx_intr()
1072 if (sc->sc_rx_pend) { in rt2661_softintr()
1073 sc->sc_rx_pend = 0; in rt2661_softintr()
1146 rt2661_tx_dma_intr(sc, &sc->mgtq); in rt2661_intr()
1152 sc->sc_rx_pend = 1; in rt2661_intr()
1153 (void) ddi_intr_trigger_softint(sc->sc_softintr_hdl, NULL); in rt2661_intr()
1159 rt2661_tx_dma_intr(sc, &sc->txq[0]); in rt2661_intr()
1165 rt2661_tx_dma_intr(sc, &sc->txq[1]); in rt2661_intr()
1171 rt2661_tx_dma_intr(sc, &sc->txq[2]); in rt2661_intr()
1177 rt2661_tx_dma_intr(sc, &sc->txq[3]); in rt2661_intr()
1198 /* re-enable MAC and MCU interrupts */ in rt2661_intr()
1221 if (IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan)) { in rt2661_get_rssi()
1222 rssi += sc->rssi_2ghz_corr; in rt2661_get_rssi()
1225 rssi -= 64; in rt2661_get_rssi()
1227 rssi -= 74; in rt2661_get_rssi()
1229 rssi -= 90; in rt2661_get_rssi()
1231 rssi += sc->rssi_5ghz_corr; in rt2661_get_rssi()
1234 rssi -= 64; in rt2661_get_rssi()
1236 rssi -= 86; in rt2661_get_rssi()
1238 rssi -= 100; in rt2661_get_rssi()
1243 /* quickly determine if a given rate is CCK or OFDM */
1244 #define RT2661_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) argument
1252 * Return the expected ack rate for a frame transmitted at rate `rate'.
1253 * XXX: this should depend on the destination node basic rate set.
1256 rt2661_ack_rate(struct ieee80211com *ic, int rate) in rt2661_ack_rate() argument
1258 switch (rate) { in rt2661_ack_rate()
1265 return ((ic->ic_curmode == IEEE80211_MODE_11B) ? 4 : rate); in rt2661_ack_rate()
1286 * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'.
1288 * given rate. `flags' indicates whether short preamble is in use or not.
1291 rt2661_txtime(int len, int rate, uint32_t flags) in rt2661_txtime() argument
1295 if (RT2661_RATE_IS_OFDM(rate)) { in rt2661_txtime()
1296 /* IEEE Std 802.11a-1999, pp. 37 */ in rt2661_txtime()
1297 txtime = (8 + 4 * len + 3 + rate - 1) / rate; in rt2661_txtime()
1300 /* IEEE Std 802.11b-1999, pp. 28 */ in rt2661_txtime()
1301 txtime = (16 * len + rate - 1) / rate; in rt2661_txtime()
1302 if (rate != 2 && (flags & IEEE80211_F_SHPREAMBLE)) in rt2661_txtime()
1312 rt2661_plcp_signal(int rate) in rt2661_plcp_signal() argument
1314 switch (rate) { in rt2661_plcp_signal()
1315 /* CCK rates (returned values are device-dependent) */ in rt2661_plcp_signal()
1325 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ in rt2661_plcp_signal()
1351 uint32_t flags, uint16_t xflags, int len, int rate, int ac) in rt2661_setup_tx_desc() argument
1353 struct ieee80211com *ic = &sc->sc_ic; in rt2661_setup_tx_desc()
1357 desc->flags = LE_32(flags); in rt2661_setup_tx_desc()
1358 desc->flags |= LE_32(len << 16); in rt2661_setup_tx_desc()
1359 desc->flags |= LE_32(RT2661_TX_BUSY | RT2661_TX_VALID); in rt2661_setup_tx_desc()
1361 desc->xflags = LE_16(xflags); in rt2661_setup_tx_desc()
1362 desc->xflags |= LE_16(1 << 13); in rt2661_setup_tx_desc()
1364 desc->wme = LE_16( in rt2661_setup_tx_desc()
1375 desc->qid = (uint8_t)ac; in rt2661_setup_tx_desc()
1378 desc->plcp_signal = rt2661_plcp_signal(rate); in rt2661_setup_tx_desc()
1379 desc->plcp_service = 4; in rt2661_setup_tx_desc()
1383 if (RT2661_RATE_IS_OFDM(rate)) { in rt2661_setup_tx_desc()
1384 desc->flags |= LE_32(RT2661_TX_OFDM); in rt2661_setup_tx_desc()
1387 desc->plcp_length_hi = plcp_length >> 6; in rt2661_setup_tx_desc()
1388 desc->plcp_length_lo = plcp_length & 0x3f; in rt2661_setup_tx_desc()
1390 plcp_length = (16 * len + rate - 1) / rate; in rt2661_setup_tx_desc()
1391 if (rate == 22) { in rt2661_setup_tx_desc()
1394 desc->plcp_service |= RT2661_PLCP_LENGEXT; in rt2661_setup_tx_desc()
1396 desc->plcp_length_hi = plcp_length >> 8; in rt2661_setup_tx_desc()
1397 desc->plcp_length_lo = plcp_length & 0xff; in rt2661_setup_tx_desc()
1399 if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) in rt2661_setup_tx_desc()
1400 desc->plcp_signal |= 0x08; in rt2661_setup_tx_desc()
1404 desc->len [0] = LE_16(len); in rt2661_setup_tx_desc()
1417 int err, off, rate; in rt2661_send() local
1423 mutex_enter(&sc->sc_txlock); in rt2661_send()
1424 ring = &sc->txq[0]; in rt2661_send()
1427 if (ring->queued > RT2661_TX_RING_COUNT - 8) { in rt2661_send()
1428 sc->sc_need_sched = 1; in rt2661_send()
1429 sc->sc_tx_nobuf++; in rt2661_send()
1442 for (off = 0, m0 = mp; m0 != NULL; m0 = m0->b_cont) { in rt2661_send()
1444 (void) bcopy(m0->b_rptr, m->b_rptr + off, mblen); in rt2661_send()
1447 m->b_wptr += off; in rt2661_send()
1449 wh = (struct ieee80211_frame *)m->b_rptr; in rt2661_send()
1450 ni = ieee80211_find_txnode(ic, wh->i_addr1); in rt2661_send()
1453 sc->sc_tx_err++; in rt2661_send()
1459 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { in rt2661_send()
1463 sc->sc_tx_err++; in rt2661_send()
1468 wh = (struct ieee80211_frame *)m->b_rptr; in rt2661_send()
1473 desc = &ring->desc[ring->cur]; in rt2661_send()
1474 data = &ring->data[ring->cur]; in rt2661_send()
1475 data->ni = ieee80211_ref_node(ni); in rt2661_send()
1477 /* pickup a rate */ in rt2661_send()
1478 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_send()
1479 /* multicast frames are sent at the lowest avail. rate */ in rt2661_send()
1480 rate = ni->in_rates.ir_rates[0]; in rt2661_send()
1481 } else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) { in rt2661_send()
1482 rate = ic->ic_sup_rates[ic->ic_curmode]. in rt2661_send()
1483 ir_rates[ic->ic_fixed_rate]; in rt2661_send()
1485 rate = ni->in_rates.ir_rates[ni->in_txrate]; in rt2661_send()
1486 if (rate == 0) in rt2661_send()
1487 rate = 2; /* XXX should not happen */ in rt2661_send()
1488 rate &= IEEE80211_RATE_VAL; in rt2661_send()
1490 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_send()
1494 rt2661_ack_rate(ic, rate), ic->ic_flags) + sc->sifs; in rt2661_send()
1495 *(uint16_t *)wh->i_dur = LE_16(dur); in rt2661_send()
1498 bcopy(m->b_rptr, data->buf, pktlen); in rt2661_send()
1499 rt2661_setup_tx_desc(sc, desc, flags, 0, pktlen, rate, 0); in rt2661_send()
1501 (void) ddi_dma_sync(data->txdata_dma.dma_hdl, in rt2661_send()
1505 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, in rt2661_send()
1506 ring->cur * RT2661_TX_DESC_SIZE, in rt2661_send()
1511 "sending data frame len=%u idx=%u rate=%u\n", in rt2661_send()
1512 pktlen, ring->cur, rate); in rt2661_send()
1515 ring->queued++; in rt2661_send()
1516 ring->cur = (ring->cur + 1) % RT2661_TX_RING_COUNT; in rt2661_send()
1519 ic->ic_stats.is_tx_frags++; in rt2661_send()
1520 ic->ic_stats.is_tx_bytes += pktlen; in rt2661_send()
1528 mutex_exit(&sc->sc_txlock); in rt2661_send()
1543 int err, off, rate; in rt2661_mgmt_send() local
1554 ring = &sc->mgtq; in rt2661_mgmt_send()
1557 if (ring->queued >= RT2661_MGT_RING_COUNT) { in rt2661_mgmt_send()
1558 sc->sc_tx_nobuf++; in rt2661_mgmt_send()
1571 for (off = 0, m0 = mp; m0 != NULL; m0 = m0->b_cont) { in rt2661_mgmt_send()
1573 (void) bcopy(m0->b_rptr, m->b_rptr + off, mblen); in rt2661_mgmt_send()
1576 m->b_wptr += off; in rt2661_mgmt_send()
1578 wh = (struct ieee80211_frame *)m->b_rptr; in rt2661_mgmt_send()
1579 ni = ieee80211_find_txnode(ic, wh->i_addr1); in rt2661_mgmt_send()
1582 sc->sc_tx_err++; in rt2661_mgmt_send()
1586 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { in rt2661_mgmt_send()
1590 sc->sc_tx_err++; in rt2661_mgmt_send()
1595 wh = (struct ieee80211_frame *)m->b_rptr; in rt2661_mgmt_send()
1600 desc = &ring->desc[ring->cur]; in rt2661_mgmt_send()
1601 data = &ring->data[ring->cur]; in rt2661_mgmt_send()
1602 data->ni = ieee80211_ref_node(ni); in rt2661_mgmt_send()
1604 /* send mgt frames at the lowest available rate */ in rt2661_mgmt_send()
1605 rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; in rt2661_mgmt_send()
1607 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { in rt2661_mgmt_send()
1611 rate, ic->ic_flags) + sc->sifs; in rt2661_mgmt_send()
1612 *(uint16_t *)wh->i_dur = LE_16(dur); in rt2661_mgmt_send()
1615 if ((wh->i_fc[0] & in rt2661_mgmt_send()
1621 bcopy(m->b_rptr, data->buf, pktlen); in rt2661_mgmt_send()
1622 rt2661_setup_tx_desc(sc, desc, flags, 0, pktlen, rate, RT2661_QID_MGT); in rt2661_mgmt_send()
1624 (void) ddi_dma_sync(data->txdata_dma.dma_hdl, in rt2661_mgmt_send()
1628 (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl, in rt2661_mgmt_send()
1629 ring->cur * RT2661_TX_DESC_SIZE, in rt2661_mgmt_send()
1634 "sending mgmt frame len=%u idx=%u rate=%u\n", in rt2661_mgmt_send()
1635 pktlen, ring->cur, rate); in rt2661_mgmt_send()
1638 ring->queued++; in rt2661_mgmt_send()
1639 ring->cur = (ring->cur + 1) % RT2661_MGT_RING_COUNT; in rt2661_mgmt_send()
1642 ic->ic_stats.is_tx_frags++; in rt2661_mgmt_send()
1643 ic->ic_stats.is_tx_bytes += pktlen; in rt2661_mgmt_send()
1658 amn->amn_success = 0; in rt2661_amrr_node_init()
1659 amn->amn_recovery = 0; in rt2661_amrr_node_init()
1660 amn->amn_txcnt = amn->amn_retrycnt = 0; in rt2661_amrr_node_init()
1661 amn->amn_success_threshold = amrr->amrr_min_success_threshold; in rt2661_amrr_node_init()
1668 #define RV(rate) ((rate) & IEEE80211_RATE_VAL) in rt2661_amrr_choose() argument
1670 ((amn)->amn_retrycnt < (amn)->amn_txcnt / 10) in rt2661_amrr_choose()
1672 ((amn)->amn_retrycnt > (amn)->amn_txcnt / 3) in rt2661_amrr_choose()
1674 ((amn)->amn_txcnt > 10) in rt2661_amrr_choose()
1676 ((ni)->in_txrate == 0) in rt2661_amrr_choose()
1678 ((ni)->in_txrate == (ni)->in_rates.ir_nrates - 1) in rt2661_amrr_choose()
1680 ((ni)->in_txrate++) in rt2661_amrr_choose()
1682 ((ni)->in_txrate--) in rt2661_amrr_choose()
1684 { (amn)->amn_txcnt = (amn)->amn_retrycnt = 0; } in rt2661_amrr_choose()
1689 amn->amn_success++; in rt2661_amrr_choose()
1690 if (amn->amn_success >= amn->amn_success_threshold && in rt2661_amrr_choose()
1692 amn->amn_recovery = 1; in rt2661_amrr_choose()
1693 amn->amn_success = 0; in rt2661_amrr_choose()
1696 "increase rate = %d, #tx = %d, #retries = %d\n", in rt2661_amrr_choose()
1697 RV(ni->in_rates.ir_rates[ni->in_txrate]), in rt2661_amrr_choose()
1698 amn->amn_txcnt, amn->amn_retrycnt); in rt2661_amrr_choose()
1701 amn->amn_recovery = 0; in rt2661_amrr_choose()
1703 amn->amn_success = 0; in rt2661_amrr_choose()
1705 if (amn->amn_recovery) { in rt2661_amrr_choose()
1706 amn->amn_success_threshold *= 2; in rt2661_amrr_choose()
1707 if (amn->amn_success_threshold > in rt2661_amrr_choose()
1708 amrr->amrr_max_success_threshold) in rt2661_amrr_choose()
1709 amn->amn_success_threshold = in rt2661_amrr_choose()
1710 amrr->amrr_max_success_threshold; in rt2661_amrr_choose()
1712 amn->amn_success_threshold = in rt2661_amrr_choose()
1713 amrr->amrr_min_success_threshold; in rt2661_amrr_choose()
1717 "decrease rate = %d, #tx = %d, #retries = %d\n", in rt2661_amrr_choose()
1718 RV(ni->in_rates.ir_rates[ni->in_txrate]), in rt2661_amrr_choose()
1719 amn->amn_txcnt, amn->amn_retrycnt); in rt2661_amrr_choose()
1722 amn->amn_recovery = 0; in rt2661_amrr_choose()
1739 if (!(sc->sc_rcr & RT2661_RCR_PROMISC)) in rt2661_update_promisc()
1745 (sc->sc_rcr & RT2661_RCR_PROMISC) ? "entering" : "leaving"); in rt2661_update_promisc()
1768 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_slottime()
1772 slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20; in rt2661_set_slottime()
1784 * Enable multi-rate retries for frames sent at OFDM rates.
1790 struct ieee80211com *ic = &sc->sc_ic; in rt2661_enable_mrr()
1796 if (!IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) in rt2661_enable_mrr()
1811 if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE) in rt2661_set_txpreamble()
1820 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_basicrates()
1822 /* update basic rate set */ in rt2661_set_basicrates()
1823 if (ic->ic_curmode == IEEE80211_MODE_11B) { in rt2661_set_basicrates()
1826 } else if (ic->ic_curmode == IEEE80211_MODE_11A) { in rt2661_set_basicrates()
1854 struct ieee80211com *ic = &sc->sc_ic; in rt2661_enable_tsf_sync()
1860 tmp |= ic->ic_bss->in_intval * 16; in rt2661_enable_tsf_sync()
1863 if (ic->ic_opmode == IEEE80211_M_STA) in rt2661_enable_tsf_sync()
1874 struct ieee80211com *ic = &sc->sc_ic; in rt2661_next_scan()
1876 if (ic->ic_state == IEEE80211_S_SCAN) in rt2661_next_scan()
1886 rt2661_amrr_node_init(&sc->amrr, &((struct rt2661_node *)ni)->amn); in rt2661_newassoc()
1888 /* set rate to some reasonable initial value */ in rt2661_newassoc()
1889 i = ni->in_rates.ir_nrates - 1; in rt2661_newassoc()
1890 while (i > 0 && ((ni->in_rates.ir_rates[i] & IEEE80211_RATE_VAL) > 72)) in rt2661_newassoc()
1891 i--; in rt2661_newassoc()
1893 ni->in_txrate = i; in rt2661_newassoc()
1902 rt2661_amrr_choose(&sc->amrr, ni, &rn->amn); in rt2661_iter_func()
1920 * external low-noise amplifier. in rt2661_rx_tune()
1923 if (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan)) in rt2661_rx_tune()
1925 if ((IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan) && sc->ext_2ghz_lna) || in rt2661_rx_tune()
1926 (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan) && sc->ext_5ghz_lna)) in rt2661_rx_tune()
1930 dbm = sc->avg_rssi; in rt2661_rx_tune()
1937 if (dbm < -74) { in rt2661_rx_tune()
1939 bbp17 = sc->bbp17; /* current value */ in rt2661_rx_tune()
1941 hi -= 2 * (-74 - dbm); in rt2661_rx_tune()
1950 bbp17 = (uint8_t)max(bbp17 - 1, lo); in rt2661_rx_tune()
1952 } else if (dbm < -66) { in rt2661_rx_tune()
1954 } else if (dbm < -58) { in rt2661_rx_tune()
1956 } else if (dbm < -35) { in rt2661_rx_tune()
1958 } else { /* very good RSSI >= -35dBm */ in rt2661_rx_tune()
1962 if (bbp17 != sc->bbp17) { in rt2661_rx_tune()
1964 "BBP17 %x->%x\n", sc->bbp17, bbp17); in rt2661_rx_tune()
1966 sc->bbp17 = bbp17; in rt2661_rx_tune()
1972 * various settings like rate control statistics or Rx sensitivity.
1978 struct ieee80211com *ic = &sc->sc_ic; in rt2661_updatestats()
1980 if (ic->ic_opmode == IEEE80211_M_STA) in rt2661_updatestats()
1981 rt2661_iter_func(sc, ic->ic_bss); in rt2661_updatestats()
1983 ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg); in rt2661_updatestats()
1986 if (++sc->ncalls & 1) in rt2661_updatestats()
1989 sc->sc_rssadapt_id = timeout(rt2661_updatestats, (void *)sc, in rt2661_updatestats()
2004 ostate = ic->ic_state; in rt2661_newstate()
2005 sc->sc_ostate = ostate; in rt2661_newstate()
2008 "%x -> %x\n", ostate, nstate); in rt2661_newstate()
2010 if (sc->sc_scan_id != 0) { in rt2661_newstate()
2011 (void) untimeout(sc->sc_scan_id); in rt2661_newstate()
2012 sc->sc_scan_id = 0; in rt2661_newstate()
2015 if (sc->sc_rssadapt_id) { in rt2661_newstate()
2016 (void) untimeout(sc->sc_rssadapt_id); in rt2661_newstate()
2017 sc->sc_rssadapt_id = 0; in rt2661_newstate()
2029 rt2661_set_chan(sc, ic->ic_curchan); in rt2661_newstate()
2030 sc->sc_scan_id = timeout(rt2661_next_scan, (void *)sc, in rt2661_newstate()
2035 rt2661_set_chan(sc, ic->ic_curchan); in rt2661_newstate()
2038 rt2661_set_chan(sc, ic->ic_curchan); in rt2661_newstate()
2040 ni = ic->ic_bss; in rt2661_newstate()
2041 if (ic->ic_opmode != IEEE80211_M_MONITOR) { in rt2661_newstate()
2046 rt2661_set_bssid(sc, ni->in_bssid); in rt2661_newstate()
2049 if (ic->ic_opmode == IEEE80211_M_STA) { in rt2661_newstate()
2050 /* fake a join to init the tx rate */ in rt2661_newstate()
2054 if (ic->ic_opmode != IEEE80211_M_MONITOR) { in rt2661_newstate()
2055 sc->ncalls = 0; in rt2661_newstate()
2056 sc->avg_rssi = -95; /* reset EMA */ in rt2661_newstate()
2057 sc->sc_rssadapt_id = timeout(rt2661_updatestats, in rt2661_newstate()
2068 err = sc->sc_newstate(ic, nstate, arg); in rt2661_newstate()
2079 return ((rn != NULL) ? &rn->ni : NULL); in rt2661_node_alloc()
2085 struct ieee80211com *ic = in->in_ic; in rt2661_node_free()
2087 ic->ic_node_cleanup(in); in rt2661_node_free()
2088 if (in->in_wpa_ie != NULL) in rt2661_node_free()
2089 ieee80211_free(in->in_wpa_ie); in rt2661_node_free()
2099 sc->sc_tx_timer = 0; in rt2661_stop_locked()
2121 rt2661_reset_tx_ring(sc, &sc->txq[0]); in rt2661_stop_locked()
2122 rt2661_reset_tx_ring(sc, &sc->txq[1]); in rt2661_stop_locked()
2123 rt2661_reset_tx_ring(sc, &sc->txq[2]); in rt2661_stop_locked()
2124 rt2661_reset_tx_ring(sc, &sc->txq[3]); in rt2661_stop_locked()
2125 rt2661_reset_tx_ring(sc, &sc->mgtq); in rt2661_stop_locked()
2126 rt2661_reset_rx_ring(sc, &sc->rxq); in rt2661_stop_locked()
2201 /* write vendor-specific BBP values (from EEPROM) */ in rt2661_bbp_init()
2203 if (sc->bbp_prom[i].reg == 0) in rt2661_bbp_init()
2205 rt2661_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val); in rt2661_bbp_init()
2233 "BBP R%u <- 0x%02x\n", reg, val); in rt2661_bbp_write()
2253 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || in rt2661_select_band()
2254 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { in rt2661_select_band()
2258 sc->bbp17 = bbp17; in rt2661_select_band()
2263 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || in rt2661_select_band()
2264 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { in rt2661_select_band()
2283 sc->sifs = IEEE80211_IS_CHAN_5GHZ(c) ? 16 : 10; in rt2661_select_band()
2330 sc->rf_regs[reg] = val; in rt2661_rf_write()
2333 "RF R[%u] <- 0x%05x\n", reg & 3, val & 0x1fffff); in rt2661_rf_write()
2339 struct ieee80211com *ic = &sc->sc_ic; in rt2661_set_chan()
2350 rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2; in rt2661_set_chan()
2357 power = sc->txpow[i]; in rt2661_set_chan()
2362 bbp94 += power - 31; in rt2661_set_chan()
2368 * vice-versa, BBP registers need to be reprogrammed. in rt2661_set_chan()
2370 if (ic->ic_flags != sc->sc_curchan->ich_flags) { in rt2661_set_chan()
2374 sc->sc_curchan = c; in rt2661_set_chan()
2379 rt2661_rf_write(sc, RT2661_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
2386 rt2661_rf_write(sc, RT2661_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
2393 rt2661_rf_write(sc, RT2661_RF4, rfprog[i].r4 | sc->rffreq << 10); in rt2661_set_chan()
2395 /* enable smart mode for MIMO-capable RFs */ in rt2661_set_chan()
2399 if (sc->rf_rev == RT2661_RF_5325 || sc->rf_rev == RT2661_RF_2529) in rt2661_set_chan()
2417 struct ieee80211com *ic = &sc->sc_ic; in rt2661_init()
2432 sc->sc_flags |= RT2661_F_FWLOADED; in rt2661_init()
2436 RT2661_WRITE(sc, RT2661_AC1_BASE_CSR, sc->txq[1].paddr); in rt2661_init()
2437 RT2661_WRITE(sc, RT2661_AC0_BASE_CSR, sc->txq[0].paddr); in rt2661_init()
2438 RT2661_WRITE(sc, RT2661_AC2_BASE_CSR, sc->txq[2].paddr); in rt2661_init()
2439 RT2661_WRITE(sc, RT2661_AC3_BASE_CSR, sc->txq[3].paddr); in rt2661_init()
2442 RT2661_WRITE(sc, RT2661_MGT_BASE_CSR, sc->mgtq.paddr); in rt2661_init()
2445 RT2661_WRITE(sc, RT2661_RX_BASE_CSR, sc->rxq.paddr); in rt2661_init()
2478 rt2661_set_macaddr(sc, ic->ic_macaddr); in rt2661_init()
2505 sc->sc_curchan = ic->ic_bss->in_chan = ic->ic_curchan; in rt2661_init()
2506 rt2661_select_band(sc, sc->sc_curchan); in rt2661_init()
2508 rt2661_set_chan(sc, sc->sc_curchan); in rt2661_init()
2514 if (ic->ic_opmode != IEEE80211_M_MONITOR) { in rt2661_init()
2517 if (ic->ic_opmode != IEEE80211_M_HOSTAP) in rt2661_init()
2519 if (!(sc->sc_rcr & RT2661_RCR_PROMISC)) in rt2661_init()
2564 struct ieee80211com *ic = &sc->sc_ic; in rt2661_m_start()
2574 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); in rt2661_m_start()
2577 sc->sc_flags |= RT2661_F_RUNNING; in rt2661_m_start()
2593 ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1); in rt2661_m_stop()
2596 sc->sc_flags &= ~RT2661_F_RUNNING; in rt2661_m_stop()
2604 struct ieee80211com *ic = &sc->sc_ic; in rt2661_m_ioctl()
2610 if (ic->ic_des_esslen) { in rt2661_m_ioctl()
2615 IEEE80211_S_SCAN, -1); in rt2661_m_ioctl()
2633 err = ieee80211_getprop(&sc->sc_ic, pr_name, wldp_pr_num, in rt2661_m_getprop()
2645 ieee80211_propinfo(&sc->sc_ic, pr_name, wldp_pr_num, mph); in rt2661_m_propinfo()
2653 ieee80211com_t *ic = &sc->sc_ic; in rt2661_m_setprop()
2660 if (ic->ic_des_esslen) { in rt2661_m_setprop()
2665 IEEE80211_S_SCAN, -1); in rt2661_m_setprop()
2679 struct ieee80211com *ic = &sc->sc_ic; in rt2661_m_tx()
2692 if (ic->ic_state != IEEE80211_S_RUN) { in rt2661_m_tx()
2694 "discard, state %u\n", ic->ic_state); in rt2661_m_tx()
2700 next = mp->b_next; in rt2661_m_tx()
2701 mp->b_next = NULL; in rt2661_m_tx()
2704 mp->b_next = next; in rt2661_m_tx()
2733 sc->sc_rcr |= RT2661_RCR_PROMISC; in rt2661_m_promisc()
2734 sc->sc_rcr |= RT2661_RCR_MULTI; in rt2661_m_promisc()
2736 sc->sc_rcr &= ~RT2661_RCR_PROMISC; in rt2661_m_promisc()
2737 sc->sc_rcr &= ~RT2661_RCR_MULTI; in rt2661_m_promisc()
2748 struct ieee80211com *ic = &sc->sc_ic; in rt2661_m_stat()
2749 struct ieee80211_node *ni = ic->ic_bss; in rt2661_m_stat()
2750 struct ieee80211_rateset *rs = &ni->in_rates; in rt2661_m_stat()
2755 *val = ((ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) ? in rt2661_m_stat()
2756 (rs->ir_rates[ni->in_txrate] & IEEE80211_RATE_VAL) in rt2661_m_stat()
2757 : ic->ic_fixed_rate) / 2 * 1000000; in rt2661_m_stat()
2760 *val = sc->sc_tx_nobuf; in rt2661_m_stat()
2763 *val = sc->sc_rx_nobuf; in rt2661_m_stat()
2766 *val = sc->sc_rx_err; in rt2661_m_stat()
2769 *val = ic->ic_stats.is_rx_bytes; in rt2661_m_stat()
2772 *val = ic->ic_stats.is_rx_frags; in rt2661_m_stat()
2775 *val = ic->ic_stats.is_tx_bytes; in rt2661_m_stat()
2778 *val = ic->ic_stats.is_tx_frags; in rt2661_m_stat()
2782 *val = sc->sc_tx_err; in rt2661_m_stat()
2785 *val = sc->sc_tx_retries; in rt2661_m_stat()
2832 sc->sc_flags &= ~RT2661_F_SUSPEND; in rt2661_attach()
2853 ic = (struct ieee80211com *)&sc->sc_ic; in rt2661_attach()
2854 sc->sc_dev = devinfo; in rt2661_attach()
2857 err = ddi_regs_map_setup(devinfo, 0, &sc->sc_cfg_base, 0, 0, in rt2661_attach()
2858 &rt2661_csr_accattr, &sc->sc_cfg_handle); in rt2661_attach()
2865 cachelsz = ddi_get8(sc->sc_cfg_handle, in rt2661_attach()
2866 (uint8_t *)(sc->sc_cfg_base + PCI_CONF_CACHE_LINESZ)); in rt2661_attach()
2869 sc->sc_cachelsz = cachelsz << 2; in rt2661_attach()
2870 sc->sc_dmabuf_size = roundup(IEEE80211_MAX_LEN, sc->sc_cachelsz); in rt2661_attach()
2872 vendor_id = ddi_get16(sc->sc_cfg_handle, in rt2661_attach()
2873 (uint16_t *)((uintptr_t)(sc->sc_cfg_base) + PCI_CONF_VENID)); in rt2661_attach()
2874 device_id = ddi_get16(sc->sc_cfg_handle, in rt2661_attach()
2875 (uint16_t *)((uintptr_t)(sc->sc_cfg_base) + PCI_CONF_DEVID)); in rt2661_attach()
2885 ddi_put16(sc->sc_cfg_handle, in rt2661_attach()
2886 (uint16_t *)((uintptr_t)(sc->sc_cfg_base) + PCI_CONF_COMM), in rt2661_attach()
2888 ddi_put8(sc->sc_cfg_handle, in rt2661_attach()
2889 (uint8_t *)(sc->sc_cfg_base + PCI_CONF_LATENCY_TIMER), 0xa8); in rt2661_attach()
2890 ddi_put8(sc->sc_cfg_handle, in rt2661_attach()
2891 (uint8_t *)(sc->sc_cfg_base + PCI_CONF_ILINE), 0x10); in rt2661_attach()
2895 &sc->sc_io_base, 0, 0, &rt2661_csr_accattr, &sc->sc_io_handle); in rt2661_attach()
2907 "fixed type interrupt is not supported\n"); in rt2661_attach()
2914 "no fixed interrupts\n"); in rt2661_attach()
2918 sc->sc_intr_htable = kmem_zalloc(sizeof (ddi_intr_handle_t), KM_SLEEP); in rt2661_attach()
2920 err = ddi_intr_alloc(devinfo, sc->sc_intr_htable, in rt2661_attach()
2928 err = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_pri); in rt2661_attach()
2935 sc->amrr.amrr_min_success_threshold = 1; in rt2661_attach()
2936 sc->amrr.amrr_max_success_threshold = 15; in rt2661_attach()
2956 rt2661_get_rf(sc->rf_rev), in rt2661_attach()
2957 ic->ic_macaddr[0], ic->ic_macaddr[1], ic->ic_macaddr[2], in rt2661_attach()
2958 ic->ic_macaddr[3], ic->ic_macaddr[4], ic->ic_macaddr[5]); in rt2661_attach()
2985 sc->sc_flags = 0; in rt2661_attach()
2986 sc->sc_flags |= RT2661_F_FWLOADED; in rt2661_attach()
2992 err = rt2661_alloc_tx_ring(sc, &sc->txq[ac], in rt2661_attach()
3001 err = rt2661_alloc_tx_ring(sc, &sc->mgtq, RT2661_MGT_RING_COUNT); in rt2661_attach()
3008 err = rt2661_alloc_rx_ring(sc, &sc->rxq, RT2661_RX_RING_COUNT); in rt2661_attach()
3015 mutex_init(&sc->sc_genlock, NULL, MUTEX_DRIVER, NULL); in rt2661_attach()
3016 mutex_init(&sc->sc_txlock, NULL, MUTEX_DRIVER, NULL); in rt2661_attach()
3017 mutex_init(&sc->sc_rxlock, NULL, MUTEX_DRIVER, NULL); in rt2661_attach()
3019 ic->ic_phytype = IEEE80211_T_OFDM; in rt2661_attach()
3020 ic->ic_opmode = IEEE80211_M_STA; in rt2661_attach()
3021 ic->ic_state = IEEE80211_S_INIT; in rt2661_attach()
3024 ic->ic_caps = in rt2661_attach()
3030 ic->ic_caps |= IEEE80211_C_WPA; in rt2661_attach()
3033 ic->ic_sup_rates[IEEE80211_MODE_11B] = rt2661_rateset_11b; in rt2661_attach()
3034 ic->ic_sup_rates[IEEE80211_MODE_11G] = rt2661_rateset_11g; in rt2661_attach()
3038 ic->ic_sup_channels[i].ich_freq = in rt2661_attach()
3040 ic->ic_sup_channels[i].ich_flags = in rt2661_attach()
3045 ic->ic_maxrssi = 63; in rt2661_attach()
3046 ic->ic_xmit = rt2661_mgmt_send; in rt2661_attach()
3054 ic->ic_node_alloc = rt2661_node_alloc; in rt2661_attach()
3055 ic->ic_node_free = rt2661_node_free; in rt2661_attach()
3056 ic->ic_set_shortslot = rt2661_updateslot; in rt2661_attach()
3059 sc->sc_newstate = ic->ic_newstate; in rt2661_attach()
3060 ic->ic_newstate = rt2661_newstate; in rt2661_attach()
3062 ic->ic_def_txkey = 0; in rt2661_attach()
3064 err = ddi_intr_add_softint(devinfo, &sc->sc_softintr_hdl, in rt2661_attach()
3072 err = ddi_intr_add_handler(sc->sc_intr_htable[0], rt2661_intr, in rt2661_attach()
3080 err = ddi_intr_enable(sc->sc_intr_htable[0]); in rt2661_attach()
3091 wd.wd_opmode = ic->ic_opmode; in rt2661_attach()
3093 IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid); in rt2661_attach()
3101 macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI; in rt2661_attach()
3102 macp->m_driver = sc; in rt2661_attach()
3103 macp->m_dip = devinfo; in rt2661_attach()
3104 macp->m_src_addr = ic->ic_macaddr; in rt2661_attach()
3105 macp->m_callbacks = &rt2661_m_callbacks; in rt2661_attach()
3106 macp->m_min_sdu = 0; in rt2661_attach()
3107 macp->m_max_sdu = IEEE80211_MTU; in rt2661_attach()
3108 macp->m_pdata = &wd; in rt2661_attach()
3109 macp->m_pdata_size = sizeof (wd); in rt2661_attach()
3111 err = mac_register(macp, &ic->ic_mach); in rt2661_attach()
3130 mac_link_update(ic->ic_mach, LINK_STATE_DOWN); in rt2661_attach()
3137 (void) ddi_intr_disable(sc->sc_intr_htable[0]); in rt2661_attach()
3139 (void) ddi_intr_remove_handler(sc->sc_intr_htable[0]); in rt2661_attach()
3141 (void) ddi_intr_remove_softint(sc->sc_softintr_hdl); in rt2661_attach()
3142 sc->sc_softintr_hdl = NULL; in rt2661_attach()
3144 mutex_destroy(&sc->sc_genlock); in rt2661_attach()
3145 mutex_destroy(&sc->sc_txlock); in rt2661_attach()
3146 mutex_destroy(&sc->sc_rxlock); in rt2661_attach()
3148 rt2661_free_rx_ring(sc, &sc->rxq); in rt2661_attach()
3150 rt2661_free_tx_ring(sc, &sc->mgtq); in rt2661_attach()
3152 while (--ac >= 0) in rt2661_attach()
3153 rt2661_free_tx_ring(sc, &sc->txq[ac]); in rt2661_attach()
3155 (void) ddi_intr_free(sc->sc_intr_htable[0]); in rt2661_attach()
3157 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t)); in rt2661_attach()
3159 ddi_regs_map_free(&sc->sc_io_handle); in rt2661_attach()
3161 ddi_regs_map_free(&sc->sc_cfg_handle); in rt2661_attach()
3181 sc->sc_flags |= RT2661_F_SUSPEND; in rt2661_detach()
3182 sc->sc_flags &= ~RT2661_F_FWLOADED; in rt2661_detach()
3191 if (mac_disable(sc->sc_ic.ic_mach) != 0) in rt2661_detach()
3197 (void) mac_unregister(sc->sc_ic.ic_mach); in rt2661_detach()
3199 (void) ddi_intr_remove_softint(sc->sc_softintr_hdl); in rt2661_detach()
3200 sc->sc_softintr_hdl = NULL; in rt2661_detach()
3201 (void) ddi_intr_disable(sc->sc_intr_htable[0]); in rt2661_detach()
3202 (void) ddi_intr_remove_handler(sc->sc_intr_htable[0]); in rt2661_detach()
3203 (void) ddi_intr_free(sc->sc_intr_htable[0]); in rt2661_detach()
3204 kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t)); in rt2661_detach()
3209 ieee80211_detach(&sc->sc_ic); in rt2661_detach()
3211 mutex_destroy(&sc->sc_genlock); in rt2661_detach()
3212 mutex_destroy(&sc->sc_txlock); in rt2661_detach()
3213 mutex_destroy(&sc->sc_rxlock); in rt2661_detach()
3215 rt2661_free_tx_ring(sc, &sc->txq[0]); in rt2661_detach()
3216 rt2661_free_tx_ring(sc, &sc->txq[1]); in rt2661_detach()
3217 rt2661_free_tx_ring(sc, &sc->txq[2]); in rt2661_detach()
3218 rt2661_free_tx_ring(sc, &sc->txq[3]); in rt2661_detach()
3219 rt2661_free_tx_ring(sc, &sc->mgtq); in rt2661_detach()
3220 rt2661_free_rx_ring(sc, &sc->rxq); in rt2661_detach()
3222 ddi_regs_map_free(&sc->sc_io_handle); in rt2661_detach()
3223 ddi_regs_map_free(&sc->sc_cfg_handle); in rt2661_detach()
3249 sc->sc_flags |= RT2661_F_QUIESCE; in rt2661_quiesce()