Lines Matching +full:mac +full:- +full:s

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
537 struct bwn_mac *mac; in bwn_attach() local
544 sc->sc_dev = dev; in bwn_attach()
546 sc->sc_debug = bwn_debug; in bwn_attach()
549 mac = NULL; 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()
615 mac = malloc(sizeof(*mac), M_DEVBUF, M_WAITOK | M_ZERO); 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()
625 error = bwn_attach_core(mac); in bwn_attach()
628 error = bwn_led_attach(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()
660 INTR_TYPE_NET | INTR_MPSAFE, bwn_intr, NULL, mac, 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()
683 free(mac, M_DEVBUF); 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()
759 /* XXX not right but it's not used anywhere important */ 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()
779 /* Determine the NVRAM variable containing our MAC address */ 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()
800 /* Read the MAC address from NVRAM */ 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()
839 bwn_phy_detach(struct bwn_mac *mac) in bwn_phy_detach() argument
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() local
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()
859 bwn_dma_free(mac); 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()
864 bwn_phy_detach(mac); 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()
883 bwn_release_firmware(mac); 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() local
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() local
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()
1038 dr = bwn_dma_select(mac, M_WME_GETAC(m)); in bwn_tx_isfull()
1039 if (dr->dr_stop == 1 || in bwn_tx_isfull()
1041 dr->dr_stop = 1; in bwn_tx_isfull()
1045 tq = bwn_pio_select(mac, M_WME_GETAC(m)); 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() local
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()
1070 bwn_dma_tx_start(mac, ni, &m) : bwn_pio_tx_start(mac, ni, &m); in bwn_tx_start()
1079 bwn_pio_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, in bwn_pio_tx_start() argument
1084 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_tx_start()
1096 tq = bwn_pio_select(mac, M_WME_GETAC(m)); 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()
1102 error = bwn_set_txhdr(mac, ni, m, &txhdr, BWN_PIO_COOKIE(tq, tp)); 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()
1119 "%s: can't defrag TX buffer\n", 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()
1130 ctl32 = bwn_pio_write_multi_4(mac, tq, in bwn_pio_tx_start()
1131 (BWN_PIO_READ_4(mac, tq, BWN_PIO8_TXCTL) | in bwn_pio_tx_start()
1133 (const uint8_t *)&txhdr, BWN_HDRSIZE(mac)); in bwn_pio_tx_start()
1135 ctl32 = bwn_pio_write_multi_4(mac, tq, ctl32, in bwn_pio_tx_start()
1136 mtod(m_new, const void *), m_new->m_pkthdr.len); in bwn_pio_tx_start()
1137 bwn_pio_write_4(mac, tq, BWN_PIO_TXCTL, in bwn_pio_tx_start()
1140 ctl16 = bwn_pio_write_multi_2(mac, tq, in bwn_pio_tx_start()
1141 (bwn_pio_read_2(mac, tq, BWN_PIO_TXCTL) | in bwn_pio_tx_start()
1143 (const uint8_t *)&txhdr, BWN_HDRSIZE(mac)); in bwn_pio_tx_start()
1144 ctl16 = bwn_pio_write_mbuf_2(mac, tq, ctl16, m); in bwn_pio_tx_start()
1145 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, in bwn_pio_tx_start()
1153 bwn_pio_select(struct bwn_mac *mac, uint8_t prio) in bwn_pio_select() argument
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()
1169 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_pio_select()
1174 bwn_dma_tx_start(struct bwn_mac *mac, struct ieee80211_node *ni, in bwn_dma_tx_start() argument
1178 &(txhdr_cache[(slot / BWN_TX_SLOTS_PER_FRAME) * BWN_HDRSIZE(mac)]) in bwn_dma_tx_start()
1179 struct bwn_dma *dma = &mac->mac_method.dma; in bwn_dma_tx_start()
1180 struct bwn_dma_ring *dr = bwn_dma_select(mac, M_WME_GETAC(*mp)); 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()
1197 ("%s:%d: fail", __func__, __LINE__)); 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()
1205 BWN_GET_TXHDRCACHE(slot), BWN_HDRSIZE(mac), bwn_dma_ring_addr, 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()
1238 "%s: can't defrag TX buffer\n", 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()
1250 "%s: can't load TX buffer (2) %d\n", 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()
1284 bwn_attach_core(struct bwn_mac *mac) in bwn_attach_core() argument
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()
1293 if ((error = bwn_core_forceclk(mac, true))) 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()
1325 error = bwn_reset_core(mac, have_bg); in bwn_attach_core()
1333 mac->mac_dmatype = BHND_DMA_ADDR_64BIT; in bwn_attach_core()
1339 BWN_WRITE_4(mac, base + BWN_DMA32_TXCTL, in bwn_attach_core()
1341 tmp = BWN_READ_4(mac, base + BWN_DMA32_TXCTL); 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()
1352 error = bwn_phy_getinfo(mac, have_bg); 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()
1374 KASSERT(0 == 1, ("%s: unknown phy type (%d)", __func__, 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()
1466 error = bwn_reset_core(mac, have_bg); in bwn_attach_core()
1470 error = bwn_chiptest(mac); in bwn_attach_core()
1473 error = bwn_setup_channels(mac, have_bg, have_a); 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()
1482 error = bwn_dma_attach(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()
1492 bwn_release_firmware(mac); in bwn_attach_core()
1500 bwn_reset_core(struct bwn_mac *mac, int g_mode) in bwn_reset_core() argument
1507 sc = mac->mac_sc; in bwn_reset_core()
1509 DPRINTF(sc, BWN_DEBUG_RESET, "%s: g_mode=%d\n", __func__, g_mode); 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()
1553 ctl = BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GMODE; in bwn_reset_core()
1556 BWN_WRITE_4(mac, BWN_MACCTL, ctl | BWN_MACCTL_IHR_ON); in bwn_reset_core()
1562 bwn_phy_getinfo(struct bwn_mac *mac, int gmode) in bwn_phy_getinfo() argument
1564 struct bwn_phy *phy = &mac->mac_phy; in bwn_phy_getinfo()
1565 struct bwn_softc *sc = mac->mac_sc; in bwn_phy_getinfo()
1569 tmp = BWN_READ_2(mac, BWN_PHYVER); 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()
1584 BWN_WRITE_2(mac, BWN_RFCTL, BWN_RFCTL_ID); in bwn_phy_getinfo()
1585 tmp = BWN_READ_2(mac, BWN_RFDATALO); in bwn_phy_getinfo()
1586 BWN_WRITE_2(mac, BWN_RFCTL, BWN_RFCTL_ID); in bwn_phy_getinfo()
1587 tmp |= (uint32_t)BWN_READ_2(mac, BWN_RFDATAHI) << 16; 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()
1625 bwn_chiptest(struct bwn_mac *mac) in bwn_chiptest() argument
1629 struct bwn_softc *sc = mac->mac_sc; in bwn_chiptest()
1634 backup = bwn_shm_read_4(mac, BWN_SHARED, 0); in bwn_chiptest()
1636 bwn_shm_write_4(mac, BWN_SHARED, 0, TESTVAL0); in bwn_chiptest()
1637 if (bwn_shm_read_4(mac, BWN_SHARED, 0) != TESTVAL0) in bwn_chiptest()
1639 bwn_shm_write_4(mac, BWN_SHARED, 0, TESTVAL1); in bwn_chiptest()
1640 if (bwn_shm_read_4(mac, BWN_SHARED, 0) != TESTVAL1) in bwn_chiptest()
1643 bwn_shm_write_4(mac, BWN_SHARED, 0, backup); 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()
1647 BWN_WRITE_2(mac, BWN_TSF_CFP_START, 0xaaaa); in bwn_chiptest()
1648 BWN_WRITE_4(mac, BWN_TSF_CFP_START, 0xccccbbbb); in bwn_chiptest()
1649 if (BWN_READ_2(mac, BWN_TSF_CFP_START_LOW) != 0xbbbb) in bwn_chiptest()
1651 if (BWN_READ_2(mac, BWN_TSF_CFP_START_HIGH) != 0xcccc) in bwn_chiptest()
1654 BWN_WRITE_4(mac, BWN_TSF_CFP_START, 0); in bwn_chiptest()
1656 v = BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_GMODE; in bwn_chiptest()
1664 device_printf(sc->sc_dev, "failed to validate the chipaccess\n"); in bwn_chiptest()
1669 bwn_setup_channels(struct bwn_mac *mac, int have_bg, int have_a) in bwn_setup_channels() argument
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()
1678 DPRINTF(sc, BWN_DEBUG_EEPROM, "%s: called; bg=%d, a=%d\n", 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()
1705 bwn_shm_read_4(struct bwn_mac *mac, uint16_t way, uint16_t offset) in bwn_shm_read_4() argument
1709 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_read_4()
1713 ("%s:%d warn", __func__, __LINE__)); in bwn_shm_read_4()
1715 bwn_shm_ctlword(mac, way, offset >> 2); in bwn_shm_read_4()
1716 ret = BWN_READ_2(mac, BWN_SHM_DATA_UNALIGNED); in bwn_shm_read_4()
1718 bwn_shm_ctlword(mac, way, (offset >> 2) + 1); in bwn_shm_read_4()
1719 ret |= BWN_READ_2(mac, BWN_SHM_DATA); in bwn_shm_read_4()
1724 bwn_shm_ctlword(mac, way, offset); in bwn_shm_read_4()
1725 ret = BWN_READ_4(mac, BWN_SHM_DATA); in bwn_shm_read_4()
1731 bwn_shm_read_2(struct bwn_mac *mac, uint16_t way, uint16_t offset) in bwn_shm_read_2() argument
1735 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_read_2()
1739 ("%s:%d warn", __func__, __LINE__)); in bwn_shm_read_2()
1741 bwn_shm_ctlword(mac, way, offset >> 2); in bwn_shm_read_2()
1742 ret = BWN_READ_2(mac, BWN_SHM_DATA_UNALIGNED); in bwn_shm_read_2()
1747 bwn_shm_ctlword(mac, way, offset); in bwn_shm_read_2()
1748 ret = BWN_READ_2(mac, BWN_SHM_DATA); in bwn_shm_read_2()
1755 bwn_shm_ctlword(struct bwn_mac *mac, uint16_t way, in bwn_shm_ctlword() argument
1763 BWN_WRITE_4(mac, BWN_SHM_CONTROL, control); in bwn_shm_ctlword()
1767 bwn_shm_write_4(struct bwn_mac *mac, uint16_t way, uint16_t offset, in bwn_shm_write_4() argument
1770 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_write_4()
1774 ("%s:%d warn", __func__, __LINE__)); in bwn_shm_write_4()
1776 bwn_shm_ctlword(mac, way, offset >> 2); in bwn_shm_write_4()
1777 BWN_WRITE_2(mac, BWN_SHM_DATA_UNALIGNED, in bwn_shm_write_4()
1779 bwn_shm_ctlword(mac, way, (offset >> 2) + 1); in bwn_shm_write_4()
1780 BWN_WRITE_2(mac, BWN_SHM_DATA, value & 0xffff); in bwn_shm_write_4()
1785 bwn_shm_ctlword(mac, way, offset); in bwn_shm_write_4()
1786 BWN_WRITE_4(mac, BWN_SHM_DATA, value); in bwn_shm_write_4()
1790 bwn_shm_write_2(struct bwn_mac *mac, uint16_t way, uint16_t offset, in bwn_shm_write_2() argument
1793 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_shm_write_2()
1797 ("%s:%d warn", __func__, __LINE__)); in bwn_shm_write_2()
1799 bwn_shm_ctlword(mac, way, offset >> 2); in bwn_shm_write_2()
1800 BWN_WRITE_2(mac, BWN_SHM_DATA_UNALIGNED, value); in bwn_shm_write_2()
1805 bwn_shm_ctlword(mac, way, offset); in bwn_shm_write_2()
1806 BWN_WRITE_2(mac, BWN_SHM_DATA, value); 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() local
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()
1862 struct bwn_mac *mac; in bwn_updateslot() local
1865 if (sc->sc_flags & BWN_FLAG_RUNNING) { in bwn_updateslot()
1866 mac = (struct bwn_mac *)sc->sc_curmac; in bwn_updateslot()
1867 bwn_set_slot_time(mac, IEEE80211_GET_SLOTTIME(ic)); 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() local
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()
1892 bwn_set_opmode(mac); 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() local
1912 mac = sc->sc_curmac; in bwn_wme_update()
1913 if (mac != NULL && mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_wme_update()
1914 bwn_mac_suspend(mac); in bwn_wme_update()
1915 for (i = 0; i < N(sc->sc_wmeParams); i++) { in bwn_wme_update()
1917 bwn_wme_loadparams(mac, wmep, bwn_wme_shm_offsets[i]); in bwn_wme_update()
1919 bwn_mac_enable(mac); in bwn_wme_update()
1928 struct bwn_softc *sc = ic->ic_softc; in bwn_scan_start()
1929 struct bwn_mac *mac; in bwn_scan_start() local
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()
1935 bwn_set_opmode(mac); in bwn_scan_start()
1937 bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_SKIP_CFP_UPDATE); in bwn_scan_start()
1945 struct bwn_softc *sc = ic->ic_softc; in bwn_scan_end()
1946 struct bwn_mac *mac; in bwn_scan_end() local
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()
1952 bwn_set_opmode(mac); in bwn_scan_end()
1953 bwn_hf_write(mac, bwn_hf_read(mac) & ~BWN_HF_SKIP_CFP_UPDATE); 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() local
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()
1971 bwn_mac_suspend(mac); in bwn_set_channel()
1972 bwn_set_txretry(mac, BWN_RETRY_SHORT, BWN_RETRY_LONG); 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()
1975 bwn_switch_channel(mac, 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()
1981 bwn_phy_txpower_check(mac, BWN_TXPWR_IGNORE_TIME | in bwn_set_channel()
1985 bwn_set_txantenna(mac, BWN_ANT_DEFAULT); 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()
1991 bwn_rf_turnon(mac); 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()
1996 bwn_rf_turnoff(mac); in bwn_set_channel()
1999 bwn_mac_enable(mac); in bwn_set_channel()
2009 const uint8_t mac[IEEE80211_ADDR_LEN]) in bwn_vap_create()
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()
2034 /* override max aid so sta's cannot assoc when we're out of sta id's */ in bwn_vap_create()
2035 vap->iv_max_aid = BWN_STAID_MAX; in bwn_vap_create()
2041 ieee80211_media_status, mac); in bwn_vap_create()
2058 struct bwn_mac *mac; in bwn_init() local
2063 DPRINTF(sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_init()
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()
2074 error = bwn_core_init(mac); in bwn_init()
2078 if (mac->mac_status == BWN_MAC_STATUS_INITED) in bwn_init()
2079 bwn_core_start(mac); in bwn_init()
2081 bwn_set_opmode(mac); in bwn_init()
2082 bwn_set_pretbtt(mac); in bwn_init()
2083 bwn_spu_setdelay(mac, 0); in bwn_init()
2084 bwn_set_macaddr(mac); 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() local
2100 DPRINTF(sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_stop()
2102 if (mac->mac_status >= BWN_MAC_STATUS_INITED) { in bwn_stop()
2104 bwn_set_opmode(mac); in bwn_stop()
2105 bwn_set_macaddr(mac); in bwn_stop()
2108 if (mac->mac_status >= BWN_MAC_STATUS_STARTED) in bwn_stop()
2109 bwn_core_stop(mac); in bwn_stop()
2111 callout_stop(&sc->sc_led_blink_ch); in bwn_stop()
2112 sc->sc_led_blinking = 0; in bwn_stop()
2114 bwn_core_exit(mac); 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()
2127 ("%s:%d: fail", __func__, __LINE__)); 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()
2170 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_wme_clear()
2176 bwn_core_forceclk(struct bwn_mac *mac, bool force) in bwn_core_forceclk() argument
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()
2204 bwn_core_init(struct bwn_mac *mac) in bwn_core_init() argument
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()
2211 ("%s:%d: fail", __func__, __LINE__)); in bwn_core_init()
2213 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_core_init()
2215 if ((error = bwn_core_forceclk(mac, true))) 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()
2243 bwn_bt_disable(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()
2250 error = bwn_chip_init(mac); in bwn_core_init()
2253 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_COREREV, in bwn_core_init()
2254 bhnd_get_hwrev(sc->sc_dev)); in bwn_core_init()
2255 hf = bwn_hf_read(mac); 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()
2274 bwn_hf_write(mac, hf); in bwn_core_init()
2276 /* Tell the firmware about the MAC capabilities */ in bwn_core_init()
2277 if (bhnd_get_hwrev(sc->sc_dev) >= 13) { in bwn_core_init()
2279 cap = BWN_READ_4(mac, BWN_MAC_HW_CAP); in bwn_core_init()
2281 "%s: hw capabilities: 0x%08x\n", in bwn_core_init()
2283 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_MACHW_L, in bwn_core_init()
2285 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_MACHW_H, in bwn_core_init()
2289 bwn_set_txretry(mac, BWN_RETRY_SHORT, BWN_RETRY_LONG); in bwn_core_init()
2290 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_SHORT_RETRY_FALLBACK, 3); in bwn_core_init()
2291 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_LONG_RETRY_FALLBACK, 2); in bwn_core_init()
2292 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_MAXTIME, 1); in bwn_core_init()
2294 bwn_rate_init(mac); in bwn_core_init()
2295 bwn_set_phytxctl(mac); in bwn_core_init()
2297 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_CONT_MIN, in bwn_core_init()
2298 (mac->mac_phy.type == BWN_PHYTYPE_B) ? 0x1f : 0xf); in bwn_core_init()
2299 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_CONT_MAX, 0x3ff); in bwn_core_init()
2301 if (sc->sc_quirks & BWN_QUIRK_NODMA) in bwn_core_init()
2302 bwn_pio_init(mac); in bwn_core_init()
2304 bwn_dma_init(mac); in bwn_core_init()
2305 bwn_wme_init(mac); in bwn_core_init()
2306 bwn_spu_setdelay(mac, 1); in bwn_core_init()
2307 bwn_bt_enable(mac); 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()
2311 bwn_core_forceclk(mac, true); in bwn_core_init()
2313 bwn_core_forceclk(mac, false); in bwn_core_init()
2315 bwn_set_macaddr(mac); in bwn_core_init()
2316 bwn_crypt_init(mac); 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()
2328 ("%s:%d: fail", __func__, __LINE__)); in bwn_core_init()
2329 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: fail\n", __func__); in bwn_core_init()
2334 bwn_core_start(struct bwn_mac *mac) in bwn_core_start() argument
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()
2340 ("%s:%d: fail", __func__, __LINE__)); in bwn_core_start()
2342 if (bhnd_get_hwrev(sc->sc_dev) < 5) in bwn_core_start()
2346 tmp = BWN_READ_4(mac, BWN_XMITSTAT_0); in bwn_core_start()
2349 tmp = BWN_READ_4(mac, BWN_XMITSTAT_1); in bwn_core_start()
2352 bwn_mac_enable(mac); 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()
2360 bwn_core_exit(struct bwn_mac *mac) in bwn_core_exit() argument
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()
2368 ("%s:%d: fail", __func__, __LINE__)); 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()
2374 macctl = BWN_READ_4(mac, BWN_MACCTL); in bwn_core_exit()
2377 BWN_WRITE_4(mac, BWN_MACCTL, macctl); in bwn_core_exit()
2379 bwn_dma_stop(mac); in bwn_core_exit()
2380 bwn_pio_stop(mac); in bwn_core_exit()
2381 bwn_chip_exit(mac); 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()
2387 bwn_bt_disable(struct bwn_mac *mac) in bwn_bt_disable() argument
2389 struct bwn_softc *sc = mac->mac_sc; in bwn_bt_disable()
2396 bwn_chip_init(struct bwn_mac *mac) in bwn_chip_init() argument
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()
2407 BWN_WRITE_4(mac, BWN_MACCTL, macctl); in bwn_chip_init()
2409 error = bwn_fw_fillinfo(mac); in bwn_chip_init()
2412 error = bwn_fw_loaducode(mac); in bwn_chip_init()
2416 error = bwn_gpio_init(mac); in bwn_chip_init()
2420 error = bwn_fw_loadinitvals(mac); in bwn_chip_init()
2424 phy->switch_analog(mac, 1); in bwn_chip_init()
2425 error = bwn_phy_init(mac); 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()
2433 bwn_set_txantenna(mac, BWN_ANT_DEFAULT); in bwn_chip_init()
2435 if (phy->type == BWN_PHYTYPE_B) in bwn_chip_init()
2436 BWN_WRITE_2(mac, 0x005e, BWN_READ_2(mac, 0x005e) | 0x0004); in bwn_chip_init()
2437 BWN_WRITE_4(mac, 0x0100, 0x01000000); in bwn_chip_init()
2438 if (bhnd_get_hwrev(sc->sc_dev) < 5) in bwn_chip_init()
2439 BWN_WRITE_4(mac, 0x010c, 0x01000000); in bwn_chip_init()
2441 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_chip_init()
2442 BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_STA); in bwn_chip_init()
2443 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_chip_init()
2444 BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_STA); in bwn_chip_init()
2445 bwn_shm_write_2(mac, BWN_SHARED, 0x0074, 0x0000); in bwn_chip_init()
2447 bwn_set_opmode(mac); in bwn_chip_init()
2448 if (bhnd_get_hwrev(sc->sc_dev) < 3) { in bwn_chip_init()
2449 BWN_WRITE_2(mac, 0x060e, 0x0000); in bwn_chip_init()
2450 BWN_WRITE_2(mac, 0x0610, 0x8000); in bwn_chip_init()
2451 BWN_WRITE_2(mac, 0x0604, 0x0000); in bwn_chip_init()
2452 BWN_WRITE_2(mac, 0x0606, 0x0200); in bwn_chip_init()
2454 BWN_WRITE_4(mac, 0x0188, 0x80000000); in bwn_chip_init()
2455 BWN_WRITE_4(mac, 0x018c, 0x02000000); in bwn_chip_init()
2457 BWN_WRITE_4(mac, BWN_INTR_REASON, 0x00004000); in bwn_chip_init()
2458 BWN_WRITE_4(mac, BWN_DMA0_INTR_MASK, 0x0001dc00); in bwn_chip_init()
2459 BWN_WRITE_4(mac, BWN_DMA1_INTR_MASK, 0x0000dc00); in bwn_chip_init()
2460 BWN_WRITE_4(mac, BWN_DMA2_INTR_MASK, 0x0000dc00); in bwn_chip_init()
2461 BWN_WRITE_4(mac, BWN_DMA3_INTR_MASK, 0x0001dc00); in bwn_chip_init()
2462 BWN_WRITE_4(mac, BWN_DMA4_INTR_MASK, 0x0000dc00); in bwn_chip_init()
2463 BWN_WRITE_4(mac, BWN_DMA5_INTR_MASK, 0x0000dc00); in bwn_chip_init()
2465 bwn_mac_phy_clock_set(mac, true); in bwn_chip_init()
2467 /* Provide the HT clock transition latency to the MAC core */ 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()
2481 BWN_WRITE_2(mac, BWN_POWERUP_DELAY, delay); in bwn_chip_init()
2487 bwn_hf_read(struct bwn_mac *mac) in bwn_hf_read() argument
2491 ret = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFHI); in bwn_hf_read()
2493 ret |= bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFMI); in bwn_hf_read()
2495 ret |= bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_HFLO); in bwn_hf_read()
2500 bwn_hf_write(struct bwn_mac *mac, uint64_t value) in bwn_hf_write() argument
2503 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFLO, in bwn_hf_write()
2505 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFMI, in bwn_hf_write()
2507 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_HFHI, in bwn_hf_write()
2512 bwn_set_txretry(struct bwn_mac *mac, int s, int l) in bwn_set_txretry() argument
2515 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_SHORT_RETRY, MIN(s, 0xf)); in bwn_set_txretry()
2516 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_SCRATCH_LONG_RETRY, MIN(l, 0xf)); in bwn_set_txretry()
2520 bwn_rate_init(struct bwn_mac *mac) in bwn_rate_init() argument
2523 switch (mac->mac_phy.type) { in bwn_rate_init()
2528 bwn_rate_write(mac, BWN_OFDM_RATE_6MB, 1); in bwn_rate_init()
2529 bwn_rate_write(mac, BWN_OFDM_RATE_12MB, 1); in bwn_rate_init()
2530 bwn_rate_write(mac, BWN_OFDM_RATE_18MB, 1); in bwn_rate_init()
2531 bwn_rate_write(mac, BWN_OFDM_RATE_24MB, 1); in bwn_rate_init()
2532 bwn_rate_write(mac, BWN_OFDM_RATE_36MB, 1); in bwn_rate_init()
2533 bwn_rate_write(mac, BWN_OFDM_RATE_48MB, 1); in bwn_rate_init()
2534 bwn_rate_write(mac, BWN_OFDM_RATE_54MB, 1); in bwn_rate_init()
2535 if (mac->mac_phy.type == BWN_PHYTYPE_A) in bwn_rate_init()
2539 bwn_rate_write(mac, BWN_CCK_RATE_1MB, 0); in bwn_rate_init()
2540 bwn_rate_write(mac, BWN_CCK_RATE_2MB, 0); in bwn_rate_init()
2541 bwn_rate_write(mac, BWN_CCK_RATE_5MB, 0); in bwn_rate_init()
2542 bwn_rate_write(mac, BWN_CCK_RATE_11MB, 0); in bwn_rate_init()
2545 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_rate_init()
2550 bwn_rate_write(struct bwn_mac *mac, uint16_t rate, int ofdm) in bwn_rate_write() argument
2561 bwn_shm_write_2(mac, BWN_SHARED, offset + 0x20, in bwn_rate_write()
2562 bwn_shm_read_2(mac, BWN_SHARED, offset)); in bwn_rate_write()
2579 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_plcp_getcck()
2605 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_plcp_getofdm()
2610 bwn_set_phytxctl(struct bwn_mac *mac) in bwn_set_phytxctl() argument
2616 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_BEACON_PHYCTL, ctl); in bwn_set_phytxctl()
2617 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL, ctl); in bwn_set_phytxctl()
2618 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL, ctl); in bwn_set_phytxctl()
2622 bwn_pio_init(struct bwn_mac *mac) in bwn_pio_init() argument
2624 struct bwn_pio *pio = &mac->mac_method.pio; in bwn_pio_init()
2626 BWN_WRITE_4(mac, BWN_MACCTL, BWN_READ_4(mac, BWN_MACCTL) in bwn_pio_init()
2628 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_RX_PADOFFSET, 0); 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()
2639 bwn_pio_set_txqueue(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_set_txqueue() argument
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()
2667 bwn_pio_idx2base(struct bwn_mac *mac, int index) in bwn_pio_idx2base() argument
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()
2700 bwn_pio_setupqueue_rx(struct bwn_mac *mac, struct bwn_pio_rxqueue *prq, in bwn_pio_setupqueue_rx() argument
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()
2708 bwn_dma_rxdirectfifo(mac, index, 1); in bwn_pio_setupqueue_rx()
2727 bwn_pio_read_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_read_2() argument
2731 return (BWN_READ_2(mac, tq->tq_base + offset)); in bwn_pio_read_2()
2735 bwn_dma_rxdirectfifo(struct bwn_mac *mac, int idx, uint8_t enable) in bwn_dma_rxdirectfifo() argument
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()
2742 ctl = BWN_READ_4(mac, base + BWN_DMA64_RXCTL); in bwn_dma_rxdirectfifo()
2746 BWN_WRITE_4(mac, base + BWN_DMA64_RXCTL, ctl); in bwn_dma_rxdirectfifo()
2748 ctl = BWN_READ_4(mac, base + BWN_DMA32_RXCTL); in bwn_dma_rxdirectfifo()
2752 BWN_WRITE_4(mac, base + BWN_DMA32_RXCTL, ctl); 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()
2793 ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_base()
2797 ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_base()
2802 bwn_dma_init(struct bwn_mac *mac) in bwn_dma_init() argument
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()
2817 bwn_dma_ringsetup(struct bwn_mac *mac, int controller_index, in bwn_dma_ringsetup() argument
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()
2881 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_ringsetup()
2894 ("%s:%d: fail", __func__, __LINE__)); 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()
2914 BWN_HDRSIZE(mac), 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()
3047 ("%s:%d: fail", __func__, __LINE__)); 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()
3143 ("%s:%d: fail", __func__, __LINE__)); 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() local
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()
3262 struct bwn_mac *mac; in bwn_dma_setup() local
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() local
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()
3394 bwn_dma_tx_reset(struct bwn_mac *mac, uint16_t base, in bwn_dma_tx_reset() argument
3397 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_tx_reset()
3405 value = BWN_READ_4(mac, base + offset); in bwn_dma_tx_reset()
3423 BWN_WRITE_4(mac, base + offset, 0); in bwn_dma_tx_reset()
3427 value = BWN_READ_4(mac, base + offset); 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()
3453 bwn_dma_rx_reset(struct bwn_mac *mac, uint16_t base, in bwn_dma_rx_reset() argument
3456 struct bwn_softc *sc = mac->mac_sc; in bwn_dma_rx_reset()
3463 BWN_WRITE_4(mac, base + offset, 0); in bwn_dma_rx_reset()
3467 value = BWN_READ_4(mac, base + offset); 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()
3517 ("%s:%d: fail", __func__, __LINE__)); 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()
3532 bwn_wme_init(struct bwn_mac *mac) in bwn_wme_init() argument
3535 bwn_wme_load(mac); in bwn_wme_init()
3538 bwn_hf_write(mac, bwn_hf_read(mac) | BWN_HF_EDCF); in bwn_wme_init()
3539 BWN_WRITE_2(mac, BWN_IFSCTL, BWN_READ_2(mac, BWN_IFSCTL) | in bwn_wme_init()
3544 bwn_spu_setdelay(struct bwn_mac *mac, int idle) in bwn_spu_setdelay() argument
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()
3556 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_SPU_WAKEUP, delay); in bwn_spu_setdelay()
3560 bwn_bt_enable(struct bwn_mac *mac) in bwn_bt_enable() argument
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()
3572 hf = bwn_hf_read(mac); in bwn_bt_enable()
3573 if (sc->sc_board_info.board_flags & BHND_BFL_BTC2WIRE_ALTGPIO) in bwn_bt_enable()
3577 bwn_hf_write(mac, hf); in bwn_bt_enable()
3581 bwn_set_macaddr(struct bwn_mac *mac) in bwn_set_macaddr() argument
3584 bwn_mac_write_bssid(mac); in bwn_set_macaddr()
3585 bwn_mac_setfilter(mac, BWN_MACFILTER_SELF, in bwn_set_macaddr()
3586 mac->mac_sc->sc_ic.ic_macaddr); in bwn_set_macaddr()
3590 bwn_clear_keys(struct bwn_mac *mac) in bwn_clear_keys() argument
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()
3596 ("%s:%d: fail", __func__, __LINE__)); in bwn_clear_keys()
3598 bwn_key_dowrite(mac, i, BWN_SEC_ALGO_NONE, in bwn_clear_keys()
3600 if ((i <= 3) && !BWN_SEC_NEWAPI(mac)) { in bwn_clear_keys()
3601 bwn_key_dowrite(mac, i + 4, BWN_SEC_ALGO_NONE, in bwn_clear_keys()
3604 mac->mac_key[i].keyconf = NULL; in bwn_clear_keys()
3609 bwn_crypt_init(struct bwn_mac *mac) in bwn_crypt_init() argument
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()
3615 ("%s:%d: fail", __func__, __LINE__)); 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()
3620 bwn_clear_keys(mac); in bwn_crypt_init()
3624 bwn_chip_exit(struct bwn_mac *mac) in bwn_chip_exit() argument
3626 bwn_phy_exit(mac); in bwn_chip_exit()
3630 bwn_fw_fillinfo(struct bwn_mac *mac) in bwn_fw_fillinfo() argument
3634 error = bwn_fw_gets(mac, BWN_FWTYPE_DEFAULT); in bwn_fw_fillinfo()
3637 error = bwn_fw_gets(mac, BWN_FWTYPE_OPENSOURCE); in bwn_fw_fillinfo()
3645 * the MAC core control over the pins.
3647 * @param mac bwn MAC state.
3652 bwn_gpio_control(struct bwn_mac *mac, uint32_t pins) in bwn_gpio_control() argument
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()
3685 bwn_gpio_init(struct bwn_mac *mac) in bwn_gpio_init() argument
3690 sc = mac->mac_sc; in bwn_gpio_init()
3694 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_gpio_init()
3695 BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_GPOUT_MASK); in bwn_gpio_init()
3696 BWN_WRITE_2(mac, BWN_GPIO_MASK, in bwn_gpio_init()
3697 BWN_READ_2(mac, BWN_GPIO_MASK) | pins); in bwn_gpio_init()
3699 if (sc->sc_board_info.board_flags & BHND_BFL_PACTRL) { in bwn_gpio_init()
3700 /* MAC core is responsible for toggling PAREF via gpio9 */ in bwn_gpio_init()
3701 BWN_WRITE_2(mac, BWN_GPIO_MASK, in bwn_gpio_init()
3702 BWN_READ_2(mac, BWN_GPIO_MASK) | BHND_GPIO_BOARD_PACTRL); in bwn_gpio_init()
3707 return (bwn_gpio_control(mac, pins)); in bwn_gpio_init()
3711 bwn_fw_loadinitvals(struct bwn_mac *mac) in bwn_fw_loadinitvals() argument
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()
3727 error = bwn_fwinitvals_write(mac, 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()
3737 bwn_phy_init(struct bwn_mac *mac) in bwn_phy_init() argument
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()
3749 error = bwn_switch_channel(mac, 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()
3767 bwn_set_txantenna(struct bwn_mac *mac, int antenna) in bwn_set_txantenna() argument
3775 tmp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL); in bwn_set_txantenna()
3777 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_ACKCTS_PHYCTL, tmp); in bwn_set_txantenna()
3779 tmp = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL); in bwn_set_txantenna()
3781 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PROBE_RESP_PHYCTL, tmp); in bwn_set_txantenna()
3785 bwn_set_opmode(struct bwn_mac *mac) in bwn_set_opmode() argument
3787 struct bwn_softc *sc = mac->mac_sc; in bwn_set_opmode()
3788 struct ieee80211com *ic = &sc->sc_ic; in bwn_set_opmode()
3792 ctl = BWN_READ_4(mac, BWN_MACCTL); 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()
3808 BWN_WRITE_4(mac, BWN_MACCTL, ctl); 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()
3818 BWN_WRITE_2(mac, 0x612, cfp_pretbtt); in bwn_set_opmode()
3826 *((bus_addr_t *)arg) = seg->ds_addr; in bwn_dma_ring_addr()
3831 bwn_dummy_transmission(struct bwn_mac *mac, int ofdm, int paon) in bwn_dummy_transmission() argument
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()
3852 bwn_ram_write(mac, i * 4, buffer[i]); in bwn_dummy_transmission()
3854 BWN_WRITE_2(mac, 0x0568, 0x0000); in bwn_dummy_transmission()
3855 BWN_WRITE_2(mac, 0x07c0, in bwn_dummy_transmission()
3856 (bhnd_get_hwrev(sc->sc_dev) < 11) ? 0x0000 : 0x0100); in bwn_dummy_transmission()
3859 BWN_WRITE_2(mac, 0x050c, value); 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()
3863 BWN_WRITE_2(mac, 0x0514, 0x1a02); in bwn_dummy_transmission()
3864 BWN_WRITE_2(mac, 0x0508, 0x0000); in bwn_dummy_transmission()
3865 BWN_WRITE_2(mac, 0x050a, 0x0000); in bwn_dummy_transmission()
3866 BWN_WRITE_2(mac, 0x054c, 0x0000); in bwn_dummy_transmission()
3867 BWN_WRITE_2(mac, 0x056a, 0x0014); in bwn_dummy_transmission()
3868 BWN_WRITE_2(mac, 0x0568, 0x0826); in bwn_dummy_transmission()
3869 BWN_WRITE_2(mac, 0x0500, 0x0000); in bwn_dummy_transmission()
3873 switch (phy->type) { in bwn_dummy_transmission()
3876 BWN_WRITE_2(mac, 0x0502, 0x00d0); in bwn_dummy_transmission()
3879 BWN_WRITE_2(mac, 0x0502, 0x0050); in bwn_dummy_transmission()
3882 BWN_WRITE_2(mac, 0x0502, 0x0030); in bwn_dummy_transmission()
3887 BWN_READ_2(mac, 0x0502); in bwn_dummy_transmission()
3889 if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) in bwn_dummy_transmission()
3890 BWN_RF_WRITE(mac, 0x0051, 0x0017); in bwn_dummy_transmission()
3892 value = BWN_READ_2(mac, 0x050e); in bwn_dummy_transmission()
3898 value = BWN_READ_2(mac, 0x050e); in bwn_dummy_transmission()
3904 value = BWN_READ_2(mac, 0x0690); in bwn_dummy_transmission()
3909 if (phy->rf_ver == 0x2050 && phy->rf_rev <= 0x5) in bwn_dummy_transmission()
3910 BWN_RF_WRITE(mac, 0x0051, 0x0037); in bwn_dummy_transmission()
3914 bwn_ram_write(struct bwn_mac *mac, uint16_t offset, uint32_t val) in bwn_ram_write() argument
3918 KASSERT(offset % 4 == 0, ("%s:%d: fail", __func__, __LINE__)); in bwn_ram_write()
3920 macctl = BWN_READ_4(mac, BWN_MACCTL); in bwn_ram_write()
3924 BWN_WRITE_4(mac, BWN_RAM_CONTROL, offset); in bwn_ram_write()
3925 BWN_BARRIER(mac, BWN_RAM_CONTROL, 4, BUS_SPACE_BARRIER_WRITE); in bwn_ram_write()
3926 BWN_WRITE_4(mac, BWN_RAM_DATA, val); in bwn_ram_write()
3930 bwn_mac_suspend(struct bwn_mac *mac) in bwn_mac_suspend() argument
3932 struct bwn_softc *sc = mac->mac_sc; in bwn_mac_suspend()
3936 KASSERT(mac->mac_suspended >= 0, in bwn_mac_suspend()
3937 ("%s:%d: fail", __func__, __LINE__)); 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()
3943 bwn_psctl(mac, BWN_PS_AWAKE); in bwn_mac_suspend()
3944 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_mac_suspend()
3945 BWN_READ_4(mac, BWN_MACCTL) in bwn_mac_suspend()
3947 BWN_READ_4(mac, BWN_MACCTL); in bwn_mac_suspend()
3948 for (i = 35; i; i--) { in bwn_mac_suspend()
3949 tmp = BWN_READ_4(mac, BWN_INTR_REASON); in bwn_mac_suspend()
3954 for (i = 40; i; i--) { in bwn_mac_suspend()
3955 tmp = BWN_READ_4(mac, BWN_INTR_REASON); 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()
3967 bwn_mac_enable(struct bwn_mac *mac) in bwn_mac_enable() argument
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()
3975 state = bwn_shm_read_2(mac, BWN_SHARED, in bwn_mac_enable()
3980 "%s: warn: firmware state (%d)\n", in bwn_mac_enable()
3984 mac->mac_suspended--; in bwn_mac_enable()
3985 KASSERT(mac->mac_suspended >= 0, in bwn_mac_enable()
3986 ("%s:%d: fail", __func__, __LINE__)); in bwn_mac_enable()
3987 if (mac->mac_suspended == 0) { in bwn_mac_enable()
3988 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_mac_enable()
3989 BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_ON); in bwn_mac_enable()
3990 BWN_WRITE_4(mac, BWN_INTR_REASON, BWN_INTR_MAC_SUSPENDED); in bwn_mac_enable()
3991 BWN_READ_4(mac, BWN_MACCTL); in bwn_mac_enable()
3992 BWN_READ_4(mac, BWN_INTR_REASON); in bwn_mac_enable()
3993 bwn_psctl(mac, 0); in bwn_mac_enable()
3998 bwn_psctl(struct bwn_mac *mac, uint32_t flags) in bwn_psctl() argument
4000 struct bwn_softc *sc = mac->mac_sc; in bwn_psctl()
4005 ("%s:%d: fail", __func__, __LINE__)); in bwn_psctl()
4007 ("%s:%d: fail", __func__, __LINE__)); in bwn_psctl()
4009 /* XXX forcibly awake and hwps-off */ in bwn_psctl()
4011 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_psctl()
4012 (BWN_READ_4(mac, BWN_MACCTL) | BWN_MACCTL_AWAKE) & in bwn_psctl()
4014 BWN_READ_4(mac, BWN_MACCTL); in bwn_psctl()
4015 if (bhnd_get_hwrev(sc->sc_dev) >= 5) { in bwn_psctl()
4017 ucstat = bwn_shm_read_2(mac, BWN_SHARED, in bwn_psctl()
4024 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: ucstat=%d\n", __func__, in bwn_psctl()
4029 bwn_fw_gets(struct bwn_mac *mac, enum bwn_fwtype type) in bwn_fw_gets() argument
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()
4112 bwn_release_firmware(mac); 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()
4119 bwn_release_firmware(mac); 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()
4130 bwn_release_firmware(mac); in bwn_fw_gets()
4134 device_printf(sc->sc_dev, "no PCM for rev %d\n", rev); in bwn_fw_gets()
4135 bwn_release_firmware(mac); 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()
4192 bwn_release_firmware(mac); 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()
4250 bwn_release_firmware(mac); 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()
4257 bwn_release_firmware(mac); in bwn_fw_gets()
4262 bwn_fw_get(struct bwn_mac *mac, enum bwn_fwtype type, in bwn_fw_get() argument
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()
4280 snprintf(namebuf, sizeof(namebuf), "bwn%s_v4_%s%s", 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()
4319 bwn_release_firmware(struct bwn_mac *mac) in bwn_release_firmware() argument
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()
4339 bwn_fw_loaducode(struct bwn_mac *mac) in bwn_fw_loaducode() argument
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()
4352 ctl = BWN_READ_4(mac, BWN_MACCTL); in bwn_fw_loaducode()
4354 KASSERT(!(ctl & BWN_MACCTL_MCODE_RUN), ("%s:%d: fail", __func__, in bwn_fw_loaducode()
4356 BWN_WRITE_4(mac, BWN_MACCTL, ctl); in bwn_fw_loaducode()
4358 bwn_shm_write_2(mac, BWN_SCRATCH, i, 0); in bwn_fw_loaducode()
4360 bwn_shm_write_2(mac, BWN_SHARED, i, 0); in bwn_fw_loaducode()
4362 data = GETFWOFFSET(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); in bwn_fw_loaducode()
4363 bwn_shm_ctlword(mac, BWN_UCODE | BWN_SHARED_AUTOINC, 0x0000); in bwn_fw_loaducode()
4364 for (i = 0; i < GETFWSIZE(mac->mac_fw.ucode, sizeof(struct bwn_fwhdr)); in bwn_fw_loaducode()
4366 BWN_WRITE_4(mac, BWN_SHM_DATA, be32toh(data[i])); 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()
4372 bwn_shm_ctlword(mac, BWN_HW, 0x01ea); in bwn_fw_loaducode()
4373 BWN_WRITE_4(mac, BWN_SHM_DATA, 0x00004000); in bwn_fw_loaducode()
4374 bwn_shm_ctlword(mac, BWN_HW, 0x01eb); in bwn_fw_loaducode()
4375 for (i = 0; i < GETFWSIZE(mac->mac_fw.pcm, in bwn_fw_loaducode()
4377 BWN_WRITE_4(mac, BWN_SHM_DATA, be32toh(data[i])); in bwn_fw_loaducode()
4382 BWN_WRITE_4(mac, BWN_INTR_REASON, BWN_INTR_ALL); in bwn_fw_loaducode()
4383 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_fw_loaducode()
4384 (BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_MCODE_JMP0) | in bwn_fw_loaducode()
4388 if (BWN_READ_4(mac, BWN_INTR_REASON) == BWN_INTR_MAC_SUSPENDED) in bwn_fw_loaducode()
4391 device_printf(sc->sc_dev, "ucode timeout\n"); in bwn_fw_loaducode()
4397 BWN_READ_4(mac, BWN_INTR_REASON); 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()
4436 date = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_DATE); 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()
4442 time = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_UCODE_TIME); 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()
4452 fwcaps = bwn_fwcaps_read(mac); 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()
4464 if (BWN_ISOLDFMT(mac)) in bwn_fw_loaducode()
4465 device_printf(sc->sc_dev, "using old firmware image\n"); in bwn_fw_loaducode()
4470 BWN_WRITE_4(mac, BWN_MACCTL, in bwn_fw_loaducode()
4471 (BWN_READ_4(mac, BWN_MACCTL) & ~BWN_MACCTL_MCODE_RUN) | in bwn_fw_loaducode()
4481 bwn_fwcaps_read(struct bwn_mac *mac) in bwn_fwcaps_read() argument
4484 KASSERT(mac->mac_fw.opensource == 1, in bwn_fwcaps_read()
4485 ("%s:%d: fail", __func__, __LINE__)); in bwn_fwcaps_read()
4486 return (bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_FWCAPS)); in bwn_fwcaps_read()
4490 bwn_fwinitvals_write(struct bwn_mac *mac, const struct bwn_fwinitvals *ivals, in bwn_fwinitvals_write() argument
4499 struct bwn_softc *sc = mac->mac_sc; in bwn_fwinitvals_write()
4506 ("%s:%d: fail", __func__, __LINE__)); 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()
4543 bwn_switch_channel(struct bwn_mac *mac, int chan) in bwn_switch_channel() argument
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()
4557 savedcookie = bwn_shm_read_2(mac, BWN_SHARED, BWN_SHARED_CHAN); in bwn_switch_channel()
4558 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_CHAN, channelcookie); 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()
4568 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_CHAN, savedcookie); in bwn_switch_channel()
4588 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_ant2phy()
4593 bwn_wme_load(struct bwn_mac *mac) in bwn_wme_load() argument
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()
4599 ("%s:%d: fail", __func__, __LINE__)); in bwn_wme_load()
4601 bwn_mac_suspend(mac); 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()
4605 bwn_mac_enable(mac); in bwn_wme_load()
4609 bwn_wme_loadparams(struct bwn_mac *mac, in bwn_wme_loadparams() argument
4612 struct bwn_softc *sc = mac->mac_sc; in bwn_wme_loadparams()
4617 slot = BWN_READ_2(mac, BWN_RNG) & 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()
4639 tmp = bwn_shm_read_2(mac, BWN_SHARED, in bwn_wme_loadparams()
4642 bwn_shm_write_2(mac, BWN_SHARED, shm_offset + (i * 2), in bwn_wme_loadparams()
4645 bwn_shm_write_2(mac, BWN_SHARED, shm_offset + (i * 2), in bwn_wme_loadparams()
4652 bwn_mac_write_bssid(struct bwn_mac *mac) in bwn_mac_write_bssid() argument
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()
4669 bwn_ram_write(mac, 0x20 + i, tmp); in bwn_mac_write_bssid()
4674 bwn_mac_setfilter(struct bwn_mac *mac, uint16_t offset, in bwn_mac_setfilter() argument
4680 if (!mac) in bwn_mac_setfilter()
4684 BWN_WRITE_2(mac, BWN_MACFILTER_CONTROL, offset); in bwn_mac_setfilter()
4688 BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); in bwn_mac_setfilter()
4691 BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); in bwn_mac_setfilter()
4694 BWN_WRITE_2(mac, BWN_MACFILTER_DATA, data); in bwn_mac_setfilter()
4698 bwn_key_dowrite(struct bwn_mac *mac, uint8_t index, uint8_t algorithm, in bwn_key_dowrite() argument
4704 if (BWN_SEC_NEWAPI(mac)) in bwn_key_dowrite()
4707 KASSERT(index < mac->mac_max_nr_keys, in bwn_key_dowrite()
4708 ("%s:%d: fail", __func__, __LINE__)); in bwn_key_dowrite()
4710 ("%s:%d: fail", __func__, __LINE__)); in bwn_key_dowrite()
4713 bwn_key_macwrite(mac, index, NULL); in bwn_key_dowrite()
4716 bwn_key_write(mac, index, algorithm, buf); in bwn_key_dowrite()
4718 bwn_key_macwrite(mac, index, mac_addr); in bwn_key_dowrite()
4720 mac->mac_key[index].algorithm = algorithm; in bwn_key_dowrite()
4724 bwn_key_macwrite(struct bwn_mac *mac, uint8_t index, const uint8_t *addr) in bwn_key_macwrite() argument
4726 struct bwn_softc *sc = mac->mac_sc; in bwn_key_macwrite()
4730 if (BWN_SEC_NEWAPI(mac)) in bwn_key_macwrite()
4734 ("%s:%d: fail", __func__, __LINE__)); in bwn_key_macwrite()
4735 index -= start; in bwn_key_macwrite()
4746 if (bhnd_get_hwrev(sc->sc_dev) >= 5) { in bwn_key_macwrite()
4747 bwn_shm_write_4(mac, BWN_RCMTA, (index * 2) + 0, addrtmp[0]); in bwn_key_macwrite()
4748 bwn_shm_write_2(mac, BWN_RCMTA, (index * 2) + 1, addrtmp[1]); in bwn_key_macwrite()
4751 bwn_shm_write_4(mac, BWN_SHARED, in bwn_key_macwrite()
4753 bwn_shm_write_2(mac, BWN_SHARED, in bwn_key_macwrite()
4760 bwn_key_write(struct bwn_mac *mac, uint8_t index, uint8_t algorithm, in bwn_key_write() argument
4767 kidx = BWN_SEC_KEY2FW(mac, index); in bwn_key_write()
4768 bwn_shm_write_2(mac, BWN_SHARED, in bwn_key_write()
4771 offset = mac->mac_ktp + (index * BWN_SEC_KEYSIZE); in bwn_key_write()
4775 bwn_shm_write_2(mac, BWN_SHARED, offset + i, value); in bwn_key_write()
4780 bwn_phy_exit(struct bwn_mac *mac) in bwn_phy_exit() argument
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()
4789 bwn_dma_free(struct bwn_mac *mac) in bwn_dma_free() argument
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()
4806 bwn_core_stop(struct bwn_mac *mac) in bwn_core_stop() argument
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()
4819 BWN_WRITE_4(mac, BWN_INTR_MASK, 0); in bwn_core_stop()
4820 BWN_READ_4(mac, BWN_INTR_MASK); in bwn_core_stop()
4821 bwn_mac_suspend(mac); in bwn_core_stop()
4823 mac->mac_status = BWN_MAC_STATUS_INITED; in bwn_core_stop()
4831 struct bwn_mac *mac; in bwn_switch_band() local
4837 TAILQ_FOREACH(mac, &sc->sc_maclist, mac_list) { in bwn_switch_band()
4839 mac->mac_phy.supports_2ghz) { in bwn_switch_band()
4840 up_dev = mac; in bwn_switch_band()
4843 mac->mac_phy.supports_5ghz) { in bwn_switch_band()
4844 up_dev = mac; in bwn_switch_band()
4847 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); 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()
4899 bwn_rf_turnon(struct bwn_mac *mac) in bwn_rf_turnon() argument
4902 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_rf_turnon()
4904 bwn_mac_suspend(mac); 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()
4907 bwn_mac_enable(mac); in bwn_rf_turnon()
4911 bwn_rf_turnoff(struct bwn_mac *mac) in bwn_rf_turnoff() argument
4914 DPRINTF(mac->mac_sc, BWN_DEBUG_RESET, "%s: called\n", __func__); in bwn_rf_turnoff()
4916 bwn_mac_suspend(mac); 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()
4919 bwn_mac_enable(mac); in bwn_rf_turnoff()
4926 bwn_phy_reset(struct bwn_mac *mac) in bwn_phy_reset() argument
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() local
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()
4972 bwn_led_newstate(mac, nstate); 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()
4987 bwn_set_macaddr(mac); 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()
4997 bwn_set_opmode(mac); in bwn_newstate()
4998 bwn_set_pretbtt(mac); in bwn_newstate()
4999 bwn_spu_setdelay(mac, 0); in bwn_newstate()
5000 bwn_set_macaddr(mac); in bwn_newstate()
5009 bwn_set_pretbtt(struct bwn_mac *mac) in bwn_set_pretbtt() argument
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()
5019 bwn_shm_write_2(mac, BWN_SHARED, BWN_SHARED_PRETBTT, pretbtt); in bwn_set_pretbtt()
5020 BWN_WRITE_2(mac, BWN_TSF_CFP_PRETBTT, pretbtt); in bwn_set_pretbtt()
5026 struct bwn_mac *mac = arg; in bwn_intr() local
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()
5034 DPRINTF(sc, BWN_DEBUG_INTR, "%s: called\n", __func__); in bwn_intr()
5036 reason = BWN_READ_4(mac, BWN_INTR_REASON); in bwn_intr()
5039 reason &= mac->mac_intr_mask; in bwn_intr()
5042 DPRINTF(sc, BWN_DEBUG_INTR, "%s: reason=0x%08x\n", __func__, reason); 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()
5049 BWN_WRITE_4(mac, BWN_INTR_REASON, reason); 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()
5057 BWN_WRITE_4(mac, BWN_INTR_MASK, 0); in bwn_intr()
5059 mac->mac_reason_intr = reason; in bwn_intr()
5061 BWN_BARRIER(mac, 0, 0, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); in bwn_intr()
5063 taskqueue_enqueue(sc->sc_tq, &mac->mac_intrtask); in bwn_intr()
5070 struct bwn_mac *mac = arg; in bwn_intrtask() local
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()
5089 DPRINTF(sc, BWN_DEBUG_INTR, "%s: PHY trans error\n", __func__); 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()
5093 bwn_restart(mac, "PHY TX errors"); 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()
5104 bwn_restart(mac, "DMA error"); 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()
5118 bwn_intr_ucode_debug(mac); in bwn_intrtask()
5119 if (mac->mac_reason_intr & BWN_INTR_TBTT_INDI) in bwn_intrtask()
5120 bwn_intr_tbtt_indication(mac); in bwn_intrtask()
5121 if (mac->mac_reason_intr & BWN_INTR_ATIM_END) in bwn_intrtask()
5122 bwn_intr_atim_end(mac); in bwn_intrtask()
5123 if (mac->mac_reason_intr & BWN_INTR_BEACON) in bwn_intrtask()
5124 bwn_intr_beacon(mac); in bwn_intrtask()
5125 if (mac->mac_reason_intr & BWN_INTR_PMQ) in bwn_intrtask()
5126 bwn_intr_pmq(mac); in bwn_intrtask()
5127 if (mac->mac_reason_intr & BWN_INTR_NOISESAMPLE_OK) in bwn_intrtask()
5128 bwn_intr_noise(mac); 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()
5145 bwn_intr_txeof(mac); 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()
5168 bwn_led_event(mac, evt); in bwn_intrtask()
5171 if (mbufq_first(&sc->sc_snd) != NULL) in bwn_intrtask()
5174 BWN_BARRIER(mac, 0, 0, BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); in bwn_intrtask()
5180 bwn_restart(struct bwn_mac *mac, const char *msg) in bwn_restart() argument
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()
5193 bwn_intr_ucode_debug(struct bwn_mac *mac) in bwn_intr_ucode_debug() argument
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()
5201 reason = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_DEBUGINTR_REASON_REG); in bwn_intr_ucode_debug()
5204 bwn_handle_fwpanic(mac); 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()
5220 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_DEBUGINTR_REASON_REG, in bwn_intr_ucode_debug()
5225 bwn_intr_tbtt_indication(struct bwn_mac *mac) in bwn_intr_tbtt_indication() argument
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()
5231 bwn_psctl(mac, 0); 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()
5237 bwn_intr_atim_end(struct bwn_mac *mac) in bwn_intr_atim_end() argument
5240 if (mac->mac_flags & BWN_MAC_FLAG_DFQVALID) { in bwn_intr_atim_end()
5241 BWN_WRITE_4(mac, BWN_MACCMD, in bwn_intr_atim_end()
5242 BWN_READ_4(mac, BWN_MACCMD) | BWN_MACCMD_DFQ_VALID); in bwn_intr_atim_end()
5243 mac->mac_flags &= ~BWN_MAC_FLAG_DFQVALID; in bwn_intr_atim_end()
5248 bwn_intr_beacon(struct bwn_mac *mac) in bwn_intr_beacon() argument
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()
5260 cmd = BWN_READ_4(mac, BWN_MACCMD); in bwn_intr_beacon()
5265 BWN_WRITE_4(mac, BWN_INTR_REASON, 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()
5272 bwn_load_beacon0(mac); in bwn_intr_beacon()
5273 bwn_load_beacon1(mac); in bwn_intr_beacon()
5274 cmd = BWN_READ_4(mac, BWN_MACCMD); in bwn_intr_beacon()
5276 BWN_WRITE_4(mac, BWN_MACCMD, cmd); in bwn_intr_beacon()
5279 bwn_load_beacon0(mac); in bwn_intr_beacon()
5280 cmd = BWN_READ_4(mac, BWN_MACCMD); in bwn_intr_beacon()
5282 BWN_WRITE_4(mac, BWN_MACCMD, cmd); in bwn_intr_beacon()
5284 bwn_load_beacon1(mac); in bwn_intr_beacon()
5285 cmd = BWN_READ_4(mac, BWN_MACCMD); in bwn_intr_beacon()
5287 BWN_WRITE_4(mac, BWN_MACCMD, cmd); in bwn_intr_beacon()
5293 bwn_intr_pmq(struct bwn_mac *mac) in bwn_intr_pmq() argument
5298 tmp = BWN_READ_4(mac, BWN_PS_STATUS); in bwn_intr_pmq()
5302 BWN_WRITE_2(mac, BWN_PS_STATUS, 0x0002); in bwn_intr_pmq()
5306 bwn_intr_noise(struct bwn_mac *mac) in bwn_intr_noise() argument
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()
5318 *((uint32_t *)noise) = htole32(bwn_jssi_read(mac)); in bwn_intr_noise()
5323 KASSERT(mac->mac_noise.noi_nsamples < 8, in bwn_intr_noise()
5324 ("%s:%d: fail", __func__, __LINE__)); 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()
5342 tmp = (bwn_shm_read_2(mac, BWN_SHARED, 0x40c) / 128) & 0x1f; 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()
5354 bwn_noise_gensample(mac); in bwn_intr_noise()
5360 struct bwn_mac *mac = prq->prq_mac; in bwn_pio_rx() local
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()
5386 ("%s:%d: fail", __func__, __LINE__)); 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()
5400 bwn_intr_txeof(struct bwn_mac *mac) in bwn_intr_txeof() argument
5406 BWN_ASSERT_LOCKED(mac->mac_sc); in bwn_intr_txeof()
5409 stat0 = BWN_READ_4(mac, BWN_XMITSTAT_0); in bwn_intr_txeof()
5412 stat1 = BWN_READ_4(mac, BWN_XMITSTAT_1); in bwn_intr_txeof()
5414 DPRINTF(mac->mac_sc, BWN_DEBUG_XMIT, in bwn_intr_txeof()
5415 "%s: stat0=0x%08x, stat1=0x%08x\n", in bwn_intr_txeof()
5432 DPRINTF(mac->mac_sc, BWN_DEBUG_XMIT, in bwn_intr_txeof()
5433 "%s: cookie=%d, seq=%d, phystat=0x%02x, framecnt=%d, " in bwn_intr_txeof()
5447 bwn_handle_txeof(mac, &stat); in bwn_intr_txeof()
5454 struct bwn_mac *mac = arg; in bwn_hwreset() local
5455 struct bwn_softc *sc = mac->mac_sc; in bwn_hwreset()
5461 prev_status = mac->mac_status; in bwn_hwreset()
5463 bwn_core_stop(mac); in bwn_hwreset()
5465 bwn_core_exit(mac); in bwn_hwreset()
5468 error = bwn_core_init(mac); in bwn_hwreset()
5473 bwn_core_start(mac); 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()
5483 bwn_handle_fwpanic(struct bwn_mac *mac) in bwn_handle_fwpanic() argument
5485 struct bwn_softc *sc = mac->mac_sc; in bwn_handle_fwpanic()
5488 reason = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_FWPANIC_REASON_REG); in bwn_handle_fwpanic()
5489 device_printf(sc->sc_dev,"fw panic (%u)\n", reason); in bwn_handle_fwpanic()
5492 bwn_restart(mac, "ucode panic"); in bwn_handle_fwpanic()
5496 bwn_load_beacon0(struct bwn_mac *mac) in bwn_load_beacon0() argument
5499 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_load_beacon0()
5503 bwn_load_beacon1(struct bwn_mac *mac) in bwn_load_beacon1() argument
5506 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_load_beacon1()
5510 bwn_jssi_read(struct bwn_mac *mac) in bwn_jssi_read() argument
5514 val = bwn_shm_read_2(mac, BWN_SHARED, 0x08a); in bwn_jssi_read()
5516 val |= bwn_shm_read_2(mac, BWN_SHARED, 0x088); in bwn_jssi_read()
5522 bwn_noise_gensample(struct bwn_mac *mac) in bwn_noise_gensample() argument
5526 bwn_shm_write_2(mac, BWN_SHARED, 0x088, (jssi & 0x0000ffff)); in bwn_noise_gensample()
5527 bwn_shm_write_2(mac, BWN_SHARED, 0x08a, (jssi & 0xffff0000) >> 16); in bwn_noise_gensample()
5528 BWN_WRITE_4(mac, BWN_MACCMD, in bwn_noise_gensample()
5529 BWN_READ_4(mac, BWN_MACCMD) | BWN_MACCMD_BGNOISE); in bwn_noise_gensample()
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()
5546 ("%s:%d: fail", __func__, __LINE__)); 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() local
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()
5633 bwn_handle_txeof(struct bwn_mac *mac, const struct bwn_txstatus *status) in bwn_handle_txeof() argument
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()
5652 bwn_dma_handle_txeof(mac, status); in bwn_handle_txeof()
5654 bwn_pio_handle_txeof(mac, status); in bwn_handle_txeof()
5657 bwn_phy_txpower_check(mac, 0); in bwn_handle_txeof()
5663 struct bwn_mac *mac = prq->prq_mac; in bwn_pio_rxeof() local
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() local
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()
5916 bwn_rx_rssi_calc(struct bwn_mac *mac, uint8_t in_rssi, in bwn_rx_rssi_calc() argument
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()
5968 bwn_rxeof(struct bwn_mac *mac, struct mbuf *m, const void *_rxhdr) in bwn_rxeof() argument
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()
6030 BWN_ISOLDFMT(mac), in bwn_rxeof()
6035 rate = bwn_plcp_get_ofdmrate(mac, plcp, in bwn_rxeof()
6038 rate = bwn_plcp_get_cckrate(mac, plcp); 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()
6064 "%s: power0=%d, power1=%d, power2=%d\n", 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()
6084 bwn_rx_radiotap(mac, m, rxhdr, plcp, rate, 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()
6111 * full framecnt. That may be 0 if it's a PHY in bwn_ratectl_tx_complete()
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()
6130 bwn_dma_handle_txeof(struct bwn_mac *mac, in bwn_dma_handle_txeof() argument
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()
6151 ("%s:%d: fail", __func__, __LINE__)); 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()
6161 ("%s:%d: fail", __func__, __LINE__)); 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()
6169 ("%s:%d: fail", __func__, __LINE__)); 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()
6179 ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_handle_txeof()
6180 dr->dr_stop = 0; in bwn_dma_handle_txeof()
6185 bwn_pio_handle_txeof(struct bwn_mac *mac, in bwn_pio_handle_txeof() argument
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()
6217 bwn_phy_txpower_check(struct bwn_mac *mac, uint32_t flags) in bwn_phy_txpower_check() argument
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()
6241 ("%s: fail", __func__)); 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()
6314 bwn_set_txhdr_phyctl1(struct bwn_mac *mac, uint8_t bitrate) in bwn_set_txhdr_phyctl1() argument
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()
6385 bwn_set_txhdr(struct bwn_mac *mac, struct ieee80211_node *ni, in bwn_set_txhdr() argument
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()
6486 switch (bwn_antenna_sanitize(mac, 0)) { in bwn_set_txhdr()
6503 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); 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()
6657 ("%s:%d: fail", __func__, __LINE__)); 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()
6677 bwn_antenna_sanitize(struct bwn_mac *mac, uint8_t n) in bwn_antenna_sanitize() argument
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()
6730 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); in bwn_get_fbrate()
6735 bwn_pio_write_multi_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_write_multi_4() argument
6738 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_write_multi_4()
6744 bwn_pio_write_4(mac, tq, BWN_PIO8_TXCTL, ctl); 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()
6764 bwn_pio_write_4(mac, tq, BWN_PIO8_TXCTL, ctl); in bwn_pio_write_multi_4()
6765 bwn_pio_write_4(mac, tq, BWN_PIO8_TXDATA, value); in bwn_pio_write_multi_4()
6772 bwn_pio_write_4(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_write_4() argument
6776 BWN_WRITE_4(mac, tq->tq_base + offset, value); in bwn_pio_write_4()
6780 bwn_pio_write_multi_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_write_multi_2() argument
6783 struct bwn_softc *sc = mac->mac_sc; in bwn_pio_write_multi_2()
6787 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); 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()
6793 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); 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()
6801 bwn_pio_write_mbuf_2(struct bwn_mac *mac, struct bwn_pio_txqueue *tq, in bwn_pio_write_mbuf_2() argument
6810 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); in bwn_pio_write_mbuf_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()
6819 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data); in bwn_pio_write_mbuf_2()
6824 if (m0->m_pkthdr.len % 2) { in bwn_pio_write_mbuf_2()
6826 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXCTL, ctl); in bwn_pio_write_mbuf_2()
6827 BWN_PIO_WRITE_2(mac, tq, BWN_PIO_TXDATA, data); in bwn_pio_write_mbuf_2()
6834 bwn_set_slot_time(struct bwn_mac *mac, uint16_t time) in bwn_set_slot_time() argument
6838 if (mac->mac_phy.type != BWN_PHYTYPE_G) in bwn_set_slot_time()
6841 BWN_WRITE_2(mac, 0x684, 510 + time); in bwn_set_slot_time()
6844 bwn_shm_write_2(mac, BWN_SHARED, 0x0010, time); in bwn_set_slot_time()
6849 bwn_dma_select(struct bwn_mac *mac, uint8_t prio) in bwn_dma_select() argument
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()
6865 KASSERT(0 == 1, ("%s:%d: fail", __func__, __LINE__)); 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()
6878 KASSERT(bwn_dma_freeslot(dr) != 0, ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_getslot()
6880 slot = bwn_dma_nextslot(dr, dr->dr_curslot); in bwn_dma_getslot()
6881 KASSERT(!(slot & ~0x0fff), ("%s:%d: fail", __func__, __LINE__)); in bwn_dma_getslot()
6882 dr->dr_curslot = slot; in bwn_dma_getslot()
6883 dr->dr_usedslot++; in bwn_dma_getslot()
6889 bwn_pio_parse_cookie(struct bwn_mac *mac, uint16_t cookie, in bwn_pio_parse_cookie() argument
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()
6913 KASSERT(tq != NULL, ("%s:%d: fail", __func__, __LINE__)); 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()
6921 KASSERT(*pack != NULL, ("%s:%d: fail", __func__, __LINE__)); in bwn_pio_parse_cookie()
6928 struct bwn_mac *mac = arg; in bwn_txpwr() local
6931 if (mac == NULL) in bwn_txpwr()
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()
6944 bwn_task_15s(struct bwn_mac *mac) in bwn_task_15s() argument
6948 if (mac->mac_fw.opensource) { in bwn_task_15s()
6949 reg = bwn_shm_read_2(mac, BWN_SCRATCH, BWN_WATCHDOG_REG); in bwn_task_15s()
6951 bwn_restart(mac, "fw watchdog"); in bwn_task_15s()
6954 bwn_shm_write_2(mac, BWN_SCRATCH, BWN_WATCHDOG_REG, 1); 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()
6963 bwn_task_30s(struct bwn_mac *mac) in bwn_task_30s() argument
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()
6971 bwn_noise_gensample(mac); in bwn_task_30s()
6975 bwn_task_60s(struct bwn_mac *mac) in bwn_task_60s() argument
6978 if (mac->mac_phy.task_60s) in bwn_task_60s()
6979 mac->mac_phy.task_60s(mac); in bwn_task_60s()
6980 bwn_phy_txpower_check(mac, BWN_TXPWR_IGNORE_TIME); in bwn_task_60s()
6986 struct bwn_mac *mac = arg; in bwn_tasks() local
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()
6994 bwn_task_60s(mac); in bwn_tasks()
6995 if (mac->mac_task_state % 2 == 0) in bwn_tasks()
6996 bwn_task_30s(mac); in bwn_tasks()
6997 bwn_task_15s(mac); 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()
7004 bwn_plcp_get_ofdmrate(struct bwn_mac *mac, struct bwn_plcp6 *plcp, uint8_t a) in bwn_plcp_get_ofdmrate() argument
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()
7034 bwn_plcp_get_cckrate(struct bwn_mac *mac, struct bwn_plcp6 *plcp) in bwn_plcp_get_cckrate() argument
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()
7053 bwn_rx_radiotap(struct bwn_mac *mac, struct mbuf *m, in bwn_rx_radiotap() argument
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()
7070 bwn_tsf_read(mac, &tsf); 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()
7095 bwn_tsf_read(struct bwn_mac *mac, uint64_t *tsf) in bwn_tsf_read() argument
7099 KASSERT(bhnd_get_hwrev(mac->mac_sc->sc_dev) >= 3, in bwn_tsf_read()
7100 ("%s:%d: fail", __func__, __LINE__)); in bwn_tsf_read()
7102 low = BWN_READ_4(mac, BWN_REV3PLUS_TSF_LOW); in bwn_tsf_read()
7103 high = BWN_READ_4(mac, BWN_REV3PLUS_TSF_HIGH); in bwn_tsf_read()
7110 bwn_dma_attach(struct bwn_mac *mac) in bwn_dma_attach() argument
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()
7130 /* Use the DMA engine's maximum host address width to determine the 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()
7171 /* Verify that our DMA engine's addrext constraints are compatible with 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()
7196 /* Dermine our translation's maximum supported address */ 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()
7291 bwn_dma_parse_cookie(struct bwn_mac *mac, const struct bwn_txstatus *status, in bwn_dma_parse_cookie() argument
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()
7326 * When it's occurred just prints a WARNING msgs and ignores. in bwn_dma_parse_cookie()
7328 KASSERT(status->seq == dma->lastseq, in bwn_dma_parse_cookie()
7329 ("%s:%d: fail", __func__, __LINE__)); 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()
7340 bwn_dma_stop(struct bwn_mac *mac) in bwn_dma_stop() argument
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()
7367 bwn_pio_stop(struct bwn_mac *mac) in bwn_pio_stop() argument
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()
7383 bwn_led_attach(struct bwn_mac *mac) in bwn_led_attach() argument
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()
7470 bwn_led_newstate(struct bwn_mac *mac, enum ieee80211_state nstate) in bwn_led_newstate() argument
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()
7485 val = BWN_READ_2(mac, BWN_GPIO_CONTROL); 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()
7527 BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); in bwn_led_newstate()
7531 bwn_led_event(struct bwn_mac *mac, int event) in bwn_led_event() argument
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()
7562 bwn_led_blink_start(mac, bwn_led_duration[rate].on_dur, in bwn_led_event()
7567 bwn_led_blink_start(struct bwn_mac *mac, int on_dur, int off_dur) in bwn_led_blink_start() argument
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()
7573 val = BWN_READ_2(mac, BWN_GPIO_CONTROL); in bwn_led_blink_start()
7575 BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); 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()
7591 struct bwn_mac *mac = arg; in bwn_led_blink_next() local
7592 struct bwn_softc *sc = mac->mac_sc; in bwn_led_blink_next()
7595 val = BWN_READ_2(mac, BWN_GPIO_CONTROL); in bwn_led_blink_next()
7596 val = bwn_led_onoff(sc->sc_blink_led, val, 0); in bwn_led_blink_next()
7597 BWN_WRITE_2(mac, BWN_GPIO_CONTROL, val); in bwn_led_blink_next()
7599 callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, in bwn_led_blink_next()
7600 bwn_led_blink_end, mac); in bwn_led_blink_next()
7606 struct bwn_mac *mac = arg; in bwn_led_blink_end() local
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() local
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()
7650 if (!(BWN_READ_4(mac, BWN_RF_HWENABLED_HI) in bwn_rfswitch()
7654 if (BWN_READ_2(mac, BWN_RF_HWENABLED_LO) in bwn_rfswitch()
7659 if (mac->mac_flags & BWN_MAC_FLAG_RADIO_ON) in bwn_rfswitch()
7662 DPRINTF(sc, BWN_DEBUG_RESET, "%s: called; cur=%d, prev=%d\n", 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()
7672 "status of RF switch is changed to %s\n", in bwn_rfswitch()
7674 if (cur != mac->mac_phy.rf_on) { in bwn_rfswitch()
7676 bwn_rf_turnon(mac); in bwn_rfswitch()
7678 bwn_rf_turnoff(mac); 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()
7689 struct bwn_mac *mac; in bwn_sysctl_node() local
7692 /* XXX assume that count of MAC is only 1. */ 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()