Lines Matching +full:led +full:- +full:7 +full:seg
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
245 { 0x5365, 7 }
304 [108] = { 7, 3 }
340 if (desc_idx == ndesc - 1) 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()
503 ic->ic_headroom = sizeof(struct bwi_txbuf_hdr); in bwi_attach()
506 ic->ic_vap_create = bwi_vap_create; in bwi_attach()
507 ic->ic_vap_delete = bwi_vap_delete; in bwi_attach()
508 ic->ic_raw_xmit = bwi_raw_xmit; in bwi_attach()
509 ic->ic_updateslot = bwi_updateslot; in bwi_attach()
510 ic->ic_scan_start = bwi_scan_start; in bwi_attach()
511 ic->ic_scan_end = bwi_scan_end; in bwi_attach()
512 ic->ic_getradiocaps = bwi_getradiocaps; in bwi_attach()
513 ic->ic_set_channel = bwi_set_channel; in bwi_attach()
514 ic->ic_transmit = bwi_transmit; in bwi_attach()
515 ic->ic_parent = bwi_parent; in bwi_attach()
517 sc->sc_rates = ieee80211_get_ratetable(ic->ic_curchan); in bwi_attach()
520 &sc->sc_tx_th.wt_ihdr, sizeof(sc->sc_tx_th), in bwi_attach()
522 &sc->sc_rx_th.wr_ihdr, sizeof(sc->sc_rx_th), in bwi_attach()
530 "fw_version", CTLFLAG_RD, &sc->sc_fw_version, 0, in bwi_attach()
534 "led_idle", CTLFLAG_RW, &sc->sc_led_idle, 0, in bwi_attach()
535 "# ticks before LED enters idle state"); in bwi_attach()
538 "led_blink", CTLFLAG_RW, &sc->sc_led_blink, 0, in bwi_attach()
539 "Allow LED to blink"); in bwi_attach()
542 "txpwr_calib", CTLFLAG_RW, &sc->sc_txpwr_calib, 0, in bwi_attach()
547 "debug", CTLFLAG_RW, &sc->sc_debug, 0, "Debug flags"); in bwi_attach()
561 struct ieee80211com *ic = &sc->sc_ic; in bwi_detach()
565 callout_drain(&sc->sc_led_blink_ch); in bwi_detach()
566 callout_drain(&sc->sc_calib_ch); in bwi_detach()
567 callout_drain(&sc->sc_watchdog_timer); in bwi_detach()
570 for (i = 0; i < sc->sc_nmac; ++i) in bwi_detach()
571 bwi_mac_detach(&sc->sc_mac[i]); in bwi_detach()
573 taskqueue_free(sc->sc_tq); in bwi_detach()
574 mbufq_drain(&sc->sc_snd); in bwi_detach()
590 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ in bwi_vap_create()
593 vap = &bvp->bv_vap; in bwi_vap_create()
599 bvp->bv_newstate = vap->iv_newstate; in bwi_vap_create()
600 vap->iv_newstate = bwi_newstate; in bwi_vap_create()
602 vap->iv_update_beacon = bwi_beacon_update; in bwi_vap_create()
609 ic->ic_opmode = opmode; in bwi_vap_create()
633 if (sc->sc_ic.ic_nrunning > 0) in bwi_resume()
650 gpio_in = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_IN, 4); in bwi_power_on()
654 gpio_out = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_power_on()
655 gpio_en = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, 4); in bwi_power_on()
665 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_on()
666 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, gpio_en, 4); in bwi_power_on()
672 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_on()
678 status = pci_read_config(sc->sc_dev, PCIR_STATUS, 2); in bwi_power_on()
680 pci_write_config(sc->sc_dev, PCIR_STATUS, status, 2); in bwi_power_on()
688 pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_IN, 4); /* dummy read */ in bwi_power_off()
689 gpio_out = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_power_off()
690 gpio_en = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, 4); in bwi_power_off()
699 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, gpio_out, 4); in bwi_power_off()
700 pci_write_config(sc->sc_dev, BWI_PCIR_GPIO_ENABLE, gpio_en, 4); in bwi_power_off()
716 if (sc->sc_cur_regwin != rw) { in bwi_regwin_switch()
717 error = bwi_regwin_select(sc, rw->rw_id); in bwi_regwin_switch()
719 device_printf(sc->sc_dev, "can't select regwin %d\n", in bwi_regwin_switch()
720 rw->rw_id); in bwi_regwin_switch()
726 *old_rw = sc->sc_cur_regwin; in bwi_regwin_switch()
727 sc->sc_cur_regwin = rw; in bwi_regwin_switch()
739 pci_write_config(sc->sc_dev, BWI_PCIR_SEL_REGWIN, win, 4); in bwi_regwin_select()
740 if (pci_read_config(sc->sc_dev, BWI_PCIR_SEL_REGWIN, 4) == win) in bwi_regwin_select()
777 device_printf(sc->sc_dev, "can't select regwin 0\n"); in bwi_bbp_attach()
791 BWI_CREATE_REGWIN(&sc->sc_com_regwin, 0, rw_type, rw_rev); in bwi_bbp_attach()
793 sc->sc_cap = CSR_READ_4(sc, BWI_CAPABILITY); in bwi_bbp_attach()
796 if (sc->sc_pci_did >= bwi_bbpid_map[i].did_min && in bwi_bbp_attach()
797 sc->sc_pci_did <= bwi_bbpid_map[i].did_max) { in bwi_bbp_attach()
803 device_printf(sc->sc_dev, "no BBP id for device id " in bwi_bbp_attach()
804 "0x%04x\n", sc->sc_pci_did); in bwi_bbp_attach()
808 info = __SHIFTIN(sc->sc_pci_revid, BWI_INFO_BBPREV_MASK) | in bwi_bbp_attach()
826 device_printf(sc->sc_dev, "no number of win for " in bwi_bbp_attach()
833 sc->sc_bbp_id = bbp_id; in bwi_bbp_attach()
834 sc->sc_bbp_rev = __SHIFTOUT(info, BWI_INFO_BBPREV_MASK); in bwi_bbp_attach()
835 sc->sc_bbp_pkg = __SHIFTOUT(info, BWI_INFO_BBPPKG_MASK); in bwi_bbp_attach()
836 device_printf(sc->sc_dev, "BBP: id 0x%04x, rev 0x%x, pkg %d\n", in bwi_bbp_attach()
837 sc->sc_bbp_id, sc->sc_bbp_rev, sc->sc_bbp_pkg); in bwi_bbp_attach()
840 nregwin, sc->sc_cap); in bwi_bbp_attach()
846 /* Don't re-create common regwin, if it is already created */ in bwi_bbp_attach()
847 i = BWI_REGWIN_EXIST(&sc->sc_com_regwin) ? 1 : 0; in bwi_bbp_attach()
855 device_printf(sc->sc_dev, in bwi_bbp_attach()
869 if (BWI_REGWIN_EXIST(&sc->sc_bus_regwin)) { in bwi_bbp_attach()
870 device_printf(sc->sc_dev, in bwi_bbp_attach()
873 BWI_CREATE_REGWIN(&sc->sc_bus_regwin, i, in bwi_bbp_attach()
883 if (!BWI_REGWIN_EXIST(&sc->sc_mac[0].mac_regwin)) { in bwi_bbp_attach()
884 device_printf(sc->sc_dev, "no MAC was found\n"); in bwi_bbp_attach()
887 KASSERT(sc->sc_nmac > 0, ("no mac's")); in bwi_bbp_attach()
890 if (!BWI_REGWIN_EXIST(&sc->sc_bus_regwin)) { in bwi_bbp_attach()
891 device_printf(sc->sc_dev, "no bus regwin was found\n"); in bwi_bbp_attach()
896 error = bwi_regwin_switch(sc, &sc->sc_mac[0].mac_regwin, NULL); in bwi_bbp_attach()
910 bus = &sc->sc_bus_regwin; in bwi_bus_init()
911 KASSERT(sc->sc_cur_regwin == &mac->mac_regwin, ("not cur regwin")); in bwi_bus_init()
916 if (bus->rw_rev < 6 && bus->rw_type == BWI_REGWIN_T_BUSPCI) { in bwi_bus_init()
930 mac_mask = 1 << mac->mac_id; in bwi_bus_init()
936 val = pci_read_config(sc->sc_dev, BWI_PCIR_INTCTL, 4); in bwi_bus_init()
938 pci_write_config(sc->sc_dev, BWI_PCIR_INTCTL, val, 4); in bwi_bus_init()
941 if (sc->sc_flags & BWI_F_BUS_INITED) in bwi_bus_init()
944 if (bus->rw_type == BWI_REGWIN_T_BUSPCI) { in bwi_bus_init()
951 if (bus->rw_rev < 5) { in bwi_bus_init()
952 struct bwi_regwin *com = &sc->sc_com_regwin; in bwi_bus_init()
986 } else if (bus->rw_rev >= 11) { in bwi_bus_init()
996 sc->sc_flags |= BWI_F_BUS_INITED; in bwi_bus_init()
1006 sc->sc_card_flags = bwi_read_sprom(sc, BWI_SPROM_CARD_FLAGS); in bwi_get_card_flags()
1007 if (sc->sc_card_flags == 0xffff) in bwi_get_card_flags()
1008 sc->sc_card_flags = 0; in bwi_get_card_flags()
1010 if (sc->sc_pci_subvid == PCI_VENDOR_DELL && in bwi_get_card_flags()
1011 sc->sc_bbp_id == BWI_BBPID_BCM4301 && in bwi_get_card_flags()
1012 sc->sc_pci_revid == 0x74) in bwi_get_card_flags()
1013 sc->sc_card_flags |= BWI_CARD_F_BT_COEXIST; in bwi_get_card_flags()
1015 if (sc->sc_pci_subvid == PCI_VENDOR_APPLE && in bwi_get_card_flags()
1016 sc->sc_pci_subdid == 0x4e && /* XXX */ in bwi_get_card_flags()
1017 sc->sc_pci_revid > 0x40) in bwi_get_card_flags()
1018 sc->sc_card_flags |= BWI_CARD_F_PA_GPIO9; in bwi_get_card_flags()
1020 DPRINTF(sc, BWI_DBG_ATTACH, "card flags 0x%04x\n", sc->sc_card_flags); in bwi_get_card_flags()
1045 com = &sc->sc_com_regwin; in bwi_get_clock_freq()
1048 KASSERT(sc->sc_cur_regwin == com, ("wrong regwin")); in bwi_get_clock_freq()
1049 KASSERT(sc->sc_cap & BWI_CAP_CLKMODE, ("wrong clock mode")); in bwi_get_clock_freq()
1054 src = -1; in bwi_get_clock_freq()
1056 if (com->rw_rev < 6) { in bwi_get_clock_freq()
1057 val = pci_read_config(sc->sc_dev, BWI_PCIR_GPIO_OUT, 4); in bwi_get_clock_freq()
1065 } else if (com->rw_rev < 10) { in bwi_get_clock_freq()
1092 freq->clkfreq_min = bwi_clkfreq[src].freq_min / div; in bwi_get_clock_freq()
1093 freq->clkfreq_max = bwi_clkfreq[src].freq_max / div; in bwi_get_clock_freq()
1096 freq->clkfreq_min, freq->clkfreq_max); in bwi_get_clock_freq()
1106 com = &sc->sc_com_regwin; in bwi_set_clock_mode()
1110 if (com->rw_rev >= 10 || com->rw_rev < 6) in bwi_set_clock_mode()
1117 if ((sc->sc_cap & BWI_CAP_CLKMODE) == 0) in bwi_set_clock_mode()
1162 com = &sc->sc_com_regwin; in bwi_set_clock_delay()
1170 if (sc->sc_bbp_id == BWI_BBPID_BCM4321) { in bwi_set_clock_delay()
1171 if (sc->sc_bbp_rev == 0) in bwi_set_clock_delay()
1173 else if (sc->sc_bbp_rev == 1) in bwi_set_clock_delay()
1177 if (sc->sc_cap & BWI_CAP_CLKMODE) { in bwi_set_clock_delay()
1178 if (com->rw_rev >= 10) { in bwi_set_clock_delay()
1197 struct ieee80211com *ic = &sc->sc_ic; in bwi_init()
1203 if (sc->sc_flags & BWI_F_RUNNING) in bwi_init()
1221 mac = &sc->sc_mac[0]; in bwi_init_statechg()
1222 error = bwi_regwin_switch(sc, &mac->mac_regwin, NULL); in bwi_init_statechg()
1224 device_printf(sc->sc_dev, "%s: error %d on regwin switch\n", in bwi_init_statechg()
1230 device_printf(sc->sc_dev, "%s: error %d on MAC init\n", in bwi_init_statechg()
1238 bwi_set_addr_filter(sc, BWI_ADDR_FILTER_MYADDR, sc->sc_ic.ic_macaddr); in bwi_init_statechg()
1242 if ((mac->mac_flags & BWI_MAC_F_HAS_TXSTATS) == 0) { in bwi_init_statechg()
1256 device_printf(sc->sc_dev, in bwi_init_statechg()
1261 if (mac->mac_phy.phy_mode == IEEE80211_MODE_11G) in bwi_init_statechg()
1267 device_printf(sc->sc_dev, "%s: error %d starting MAC\n", in bwi_init_statechg()
1273 sc->sc_flags &= ~BWI_F_STOP; in bwi_init_statechg()
1274 sc->sc_flags |= BWI_F_RUNNING; in bwi_init_statechg()
1275 callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); in bwi_init_statechg()
1287 struct bwi_softc *sc = ic->ic_softc; in bwi_parent()
1291 if (ic->ic_nrunning > 0) { in bwi_parent()
1293 int promisc = -1; in bwi_parent()
1295 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_parent()
1297 sc->sc_cur_regwin->rw_type)); in bwi_parent()
1298 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_parent()
1300 if (ic->ic_promisc > 0 && (sc->sc_flags & BWI_F_PROMISC) == 0) { in bwi_parent()
1302 sc->sc_flags |= BWI_F_PROMISC; in bwi_parent()
1303 } else if (ic->ic_promisc == 0 && in bwi_parent()
1304 (sc->sc_flags & BWI_F_PROMISC) != 0) { in bwi_parent()
1306 sc->sc_flags &= ~BWI_F_PROMISC; in bwi_parent()
1312 if (ic->ic_nrunning > 0) { in bwi_parent()
1313 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_parent()
1317 } else if (sc->sc_flags & BWI_F_RUNNING) in bwi_parent()
1327 struct bwi_softc *sc = ic->ic_softc; in bwi_transmit()
1331 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_transmit()
1335 error = mbufq_enqueue(&sc->sc_snd, m); in bwi_transmit()
1348 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_start_locked()
1357 idx = tbd->tbd_idx; in bwi_start_locked()
1359 while (tbd->tbd_buf[idx].tb_mbuf == NULL && in bwi_start_locked()
1360 tbd->tbd_used + BWI_TX_NSPRDESC < BWI_TX_NDESC && in bwi_start_locked()
1361 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in bwi_start_locked()
1362 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; in bwi_start_locked()
1364 if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) != 0 && in bwi_start_locked()
1366 if_inc_counter(ni->ni_vap->iv_ifp, in bwi_start_locked()
1375 if_inc_counter(ni->ni_vap->iv_ifp, in bwi_start_locked()
1379 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwi_start_locked()
1383 tbd->tbd_used++; in bwi_start_locked()
1387 tbd->tbd_idx = idx; in bwi_start_locked()
1389 sc->sc_tx_timer = 5; in bwi_start_locked()
1396 struct ieee80211com *ic = ni->ni_ic; in bwi_raw_xmit()
1397 struct bwi_softc *sc = ic->ic_softc; in bwi_raw_xmit()
1399 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_raw_xmit()
1402 if ((sc->sc_flags & BWI_F_RUNNING) == 0) { in bwi_raw_xmit()
1408 idx = tbd->tbd_idx; in bwi_raw_xmit()
1409 KASSERT(tbd->tbd_buf[idx].tb_mbuf == NULL, ("slot %d not empty", idx)); in bwi_raw_xmit()
1424 tbd->tbd_used++; in bwi_raw_xmit()
1425 tbd->tbd_idx = (idx + 1) % BWI_TX_NDESC; in bwi_raw_xmit()
1426 sc->sc_tx_timer = 5; in bwi_raw_xmit()
1439 if (sc->sc_tx_timer != 0 && --sc->sc_tx_timer == 0) { in bwi_watchdog()
1440 device_printf(sc->sc_dev, "watchdog timeout\n"); in bwi_watchdog()
1441 counter_u64_add(sc->sc_ic.ic_oerrors, 1); in bwi_watchdog()
1442 taskqueue_enqueue(sc->sc_tq, &sc->sc_restart_task); in bwi_watchdog()
1444 callout_reset(&sc->sc_watchdog_timer, hz, bwi_watchdog, sc); in bwi_watchdog()
1463 callout_stop(&sc->sc_calib_ch); in bwi_stop_locked()
1464 callout_stop(&sc->sc_led_blink_ch); in bwi_stop_locked()
1465 sc->sc_led_blinking = 0; in bwi_stop_locked()
1466 sc->sc_flags |= BWI_F_STOP; in bwi_stop_locked()
1468 if (sc->sc_flags & BWI_F_RUNNING) { in bwi_stop_locked()
1469 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_stop_locked()
1470 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_stop_locked()
1471 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_stop_locked()
1478 for (i = 0; i < sc->sc_nmac; ++i) { in bwi_stop_locked()
1481 mac = &sc->sc_mac[i]; in bwi_stop_locked()
1482 if ((mac->mac_flags & BWI_MAC_F_INITED) == 0) in bwi_stop_locked()
1485 error = bwi_regwin_switch(sc, &mac->mac_regwin, &old_rw); in bwi_stop_locked()
1498 sc->sc_tx_timer = 0; in bwi_stop_locked()
1499 callout_stop(&sc->sc_watchdog_timer); in bwi_stop_locked()
1500 sc->sc_flags &= ~BWI_F_RUNNING; in bwi_stop_locked()
1510 int i, txrx_error, tx = 0, rx_data = -1; in bwi_intr()
1514 if ((sc->sc_flags & BWI_F_RUNNING) == 0 || in bwi_intr()
1515 (sc->sc_flags & BWI_F_STOP)) { in bwi_intr()
1536 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_intr()
1537 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_intr()
1538 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_intr()
1557 device_printf(sc->sc_dev, in bwi_intr()
1577 * http://bcm-specs.sipsolutions.net/Interrupts in bwi_intr()
1594 if (mac->mac_flags & BWI_MAC_F_PHYE_RESET) { in bwi_intr()
1595 device_printf(sc->sc_dev, "%s: intr PHY TX error\n", in bwi_intr()
1597 taskqueue_enqueue(sc->sc_tq, &sc->sc_restart_task); in bwi_intr()
1611 device_printf(sc->sc_dev, "EO_ATIM\n"); in bwi_intr()
1622 device_printf(sc->sc_dev, "intr noise\n"); in bwi_intr()
1625 rx_data = sc->sc_rxeof(sc); in bwi_intr()
1626 if (sc->sc_flags & BWI_F_STOP) { in bwi_intr()
1633 sc->sc_txeof_status(sc); in bwi_intr()
1642 /* Re-enable interrupts */ in bwi_intr()
1645 if (sc->sc_blink_led != NULL && sc->sc_led_blink) { in bwi_intr()
1649 if (sc->sc_rx_rate > sc->sc_tx_rate) in bwi_intr()
1671 struct bwi_softc *sc = ic->ic_softc; in bwi_scan_start()
1683 struct bwi_softc *sc = ic->ic_softc; in bwi_getradiocaps()
1692 mac = &sc->sc_mac[0]; in bwi_getradiocaps()
1693 phy = &mac->mac_phy; in bwi_getradiocaps()
1696 switch (phy->phy_mode) { in bwi_getradiocaps()
1706 device_printf(sc->sc_dev, "no 11a support\n"); in bwi_getradiocaps()
1709 panic("unknown phymode %d\n", phy->phy_mode); in bwi_getradiocaps()
1718 struct bwi_softc *sc = ic->ic_softc; in bwi_set_channel()
1719 struct ieee80211_channel *c = ic->ic_curchan; in bwi_set_channel()
1723 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_set_channel()
1724 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_set_channel()
1725 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_set_channel()
1728 sc->sc_rates = ieee80211_get_ratetable(c); in bwi_set_channel()
1735 struct bwi_softc *sc = ic->ic_softc; in bwi_scan_end()
1746 struct ieee80211com *ic= vap->iv_ic; in bwi_newstate()
1747 struct bwi_softc *sc = ic->ic_softc; in bwi_newstate()
1748 enum ieee80211_state ostate = vap->iv_state; in bwi_newstate()
1754 callout_stop(&sc->sc_calib_ch); in bwi_newstate()
1757 sc->sc_txpwrcb_type = BWI_TXPWR_INIT; in bwi_newstate()
1761 error = bvp->bv_newstate(vap, nstate, arg); in bwi_newstate()
1768 if (vap->iv_opmode == IEEE80211_M_STA) { in bwi_newstate()
1775 if (ic->ic_opmode == IEEE80211_M_STA && in bwi_newstate()
1776 !(sc->sc_flags & BWI_F_STOP)) in bwi_newstate()
1781 if (vap->iv_opmode == IEEE80211_M_MONITOR) { in bwi_newstate()
1784 bwi_set_bssid(sc, vap->iv_bss->ni_bssid); in bwi_newstate()
1786 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_newstate()
1787 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_newstate()
1788 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_newstate()
1793 sc->sc_txpwrcb_type = BWI_TXPWR_FORCE; in bwi_newstate()
1795 sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; in bwi_newstate()
1798 callout_reset(&sc->sc_calib_ch, hz, bwi_calibrate, sc); in bwi_newstate()
1815 for (i = 0; i < sc->sc_nmac; ++i) { in bwi_dma_alloc()
1816 if (sc->sc_mac[i].mac_flags & BWI_MAC_F_HAS_TXSTATS) { in bwi_dma_alloc()
1822 switch (sc->sc_bus_space) { in bwi_dma_alloc()
1825 if (sc->sc_bus_space == BWI_BUS_SPACE_30BIT) in bwi_dma_alloc()
1832 sc->sc_init_tx_ring = bwi_init_tx_ring32; in bwi_dma_alloc()
1833 sc->sc_free_tx_ring = bwi_free_tx_ring32; in bwi_dma_alloc()
1834 sc->sc_init_rx_ring = bwi_init_rx_ring32; in bwi_dma_alloc()
1835 sc->sc_free_rx_ring = bwi_free_rx_ring32; in bwi_dma_alloc()
1836 sc->sc_setup_rxdesc = bwi_setup_rx_desc32; in bwi_dma_alloc()
1837 sc->sc_setup_txdesc = bwi_setup_tx_desc32; in bwi_dma_alloc()
1838 sc->sc_rxeof = bwi_rxeof32; in bwi_dma_alloc()
1839 sc->sc_start_tx = bwi_start_tx32; in bwi_dma_alloc()
1841 sc->sc_init_txstats = bwi_init_txstats32; in bwi_dma_alloc()
1842 sc->sc_free_txstats = bwi_free_txstats32; in bwi_dma_alloc()
1843 sc->sc_txeof_status = bwi_txeof_status32; in bwi_dma_alloc()
1852 sc->sc_init_tx_ring = bwi_init_tx_ring64; in bwi_dma_alloc()
1853 sc->sc_free_tx_ring = bwi_free_tx_ring64; in bwi_dma_alloc()
1854 sc->sc_init_rx_ring = bwi_init_rx_ring64; in bwi_dma_alloc()
1855 sc->sc_free_rx_ring = bwi_free_rx_ring64; in bwi_dma_alloc()
1856 sc->sc_setup_rxdesc = bwi_setup_rx_desc64; in bwi_dma_alloc()
1857 sc->sc_setup_txdesc = bwi_setup_tx_desc64; in bwi_dma_alloc()
1858 sc->sc_rxeof = bwi_rxeof64; in bwi_dma_alloc()
1859 sc->sc_start_tx = bwi_start_tx64; in bwi_dma_alloc()
1861 sc->sc_init_txstats = bwi_init_txstats64; in bwi_dma_alloc()
1862 sc->sc_free_txstats = bwi_free_txstats64; in bwi_dma_alloc()
1863 sc->sc_txeof_status = bwi_txeof_status64; in bwi_dma_alloc()
1878 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), /* parent */ in bwi_dma_alloc()
1888 &sc->sc_parent_dtag); in bwi_dma_alloc()
1890 device_printf(sc->sc_dev, "can't create parent DMA tag\n"); in bwi_dma_alloc()
1899 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_alloc()
1909 &sc->sc_txring_dtag); in bwi_dma_alloc()
1911 device_printf(sc->sc_dev, "can't create TX ring DMA tag\n"); in bwi_dma_alloc()
1916 error = bwi_dma_ring_alloc(sc, sc->sc_txring_dtag, in bwi_dma_alloc()
1917 &sc->sc_tx_rdata[i], tx_ring_sz, in bwi_dma_alloc()
1920 device_printf(sc->sc_dev, "%dth TX ring " in bwi_dma_alloc()
1929 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_alloc()
1939 &sc->sc_rxring_dtag); in bwi_dma_alloc()
1941 device_printf(sc->sc_dev, "can't create RX ring DMA tag\n"); in bwi_dma_alloc()
1945 error = bwi_dma_ring_alloc(sc, sc->sc_rxring_dtag, &sc->sc_rx_rdata, in bwi_dma_alloc()
1948 device_printf(sc->sc_dev, "RX ring DMA alloc failed\n"); in bwi_dma_alloc()
1955 device_printf(sc->sc_dev, in bwi_dma_alloc()
1969 if (sc->sc_txring_dtag != NULL) { in bwi_dma_free()
1973 struct bwi_ring_data *rd = &sc->sc_tx_rdata[i]; in bwi_dma_free()
1975 if (rd->rdata_desc != NULL) { in bwi_dma_free()
1976 bus_dmamap_unload(sc->sc_txring_dtag, in bwi_dma_free()
1977 rd->rdata_dmap); in bwi_dma_free()
1978 bus_dmamem_free(sc->sc_txring_dtag, in bwi_dma_free()
1979 rd->rdata_desc, in bwi_dma_free()
1980 rd->rdata_dmap); in bwi_dma_free()
1983 bus_dma_tag_destroy(sc->sc_txring_dtag); in bwi_dma_free()
1986 if (sc->sc_rxring_dtag != NULL) { in bwi_dma_free()
1987 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_dma_free()
1989 if (rd->rdata_desc != NULL) { in bwi_dma_free()
1990 bus_dmamap_unload(sc->sc_rxring_dtag, rd->rdata_dmap); in bwi_dma_free()
1991 bus_dmamem_free(sc->sc_rxring_dtag, rd->rdata_desc, in bwi_dma_free()
1992 rd->rdata_dmap); in bwi_dma_free()
1994 bus_dma_tag_destroy(sc->sc_rxring_dtag); in bwi_dma_free()
2000 if (sc->sc_parent_dtag != NULL) in bwi_dma_free()
2001 bus_dma_tag_destroy(sc->sc_parent_dtag); in bwi_dma_free()
2011 error = bus_dmamem_alloc(dtag, &rd->rdata_desc, in bwi_dma_ring_alloc()
2013 &rd->rdata_dmap); in bwi_dma_ring_alloc()
2015 device_printf(sc->sc_dev, "can't allocate DMA mem\n"); in bwi_dma_ring_alloc()
2019 error = bus_dmamap_load(dtag, rd->rdata_dmap, rd->rdata_desc, size, in bwi_dma_ring_alloc()
2020 bwi_dma_ring_addr, &rd->rdata_paddr, in bwi_dma_ring_alloc()
2023 device_printf(sc->sc_dev, "can't load DMA mem\n"); in bwi_dma_ring_alloc()
2024 bus_dmamem_free(dtag, rd->rdata_desc, rd->rdata_dmap); in bwi_dma_ring_alloc()
2025 rd->rdata_desc = NULL; in bwi_dma_ring_alloc()
2029 rd->rdata_txrx_ctrl = txrx_ctrl; in bwi_dma_ring_alloc()
2043 device_printf(sc->sc_dev, "can't allocate txstats data\n"); in bwi_dma_txstats_alloc()
2046 sc->sc_txstats = st; in bwi_dma_txstats_alloc()
2053 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_txstats_alloc()
2064 &st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2066 device_printf(sc->sc_dev, "can't create txstats ring " in bwi_dma_txstats_alloc()
2071 error = bus_dmamem_alloc(st->stats_ring_dtag, &st->stats_ring, in bwi_dma_txstats_alloc()
2073 &st->stats_ring_dmap); in bwi_dma_txstats_alloc()
2075 device_printf(sc->sc_dev, "can't allocate txstats ring " in bwi_dma_txstats_alloc()
2077 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2078 st->stats_ring_dtag = NULL; in bwi_dma_txstats_alloc()
2082 error = bus_dmamap_load(st->stats_ring_dtag, st->stats_ring_dmap, in bwi_dma_txstats_alloc()
2083 st->stats_ring, dma_size, in bwi_dma_txstats_alloc()
2084 bwi_dma_ring_addr, &st->stats_ring_paddr, in bwi_dma_txstats_alloc()
2087 device_printf(sc->sc_dev, "can't load txstats ring DMA mem\n"); in bwi_dma_txstats_alloc()
2088 bus_dmamem_free(st->stats_ring_dtag, st->stats_ring, in bwi_dma_txstats_alloc()
2089 st->stats_ring_dmap); in bwi_dma_txstats_alloc()
2090 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_alloc()
2091 st->stats_ring_dtag = NULL; in bwi_dma_txstats_alloc()
2101 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_txstats_alloc()
2112 &st->stats_dtag); in bwi_dma_txstats_alloc()
2114 device_printf(sc->sc_dev, "can't create txstats DMA tag\n"); in bwi_dma_txstats_alloc()
2118 error = bus_dmamem_alloc(st->stats_dtag, (void **)&st->stats, in bwi_dma_txstats_alloc()
2120 &st->stats_dmap); in bwi_dma_txstats_alloc()
2122 device_printf(sc->sc_dev, "can't allocate txstats DMA mem\n"); in bwi_dma_txstats_alloc()
2123 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_alloc()
2124 st->stats_dtag = NULL; in bwi_dma_txstats_alloc()
2128 error = bus_dmamap_load(st->stats_dtag, st->stats_dmap, st->stats, in bwi_dma_txstats_alloc()
2129 dma_size, bwi_dma_ring_addr, &st->stats_paddr, in bwi_dma_txstats_alloc()
2132 device_printf(sc->sc_dev, "can't load txstats DMA mem\n"); in bwi_dma_txstats_alloc()
2133 bus_dmamem_free(st->stats_dtag, st->stats, st->stats_dmap); in bwi_dma_txstats_alloc()
2134 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_alloc()
2135 st->stats_dtag = NULL; in bwi_dma_txstats_alloc()
2139 st->stats_ctrl_base = ctrl_base; in bwi_dma_txstats_alloc()
2148 if (sc->sc_txstats == NULL) in bwi_dma_txstats_free()
2150 st = sc->sc_txstats; in bwi_dma_txstats_free()
2152 if (st->stats_ring_dtag != NULL) { in bwi_dma_txstats_free()
2153 bus_dmamap_unload(st->stats_ring_dtag, st->stats_ring_dmap); in bwi_dma_txstats_free()
2154 bus_dmamem_free(st->stats_ring_dtag, st->stats_ring, in bwi_dma_txstats_free()
2155 st->stats_ring_dmap); in bwi_dma_txstats_free()
2156 bus_dma_tag_destroy(st->stats_ring_dtag); in bwi_dma_txstats_free()
2159 if (st->stats_dtag != NULL) { in bwi_dma_txstats_free()
2160 bus_dmamap_unload(st->stats_dtag, st->stats_dmap); in bwi_dma_txstats_free()
2161 bus_dmamem_free(st->stats_dtag, st->stats, st->stats_dmap); in bwi_dma_txstats_free()
2162 bus_dma_tag_destroy(st->stats_dtag); in bwi_dma_txstats_free()
2169 bwi_dma_ring_addr(void *arg, bus_dma_segment_t *seg, int nseg, int error) in bwi_dma_ring_addr() argument
2172 *((bus_addr_t *)arg) = seg->ds_addr; in bwi_dma_ring_addr()
2178 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_dma_mbuf_create()
2184 error = bus_dma_tag_create(sc->sc_parent_dtag, in bwi_dma_mbuf_create()
2195 &sc->sc_buf_dtag); in bwi_dma_mbuf_create()
2197 device_printf(sc->sc_dev, "can't create mbuf DMA tag\n"); in bwi_dma_mbuf_create()
2207 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[i]; in bwi_dma_mbuf_create()
2210 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2211 &tbd->tbd_buf[j].tb_dmap); in bwi_dma_mbuf_create()
2213 device_printf(sc->sc_dev, "can't create " in bwi_dma_mbuf_create()
2218 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2219 tbd->tbd_buf[k].tb_dmap); in bwi_dma_mbuf_create()
2230 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2231 &rbd->rbd_tmp_dmap); in bwi_dma_mbuf_create()
2233 device_printf(sc->sc_dev, in bwi_dma_mbuf_create()
2239 error = bus_dmamap_create(sc->sc_buf_dtag, 0, in bwi_dma_mbuf_create()
2240 &rbd->rbd_buf[j].rb_dmap); in bwi_dma_mbuf_create()
2242 device_printf(sc->sc_dev, "can't create %dth " in bwi_dma_mbuf_create()
2246 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2247 rbd->rbd_buf[j].rb_dmap); in bwi_dma_mbuf_create()
2249 bus_dmamap_destroy(sc->sc_buf_dtag, in bwi_dma_mbuf_create()
2250 rbd->rbd_tmp_dmap); in bwi_dma_mbuf_create()
2266 if (sc->sc_buf_dtag == NULL) in bwi_dma_mbuf_destroy()
2270 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[i]; in bwi_dma_mbuf_destroy()
2273 struct bwi_txbuf *tb = &tbd->tbd_buf[j]; in bwi_dma_mbuf_destroy()
2275 if (tb->tb_mbuf != NULL) { in bwi_dma_mbuf_destroy()
2276 bus_dmamap_unload(sc->sc_buf_dtag, in bwi_dma_mbuf_destroy()
2277 tb->tb_dmap); in bwi_dma_mbuf_destroy()
2278 m_freem(tb->tb_mbuf); in bwi_dma_mbuf_destroy()
2280 if (tb->tb_ni != NULL) in bwi_dma_mbuf_destroy()
2281 ieee80211_free_node(tb->tb_ni); in bwi_dma_mbuf_destroy()
2282 bus_dmamap_destroy(sc->sc_buf_dtag, tb->tb_dmap); in bwi_dma_mbuf_destroy()
2287 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_dma_mbuf_destroy()
2289 bus_dmamap_destroy(sc->sc_buf_dtag, rbd->rbd_tmp_dmap); in bwi_dma_mbuf_destroy()
2291 struct bwi_rxbuf *rb = &rbd->rbd_buf[j]; in bwi_dma_mbuf_destroy()
2293 if (rb->rb_mbuf != NULL) { in bwi_dma_mbuf_destroy()
2294 bus_dmamap_unload(sc->sc_buf_dtag, in bwi_dma_mbuf_destroy()
2295 rb->rb_dmap); in bwi_dma_mbuf_destroy()
2296 m_freem(rb->rb_mbuf); in bwi_dma_mbuf_destroy()
2298 bus_dmamap_destroy(sc->sc_buf_dtag, rb->rb_dmap); in bwi_dma_mbuf_destroy()
2302 bus_dma_tag_destroy(sc->sc_buf_dtag); in bwi_dma_mbuf_destroy()
2303 sc->sc_buf_dtag = NULL; in bwi_dma_mbuf_destroy()
2326 rd = &sc->sc_tx_rdata[ring_idx]; in bwi_init_tx_ring32()
2327 tbd = &sc->sc_tx_bdata[ring_idx]; in bwi_init_tx_ring32()
2329 tbd->tbd_idx = 0; in bwi_init_tx_ring32()
2330 tbd->tbd_used = 0; in bwi_init_tx_ring32()
2332 bzero(rd->rdata_desc, sizeof(struct bwi_desc32) * BWI_TX_NDESC); in bwi_init_tx_ring32()
2333 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_init_tx_ring32()
2336 addr_lo = __SHIFTOUT(rd->rdata_paddr, BWI_TXRX32_RINGINFO_ADDR_MASK); in bwi_init_tx_ring32()
2337 addr_hi = __SHIFTOUT(rd->rdata_paddr, BWI_TXRX32_RINGINFO_FUNC_MASK); in bwi_init_tx_ring32()
2342 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_RINGINFO, val); in bwi_init_tx_ring32()
2346 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_CTRL, val); in bwi_init_tx_ring32()
2371 (ndesc - 1) * sizeof(struct bwi_desc32)); in bwi_init_rxdesc_ring32()
2377 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_init_rx_ring32()
2380 sc->sc_rx_bdata.rbd_idx = 0; in bwi_init_rx_ring32()
2385 device_printf(sc->sc_dev, in bwi_init_rx_ring32()
2390 bus_dmamap_sync(sc->sc_rxring_dtag, rd->rdata_dmap, in bwi_init_rx_ring32()
2393 bwi_init_rxdesc_ring32(sc, rd->rdata_txrx_ctrl, rd->rdata_paddr, in bwi_init_rx_ring32()
2401 struct bwi_txstats_data *st = sc->sc_txstats; in bwi_init_txstats32()
2405 bzero(st->stats, BWI_TXSTATS_NDESC * sizeof(struct bwi_txstats)); in bwi_init_txstats32()
2406 bus_dmamap_sync(st->stats_dtag, st->stats_dmap, BUS_DMASYNC_PREWRITE); in bwi_init_txstats32()
2408 st->stats_idx = 0; in bwi_init_txstats32()
2410 stats_paddr = st->stats_paddr; in bwi_init_txstats32()
2412 bwi_setup_desc32(sc, st->stats_ring, BWI_TXSTATS_NDESC, i, in bwi_init_txstats32()
2416 bus_dmamap_sync(st->stats_ring_dtag, st->stats_ring_dmap, in bwi_init_txstats32()
2419 bwi_init_rxdesc_ring32(sc, st->stats_ctrl_base, in bwi_init_txstats32()
2420 st->stats_ring_paddr, 0, BWI_TXSTATS_NDESC); in bwi_init_txstats32()
2428 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_setup_rx_desc32()
2431 bwi_setup_desc32(sc, rd->rdata_desc, BWI_RX_NDESC, buf_idx, in bwi_setup_rx_desc32()
2440 bwi_setup_desc32(sc, rd->rdata_desc, BWI_TX_NDESC, buf_idx, in bwi_setup_tx_desc32()
2480 bwi_dma_buf_addr(void *arg, bus_dma_segment_t *seg, int nseg, in bwi_dma_buf_addr() argument
2485 *((bus_addr_t *)arg) = seg->ds_addr; in bwi_dma_buf_addr()
2492 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_newbuf()
2493 struct bwi_rxbuf *rxbuf = &rbd->rbd_buf[buf_idx]; in bwi_newbuf()
2508 * - Clear RX buffer's header. in bwi_newbuf()
2509 * - Restore RX descriptor settings. in bwi_newbuf()
2516 m->m_len = m->m_pkthdr.len = MCLBYTES; in bwi_newbuf()
2521 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, rbd->rbd_tmp_dmap, m, in bwi_newbuf()
2536 bus_dmamap_unload(sc->sc_buf_dtag, rxbuf->rb_dmap); in bwi_newbuf()
2537 rxbuf->rb_mbuf = m; in bwi_newbuf()
2538 rxbuf->rb_paddr = paddr; in bwi_newbuf()
2543 map = rxbuf->rb_dmap; in bwi_newbuf()
2544 rxbuf->rb_dmap = rbd->rbd_tmp_dmap; in bwi_newbuf()
2545 rbd->rbd_tmp_dmap = map; in bwi_newbuf()
2551 hdr = mtod(rxbuf->rb_mbuf, struct bwi_rxbuf_hdr *); in bwi_newbuf()
2553 bus_dmamap_sync(sc->sc_buf_dtag, rxbuf->rb_dmap, BUS_DMASYNC_PREWRITE); in bwi_newbuf()
2558 sc->sc_setup_rxdesc(sc, buf_idx, rxbuf->rb_paddr, in bwi_newbuf()
2559 rxbuf->rb_mbuf->m_len - sizeof(*hdr)); in bwi_newbuf()
2584 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_rxeof()
2585 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_rxeof()
2586 struct ieee80211com *ic = &sc->sc_ic; in bwi_rxeof()
2589 idx = rbd->rbd_idx; in bwi_rxeof()
2591 struct bwi_rxbuf *rb = &rbd->rbd_buf[idx]; in bwi_rxeof()
2600 m = rb->rb_mbuf; in bwi_rxeof()
2601 bus_dmamap_sync(sc->sc_buf_dtag, rb->rb_dmap, in bwi_rxeof()
2605 counter_u64_add(ic->ic_ierrors, 1); in bwi_rxeof()
2610 flags2 = le16toh(hdr->rxh_flags2); in bwi_rxeof()
2617 buflen = le16toh(hdr->rxh_buflen); in bwi_rxeof()
2619 device_printf(sc->sc_dev, in bwi_rxeof()
2622 counter_u64_add(ic->ic_ierrors, 1); in bwi_rxeof()
2631 m->m_len = m->m_pkthdr.len = buflen + sizeof(*hdr); in bwi_rxeof()
2634 if (htole16(hdr->rxh_flags1) & BWI_RXH_F1_OFDM) in bwi_rxeof()
2643 m_adj(m, -IEEE80211_CRC_LEN); in bwi_rxeof()
2650 type = ieee80211_input(ni, m, rssi - noise, noise); in bwi_rxeof()
2653 type = ieee80211_input_all(ic, m, rssi - noise, noise); in bwi_rxeof()
2656 sc->sc_rx_rate = rate; in bwi_rxeof()
2663 if (sc->sc_flags & BWI_F_STOP) { in bwi_rxeof()
2668 return -1; in bwi_rxeof()
2672 rbd->rbd_idx = idx; in bwi_rxeof()
2673 bus_dmamap_sync(sc->sc_rxring_dtag, rd->rdata_dmap, in bwi_rxeof()
2685 rx_ctrl = sc->sc_rx_rdata.rdata_txrx_ctrl; in bwi_rxeof32()
2726 device_printf(sc->sc_dev, "reset rx ring timedout\n"); in bwi_reset_rx_ring32()
2736 bwi_reset_rx_ring32(sc, sc->sc_txstats->stats_ctrl_base); in bwi_free_txstats32()
2742 struct bwi_ring_data *rd = &sc->sc_rx_rdata; in bwi_free_rx_ring32()
2743 struct bwi_rxbuf_data *rbd = &sc->sc_rx_bdata; in bwi_free_rx_ring32()
2746 bwi_reset_rx_ring32(sc, rd->rdata_txrx_ctrl); in bwi_free_rx_ring32()
2749 struct bwi_rxbuf *rb = &rbd->rbd_buf[i]; in bwi_free_rx_ring32()
2751 if (rb->rb_mbuf != NULL) { in bwi_free_rx_ring32()
2752 bus_dmamap_unload(sc->sc_buf_dtag, rb->rb_dmap); in bwi_free_rx_ring32()
2753 m_freem(rb->rb_mbuf); in bwi_free_rx_ring32()
2754 rb->rb_mbuf = NULL; in bwi_free_rx_ring32()
2768 rd = &sc->sc_tx_rdata[ring_idx]; in bwi_free_tx_ring32()
2769 tbd = &sc->sc_tx_bdata[ring_idx]; in bwi_free_tx_ring32()
2774 val = CSR_READ_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_STATUS); in bwi_free_tx_ring32()
2784 device_printf(sc->sc_dev, in bwi_free_tx_ring32()
2789 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_CTRL, 0); in bwi_free_tx_ring32()
2791 val = CSR_READ_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_STATUS); in bwi_free_tx_ring32()
2799 device_printf(sc->sc_dev, "%s: reset TX ring (%d) timed out\n", in bwi_free_tx_ring32()
2806 CSR_WRITE_4(sc, rd->rdata_txrx_ctrl + BWI_TX32_RINGINFO, 0); in bwi_free_tx_ring32()
2809 struct bwi_txbuf *tb = &tbd->tbd_buf[i]; in bwi_free_tx_ring32()
2811 if (tb->tb_mbuf != NULL) { in bwi_free_tx_ring32()
2812 bus_dmamap_unload(sc->sc_buf_dtag, tb->tb_dmap); in bwi_free_tx_ring32()
2813 m_freem(tb->tb_mbuf); in bwi_free_tx_ring32()
2814 tb->tb_mbuf = NULL; in bwi_free_tx_ring32()
2816 if (tb->tb_ni != NULL) { in bwi_free_tx_ring32()
2817 ieee80211_free_node(tb->tb_ni); in bwi_free_tx_ring32()
2818 tb->tb_ni = NULL; in bwi_free_tx_ring32()
2874 if (pkt_bitlen1 - pkt_bitlen >= NBBY) in bwi_ds_plcp_header()
2878 plcp->i_signal = ieee80211_rate2plcp(rate, IEEE80211_T_CCK); in bwi_ds_plcp_header()
2879 plcp->i_service = service; in bwi_ds_plcp_header()
2880 plcp->i_length = htole16(len); in bwi_ds_plcp_header()
2906 struct ieee80211vap *vap = ni->ni_vap; in bwi_encap()
2907 struct ieee80211com *ic = &sc->sc_ic; in bwi_encap()
2908 struct bwi_ring_data *rd = &sc->sc_tx_rdata[BWI_TX_DATA_RING]; in bwi_encap()
2909 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_encap()
2910 struct bwi_txbuf *tb = &tbd->tbd_buf[idx]; in bwi_encap()
2914 const struct ieee80211_txparam *tp = ni->ni_txparms; in bwi_encap()
2925 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_encap()
2926 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_encap()
2927 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_encap()
2930 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; in bwi_encap()
2931 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in bwi_encap()
2934 pkt_len = m->m_pkthdr.len + IEEE80211_CRC_LEN; in bwi_encap()
2939 if (type != IEEE80211_FC0_TYPE_DATA || (m->m_flags & M_EAPOL)) { in bwi_encap()
2940 rate = rate_fb = tp->mgmtrate; in bwi_encap()
2942 rate = rate_fb = tp->mcastrate; in bwi_encap()
2943 } else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) { in bwi_encap()
2944 rate = rate_fb = tp->ucastrate; in bwi_encap()
2951 tb->tb_rate[0] = rate; in bwi_encap()
2952 tb->tb_rate[1] = rate_fb; in bwi_encap()
2953 sc->sc_tx_rate = rate; in bwi_encap()
2959 sc->sc_tx_th.wt_flags = 0; in bwi_encap()
2960 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_encap()
2961 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_encap()
2962 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_DS && in bwi_encap()
2963 (ic->ic_flags & IEEE80211_F_SHPREAMBLE) && in bwi_encap()
2965 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_encap()
2967 sc->sc_tx_th.wt_rate = rate; in bwi_encap()
2977 device_printf(sc->sc_dev, "%s: prepend TX header failed\n", in bwi_encap()
2985 bcopy(wh->i_fc, hdr->txh_fc, sizeof(hdr->txh_fc)); in bwi_encap()
2986 bcopy(wh->i_addr1, hdr->txh_addr1, sizeof(hdr->txh_addr1)); in bwi_encap()
2991 dur = ieee80211_ack_duration(sc->sc_rates, rate, in bwi_encap()
2992 ic->ic_flags & ~IEEE80211_F_SHPREAMBLE); in bwi_encap()
2994 hdr->txh_fb_duration = htole16(dur); in bwi_encap()
2997 hdr->txh_id = __SHIFTIN(BWI_TX_DATA_RING, BWI_TXH_ID_RING_MASK) | in bwi_encap()
3000 bwi_plcp_header(sc->sc_rates, hdr->txh_plcp, pkt_len, rate); in bwi_encap()
3001 bwi_plcp_header(sc->sc_rates, hdr->txh_fb_plcp, pkt_len, rate_fb); in bwi_encap()
3003 phy_ctrl = __SHIFTIN(mac->mac_rf.rf_ant_mode, in bwi_encap()
3005 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM) in bwi_encap()
3007 else if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && rate != (2 * 1)) in bwi_encap()
3013 if (ieee80211_rate2phytype(sc->sc_rates, rate_fb) == IEEE80211_T_OFDM) in bwi_encap()
3016 hdr->txh_mac_ctrl = htole32(mac_ctrl); in bwi_encap()
3017 hdr->txh_phy_ctrl = htole16(phy_ctrl); in bwi_encap()
3024 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap()
3027 device_printf(sc->sc_dev, "%s: can't load TX buffer (1) %d\n", in bwi_encap()
3037 device_printf(sc->sc_dev, in bwi_encap()
3045 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap()
3049 device_printf(sc->sc_dev, in bwi_encap()
3057 bus_dmamap_sync(sc->sc_buf_dtag, tb->tb_dmap, BUS_DMASYNC_PREWRITE); in bwi_encap()
3059 tb->tb_mbuf = m; in bwi_encap()
3060 tb->tb_ni = ni; in bwi_encap()
3064 for (i = 0; i < m->m_pkthdr.len; ++i) { in bwi_encap()
3072 idx, pkt_len, m->m_pkthdr.len); in bwi_encap()
3075 sc->sc_setup_txdesc(sc, rd, idx, paddr, m->m_pkthdr.len); in bwi_encap()
3076 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_encap()
3080 sc->sc_start_tx(sc, rd->rdata_txrx_ctrl, idx); in bwi_encap()
3092 struct ieee80211vap *vap = ni->ni_vap; in bwi_encap_raw()
3093 struct ieee80211com *ic = ni->ni_ic; in bwi_encap_raw()
3094 struct bwi_ring_data *rd = &sc->sc_tx_rdata[BWI_TX_DATA_RING]; in bwi_encap_raw()
3095 struct bwi_txbuf_data *tbd = &sc->sc_tx_bdata[BWI_TX_DATA_RING]; in bwi_encap_raw()
3096 struct bwi_txbuf *tb = &tbd->tbd_buf[idx]; in bwi_encap_raw()
3106 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_encap_raw()
3107 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_encap_raw()
3108 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_encap_raw()
3111 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); in bwi_encap_raw()
3114 pkt_len = m->m_pkthdr.len + IEEE80211_CRC_LEN; in bwi_encap_raw()
3119 rate = params->ibp_rate0; in bwi_encap_raw()
3120 if (!ieee80211_isratevalid(ic->ic_rt, rate)) { in bwi_encap_raw()
3125 if (params->ibp_try1 != 0) { in bwi_encap_raw()
3126 rate_fb = params->ibp_rate1; in bwi_encap_raw()
3127 if (!ieee80211_isratevalid(ic->ic_rt, rate_fb)) { in bwi_encap_raw()
3134 tb->tb_rate[0] = rate; in bwi_encap_raw()
3135 tb->tb_rate[1] = rate_fb; in bwi_encap_raw()
3136 sc->sc_tx_rate = rate; in bwi_encap_raw()
3142 sc->sc_tx_th.wt_flags = 0; in bwi_encap_raw()
3144 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_encap_raw()
3145 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_encap_raw()
3146 if (params->ibp_flags & IEEE80211_BPF_SHORTPRE) in bwi_encap_raw()
3147 sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_encap_raw()
3148 sc->sc_tx_th.wt_rate = rate; in bwi_encap_raw()
3158 device_printf(sc->sc_dev, "%s: prepend TX header failed\n", in bwi_encap_raw()
3166 bcopy(wh->i_fc, hdr->txh_fc, sizeof(hdr->txh_fc)); in bwi_encap_raw()
3167 bcopy(wh->i_addr1, hdr->txh_addr1, sizeof(hdr->txh_addr1)); in bwi_encap_raw()
3170 if (!ismcast && (params->ibp_flags & IEEE80211_BPF_NOACK) == 0) { in bwi_encap_raw()
3173 dur = ieee80211_ack_duration(sc->sc_rates, rate_fb, 0); in bwi_encap_raw()
3175 hdr->txh_fb_duration = htole16(dur); in bwi_encap_raw()
3179 hdr->txh_id = __SHIFTIN(BWI_TX_DATA_RING, BWI_TXH_ID_RING_MASK) | in bwi_encap_raw()
3182 bwi_plcp_header(sc->sc_rates, hdr->txh_plcp, pkt_len, rate); in bwi_encap_raw()
3183 bwi_plcp_header(sc->sc_rates, hdr->txh_fb_plcp, pkt_len, rate_fb); in bwi_encap_raw()
3185 phy_ctrl = __SHIFTIN(mac->mac_rf.rf_ant_mode, in bwi_encap_raw()
3187 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM) { in bwi_encap_raw()
3190 } else if (params->ibp_flags & IEEE80211_BPF_SHORTPRE) in bwi_encap_raw()
3193 hdr->txh_mac_ctrl = htole32(mac_ctrl); in bwi_encap_raw()
3194 hdr->txh_phy_ctrl = htole16(phy_ctrl); in bwi_encap_raw()
3201 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap_raw()
3207 device_printf(sc->sc_dev, in bwi_encap_raw()
3214 device_printf(sc->sc_dev, in bwi_encap_raw()
3220 error = bus_dmamap_load_mbuf(sc->sc_buf_dtag, tb->tb_dmap, m, in bwi_encap_raw()
3224 device_printf(sc->sc_dev, in bwi_encap_raw()
3231 bus_dmamap_sync(sc->sc_buf_dtag, tb->tb_dmap, BUS_DMASYNC_PREWRITE); in bwi_encap_raw()
3233 tb->tb_mbuf = m; in bwi_encap_raw()
3234 tb->tb_ni = ni; in bwi_encap_raw()
3237 idx, pkt_len, m->m_pkthdr.len); in bwi_encap_raw()
3240 sc->sc_setup_txdesc(sc, rd, idx, paddr, m->m_pkthdr.len); in bwi_encap_raw()
3241 bus_dmamap_sync(sc->sc_txring_dtag, rd->rdata_dmap, in bwi_encap_raw()
3245 sc->sc_start_tx(sc, rd->rdata_txrx_ctrl, idx); in bwi_encap_raw()
3272 ctrl_base = sc->sc_txstats->stats_ctrl_base; in bwi_txeof_status32()
3301 device_printf(sc->sc_dev, "%s: zero tx id\n", __func__); in _bwi_txeof()
3311 tbd = &sc->sc_tx_bdata[ring_idx]; in _bwi_txeof()
3312 KASSERT(tbd->tbd_used > 0, ("tbd_used %d", tbd->tbd_used)); in _bwi_txeof()
3313 tbd->tbd_used--; in _bwi_txeof()
3315 tb = &tbd->tbd_buf[buf_idx]; in _bwi_txeof()
3318 buf_idx, acked, data_txcnt, tb->tb_ni); in _bwi_txeof()
3320 bus_dmamap_unload(sc->sc_buf_dtag, tb->tb_dmap); in _bwi_txeof()
3322 if ((ni = tb->tb_ni) != NULL) { in _bwi_txeof()
3324 mtod(tb->tb_mbuf, const struct bwi_txbuf_hdr *); in _bwi_txeof()
3328 if (hdr->txh_mac_ctrl & htole32(BWI_TXH_MAC_C_ACK)) { in _bwi_txeof()
3333 * well so to avoid over-aggressive downshifting we in _bwi_txeof()
3346 ieee80211_tx_complete(ni, tb->tb_mbuf, !acked); in _bwi_txeof()
3347 tb->tb_ni = NULL; in _bwi_txeof()
3349 m_freem(tb->tb_mbuf); in _bwi_txeof()
3350 tb->tb_mbuf = NULL; in _bwi_txeof()
3352 if (tbd->tbd_used == 0) in _bwi_txeof()
3353 sc->sc_tx_timer = 0; in _bwi_txeof()
3359 struct bwi_txstats_data *st = sc->sc_txstats; in bwi_txeof_status()
3362 bus_dmamap_sync(st->stats_dtag, st->stats_dmap, BUS_DMASYNC_POSTREAD); in bwi_txeof_status()
3364 idx = st->stats_idx; in bwi_txeof_status()
3366 const struct bwi_txstats *stats = &st->stats[idx]; in bwi_txeof_status()
3368 if ((stats->txs_flags & BWI_TXS_F_PENDING) == 0) { in bwi_txeof_status()
3371 data_txcnt = __SHIFTOUT(stats->txs_txcnt, in bwi_txeof_status()
3373 _bwi_txeof(sc, le16toh(stats->txs_id), in bwi_txeof_status()
3374 stats->txs_flags & BWI_TXS_F_ACKED, in bwi_txeof_status()
3379 st->stats_idx = idx; in bwi_txeof_status()
3432 com = &sc->sc_com_regwin; in bwi_get_pwron_delay()
3435 if ((sc->sc_cap & BWI_CAP_CLKMODE) == 0) in bwi_get_pwron_delay()
3445 sc->sc_pwron_delay = howmany((val + 2) * 1000000, freq.clkfreq_min); in bwi_get_pwron_delay()
3446 DPRINTF(sc, BWI_DBG_ATTACH, "power on delay %u\n", sc->sc_pwron_delay); in bwi_get_pwron_delay()
3457 bus = &sc->sc_bus_regwin; in bwi_bus_attach()
3475 switch (rw->rw_type) { in bwi_regwin_name()
3485 panic("unknown regwin type 0x%04x\n", rw->rw_type); in bwi_regwin_name()
3564 device_printf(sc->sc_dev, "%s disable clock timeout\n", in bwi_regwin_disable()
3577 device_printf(sc->sc_dev, "%s wait BUSY unset timeout\n", in bwi_regwin_disable()
3661 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_set_bssid()
3662 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_set_bssid()
3663 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_set_bssid()
3667 bcopy(sc->sc_ic.ic_macaddr, buf.myaddr, sizeof(buf.myaddr)); in bwi_set_bssid()
3686 struct bwi_softc *sc = ic->ic_softc; in bwi_updateslot()
3690 if (sc->sc_flags & BWI_F_RUNNING) { in bwi_updateslot()
3693 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_updateslot()
3694 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_updateslot()
3695 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_updateslot()
3697 bwi_mac_updateslot(mac, (ic->ic_flags & IEEE80211_F_SHSLOT)); in bwi_updateslot()
3710 KASSERT(sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR, in bwi_calibrate()
3711 ("opmode %d", sc->sc_ic.ic_opmode)); in bwi_calibrate()
3713 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calibrate()
3714 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calibrate()
3715 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calibrate()
3717 bwi_mac_calibrate_txpower(mac, sc->sc_txpwrcb_type); in bwi_calibrate()
3718 sc->sc_txpwrcb_type = BWI_TXPWR_CALIB; in bwi_calibrate()
3721 callout_reset(&sc->sc_calib_ch, hz * 15, bwi_calibrate, sc); in bwi_calibrate()
3729 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calc_rssi()
3730 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calc_rssi()
3731 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calc_rssi()
3741 KASSERT(sc->sc_cur_regwin->rw_type == BWI_REGWIN_T_MAC, in bwi_calc_noise()
3742 ("current regwin type %d", sc->sc_cur_regwin->rw_type)); in bwi_calc_noise()
3743 mac = (struct bwi_mac *)sc->sc_cur_regwin; in bwi_calc_noise()
3761 sc->sc_rx_th.wr_flags = IEEE80211_RADIOTAP_F_FCS; in bwi_rx_radiotap()
3762 if (htole16(hdr->rxh_flags1) & BWI_RXH_F1_SHPREAMBLE) in bwi_rx_radiotap()
3763 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; in bwi_rx_radiotap()
3766 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) in bwi_rx_radiotap()
3767 sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_WEP; in bwi_rx_radiotap()
3769 sc->sc_rx_th.wr_tsf = hdr->rxh_tsf; /* No endian conversion */ in bwi_rx_radiotap()
3770 sc->sc_rx_th.wr_rate = rate; in bwi_rx_radiotap()
3771 sc->sc_rx_th.wr_antsignal = rssi; in bwi_rx_radiotap()
3772 sc->sc_rx_th.wr_antnoise = noise; in bwi_rx_radiotap()
3783 if (sc->sc_pci_subvid == bwi_vendor_led_act[i].vid) { in bwi_led_attach()
3800 struct bwi_led *led = &sc->sc_leds[i]; in bwi_led_attach() local
3803 led->l_act = led_act[i]; in bwi_led_attach()
3806 led->l_flags |= BWI_LED_F_ACTLOW; in bwi_led_attach()
3807 led->l_act = __SHIFTOUT(val[i], BWI_LED_ACT_MASK); in bwi_led_attach()
3809 led->l_mask = (1 << i); in bwi_led_attach()
3811 if (led->l_act == BWI_LED_ACT_BLINK_SLOW || in bwi_led_attach()
3812 led->l_act == BWI_LED_ACT_BLINK_POLL || in bwi_led_attach()
3813 led->l_act == BWI_LED_ACT_BLINK) { in bwi_led_attach()
3814 led->l_flags |= BWI_LED_F_BLINK; in bwi_led_attach()
3815 if (led->l_act == BWI_LED_ACT_BLINK_POLL) in bwi_led_attach()
3816 led->l_flags |= BWI_LED_F_POLLABLE; in bwi_led_attach()
3817 else if (led->l_act == BWI_LED_ACT_BLINK_SLOW) in bwi_led_attach()
3818 led->l_flags |= BWI_LED_F_SLOW; in bwi_led_attach()
3820 if (sc->sc_blink_led == NULL) { in bwi_led_attach()
3821 sc->sc_blink_led = led; in bwi_led_attach()
3822 if (led->l_flags & BWI_LED_F_SLOW) in bwi_led_attach()
3823 BWI_LED_SLOWDOWN(sc->sc_led_idle); in bwi_led_attach()
3828 "%dth led, act %d, lowact %d\n", i, in bwi_led_attach()
3829 led->l_act, led->l_flags & BWI_LED_F_ACTLOW); in bwi_led_attach()
3831 callout_init_mtx(&sc->sc_led_blink_ch, &sc->sc_mtx, 0); in bwi_led_attach()
3835 bwi_led_onoff(const struct bwi_led *led, uint16_t val, int on) in bwi_led_onoff() argument
3837 if (led->l_flags & BWI_LED_F_ACTLOW) in bwi_led_onoff()
3840 val |= led->l_mask; in bwi_led_onoff()
3842 val &= ~led->l_mask; in bwi_led_onoff()
3849 struct ieee80211com *ic = &sc->sc_ic; in bwi_led_newstate()
3854 callout_stop(&sc->sc_led_blink_ch); in bwi_led_newstate()
3855 sc->sc_led_blinking = 0; in bwi_led_newstate()
3858 if ((sc->sc_flags & BWI_F_RUNNING) == 0) in bwi_led_newstate()
3863 struct bwi_led *led = &sc->sc_leds[i]; in bwi_led_newstate() local
3866 if (led->l_act == BWI_LED_ACT_UNKN || in bwi_led_newstate()
3867 led->l_act == BWI_LED_ACT_NULL) in bwi_led_newstate()
3870 if ((led->l_flags & BWI_LED_F_BLINK) && in bwi_led_newstate()
3874 switch (led->l_act) { in bwi_led_newstate()
3889 if (led->l_act == BWI_LED_ACT_11G && in bwi_led_newstate()
3890 ic->ic_curmode != IEEE80211_MODE_11G) in bwi_led_newstate()
3894 if (led->l_act == BWI_LED_ACT_ASSOC) in bwi_led_newstate()
3901 val = bwi_led_onoff(led, val, on); in bwi_led_newstate()
3908 struct bwi_led *led = sc->sc_blink_led; in bwi_led_event() local
3912 if ((led->l_flags & BWI_LED_F_POLLABLE) == 0) in bwi_led_event()
3914 if (ticks - sc->sc_led_ticks < sc->sc_led_idle) in bwi_led_event()
3918 sc->sc_led_ticks = ticks; in bwi_led_event()
3919 if (sc->sc_led_blinking) in bwi_led_event()
3924 rate = sc->sc_rx_rate; in bwi_led_event()
3927 rate = sc->sc_tx_rate; in bwi_led_event()
3933 panic("unknown LED event %d\n", event); in bwi_led_event()
3943 struct bwi_led *led = sc->sc_blink_led; in bwi_led_blink_start() local
3947 val = bwi_led_onoff(led, val, 1); in bwi_led_blink_start()
3950 if (led->l_flags & BWI_LED_F_SLOW) { in bwi_led_blink_start()
3955 sc->sc_led_blinking = 1; in bwi_led_blink_start()
3956 sc->sc_led_blink_offdur = off_dur; in bwi_led_blink_start()
3958 callout_reset(&sc->sc_led_blink_ch, on_dur, bwi_led_blink_next, sc); in bwi_led_blink_start()
3968 val = bwi_led_onoff(sc->sc_blink_led, val, 0); in bwi_led_blink_next()
3971 callout_reset(&sc->sc_led_blink_ch, sc->sc_led_blink_offdur, in bwi_led_blink_next()
3979 sc->sc_led_blinking = 0; in bwi_led_blink_end()
3987 device_printf(sc->sc_dev, "%s begin, help!\n", __func__); in bwi_restart()