Lines Matching +full:tx +full:- +full:m

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
327 int tx) in bwi_setup_desc32() argument
340 if (desc_idx == ndesc - 1) in bwi_setup_desc32()
342 if (tx) { in bwi_setup_desc32()
349 desc->addr = htole32(addr); in bwi_setup_desc32()
350 desc->ctrl = htole32(ctrl); in bwi_setup_desc32()
356 struct ieee80211com *ic = &sc->sc_ic; in bwi_attach()
357 device_t dev = sc->sc_dev; in bwi_attach()
367 sc->sc_tq = taskqueue_create("bwi_taskq", M_NOWAIT | M_ZERO, in bwi_attach()
368 taskqueue_thread_enqueue, &sc->sc_tq); in bwi_attach()
369 taskqueue_start_threads(&sc->sc_tq, 1, PI_NET, "%s taskq", in bwi_attach()
371 TASK_INIT(&sc->sc_restart_task, 0, bwi_restart, sc); in bwi_attach()
372 callout_init_mtx(&sc->sc_calib_ch, &sc->sc_mtx, 0); in bwi_attach()
373 mbufq_init(&sc->sc_snd, ifqmaxlen); in bwi_attach()
378 sc->sc_fw_version = BWI_FW_VERSION3; in bwi_attach()
379 sc->sc_led_idle = (2350 * hz) / 1000; in bwi_attach()
380 sc->sc_led_ticks = ticks - sc->sc_led_idle; in bwi_attach()
381 sc->sc_led_blink = 1; in bwi_attach()
382 sc->sc_txpwr_calib = 1; in bwi_attach()
384 sc->sc_debug = bwi_debug; in bwi_attach()
396 if (BWI_REGWIN_EXIST(&sc->sc_com_regwin)) { in bwi_attach()
418 for (i = 0; i < sc->sc_nmac; ++i) { in bwi_attach()
421 mac = &sc->sc_mac[i]; in bwi_attach()
422 error = bwi_regwin_switch(sc, &mac->mac_regwin, &old); in bwi_attach()
439 mac = &sc->sc_mac[0]; in bwi_attach()
440 phy = &mac->mac_phy; in bwi_attach()
452 callout_init_mtx(&sc->sc_watchdog_timer, &sc->sc_mtx, 0); in bwi_attach()
457 if (phy->phy_mode == IEEE80211_MODE_11B || in bwi_attach()
458 phy->phy_mode == IEEE80211_MODE_11G) { in bwi_attach()
459 if (phy->phy_mode == IEEE80211_MODE_11B) { in bwi_attach()
460 ic->ic_phytype = IEEE80211_T_DS; in bwi_attach()
462 ic->ic_phytype = IEEE80211_T_OFDM; in bwi_attach()
465 bwi_get_eaddr(sc, BWI_SPROM_11BG_EADDR, ic->ic_macaddr); in bwi_attach()
466 if (IEEE80211_IS_MULTICAST(ic->ic_macaddr)) { in bwi_attach()
467 bwi_get_eaddr(sc, BWI_SPROM_11A_EADDR, ic->ic_macaddr); in bwi_attach()
468 if (IEEE80211_IS_MULTICAST(ic->ic_macaddr)) { in bwi_attach()
471 ic->ic_macaddr, ":"); in bwi_attach()
474 } else if (phy->phy_mode == IEEE80211_MODE_11A) { in bwi_attach()
479 panic("unknown phymode %d\n", phy->phy_mode); in bwi_attach()
483 sc->sc_locale = __SHIFTOUT(bwi_read_sprom(sc, BWI_SPROM_CARD_INFO), in bwi_attach()
485 DPRINTF(sc, BWI_DBG_ATTACH, "locale: %d\n", sc->sc_locale); in bwi_attach()
488 ic->ic_softc = sc; in bwi_attach()
490 bwi_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans, in bwi_attach()
491 ic->ic_channels); in bwi_attach()
493 ic->ic_name = device_get_nameunit(dev); in bwi_attach()
494 ic->ic_caps = IEEE80211_C_STA | in bwi_attach()
500 ic->ic_opmode = IEEE80211_M_STA; in bwi_attach()
502 ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD; in bwi_attach()
506 ic->ic_headroom = sizeof(struct bwi_txbuf_hdr); in bwi_attach()
509 ic->ic_vap_create = bwi_vap_create; in bwi_attach()
510 ic->ic_vap_delete = bwi_vap_delete; in bwi_attach()
511 ic->ic_raw_xmit = bwi_raw_xmit; in bwi_attach()
512 ic->ic_updateslot = bwi_updateslot; in bwi_attach()
513 ic->ic_scan_start = bwi_scan_start; in bwi_attach()
514 ic->ic_scan_end = bwi_scan_end; in bwi_attach()
515 ic->ic_getradiocaps = bwi_getradiocaps; in bwi_attach()
516 ic->ic_set_channel = bwi_set_channel; in bwi_attach()
517 ic->ic_transmit = bwi_transmit; in bwi_attach()
518 ic->ic_parent = bwi_parent; in bwi_attach()
520 sc->sc_rates = ieee80211_get_ratetable(ic->ic_curchan); in bwi_attach()
523 &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), in bwi_attach()
525 &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), in bwi_attach()
533 "fw_version", CTLFLAG_RD, &sc->sc_fw_version, 0, in bwi_attach()
537 "led_idle", CTLFLAG_RW, &sc->sc_led_idle, 0, in bwi_attach()
541 "led_blink", CTLFLAG_RW, &sc->sc_led_blink, 0, in bwi_attach()
545 "txpwr_calib", CTLFLAG_RW, &sc->sc_txpwr_calib, 0, in bwi_attach()
546 "Enable software TX power calibration"); in bwi_attach()
550 "debug", CTLFLAG_RW, &sc->sc_debug, 0, "Debug flags"); in bwi_attach()
564 struct ieee80211com *ic = &sc->sc_ic; in bwi_detach()
568 callout_drain(&sc->sc_led_blink_ch); in bwi_detach()
569 callout_drain(&sc->sc_calib_ch); in bwi_detach()
570 callout_drain(&sc->sc_watchdog_timer); in bwi_detach()
573 for (i = 0; i < sc->sc_nmac; ++i) in bwi_detach()
574 bwi_mac_detach(&sc->sc_mac[i]); in bwi_detach()
576 taskqueue_free(sc->sc_tq); in bwi_detach()
577 mbufq_drain(&sc->sc_snd); in bwi_detach()
593 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ in bwi_vap_create()
596 vap = &bvp->bv_vap; in bwi_vap_create()
602 bvp->bv_newstate = vap->iv_newstate; in bwi_vap_create()
603 vap->iv_newstate = bwi_newstate; in bwi_vap_create()
605 vap->iv_update_beacon = bwi_beacon_update; in bwi_vap_create()
612 ic->ic_opmode = opmode; in bwi_vap_create()
636 if (sc->sc_ic.ic_nrunning > 0) in bwi_resume()
653 gpio_in = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_IN, 4); in bwi_power_on()
657 gpio_out = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_power_on()
658 gpio_en = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, 4); in bwi_power_on()
668 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_on()
669 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, gpio_en, 4); in bwi_power_on()
675 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_on()
681 status = pci_read_config(sc->sc_dev, PCIR_STATUS, 2); in bwi_power_on()
683 pci_write_config(sc->sc_dev, PCIR_STATUS, status, 2); in bwi_power_on()
691 pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_IN, 4); /* dummy read */ in bwi_power_off()
692 gpio_out = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_power_off()
693 gpio_en = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, 4); in bwi_power_off()
702 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_off()
703 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, gpio_en, 4); in bwi_power_off()
719 if (sc->sc_cur_regwin != rw) { in bwi_regwin_switch()
720 error = bwi_regwin_select(sc, rw->rw_id); in bwi_regwin_switch()
722 device_printf(sc->sc_dev, "can't select regwin %d\n", in bwi_regwin_switch()
723 rw->rw_id); in bwi_regwin_switch()
729 *old_rw = sc->sc_cur_regwin; in bwi_regwin_switch()
730 sc->sc_cur_regwin = rw; in bwi_regwin_switch()
742 pci_write_config(sc->sc_dev, BWI_PCIR_SEL_REGWIN, win, 4); in bwi_regwin_select()
743 if (pci_read_config(sc->sc_dev, BWI_PCIR_SEL_REGWIN, 4) == win) in bwi_regwin_select()
780 device_printf(sc->sc_dev, "can't select regwin 0\n"); in bwi_bbp_attach()
794 BWI_CREATE_REGWIN(&sc->sc_com_regwin, 0, rw_type, rw_rev); in bwi_bbp_attach()
796 sc->sc_cap = CSR_READ_4(sc, BWI_CAPABILITY); in bwi_bbp_attach()
799 if (sc->sc_pci_did >= bwi_bbpid_map[i].did_min && in bwi_bbp_attach()
800 sc->sc_pci_did <= bwi_bbpid_map[i].did_max) { in bwi_bbp_attach()
806 device_printf(sc->sc_dev, "no BBP id for device id " in bwi_bbp_attach()
807 "0x%04x\n", sc->sc_pci_did); in bwi_bbp_attach()
811 info = __SHIFTIN(sc->sc_pci_revid, BWI_INFO_BBPREV_MASK) | in bwi_bbp_attach()
829 device_printf(sc->sc_dev, "no number of win for " in bwi_bbp_attach()
836 sc->sc_bbp_id = bbp_id; in bwi_bbp_attach()
837 sc->sc_bbp_rev = __SHIFTOUT(info, BWI_INFO_BBPREV_MASK); in bwi_bbp_attach()
838 sc->sc_bbp_pkg = __SHIFTOUT(info, BWI_INFO_BBPPKG_MASK); in bwi_bbp_attach()
839 device_printf(sc->sc_dev, "BBP: id 0x%04x, rev 0x%x, pkg %d\n", in bwi_bbp_attach()
840 sc->sc_bbp_id, sc->sc_bbp_rev, sc->sc_bbp_pkg); in bwi_bbp_attach()
843 nregwin, sc->sc_cap); in bwi_bbp_attach()
849 /* Don't re-create common regwin, if it is already created */ in bwi_bbp_attach()
850 i = BWI_REGWIN_EXIST(&sc->sc_com_regwin) ? 1 : 0; in bwi_bbp_attach()
858 device_printf(sc->sc_dev, in bwi_bbp_attach()
872 if (BWI_REGWIN_EXIST(&sc->sc_bus_regwin)) { in bwi_bbp_attach()
873 device_printf(sc->sc_dev, in bwi_bbp_attach()
876 BWI_CREATE_REGWIN(&sc->sc_bus_regwin, i, in bwi_bbp_attach()
886 if (!BWI_REGWIN_EXIST(&sc->sc_mac[0].mac_regwin)) { in bwi_bbp_attach()
887 device_printf(sc->sc_dev, "no MAC was found\n"); in bwi_bbp_attach()
890 KASSERT(sc->sc_nmac > 0, ("no mac's")); in bwi_bbp_attach()
893 if (!BWI_REGWIN_EXIST(&sc->sc_bus_regwin)) { in bwi_bbp_attach()
894 device_printf(sc->sc_dev, "no bus regwin was found\n"); in bwi_bbp_attach()
899 error = bwi_regwin_switch(sc, &sc->sc_mac[0].mac_regwin, NULL); in bwi_bbp_attach()
913 bus = &sc->sc_bus_regwin; in bwi_bus_init()
914 KASSERT(sc->sc_cur_regwin == &mac->mac_regwin, ("not cur regwin")); in bwi_bus_init()
919 if (bus->rw_rev < 6 && bus->rw_type == BWI_REGWIN_T_BUSPCI) { in bwi_bus_init()
933 mac_mask = 1 << mac->mac_id; in bwi_bus_init()
939 val = pci_read_config(sc->sc_dev, BWI_PCIR_INTCTL, 4); in bwi_bus_init()
941 pci_write_config(sc->sc_dev, BWI_PCIR_INTCTL, val, 4); in bwi_bus_init()
944 if (sc->sc_flags & BWI_F_BUS_INITED) in bwi_bus_init()
947 if (bus->rw_type == BWI_REGWIN_T_BUSPCI) { in bwi_bus_init()
954 if (bus->rw_rev < 5) { in bwi_bus_init()
955 struct bwi_regwin *com = &sc->sc_com_regwin; in bwi_bus_init()
989 } else if (bus->rw_rev >= 11) { in bwi_bus_init()
999 sc->sc_flags |= BWI_F_BUS_INITED; in bwi_bus_init()
1009 sc->sc_card_flags = bwi_read_sprom(sc, BWI_SPROM_CARD_FLAGS); in bwi_get_card_flags()
1010 if (sc->sc_card_flags == 0xffff) in bwi_get_card_flags()
1011 sc->sc_card_flags = 0; in bwi_get_card_flags()
1013 if (sc->sc_pci_subvid == PCI_VENDOR_DELL && in bwi_get_card_flags()
1014 sc->sc_bbp_id == BWI_BBPID_BCM4301 && in bwi_get_card_flags()
1015 sc->sc_pci_revid == 0x74) in bwi_get_card_flags()
1016 sc->sc_card_flags |= BWI_CARD_F_BT_COEXIST; in bwi_get_card_flags()
1018 if (sc->sc_pci_subvid == PCI_VENDOR_APPLE && in bwi_get_card_flags()
1019 sc->sc_pci_subdid == 0x4e && /* XXX */ in bwi_get_card_flags()
1020 sc->sc_pci_revid > 0x40) in bwi_get_card_flags()
1021 sc->sc_card_flags |= BWI_CARD_F_PA_GPIO9; in bwi_get_card_flags()
1023 DPRINTF(sc, BWI_DBG_ATTACH, "card flags 0x%04x\n", sc->sc_card_flags); in bwi_get_card_flags()
1048 com = &sc->sc_com_regwin; in bwi_get_clock_freq()
1051 KASSERT(sc->sc_cur_regwin == com, ("wrong regwin")); in bwi_get_clock_freq()
1052 KASSERT(sc->sc_cap & BWI_CAP_CLKMODE, ("wrong clock mode")); in bwi_get_clock_freq()
1057 src = -1; in bwi_get_clock_freq()
1059 if (com->rw_rev < 6) { in bwi_get_clock_freq()
1060 val = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_get_clock_freq()
1068 } else if (com->rw_rev < 10) { in bwi_get_clock_freq()
1095 freq->clkfreq_min = bwi_clkfreq[src].freq_min / div; in bwi_get_clock_freq()
1096 freq->clkfreq_max = bwi_clkfreq[src].freq_max / div; in bwi_get_clock_freq()
1099 freq->clkfreq_min, freq->clkfreq_max); in bwi_get_clock_freq()
1109 com = &sc->sc_com_regwin; in bwi_set_clock_mode()
1113 if (com->rw_rev >= 10 || com->rw_rev < 6) in bwi_set_clock_mode()
1120 if ((sc->sc_cap & BWI_CAP_CLKMODE) == 0) in bwi_set_clock_mode()
1165 com = &sc->sc_com_regwin; in bwi_set_clock_delay()
1173 if (sc->sc_bbp_id == BWI_BBPID_BCM4321) { in bwi_set_clock_delay()
1174 if (sc->sc_bbp_rev == 0) in bwi_set_clock_delay()
1176 else if (sc->sc_bbp_rev == 1) in bwi_set_clock_delay()
1180 if (sc->sc_cap & BWI_CAP_CLKMODE) { in bwi_set_clock_delay()
1181 if (com->rw_rev >= 10) { in bwi_set_clock_delay()
1200 struct ieee80211com *ic = &sc->sc_ic; in bwi_init()
1206 if (sc->sc_flags & BWI_F_RUNNING) in bwi_init()
1224 mac = &sc->sc_mac[0]; in bwi_init_statechg()
1225 error = bwi_regwin_switch(sc, &mac->mac_regwin, NULL); in bwi_init_statechg()
1227 device_printf(sc->sc_dev, "%s: error %d on regwin switch\n", in bwi_init_statechg()
1233 device_printf(sc->sc_dev, "%s: error %d on MAC init\n", in bwi_init_statechg()
1241 bwi_set_addr_filter(sc, BWI_ADDR_FILTER_MYADDR, sc->sc_ic.ic_macaddr); in bwi_init_statechg()
1245 if ((mac->mac_flags & BWI_MAC_F_HAS_TXSTATS) == 0) { in bwi_init_statechg()
1250 * Drain any possible pending TX status in bwi_init_statechg()
1259 device_printf(sc->sc_dev, in bwi_init_statechg()
1260 "%s: can't drain TX status\n", __func__); in bwi_init_statechg()
1264 if (mac->mac_phy.phy_mode == IEEE80211_MODE_11G) in bwi_init_statechg()
1270 device_printf(sc->sc_dev, "%s: error %d starting MAC\n", in bwi_init_statechg()
1276 sc->sc_flags &= ~BWI_F_STOP; in bwi_init_statechg()
1277 sc->sc_flags |= BWI_F_RUNNING; in bwi_init_statechg()
1278 callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); in bwi_init_statechg()
1290 struct bwi_softc *sc = ic->ic_softc; in bwi_parent()
1294 if (ic->ic_nrunning > 0) { in bwi_parent()
1296 int promisc = -1; in bwi_parent()
1298 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_parent()
1300 sc->sc_cur_regwin->rw_type)); in bwi_parent()
1301 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_parent()
1303 if (ic->ic_promisc > 0 && (sc->sc_flags & BWI_F_PROMISC) == 0) { in bwi_parent()
1305 sc->sc_flags |= BWI_F_PROMISC; in bwi_parent()
1306 } else if (ic->ic_promisc == 0 && in bwi_parent()
1307 (sc->sc_flags & BWI_F_PROMISC) != 0) { in bwi_parent()
1309 sc->sc_flags &= ~BWI_F_PROMISC; in bwi_parent()
1315 if (ic->ic_nrunning > 0) { in bwi_parent()
1316 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_parent()
1320 } else if (sc->sc_flags & BWI_F_RUNNING) in bwi_parent()
1328 bwi_transmit(struct ieee80211com *ic, struct mbuf *m) in bwi_transmit() argument
1330 struct bwi_softc *sc = ic->ic_softc; in bwi_transmit()
1334 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_transmit()
1338 error = mbufq_enqueue(&sc->sc_snd, m); in bwi_transmit()
1351 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_start_locked()
1354 struct mbuf *m; in bwi_start_locked() local
1360 idx = tbd->tbd_idx; in bwi_start_locked()
1362 while (tbd->tbd_buf[idx].tb_mbuf == NULL && in bwi_start_locked()
1363 tbd->tbd_used + BWI_TX_NSPRDESC < BWI_TX_NDESC && in bwi_start_locked()
1364 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in bwi_start_locked()
1365 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; in bwi_start_locked()
1366 wh = mtod(m, struct ieee80211_frame *); in bwi_start_locked()
1367 ieee80211_output_seqno_assign(ni, -1, m); in bwi_start_locked()
1368 if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) != 0 && in bwi_start_locked()
1369 ieee80211_crypto_encap(ni, m) == NULL) { in bwi_start_locked()
1370 if_inc_counter(ni->ni_vap->iv_ifp, in bwi_start_locked()
1373 m_freem(m); in bwi_start_locked()
1376 if (bwi_encap(sc, idx, m, ni) != 0) { in bwi_start_locked()
1377 /* 'm' is freed in bwi_encap() if we reach here */ in bwi_start_locked()
1379 if_inc_counter(ni->ni_vap->iv_ifp, in bwi_start_locked()
1383 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwi_start_locked()
1387 tbd->tbd_used++; in bwi_start_locked()
1391 tbd->tbd_idx = idx; in bwi_start_locked()
1393 sc->sc_tx_timer = 5; in bwi_start_locked()
1397 bwi_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, in bwi_raw_xmit() argument
1400 struct ieee80211com *ic = ni->ni_ic; in bwi_raw_xmit()
1401 struct bwi_softc *sc = ic->ic_softc; in bwi_raw_xmit()
1403 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_raw_xmit()
1406 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_raw_xmit()
1407 m_freem(m); in bwi_raw_xmit()
1412 idx = tbd->tbd_idx; in bwi_raw_xmit()
1413 KASSERT(tbd->tbd_buf[idx].tb_mbuf == NULL, ("slot %d not empty", idx)); in bwi_raw_xmit()
1419 error = bwi_encap(sc, idx, m, ni); in bwi_raw_xmit()
1425 error = bwi_encap_raw(sc, idx, m, ni, params); in bwi_raw_xmit()
1428 tbd->tbd_used++; in bwi_raw_xmit()
1429 tbd->tbd_idx = (idx + 1) % BWI_TX_NDESC; in bwi_raw_xmit()
1430 sc->sc_tx_timer = 5; in bwi_raw_xmit()
1443 if (sc->sc_tx_timer != 0 && --sc->sc_tx_timer == 0) { in bwi_watchdog()
1444 device_printf(sc->sc_dev, "watchdog timeout\n"); in bwi_watchdog()
1445 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwi_watchdog()
1446 taskqueue_enqueue(sc->sc_tq, &sc->sc_restart_task); in bwi_watchdog()
1448 callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); in bwi_watchdog()
1467 callout_stop(&sc->sc_calib_ch); in bwi_stop_locked()
1468 callout_stop(&sc->sc_led_blink_ch); in bwi_stop_locked()
1469 sc->sc_led_blinking = 0; in bwi_stop_locked()
1470 sc->sc_flags |= BWI_F_STOP; in bwi_stop_locked()
1472 if (sc->sc_flags & BWI_F_RUNNING) { in bwi_stop_locked()
1473 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_stop_locked()
1474 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_stop_locked()
1475 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_stop_locked()
1482 for (i = 0; i < sc->sc_nmac; ++i) { in bwi_stop_locked()
1485 mac = &sc->sc_mac[i]; in bwi_stop_locked()
1486 if ((mac->mac_flags & BWI_MAC_F_INITED) == 0) in bwi_stop_locked()
1489 error = bwi_regwin_switch(sc, &mac->mac_regwin, &old_rw); in bwi_stop_locked()
1502 sc->sc_tx_timer = 0; in bwi_stop_locked()
1503 callout_stop(&sc->sc_watchdog_timer); in bwi_stop_locked()
1504 sc->sc_flags &= ~BWI_F_RUNNING; in bwi_stop_locked()
1514 int i, txrx_error, tx = 0, rx_data = -1; in bwi_intr() local
1518 if ((sc->sc_flags & BWI_F_RUNNING) == 0 || in bwi_intr()
1519 (sc->sc_flags & BWI_F_STOP)) { in bwi_intr()
1540 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_intr()
1541 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_intr()
1542 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_intr()
1545 DPRINTF(sc, BWI_DBG_INTR, "%s\n", "TX/RX intr"); in bwi_intr()
1561 device_printf(sc->sc_dev, in bwi_intr()
1562 "%s: intr fatal TX/RX (%d) error 0x%08x\n", in bwi_intr()
1581 * http://bcm-specs.sipsolutions.net/Interrupts in bwi_intr()
1592 * feeding TX packets into the MAC correctly if we do... Apparently, in bwi_intr()
1595 * on my card, this suggests an error in the tx path still... in bwi_intr()
1598 if (mac->mac_flags & BWI_MAC_F_PHYE_RESET) { in bwi_intr()
1599 device_printf(sc->sc_dev, "%s: intr PHY TX error\n", in bwi_intr()
1601 taskqueue_enqueue(sc->sc_tq, &sc->sc_restart_task); in bwi_intr()
1615 device_printf(sc->sc_dev, "EO_ATIM\n"); in bwi_intr()
1626 device_printf(sc->sc_dev, "intr noise\n"); in bwi_intr()
1629 rx_data = sc->sc_rxeof(sc); in bwi_intr()
1630 if (sc->sc_flags & BWI_F_STOP) { in bwi_intr()
1637 sc->sc_txeof_status(sc); in bwi_intr()
1638 tx = 1; in bwi_intr()
1643 tx = 1; in bwi_intr()
1646 /* Re-enable interrupts */ in bwi_intr()
1649 if (sc->sc_blink_led != NULL && sc->sc_led_blink) { in bwi_intr()
1652 if (tx && rx_data > 0) { in bwi_intr()
1653 if (sc->sc_rx_rate > sc->sc_tx_rate) in bwi_intr()
1657 } else if (tx) { in bwi_intr()
1675 struct bwi_softc *sc = ic->ic_softc; in bwi_scan_start()
1687 struct bwi_softc *sc = ic->ic_softc; in bwi_getradiocaps()
1696 mac = &sc->sc_mac[0]; in bwi_getradiocaps()
1697 phy = &mac->mac_phy; in bwi_getradiocaps()
1700 switch (phy->phy_mode) { in bwi_getradiocaps()
1710 device_printf(sc->sc_dev, "no 11a support\n"); in bwi_getradiocaps()
1713 panic("unknown phymode %d\n", phy->phy_mode); in bwi_getradiocaps()
1722 struct bwi_softc *sc = ic->ic_softc; in bwi_set_channel()
1723 struct ieee80211_channel *c = ic->ic_curchan; in bwi_set_channel()
1727 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_set_channel()
1728 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_set_channel()
1729 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_set_channel()
1732 sc->sc_rates = ieee80211_get_ratetable(c); in bwi_set_channel()
1739 struct bwi_softc *sc = ic->ic_softc; in bwi_scan_end()
1750 struct ieee80211com *ic= vap->iv_ic; in bwi_newstate()
1751 struct bwi_softc *sc = ic->ic_softc; in bwi_newstate()
1752 enum ieee80211_state ostate = vap->iv_state; in bwi_newstate()
1758 callout_stop(&sc->sc_calib_ch); in bwi_newstate()
1761 sc->sc_txpwrcb_type = BWI_TXPWR_INIT; in bwi_newstate()
1765 error = bvp->bv_newstate(vap, nstate, arg); in bwi_newstate()
1772 if (vap->iv_opmode == IEEE80211_M_STA) { in bwi_newstate()
1779 if (ic->ic_opmode == IEEE80211_M_STA && in bwi_newstate()
1780 !(sc->sc_flags & BWI_F_STOP)) in bwi_newstate()
1785 if (vap->iv_opmode == IEEE80211_M_MONITOR) { in bwi_newstate()
1788 bwi_set_bssid(sc, vap->iv_bss->ni_bssid); in bwi_newstate()
1790 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_newstate()
1791 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_newstate()
1792 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_newstate()
1794 /* Initial TX power calibration */ in bwi_newstate()
1797 sc->sc_txpwrcb_type = BWI_TXPWR_FORCE; in bwi_newstate()
1799 sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; in bwi_newstate()
1802 callout_reset(&sc->sc_calib_ch, hz, bwi_calibrate, sc); in bwi_newstate()
1819 for (i = 0; i < sc->sc_nmac; ++i) { in bwi_dma_alloc()
1820 if (sc->sc_mac[i].mac_flags & BWI_MAC_F_HAS_TXSTATS) { in bwi_dma_alloc()
1826 switch (sc->sc_bus_space) { in bwi_dma_alloc()
1829 if (sc->sc_bus_space == BWI_BUS_SPACE_30BIT) in bwi_dma_alloc()
1836 sc->sc_init_tx_ring = bwi_init_tx_ring32; in bwi_dma_alloc()
1837 sc->sc_free_tx_ring = bwi_free_tx_ring32; in bwi_dma_alloc()
1838 sc->sc_init_rx_ring = bwi_init_rx_ring32; in bwi_dma_alloc()
1839 sc->sc_free_rx_ring = bwi_free_rx_ring32; in bwi_dma_alloc()
1840 sc->sc_setup_rxdesc = bwi_setup_rx_desc32; in bwi_dma_alloc()
1841 sc->sc_setup_txdesc = bwi_setup_tx_desc32; in bwi_dma_alloc()
1842 sc->sc_rxeof = bwi_rxeof32; in bwi_dma_alloc()
1843 sc->sc_start_tx = bwi_start_tx32; in bwi_dma_alloc()
1845 sc->sc_init_txstats = bwi_init_txstats32; in bwi_dma_alloc()
1846 sc->sc_free_txstats = bwi_free_txstats32; in bwi_dma_alloc()
1847 sc->sc_txeof_status = bwi_txeof_status32; in bwi_dma_alloc()
1856 sc->sc_init_tx_ring = bwi_init_tx_ring64; in bwi_dma_alloc()
1857 sc->sc_free_tx_ring = bwi_free_tx_ring64; in bwi_dma_alloc()
1858 sc->sc_init_rx_ring = bwi_init_rx_ring64; in bwi_dma_alloc()
1859 sc->sc_free_rx_ring = bwi_free_rx_ring64; in bwi_dma_alloc()
1860 sc->sc_setup_rxdesc = bwi_setup_rx_desc64; in bwi_dma_alloc()
1861 sc->sc_setup_txdesc = bwi_setup_tx_desc64; in bwi_dma_alloc()
1862 sc->sc_rxeof = bwi_rxeof64; in bwi_dma_alloc()
1863 sc->sc_start_tx = bwi_start_tx64; in bwi_dma_alloc()
1865 sc->sc_init_txstats = bwi_init_txstats64; in bwi_dma_alloc()
1866 sc->sc_free_txstats = bwi_free_txstats64; in bwi_dma_alloc()
1867 sc->sc_txeof_status = bwi_txeof_status64; in bwi_dma_alloc()
1882 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), /* parent */ in bwi_dma_alloc()
1892 &sc->sc_parent_dtag); in bwi_dma_alloc()
1894 device_printf(sc->sc_dev, "can't create parent DMA tag\n"); in bwi_dma_alloc()
1901 * Create TX ring DMA stuffs in bwi_dma_alloc()
1903 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_alloc()
1913 &sc->sc_txring_dtag); in bwi_dma_alloc()
1915 device_printf(sc->sc_dev, "can't create TX ring DMA tag\n"); in bwi_dma_alloc()
1920 error = bwi_dma_ring_alloc(sc, sc->sc_txring_dtag, in bwi_dma_alloc()
1921 &sc->sc_tx_rdata[i], tx_ring_sz, in bwi_dma_alloc()
1924 device_printf(sc->sc_dev, "%dth TX ring " in bwi_dma_alloc()
1933 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_alloc()
1943 &sc->sc_rxring_dtag); in bwi_dma_alloc()
1945 device_printf(sc->sc_dev, "can't create RX ring DMA tag\n"); in bwi_dma_alloc()
1949 error = bwi_dma_ring_alloc(sc, sc->sc_rxring_dtag, &sc->sc_rx_rdata, in bwi_dma_alloc()
1952 device_printf(sc->sc_dev, "RX ring DMA alloc failed\n"); in bwi_dma_alloc()
1959 device_printf(sc->sc_dev, in bwi_dma_alloc()
1960 "TX stats DMA alloc failed\n"); in bwi_dma_alloc()
1973 if (sc->sc_txring_dtag != NULL) { in bwi_dma_free()
1977 struct bwi_ring_data *rd = &sc->sc_tx_rdata[i]; in bwi_dma_free()
1979 if (rd->rdata_desc != NULL) { in bwi_dma_free()
1980 bus_dmamap_unload(sc->sc_txring_dtag, in bwi_dma_free()
1981 rd->rdata_dmap); in bwi_dma_free()
1982 bus_dmamem_free(sc->sc_txring_dtag, in bwi_dma_free()
1983 rd->rdata_desc, in bwi_dma_free()
1984 rd->rdata_dmap); in bwi_dma_free()
1987 bus_dma_tag_destroy(sc->sc_txring_dtag); in bwi_dma_free()
1990 if (sc->sc_rxring_dtag != NULL) { in bwi_dma_free()
1991 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_dma_free()
1993 if (rd->rdata_desc != NULL) { in bwi_dma_free()
1994 bus_dmamap_unload(sc->sc_rxring_dtag, rd->rdata_dmap); in bwi_dma_free()
1995 bus_dmamem_free(sc->sc_rxring_dtag, rd->rdata_desc, in bwi_dma_free()
1996 rd->rdata_dmap); in bwi_dma_free()
1998 bus_dma_tag_destroy(sc->sc_rxring_dtag); in bwi_dma_free()
2004 if (sc->sc_parent_dtag != NULL) in bwi_dma_free()
2005 bus_dma_tag_destroy(sc->sc_parent_dtag); in bwi_dma_free()
2015 error = bus_dmamem_alloc(dtag, &rd->rdata_desc, in bwi_dma_ring_alloc()
2017 &rd->rdata_dmap); in bwi_dma_ring_alloc()
2019 device_printf(sc->sc_dev, "can't allocate DMA mem\n"); in bwi_dma_ring_alloc()
2023 error = bus_dmamap_load(dtag, rd->rdata_dmap, rd->rdata_desc, size, in bwi_dma_ring_alloc()
2024 bwi_dma_ring_addr, &rd->rdata_paddr, in bwi_dma_ring_alloc()
2027 device_printf(sc->sc_dev, "can't load DMA mem\n"); in bwi_dma_ring_alloc()
2028 bus_dmamem_free(dtag, rd->rdata_desc, rd->rdata_dmap); in bwi_dma_ring_alloc()
2029 rd->rdata_desc = NULL; in bwi_dma_ring_alloc()
2033 rd->rdata_txrx_ctrl = txrx_ctrl; in bwi_dma_ring_alloc()
2047 device_printf(sc->sc_dev, "can't allocate txstats data\n"); in bwi_dma_txstats_alloc()
2050 sc->sc_txstats = st; in bwi_dma_txstats_alloc()
2053 * Create TX stats descriptor DMA stuffs in bwi_dma_txstats_alloc()
2057 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_txstats_alloc()
2068 &st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2070 device_printf(sc->sc_dev, "can't create txstats ring " in bwi_dma_txstats_alloc()
2075 error = bus_dmamem_alloc(st->stats_ring_dtag, &st->stats_ring, in bwi_dma_txstats_alloc()
2077 &st->stats_ring_dmap); in bwi_dma_txstats_alloc()
2079 device_printf(sc->sc_dev, "can't allocate txstats ring " in bwi_dma_txstats_alloc()
2081 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2082 st->stats_ring_dtag = NULL; in bwi_dma_txstats_alloc()
2086 error = bus_dmamap_load(st->stats_ring_dtag, st->stats_ring_dmap, in bwi_dma_txstats_alloc()
2087 st->stats_ring, dma_size, in bwi_dma_txstats_alloc()
2088 bwi_dma_ring_addr, &st->stats_ring_paddr, in bwi_dma_txstats_alloc()
2091 device_printf(sc->sc_dev, "can't load txstats ring DMA mem\n"); in bwi_dma_txstats_alloc()
2092 bus_dmamem_free(st->stats_ring_dtag, st->stats_ring, in bwi_dma_txstats_alloc()
2093 st->stats_ring_dmap); in bwi_dma_txstats_alloc()
2094 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2095 st->stats_ring_dtag = NULL; in bwi_dma_txstats_alloc()
2100 * Create TX stats DMA stuffs in bwi_dma_txstats_alloc()
2105 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_txstats_alloc()
2116 &st->stats_dtag); in bwi_dma_txstats_alloc()
2118 device_printf(sc->sc_dev, "can't create txstats DMA tag\n"); in bwi_dma_txstats_alloc()
2122 error = bus_dmamem_alloc(st->stats_dtag, (void **)&st->stats, in bwi_dma_txstats_alloc()
2124 &st->stats_dmap); in bwi_dma_txstats_alloc()
2126 device_printf(sc->sc_dev, "can't allocate txstats DMA mem\n"); in bwi_dma_txstats_alloc()
2127 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_alloc()
2128 st->stats_dtag = NULL; in bwi_dma_txstats_alloc()
2132 error = bus_dmamap_load(st->stats_dtag, st->stats_dmap, st->stats, in bwi_dma_txstats_alloc()
2133 dma_size, bwi_dma_ring_addr, &st->stats_paddr, in bwi_dma_txstats_alloc()
2136 device_printf(sc->sc_dev, "can't load txstats DMA mem\n"); in bwi_dma_txstats_alloc()
2137 bus_dmamem_free(st->stats_dtag, st->stats, st->stats_dmap); in bwi_dma_txstats_alloc()
2138 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_alloc()
2139 st->stats_dtag = NULL; in bwi_dma_txstats_alloc()
2143 st->stats_ctrl_base = ctrl_base; in bwi_dma_txstats_alloc()
2152 if (sc->sc_txstats == NULL) in bwi_dma_txstats_free()
2154 st = sc->sc_txstats; in bwi_dma_txstats_free()
2156 if (st->stats_ring_dtag != NULL) { in bwi_dma_txstats_free()
2157 bus_dmamap_unload(st->stats_ring_dtag, st->stats_ring_dmap); in bwi_dma_txstats_free()
2158 bus_dmamem_free(st->stats_ring_dtag, st->stats_ring, in bwi_dma_txstats_free()
2159 st->stats_ring_dmap); in bwi_dma_txstats_free()
2160 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_free()
2163 if (st->stats_dtag != NULL) { in bwi_dma_txstats_free()
2164 bus_dmamap_unload(st->stats_dtag, st->stats_dmap); in bwi_dma_txstats_free()
2165 bus_dmamem_free(st->stats_dtag, st->stats, st->stats_dmap); in bwi_dma_txstats_free()
2166 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_free()
2176 *((bus_addr_t *)arg) = seg->ds_addr; in bwi_dma_ring_addr()
2182 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_dma_mbuf_create()
2186 * Create TX/RX mbuf DMA tag in bwi_dma_mbuf_create()
2188 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_mbuf_create()
2199 &sc->sc_buf_dtag); in bwi_dma_mbuf_create()
2201 device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); in bwi_dma_mbuf_create()
2208 * Create TX mbuf DMA map in bwi_dma_mbuf_create()
2211 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[i]; in bwi_dma_mbuf_create()
2214 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2215 &tbd->tbd_buf[j].tb_dmap); in bwi_dma_mbuf_create()
2217 device_printf(sc->sc_dev, "can't create " in bwi_dma_mbuf_create()
2222 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2223 tbd->tbd_buf[k].tb_dmap); in bwi_dma_mbuf_create()
2234 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2235 &rbd->rbd_tmp_dmap); in bwi_dma_mbuf_create()
2237 device_printf(sc->sc_dev, in bwi_dma_mbuf_create()
2243 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2244 &rbd->rbd_buf[j].rb_dmap); in bwi_dma_mbuf_create()
2246 device_printf(sc->sc_dev, "can't create %dth " in bwi_dma_mbuf_create()
2250 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2251 rbd->rbd_buf[j].rb_dmap); in bwi_dma_mbuf_create()
2253 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2254 rbd->rbd_tmp_dmap); in bwi_dma_mbuf_create()
2270 if (sc->sc_buf_dtag == NULL) in bwi_dma_mbuf_destroy()
2274 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[i]; in bwi_dma_mbuf_destroy()
2277 struct bwi_txbuf *tb = &tbd->tbd_buf[j]; in bwi_dma_mbuf_destroy()
2279 if (tb->tb_mbuf != NULL) { in bwi_dma_mbuf_destroy()
2280 bus_dmamap_unload(sc->sc_buf_dtag, in bwi_dma_mbuf_destroy()
2281 tb->tb_dmap); in bwi_dma_mbuf_destroy()
2282 m_freem(tb->tb_mbuf); in bwi_dma_mbuf_destroy()
2284 if (tb->tb_ni != NULL) in bwi_dma_mbuf_destroy()
2285 ieee80211_free_node(tb->tb_ni); in bwi_dma_mbuf_destroy()
2286 bus_dmamap_destroy(sc->sc_buf_dtag, tb->tb_dmap); in bwi_dma_mbuf_destroy()
2291 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_dma_mbuf_destroy()
2293 bus_dmamap_destroy(sc->sc_buf_dtag, rbd->rbd_tmp_dmap); in bwi_dma_mbuf_destroy()
2295 struct bwi_rxbuf *rb = &rbd->rbd_buf[j]; in bwi_dma_mbuf_destroy()
2297 if (rb->rb_mbuf != NULL) { in bwi_dma_mbuf_destroy()
2298 bus_dmamap_unload(sc->sc_buf_dtag, in bwi_dma_mbuf_destroy()
2299 rb->rb_dmap); in bwi_dma_mbuf_destroy()
2300 m_freem(rb->rb_mbuf); in bwi_dma_mbuf_destroy()
2302 bus_dmamap_destroy(sc->sc_buf_dtag, rb->rb_dmap); in bwi_dma_mbuf_destroy()
2306 bus_dma_tag_destroy(sc->sc_buf_dtag); in bwi_dma_mbuf_destroy()
2307 sc->sc_buf_dtag = NULL; in bwi_dma_mbuf_destroy()
2330 rd = &sc->sc_tx_rdata[ring_idx]; in bwi_init_tx_ring32()
2331 tbd = &sc->sc_tx_bdata[ring_idx]; in bwi_init_tx_ring32()
2333 tbd->tbd_idx = 0; in bwi_init_tx_ring32()
2334 tbd->tbd_used = 0; in bwi_init_tx_ring32()
2336 bzero(rd->rdata_desc, sizeof(struct bwi_desc32) * BWI_TX_NDESC); in bwi_init_tx_ring32()
2337 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_init_tx_ring32()
2340 addr_lo = __SHIFTOUT(rd->rdata_paddr, BWI_TXRX32_RINGINFO_ADDR_MASK); in bwi_init_tx_ring32()
2341 addr_hi = __SHIFTOUT(rd->rdata_paddr, BWI_TXRX32_RINGINFO_FUNC_MASK); in bwi_init_tx_ring32()
2346 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_RINGINFO, val); in bwi_init_tx_ring32()
2350 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_CTRL, val); in bwi_init_tx_ring32()
2375 (ndesc - 1) * sizeof(struct bwi_desc32)); in bwi_init_rxdesc_ring32()
2381 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_init_rx_ring32()
2384 sc->sc_rx_bdata.rbd_idx = 0; in bwi_init_rx_ring32()
2389 device_printf(sc->sc_dev, in bwi_init_rx_ring32()
2394 bus_dmamap_sync(sc->sc_rxring_dtag, rd->rdata_dmap, in bwi_init_rx_ring32()
2397 bwi_init_rxdesc_ring32(sc, rd->rdata_txrx_ctrl, rd->rdata_paddr, in bwi_init_rx_ring32()
2405 struct bwi_txstats_data *st = sc->sc_txstats; in bwi_init_txstats32()
2409 bzero(st->stats, BWI_TXSTATS_NDESC * sizeof(struct bwi_txstats)); in bwi_init_txstats32()
2410 bus_dmamap_sync(st->stats_dtag, st->stats_dmap, BUS_DMASYNC_PREWRITE); in bwi_init_txstats32()
2412 st->stats_idx = 0; in bwi_init_txstats32()
2414 stats_paddr = st->stats_paddr; in bwi_init_txstats32()
2416 bwi_setup_desc32(sc, st->stats_ring, BWI_TXSTATS_NDESC, i, in bwi_init_txstats32()
2420 bus_dmamap_sync(st->stats_ring_dtag, st->stats_ring_dmap, in bwi_init_txstats32()
2423 bwi_init_rxdesc_ring32(sc, st->stats_ctrl_base, in bwi_init_txstats32()
2424 st->stats_ring_paddr, 0, BWI_TXSTATS_NDESC); in bwi_init_txstats32()
2432 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_setup_rx_desc32()
2435 bwi_setup_desc32(sc, rd->rdata_desc, BWI_RX_NDESC, buf_idx, in bwi_setup_rx_desc32()
2444 bwi_setup_desc32(sc, rd->rdata_desc, BWI_TX_NDESC, buf_idx, in bwi_setup_tx_desc32()
2489 *((bus_addr_t *)arg) = seg->ds_addr; in bwi_dma_buf_addr()
2496 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_newbuf()
2497 struct bwi_rxbuf *rxbuf = &rbd->rbd_buf[buf_idx]; in bwi_newbuf()
2501 struct mbuf *m; in bwi_newbuf() local
2506 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); in bwi_newbuf()
2507 if (m == NULL) { in bwi_newbuf()
2512 * - Clear RX buffer's header. in bwi_newbuf()
2513 * - Restore RX descriptor settings. in bwi_newbuf()
2520 m->m_len = m->m_pkthdr.len = MCLBYTES; in bwi_newbuf()
2525 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, rbd->rbd_tmp_dmap, m, in bwi_newbuf()
2528 m_freem(m); in bwi_newbuf()
2540 bus_dmamap_unload(sc->sc_buf_dtag, rxbuf->rb_dmap); in bwi_newbuf()
2541 rxbuf->rb_mbuf = m; in bwi_newbuf()
2542 rxbuf->rb_paddr = paddr; in bwi_newbuf()
2547 map = rxbuf->rb_dmap; in bwi_newbuf()
2548 rxbuf->rb_dmap = rbd->rbd_tmp_dmap; in bwi_newbuf()
2549 rbd->rbd_tmp_dmap = map; in bwi_newbuf()
2555 hdr = mtod(rxbuf->rb_mbuf, struct bwi_rxbuf_hdr *); in bwi_newbuf()
2557 bus_dmamap_sync(sc->sc_buf_dtag, rxbuf->rb_dmap, BUS_DMASYNC_PREWRITE); in bwi_newbuf()
2562 sc->sc_setup_rxdesc(sc, buf_idx, rxbuf->rb_paddr, in bwi_newbuf()
2563 rxbuf->rb_mbuf->m_len - sizeof(*hdr)); in bwi_newbuf()
2588 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_rxeof()
2589 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_rxeof()
2590 struct ieee80211com *ic = &sc->sc_ic; in bwi_rxeof()
2593 idx = rbd->rbd_idx; in bwi_rxeof()
2595 struct bwi_rxbuf *rb = &rbd->rbd_buf[idx]; in bwi_rxeof()
2599 struct mbuf *m; in bwi_rxeof() local
2604 m = rb->rb_mbuf; in bwi_rxeof()
2605 bus_dmamap_sync(sc->sc_buf_dtag, rb->rb_dmap, in bwi_rxeof()
2609 counter_u64_add(ic->ic_ierrors, 1); in bwi_rxeof()
2613 hdr = mtod(m, struct bwi_rxbuf_hdr *); in bwi_rxeof()
2614 flags2 = le16toh(hdr->rxh_flags2); in bwi_rxeof()
2621 buflen = le16toh(hdr->rxh_buflen); in bwi_rxeof()
2623 device_printf(sc->sc_dev, in bwi_rxeof()
2626 counter_u64_add(ic->ic_ierrors, 1); in bwi_rxeof()
2627 m_freem(m); in bwi_rxeof()
2635 m->m_len = m->m_pkthdr.len = buflen + sizeof(*hdr); in bwi_rxeof()
2636 m_adj(m, sizeof(*hdr) + wh_ofs); in bwi_rxeof()
2638 if (htole16(hdr->rxh_flags1) & BWI_RXH_F1_OFDM) in bwi_rxeof()
2645 bwi_rx_radiotap(sc, m, hdr, &plcp, rate, rssi, noise); in bwi_rxeof()
2647 m_adj(m, -IEEE80211_CRC_LEN); in bwi_rxeof()
2651 wh = mtod(m, struct ieee80211_frame_min *); in bwi_rxeof()
2654 type = ieee80211_input(ni, m, rssi - noise, noise); in bwi_rxeof()
2657 type = ieee80211_input_all(ic, m, rssi - noise, noise); in bwi_rxeof()
2660 sc->sc_rx_rate = rate; in bwi_rxeof()
2667 if (sc->sc_flags & BWI_F_STOP) { in bwi_rxeof()
2672 return -1; in bwi_rxeof()
2676 rbd->rbd_idx = idx; in bwi_rxeof()
2677 bus_dmamap_sync(sc->sc_rxring_dtag, rd->rdata_dmap, in bwi_rxeof()
2689 rx_ctrl = sc->sc_rx_rdata.rdata_txrx_ctrl; in bwi_rxeof32()
2730 device_printf(sc->sc_dev, "reset rx ring timedout\n"); in bwi_reset_rx_ring32()
2740 bwi_reset_rx_ring32(sc, sc->sc_txstats->stats_ctrl_base); in bwi_free_txstats32()
2746 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_free_rx_ring32()
2747 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_free_rx_ring32()
2750 bwi_reset_rx_ring32(sc, rd->rdata_txrx_ctrl); in bwi_free_rx_ring32()
2753 struct bwi_rxbuf *rb = &rbd->rbd_buf[i]; in bwi_free_rx_ring32()
2755 if (rb->rb_mbuf != NULL) { in bwi_free_rx_ring32()
2756 bus_dmamap_unload(sc->sc_buf_dtag, rb->rb_dmap); in bwi_free_rx_ring32()
2757 m_freem(rb->rb_mbuf); in bwi_free_rx_ring32()
2758 rb->rb_mbuf = NULL; in bwi_free_rx_ring32()
2772 rd = &sc->sc_tx_rdata[ring_idx]; in bwi_free_tx_ring32()
2773 tbd = &sc->sc_tx_bdata[ring_idx]; in bwi_free_tx_ring32()
2778 val = CSR_READ_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_STATUS); in bwi_free_tx_ring32()
2788 device_printf(sc->sc_dev, in bwi_free_tx_ring32()
2789 "%s: wait for TX ring(%d) stable timed out\n", in bwi_free_tx_ring32()
2793 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_CTRL, 0); in bwi_free_tx_ring32()
2795 val = CSR_READ_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_STATUS); in bwi_free_tx_ring32()
2803 device_printf(sc->sc_dev, "%s: reset TX ring (%d) timed out\n", in bwi_free_tx_ring32()
2810 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_RINGINFO, 0); in bwi_free_tx_ring32()
2813 struct bwi_txbuf *tb = &tbd->tbd_buf[i]; in bwi_free_tx_ring32()
2815 if (tb->tb_mbuf != NULL) { in bwi_free_tx_ring32()
2816 bus_dmamap_unload(sc->sc_buf_dtag, tb->tb_dmap); in bwi_free_tx_ring32()
2817 m_freem(tb->tb_mbuf); in bwi_free_tx_ring32()
2818 tb->tb_mbuf = NULL; in bwi_free_tx_ring32()
2820 if (tb->tb_ni != NULL) { in bwi_free_tx_ring32()
2821 ieee80211_free_node(tb->tb_ni); in bwi_free_tx_ring32()
2822 tb->tb_ni = NULL; in bwi_free_tx_ring32()
2875 * if TX rate is 11Mbytes/s in bwi_ds_plcp_header()
2878 if (pkt_bitlen1 - pkt_bitlen >= NBBY) in bwi_ds_plcp_header()
2882 plcp->i_signal = ieee80211_rate2plcp(rate, IEEE80211_T_CCK); in bwi_ds_plcp_header()
2883 plcp->i_service = service; in bwi_ds_plcp_header()
2884 plcp->i_length = htole16(len); in bwi_ds_plcp_header()
2907 bwi_encap(struct bwi_softc *sc, int idx, struct mbuf *m, in bwi_encap() argument
2910 struct ieee80211vap *vap = ni->ni_vap; in bwi_encap()
2911 struct ieee80211com *ic = &sc->sc_ic; in bwi_encap()
2912 struct bwi_ring_data *rd = &sc->sc_tx_rdata[BWI_TX_DATA_RING]; in bwi_encap()
2913 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_encap()
2914 struct bwi_txbuf *tb = &tbd->tbd_buf[idx]; in bwi_encap()
2918 const struct ieee80211_txparam *tp = ni->ni_txparms; in bwi_encap()
2929 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_encap()
2930 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_encap()
2931 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_encap()
2933 wh = mtod(m, struct ieee80211_frame *); in bwi_encap()
2934 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in bwi_encap()
2935 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in bwi_encap()
2937 /* Get 802.11 frame len before prepending TX header */ in bwi_encap()
2938 pkt_len = m->m_pkthdr.len + IEEE80211_CRC_LEN; in bwi_encap()
2941 * Find TX rate in bwi_encap()
2943 if (type != IEEE80211_FC0_TYPE_DATA || (m->m_flags & M_EAPOL)) { in bwi_encap()
2944 rate = rate_fb = tp->mgmtrate; in bwi_encap()
2946 rate = rate_fb = tp->mcastrate; in bwi_encap()
2947 } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { in bwi_encap()
2948 rate = rate_fb = tp->ucastrate; in bwi_encap()
2955 tb->tb_rate[0] = rate; in bwi_encap()
2956 tb->tb_rate[1] = rate_fb; in bwi_encap()
2957 sc->sc_tx_rate = rate; in bwi_encap()
2960 * TX radio tap in bwi_encap()
2963 sc->sc_tx_th.wt_flags = 0; in bwi_encap()
2964 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_encap()
2965 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_encap()
2966 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_DS && in bwi_encap()
2967 (ic->ic_flags & IEEE80211_F_SHPREAMBLE) && in bwi_encap()
2969 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_encap()
2971 sc->sc_tx_th.wt_rate = rate; in bwi_encap()
2973 ieee80211_radiotap_tx(vap, m); in bwi_encap()
2977 * Setup the embedded TX header in bwi_encap()
2979 M_PREPEND(m, sizeof(*hdr), M_NOWAIT); in bwi_encap()
2980 if (m == NULL) { in bwi_encap()
2981 device_printf(sc->sc_dev, "%s: prepend TX header failed\n", in bwi_encap()
2985 hdr = mtod(m, struct bwi_txbuf_hdr *); in bwi_encap()
2989 bcopy(wh->i_fc, hdr->txh_fc, sizeof(hdr->txh_fc)); in bwi_encap()
2990 bcopy(wh->i_addr1, hdr->txh_addr1, sizeof(hdr->txh_addr1)); in bwi_encap()
2995 dur = ieee80211_ack_duration(sc->sc_rates, rate, in bwi_encap()
2996 ic->ic_flags & ~IEEE80211_F_SHPREAMBLE); in bwi_encap()
2998 hdr->txh_fb_duration = htole16(dur); in bwi_encap()
3001 hdr->txh_id = __SHIFTIN(BWI_TX_DATA_RING, BWI_TXH_ID_RING_MASK) | in bwi_encap()
3004 bwi_plcp_header(sc->sc_rates, hdr->txh_plcp, pkt_len, rate); in bwi_encap()
3005 bwi_plcp_header(sc->sc_rates, hdr->txh_fb_plcp, pkt_len, rate_fb); in bwi_encap()
3007 phy_ctrl = __SHIFTIN(mac->mac_rf.rf_ant_mode, in bwi_encap()
3009 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM) in bwi_encap()
3011 else if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && rate != (2 * 1)) in bwi_encap()
3017 if (ieee80211_rate2phytype(sc->sc_rates, rate_fb) == IEEE80211_T_OFDM) in bwi_encap()
3020 hdr->txh_mac_ctrl = htole32(mac_ctrl); in bwi_encap()
3021 hdr->txh_phy_ctrl = htole16(phy_ctrl); in bwi_encap()
3028 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap()
3031 device_printf(sc->sc_dev, "%s: can't load TX buffer (1) %d\n", in bwi_encap()
3039 m_new = m_defrag(m, M_NOWAIT); in bwi_encap()
3041 device_printf(sc->sc_dev, in bwi_encap()
3042 "%s: can't defrag TX buffer\n", __func__); in bwi_encap()
3046 m = m_new; in bwi_encap()
3049 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap()
3053 device_printf(sc->sc_dev, in bwi_encap()
3054 "%s: can't load TX buffer (2) %d\n", in bwi_encap()
3061 bus_dmamap_sync(sc->sc_buf_dtag, tb->tb_dmap, BUS_DMASYNC_PREWRITE); in bwi_encap()
3063 tb->tb_mbuf = m; in bwi_encap()
3064 tb->tb_ni = ni; in bwi_encap()
3067 p = mtod(m, const uint8_t *); in bwi_encap()
3068 for (i = 0; i < m->m_pkthdr.len; ++i) { in bwi_encap()
3076 idx, pkt_len, m->m_pkthdr.len); in bwi_encap()
3078 /* Setup TX descriptor */ in bwi_encap()
3079 sc->sc_setup_txdesc(sc, rd, idx, paddr, m->m_pkthdr.len); in bwi_encap()
3080 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_encap()
3084 sc->sc_start_tx(sc, rd->rdata_txrx_ctrl, idx); in bwi_encap()
3088 m_freem(m); in bwi_encap()
3093 bwi_encap_raw(struct bwi_softc *sc, int idx, struct mbuf *m, in bwi_encap_raw() argument
3096 struct ieee80211vap *vap = ni->ni_vap; in bwi_encap_raw()
3097 struct ieee80211com *ic = ni->ni_ic; in bwi_encap_raw()
3098 struct bwi_ring_data *rd = &sc->sc_tx_rdata[BWI_TX_DATA_RING]; in bwi_encap_raw()
3099 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_encap_raw()
3100 struct bwi_txbuf *tb = &tbd->tbd_buf[idx]; in bwi_encap_raw()
3110 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_encap_raw()
3111 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_encap_raw()
3112 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_encap_raw()
3114 wh = mtod(m, struct ieee80211_frame *); in bwi_encap_raw()
3115 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in bwi_encap_raw()
3117 /* Get 802.11 frame len before prepending TX header */ in bwi_encap_raw()
3118 pkt_len = m->m_pkthdr.len + IEEE80211_CRC_LEN; in bwi_encap_raw()
3121 * Find TX rate in bwi_encap_raw()
3123 rate = params->ibp_rate0; in bwi_encap_raw()
3124 if (!ieee80211_isratevalid(ic->ic_rt, rate)) { in bwi_encap_raw()
3126 m_freem(m); in bwi_encap_raw()
3129 if (params->ibp_try1 != 0) { in bwi_encap_raw()
3130 rate_fb = params->ibp_rate1; in bwi_encap_raw()
3131 if (!ieee80211_isratevalid(ic->ic_rt, rate_fb)) { in bwi_encap_raw()
3133 m_freem(m); in bwi_encap_raw()
3138 tb->tb_rate[0] = rate; in bwi_encap_raw()
3139 tb->tb_rate[1] = rate_fb; in bwi_encap_raw()
3140 sc->sc_tx_rate = rate; in bwi_encap_raw()
3143 * TX radio tap in bwi_encap_raw()
3146 sc->sc_tx_th.wt_flags = 0; in bwi_encap_raw()
3148 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_encap_raw()
3149 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_encap_raw()
3150 if (params->ibp_flags & IEEE80211_BPF_SHORTPRE) in bwi_encap_raw()
3151 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_encap_raw()
3152 sc->sc_tx_th.wt_rate = rate; in bwi_encap_raw()
3154 ieee80211_radiotap_tx(vap, m); in bwi_encap_raw()
3158 * Setup the embedded TX header in bwi_encap_raw()
3160 M_PREPEND(m, sizeof(*hdr), M_NOWAIT); in bwi_encap_raw()
3161 if (m == NULL) { in bwi_encap_raw()
3162 device_printf(sc->sc_dev, "%s: prepend TX header failed\n", in bwi_encap_raw()
3166 hdr = mtod(m, struct bwi_txbuf_hdr *); in bwi_encap_raw()
3170 bcopy(wh->i_fc, hdr->txh_fc, sizeof(hdr->txh_fc)); in bwi_encap_raw()
3171 bcopy(wh->i_addr1, hdr->txh_addr1, sizeof(hdr->txh_addr1)); in bwi_encap_raw()
3174 if (!ismcast && (params->ibp_flags & IEEE80211_BPF_NOACK) == 0) { in bwi_encap_raw()
3177 dur = ieee80211_ack_duration(sc->sc_rates, rate_fb, 0); in bwi_encap_raw()
3179 hdr->txh_fb_duration = htole16(dur); in bwi_encap_raw()
3183 hdr->txh_id = __SHIFTIN(BWI_TX_DATA_RING, BWI_TXH_ID_RING_MASK) | in bwi_encap_raw()
3186 bwi_plcp_header(sc->sc_rates, hdr->txh_plcp, pkt_len, rate); in bwi_encap_raw()
3187 bwi_plcp_header(sc->sc_rates, hdr->txh_fb_plcp, pkt_len, rate_fb); in bwi_encap_raw()
3189 phy_ctrl = __SHIFTIN(mac->mac_rf.rf_ant_mode, in bwi_encap_raw()
3191 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM) { in bwi_encap_raw()
3194 } else if (params->ibp_flags & IEEE80211_BPF_SHORTPRE) in bwi_encap_raw()
3197 hdr->txh_mac_ctrl = htole32(mac_ctrl); in bwi_encap_raw()
3198 hdr->txh_phy_ctrl = htole16(phy_ctrl); in bwi_encap_raw()
3205 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap_raw()
3211 device_printf(sc->sc_dev, in bwi_encap_raw()
3212 "%s: can't load TX buffer (1) %d\n", in bwi_encap_raw()
3216 m_new = m_defrag(m, M_NOWAIT); in bwi_encap_raw()
3218 device_printf(sc->sc_dev, in bwi_encap_raw()
3219 "%s: can't defrag TX buffer\n", __func__); in bwi_encap_raw()
3223 m = m_new; in bwi_encap_raw()
3224 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap_raw()
3228 device_printf(sc->sc_dev, in bwi_encap_raw()
3229 "%s: can't load TX buffer (2) %d\n", in bwi_encap_raw()
3235 bus_dmamap_sync(sc->sc_buf_dtag, tb->tb_dmap, BUS_DMASYNC_PREWRITE); in bwi_encap_raw()
3237 tb->tb_mbuf = m; in bwi_encap_raw()
3238 tb->tb_ni = ni; in bwi_encap_raw()
3241 idx, pkt_len, m->m_pkthdr.len); in bwi_encap_raw()
3243 /* Setup TX descriptor */ in bwi_encap_raw()
3244 sc->sc_setup_txdesc(sc, rd, idx, paddr, m->m_pkthdr.len); in bwi_encap_raw()
3245 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_encap_raw()
3249 sc->sc_start_tx(sc, rd->rdata_txrx_ctrl, idx); in bwi_encap_raw()
3252 m_freem(m); in bwi_encap_raw()
3276 ctrl_base = sc->sc_txstats->stats_ctrl_base; in bwi_txeof_status32()
3305 device_printf(sc->sc_dev, "%s: zero tx id\n", __func__); in _bwi_txeof()
3315 tbd = &sc->sc_tx_bdata[ring_idx]; in _bwi_txeof()
3316 KASSERT(tbd->tbd_used > 0, ("tbd_used %d", tbd->tbd_used)); in _bwi_txeof()
3317 tbd->tbd_used--; in _bwi_txeof()
3319 tb = &tbd->tbd_buf[buf_idx]; in _bwi_txeof()
3322 buf_idx, acked, data_txcnt, tb->tb_ni); in _bwi_txeof()
3324 bus_dmamap_unload(sc->sc_buf_dtag, tb->tb_dmap); in _bwi_txeof()
3326 if ((ni = tb->tb_ni) != NULL) { in _bwi_txeof()
3328 mtod(tb->tb_mbuf, const struct bwi_txbuf_hdr *); in _bwi_txeof()
3332 if (hdr->txh_mac_ctrl & htole32(BWI_TXH_MAC_C_ACK)) { in _bwi_txeof()
3335 * generic AMRR code only understands one tx rate in _bwi_txeof()
3337 * well so to avoid over-aggressive downshifting we in _bwi_txeof()
3350 ieee80211_tx_complete(ni, tb->tb_mbuf, !acked); in _bwi_txeof()
3351 tb->tb_ni = NULL; in _bwi_txeof()
3353 m_freem(tb->tb_mbuf); in _bwi_txeof()
3354 tb->tb_mbuf = NULL; in _bwi_txeof()
3356 if (tbd->tbd_used == 0) in _bwi_txeof()
3357 sc->sc_tx_timer = 0; in _bwi_txeof()
3363 struct bwi_txstats_data *st = sc->sc_txstats; in bwi_txeof_status()
3366 bus_dmamap_sync(st->stats_dtag, st->stats_dmap, BUS_DMASYNC_POSTREAD); in bwi_txeof_status()
3368 idx = st->stats_idx; in bwi_txeof_status()
3370 const struct bwi_txstats *stats = &st->stats[idx]; in bwi_txeof_status()
3372 if ((stats->txs_flags & BWI_TXS_F_PENDING) == 0) { in bwi_txeof_status()
3375 data_txcnt = __SHIFTOUT(stats->txs_txcnt, in bwi_txeof_status()
3377 _bwi_txeof(sc, le16toh(stats->txs_id), in bwi_txeof_status()
3378 stats->txs_flags & BWI_TXS_F_ACKED, in bwi_txeof_status()
3383 st->stats_idx = idx; in bwi_txeof_status()
3436 com = &sc->sc_com_regwin; in bwi_get_pwron_delay()
3439 if ((sc->sc_cap & BWI_CAP_CLKMODE) == 0) in bwi_get_pwron_delay()
3449 sc->sc_pwron_delay = howmany((val + 2) * 1000000, freq.clkfreq_min); in bwi_get_pwron_delay()
3450 DPRINTF(sc, BWI_DBG_ATTACH, "power on delay %u\n", sc->sc_pwron_delay); in bwi_get_pwron_delay()
3461 bus = &sc->sc_bus_regwin; in bwi_bus_attach()
3479 switch (rw->rw_type) { in bwi_regwin_name()
3489 panic("unknown regwin type 0x%04x\n", rw->rw_type); in bwi_regwin_name()
3568 device_printf(sc->sc_dev, "%s disable clock timeout\n", in bwi_regwin_disable()
3581 device_printf(sc->sc_dev, "%s wait BUSY unset timeout\n", in bwi_regwin_disable()
3665 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_set_bssid()
3666 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_set_bssid()
3667 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_set_bssid()
3671 bcopy(sc->sc_ic.ic_macaddr, buf.myaddr, sizeof(buf.myaddr)); in bwi_set_bssid()
3690 struct bwi_softc *sc = ic->ic_softc; in bwi_updateslot()
3694 if (sc->sc_flags & BWI_F_RUNNING) { in bwi_updateslot()
3697 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_updateslot()
3698 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_updateslot()
3699 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_updateslot()
3701 bwi_mac_updateslot(mac, (ic->ic_flags & IEEE80211_F_SHSLOT)); in bwi_updateslot()
3714 KASSERT(sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR, in bwi_calibrate()
3715 ("opmode %d", sc->sc_ic.ic_opmode)); in bwi_calibrate()
3717 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calibrate()
3718 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calibrate()
3719 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calibrate()
3721 bwi_mac_calibrate_txpower(mac, sc->sc_txpwrcb_type); in bwi_calibrate()
3722 sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; in bwi_calibrate()
3725 callout_reset(&sc->sc_calib_ch, hz * 15, bwi_calibrate, sc); in bwi_calibrate()
3733 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calc_rssi()
3734 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calc_rssi()
3735 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calc_rssi()
3745 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calc_noise()
3746 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calc_noise()
3747 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calc_noise()
3760 bwi_rx_radiotap(struct bwi_softc *sc, struct mbuf *m, in bwi_rx_radiotap() argument
3765 sc->sc_rx_th.wr_flags = IEEE80211_RADIOTAP_F_FCS; in bwi_rx_radiotap()
3766 if (htole16(hdr->rxh_flags1) & BWI_RXH_F1_SHPREAMBLE) in bwi_rx_radiotap()
3767 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_rx_radiotap()
3769 wh = mtod(m, const struct ieee80211_frame_min *); in bwi_rx_radiotap()
3770 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_rx_radiotap()
3771 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_rx_radiotap()
3773 sc->sc_rx_th.wr_tsf = hdr->rxh_tsf; /* No endian conversion */ in bwi_rx_radiotap()
3774 sc->sc_rx_th.wr_rate = rate; in bwi_rx_radiotap()
3775 sc->sc_rx_th.wr_antsignal = rssi; in bwi_rx_radiotap()
3776 sc->sc_rx_th.wr_antnoise = noise; in bwi_rx_radiotap()
3787 if (sc->sc_pci_subvid == bwi_vendor_led_act[i].vid) { in bwi_led_attach()
3804 struct bwi_led *led = &sc->sc_leds[i]; in bwi_led_attach()
3807 led->l_act = led_act[i]; in bwi_led_attach()
3810 led->l_flags |= BWI_LED_F_ACTLOW; in bwi_led_attach()
3811 led->l_act = __SHIFTOUT(val[i], BWI_LED_ACT_MASK); in bwi_led_attach()
3813 led->l_mask = (1 << i); in bwi_led_attach()
3815 if (led->l_act == BWI_LED_ACT_BLINK_SLOW || in bwi_led_attach()
3816 led->l_act == BWI_LED_ACT_BLINK_POLL || in bwi_led_attach()
3817 led->l_act == BWI_LED_ACT_BLINK) { in bwi_led_attach()
3818 led->l_flags |= BWI_LED_F_BLINK; in bwi_led_attach()
3819 if (led->l_act == BWI_LED_ACT_BLINK_POLL) in bwi_led_attach()
3820 led->l_flags |= BWI_LED_F_POLLABLE; in bwi_led_attach()
3821 else if (led->l_act == BWI_LED_ACT_BLINK_SLOW) in bwi_led_attach()
3822 led->l_flags |= BWI_LED_F_SLOW; in bwi_led_attach()
3824 if (sc->sc_blink_led == NULL) { in bwi_led_attach()
3825 sc->sc_blink_led = led; in bwi_led_attach()
3826 if (led->l_flags & BWI_LED_F_SLOW) in bwi_led_attach()
3827 BWI_LED_SLOWDOWN(sc->sc_led_idle); in bwi_led_attach()
3833 led->l_act, led->l_flags & BWI_LED_F_ACTLOW); in bwi_led_attach()
3835 callout_init_mtx(&sc->sc_led_blink_ch, &sc->sc_mtx, 0); in bwi_led_attach()
3841 if (led->l_flags & BWI_LED_F_ACTLOW) in bwi_led_onoff()
3844 val |= led->l_mask; in bwi_led_onoff()
3846 val &= ~led->l_mask; in bwi_led_onoff()
3853 struct ieee80211com *ic = &sc->sc_ic; in bwi_led_newstate()
3858 callout_stop(&sc->sc_led_blink_ch); in bwi_led_newstate()
3859 sc->sc_led_blinking = 0; in bwi_led_newstate()
3862 if ((sc->sc_flags & BWI_F_RUNNING) == 0) in bwi_led_newstate()
3867 struct bwi_led *led = &sc->sc_leds[i]; in bwi_led_newstate()
3870 if (led->l_act == BWI_LED_ACT_UNKN || in bwi_led_newstate()
3871 led->l_act == BWI_LED_ACT_NULL) in bwi_led_newstate()
3874 if ((led->l_flags & BWI_LED_F_BLINK) && in bwi_led_newstate()
3878 switch (led->l_act) { in bwi_led_newstate()
3893 if (led->l_act == BWI_LED_ACT_11G && in bwi_led_newstate()
3894 ic->ic_curmode != IEEE80211_MODE_11G) in bwi_led_newstate()
3898 if (led->l_act == BWI_LED_ACT_ASSOC) in bwi_led_newstate()
3912 struct bwi_led *led = sc->sc_blink_led; in bwi_led_event()
3916 if ((led->l_flags & BWI_LED_F_POLLABLE) == 0) in bwi_led_event()
3918 if (ticks - sc->sc_led_ticks < sc->sc_led_idle) in bwi_led_event()
3922 sc->sc_led_ticks = ticks; in bwi_led_event()
3923 if (sc->sc_led_blinking) in bwi_led_event()
3928 rate = sc->sc_rx_rate; in bwi_led_event()
3931 rate = sc->sc_tx_rate; in bwi_led_event()
3947 struct bwi_led *led = sc->sc_blink_led; in bwi_led_blink_start()
3954 if (led->l_flags & BWI_LED_F_SLOW) { in bwi_led_blink_start()
3959 sc->sc_led_blinking = 1; in bwi_led_blink_start()
3960 sc->sc_led_blink_offdur = off_dur; in bwi_led_blink_start()
3962 callout_reset(&sc->sc_led_blink_ch, on_dur, bwi_led_blink_next, sc); in bwi_led_blink_start()
3972 val = bwi_led_onoff(sc->sc_blink_led, val, 0); in bwi_led_blink_next()
3975 callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, in bwi_led_blink_next()
3983 sc->sc_led_blinking = 0; in bwi_led_blink_end()
3991 device_printf(sc->sc_dev, "%s begin, help!\n", __func__); in bwi_restart()