Lines Matching +full:cts +full:- +full:rts +full:- +full:swap
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
544 sc->sc_dev = dev; in bwn_attach()
546 sc->sc_debug = bwn_debug; in bwn_attach()
553 sc->sc_quirks = bhnd_device_quirks(dev, bwn_devices, in bwn_attach()
558 sc->sc_quirks |= bhnd_device_quirks(hostb, bridge_devices, in bwn_attach()
564 sc->sc_quirks |= BWN_QUIRK_NODMA; in bwn_attach()
567 sc->sc_cid = *bhnd_get_chipid(dev); in bwn_attach()
568 if ((error = bhnd_read_board_info(dev, &sc->sc_board_info))) { in bwn_attach()
569 device_printf(sc->sc_dev, "couldn't read board info\n"); in bwn_attach()
574 sc->sc_mem_rid = 0; in bwn_attach()
575 sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in bwn_attach()
576 &sc->sc_mem_rid, RF_ACTIVE); in bwn_attach()
577 if (sc->sc_mem_res == NULL) { in bwn_attach()
578 device_printf(sc->sc_dev, "couldn't allocate registers\n"); in bwn_attach()
582 if ((error = bhnd_alloc_pmu(sc->sc_dev))) { in bwn_attach()
583 bus_release_resource(sc->sc_dev, SYS_RES_MEMORY, in bwn_attach()
584 sc->sc_mem_rid, sc->sc_mem_res); in bwn_attach()
593 error = bhnd_nvram_getvar_uint8(sc->sc_dev, BHND_NVAR_AA2G, in bwn_attach()
594 &sc->sc_ant2g); in bwn_attach()
596 device_printf(sc->sc_dev, "error determining 2GHz antenna " in bwn_attach()
601 error = bhnd_nvram_getvar_uint8(sc->sc_dev, BHND_NVAR_AA5G, in bwn_attach()
602 &sc->sc_ant5g); in bwn_attach()
604 device_printf(sc->sc_dev, "error determining 5GHz antenna " in bwn_attach()
609 if ((sc->sc_flags & BWN_FLAG_ATTACHED) == 0) { in bwn_attach()
612 sc->sc_flags |= BWN_FLAG_ATTACHED; in bwn_attach()
616 mac->mac_sc = sc; in bwn_attach()
617 mac->mac_status = BWN_MAC_STATUS_UNINIT; in bwn_attach()
619 mac->mac_flags |= BWN_MAC_FLAG_BADFRAME_PREEMP; in bwn_attach()
621 TASK_INIT(&mac->mac_hwreset, 0, bwn_hwreset, mac); in bwn_attach()
622 NET_TASK_INIT(&mac->mac_intrtask, 0, bwn_intrtask, mac); in bwn_attach()
623 TASK_INIT(&mac->mac_txpower, 0, bwn_txpwr, mac); in bwn_attach()
632 bhnd_format_chip_id(chip_name, sizeof(chip_name), sc->sc_cid.chip_id); in bwn_attach()
633 device_printf(sc->sc_dev, "WLAN (%s rev %u sromrev %u) " in bwn_attach()
635 chip_name, bhnd_get_hwrev(sc->sc_dev), in bwn_attach()
636 sc->sc_board_info.board_srom_rev, mac->mac_phy.analog, in bwn_attach()
637 mac->mac_phy.type, mac->mac_phy.rev, mac->mac_phy.rf_manuf, in bwn_attach()
638 mac->mac_phy.rf_ver, mac->mac_phy.rf_rev); in bwn_attach()
639 if (mac->mac_flags & BWN_MAC_FLAG_DMA) in bwn_attach()
640 device_printf(sc->sc_dev, "DMA (%d bits)\n", mac->mac_dmatype); in bwn_attach()
642 device_printf(sc->sc_dev, "PIO\n"); in bwn_attach()
645 device_printf(sc->sc_dev, in bwn_attach()
649 mac->mac_rid_irq = 0; in bwn_attach()
650 mac->mac_res_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, in bwn_attach()
651 &mac->mac_rid_irq, RF_ACTIVE | RF_SHAREABLE); in bwn_attach()
653 if (mac->mac_res_irq == NULL) { in bwn_attach()
654 device_printf(sc->sc_dev, "couldn't allocate IRQ resource\n"); in bwn_attach()
659 error = bus_setup_intr(dev, mac->mac_res_irq, in bwn_attach()
661 &mac->mac_intrhand); in bwn_attach()
663 device_printf(sc->sc_dev, "couldn't setup interrupt (%d)\n", in bwn_attach()
668 TAILQ_INSERT_TAIL(&sc->sc_maclist, mac, mac_list); in bwn_attach()
671 * calls attach-post routine in bwn_attach()
673 if ((sc->sc_flags & BWN_FLAG_ATTACHED) != 0) in bwn_attach()
678 if (mac != NULL && mac->mac_res_irq != NULL) { in bwn_attach()
679 bus_release_resource(dev, SYS_RES_IRQ, mac->mac_rid_irq, in bwn_attach()
680 mac->mac_res_irq); in bwn_attach()
687 if (sc->sc_mem_res != NULL) { in bwn_attach()
688 bus_release_resource(sc->sc_dev, SYS_RES_MEMORY, in bwn_attach()
689 sc->sc_mem_rid, sc->sc_mem_res); in bwn_attach()
700 sc->sc_chipc = bhnd_retain_provider(sc->sc_dev, BHND_SERVICE_CHIPC); in bwn_retain_bus_providers()
701 if (sc->sc_chipc == NULL) { in bwn_retain_bus_providers()
702 device_printf(sc->sc_dev, "ChipCommon device not found\n"); in bwn_retain_bus_providers()
706 ccaps = BHND_CHIPC_GET_CAPS(sc->sc_chipc); in bwn_retain_bus_providers()
708 sc->sc_gpio = bhnd_retain_provider(sc->sc_dev, BHND_SERVICE_GPIO); in bwn_retain_bus_providers()
709 if (sc->sc_gpio == NULL) { in bwn_retain_bus_providers()
710 device_printf(sc->sc_dev, "GPIO device not found\n"); in bwn_retain_bus_providers()
714 if (ccaps->pmu) { in bwn_retain_bus_providers()
715 sc->sc_pmu = bhnd_retain_provider(sc->sc_dev, BHND_SERVICE_PMU); in bwn_retain_bus_providers()
716 if (sc->sc_pmu == NULL) { in bwn_retain_bus_providers()
717 device_printf(sc->sc_dev, "PMU device not found\n"); in bwn_retain_bus_providers()
733 if ((_sc)-> _prov != NULL) { \ in bwn_release_bus_providers()
734 bhnd_release_provider((_sc)->sc_dev, (_sc)-> _prov, \ in bwn_release_bus_providers()
736 (_sc)-> _prov = NULL; \ in bwn_release_bus_providers()
755 ic = &sc->sc_ic; in bwn_attach_post()
757 ic->ic_softc = sc; in bwn_attach_post()
758 ic->ic_name = device_get_nameunit(sc->sc_dev); in bwn_attach_post()
760 ic->ic_phytype = IEEE80211_T_OFDM; in bwn_attach_post()
761 ic->ic_opmode = IEEE80211_M_STA; in bwn_attach_post()
762 ic->ic_caps = in bwn_attach_post()
776 ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS; /* s/w bmiss */ in bwn_attach_post()
777 ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD; in bwn_attach_post()
780 core_unit = bhnd_get_core_unit(sc->sc_dev); in bwn_attach_post()
782 if (sc->sc_board_info.board_srom_rev <= 2) { in bwn_attach_post()
795 device_printf(sc->sc_dev, "missing MAC address variable for " in bwn_attach_post()
801 error = bhnd_nvram_getvar_array(sc->sc_dev, mac_varname, ic->ic_macaddr, in bwn_attach_post()
802 sizeof(ic->ic_macaddr), BHND_NVRAM_TYPE_UINT8_ARRAY); in bwn_attach_post()
804 device_printf(sc->sc_dev, "error reading %s: %d\n", mac_varname, in bwn_attach_post()
813 ic->ic_raw_xmit = bwn_raw_xmit; in bwn_attach_post()
814 ic->ic_updateslot = bwn_updateslot; in bwn_attach_post()
815 ic->ic_update_promisc = bwn_update_promisc; in bwn_attach_post()
816 ic->ic_wme.wme_update = bwn_wme_update; in bwn_attach_post()
817 ic->ic_scan_start = bwn_scan_start; in bwn_attach_post()
818 ic->ic_scan_end = bwn_scan_end; in bwn_attach_post()
819 ic->ic_set_channel = bwn_set_channel; in bwn_attach_post()
820 ic->ic_vap_create = bwn_vap_create; in bwn_attach_post()
821 ic->ic_vap_delete = bwn_vap_delete; in bwn_attach_post()
822 ic->ic_transmit = bwn_transmit; in bwn_attach_post()
823 ic->ic_parent = bwn_parent; in bwn_attach_post()
826 &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), in bwn_attach_post()
828 &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), in bwn_attach_post()
842 if (mac->mac_phy.detach != NULL) in bwn_phy_detach()
843 mac->mac_phy.detach(mac); in bwn_phy_detach()
850 struct bwn_mac *mac = sc->sc_curmac; in bwn_detach()
851 struct ieee80211com *ic = &sc->sc_ic; in bwn_detach()
853 sc->sc_flags |= BWN_FLAG_INVALID; in bwn_detach()
855 if (device_is_attached(sc->sc_dev)) { in bwn_detach()
860 callout_drain(&sc->sc_led_blink_ch); in bwn_detach()
861 callout_drain(&sc->sc_rfswitch_ch); in bwn_detach()
862 callout_drain(&sc->sc_task_ch); in bwn_detach()
863 callout_drain(&sc->sc_watchdog_ch); in bwn_detach()
865 ieee80211_draintask(ic, &mac->mac_hwreset); in bwn_detach()
866 ieee80211_draintask(ic, &mac->mac_txpower); in bwn_detach()
869 taskqueue_drain(sc->sc_tq, &mac->mac_intrtask); in bwn_detach()
870 taskqueue_free(sc->sc_tq); in bwn_detach()
872 if (mac->mac_intrhand != NULL) { in bwn_detach()
873 bus_teardown_intr(dev, mac->mac_res_irq, mac->mac_intrhand); in bwn_detach()
874 mac->mac_intrhand = NULL; in bwn_detach()
878 bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid, in bwn_detach()
879 sc->sc_mem_res); in bwn_detach()
880 bus_release_resource(dev, SYS_RES_IRQ, mac->mac_rid_irq, in bwn_detach()
881 mac->mac_res_irq); in bwn_detach()
882 mbufq_drain(&sc->sc_snd); in bwn_detach()
896 TAILQ_INIT(&sc->sc_maclist); in bwn_attach_pre()
897 callout_init_mtx(&sc->sc_rfswitch_ch, &sc->sc_mtx, 0); in bwn_attach_pre()
898 callout_init_mtx(&sc->sc_task_ch, &sc->sc_mtx, 0); in bwn_attach_pre()
899 callout_init_mtx(&sc->sc_watchdog_ch, &sc->sc_mtx, 0); in bwn_attach_pre()
900 mbufq_init(&sc->sc_snd, ifqmaxlen); in bwn_attach_pre()
901 sc->sc_tq = taskqueue_create_fast("bwn_taskq", M_NOWAIT, in bwn_attach_pre()
902 taskqueue_thread_enqueue, &sc->sc_tq); in bwn_attach_pre()
903 taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, in bwn_attach_pre()
904 "%s taskq", device_get_nameunit(sc->sc_dev)); in bwn_attach_pre()
913 ((sc->sc_board_info.board_devid == PCI_DEVID_##_device) && \ in bwn_sprom_bugfixes()
914 (sc->sc_board_info.board_vendor == PCI_VENDOR_##_subvendor) && \ in bwn_sprom_bugfixes()
915 (sc->sc_board_info.board_type == _subdevice)) in bwn_sprom_bugfixes()
919 if (sc->sc_board_info.board_vendor == PCI_VENDOR_APPLE && in bwn_sprom_bugfixes()
920 sc->sc_board_info.board_type == 0x4e && in bwn_sprom_bugfixes()
921 sc->sc_board_info.board_rev > 0x40) in bwn_sprom_bugfixes()
922 sc->sc_board_info.board_flags |= BHND_BFL_PACTRL; in bwn_sprom_bugfixes()
931 sc->sc_board_info.board_flags &= ~BHND_BFL_BTCOEX; in bwn_sprom_bugfixes()
938 struct bwn_softc *sc = ic->ic_softc; in bwn_parent()
942 if (ic->ic_nrunning > 0) { in bwn_parent()
943 if ((sc->sc_flags & BWN_FLAG_RUNNING) == 0) { in bwn_parent()
948 } else if (sc->sc_flags & BWN_FLAG_RUNNING) in bwn_parent()
959 struct bwn_softc *sc = ic->ic_softc; in bwn_transmit()
963 if ((sc->sc_flags & BWN_FLAG_RUNNING) == 0) { in bwn_transmit()
967 error = mbufq_enqueue(&sc->sc_snd, m); in bwn_transmit()
980 struct bwn_mac *mac = sc->sc_curmac; in bwn_start()
988 if ((sc->sc_flags & BWN_FLAG_RUNNING) == 0 || mac == NULL || in bwn_start()
989 mac->mac_status < BWN_MAC_STATUS_STARTED) in bwn_start()
992 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in bwn_start()
995 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; in bwn_start()
997 device_printf(sc->sc_dev, "unexpected NULL ni\n"); in bwn_start()
999 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwn_start()
1003 ieee80211_output_seqno_assign(ni, -1, m); in bwn_start()
1004 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in bwn_start()
1007 if_inc_counter(ni->ni_vap->iv_ifp, in bwn_start()
1017 if_inc_counter(ni->ni_vap->iv_ifp, in bwn_start()
1023 sc->sc_watchdog_timer = 5; in bwn_start()
1031 struct bwn_mac *mac = sc->sc_curmac; in bwn_tx_isfull()
1033 int pktlen = roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); in bwn_tx_isfull()
1037 if (mac->mac_flags & BWN_MAC_FLAG_DMA) { in bwn_tx_isfull()
1039 if (dr->dr_stop == 1 || in bwn_tx_isfull()
1041 dr->dr_stop = 1; in bwn_tx_isfull()
1046 if (tq->tq_free == 0 || pktlen > tq->tq_size || in bwn_tx_isfull()
1047 pktlen > (tq->tq_size - tq->tq_used)) in bwn_tx_isfull()
1052 mbufq_prepend(&sc->sc_snd, m); in bwn_tx_isfull()
1059 struct bwn_mac *mac = sc->sc_curmac; in bwn_tx_start()
1064 if (m->m_pkthdr.len < IEEE80211_MIN_LEN || mac == NULL) { in bwn_tx_start()
1069 error = (mac->mac_flags & BWN_MAC_FLAG_DMA) ? in bwn_tx_start()
1084 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_tx_start()
1097 KASSERT(!TAILQ_EMPTY(&tq->tq_pktlist), ("%s: fail", __func__)); in bwn_pio_tx_start()
1098 tp = TAILQ_FIRST(&tq->tq_pktlist); in bwn_pio_tx_start()
1099 tp->tp_ni = ni; in bwn_pio_tx_start()
1100 tp->tp_m = m; in bwn_pio_tx_start()
1104 device_printf(sc->sc_dev, "tx fail\n"); in bwn_pio_tx_start()
1108 TAILQ_REMOVE(&tq->tq_pktlist, tp, tp_list); in bwn_pio_tx_start()
1109 tq->tq_used += roundup(m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); in bwn_pio_tx_start()
1110 tq->tq_free--; in bwn_pio_tx_start()
1112 if (bhnd_get_hwrev(sc->sc_dev) >= 8) { in bwn_pio_tx_start()
1118 device_printf(sc->sc_dev, in bwn_pio_tx_start()
1124 if (m_new->m_next != NULL) in bwn_pio_tx_start()
1125 device_printf(sc->sc_dev, in bwn_pio_tx_start()
1127 tp->tp_m = m_new; in bwn_pio_tx_start()
1136 mtod(m_new, const void *), m_new->m_pkthdr.len); in bwn_pio_tx_start()
1156 if ((mac->mac_flags & BWN_MAC_FLAG_WME) == 0) in bwn_pio_select()
1157 return (&mac->mac_method.pio.wme[WME_AC_BE]); in bwn_pio_select()
1161 return (&mac->mac_method.pio.wme[WME_AC_BE]); in bwn_pio_select()
1163 return (&mac->mac_method.pio.wme[WME_AC_BK]); in bwn_pio_select()
1165 return (&mac->mac_method.pio.wme[WME_AC_VI]); in bwn_pio_select()
1167 return (&mac->mac_method.pio.wme[WME_AC_VO]); in bwn_pio_select()
1179 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_tx_start()
1183 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_tx_start()
1185 uint8_t *txhdr_cache = (uint8_t *)dr->dr_txhdr_cache; in bwn_dma_tx_start()
1186 int error, slot, backup[2] = { dr->dr_curslot, dr->dr_usedslot }; in bwn_dma_tx_start()
1189 KASSERT(!dr->dr_stop, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_tx_start()
1195 dr->getdesc(dr, slot, &desc, &mt); in bwn_dma_tx_start()
1196 KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_HEADER, in bwn_dma_tx_start()
1199 error = bwn_set_txhdr(dr->dr_mac, ni, m, in bwn_dma_tx_start()
1204 error = bus_dmamap_load(dr->dr_txring_dtag, mt->mt_dmap, in bwn_dma_tx_start()
1206 &mt->mt_paddr, BUS_DMA_NOWAIT); in bwn_dma_tx_start()
1208 device_printf(sc->sc_dev, "%s: can't load TX buffer (1) %d\n", in bwn_dma_tx_start()
1212 bus_dmamap_sync(dr->dr_txring_dtag, mt->mt_dmap, in bwn_dma_tx_start()
1214 dr->setdesc(dr, desc, mt->mt_paddr, BWN_HDRSIZE(mac), 1, 0, 0); in bwn_dma_tx_start()
1215 bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, in bwn_dma_tx_start()
1219 dr->getdesc(dr, slot, &desc, &mt); in bwn_dma_tx_start()
1220 KASSERT(mt->mt_txtype == BWN_DMADESC_METATYPE_BODY && in bwn_dma_tx_start()
1221 mt->mt_islast == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_tx_start()
1222 mt->mt_m = m; in bwn_dma_tx_start()
1223 mt->mt_ni = ni; in bwn_dma_tx_start()
1225 error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap, m, in bwn_dma_tx_start()
1226 bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT); in bwn_dma_tx_start()
1228 device_printf(sc->sc_dev, "%s: can't load TX buffer (1) %d\n", in bwn_dma_tx_start()
1237 device_printf(sc->sc_dev, in bwn_dma_tx_start()
1245 mt->mt_m = m; in bwn_dma_tx_start()
1246 error = bus_dmamap_load_mbuf(dma->txbuf_dtag, mt->mt_dmap, in bwn_dma_tx_start()
1247 m, bwn_dma_buf_addr, &mt->mt_paddr, BUS_DMA_NOWAIT); in bwn_dma_tx_start()
1249 device_printf(sc->sc_dev, in bwn_dma_tx_start()
1255 bus_dmamap_sync(dma->txbuf_dtag, mt->mt_dmap, BUS_DMASYNC_PREWRITE); in bwn_dma_tx_start()
1256 dr->setdesc(dr, desc, mt->mt_paddr, m->m_pkthdr.len, 0, 1, 1); in bwn_dma_tx_start()
1257 bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, in bwn_dma_tx_start()
1262 dr->start_transfer(dr, bwn_dma_nextslot(dr, slot)); in bwn_dma_tx_start()
1265 dr->dr_curslot = backup[0]; in bwn_dma_tx_start()
1266 dr->dr_usedslot = backup[1]; in bwn_dma_tx_start()
1276 if (sc->sc_watchdog_timer != 0 && --sc->sc_watchdog_timer == 0) { in bwn_watchdog()
1277 device_printf(sc->sc_dev, "device timeout\n"); in bwn_watchdog()
1278 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwn_watchdog()
1280 callout_schedule(&sc->sc_watchdog_ch, hz); in bwn_watchdog()
1286 struct bwn_softc *sc = mac->mac_sc; in bwn_attach_core()
1290 KASSERT(bhnd_get_hwrev(sc->sc_dev) >= 5, in bwn_attach_core()
1291 ("unsupported revision %d", bhnd_get_hwrev(sc->sc_dev))); in bwn_attach_core()
1296 if ((error = bhnd_read_iost(sc->sc_dev, &iost))) { in bwn_attach_core()
1297 device_printf(sc->sc_dev, "error reading I/O status flags: " in bwn_attach_core()
1310 device_printf(sc->sc_dev, "%s: iost=0x%04hx, have_a=%d, have_bg=%d," in bwn_attach_core()
1316 sc->sc_board_info.board_devid, in bwn_attach_core()
1317 sc->sc_cid.chip_id); in bwn_attach_core()
1321 * Guess at whether it has A-PHY or G-PHY. in bwn_attach_core()
1323 * we will re-guess once it's all up and working. in bwn_attach_core()
1333 mac->mac_dmatype = BHND_DMA_ADDR_64BIT; in bwn_attach_core()
1343 mac->mac_dmatype = BHND_DMA_ADDR_32BIT; in bwn_attach_core()
1345 mac->mac_dmatype = BHND_DMA_ADDR_30BIT; in bwn_attach_core()
1360 if (sc->sc_board_info.board_devid != PCI_DEVID_BCM4311_D11DUAL && in bwn_attach_core()
1361 sc->sc_board_info.board_devid != PCI_DEVID_BCM4328_D11G && in bwn_attach_core()
1362 sc->sc_board_info.board_devid != PCI_DEVID_BCM4318_D11DUAL && in bwn_attach_core()
1363 sc->sc_board_info.board_devid != PCI_DEVID_BCM4306_D11DUAL && in bwn_attach_core()
1364 sc->sc_board_info.board_devid != PCI_DEVID_BCM4321_D11N && in bwn_attach_core()
1365 sc->sc_board_info.board_devid != PCI_DEVID_BCM4322_D11N) { in bwn_attach_core()
1367 if (mac->mac_phy.type == BWN_PHYTYPE_A) in bwn_attach_core()
1369 else if (mac->mac_phy.type == BWN_PHYTYPE_G || in bwn_attach_core()
1370 mac->mac_phy.type == BWN_PHYTYPE_N || in bwn_attach_core()
1371 mac->mac_phy.type == BWN_PHYTYPE_LP) in bwn_attach_core()
1375 mac->mac_phy.type)); in bwn_attach_core()
1379 * XXX The PHY-G support doesn't do 5GHz operation. in bwn_attach_core()
1381 if (mac->mac_phy.type != BWN_PHYTYPE_LP && in bwn_attach_core()
1382 mac->mac_phy.type != BWN_PHYTYPE_N) { in bwn_attach_core()
1383 device_printf(sc->sc_dev, in bwn_attach_core()
1384 "%s: forcing 2GHz only; no dual-band support for PHY\n", in bwn_attach_core()
1390 mac->mac_phy.phy_n = NULL; in bwn_attach_core()
1392 if (mac->mac_phy.type == BWN_PHYTYPE_G) { in bwn_attach_core()
1393 mac->mac_phy.attach = bwn_phy_g_attach; in bwn_attach_core()
1394 mac->mac_phy.detach = bwn_phy_g_detach; in bwn_attach_core()
1395 mac->mac_phy.prepare_hw = bwn_phy_g_prepare_hw; in bwn_attach_core()
1396 mac->mac_phy.init_pre = bwn_phy_g_init_pre; in bwn_attach_core()
1397 mac->mac_phy.init = bwn_phy_g_init; in bwn_attach_core()
1398 mac->mac_phy.exit = bwn_phy_g_exit; in bwn_attach_core()
1399 mac->mac_phy.phy_read = bwn_phy_g_read; in bwn_attach_core()
1400 mac->mac_phy.phy_write = bwn_phy_g_write; in bwn_attach_core()
1401 mac->mac_phy.rf_read = bwn_phy_g_rf_read; in bwn_attach_core()
1402 mac->mac_phy.rf_write = bwn_phy_g_rf_write; in bwn_attach_core()
1403 mac->mac_phy.use_hwpctl = bwn_phy_g_hwpctl; in bwn_attach_core()
1404 mac->mac_phy.rf_onoff = bwn_phy_g_rf_onoff; in bwn_attach_core()
1405 mac->mac_phy.switch_analog = bwn_phy_switch_analog; in bwn_attach_core()
1406 mac->mac_phy.switch_channel = bwn_phy_g_switch_channel; in bwn_attach_core()
1407 mac->mac_phy.get_default_chan = bwn_phy_g_get_default_chan; in bwn_attach_core()
1408 mac->mac_phy.set_antenna = bwn_phy_g_set_antenna; in bwn_attach_core()
1409 mac->mac_phy.set_im = bwn_phy_g_im; in bwn_attach_core()
1410 mac->mac_phy.recalc_txpwr = bwn_phy_g_recalc_txpwr; in bwn_attach_core()
1411 mac->mac_phy.set_txpwr = bwn_phy_g_set_txpwr; in bwn_attach_core()
1412 mac->mac_phy.task_15s = bwn_phy_g_task_15s; in bwn_attach_core()
1413 mac->mac_phy.task_60s = bwn_phy_g_task_60s; in bwn_attach_core()
1414 } else if (mac->mac_phy.type == BWN_PHYTYPE_LP) { in bwn_attach_core()
1415 mac->mac_phy.init_pre = bwn_phy_lp_init_pre; in bwn_attach_core()
1416 mac->mac_phy.init = bwn_phy_lp_init; in bwn_attach_core()
1417 mac->mac_phy.phy_read = bwn_phy_lp_read; in bwn_attach_core()
1418 mac->mac_phy.phy_write = bwn_phy_lp_write; in bwn_attach_core()
1419 mac->mac_phy.phy_maskset = bwn_phy_lp_maskset; in bwn_attach_core()
1420 mac->mac_phy.rf_read = bwn_phy_lp_rf_read; in bwn_attach_core()
1421 mac->mac_phy.rf_write = bwn_phy_lp_rf_write; in bwn_attach_core()
1422 mac->mac_phy.rf_onoff = bwn_phy_lp_rf_onoff; in bwn_attach_core()
1423 mac->mac_phy.switch_analog = bwn_phy_lp_switch_analog; in bwn_attach_core()
1424 mac->mac_phy.switch_channel = bwn_phy_lp_switch_channel; in bwn_attach_core()
1425 mac->mac_phy.get_default_chan = bwn_phy_lp_get_default_chan; in bwn_attach_core()
1426 mac->mac_phy.set_antenna = bwn_phy_lp_set_antenna; in bwn_attach_core()
1427 mac->mac_phy.task_60s = bwn_phy_lp_task_60s; in bwn_attach_core()
1428 } else if (mac->mac_phy.type == BWN_PHYTYPE_N) { in bwn_attach_core()
1429 mac->mac_phy.attach = bwn_phy_n_attach; in bwn_attach_core()
1430 mac->mac_phy.detach = bwn_phy_n_detach; in bwn_attach_core()
1431 mac->mac_phy.prepare_hw = bwn_phy_n_prepare_hw; in bwn_attach_core()
1432 mac->mac_phy.init_pre = bwn_phy_n_init_pre; in bwn_attach_core()
1433 mac->mac_phy.init = bwn_phy_n_init; in bwn_attach_core()
1434 mac->mac_phy.exit = bwn_phy_n_exit; in bwn_attach_core()
1435 mac->mac_phy.phy_read = bwn_phy_n_read; in bwn_attach_core()
1436 mac->mac_phy.phy_write = bwn_phy_n_write; in bwn_attach_core()
1437 mac->mac_phy.rf_read = bwn_phy_n_rf_read; in bwn_attach_core()
1438 mac->mac_phy.rf_write = bwn_phy_n_rf_write; in bwn_attach_core()
1439 mac->mac_phy.use_hwpctl = bwn_phy_n_hwpctl; in bwn_attach_core()
1440 mac->mac_phy.rf_onoff = bwn_phy_n_rf_onoff; in bwn_attach_core()
1441 mac->mac_phy.switch_analog = bwn_phy_n_switch_analog; in bwn_attach_core()
1442 mac->mac_phy.switch_channel = bwn_phy_n_switch_channel; in bwn_attach_core()
1443 mac->mac_phy.get_default_chan = bwn_phy_n_get_default_chan; in bwn_attach_core()
1444 mac->mac_phy.set_antenna = bwn_phy_n_set_antenna; in bwn_attach_core()
1445 mac->mac_phy.set_im = bwn_phy_n_im; in bwn_attach_core()
1446 mac->mac_phy.recalc_txpwr = bwn_phy_n_recalc_txpwr; in bwn_attach_core()
1447 mac->mac_phy.set_txpwr = bwn_phy_n_set_txpwr; in bwn_attach_core()
1448 mac->mac_phy.task_15s = bwn_phy_n_task_15s; in bwn_attach_core()
1449 mac->mac_phy.task_60s = bwn_phy_n_task_60s; in bwn_attach_core()
1451 device_printf(sc->sc_dev, "unsupported PHY type (%d)\n", in bwn_attach_core()
1452 mac->mac_phy.type); in bwn_attach_core()
1457 mac->mac_phy.gmode = have_bg; in bwn_attach_core()
1458 if (mac->mac_phy.attach != NULL) { in bwn_attach_core()
1459 error = mac->mac_phy.attach(mac); in bwn_attach_core()
1461 device_printf(sc->sc_dev, "failed\n"); in bwn_attach_core()
1475 device_printf(sc->sc_dev, "failed to setup channels\n"); in bwn_attach_core()
1479 if (sc->sc_curmac == NULL) in bwn_attach_core()
1480 sc->sc_curmac = mac; in bwn_attach_core()
1484 device_printf(sc->sc_dev, "failed to initialize DMA\n"); in bwn_attach_core()
1488 mac->mac_phy.switch_analog(mac, 0); in bwn_attach_core()
1491 bhnd_suspend_hw(sc->sc_dev, 0); in bwn_attach_core()
1507 sc = mac->mac_sc; in bwn_reset_core()
1516 /* XXX N-PHY only; and hard-code to 20MHz for now */ in bwn_reset_core()
1517 if (mac->mac_phy.type == BWN_PHYTYPE_N) in bwn_reset_core()
1520 if ((error = bhnd_reset_hw(sc->sc_dev, ioctl, ioctl))) { in bwn_reset_core()
1521 device_printf(sc->sc_dev, "core reset failed: %d", error); in bwn_reset_core()
1533 if ((error = bhnd_write_ioctl(sc->sc_dev, ioctl, ioctl_mask))) { in bwn_reset_core()
1534 device_printf(sc->sc_dev, "failed to set core ioctl flags: " in bwn_reset_core()
1542 if ((error = bhnd_write_ioctl(sc->sc_dev, ioctl, ioctl_mask))) { in bwn_reset_core()
1543 device_printf(sc->sc_dev, "failed to set core ioctl flags: " in bwn_reset_core()
1550 if (mac->mac_phy.switch_analog != NULL) in bwn_reset_core()
1551 mac->mac_phy.switch_analog(mac, 1); in bwn_reset_core()
1564 struct bwn_phy *phy = &mac->mac_phy; in bwn_phy_getinfo()
1565 struct bwn_softc *sc = mac->mac_sc; in bwn_phy_getinfo()
1570 phy->gmode = gmode; in bwn_phy_getinfo()
1571 phy->rf_on = 1; in bwn_phy_getinfo()
1572 phy->analog = (tmp & BWN_PHYVER_ANALOG) >> 12; in bwn_phy_getinfo()
1573 phy->type = (tmp & BWN_PHYVER_TYPE) >> 8; in bwn_phy_getinfo()
1574 phy->rev = (tmp & BWN_PHYVER_VERSION); in bwn_phy_getinfo()
1575 if ((phy->type == BWN_PHYTYPE_A && phy->rev >= 4) || in bwn_phy_getinfo()
1576 (phy->type == BWN_PHYTYPE_B && phy->rev != 2 && in bwn_phy_getinfo()
1577 phy->rev != 4 && phy->rev != 6 && phy->rev != 7) || in bwn_phy_getinfo()
1578 (phy->type == BWN_PHYTYPE_G && phy->rev > 9) || in bwn_phy_getinfo()
1579 (phy->type == BWN_PHYTYPE_N && phy->rev > 6) || in bwn_phy_getinfo()
1580 (phy->type == BWN_PHYTYPE_LP && phy->rev > 2)) in bwn_phy_getinfo()
1589 phy->rf_rev = (tmp & 0xf0000000) >> 28; in bwn_phy_getinfo()
1590 phy->rf_ver = (tmp & 0x0ffff000) >> 12; in bwn_phy_getinfo()
1591 phy->rf_manuf = (tmp & 0x00000fff); in bwn_phy_getinfo()
1597 phy->phy_do_full_init = 1; in bwn_phy_getinfo()
1599 if (phy->rf_manuf != 0x17f) /* 0x17f is broadcom */ in bwn_phy_getinfo()
1601 if ((phy->type == BWN_PHYTYPE_A && (phy->rf_ver != 0x2060 || in bwn_phy_getinfo()
1602 phy->rf_rev != 1 || phy->rf_manuf != 0x17f)) || in bwn_phy_getinfo()
1603 (phy->type == BWN_PHYTYPE_B && (phy->rf_ver & 0xfff0) != 0x2050) || in bwn_phy_getinfo()
1604 (phy->type == BWN_PHYTYPE_G && phy->rf_ver != 0x2050) || in bwn_phy_getinfo()
1605 (phy->type == BWN_PHYTYPE_N && in bwn_phy_getinfo()
1606 phy->rf_ver != 0x2055 && phy->rf_ver != 0x2056) || in bwn_phy_getinfo()
1607 (phy->type == BWN_PHYTYPE_LP && in bwn_phy_getinfo()
1608 phy->rf_ver != 0x2062 && phy->rf_ver != 0x2063)) in bwn_phy_getinfo()
1613 device_printf(sc->sc_dev, "unsupported PHY (type %#x, rev %#x, " in bwn_phy_getinfo()
1615 phy->type, phy->rev, phy->analog); in bwn_phy_getinfo()
1618 device_printf(sc->sc_dev, "unsupported radio (manuf %#x, ver %#x, " in bwn_phy_getinfo()
1620 phy->rf_manuf, phy->rf_ver, phy->rf_rev); in bwn_phy_getinfo()
1629 struct bwn_softc *sc = mac->mac_sc; in bwn_chiptest()
1645 if ((bhnd_get_hwrev(sc->sc_dev) >= 3) && in bwn_chiptest()
1646 (bhnd_get_hwrev(sc->sc_dev) <= 10)) { in bwn_chiptest()
1664 device_printf(sc->sc_dev, "failed to validate the chipaccess\n"); in bwn_chiptest()
1671 struct bwn_softc *sc = mac->mac_sc; in bwn_setup_channels()
1672 struct ieee80211com *ic = &sc->sc_ic; in bwn_setup_channels()
1675 memset(ic->ic_channels, 0, sizeof(ic->ic_channels)); in bwn_setup_channels()
1676 ic->ic_nchans = 0; in bwn_setup_channels()
1687 bwn_addchannels(ic->ic_channels, IEEE80211_CHAN_MAX, in bwn_setup_channels()
1688 &ic->ic_nchans, &bwn_chantable_bg, bands); in bwn_setup_channels()
1694 bwn_addchannels(ic->ic_channels, IEEE80211_CHAN_MAX, in bwn_setup_channels()
1695 &ic->ic_nchans, &bwn_chantable_a, bands); in bwn_setup_channels()
1698 mac->mac_phy.supports_2ghz = have_bg; in bwn_setup_channels()
1699 mac->mac_phy.supports_5ghz = have_a; in bwn_setup_channels()
1701 return (ic->ic_nchans == 0 ? ENXIO : 0); in bwn_setup_channels()
1709 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_read_4()
1735 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_read_2()
1770 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_write_4()
1793 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_write_2()
1815 for (i = 0, error = 0; i < ci->nchannels && error == 0; i++) { in bwn_addchannels()
1816 const struct bwn_channel *hc = &ci->channels[i]; in bwn_addchannels()
1819 hc->ieee, hc->freq, hc->maxTxPow, 0, bands); in bwn_addchannels()
1827 struct ieee80211com *ic = ni->ni_ic; in bwn_raw_xmit()
1828 struct bwn_softc *sc = ic->ic_softc; in bwn_raw_xmit()
1829 struct bwn_mac *mac = sc->sc_curmac; in bwn_raw_xmit()
1832 if ((sc->sc_flags & BWN_FLAG_RUNNING) == 0 || in bwn_raw_xmit()
1833 mac->mac_status < BWN_MAC_STATUS_STARTED) { in bwn_raw_xmit()
1847 sc->sc_watchdog_timer = 5; in bwn_raw_xmit()
1861 struct bwn_softc *sc = ic->ic_softc; in bwn_updateslot()
1865 if (sc->sc_flags & BWN_FLAG_RUNNING) { in bwn_updateslot()
1866 mac = (struct bwn_mac *)sc->sc_curmac; in bwn_updateslot()
1882 struct bwn_softc *sc = ic->ic_softc; in bwn_update_promisc()
1883 struct bwn_mac *mac = sc->sc_curmac; in bwn_update_promisc()
1886 mac = sc->sc_curmac; in bwn_update_promisc()
1887 if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_update_promisc()
1888 if (ic->ic_promisc > 0) in bwn_update_promisc()
1889 sc->sc_filters |= BWN_MACCTL_PROMISC; in bwn_update_promisc()
1891 sc->sc_filters &= ~BWN_MACCTL_PROMISC; in bwn_update_promisc()
1903 struct bwn_softc *sc = ic->ic_softc; in bwn_wme_update()
1904 struct bwn_mac *mac = sc->sc_curmac; in bwn_wme_update()
1912 mac = sc->sc_curmac; in bwn_wme_update()
1913 if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_wme_update()
1915 for (i = 0; i < N(sc->sc_wmeParams); i++) { in bwn_wme_update()
1928 struct bwn_softc *sc = ic->ic_softc; in bwn_scan_start()
1932 mac = sc->sc_curmac; in bwn_scan_start()
1933 if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_scan_start()
1934 sc->sc_filters |= BWN_MACCTL_BEACON_PROMISC; in bwn_scan_start()
1945 struct bwn_softc *sc = ic->ic_softc; in bwn_scan_end()
1949 mac = sc->sc_curmac; in bwn_scan_end()
1950 if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_scan_end()
1951 sc->sc_filters &= ~BWN_MACCTL_BEACON_PROMISC; in bwn_scan_end()
1961 struct bwn_softc *sc = ic->ic_softc; in bwn_set_channel()
1962 struct bwn_mac *mac = sc->sc_curmac; in bwn_set_channel()
1963 struct bwn_phy *phy = &mac->mac_phy; in bwn_set_channel()
1968 error = bwn_switch_band(sc, ic->ic_curchan); in bwn_set_channel()
1973 chan = ieee80211_chan2ieee(ic, ic->ic_curchan); in bwn_set_channel()
1974 if (chan != phy->chan) in bwn_set_channel()
1978 if (ic->ic_curchan->ic_maxpower != 0 && in bwn_set_channel()
1979 ic->ic_curchan->ic_maxpower != phy->txpower) { in bwn_set_channel()
1980 phy->txpower = ic->ic_curchan->ic_maxpower / 2; in bwn_set_channel()
1986 if (phy->set_antenna) in bwn_set_channel()
1987 phy->set_antenna(mac, BWN_ANT_DEFAULT); in bwn_set_channel()
1989 if (sc->sc_rf_enabled != phy->rf_on) { in bwn_set_channel()
1990 if (sc->sc_rf_enabled) { in bwn_set_channel()
1992 if (!(mac->mac_flags & BWN_MAC_FLAG_RADIO_ON)) in bwn_set_channel()
1993 device_printf(sc->sc_dev, in bwn_set_channel()
2028 vap = &bvp->bv_vap; in bwn_vap_create()
2031 bvp->bv_newstate = vap->iv_newstate; in bwn_vap_create()
2032 vap->iv_newstate = bwn_newstate; in bwn_vap_create()
2035 vap->iv_max_aid = BWN_STAID_MAX; in bwn_vap_create()
2065 bzero(sc->sc_bssid, IEEE80211_ADDR_LEN); in bwn_init()
2066 sc->sc_flags |= BWN_FLAG_NEED_BEACON_TP; in bwn_init()
2067 sc->sc_filters = 0; in bwn_init()
2069 sc->sc_beacons[0] = sc->sc_beacons[1] = 0; in bwn_init()
2070 sc->sc_rf_enabled = 1; in bwn_init()
2072 mac = sc->sc_curmac; in bwn_init()
2073 if (mac->mac_status == BWN_MAC_STATUS_UNINIT) { in bwn_init()
2078 if (mac->mac_status == BWN_MAC_STATUS_INITED) in bwn_init()
2086 sc->sc_flags |= BWN_FLAG_RUNNING; in bwn_init()
2087 callout_reset(&sc->sc_rfswitch_ch, hz, bwn_rfswitch, sc); in bwn_init()
2088 callout_reset(&sc->sc_watchdog_ch, hz, bwn_watchdog, sc); in bwn_init()
2096 struct bwn_mac *mac = sc->sc_curmac; in bwn_stop()
2102 if (mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_stop()
2108 if (mac->mac_status >= BWN_MAC_STATUS_STARTED) in bwn_stop()
2111 callout_stop(&sc->sc_led_blink_ch); in bwn_stop()
2112 sc->sc_led_blinking = 0; in bwn_stop()
2115 sc->sc_rf_enabled = 0; in bwn_stop()
2117 sc->sc_flags &= ~BWN_FLAG_RUNNING; in bwn_stop()
2126 KASSERT(N(bwn_wme_shm_offsets) == N(sc->sc_wmeParams), in bwn_wme_clear()
2129 for (i = 0; i < N(sc->sc_wmeParams); i++) { in bwn_wme_clear()
2130 p = &(sc->sc_wmeParams[i]); in bwn_wme_clear()
2134 p->wmep_txopLimit = 0; in bwn_wme_clear()
2135 p->wmep_aifsn = 2; in bwn_wme_clear()
2137 p->wmep_logcwmin = in bwn_wme_clear()
2139 p->wmep_logcwmax = in bwn_wme_clear()
2143 p->wmep_txopLimit = 0; in bwn_wme_clear()
2144 p->wmep_aifsn = 2; in bwn_wme_clear()
2146 p->wmep_logcwmin = in bwn_wme_clear()
2148 p->wmep_logcwmax = in bwn_wme_clear()
2152 p->wmep_txopLimit = 0; in bwn_wme_clear()
2153 p->wmep_aifsn = 3; in bwn_wme_clear()
2155 p->wmep_logcwmin = in bwn_wme_clear()
2157 p->wmep_logcwmax = in bwn_wme_clear()
2161 p->wmep_txopLimit = 0; in bwn_wme_clear()
2162 p->wmep_aifsn = 7; in bwn_wme_clear()
2164 p->wmep_logcwmin = in bwn_wme_clear()
2166 p->wmep_logcwmax = in bwn_wme_clear()
2182 sc = mac->mac_sc; in bwn_core_forceclk()
2185 if (sc->sc_pmu != NULL) in bwn_core_forceclk()
2194 if ((error = bhnd_request_clock(sc->sc_dev, clock))) { in bwn_core_forceclk()
2195 device_printf(sc->sc_dev, "%d clock request failed: %d\n", in bwn_core_forceclk()
2206 struct bwn_softc *sc = mac->mac_sc; in bwn_core_init()
2210 KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, in bwn_core_init()
2213 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_core_init()
2218 if (bhnd_is_hw_suspended(sc->sc_dev)) { in bwn_core_init()
2219 if ((error = bwn_reset_core(mac, mac->mac_phy.gmode))) in bwn_core_init()
2223 mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; in bwn_core_init()
2224 mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; in bwn_core_init()
2225 mac->mac_phy.hwpctl = (bwn_hwpctl) ? 1 : 0; in bwn_core_init()
2226 BWN_GETTIME(mac->mac_phy.nexttime); in bwn_core_init()
2227 mac->mac_phy.txerrors = BWN_TXERROR_MAX; in bwn_core_init()
2228 bzero(&mac->mac_stats, sizeof(mac->mac_stats)); in bwn_core_init()
2229 mac->mac_stats.link_noise = -95; in bwn_core_init()
2230 mac->mac_reason_intr = 0; in bwn_core_init()
2231 bzero(mac->mac_reason, sizeof(mac->mac_reason)); in bwn_core_init()
2232 mac->mac_intr_mask = BWN_INTR_MASKTEMPLATE; in bwn_core_init()
2234 if (sc->sc_debug & BWN_DEBUG_XMIT) in bwn_core_init()
2235 mac->mac_intr_mask &= ~BWN_INTR_PHY_TXERR; in bwn_core_init()
2237 mac->mac_suspended = 1; in bwn_core_init()
2238 mac->mac_task_state = 0; in bwn_core_init()
2239 memset(&mac->mac_noise, 0, sizeof(mac->mac_noise)); in bwn_core_init()
2241 mac->mac_phy.init_pre(mac); in bwn_core_init()
2244 if (mac->mac_phy.prepare_hw) { in bwn_core_init()
2245 error = mac->mac_phy.prepare_hw(mac); in bwn_core_init()
2249 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: chip_init\n", __func__); in bwn_core_init()
2254 bhnd_get_hwrev(sc->sc_dev)); in bwn_core_init()
2256 if (mac->mac_phy.type == BWN_PHYTYPE_G) { in bwn_core_init()
2258 if (sc->sc_board_info.board_flags & BHND_BFL_PACTRL) in bwn_core_init()
2260 if (mac->mac_phy.rev == 1) in bwn_core_init()
2263 if (mac->mac_phy.rf_ver == 0x2050) { in bwn_core_init()
2264 if (mac->mac_phy.rf_rev < 6) in bwn_core_init()
2266 if (mac->mac_phy.rf_rev == 6) in bwn_core_init()
2269 if (sc->sc_board_info.board_flags & BHND_BFL_NOPLLDOWN) in bwn_core_init()
2271 if (sc->sc_quirks & BWN_QUIRK_UCODE_SLOWCLOCK_WAR) in bwn_core_init()
2277 if (bhnd_get_hwrev(sc->sc_dev) >= 13) { in bwn_core_init()
2298 (mac->mac_phy.type == BWN_PHYTYPE_B) ? 0x1f : 0xf); in bwn_core_init()
2301 if (sc->sc_quirks & BWN_QUIRK_NODMA) in bwn_core_init()
2309 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: powerup\n", __func__); in bwn_core_init()
2310 if (sc->sc_board_info.board_flags & BHND_BFL_NOPLLDOWN) in bwn_core_init()
2320 mac->mac_status = BWN_MAC_STATUS_INITED; in bwn_core_init()
2322 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: done\n", __func__); in bwn_core_init()
2326 bhnd_suspend_hw(sc->sc_dev, 0); in bwn_core_init()
2327 KASSERT(mac->mac_status == BWN_MAC_STATUS_UNINIT, in bwn_core_init()
2329 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: fail\n", __func__); in bwn_core_init()
2336 struct bwn_softc *sc = mac->mac_sc; in bwn_core_start()
2339 KASSERT(mac->mac_status == BWN_MAC_STATUS_INITED, in bwn_core_start()
2342 if (bhnd_get_hwrev(sc->sc_dev) < 5) in bwn_core_start()
2353 BWN_WRITE_4(mac, BWN_INTR_MASK, mac->mac_intr_mask); in bwn_core_start()
2354 callout_reset(&sc->sc_task_ch, hz * 15, bwn_tasks, mac); in bwn_core_start()
2356 mac->mac_status = BWN_MAC_STATUS_STARTED; in bwn_core_start()
2362 struct bwn_softc *sc = mac->mac_sc; in bwn_core_exit()
2365 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_core_exit()
2367 KASSERT(mac->mac_status <= BWN_MAC_STATUS_INITED, in bwn_core_exit()
2370 if (mac->mac_status != BWN_MAC_STATUS_INITED) in bwn_core_exit()
2372 mac->mac_status = BWN_MAC_STATUS_UNINIT; in bwn_core_exit()
2382 mac->mac_phy.switch_analog(mac, 0); in bwn_core_exit()
2383 bhnd_suspend_hw(sc->sc_dev, 0); in bwn_core_exit()
2389 struct bwn_softc *sc = mac->mac_sc; in bwn_bt_disable()
2398 struct bwn_softc *sc = mac->mac_sc; in bwn_chip_init()
2399 struct bwn_phy *phy = &mac->mac_phy; in bwn_chip_init()
2405 if (phy->gmode) in bwn_chip_init()
2424 phy->switch_analog(mac, 1); in bwn_chip_init()
2429 if (phy->set_im) in bwn_chip_init()
2430 phy->set_im(mac, BWN_IMMODE_NONE); in bwn_chip_init()
2431 if (phy->set_antenna) in bwn_chip_init()
2432 phy->set_antenna(mac, BWN_ANT_DEFAULT); in bwn_chip_init()
2435 if (phy->type == BWN_PHYTYPE_B) in bwn_chip_init()
2438 if (bhnd_get_hwrev(sc->sc_dev) < 5) in bwn_chip_init()
2448 if (bhnd_get_hwrev(sc->sc_dev) < 3) { in bwn_chip_init()
2468 error = bhnd_get_clock_latency(sc->sc_dev, BHND_CLOCK_HT, &delay); in bwn_chip_init()
2470 device_printf(sc->sc_dev, "failed to fetch HT clock latency: " in bwn_chip_init()
2476 device_printf(sc->sc_dev, "invalid HT clock latency: %u\n", in bwn_chip_init()
2523 switch (mac->mac_phy.type) { in bwn_rate_init()
2535 if (mac->mac_phy.type == BWN_PHYTYPE_A) in bwn_rate_init()
2624 struct bwn_pio *pio = &mac->mac_method.pio; in bwn_pio_init()
2630 bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_BK], 0); in bwn_pio_init()
2631 bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_BE], 1); in bwn_pio_init()
2632 bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_VI], 2); in bwn_pio_init()
2633 bwn_pio_set_txqueue(mac, &pio->wme[WME_AC_VO], 3); in bwn_pio_init()
2634 bwn_pio_set_txqueue(mac, &pio->mcast, 4); in bwn_pio_init()
2635 bwn_pio_setupqueue_rx(mac, &pio->rx, 0); in bwn_pio_init()
2643 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_set_txqueue()
2646 tq->tq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_TXQOFFSET(mac); in bwn_pio_set_txqueue()
2647 tq->tq_index = index; in bwn_pio_set_txqueue()
2649 tq->tq_free = BWN_PIO_MAX_TXPACKETS; in bwn_pio_set_txqueue()
2650 if (bhnd_get_hwrev(sc->sc_dev) >= 8) in bwn_pio_set_txqueue()
2651 tq->tq_size = 1920; in bwn_pio_set_txqueue()
2653 tq->tq_size = bwn_pio_read_2(mac, tq, BWN_PIO_TXQBUFSIZE); in bwn_pio_set_txqueue()
2654 tq->tq_size -= 80; in bwn_pio_set_txqueue()
2657 TAILQ_INIT(&tq->tq_pktlist); in bwn_pio_set_txqueue()
2658 for (i = 0; i < N(tq->tq_pkts); i++) { in bwn_pio_set_txqueue()
2659 tp = &(tq->tq_pkts[i]); in bwn_pio_set_txqueue()
2660 tp->tp_index = i; in bwn_pio_set_txqueue()
2661 tp->tp_queue = tq; in bwn_pio_set_txqueue()
2662 TAILQ_INSERT_TAIL(&tq->tq_pktlist, tp, tp_list); in bwn_pio_set_txqueue()
2669 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_idx2base()
2689 if (bhnd_get_hwrev(sc->sc_dev) >= 11) { in bwn_pio_idx2base()
2691 device_printf(sc->sc_dev, "%s: warning\n", __func__); in bwn_pio_idx2base()
2695 device_printf(sc->sc_dev, "%s: warning\n", __func__); in bwn_pio_idx2base()
2703 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_setupqueue_rx()
2705 prq->prq_mac = mac; in bwn_pio_setupqueue_rx()
2706 prq->prq_rev = bhnd_get_hwrev(sc->sc_dev); in bwn_pio_setupqueue_rx()
2707 prq->prq_base = bwn_pio_idx2base(mac, index) + BWN_PIO_RXQOFFSET(mac); in bwn_pio_setupqueue_rx()
2731 return (BWN_READ_2(mac, tq->tq_base + offset)); in bwn_pio_read_2()
2740 base = bwn_dma_base(mac->mac_dmatype, idx); in bwn_dma_rxdirectfifo()
2741 if (mac->mac_dmatype == BHND_DMA_ADDR_64BIT) { in bwn_dma_rxdirectfifo()
2762 for (i = 0; i < N(tq->tq_pkts); i++) { in bwn_pio_cancel_tx_packets()
2763 tp = &(tq->tq_pkts[i]); in bwn_pio_cancel_tx_packets()
2764 if (tp->tp_m) { in bwn_pio_cancel_tx_packets()
2765 m_freem(tp->tp_m); in bwn_pio_cancel_tx_packets()
2766 tp->tp_m = NULL; in bwn_pio_cancel_tx_packets()
2804 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_init()
2807 bwn_dma_setup(dma->wme[WME_AC_BK]); in bwn_dma_init()
2808 bwn_dma_setup(dma->wme[WME_AC_BE]); in bwn_dma_init()
2809 bwn_dma_setup(dma->wme[WME_AC_VI]); in bwn_dma_init()
2810 bwn_dma_setup(dma->wme[WME_AC_VO]); in bwn_dma_init()
2811 bwn_dma_setup(dma->mcast); in bwn_dma_init()
2813 bwn_dma_setup(dma->rx); in bwn_dma_init()
2820 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_ringsetup()
2824 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_ringsetup()
2830 dr->dr_numslots = BWN_RXRING_SLOTS; in bwn_dma_ringsetup()
2832 dr->dr_numslots = BWN_TXRING_SLOTS; in bwn_dma_ringsetup()
2834 dr->dr_meta = malloc(dr->dr_numslots * sizeof(struct bwn_dmadesc_meta), in bwn_dma_ringsetup()
2836 if (dr->dr_meta == NULL) in bwn_dma_ringsetup()
2839 dr->dr_type = mac->mac_dmatype; in bwn_dma_ringsetup()
2840 dr->dr_mac = mac; in bwn_dma_ringsetup()
2841 dr->dr_base = bwn_dma_base(dr->dr_type, controller_index); in bwn_dma_ringsetup()
2842 dr->dr_index = controller_index; in bwn_dma_ringsetup()
2843 if (dr->dr_type == BHND_DMA_ADDR_64BIT) { in bwn_dma_ringsetup()
2844 dr->getdesc = bwn_dma_64_getdesc; in bwn_dma_ringsetup()
2845 dr->setdesc = bwn_dma_64_setdesc; in bwn_dma_ringsetup()
2846 dr->start_transfer = bwn_dma_64_start_transfer; in bwn_dma_ringsetup()
2847 dr->suspend = bwn_dma_64_suspend; in bwn_dma_ringsetup()
2848 dr->resume = bwn_dma_64_resume; in bwn_dma_ringsetup()
2849 dr->get_curslot = bwn_dma_64_get_curslot; in bwn_dma_ringsetup()
2850 dr->set_curslot = bwn_dma_64_set_curslot; in bwn_dma_ringsetup()
2852 dr->getdesc = bwn_dma_32_getdesc; in bwn_dma_ringsetup()
2853 dr->setdesc = bwn_dma_32_setdesc; in bwn_dma_ringsetup()
2854 dr->start_transfer = bwn_dma_32_start_transfer; in bwn_dma_ringsetup()
2855 dr->suspend = bwn_dma_32_suspend; in bwn_dma_ringsetup()
2856 dr->resume = bwn_dma_32_resume; in bwn_dma_ringsetup()
2857 dr->get_curslot = bwn_dma_32_get_curslot; in bwn_dma_ringsetup()
2858 dr->set_curslot = bwn_dma_32_set_curslot; in bwn_dma_ringsetup()
2861 dr->dr_tx = 1; in bwn_dma_ringsetup()
2862 dr->dr_curslot = -1; in bwn_dma_ringsetup()
2864 if (dr->dr_index == 0) { in bwn_dma_ringsetup()
2865 switch (mac->mac_fw.fw_hdr_format) { in bwn_dma_ringsetup()
2868 dr->dr_rx_bufsize = in bwn_dma_ringsetup()
2870 dr->dr_frameoffset = in bwn_dma_ringsetup()
2874 dr->dr_rx_bufsize = in bwn_dma_ringsetup()
2876 dr->dr_frameoffset = in bwn_dma_ringsetup()
2896 dr->dr_txhdr_cache = contigmalloc( in bwn_dma_ringsetup()
2897 (dr->dr_numslots / BWN_TX_SLOTS_PER_FRAME) * in bwn_dma_ringsetup()
2900 if (dr->dr_txhdr_cache == NULL) { in bwn_dma_ringsetup()
2901 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2909 error = bus_dma_tag_create(dma->parent_dtag, in bwn_dma_ringsetup()
2919 &dr->dr_txring_dtag); in bwn_dma_ringsetup()
2921 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2926 for (i = 0; i < dr->dr_numslots; i += 2) { in bwn_dma_ringsetup()
2927 dr->getdesc(dr, i, &desc, &mt); in bwn_dma_ringsetup()
2929 mt->mt_txtype = BWN_DMADESC_METATYPE_HEADER; in bwn_dma_ringsetup()
2930 mt->mt_m = NULL; in bwn_dma_ringsetup()
2931 mt->mt_ni = NULL; in bwn_dma_ringsetup()
2932 mt->mt_islast = 0; in bwn_dma_ringsetup()
2933 error = bus_dmamap_create(dr->dr_txring_dtag, 0, in bwn_dma_ringsetup()
2934 &mt->mt_dmap); in bwn_dma_ringsetup()
2936 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2941 dr->getdesc(dr, i + 1, &desc, &mt); in bwn_dma_ringsetup()
2943 mt->mt_txtype = BWN_DMADESC_METATYPE_BODY; in bwn_dma_ringsetup()
2944 mt->mt_m = NULL; in bwn_dma_ringsetup()
2945 mt->mt_ni = NULL; in bwn_dma_ringsetup()
2946 mt->mt_islast = 1; in bwn_dma_ringsetup()
2947 error = bus_dmamap_create(dma->txbuf_dtag, 0, in bwn_dma_ringsetup()
2948 &mt->mt_dmap); in bwn_dma_ringsetup()
2950 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2956 error = bus_dmamap_create(dma->rxbuf_dtag, 0, in bwn_dma_ringsetup()
2957 &dr->dr_spare_dmap); in bwn_dma_ringsetup()
2959 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2964 for (i = 0; i < dr->dr_numslots; i++) { in bwn_dma_ringsetup()
2965 dr->getdesc(dr, i, &desc, &mt); in bwn_dma_ringsetup()
2967 error = bus_dmamap_create(dma->rxbuf_dtag, 0, in bwn_dma_ringsetup()
2968 &mt->mt_dmap); in bwn_dma_ringsetup()
2970 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2976 device_printf(sc->sc_dev, in bwn_dma_ringsetup()
2982 bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, in bwn_dma_ringsetup()
2985 dr->dr_usedslot = dr->dr_numslots; in bwn_dma_ringsetup()
2992 free(dr->dr_txhdr_cache, M_DEVBUF); in bwn_dma_ringsetup()
2994 free(dr->dr_meta, M_DEVBUF); in bwn_dma_ringsetup()
3010 free((*dr)->dr_txhdr_cache, M_DEVBUF); in bwn_dma_ringfree()
3011 free((*dr)->dr_meta, M_DEVBUF); in bwn_dma_ringfree()
3023 *meta = &(dr->dr_meta[slot]); in bwn_dma_32_getdesc()
3024 desc = dr->dr_ring_descbase; in bwn_dma_32_getdesc()
3041 descbase = dr->dr_ring_descbase; in bwn_dma_32_setdesc()
3042 dma = &dr->dr_mac->mac_method.dma; in bwn_dma_32_setdesc()
3043 dt = &dma->translation; in bwn_dma_32_setdesc()
3045 slot = (int)(&(desc->dma.dma32) - descbase); in bwn_dma_32_setdesc()
3046 KASSERT(slot >= 0 && slot < dr->dr_numslots, in bwn_dma_32_setdesc()
3049 addr = (dmaaddr & dt->addr_mask) | dt->base_addr; in bwn_dma_32_setdesc()
3050 addrext = ((dmaaddr & dt->addrext_mask) >> dma->addrext_shift); in bwn_dma_32_setdesc()
3052 if (slot == dr->dr_numslots - 1) in bwn_dma_32_setdesc()
3063 desc->dma.dma32.control = htole32(ctl); in bwn_dma_32_setdesc()
3064 desc->dma.dma32.address = htole32(addr); in bwn_dma_32_setdesc()
3116 *meta = &(dr->dr_meta[slot]); in bwn_dma_64_getdesc()
3117 desc = dr->dr_ring_descbase; in bwn_dma_64_getdesc()
3137 descbase = dr->dr_ring_descbase; in bwn_dma_64_setdesc()
3138 dma = &dr->dr_mac->mac_method.dma; in bwn_dma_64_setdesc()
3139 dt = &dma->translation; in bwn_dma_64_setdesc()
3141 slot = (int)(&(desc->dma.dma64) - descbase); in bwn_dma_64_setdesc()
3142 KASSERT(slot >= 0 && slot < dr->dr_numslots, in bwn_dma_64_setdesc()
3145 addr = (dmaaddr & dt->addr_mask) | dt->base_addr; in bwn_dma_64_setdesc()
3148 addrext = ((dmaaddr & dt->addrext_mask) >> dma->addrext_shift); in bwn_dma_64_setdesc()
3151 if (slot == dr->dr_numslots - 1) in bwn_dma_64_setdesc()
3165 desc->dma.dma64.control0 = htole32(ctl0); in bwn_dma_64_setdesc()
3166 desc->dma.dma64.control1 = htole32(ctl1); in bwn_dma_64_setdesc()
3167 desc->dma.dma64.address_low = htole32(addrlo); in bwn_dma_64_setdesc()
3168 desc->dma.dma64.address_high = htole32(addrhi); in bwn_dma_64_setdesc()
3217 struct bwn_mac *mac = dr->dr_mac; in bwn_dma_allocringmemory()
3218 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_allocringmemory()
3219 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_allocringmemory()
3222 error = bus_dma_tag_create(dma->parent_dtag, in bwn_dma_allocringmemory()
3232 &dr->dr_ring_dtag); in bwn_dma_allocringmemory()
3234 device_printf(sc->sc_dev, in bwn_dma_allocringmemory()
3236 return (-1); in bwn_dma_allocringmemory()
3239 error = bus_dmamem_alloc(dr->dr_ring_dtag, in bwn_dma_allocringmemory()
3240 &dr->dr_ring_descbase, BUS_DMA_WAITOK | BUS_DMA_ZERO, in bwn_dma_allocringmemory()
3241 &dr->dr_ring_dmap); in bwn_dma_allocringmemory()
3243 device_printf(sc->sc_dev, in bwn_dma_allocringmemory()
3245 return (-1); in bwn_dma_allocringmemory()
3247 error = bus_dmamap_load(dr->dr_ring_dtag, dr->dr_ring_dmap, in bwn_dma_allocringmemory()
3248 dr->dr_ring_descbase, BWN_DMA_RINGMEMSIZE, in bwn_dma_allocringmemory()
3249 bwn_dma_ring_addr, &dr->dr_ring_dmabase, BUS_DMA_NOWAIT); in bwn_dma_allocringmemory()
3251 device_printf(sc->sc_dev, in bwn_dma_allocringmemory()
3253 return (-1); in bwn_dma_allocringmemory()
3268 mac = dr->dr_mac; in bwn_dma_setup()
3269 dma = &mac->mac_method.dma; in bwn_dma_setup()
3270 dt = &dma->translation; in bwn_dma_setup()
3272 paddr = dr->dr_ring_dmabase; in bwn_dma_setup()
3273 addr = (paddr & dt->addr_mask) | dt->base_addr; in bwn_dma_setup()
3276 addrext = ((paddr & dt->addrext_mask) >> dma->addrext_shift); in bwn_dma_setup()
3278 if (dr->dr_tx) { in bwn_dma_setup()
3279 dr->dr_curslot = -1; in bwn_dma_setup()
3281 if (dr->dr_type == BHND_DMA_ADDR_64BIT) { in bwn_dma_setup()
3303 dr->dr_usedslot = dr->dr_numslots; in bwn_dma_setup()
3305 if (dr->dr_type == BHND_DMA_ADDR_64BIT) { in bwn_dma_setup()
3306 value = (dr->dr_frameoffset << BWN_DMA64_RXFROFF_SHIFT); in bwn_dma_setup()
3314 BWN_DMA_WRITE(dr, BWN_DMA64_RXINDEX, dr->dr_numslots * in bwn_dma_setup()
3317 value = (dr->dr_frameoffset << BWN_DMA32_RXFROFF_SHIFT); in bwn_dma_setup()
3324 BWN_DMA_WRITE(dr, BWN_DMA32_RXINDEX, dr->dr_numslots * in bwn_dma_setup()
3333 bus_dmamap_unload(dr->dr_ring_dtag, dr->dr_ring_dmap); in bwn_dma_free_ringmemory()
3334 bus_dmamem_free(dr->dr_ring_dtag, dr->dr_ring_descbase, in bwn_dma_free_ringmemory()
3335 dr->dr_ring_dmap); in bwn_dma_free_ringmemory()
3342 if (dr->dr_tx) { in bwn_dma_cleanup()
3343 bwn_dma_tx_reset(dr->dr_mac, dr->dr_base, dr->dr_type); in bwn_dma_cleanup()
3344 if (dr->dr_type == BHND_DMA_ADDR_64BIT) { in bwn_dma_cleanup()
3350 bwn_dma_rx_reset(dr->dr_mac, dr->dr_base, dr->dr_type); in bwn_dma_cleanup()
3351 if (dr->dr_type == BHND_DMA_ADDR_64BIT) { in bwn_dma_cleanup()
3364 struct bwn_mac *mac = dr->dr_mac; in bwn_dma_free_descbufs()
3365 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_free_descbufs()
3366 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_free_descbufs()
3369 if (!dr->dr_usedslot) in bwn_dma_free_descbufs()
3371 for (i = 0; i < dr->dr_numslots; i++) { in bwn_dma_free_descbufs()
3372 dr->getdesc(dr, i, &desc, &meta); in bwn_dma_free_descbufs()
3374 if (meta->mt_m == NULL) { in bwn_dma_free_descbufs()
3375 if (!dr->dr_tx) in bwn_dma_free_descbufs()
3376 device_printf(sc->sc_dev, "%s: not TX?\n", in bwn_dma_free_descbufs()
3380 if (dr->dr_tx) { in bwn_dma_free_descbufs()
3381 if (meta->mt_txtype == BWN_DMADESC_METATYPE_HEADER) in bwn_dma_free_descbufs()
3382 bus_dmamap_unload(dr->dr_txring_dtag, in bwn_dma_free_descbufs()
3383 meta->mt_dmap); in bwn_dma_free_descbufs()
3384 else if (meta->mt_txtype == BWN_DMADESC_METATYPE_BODY) in bwn_dma_free_descbufs()
3385 bus_dmamap_unload(dma->txbuf_dtag, in bwn_dma_free_descbufs()
3386 meta->mt_dmap); in bwn_dma_free_descbufs()
3388 bus_dmamap_unload(dma->rxbuf_dtag, meta->mt_dmap); in bwn_dma_free_descbufs()
3397 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_tx_reset()
3431 i = -1; in bwn_dma_tx_reset()
3437 i = -1; in bwn_dma_tx_reset()
3443 if (i != -1) { in bwn_dma_tx_reset()
3444 device_printf(sc->sc_dev, "%s: timed out\n", __func__); in bwn_dma_tx_reset()
3456 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_rx_reset()
3471 i = -1; in bwn_dma_rx_reset()
3477 i = -1; in bwn_dma_rx_reset()
3483 if (i != -1) { in bwn_dma_rx_reset()
3484 device_printf(sc->sc_dev, "%s: timed out\n", __func__); in bwn_dma_rx_reset()
3496 if (meta->mt_m != NULL) { in bwn_dma_free_descbuf()
3497 m_freem(meta->mt_m); in bwn_dma_free_descbuf()
3498 meta->mt_m = NULL; in bwn_dma_free_descbuf()
3500 if (meta->mt_ni != NULL) { in bwn_dma_free_descbuf()
3501 ieee80211_free_node(meta->mt_ni); in bwn_dma_free_descbuf()
3502 meta->mt_ni = NULL; in bwn_dma_free_descbuf()
3513 rxhdr->frame_len = 0; in bwn_dma_set_redzone()
3515 KASSERT(dr->dr_rx_bufsize >= dr->dr_frameoffset + in bwn_dma_set_redzone()
3518 frame = mtod(m, char *) + dr->dr_frameoffset; in bwn_dma_set_redzone()
3525 unsigned char *f = mtod(m, char *) + dr->dr_frameoffset; in bwn_dma_check_redzone()
3546 struct bwn_softc *sc = mac->mac_sc; in bwn_spu_setdelay()
3547 struct ieee80211com *ic = &sc->sc_ic; in bwn_spu_setdelay()
3550 delay = (mac->mac_phy.type == BWN_PHYTYPE_A) ? 3700 : 1050; in bwn_spu_setdelay()
3551 if (ic->ic_opmode == IEEE80211_M_IBSS || idle) in bwn_spu_setdelay()
3553 if ((mac->mac_phy.rf_ver == 0x2050) && (mac->mac_phy.rf_rev == 8)) in bwn_spu_setdelay()
3562 struct bwn_softc *sc = mac->mac_sc; in bwn_bt_enable()
3567 if ((sc->sc_board_info.board_flags & BHND_BFL_BTCOEX) == 0) in bwn_bt_enable()
3569 if (mac->mac_phy.type != BWN_PHYTYPE_B && !mac->mac_phy.gmode) in bwn_bt_enable()
3573 if (sc->sc_board_info.board_flags & BHND_BFL_BTC2WIRE_ALTGPIO) in bwn_bt_enable()
3586 mac->mac_sc->sc_ic.ic_macaddr); in bwn_set_macaddr()
3594 for (i = 0; i < mac->mac_max_nr_keys; i++) { in bwn_clear_keys()
3595 KASSERT(i >= 0 && i < mac->mac_max_nr_keys, in bwn_clear_keys()
3604 mac->mac_key[i].keyconf = NULL; in bwn_clear_keys()
3611 struct bwn_softc *sc = mac->mac_sc; in bwn_crypt_init()
3613 mac->mac_max_nr_keys = (bhnd_get_hwrev(sc->sc_dev) >= 5) ? 58 : 20; in bwn_crypt_init()
3614 KASSERT(mac->mac_max_nr_keys <= N(mac->mac_key), in bwn_crypt_init()
3616 mac->mac_ktp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_KEY_TABLEP); in bwn_crypt_init()
3617 mac->mac_ktp *= 2; in bwn_crypt_init()
3618 if (bhnd_get_hwrev(sc->sc_dev) >= 5) in bwn_crypt_init()
3619 BWN_WRITE_2(mac, BWN_RCMTA_COUNT, mac->mac_max_nr_keys - 8); in bwn_crypt_init()
3658 sc = mac->mac_sc; in bwn_gpio_control()
3674 error = GPIO_PIN_CONFIG_32(sc->sc_gpio, 0, nitems(flags), flags); in bwn_gpio_control()
3676 device_printf(sc->sc_dev, "error configuring %s pin flags: " in bwn_gpio_control()
3677 "%d\n", device_get_nameunit(sc->sc_gpio), error); in bwn_gpio_control()
3690 sc = mac->mac_sc; in bwn_gpio_init()
3699 if (sc->sc_board_info.board_flags & BHND_BFL_PACTRL) { in bwn_gpio_init()
3714 ((const struct bwn_fwinitvals *)((const char *)fwp.fw->data + offset)) in bwn_fw_loadinitvals()
3717 struct bwn_fw *fw = &mac->mac_fw; in bwn_fw_loadinitvals()
3720 hdr = (const struct bwn_fwhdr *)(fw->initvals.fw->data); in bwn_fw_loadinitvals()
3721 error = bwn_fwinitvals_write(mac, GETFWOFFSET(fw->initvals, hdr_len), in bwn_fw_loadinitvals()
3722 be32toh(hdr->size), fw->initvals.fw->datasize - hdr_len); in bwn_fw_loadinitvals()
3725 if (fw->initvals_band.fw) { in bwn_fw_loadinitvals()
3726 hdr = (const struct bwn_fwhdr *)(fw->initvals_band.fw->data); in bwn_fw_loadinitvals()
3728 GETFWOFFSET(fw->initvals_band, hdr_len), in bwn_fw_loadinitvals()
3729 be32toh(hdr->size), in bwn_fw_loadinitvals()
3730 fw->initvals_band.fw->datasize - hdr_len); in bwn_fw_loadinitvals()
3739 struct bwn_softc *sc = mac->mac_sc; in bwn_phy_init()
3742 mac->mac_phy.chan = mac->mac_phy.get_default_chan(mac); in bwn_phy_init()
3743 mac->mac_phy.rf_onoff(mac, 1); in bwn_phy_init()
3744 error = mac->mac_phy.init(mac); in bwn_phy_init()
3746 device_printf(sc->sc_dev, "PHY init failed\n"); in bwn_phy_init()
3750 mac->mac_phy.get_default_chan(mac)); in bwn_phy_init()
3752 device_printf(sc->sc_dev, in bwn_phy_init()
3758 if (mac->mac_phy.exit) in bwn_phy_init()
3759 mac->mac_phy.exit(mac); in bwn_phy_init()
3761 mac->mac_phy.rf_onoff(mac, 0); in bwn_phy_init()
3774 /* For ACK/CTS */ in bwn_set_txantenna()
3787 struct bwn_softc *sc = mac->mac_sc; in bwn_set_opmode()
3788 struct ieee80211com *ic = &sc->sc_ic; in bwn_set_opmode()
3798 if (ic->ic_opmode == IEEE80211_M_HOSTAP || in bwn_set_opmode()
3799 ic->ic_opmode == IEEE80211_M_MBSS) in bwn_set_opmode()
3801 else if (ic->ic_opmode == IEEE80211_M_IBSS) in bwn_set_opmode()
3803 ctl |= sc->sc_filters; in bwn_set_opmode()
3805 if (bhnd_get_hwrev(sc->sc_dev) <= 4) in bwn_set_opmode()
3812 if (sc->sc_cid.chip_id == BHND_CHIPID_BCM4306 && in bwn_set_opmode()
3813 sc->sc_cid.chip_rev == 3) in bwn_set_opmode()
3826 *((bus_addr_t *)arg) = seg->ds_addr; in bwn_dma_ring_addr()
3833 struct bwn_phy *phy = &mac->mac_phy; in bwn_dummy_transmission()
3834 struct bwn_softc *sc = mac->mac_sc; in bwn_dummy_transmission()
3849 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_dummy_transmission()
3856 (bhnd_get_hwrev(sc->sc_dev) < 11) ? 0x0000 : 0x0100); in bwn_dummy_transmission()
3861 if (phy->type == BWN_PHYTYPE_N || phy->type == BWN_PHYTYPE_LP || in bwn_dummy_transmission()
3862 phy->type == BWN_PHYTYPE_LCN) in bwn_dummy_transmission()
3873 switch (phy->type) { in bwn_dummy_transmission()
3889 if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) in bwn_dummy_transmission()
3909 if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) in bwn_dummy_transmission()
3922 printf("TODO: need swap\n"); in bwn_ram_write()
3932 struct bwn_softc *sc = mac->mac_sc; in bwn_mac_suspend()
3936 KASSERT(mac->mac_suspended >= 0, in bwn_mac_suspend()
3939 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: suspended=%d\n", in bwn_mac_suspend()
3940 __func__, mac->mac_suspended); in bwn_mac_suspend()
3942 if (mac->mac_suspended == 0) { in bwn_mac_suspend()
3948 for (i = 35; i; i--) { in bwn_mac_suspend()
3954 for (i = 40; i; i--) { in bwn_mac_suspend()
3960 device_printf(sc->sc_dev, "MAC suspend failed\n"); in bwn_mac_suspend()
3963 mac->mac_suspended++; in bwn_mac_suspend()
3969 struct bwn_softc *sc = mac->mac_sc; in bwn_mac_enable()
3972 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: suspended=%d\n", in bwn_mac_enable()
3973 __func__, mac->mac_suspended); in bwn_mac_enable()
3984 mac->mac_suspended--; in bwn_mac_enable()
3985 KASSERT(mac->mac_suspended >= 0, in bwn_mac_enable()
3987 if (mac->mac_suspended == 0) { in bwn_mac_enable()
4000 struct bwn_softc *sc = mac->mac_sc; in bwn_psctl()
4009 /* XXX forcibly awake and hwps-off */ in bwn_psctl()
4015 if (bhnd_get_hwrev(sc->sc_dev) >= 5) { in bwn_psctl()
4024 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: ucstat=%d\n", __func__, in bwn_psctl()
4031 struct bwn_softc *sc = mac->mac_sc; in bwn_fw_gets()
4032 struct bwn_fw *fw = &mac->mac_fw; in bwn_fw_gets()
4033 const uint8_t rev = bhnd_get_hwrev(sc->sc_dev); in bwn_fw_gets()
4042 if (mac->mac_phy.type == BWN_PHYTYPE_AC) in bwn_fw_gets()
4046 if (mac->mac_phy.type == BWN_PHYTYPE_AC) in bwn_fw_gets()
4050 if (mac->mac_phy.type == BWN_PHYTYPE_LCN40) in bwn_fw_gets()
4054 if (mac->mac_phy.type == BWN_PHYTYPE_N) in bwn_fw_gets()
4058 if (mac->mac_phy.type == BWN_PHYTYPE_HT) in bwn_fw_gets()
4062 if (mac->mac_phy.type == BWN_PHYTYPE_HT) in bwn_fw_gets()
4067 if (mac->mac_phy.type == BWN_PHYTYPE_N) in bwn_fw_gets()
4069 else if (mac->mac_phy.type == BWN_PHYTYPE_LCN) in bwn_fw_gets()
4073 if (mac->mac_phy.type == BWN_PHYTYPE_LCN) in bwn_fw_gets()
4077 if (mac->mac_phy.type == BWN_PHYTYPE_N) in bwn_fw_gets()
4084 if (mac->mac_phy.type == BWN_PHYTYPE_N) in bwn_fw_gets()
4086 else if (mac->mac_phy.type == BWN_PHYTYPE_LP) in bwn_fw_gets()
4111 device_printf(sc->sc_dev, "no ucode for rev %d\n", rev); in bwn_fw_gets()
4116 device_printf(sc->sc_dev, "ucode fw: %s\n", filename); in bwn_fw_gets()
4117 error = bwn_fw_get(mac, type, filename, &fw->ucode); in bwn_fw_gets()
4124 KASSERT(fw->no_pcmfile == 0, ("%s:%d fail", __func__, __LINE__)); in bwn_fw_gets()
4126 error = bwn_fw_get(mac, type, "pcm5", &fw->pcm); in bwn_fw_gets()
4128 fw->no_pcmfile = 1; in bwn_fw_gets()
4134 device_printf(sc->sc_dev, "no PCM for rev %d\n", rev); in bwn_fw_gets()
4140 error = bhnd_read_iost(sc->sc_dev, &iost); in bwn_fw_gets()
4144 switch (mac->mac_phy.type) { in bwn_fw_gets()
4190 error = bwn_fw_get(mac, type, filename, &fw->initvals); in bwn_fw_gets()
4197 switch (mac->mac_phy.type) { in bwn_fw_gets()
4244 device_printf(sc->sc_dev, "unknown phy (%d)\n", in bwn_fw_gets()
4245 mac->mac_phy.type); in bwn_fw_gets()
4248 error = bwn_fw_get(mac, type, filename, &fw->initvals_band); in bwn_fw_gets()
4255 device_printf(sc->sc_dev, "no INITVALS for rev %d, phy.type %d\n", in bwn_fw_gets()
4256 rev, mac->mac_phy.type); in bwn_fw_gets()
4266 struct bwn_softc *sc = mac->mac_sc; in bwn_fw_get()
4274 if (bfw->filename != NULL) { in bwn_fw_get()
4275 if (bfw->type == type && (strcmp(bfw->filename, name) == 0)) in bwn_fw_get()
4281 (type == BWN_FWTYPE_OPENSOURCE) ? "-open" : "", in bwn_fw_get()
4282 (mac->mac_phy.type == BWN_PHYTYPE_LP) ? "lp_" : "", name); in bwn_fw_get()
4283 /* XXX Sleeping on "fwload" with the non-sleepable locks held */ in bwn_fw_get()
4286 device_printf(sc->sc_dev, "the fw file(%s) not found\n", in bwn_fw_get()
4290 if (fw->datasize < sizeof(struct bwn_fwhdr)) in bwn_fw_get()
4292 hdr = (const struct bwn_fwhdr *)(fw->data); in bwn_fw_get()
4293 switch (hdr->type) { in bwn_fw_get()
4296 if (be32toh(hdr->size) != in bwn_fw_get()
4297 (fw->datasize - sizeof(struct bwn_fwhdr))) in bwn_fw_get()
4301 if (hdr->ver != 1) in bwn_fw_get()
4307 bfw->filename = name; in bwn_fw_get()
4308 bfw->fw = fw; in bwn_fw_get()
4309 bfw->type = type; in bwn_fw_get()
4312 device_printf(sc->sc_dev, "the fw file(%s) format error\n", namebuf); in bwn_fw_get()
4322 bwn_do_release_fw(&mac->mac_fw.ucode); in bwn_release_firmware()
4323 bwn_do_release_fw(&mac->mac_fw.pcm); in bwn_release_firmware()
4324 bwn_do_release_fw(&mac->mac_fw.initvals); in bwn_release_firmware()
4325 bwn_do_release_fw(&mac->mac_fw.initvals_band); in bwn_release_firmware()
4332 if (bfw->fw != NULL) in bwn_do_release_fw()
4333 firmware_put(bfw->fw, FIRMWARE_UNLOAD); in bwn_do_release_fw()
4334 bfw->fw = NULL; in bwn_do_release_fw()
4335 bfw->filename = NULL; in bwn_do_release_fw()
4342 ((const uint32_t *)((const char *)fwp.fw->data + offset)) in bwn_fw_loaducode()
4344 ((fwp.fw->datasize - offset) / sizeof(uint32_t)) in bwn_fw_loaducode()
4345 struct bwn_softc *sc = mac->mac_sc; in bwn_fw_loaducode()
4362 data = GETFWOFFSET(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); in bwn_fw_loaducode()
4364 for (i = 0; i < GETFWSIZE(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); in bwn_fw_loaducode()
4370 if (mac->mac_fw.pcm.fw) { in bwn_fw_loaducode()
4371 data = GETFWOFFSET(mac->mac_fw.pcm, sizeof(struct bwn_fwhdr)); in bwn_fw_loaducode()
4375 for (i = 0; i < GETFWSIZE(mac->mac_fw.pcm, in bwn_fw_loaducode()
4391 device_printf(sc->sc_dev, "ucode timeout\n"); in bwn_fw_loaducode()
4399 mac->mac_fw.rev = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_REV); in bwn_fw_loaducode()
4400 if (mac->mac_fw.rev <= 0x128) { in bwn_fw_loaducode()
4401 device_printf(sc->sc_dev, "the firmware is too old\n"); in bwn_fw_loaducode()
4410 if (mac->mac_fw.rev >= 598) in bwn_fw_loaducode()
4411 mac->mac_fw.fw_hdr_format = BWN_FW_HDR_598; in bwn_fw_loaducode()
4412 else if (mac->mac_fw.rev >= 410) in bwn_fw_loaducode()
4413 mac->mac_fw.fw_hdr_format = BWN_FW_HDR_410; in bwn_fw_loaducode()
4415 mac->mac_fw.fw_hdr_format = BWN_FW_HDR_351; in bwn_fw_loaducode()
4426 if (mac->mac_fw.fw_hdr_format == BWN_FW_HDR_598) { in bwn_fw_loaducode()
4427 device_printf(sc->sc_dev, in bwn_fw_loaducode()
4434 mac->mac_fw.patch = bwn_shm_read_2(mac, BWN_SHARED, in bwn_fw_loaducode()
4437 mac->mac_fw.opensource = (date == 0xffff); in bwn_fw_loaducode()
4439 mac->mac_flags |= BWN_MAC_FLAG_WME; in bwn_fw_loaducode()
4440 mac->mac_flags |= BWN_MAC_FLAG_HWCRYPTO; in bwn_fw_loaducode()
4443 if (mac->mac_fw.opensource == 0) { in bwn_fw_loaducode()
4444 device_printf(sc->sc_dev, in bwn_fw_loaducode()
4446 mac->mac_fw.rev, mac->mac_fw.patch, date, time); in bwn_fw_loaducode()
4447 if (mac->mac_fw.no_pcmfile) in bwn_fw_loaducode()
4448 device_printf(sc->sc_dev, in bwn_fw_loaducode()
4451 mac->mac_fw.patch = time; in bwn_fw_loaducode()
4453 if (!(fwcaps & BWN_FWCAPS_HWCRYPTO) || mac->mac_fw.no_pcmfile) { in bwn_fw_loaducode()
4454 device_printf(sc->sc_dev, in bwn_fw_loaducode()
4456 mac->mac_flags &= ~BWN_MAC_FLAG_HWCRYPTO; in bwn_fw_loaducode()
4459 device_printf(sc->sc_dev, "disabling WME support\n"); in bwn_fw_loaducode()
4460 mac->mac_flags &= ~BWN_MAC_FLAG_WME; in bwn_fw_loaducode()
4465 device_printf(sc->sc_dev, "using old firmware image\n"); in bwn_fw_loaducode()
4484 KASSERT(mac->mac_fw.opensource == 1, in bwn_fwcaps_read()
4499 struct bwn_softc *sc = mac->mac_sc; in bwn_fwinitvals_write()
4509 if (array_size < sizeof(iv->offset_size)) in bwn_fwinitvals_write()
4511 array_size -= sizeof(iv->offset_size); in bwn_fwinitvals_write()
4512 offset = be16toh(iv->offset_size); in bwn_fwinitvals_write()
4518 if (array_size < sizeof(iv->data.d32)) in bwn_fwinitvals_write()
4520 array_size -= sizeof(iv->data.d32); in bwn_fwinitvals_write()
4521 BWN_WRITE_4(mac, offset, be32toh(iv->data.d32)); in bwn_fwinitvals_write()
4524 if (array_size < sizeof(iv->data.d16)) in bwn_fwinitvals_write()
4526 array_size -= sizeof(iv->data.d16); in bwn_fwinitvals_write()
4527 BWN_WRITE_2(mac, offset, be16toh(iv->data.d16)); in bwn_fwinitvals_write()
4536 device_printf(sc->sc_dev, "initvals: invalid format\n"); in bwn_fwinitvals_write()
4545 struct bwn_phy *phy = &(mac->mac_phy); in bwn_switch_channel()
4546 struct bwn_softc *sc = mac->mac_sc; in bwn_switch_channel()
4547 struct ieee80211com *ic = &sc->sc_ic; in bwn_switch_channel()
4552 chan = phy->get_default_chan(mac); in bwn_switch_channel()
4555 if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) in bwn_switch_channel()
4559 error = phy->switch_channel(mac, chan); in bwn_switch_channel()
4563 mac->mac_phy.chan = chan; in bwn_switch_channel()
4567 device_printf(sc->sc_dev, "failed to switch channel\n"); in bwn_switch_channel()
4595 struct bwn_softc *sc = mac->mac_sc; in bwn_wme_load()
4598 KASSERT(N(bwn_wme_shm_offsets) == N(sc->sc_wmeParams), in bwn_wme_load()
4602 for (i = 0; i < N(sc->sc_wmeParams); i++) in bwn_wme_load()
4603 bwn_wme_loadparams(mac, &(sc->sc_wmeParams[i]), in bwn_wme_load()
4612 struct bwn_softc *sc = mac->mac_sc; in bwn_wme_loadparams()
4618 _IEEE80211_SHIFTMASK(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); in bwn_wme_loadparams()
4623 "wmep_logcwmax %d wmep_aifsn %d\n", p->wmep_txopLimit, in bwn_wme_loadparams()
4624 p->wmep_logcwmin, p->wmep_logcwmax, p->wmep_aifsn); in bwn_wme_loadparams()
4626 params[BWN_WMEPARAM_TXOP] = p->wmep_txopLimit * 32; in bwn_wme_loadparams()
4628 _IEEE80211_SHIFTMASK(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); in bwn_wme_loadparams()
4630 _IEEE80211_SHIFTMASK(p->wmep_logcwmax, WME_PARAM_LOGCWMAX); in bwn_wme_loadparams()
4632 _IEEE80211_SHIFTMASK(p->wmep_logcwmin, WME_PARAM_LOGCWMIN); in bwn_wme_loadparams()
4633 params[BWN_WMEPARAM_AIFS] = p->wmep_aifsn; in bwn_wme_loadparams()
4635 params[BWN_WMEPARAM_REGGAP] = slot + p->wmep_aifsn; in bwn_wme_loadparams()
4654 struct bwn_softc *sc = mac->mac_sc; in bwn_mac_write_bssid()
4659 bwn_mac_setfilter(mac, BWN_MACFILTER_BSSID, sc->sc_bssid); in bwn_mac_write_bssid()
4660 memcpy(mac_bssid, sc->sc_ic.ic_macaddr, IEEE80211_ADDR_LEN); in bwn_mac_write_bssid()
4661 memcpy(mac_bssid + IEEE80211_ADDR_LEN, sc->sc_bssid, in bwn_mac_write_bssid()
4707 KASSERT(index < mac->mac_max_nr_keys, in bwn_key_dowrite()
4720 mac->mac_key[index].algorithm = algorithm; in bwn_key_dowrite()
4726 struct bwn_softc *sc = mac->mac_sc; in bwn_key_macwrite()
4735 index -= start; in bwn_key_macwrite()
4746 if (bhnd_get_hwrev(sc->sc_dev) >= 5) { in bwn_key_macwrite()
4771 offset = mac->mac_ktp + (index * BWN_SEC_KEYSIZE); in bwn_key_write()
4783 mac->mac_phy.rf_onoff(mac, 0); in bwn_phy_exit()
4784 if (mac->mac_phy.exit != NULL) in bwn_phy_exit()
4785 mac->mac_phy.exit(mac); in bwn_phy_exit()
4793 if ((mac->mac_flags & BWN_MAC_FLAG_DMA) == 0) in bwn_dma_free()
4795 dma = &mac->mac_method.dma; in bwn_dma_free()
4797 bwn_dma_ringfree(&dma->rx); in bwn_dma_free()
4798 bwn_dma_ringfree(&dma->wme[WME_AC_BK]); in bwn_dma_free()
4799 bwn_dma_ringfree(&dma->wme[WME_AC_BE]); in bwn_dma_free()
4800 bwn_dma_ringfree(&dma->wme[WME_AC_VI]); in bwn_dma_free()
4801 bwn_dma_ringfree(&dma->wme[WME_AC_VO]); in bwn_dma_free()
4802 bwn_dma_ringfree(&dma->mcast); in bwn_dma_free()
4808 struct bwn_softc *sc = mac->mac_sc; in bwn_core_stop()
4812 if (mac->mac_status < BWN_MAC_STATUS_STARTED) in bwn_core_stop()
4815 callout_stop(&sc->sc_rfswitch_ch); in bwn_core_stop()
4816 callout_stop(&sc->sc_task_ch); in bwn_core_stop()
4817 callout_stop(&sc->sc_watchdog_ch); in bwn_core_stop()
4818 sc->sc_watchdog_timer = 0; in bwn_core_stop()
4823 mac->mac_status = BWN_MAC_STATUS_INITED; in bwn_core_stop()
4837 TAILQ_FOREACH(mac, &sc->sc_maclist, mac_list) { in bwn_switch_band()
4839 mac->mac_phy.supports_2ghz) { in bwn_switch_band()
4843 mac->mac_phy.supports_5ghz) { in bwn_switch_band()
4854 device_printf(sc->sc_dev, "Could not find a device\n"); in bwn_switch_band()
4857 if (up_dev == sc->sc_curmac && sc->sc_curmac->mac_phy.gmode == gmode) in bwn_switch_band()
4861 "switching to %s-GHz band\n", in bwn_switch_band()
4864 down_dev = sc->sc_curmac; in bwn_switch_band()
4865 status = down_dev->mac_status; in bwn_switch_band()
4877 up_dev->mac_phy.gmode = gmode; in bwn_switch_band()
4881 device_printf(sc->sc_dev, in bwn_switch_band()
4882 "fatal: failed to initialize for %s-GHz\n", in bwn_switch_band()
4889 KASSERT(up_dev->mac_status == status, ("%s: fail", __func__)); in bwn_switch_band()
4890 sc->sc_curmac = up_dev; in bwn_switch_band()
4894 sc->sc_curmac = NULL; in bwn_switch_band()
4902 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_rf_turnon()
4905 mac->mac_phy.rf_onoff(mac, 1); in bwn_rf_turnon()
4906 mac->mac_phy.rf_on = 1; in bwn_rf_turnon()
4914 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_rf_turnoff()
4917 mac->mac_phy.rf_onoff(mac, 0); in bwn_rf_turnoff()
4918 mac->mac_phy.rf_on = 0; in bwn_rf_turnoff()
4932 sc = mac->mac_sc; in bwn_phy_reset()
4937 if ((error = bhnd_write_ioctl(sc->sc_dev, iost, mask))) in bwn_phy_reset()
4944 if ((error = bhnd_write_ioctl(sc->sc_dev, iost, mask))) in bwn_phy_reset()
4956 struct ieee80211com *ic= vap->iv_ic; in bwn_newstate()
4957 enum ieee80211_state ostate = vap->iv_state; in bwn_newstate()
4958 struct bwn_softc *sc = ic->ic_softc; in bwn_newstate()
4959 struct bwn_mac *mac = sc->sc_curmac; in bwn_newstate()
4962 DPRINTF(sc, BWN_DEBUG_STATE, "%s: %s -> %s\n", __func__, in bwn_newstate()
4963 ieee80211_state_name[vap->iv_state], in bwn_newstate()
4966 error = bvp->bv_newstate(vap, nstate, arg); in bwn_newstate()
4977 if (vap->iv_opmode == IEEE80211_M_STA) { in bwn_newstate()
4984 if (ic->ic_opmode == IEEE80211_M_STA && in bwn_newstate()
4985 (sc->sc_flags & BWN_FLAG_INVALID) == 0) { in bwn_newstate()
4986 memset(sc->sc_bssid, 0, IEEE80211_ADDR_LEN); in bwn_newstate()
4992 if (vap->iv_opmode == IEEE80211_M_MONITOR || in bwn_newstate()
4993 vap->iv_opmode == IEEE80211_M_AHDEMO) { in bwn_newstate()
4996 memcpy(sc->sc_bssid, vap->iv_bss->ni_bssid, IEEE80211_ADDR_LEN); in bwn_newstate()
5011 struct bwn_softc *sc = mac->mac_sc; in bwn_set_pretbtt()
5012 struct ieee80211com *ic = &sc->sc_ic; in bwn_set_pretbtt()
5015 if (ic->ic_opmode == IEEE80211_M_IBSS) in bwn_set_pretbtt()
5018 pretbtt = (mac->mac_phy.type == BWN_PHYTYPE_A) ? 120 : 250; in bwn_set_pretbtt()
5027 struct bwn_softc *sc = mac->mac_sc; in bwn_intr()
5030 if (mac->mac_status < BWN_MAC_STATUS_STARTED || in bwn_intr()
5031 (sc->sc_flags & BWN_FLAG_INVALID)) in bwn_intr()
5039 reason &= mac->mac_intr_mask; in bwn_intr()
5044 mac->mac_reason[0] = BWN_READ_4(mac, BWN_DMA0_REASON) & 0x0001dc00; in bwn_intr()
5045 mac->mac_reason[1] = BWN_READ_4(mac, BWN_DMA1_REASON) & 0x0000dc00; in bwn_intr()
5046 mac->mac_reason[2] = BWN_READ_4(mac, BWN_DMA2_REASON) & 0x0000dc00; in bwn_intr()
5047 mac->mac_reason[3] = BWN_READ_4(mac, BWN_DMA3_REASON) & 0x0001dc00; in bwn_intr()
5048 mac->mac_reason[4] = BWN_READ_4(mac, BWN_DMA4_REASON) & 0x0000dc00; in bwn_intr()
5050 BWN_WRITE_4(mac, BWN_DMA0_REASON, mac->mac_reason[0]); in bwn_intr()
5051 BWN_WRITE_4(mac, BWN_DMA1_REASON, mac->mac_reason[1]); in bwn_intr()
5052 BWN_WRITE_4(mac, BWN_DMA2_REASON, mac->mac_reason[2]); in bwn_intr()
5053 BWN_WRITE_4(mac, BWN_DMA3_REASON, mac->mac_reason[3]); in bwn_intr()
5054 BWN_WRITE_4(mac, BWN_DMA4_REASON, mac->mac_reason[4]); in bwn_intr()
5059 mac->mac_reason_intr = reason; in bwn_intr()
5063 taskqueue_enqueue(sc->sc_tq, &mac->mac_intrtask); in bwn_intr()
5071 struct bwn_softc *sc = mac->mac_sc; in bwn_intrtask()
5076 if (mac->mac_status < BWN_MAC_STATUS_STARTED || in bwn_intrtask()
5077 (sc->sc_flags & BWN_FLAG_INVALID)) { in bwn_intrtask()
5082 for (i = 0; i < N(mac->mac_reason); i++) in bwn_intrtask()
5083 merged |= mac->mac_reason[i]; in bwn_intrtask()
5085 if (mac->mac_reason_intr & BWN_INTR_MAC_TXERR) in bwn_intrtask()
5086 device_printf(sc->sc_dev, "MAC trans error\n"); in bwn_intrtask()
5088 if (mac->mac_reason_intr & BWN_INTR_PHY_TXERR) { in bwn_intrtask()
5090 mac->mac_phy.txerrors--; in bwn_intrtask()
5091 if (mac->mac_phy.txerrors == 0) { in bwn_intrtask()
5092 mac->mac_phy.txerrors = BWN_TXERROR_MAX; in bwn_intrtask()
5099 device_printf(sc->sc_dev, in bwn_intrtask()
5101 mac->mac_reason[0], mac->mac_reason[1], in bwn_intrtask()
5102 mac->mac_reason[2], mac->mac_reason[3], in bwn_intrtask()
5103 mac->mac_reason[4], mac->mac_reason[5]); in bwn_intrtask()
5109 device_printf(sc->sc_dev, in bwn_intrtask()
5111 mac->mac_reason[0], mac->mac_reason[1], in bwn_intrtask()
5112 mac->mac_reason[2], mac->mac_reason[3], in bwn_intrtask()
5113 mac->mac_reason[4], mac->mac_reason[5]); in bwn_intrtask()
5117 if (mac->mac_reason_intr & BWN_INTR_UCODE_DEBUG) in bwn_intrtask()
5119 if (mac->mac_reason_intr & BWN_INTR_TBTT_INDI) in bwn_intrtask()
5121 if (mac->mac_reason_intr & BWN_INTR_ATIM_END) in bwn_intrtask()
5123 if (mac->mac_reason_intr & BWN_INTR_BEACON) in bwn_intrtask()
5125 if (mac->mac_reason_intr & BWN_INTR_PMQ) in bwn_intrtask()
5127 if (mac->mac_reason_intr & BWN_INTR_NOISESAMPLE_OK) in bwn_intrtask()
5130 if (mac->mac_flags & BWN_MAC_FLAG_DMA) { in bwn_intrtask()
5131 if (mac->mac_reason[0] & BWN_DMAINTR_RX_DONE) { in bwn_intrtask()
5132 bwn_dma_rx(mac->mac_method.dma.rx); in bwn_intrtask()
5136 rx = bwn_pio_rx(&mac->mac_method.pio.rx); in bwn_intrtask()
5138 KASSERT(!(mac->mac_reason[1] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); in bwn_intrtask()
5139 KASSERT(!(mac->mac_reason[2] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); in bwn_intrtask()
5140 KASSERT(!(mac->mac_reason[3] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); in bwn_intrtask()
5141 KASSERT(!(mac->mac_reason[4] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); in bwn_intrtask()
5142 KASSERT(!(mac->mac_reason[5] & BWN_DMAINTR_RX_DONE), ("%s", __func__)); in bwn_intrtask()
5144 if (mac->mac_reason_intr & BWN_INTR_TX_OK) { in bwn_intrtask()
5149 BWN_WRITE_4(mac, BWN_INTR_MASK, mac->mac_intr_mask); in bwn_intrtask()
5151 if (sc->sc_blink_led != NULL && sc->sc_led_blink) { in bwn_intrtask()
5155 if (sc->sc_rx_rate > sc->sc_tx_rate) in bwn_intrtask()
5171 if (mbufq_first(&sc->sc_snd) != NULL) in bwn_intrtask()
5182 struct bwn_softc *sc = mac->mac_sc; in bwn_restart()
5183 struct ieee80211com *ic = &sc->sc_ic; in bwn_restart()
5185 if (mac->mac_status < BWN_MAC_STATUS_INITED) in bwn_restart()
5188 device_printf(sc->sc_dev, "HW reset: %s\n", msg); in bwn_restart()
5189 ieee80211_runtask(ic, &mac->mac_hwreset); in bwn_restart()
5195 struct bwn_softc *sc = mac->mac_sc; in bwn_intr_ucode_debug()
5198 if (mac->mac_fw.opensource == 0) in bwn_intr_ucode_debug()
5207 device_printf(sc->sc_dev, "BWN_DEBUGINTR_DUMP_SHM\n"); in bwn_intr_ucode_debug()
5210 device_printf(sc->sc_dev, "BWN_DEBUGINTR_DUMP_REGS\n"); in bwn_intr_ucode_debug()
5213 device_printf(sc->sc_dev, "BWN_DEBUGINTR_MARKER\n"); in bwn_intr_ucode_debug()
5216 device_printf(sc->sc_dev, in bwn_intr_ucode_debug()
5227 struct bwn_softc *sc = mac->mac_sc; in bwn_intr_tbtt_indication()
5228 struct ieee80211com *ic = &sc->sc_ic; in bwn_intr_tbtt_indication()
5230 if (ic->ic_opmode != IEEE80211_M_HOSTAP) in bwn_intr_tbtt_indication()
5232 if (ic->ic_opmode == IEEE80211_M_IBSS) in bwn_intr_tbtt_indication()
5233 mac->mac_flags |= BWN_MAC_FLAG_DFQVALID; in bwn_intr_tbtt_indication()
5240 if (mac->mac_flags & BWN_MAC_FLAG_DFQVALID) { in bwn_intr_atim_end()
5243 mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; in bwn_intr_atim_end()
5250 struct bwn_softc *sc = mac->mac_sc; in bwn_intr_beacon()
5251 struct ieee80211com *ic = &sc->sc_ic; in bwn_intr_beacon()
5254 if (ic->ic_opmode == IEEE80211_M_HOSTAP || in bwn_intr_beacon()
5255 ic->ic_opmode == IEEE80211_M_MBSS) in bwn_intr_beacon()
5258 mac->mac_intr_mask &= ~BWN_INTR_BEACON; in bwn_intr_beacon()
5266 mac->mac_intr_mask |= BWN_INTR_BEACON; in bwn_intr_beacon()
5270 if (sc->sc_flags & BWN_FLAG_NEED_BEACON_TP) { in bwn_intr_beacon()
5271 sc->sc_flags &= ~BWN_FLAG_NEED_BEACON_TP; in bwn_intr_beacon()
5308 struct bwn_phy_g *pg = &mac->mac_phy.phy_g; in bwn_intr_noise()
5314 if (mac->mac_phy.type != BWN_PHYTYPE_G) in bwn_intr_noise()
5317 KASSERT(mac->mac_noise.noi_running, ("%s: fail", __func__)); in bwn_intr_noise()
5323 KASSERT(mac->mac_noise.noi_nsamples < 8, in bwn_intr_noise()
5325 i = mac->mac_noise.noi_nsamples; in bwn_intr_noise()
5326 noise[0] = MIN(MAX(noise[0], 0), N(pg->pg_nrssi_lt) - 1); in bwn_intr_noise()
5327 noise[1] = MIN(MAX(noise[1], 0), N(pg->pg_nrssi_lt) - 1); in bwn_intr_noise()
5328 noise[2] = MIN(MAX(noise[2], 0), N(pg->pg_nrssi_lt) - 1); in bwn_intr_noise()
5329 noise[3] = MIN(MAX(noise[3], 0), N(pg->pg_nrssi_lt) - 1); in bwn_intr_noise()
5330 mac->mac_noise.noi_samples[i][0] = pg->pg_nrssi_lt[noise[0]]; in bwn_intr_noise()
5331 mac->mac_noise.noi_samples[i][1] = pg->pg_nrssi_lt[noise[1]]; in bwn_intr_noise()
5332 mac->mac_noise.noi_samples[i][2] = pg->pg_nrssi_lt[noise[2]]; in bwn_intr_noise()
5333 mac->mac_noise.noi_samples[i][3] = pg->pg_nrssi_lt[noise[3]]; in bwn_intr_noise()
5334 mac->mac_noise.noi_nsamples++; in bwn_intr_noise()
5335 if (mac->mac_noise.noi_nsamples == 8) { in bwn_intr_noise()
5339 average += mac->mac_noise.noi_samples[i][j]; in bwn_intr_noise()
5346 average -= 25; in bwn_intr_noise()
5347 average -= (tmp == 8) ? 72 : 48; in bwn_intr_noise()
5349 mac->mac_stats.link_noise = average; in bwn_intr_noise()
5350 mac->mac_noise.noi_running = 0; in bwn_intr_noise()
5360 struct bwn_mac *mac = prq->prq_mac; in bwn_pio_rx()
5361 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_rx()
5366 if (mac->mac_status < BWN_MAC_STATUS_STARTED) in bwn_pio_rx()
5374 device_printf(sc->sc_dev, "too many RX frames in PIO mode\n"); in bwn_pio_rx()
5383 KASSERT(!dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_rx()
5384 curslot = dr->get_curslot(dr); in bwn_dma_rx()
5385 KASSERT(curslot >= 0 && curslot < dr->dr_numslots, in bwn_dma_rx()
5388 slot = dr->dr_curslot; in bwn_dma_rx()
5392 bus_dmamap_sync(dr->dr_ring_dtag, dr->dr_ring_dmap, in bwn_dma_rx()
5395 dr->set_curslot(dr, slot); in bwn_dma_rx()
5396 dr->dr_curslot = slot; in bwn_dma_rx()
5406 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_intr_txeof()
5414 DPRINTF(mac->mac_sc, BWN_DEBUG_XMIT, in bwn_intr_txeof()
5432 DPRINTF(mac->mac_sc, BWN_DEBUG_XMIT, in bwn_intr_txeof()
5455 struct bwn_softc *sc = mac->mac_sc; in bwn_hwreset()
5461 prev_status = mac->mac_status; in bwn_hwreset()
5476 device_printf(sc->sc_dev, "%s: failed (%d)\n", __func__, error); in bwn_hwreset()
5477 sc->sc_curmac = NULL; in bwn_hwreset()
5485 struct bwn_softc *sc = mac->mac_sc; in bwn_handle_fwpanic()
5489 device_printf(sc->sc_dev,"fw panic (%u)\n", reason); in bwn_handle_fwpanic()
5535 BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); in bwn_dma_freeslot()
5537 return (dr->dr_numslots - dr->dr_usedslot); in bwn_dma_freeslot()
5543 BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); in bwn_dma_nextslot()
5545 KASSERT(slot >= -1 && slot <= dr->dr_numslots - 1, in bwn_dma_nextslot()
5547 if (slot == dr->dr_numslots - 1) in bwn_dma_nextslot()
5555 struct bwn_mac *mac = dr->dr_mac; in bwn_dma_rxeof()
5556 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_rxeof()
5557 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_rxeof()
5567 dr->getdesc(dr, *slot, &desc, &meta); in bwn_dma_rxeof()
5569 bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, BUS_DMASYNC_POSTREAD); in bwn_dma_rxeof()
5570 m = meta->mt_m; in bwn_dma_rxeof()
5573 counter_u64_add(sc->sc_ic.ic_ierrors, 1); in bwn_dma_rxeof()
5578 len = le16toh(rxhdr->frame_len); in bwn_dma_rxeof()
5580 counter_u64_add(sc->sc_ic.ic_ierrors, 1); in bwn_dma_rxeof()
5584 device_printf(sc->sc_dev, "redzone error.\n"); in bwn_dma_rxeof()
5586 bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, in bwn_dma_rxeof()
5590 if (len > dr->dr_rx_bufsize) { in bwn_dma_rxeof()
5593 dr->getdesc(dr, *slot, &desc, &meta); in bwn_dma_rxeof()
5594 bwn_dma_set_redzone(dr, meta->mt_m); in bwn_dma_rxeof()
5595 bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, in bwn_dma_rxeof()
5599 tmp -= dr->dr_rx_bufsize; in bwn_dma_rxeof()
5603 device_printf(sc->sc_dev, "too small buffer " in bwn_dma_rxeof()
5605 len, dr->dr_rx_bufsize, cnt); in bwn_dma_rxeof()
5609 switch (mac->mac_fw.fw_hdr_format) { in bwn_dma_rxeof()
5612 macstat = le32toh(rxhdr->ps4.r351.mac_status); in bwn_dma_rxeof()
5615 macstat = le32toh(rxhdr->ps4.r598.mac_status); in bwn_dma_rxeof()
5620 if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADFCS)) { in bwn_dma_rxeof()
5621 device_printf(sc->sc_dev, "RX drop\n"); in bwn_dma_rxeof()
5626 m->m_len = m->m_pkthdr.len = len + dr->dr_frameoffset; in bwn_dma_rxeof()
5627 m_adj(m, dr->dr_frameoffset); in bwn_dma_rxeof()
5629 bwn_rxeof(dr->dr_mac, m, rxhdr); in bwn_dma_rxeof()
5635 struct bwn_softc *sc = mac->mac_sc; in bwn_handle_txeof()
5636 struct bwn_stats *stats = &mac->mac_stats; in bwn_handle_txeof()
5638 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_handle_txeof()
5640 if (status->im) in bwn_handle_txeof()
5641 device_printf(sc->sc_dev, "TODO: STATUS IM\n"); in bwn_handle_txeof()
5642 if (status->ampdu) in bwn_handle_txeof()
5643 device_printf(sc->sc_dev, "TODO: STATUS AMPDU\n"); in bwn_handle_txeof()
5644 if (status->rtscnt) { in bwn_handle_txeof()
5645 if (status->rtscnt == 0xf) in bwn_handle_txeof()
5646 stats->rtsfail++; in bwn_handle_txeof()
5648 stats->rts++; in bwn_handle_txeof()
5651 if (mac->mac_flags & BWN_MAC_FLAG_DMA) { in bwn_handle_txeof()
5663 struct bwn_mac *mac = prq->prq_mac; in bwn_pio_rxeof()
5664 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_rxeof()
5675 if (prq->prq_rev >= 8) { in bwn_pio_rxeof()
5700 device_printf(sc->sc_dev, "%s: timed out\n", __func__); in bwn_pio_rxeof()
5703 if (prq->prq_rev >= 8) { in bwn_pio_rxeof()
5704 bus_read_multi_4(sc->sc_mem_res, in bwn_pio_rxeof()
5705 prq->prq_base + BWN_PIO8_RXDATA, (void *)&rxhdr, in bwn_pio_rxeof()
5708 bus_read_multi_2(sc->sc_mem_res, in bwn_pio_rxeof()
5709 prq->prq_base + BWN_PIO_RXDATA, (void *)&rxhdr, in bwn_pio_rxeof()
5714 device_printf(sc->sc_dev, "%s: len is too big\n", __func__); in bwn_pio_rxeof()
5718 device_printf(sc->sc_dev, "%s: len is 0\n", __func__); in bwn_pio_rxeof()
5722 switch (mac->mac_fw.fw_hdr_format) { in bwn_pio_rxeof()
5733 if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADFCS)) { in bwn_pio_rxeof()
5734 device_printf(sc->sc_dev, "%s: FCS error", __func__); in bwn_pio_rxeof()
5744 device_printf(sc->sc_dev, "%s: out of memory", __func__); in bwn_pio_rxeof()
5748 if (prq->prq_rev >= 8) { in bwn_pio_rxeof()
5749 bus_read_multi_4(sc->sc_mem_res, in bwn_pio_rxeof()
5750 prq->prq_base + BWN_PIO8_RXDATA, (void *)mp, (totlen & ~3)); in bwn_pio_rxeof()
5753 data = &(mp[totlen - 1]); in bwn_pio_rxeof()
5757 data--; in bwn_pio_rxeof()
5760 data--; in bwn_pio_rxeof()
5766 bus_read_multi_2(sc->sc_mem_res, in bwn_pio_rxeof()
5767 prq->prq_base + BWN_PIO_RXDATA, (void *)mp, (totlen & ~1)); in bwn_pio_rxeof()
5770 mp[totlen - 1] = v16; in bwn_pio_rxeof()
5774 m->m_len = m->m_pkthdr.len = totlen; in bwn_pio_rxeof()
5776 bwn_rxeof(prq->prq_mac, m, &rxhdr); in bwn_pio_rxeof()
5780 if (prq->prq_rev >= 8) in bwn_pio_rxeof()
5792 struct bwn_mac *mac = dr->dr_mac; in bwn_dma_newbuf()
5793 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_newbuf()
5806 * - Clear RX buffer's header. in bwn_dma_newbuf()
5807 * - Restore RX descriptor settings. in bwn_dma_newbuf()
5814 m->m_len = m->m_pkthdr.len = MCLBYTES; in bwn_dma_newbuf()
5821 error = bus_dmamap_load_mbuf(dma->rxbuf_dtag, dr->dr_spare_dmap, m, in bwn_dma_newbuf()
5836 bus_dmamap_unload(dma->rxbuf_dtag, meta->mt_dmap); in bwn_dma_newbuf()
5837 meta->mt_m = m; in bwn_dma_newbuf()
5838 meta->mt_paddr = paddr; in bwn_dma_newbuf()
5841 * Swap RX buf's DMA map with the loaded temporary one in bwn_dma_newbuf()
5843 map = meta->mt_dmap; in bwn_dma_newbuf()
5844 meta->mt_dmap = dr->dr_spare_dmap; in bwn_dma_newbuf()
5845 dr->dr_spare_dmap = map; in bwn_dma_newbuf()
5851 hdr = mtod(meta->mt_m, struct bwn_rxhdr4 *); in bwn_dma_newbuf()
5853 bus_dmamap_sync(dma->rxbuf_dtag, meta->mt_dmap, in bwn_dma_newbuf()
5859 dr->setdesc(dr, desc, meta->mt_paddr, meta->mt_m->m_len - in bwn_dma_newbuf()
5871 *((bus_addr_t *)arg) = seg->ds_addr; in bwn_dma_buf_addr()
5919 struct bwn_phy *phy = &mac->mac_phy; in bwn_rx_rssi_calc()
5920 struct bwn_phy_g *gphy = &phy->phy_g; in bwn_rx_rssi_calc()
5923 switch (phy->rf_ver) { in bwn_rx_rssi_calc()
5928 tmp -= 256; in bwn_rx_rssi_calc()
5933 tmp -= 3; in bwn_rx_rssi_calc()
5935 if (mac->mac_sc->sc_board_info.board_flags in bwn_rx_rssi_calc()
5939 tmp = gphy->pg_nrssi_lt[in_rssi]; in bwn_rx_rssi_calc()
5940 tmp = (31 - tmp) * -131 / 128 - 57; in bwn_rx_rssi_calc()
5943 tmp = (31 - tmp) * -149 / 128 - 68; in bwn_rx_rssi_calc()
5945 if (phy->type == BWN_PHYTYPE_G && adjust_2050) in bwn_rx_rssi_calc()
5951 tmp = in_rssi - 256; in bwn_rx_rssi_calc()
5957 tmp = (tmp - 11) * 103 / 64; in bwn_rx_rssi_calc()
5959 tmp -= 109; in bwn_rx_rssi_calc()
5961 tmp -= 83; in bwn_rx_rssi_calc()
5972 struct bwn_softc *sc = mac->mac_sc; in bwn_rxeof()
5975 struct ieee80211com *ic = &sc->sc_ic; in bwn_rxeof()
5983 phystat0 = le16toh(rxhdr->phy_status0); in bwn_rxeof()
5986 * XXX Note: phy_status3 doesn't exist for HT-PHY; it's only in bwn_rxeof()
5987 * used for LP-PHY. in bwn_rxeof()
5989 phystat3 = le16toh(rxhdr->ps3.lp.phy_status3); in bwn_rxeof()
5991 switch (mac->mac_fw.fw_hdr_format) { in bwn_rxeof()
5994 macstat = le32toh(rxhdr->ps4.r351.mac_status); in bwn_rxeof()
5995 chanstat = le16toh(rxhdr->ps4.r351.channel); in bwn_rxeof()
5998 macstat = le32toh(rxhdr->ps4.r598.mac_status); in bwn_rxeof()
5999 chanstat = le16toh(rxhdr->ps4.r598.channel); in bwn_rxeof()
6006 device_printf(sc->sc_dev, "TODO RX: RX_FLAG_FAILED_FCS_CRC\n"); in bwn_rxeof()
6008 device_printf(sc->sc_dev, "TODO RX: RX_FLAG_FAILED_PLCP_CRC\n"); in bwn_rxeof()
6013 if (m->m_pkthdr.len < (sizeof(struct bwn_plcp6) + padding)) { in bwn_rxeof()
6014 device_printf(sc->sc_dev, "frame too short (length=%d)\n", in bwn_rxeof()
6015 m->m_pkthdr.len); in bwn_rxeof()
6020 if (m->m_pkthdr.len < IEEE80211_MIN_LEN) { in bwn_rxeof()
6021 device_printf(sc->sc_dev, "frame too short (length=%d)\n", in bwn_rxeof()
6022 m->m_pkthdr.len); in bwn_rxeof()
6039 if (rate == -1) { in bwn_rxeof()
6040 if (!(mac->mac_sc->sc_filters & BWN_MACCTL_PASS_BADPLCP)) in bwn_rxeof()
6043 sc->sc_rx_rate = bwn_hwrate2ieeerate(rate); in bwn_rxeof()
6051 rssi = bwn_rx_rssi_calc(mac, rxhdr->phy.abg.rssi, in bwn_rxeof()
6058 if (rxhdr->phy.n.power0 == 16 || rxhdr->phy.n.power0 == 32) in bwn_rxeof()
6059 rssi = max(rxhdr->phy.n.power1, rxhdr->ps2.n.power2); in bwn_rxeof()
6061 rssi = max(rxhdr->phy.n.power0, rxhdr->phy.n.power1); in bwn_rxeof()
6063 DPRINTF(mac->mac_sc, BWN_DEBUG_RECV, in bwn_rxeof()
6066 rxhdr->phy.n.power0, in bwn_rxeof()
6067 rxhdr->phy.n.power1, in bwn_rxeof()
6068 rxhdr->ps2.n.power2); in bwn_rxeof()
6079 noise = mac->mac_stats.link_noise; in bwn_rxeof()
6080 rssi = rssi - noise; in bwn_rxeof()
6085 m_adj(m, -IEEE80211_CRC_LEN); in bwn_rxeof()
6099 device_printf(sc->sc_dev, "%s: dropped\n", __func__); in bwn_rxeof()
6116 if (status->ack) { in bwn_ratectl_tx_complete()
6118 retrycnt = status->framecnt - 1; in bwn_ratectl_tx_complete()
6121 retrycnt = status->framecnt; in bwn_ratectl_tx_complete()
6133 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_handle_txeof()
6137 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_handle_txeof()
6142 dr = bwn_dma_parse_cookie(mac, status, status->cookie, &slot); in bwn_dma_handle_txeof()
6144 device_printf(sc->sc_dev, "failed to parse cookie\n"); in bwn_dma_handle_txeof()
6147 KASSERT(dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_handle_txeof()
6150 KASSERT(slot >= 0 && slot < dr->dr_numslots, in bwn_dma_handle_txeof()
6152 dr->getdesc(dr, slot, &desc, &meta); in bwn_dma_handle_txeof()
6154 if (meta->mt_txtype == BWN_DMADESC_METATYPE_HEADER) in bwn_dma_handle_txeof()
6155 bus_dmamap_unload(dr->dr_txring_dtag, meta->mt_dmap); in bwn_dma_handle_txeof()
6156 else if (meta->mt_txtype == BWN_DMADESC_METATYPE_BODY) in bwn_dma_handle_txeof()
6157 bus_dmamap_unload(dma->txbuf_dtag, meta->mt_dmap); in bwn_dma_handle_txeof()
6159 if (meta->mt_islast) { in bwn_dma_handle_txeof()
6160 KASSERT(meta->mt_m != NULL, in bwn_dma_handle_txeof()
6163 bwn_ratectl_tx_complete(meta->mt_ni, status); in bwn_dma_handle_txeof()
6164 ieee80211_tx_complete(meta->mt_ni, meta->mt_m, 0); in bwn_dma_handle_txeof()
6165 meta->mt_ni = NULL; in bwn_dma_handle_txeof()
6166 meta->mt_m = NULL; in bwn_dma_handle_txeof()
6168 KASSERT(meta->mt_m == NULL, in bwn_dma_handle_txeof()
6171 dr->dr_usedslot--; in bwn_dma_handle_txeof()
6172 if (meta->mt_islast) in bwn_dma_handle_txeof()
6176 sc->sc_watchdog_timer = 0; in bwn_dma_handle_txeof()
6177 if (dr->dr_stop) { in bwn_dma_handle_txeof()
6180 dr->dr_stop = 0; in bwn_dma_handle_txeof()
6190 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_handle_txeof()
6194 tq = bwn_pio_parse_cookie(mac, status->cookie, &tp); in bwn_pio_handle_txeof()
6198 tq->tq_used -= roundup(tp->tp_m->m_pkthdr.len + BWN_HDRSIZE(mac), 4); in bwn_pio_handle_txeof()
6199 tq->tq_free++; in bwn_pio_handle_txeof()
6201 if (tp->tp_ni != NULL) { in bwn_pio_handle_txeof()
6206 bwn_ratectl_tx_complete(tp->tp_ni, status); in bwn_pio_handle_txeof()
6208 ieee80211_tx_complete(tp->tp_ni, tp->tp_m, 0); in bwn_pio_handle_txeof()
6209 tp->tp_ni = NULL; in bwn_pio_handle_txeof()
6210 tp->tp_m = NULL; in bwn_pio_handle_txeof()
6211 TAILQ_INSERT_TAIL(&tq->tq_pktlist, tp, tp_list); in bwn_pio_handle_txeof()
6213 sc->sc_watchdog_timer = 0; in bwn_pio_handle_txeof()
6219 struct bwn_softc *sc = mac->mac_sc; in bwn_phy_txpower_check()
6220 struct bwn_phy *phy = &mac->mac_phy; in bwn_phy_txpower_check()
6221 struct ieee80211com *ic = &sc->sc_ic; in bwn_phy_txpower_check()
6227 if (!(flags & BWN_TXPWR_IGNORE_TIME) && ieee80211_time_before(now, phy->nexttime)) in bwn_phy_txpower_check()
6229 phy->nexttime = now + 2 * 1000; in bwn_phy_txpower_check()
6231 if (sc->sc_board_info.board_vendor == PCI_VENDOR_BROADCOM && in bwn_phy_txpower_check()
6232 sc->sc_board_info.board_type == BHND_BOARD_BU4306) in bwn_phy_txpower_check()
6235 if (phy->recalc_txpwr != NULL) { in bwn_phy_txpower_check()
6236 result = phy->recalc_txpwr(mac, in bwn_phy_txpower_check()
6242 KASSERT(phy->set_txpwr != NULL, ("%s: fail", __func__)); in bwn_phy_txpower_check()
6244 ieee80211_runtask(ic, &mac->mac_txpower); in bwn_phy_txpower_check()
6252 return (BWN_READ_2(prq->prq_mac, prq->prq_base + offset)); in bwn_pio_rx_read_2()
6259 return (BWN_READ_4(prq->prq_mac, prq->prq_base + offset)); in bwn_pio_rx_read_4()
6266 BWN_WRITE_2(prq->prq_mac, prq->prq_base + offset, value); in bwn_pio_rx_write_2()
6273 BWN_WRITE_4(prq->prq_mac, prq->prq_base + offset, value); in bwn_pio_rx_write_4()
6281 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ in bwn_ieeerate2hwrate()
6298 /* CCK rates (NB: not IEEE std, device-specific) */ in bwn_ieeerate2hwrate()
6309 device_printf(sc->sc_dev, "unsupported rate %d\n", rate); in bwn_ieeerate2hwrate()
6316 struct bwn_phy *phy = &mac->mac_phy; in bwn_set_txhdr_phyctl1()
6320 /* XXX TODO: this is for LP phy, what about N-PHY, etc? */ in bwn_set_txhdr_phyctl1()
6323 if (BWN_ISCCKRATE(bitrate) && phy->type != BWN_PHYTYPE_LP) { in bwn_set_txhdr_phyctl1()
6328 /* XXX TODO: table-ize, for MCS transmit */ in bwn_set_txhdr_phyctl1()
6388 const struct bwn_phy *phy = &mac->mac_phy; in bwn_set_txhdr()
6389 struct bwn_softc *sc = mac->mac_sc; in bwn_set_txhdr()
6392 const struct ieee80211_txparam *tp = ni->ni_txparms; in bwn_set_txhdr()
6393 struct ieee80211vap *vap = ni->ni_vap; in bwn_set_txhdr()
6394 struct ieee80211com *ic = &sc->sc_ic; in bwn_set_txhdr()
6407 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in bwn_set_txhdr()
6408 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in bwn_set_txhdr()
6409 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0; in bwn_set_txhdr()
6411 if ((phy->type == BWN_PHYTYPE_N) || (phy->type == BWN_PHYTYPE_LP) in bwn_set_txhdr()
6412 || (phy->type == BWN_PHYTYPE_HT)) in bwn_set_txhdr()
6418 if (type != IEEE80211_FC0_TYPE_DATA || (m->m_flags & M_EAPOL)) in bwn_set_txhdr()
6419 rate = rate_fb = tp->mgmtrate; in bwn_set_txhdr()
6421 rate = rate_fb = tp->mcastrate; in bwn_set_txhdr()
6422 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) in bwn_set_txhdr()
6423 rate = rate_fb = tp->ucastrate; in bwn_set_txhdr()
6431 sc->sc_tx_rate = rate; in bwn_set_txhdr()
6437 txhdr->phyrate = (BWN_ISOFDMRATE(rate)) ? bwn_plcp_getofdm(rate) : in bwn_set_txhdr()
6439 bcopy(wh->i_fc, txhdr->macfc, sizeof(txhdr->macfc)); in bwn_set_txhdr()
6440 bcopy(wh->i_addr1, txhdr->addr1, IEEE80211_ADDR_LEN); in bwn_set_txhdr()
6444 (*(u_int16_t *)wh->i_dur & htole16(0x8000)) || in bwn_set_txhdr()
6445 (*(u_int16_t *)wh->i_dur == htole16(0))) in bwn_set_txhdr()
6446 txhdr->dur_fb = *(u_int16_t *)wh->i_dur; in bwn_set_txhdr()
6448 txhdr->dur_fb = ieee80211_compute_duration(ic->ic_rt, in bwn_set_txhdr()
6449 m->m_pkthdr.len, rate, isshort); in bwn_set_txhdr()
6453 switch (mac->mac_fw.fw_hdr_format) { in bwn_set_txhdr()
6455 bwn_plcp_genhdr((struct bwn_plcp4 *)(&txhdr->body.r351.plcp), in bwn_set_txhdr()
6456 m->m_pkthdr.len + IEEE80211_CRC_LEN, rate); in bwn_set_txhdr()
6459 bwn_plcp_genhdr((struct bwn_plcp4 *)(&txhdr->body.r410.plcp), in bwn_set_txhdr()
6460 m->m_pkthdr.len + IEEE80211_CRC_LEN, rate); in bwn_set_txhdr()
6463 bwn_plcp_genhdr((struct bwn_plcp4 *)(&txhdr->body.r598.plcp), in bwn_set_txhdr()
6464 m->m_pkthdr.len + IEEE80211_CRC_LEN, rate); in bwn_set_txhdr()
6468 bwn_plcp_genhdr((struct bwn_plcp4 *)(&txhdr->plcp_fb), in bwn_set_txhdr()
6469 m->m_pkthdr.len + IEEE80211_CRC_LEN, rate_fb); in bwn_set_txhdr()
6471 txhdr->eftypes |= (BWN_ISOFDMRATE(rate_fb)) ? BWN_TX_EFT_FB_OFDM : in bwn_set_txhdr()
6473 txhdr->chan = phy->chan; in bwn_set_txhdr()
6481 if (! phy->gmode) in bwn_set_txhdr()
6510 if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && in bwn_set_txhdr()
6511 m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) in bwn_set_txhdr()
6514 if ((ic->ic_flags & IEEE80211_F_USEPROT) && in bwn_set_txhdr()
6515 ic->ic_protmode != IEEE80211_PROT_NONE) { in bwn_set_txhdr()
6517 if (phy->gmode) in bwn_set_txhdr()
6524 mprot = ieee80211_alloc_prot(ni, m, rate, ic->ic_protmode); in bwn_set_txhdr()
6526 if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS, 1); in bwn_set_txhdr()
6527 device_printf(sc->sc_dev, in bwn_set_txhdr()
6529 ic->ic_protmode); in bwn_set_txhdr()
6533 switch (mac->mac_fw.fw_hdr_format) { in bwn_set_txhdr()
6535 prot_ptr = txhdr->body.r351.rts_frame; in bwn_set_txhdr()
6538 prot_ptr = txhdr->body.r410.rts_frame; in bwn_set_txhdr()
6541 prot_ptr = txhdr->body.r598.rts_frame; in bwn_set_txhdr()
6545 bcopy(mtod(mprot, uint8_t *), prot_ptr, mprot->m_pkthdr.len); in bwn_set_txhdr()
6548 if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) { in bwn_set_txhdr()
6557 switch (mac->mac_fw.fw_hdr_format) { in bwn_set_txhdr()
6560 &txhdr->body.r351.rts_plcp, len, rts_rate); in bwn_set_txhdr()
6564 &txhdr->body.r410.rts_plcp, len, rts_rate); in bwn_set_txhdr()
6568 &txhdr->body.r598.rts_plcp, len, rts_rate); in bwn_set_txhdr()
6572 bwn_plcp_genhdr((struct bwn_plcp4 *)&txhdr->rts_plcp_fb, len, in bwn_set_txhdr()
6575 switch (mac->mac_fw.fw_hdr_format) { in bwn_set_txhdr()
6578 &txhdr->body.r351.rts_frame; in bwn_set_txhdr()
6582 &txhdr->body.r410.rts_frame; in bwn_set_txhdr()
6586 &txhdr->body.r598.rts_frame; in bwn_set_txhdr()
6590 txhdr->rts_dur_fb = *(u_int16_t *)protwh->i_dur; in bwn_set_txhdr()
6593 txhdr->eftypes |= BWN_TX_EFT_RTS_OFDM; in bwn_set_txhdr()
6594 txhdr->phyrate_rts = bwn_plcp_getofdm(rts_rate); in bwn_set_txhdr()
6596 txhdr->eftypes |= BWN_TX_EFT_RTS_CCK; in bwn_set_txhdr()
6597 txhdr->phyrate_rts = bwn_plcp_getcck(rts_rate); in bwn_set_txhdr()
6599 txhdr->eftypes |= (BWN_ISOFDMRATE(rts_rate_fb)) ? in bwn_set_txhdr()
6603 txhdr->phyctl_1rts = htole16(bwn_set_txhdr_phyctl1(mac, rts_rate)); in bwn_set_txhdr()
6604 txhdr->phyctl_1rtsfb = htole16(bwn_set_txhdr_phyctl1(mac, rts_rate_fb)); in bwn_set_txhdr()
6609 txhdr->phyctl_1 = htole16(bwn_set_txhdr_phyctl1(mac, rate)); in bwn_set_txhdr()
6610 txhdr->phyctl_1fb = htole16(bwn_set_txhdr_phyctl1(mac, rate_fb)); in bwn_set_txhdr()
6613 switch (mac->mac_fw.fw_hdr_format) { in bwn_set_txhdr()
6615 txhdr->body.r351.cookie = htole16(cookie); in bwn_set_txhdr()
6618 txhdr->body.r410.cookie = htole16(cookie); in bwn_set_txhdr()
6621 txhdr->body.r598.cookie = htole16(cookie); in bwn_set_txhdr()
6625 txhdr->macctl = htole32(macctl); in bwn_set_txhdr()
6626 txhdr->phyctl = htole16(phyctl); in bwn_set_txhdr()
6632 sc->sc_tx_th.wt_flags = 0; in bwn_set_txhdr()
6633 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwn_set_txhdr()
6634 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; in bwn_set_txhdr()
6638 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwn_set_txhdr()
6639 sc->sc_tx_th.wt_rate = rate; in bwn_set_txhdr()
6652 uint8_t *raw = plcp->o.raw; in bwn_plcp_genhdr()
6659 plcp->o.data = htole32(d); in bwn_plcp_genhdr()
6671 plcp->o.data |= htole32(plen << 16); in bwn_plcp_genhdr()
6679 struct bwn_softc *sc = mac->mac_sc; in bwn_antenna_sanitize()
6684 if (mac->mac_phy.gmode) in bwn_antenna_sanitize()
6685 mask = sc->sc_ant2g; in bwn_antenna_sanitize()
6687 mask = sc->sc_ant5g; in bwn_antenna_sanitize()
6688 if (!(mask & (1 << (n - 1)))) in bwn_antenna_sanitize()
6738 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_write_multi_4()
6746 bus_write_multi_4(sc->sc_mem_res, tq->tq_base + BWN_PIO8_TXDATA, in bwn_pio_write_multi_4()
6751 data = &(data[len - 1]); in bwn_pio_write_multi_4()
6756 data--; in bwn_pio_write_multi_4()
6760 data--; in bwn_pio_write_multi_4()
6776 BWN_WRITE_4(mac, tq->tq_base + offset, value); in bwn_pio_write_4()
6783 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_write_multi_2()
6789 bus_write_multi_2(sc->sc_mem_res, tq->tq_base + BWN_PIO_TXDATA, in bwn_pio_write_multi_2()
6794 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data[len - 1]); in bwn_pio_write_multi_2()
6812 for (; m != NULL; m = m->m_next) { in bwn_pio_write_mbuf_2()
6814 for (i = 0; i < m->m_len; i++) { in bwn_pio_write_mbuf_2()
6824 if (m0->m_pkthdr.len % 2) { in bwn_pio_write_mbuf_2()
6838 if (mac->mac_phy.type != BWN_PHYTYPE_G) in bwn_set_slot_time()
6852 if ((mac->mac_flags & BWN_MAC_FLAG_WME) == 0) in bwn_dma_select()
6853 return (mac->mac_method.dma.wme[WME_AC_BE]); in bwn_dma_select()
6857 return (mac->mac_method.dma.wme[WME_AC_VO]); in bwn_dma_select()
6859 return (mac->mac_method.dma.wme[WME_AC_VI]); in bwn_dma_select()
6861 return (mac->mac_method.dma.wme[WME_AC_BE]); in bwn_dma_select()
6863 return (mac->mac_method.dma.wme[WME_AC_BK]); in bwn_dma_select()
6874 BWN_ASSERT_LOCKED(dr->dr_mac->mac_sc); in bwn_dma_getslot()
6876 KASSERT(dr->dr_tx, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_getslot()
6877 KASSERT(!(dr->dr_stop), ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_getslot()
6880 slot = bwn_dma_nextslot(dr, dr->dr_curslot); in bwn_dma_getslot()
6882 dr->dr_curslot = slot; in bwn_dma_getslot()
6883 dr->dr_usedslot++; in bwn_dma_getslot()
6892 struct bwn_pio *pio = &mac->mac_method.pio; in bwn_pio_parse_cookie()
6898 tq = &pio->wme[WME_AC_BK]; in bwn_pio_parse_cookie()
6901 tq = &pio->wme[WME_AC_BE]; in bwn_pio_parse_cookie()
6904 tq = &pio->wme[WME_AC_VI]; in bwn_pio_parse_cookie()
6907 tq = &pio->wme[WME_AC_VO]; in bwn_pio_parse_cookie()
6910 tq = &pio->mcast; in bwn_pio_parse_cookie()
6917 KASSERT(index < N(tq->tq_pkts), ("%s:%d: fail", __func__, __LINE__)); in bwn_pio_parse_cookie()
6918 if (index >= N(tq->tq_pkts)) in bwn_pio_parse_cookie()
6920 *pack = &tq->tq_pkts[index]; in bwn_pio_parse_cookie()
6934 sc = mac->mac_sc; in bwn_txpwr()
6937 if (mac->mac_status >= BWN_MAC_STATUS_STARTED && in bwn_txpwr()
6938 mac->mac_phy.set_txpwr != NULL) in bwn_txpwr()
6939 mac->mac_phy.set_txpwr(mac); in bwn_txpwr()
6948 if (mac->mac_fw.opensource) { in bwn_task_15s()
6956 if (mac->mac_phy.task_15s) in bwn_task_15s()
6957 mac->mac_phy.task_15s(mac); in bwn_task_15s()
6959 mac->mac_phy.txerrors = BWN_TXERROR_MAX; in bwn_task_15s()
6966 if (mac->mac_phy.type != BWN_PHYTYPE_G || mac->mac_noise.noi_running) in bwn_task_30s()
6968 mac->mac_noise.noi_running = 1; in bwn_task_30s()
6969 mac->mac_noise.noi_nsamples = 0; in bwn_task_30s()
6978 if (mac->mac_phy.task_60s) in bwn_task_60s()
6979 mac->mac_phy.task_60s(mac); in bwn_task_60s()
6987 struct bwn_softc *sc = mac->mac_sc; in bwn_tasks()
6990 if (mac->mac_status != BWN_MAC_STATUS_STARTED) in bwn_tasks()
6993 if (mac->mac_task_state % 4 == 0) in bwn_tasks()
6995 if (mac->mac_task_state % 2 == 0) in bwn_tasks()
6999 mac->mac_task_state++; in bwn_tasks()
7000 callout_reset(&sc->sc_task_ch, hz * 15, bwn_tasks, mac); in bwn_tasks()
7006 struct bwn_softc *sc = mac->mac_sc; in bwn_plcp_get_ofdmrate()
7010 switch (plcp->o.raw[0] & 0xf) { in bwn_plcp_get_ofdmrate()
7028 device_printf(sc->sc_dev, "incorrect OFDM rate %d\n", in bwn_plcp_get_ofdmrate()
7029 plcp->o.raw[0] & 0xf); in bwn_plcp_get_ofdmrate()
7030 return (-1); in bwn_plcp_get_ofdmrate()
7036 struct bwn_softc *sc = mac->mac_sc; in bwn_plcp_get_cckrate()
7038 switch (plcp->o.raw[0]) { in bwn_plcp_get_cckrate()
7048 device_printf(sc->sc_dev, "incorrect CCK rate %d\n", plcp->o.raw[0]); in bwn_plcp_get_cckrate()
7049 return (-1); in bwn_plcp_get_cckrate()
7057 struct bwn_softc *sc = mac->mac_sc; in bwn_rx_radiotap()
7063 if (htole16(rxhdr->phy_status0) & BWN_RX_PHYST0_SHORTPRMBL) in bwn_rx_radiotap()
7064 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwn_rx_radiotap()
7067 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwn_rx_radiotap()
7068 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_WEP; in bwn_rx_radiotap()
7074 switch (mac->mac_fw.fw_hdr_format) { in bwn_rx_radiotap()
7077 mt = le16toh(rxhdr->ps4.r351.mac_time); in bwn_rx_radiotap()
7080 mt = le16toh(rxhdr->ps4.r598.mac_time); in bwn_rx_radiotap()
7086 tsf -= 0x10000; in bwn_rx_radiotap()
7088 sc->sc_rx_th.wr_tsf = tsf; in bwn_rx_radiotap()
7089 sc->sc_rx_th.wr_rate = rate; in bwn_rx_radiotap()
7090 sc->sc_rx_th.wr_antsignal = rssi; in bwn_rx_radiotap()
7091 sc->sc_rx_th.wr_antnoise = noise; in bwn_rx_radiotap()
7099 KASSERT(bhnd_get_hwrev(mac->mac_sc->sc_dev) >= 3, in bwn_tsf_read()
7121 dma = &mac->mac_method.dma; in bwn_dma_attach()
7122 sc = mac->mac_sc; in bwn_dma_attach()
7125 if (sc->sc_quirks & BWN_QUIRK_NODMA) in bwn_dma_attach()
7128 KASSERT(bhnd_get_hwrev(sc->sc_dev) >= 5, ("%s: fail", __func__)); in bwn_dma_attach()
7132 switch (mac->mac_dmatype) { in bwn_dma_attach()
7134 /* 32-bit engine without addrext support */ in bwn_dma_attach()
7138 /* We can address the full 32-bit device address space */ in bwn_dma_attach()
7143 /* 32-bit engine with addrext support */ in bwn_dma_attach()
7150 /* 64-bit engine with addrext support */ in bwn_dma_attach()
7157 device_printf(sc->sc_dev, "unsupported DMA address width: %d\n", in bwn_dma_attach()
7158 mac->mac_dmatype); in bwn_dma_attach()
7162 /* Fetch our device->host DMA translation and tag */ in bwn_dma_attach()
7163 error = bhnd_get_dma_translation(sc->sc_dev, addr_width, 0, &dmat, in bwn_dma_attach()
7166 device_printf(sc->sc_dev, "error fetching DMA translation: " in bwn_dma_attach()
7176 device_printf(sc->sc_dev, "bus addrext mask %#jx incompatible " in bwn_dma_attach()
7189 mac->mac_flags |= BWN_MAC_FLAG_DMA; in bwn_dma_attach()
7191 dma->addrext_shift = addrext_shift; in bwn_dma_attach()
7192 dma->translation = dma_translation; in bwn_dma_attach()
7194 dt = &dma->translation; in bwn_dma_attach()
7197 lowaddr = MIN((dt->addr_mask | dt->addrext_mask), BUS_SPACE_MAXADDR); in bwn_dma_attach()
7212 &dma->parent_dtag); in bwn_dma_attach()
7214 device_printf(sc->sc_dev, "can't create parent DMA tag\n"); in bwn_dma_attach()
7221 error = bus_dma_tag_create(dma->parent_dtag, in bwn_dma_attach()
7232 &dma->rxbuf_dtag); in bwn_dma_attach()
7234 device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); in bwn_dma_attach()
7237 error = bus_dma_tag_create(dma->parent_dtag, in bwn_dma_attach()
7248 &dma->txbuf_dtag); in bwn_dma_attach()
7250 device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); in bwn_dma_attach()
7254 dma->wme[WME_AC_BK] = bwn_dma_ringsetup(mac, 0, 1); in bwn_dma_attach()
7255 if (!dma->wme[WME_AC_BK]) in bwn_dma_attach()
7258 dma->wme[WME_AC_BE] = bwn_dma_ringsetup(mac, 1, 1); in bwn_dma_attach()
7259 if (!dma->wme[WME_AC_BE]) in bwn_dma_attach()
7262 dma->wme[WME_AC_VI] = bwn_dma_ringsetup(mac, 2, 1); in bwn_dma_attach()
7263 if (!dma->wme[WME_AC_VI]) in bwn_dma_attach()
7266 dma->wme[WME_AC_VO] = bwn_dma_ringsetup(mac, 3, 1); in bwn_dma_attach()
7267 if (!dma->wme[WME_AC_VO]) in bwn_dma_attach()
7270 dma->mcast = bwn_dma_ringsetup(mac, 4, 1); in bwn_dma_attach()
7271 if (!dma->mcast) in bwn_dma_attach()
7273 dma->rx = bwn_dma_ringsetup(mac, 0, 0); in bwn_dma_attach()
7274 if (!dma->rx) in bwn_dma_attach()
7279 fail7: bwn_dma_ringfree(&dma->mcast); in bwn_dma_attach()
7280 fail6: bwn_dma_ringfree(&dma->wme[WME_AC_VO]); in bwn_dma_attach()
7281 fail5: bwn_dma_ringfree(&dma->wme[WME_AC_VI]); in bwn_dma_attach()
7282 fail4: bwn_dma_ringfree(&dma->wme[WME_AC_BE]); in bwn_dma_attach()
7283 fail3: bwn_dma_ringfree(&dma->wme[WME_AC_BK]); in bwn_dma_attach()
7284 fail2: bus_dma_tag_destroy(dma->txbuf_dtag); in bwn_dma_attach()
7285 fail1: bus_dma_tag_destroy(dma->rxbuf_dtag); in bwn_dma_attach()
7286 fail0: bus_dma_tag_destroy(dma->parent_dtag); in bwn_dma_attach()
7294 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_parse_cookie()
7296 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_parse_cookie()
7298 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_dma_parse_cookie()
7302 dr = dma->wme[WME_AC_BK]; in bwn_dma_parse_cookie()
7305 dr = dma->wme[WME_AC_BE]; in bwn_dma_parse_cookie()
7308 dr = dma->wme[WME_AC_VI]; in bwn_dma_parse_cookie()
7311 dr = dma->wme[WME_AC_VO]; in bwn_dma_parse_cookie()
7314 dr = dma->mcast; in bwn_dma_parse_cookie()
7322 if (*slot < 0 || *slot >= dr->dr_numslots) { in bwn_dma_parse_cookie()
7328 KASSERT(status->seq == dma->lastseq, in bwn_dma_parse_cookie()
7330 device_printf(sc->sc_dev, in bwn_dma_parse_cookie()
7332 dr->dr_numslots); in bwn_dma_parse_cookie()
7335 dma->lastseq = status->seq; in bwn_dma_parse_cookie()
7344 if ((mac->mac_flags & BWN_MAC_FLAG_DMA) == 0) in bwn_dma_stop()
7346 dma = &mac->mac_method.dma; in bwn_dma_stop()
7348 bwn_dma_ringstop(&dma->rx); in bwn_dma_stop()
7349 bwn_dma_ringstop(&dma->wme[WME_AC_BK]); in bwn_dma_stop()
7350 bwn_dma_ringstop(&dma->wme[WME_AC_BE]); in bwn_dma_stop()
7351 bwn_dma_ringstop(&dma->wme[WME_AC_VI]); in bwn_dma_stop()
7352 bwn_dma_ringstop(&dma->wme[WME_AC_VO]); in bwn_dma_stop()
7353 bwn_dma_ringstop(&dma->mcast); in bwn_dma_stop()
7371 if (mac->mac_flags & BWN_MAC_FLAG_DMA) in bwn_pio_stop()
7373 pio = &mac->mac_method.pio; in bwn_pio_stop()
7375 bwn_destroy_queue_tx(&pio->mcast); in bwn_pio_stop()
7376 bwn_destroy_queue_tx(&pio->wme[WME_AC_VO]); in bwn_pio_stop()
7377 bwn_destroy_queue_tx(&pio->wme[WME_AC_VI]); in bwn_pio_stop()
7378 bwn_destroy_queue_tx(&pio->wme[WME_AC_BE]); in bwn_pio_stop()
7379 bwn_destroy_queue_tx(&pio->wme[WME_AC_BK]); in bwn_pio_stop()
7385 struct bwn_softc *sc = mac->mac_sc; in bwn_led_attach()
7390 sc->sc_led_idle = (2350 * hz) / 1000; in bwn_led_attach()
7391 sc->sc_led_blink = 1; in bwn_led_attach()
7394 if (sc->sc_board_info.board_vendor == in bwn_led_attach()
7410 led = &sc->sc_leds[i]; in bwn_led_attach()
7413 error = bhnd_nvram_getvar_uint8(sc->sc_dev, bwn_led_vars[i], in bwn_led_attach()
7417 device_printf(sc->sc_dev, "NVRAM variable %s " in bwn_led_attach()
7423 led->led_act = led_act[i]; in bwn_led_attach()
7426 led->led_flags |= BWN_LED_F_ACTLOW; in bwn_led_attach()
7427 led->led_act = val & BWN_LED_ACT_MASK; in bwn_led_attach()
7429 led->led_mask = (1 << i); in bwn_led_attach()
7431 if (led->led_act == BWN_LED_ACT_BLINK_SLOW || in bwn_led_attach()
7432 led->led_act == BWN_LED_ACT_BLINK_POLL || in bwn_led_attach()
7433 led->led_act == BWN_LED_ACT_BLINK) { in bwn_led_attach()
7434 led->led_flags |= BWN_LED_F_BLINK; in bwn_led_attach()
7435 if (led->led_act == BWN_LED_ACT_BLINK_POLL) in bwn_led_attach()
7436 led->led_flags |= BWN_LED_F_POLLABLE; in bwn_led_attach()
7437 else if (led->led_act == BWN_LED_ACT_BLINK_SLOW) in bwn_led_attach()
7438 led->led_flags |= BWN_LED_F_SLOW; in bwn_led_attach()
7440 if (sc->sc_blink_led == NULL) { in bwn_led_attach()
7441 sc->sc_blink_led = led; in bwn_led_attach()
7442 if (led->led_flags & BWN_LED_F_SLOW) in bwn_led_attach()
7443 BWN_LED_SLOWDOWN(sc->sc_led_idle); in bwn_led_attach()
7449 led->led_act, led->led_flags & BWN_LED_F_ACTLOW); in bwn_led_attach()
7451 callout_init_mtx(&sc->sc_led_blink_ch, &sc->sc_mtx, 0); in bwn_led_attach()
7460 if (led->led_flags & BWN_LED_F_ACTLOW) in bwn_led_onoff()
7463 val |= led->led_mask; in bwn_led_onoff()
7465 val &= ~led->led_mask; in bwn_led_onoff()
7472 struct bwn_softc *sc = mac->mac_sc; in bwn_led_newstate()
7473 struct ieee80211com *ic = &sc->sc_ic; in bwn_led_newstate()
7478 callout_stop(&sc->sc_led_blink_ch); in bwn_led_newstate()
7479 sc->sc_led_blinking = 0; in bwn_led_newstate()
7482 if ((sc->sc_flags & BWN_FLAG_RUNNING) == 0) in bwn_led_newstate()
7487 struct bwn_led *led = &sc->sc_leds[i]; in bwn_led_newstate()
7490 if (led->led_act == BWN_LED_ACT_UNKN || in bwn_led_newstate()
7491 led->led_act == BWN_LED_ACT_NULL) in bwn_led_newstate()
7494 if ((led->led_flags & BWN_LED_F_BLINK) && in bwn_led_newstate()
7498 switch (led->led_act) { in bwn_led_newstate()
7513 if (led->led_act == BWN_LED_ACT_11G && in bwn_led_newstate()
7514 ic->ic_curmode != IEEE80211_MODE_11G) in bwn_led_newstate()
7518 if (led->led_act == BWN_LED_ACT_ASSOC) in bwn_led_newstate()
7533 struct bwn_softc *sc = mac->mac_sc; in bwn_led_event()
7534 struct bwn_led *led = sc->sc_blink_led; in bwn_led_event()
7538 if ((led->led_flags & BWN_LED_F_POLLABLE) == 0) in bwn_led_event()
7540 if (ticks - sc->sc_led_ticks < sc->sc_led_idle) in bwn_led_event()
7544 sc->sc_led_ticks = ticks; in bwn_led_event()
7545 if (sc->sc_led_blinking) in bwn_led_event()
7550 rate = sc->sc_rx_rate; in bwn_led_event()
7553 rate = sc->sc_tx_rate; in bwn_led_event()
7569 struct bwn_softc *sc = mac->mac_sc; in bwn_led_blink_start()
7570 struct bwn_led *led = sc->sc_blink_led; in bwn_led_blink_start()
7577 if (led->led_flags & BWN_LED_F_SLOW) { in bwn_led_blink_start()
7582 sc->sc_led_blinking = 1; in bwn_led_blink_start()
7583 sc->sc_led_blink_offdur = off_dur; in bwn_led_blink_start()
7585 callout_reset(&sc->sc_led_blink_ch, on_dur, bwn_led_blink_next, mac); in bwn_led_blink_start()
7592 struct bwn_softc *sc = mac->mac_sc; in bwn_led_blink_next()
7596 val = bwn_led_onoff(sc->sc_blink_led, val, 0); in bwn_led_blink_next()
7599 callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, in bwn_led_blink_next()
7607 struct bwn_softc *sc = mac->mac_sc; in bwn_led_blink_end()
7609 sc->sc_led_blinking = 0; in bwn_led_blink_end()
7630 if (sc->sc_ic.ic_nrunning > 0) in bwn_resume()
7634 ieee80211_start_all(&sc->sc_ic); in bwn_resume()
7642 struct bwn_mac *mac = sc->sc_curmac; in bwn_rfswitch()
7645 KASSERT(mac->mac_status >= BWN_MAC_STATUS_STARTED, in bwn_rfswitch()
7646 ("%s: invalid MAC status %d", __func__, mac->mac_status)); in bwn_rfswitch()
7648 if (mac->mac_phy.rev >= 3 || mac->mac_phy.type == BWN_PHYTYPE_LP in bwn_rfswitch()
7649 || mac->mac_phy.type == BWN_PHYTYPE_N) { in bwn_rfswitch()
7659 if (mac->mac_flags & BWN_MAC_FLAG_RADIO_ON) in bwn_rfswitch()
7667 mac->mac_flags |= BWN_MAC_FLAG_RADIO_ON; in bwn_rfswitch()
7669 mac->mac_flags &= ~BWN_MAC_FLAG_RADIO_ON; in bwn_rfswitch()
7671 device_printf(sc->sc_dev, in bwn_rfswitch()
7674 if (cur != mac->mac_phy.rf_on) { in bwn_rfswitch()
7682 callout_schedule(&sc->sc_rfswitch_ch, hz); in bwn_rfswitch()
7688 device_t dev = sc->sc_dev; in bwn_sysctl_node()
7694 if ((mac = sc->sc_curmac) == NULL) in bwn_sysctl_node()
7696 stats = &mac->mac_stats; in bwn_sysctl_node()
7700 "linknoise", CTLFLAG_RW, &stats->rts, 0, "Noise level"); in bwn_sysctl_node()
7703 "rts", CTLFLAG_RW, &stats->rts, 0, "RTS"); in bwn_sysctl_node()
7706 "rtsfail", CTLFLAG_RW, &stats->rtsfail, 0, "RTS failed to send"); in bwn_sysctl_node()
7711 "debug", CTLFLAG_RW, &sc->sc_debug, 0, "Debug flags"); in bwn_sysctl_node()