Lines Matching +full:timeout +full:- +full:tap +full:- +full:ms

64  * - MONITOR mode test.
65 * - Add HOSTAP mode.
66 * - Add IBSS mode.
67 * - Support the USB 1.0 devices (NET2280, ISL3880, ISL3886 chipsets).
70 * written by Jean-Baptiste Note <jean-baptiste.note@m4x.org> and
94 if (sc->sc_debug & (m)) \
171 static const char *upgt_fwname = "upgt-gw3887";
210 .timeout = UPGT_USB_TIMEOUT, /* ms */
230 if (uaa->usb_mode != USB_MODE_HOST) in upgt_match()
232 if (uaa->info.bConfigIndex != UPGT_CONFIG_INDEX) in upgt_match()
234 if (uaa->info.bIfaceIndex != UPGT_IFACE_INDEX) in upgt_match()
244 struct ieee80211com *ic = &sc->sc_ic; in upgt_attach()
250 sc->sc_dev = dev; in upgt_attach()
251 sc->sc_udev = uaa->device; in upgt_attach()
253 sc->sc_debug = upgt_debug; in upgt_attach()
257 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK, in upgt_attach()
259 callout_init(&sc->sc_led_ch, 0); in upgt_attach()
260 callout_init(&sc->sc_watchdog_ch, 0); in upgt_attach()
261 mbufq_init(&sc->sc_snd, ifqmaxlen); in upgt_attach()
263 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, in upgt_attach()
264 upgt_config, UPGT_N_XFERS, sc, &sc->sc_mtx); in upgt_attach()
271 sc->sc_rx_dma_buf = usbd_xfer_get_frame_buffer( in upgt_attach()
272 sc->sc_xfer[UPGT_BULK_RX], 0); in upgt_attach()
273 sc->sc_tx_dma_buf = usbd_xfer_get_frame_buffer( in upgt_attach()
274 sc->sc_xfer[UPGT_BULK_TX], 0); in upgt_attach()
293 if (sc->sc_memaddr_frame_start == 0 || sc->sc_memaddr_frame_end == 0) { in upgt_attach()
299 sc->sc_memaddr_frame_end -= UPGT_MEMSIZE_RX + 1; in upgt_attach()
300 sc->sc_memaddr_rx_start = sc->sc_memaddr_frame_end + 1; in upgt_attach()
303 sc->sc_memaddr_frame_start); in upgt_attach()
305 sc->sc_memaddr_frame_end); in upgt_attach()
307 sc->sc_memaddr_rx_start); in upgt_attach()
327 ic->ic_softc = sc; in upgt_attach()
328 ic->ic_name = device_get_nameunit(dev); in upgt_attach()
329 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ in upgt_attach()
330 ic->ic_opmode = IEEE80211_M_STA; in upgt_attach()
332 ic->ic_caps = in upgt_attach()
347 ic->ic_raw_xmit = upgt_raw_xmit; in upgt_attach()
348 ic->ic_scan_start = upgt_scan_start; in upgt_attach()
349 ic->ic_scan_end = upgt_scan_end; in upgt_attach()
350 ic->ic_set_channel = upgt_set_channel; in upgt_attach()
351 ic->ic_vap_create = upgt_vap_create; in upgt_attach()
352 ic->ic_vap_delete = upgt_vap_delete; in upgt_attach()
353 ic->ic_update_mcast = upgt_update_mcast; in upgt_attach()
354 ic->ic_transmit = upgt_transmit; in upgt_attach()
355 ic->ic_parent = upgt_parent; in upgt_attach()
357 ic->ic_flags_ext |= IEEE80211_FEXT_SEQNO_OFFLOAD; in upgt_attach()
360 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), in upgt_attach()
362 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), in upgt_attach()
374 fail2: usbd_transfer_unsetup(sc->sc_xfer, UPGT_N_XFERS); in upgt_attach()
375 fail1: mtx_destroy(&sc->sc_mtx); in upgt_attach()
384 if (data->m) { in upgt_txeof()
386 ieee80211_tx_complete(data->ni, data->m, 0); in upgt_txeof()
387 data->m = NULL; in upgt_txeof()
388 data->ni = NULL; in upgt_txeof()
401 device_printf(sc->sc_dev, "%s: out of buffers.\n", __func__); in upgt_get_stats()
408 memset(data_cmd->buf, 0, MCLBYTES); in upgt_get_stats()
410 mem = (struct upgt_lmac_mem *)data_cmd->buf; in upgt_get_stats()
411 mem->addr = htole32(sc->sc_memaddr_frame_start + in upgt_get_stats()
416 stats->header1.flags = 0; in upgt_get_stats()
417 stats->header1.type = UPGT_H1_TYPE_CTRL; in upgt_get_stats()
418 stats->header1.len = htole16( in upgt_get_stats()
419 sizeof(struct upgt_lmac_stats) - sizeof(struct upgt_lmac_header)); in upgt_get_stats()
421 stats->header2.reqid = htole32(sc->sc_memaddr_frame_start); in upgt_get_stats()
422 stats->header2.type = htole16(UPGT_H2_TYPE_STATS); in upgt_get_stats()
423 stats->header2.flags = 0; in upgt_get_stats()
425 data_cmd->buflen = sizeof(*mem) + sizeof(*stats); in upgt_get_stats()
427 mem->chksum = upgt_chksum_le((uint32_t *)stats, in upgt_get_stats()
428 data_cmd->buflen - sizeof(*mem)); in upgt_get_stats()
436 struct upgt_softc *sc = ic->ic_softc; in upgt_parent()
440 if (sc->sc_flags & UPGT_FLAG_DETACHED) { in upgt_parent()
444 if (ic->ic_nrunning > 0) { in upgt_parent()
445 if (sc->sc_flags & UPGT_FLAG_INITDONE) { in upgt_parent()
446 if (ic->ic_allmulti > 0 || ic->ic_promisc > 0) in upgt_parent()
452 } else if (sc->sc_flags & UPGT_FLAG_INITDONE) in upgt_parent()
465 if (sc->sc_flags & UPGT_FLAG_INITDONE) in upgt_stop()
469 sc->sc_tx_timer = 0; in upgt_stop()
470 sc->sc_flags &= ~UPGT_FLAG_INITDONE; in upgt_stop()
482 device_printf(sc->sc_dev, "%s: out of buffers.\n", __func__); in upgt_set_led()
489 memset(data_cmd->buf, 0, MCLBYTES); in upgt_set_led()
491 mem = (struct upgt_lmac_mem *)data_cmd->buf; in upgt_set_led()
492 mem->addr = htole32(sc->sc_memaddr_frame_start + in upgt_set_led()
497 led->header1.flags = UPGT_H1_FLAGS_TX_NO_CALLBACK; in upgt_set_led()
498 led->header1.type = UPGT_H1_TYPE_CTRL; in upgt_set_led()
499 led->header1.len = htole16( in upgt_set_led()
500 sizeof(struct upgt_lmac_led) - in upgt_set_led()
503 led->header2.reqid = htole32(sc->sc_memaddr_frame_start); in upgt_set_led()
504 led->header2.type = htole16(UPGT_H2_TYPE_LED); in upgt_set_led()
505 led->header2.flags = 0; in upgt_set_led()
509 led->mode = htole16(UPGT_LED_MODE_SET); in upgt_set_led()
510 led->action_fix = 0; in upgt_set_led()
511 led->action_tmp = htole16(UPGT_LED_ACTION_OFF); in upgt_set_led()
512 led->action_tmp_dur = 0; in upgt_set_led()
515 led->mode = htole16(UPGT_LED_MODE_SET); in upgt_set_led()
516 led->action_fix = 0; in upgt_set_led()
517 led->action_tmp = htole16(UPGT_LED_ACTION_ON); in upgt_set_led()
518 led->action_tmp_dur = 0; in upgt_set_led()
521 if (sc->sc_state != IEEE80211_S_RUN) { in upgt_set_led()
522 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data_cmd, next); in upgt_set_led()
525 if (sc->sc_led_blink) { in upgt_set_led()
527 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data_cmd, next); in upgt_set_led()
530 led->mode = htole16(UPGT_LED_MODE_SET); in upgt_set_led()
531 led->action_fix = htole16(UPGT_LED_ACTION_OFF); in upgt_set_led()
532 led->action_tmp = htole16(UPGT_LED_ACTION_ON); in upgt_set_led()
533 led->action_tmp_dur = htole16(UPGT_LED_ACTION_TMP_DUR); in upgt_set_led()
535 sc->sc_led_blink = 1; in upgt_set_led()
536 callout_reset(&sc->sc_led_ch, hz, upgt_set_led_blink, sc); in upgt_set_led()
539 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data_cmd, next); in upgt_set_led()
543 data_cmd->buflen = sizeof(*mem) + sizeof(*led); in upgt_set_led()
545 mem->chksum = upgt_chksum_le((uint32_t *)led, in upgt_set_led()
546 data_cmd->buflen - sizeof(*mem)); in upgt_set_led()
557 sc->sc_led_blink = 0; in upgt_set_led_blink()
566 if (sc->sc_flags & UPGT_FLAG_INITDONE) in upgt_init()
569 usbd_transfer_start(sc->sc_xfer[UPGT_BULK_RX]); in upgt_init()
573 sc->sc_flags |= UPGT_FLAG_INITDONE; in upgt_init()
575 callout_reset(&sc->sc_watchdog_ch, hz, upgt_watchdog, sc); in upgt_init()
581 struct ieee80211com *ic = &sc->sc_ic; in upgt_set_macfilter()
582 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); in upgt_set_macfilter()
592 device_printf(sc->sc_dev, "out of TX buffers.\n"); in upgt_set_macfilter()
599 memset(data_cmd->buf, 0, MCLBYTES); in upgt_set_macfilter()
601 mem = (struct upgt_lmac_mem *)data_cmd->buf; in upgt_set_macfilter()
602 mem->addr = htole32(sc->sc_memaddr_frame_start + in upgt_set_macfilter()
607 filter->header1.flags = UPGT_H1_FLAGS_TX_NO_CALLBACK; in upgt_set_macfilter()
608 filter->header1.type = UPGT_H1_TYPE_CTRL; in upgt_set_macfilter()
609 filter->header1.len = htole16( in upgt_set_macfilter()
610 sizeof(struct upgt_lmac_filter) - in upgt_set_macfilter()
613 filter->header2.reqid = htole32(sc->sc_memaddr_frame_start); in upgt_set_macfilter()
614 filter->header2.type = htole16(UPGT_H2_TYPE_MACFILTER); in upgt_set_macfilter()
615 filter->header2.flags = 0; in upgt_set_macfilter()
621 filter->type = htole16(UPGT_FILTER_TYPE_RESET); in upgt_set_macfilter()
627 filter->type = htole16(UPGT_FILTER_TYPE_NONE); in upgt_set_macfilter()
628 IEEE80211_ADDR_COPY(filter->dst, in upgt_set_macfilter()
629 vap ? vap->iv_myaddr : ic->ic_macaddr); in upgt_set_macfilter()
630 IEEE80211_ADDR_COPY(filter->src, ieee80211broadcastaddr); in upgt_set_macfilter()
631 filter->unknown1 = htole16(UPGT_FILTER_UNKNOWN1); in upgt_set_macfilter()
632 filter->rxaddr = htole32(sc->sc_memaddr_rx_start); in upgt_set_macfilter()
633 filter->unknown2 = htole16(UPGT_FILTER_UNKNOWN2); in upgt_set_macfilter()
634 filter->rxhw = htole32(sc->sc_eeprom_hwrx); in upgt_set_macfilter()
635 filter->unknown3 = htole16(UPGT_FILTER_UNKNOWN3); in upgt_set_macfilter()
638 ni = ieee80211_ref_node(vap->iv_bss); in upgt_set_macfilter()
640 if (vap->iv_opmode == IEEE80211_M_MONITOR) { in upgt_set_macfilter()
641 filter->type = htole16(UPGT_FILTER_TYPE_MONITOR); in upgt_set_macfilter()
642 IEEE80211_ADDR_COPY(filter->dst, in upgt_set_macfilter()
643 vap ? vap->iv_myaddr : ic->ic_macaddr); in upgt_set_macfilter()
644 IEEE80211_ADDR_COPY(filter->src, ni->ni_bssid); in upgt_set_macfilter()
645 filter->unknown1 = htole16(UPGT_FILTER_MONITOR_UNKNOWN1); in upgt_set_macfilter()
646 filter->rxaddr = htole32(sc->sc_memaddr_rx_start); in upgt_set_macfilter()
647 filter->unknown2 = htole16(UPGT_FILTER_MONITOR_UNKNOWN2); in upgt_set_macfilter()
648 filter->rxhw = htole32(sc->sc_eeprom_hwrx); in upgt_set_macfilter()
649 filter->unknown3 = htole16(UPGT_FILTER_MONITOR_UNKNOWN3); in upgt_set_macfilter()
653 ether_sprintf(ni->ni_bssid)); in upgt_set_macfilter()
654 filter->type = htole16(UPGT_FILTER_TYPE_STA); in upgt_set_macfilter()
655 IEEE80211_ADDR_COPY(filter->dst, in upgt_set_macfilter()
656 vap ? vap->iv_myaddr : ic->ic_macaddr); in upgt_set_macfilter()
657 IEEE80211_ADDR_COPY(filter->src, ni->ni_bssid); in upgt_set_macfilter()
658 filter->unknown1 = htole16(UPGT_FILTER_UNKNOWN1); in upgt_set_macfilter()
659 filter->rxaddr = htole32(sc->sc_memaddr_rx_start); in upgt_set_macfilter()
660 filter->unknown2 = htole16(UPGT_FILTER_UNKNOWN2); in upgt_set_macfilter()
661 filter->rxhw = htole32(sc->sc_eeprom_hwrx); in upgt_set_macfilter()
662 filter->unknown3 = htole16(UPGT_FILTER_UNKNOWN3); in upgt_set_macfilter()
667 device_printf(sc->sc_dev, in upgt_set_macfilter()
672 data_cmd->buflen = sizeof(*mem) + sizeof(*filter); in upgt_set_macfilter()
674 mem->chksum = upgt_chksum_le((uint32_t *)filter, in upgt_set_macfilter()
675 data_cmd->buflen - sizeof(*mem)); in upgt_set_macfilter()
685 struct upgt_softc *sc = ic->ic_softc; in upgt_setup_rates()
706 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; in upgt_setup_rates()
709 if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) { in upgt_setup_rates()
715 if (ic->ic_curmode == IEEE80211_MODE_11B) in upgt_setup_rates()
716 memcpy(sc->sc_cur_rateset, rateset_auto_11b, in upgt_setup_rates()
717 sizeof(sc->sc_cur_rateset)); in upgt_setup_rates()
718 if (ic->ic_curmode == IEEE80211_MODE_11G || in upgt_setup_rates()
719 ic->ic_curmode == IEEE80211_MODE_AUTO) in upgt_setup_rates()
720 memcpy(sc->sc_cur_rateset, rateset_auto_11g, in upgt_setup_rates()
721 sizeof(sc->sc_cur_rateset)); in upgt_setup_rates()
724 memset(sc->sc_cur_rateset, rateset_fix_11bg[tp->ucastrate], in upgt_setup_rates()
725 sizeof(sc->sc_cur_rateset)); in upgt_setup_rates()
739 struct upgt_softc *sc = ic->ic_softc; in upgt_transmit()
743 if ((sc->sc_flags & UPGT_FLAG_INITDONE) == 0) { in upgt_transmit()
747 error = mbufq_enqueue(&sc->sc_snd, m); in upgt_transmit()
767 if ((sc->sc_flags & UPGT_FLAG_INITDONE) == 0) in upgt_start()
770 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { in upgt_start()
773 mbufq_prepend(&sc->sc_snd, m); in upgt_start()
777 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; in upgt_start()
778 m->m_pkthdr.rcvif = NULL; in upgt_start()
781 if_inc_counter(ni->ni_vap->iv_ifp, in upgt_start()
783 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, data_tx, next); in upgt_start()
788 sc->sc_tx_timer = 5; in upgt_start()
796 struct ieee80211com *ic = ni->ni_ic; in upgt_raw_xmit()
797 struct upgt_softc *sc = ic->ic_softc; in upgt_raw_xmit()
802 if (!(sc->sc_flags & UPGT_FLAG_INITDONE)) { in upgt_raw_xmit()
816 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, data_tx, next); in upgt_raw_xmit()
823 sc->sc_tx_timer = 5; in upgt_raw_xmit()
831 struct ieee80211com *ic = &sc->sc_ic; in upgt_watchdog()
833 if (sc->sc_tx_timer > 0) { in upgt_watchdog()
834 if (--sc->sc_tx_timer == 0) { in upgt_watchdog()
835 device_printf(sc->sc_dev, "watchdog timeout\n"); in upgt_watchdog()
837 counter_u64_add(ic->ic_oerrors, 1); in upgt_watchdog()
840 callout_reset(&sc->sc_watchdog_ch, hz, upgt_watchdog, sc); in upgt_watchdog()
849 for (i = 0; i < sc->sc_memory.pages; i++) { in upgt_mem_alloc()
850 if (sc->sc_memory.page[i].used == 0) { in upgt_mem_alloc()
851 sc->sc_memory.page[i].used = 1; in upgt_mem_alloc()
852 return (sc->sc_memory.page[i].addr); in upgt_mem_alloc()
874 struct upgt_softc *sc = ic->ic_softc; in upgt_set_channel()
877 upgt_set_chan(sc, ic->ic_curchan); in upgt_set_channel()
884 struct ieee80211com *ic = &sc->sc_ic; in upgt_set_chan()
895 device_printf(sc->sc_dev, in upgt_set_chan()
904 device_printf(sc->sc_dev, "%s: out of buffers.\n", __func__); in upgt_set_chan()
910 memset(data_cmd->buf, 0, MCLBYTES); in upgt_set_chan()
912 mem = (struct upgt_lmac_mem *)data_cmd->buf; in upgt_set_chan()
913 mem->addr = htole32(sc->sc_memaddr_frame_start + in upgt_set_chan()
918 chan->header1.flags = UPGT_H1_FLAGS_TX_NO_CALLBACK; in upgt_set_chan()
919 chan->header1.type = UPGT_H1_TYPE_CTRL; in upgt_set_chan()
920 chan->header1.len = htole16( in upgt_set_chan()
921 sizeof(struct upgt_lmac_channel) - sizeof(struct upgt_lmac_header)); in upgt_set_chan()
923 chan->header2.reqid = htole32(sc->sc_memaddr_frame_start); in upgt_set_chan()
924 chan->header2.type = htole16(UPGT_H2_TYPE_CHANNEL); in upgt_set_chan()
925 chan->header2.flags = 0; in upgt_set_chan()
927 chan->unknown1 = htole16(UPGT_CHANNEL_UNKNOWN1); in upgt_set_chan()
928 chan->unknown2 = htole16(UPGT_CHANNEL_UNKNOWN2); in upgt_set_chan()
929 chan->freq6 = sc->sc_eeprom_freq6[channel]; in upgt_set_chan()
930 chan->settings = sc->sc_eeprom_freq6_settings; in upgt_set_chan()
931 chan->unknown3 = UPGT_CHANNEL_UNKNOWN3; in upgt_set_chan()
933 memcpy(chan->freq3_1, &sc->sc_eeprom_freq3[channel].data, in upgt_set_chan()
934 sizeof(chan->freq3_1)); in upgt_set_chan()
935 memcpy(chan->freq4, &sc->sc_eeprom_freq4[channel], in upgt_set_chan()
936 sizeof(sc->sc_eeprom_freq4[channel])); in upgt_set_chan()
937 memcpy(chan->freq3_2, &sc->sc_eeprom_freq3[channel].data, in upgt_set_chan()
938 sizeof(chan->freq3_2)); in upgt_set_chan()
940 data_cmd->buflen = sizeof(*mem) + sizeof(*chan); in upgt_set_chan()
942 mem->chksum = upgt_chksum_le((uint32_t *)chan, in upgt_set_chan()
943 data_cmd->buflen - sizeof(*mem)); in upgt_set_chan()
957 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ in upgt_vap_create()
960 vap = &uvp->vap; in upgt_vap_create()
971 uvp->newstate = vap->iv_newstate; in upgt_vap_create()
972 vap->iv_newstate = upgt_newstate; in upgt_vap_create()
980 ic->ic_opmode = opmode; in upgt_vap_create()
988 struct ieee80211com *ic = vap->iv_ic; in upgt_newstate()
989 struct upgt_softc *sc = ic->ic_softc; in upgt_newstate()
992 sc->sc_state = nstate; in upgt_newstate()
996 callout_stop(&sc->sc_led_ch); in upgt_newstate()
997 callout_stop(&sc->sc_watchdog_ch); in upgt_newstate()
1002 (void)upgt_set_macfilter(sc, sc->sc_state); in upgt_newstate()
1006 upgt_set_chan(sc, ic->ic_curchan); in upgt_newstate()
1009 upgt_set_chan(sc, ic->ic_curchan); in upgt_newstate()
1014 upgt_set_macfilter(sc, sc->sc_state); in upgt_newstate()
1022 return (uvp->newstate(vap, nstate, arg)); in upgt_newstate()
1037 struct upgt_softc *sc = ic->ic_softc; in upgt_update_mcast()
1045 struct ieee80211com *ic = &sc->sc_ic; in upgt_eeprom_parse()
1054 eeprom_header = (struct upgt_eeprom_header *)sc->sc_eeprom; in upgt_eeprom_parse()
1055 preamble_len = le16toh(eeprom_header->preamble_len); in upgt_eeprom_parse()
1056 eeprom_option = (struct upgt_eeprom_option *)(sc->sc_eeprom + in upgt_eeprom_parse()
1062 (sc->sc_eeprom + UPGT_EEPROM_SIZE)) { in upgt_eeprom_parse()
1068 (le16toh(eeprom_option->len) - 1) * sizeof(uint16_t); in upgt_eeprom_parse()
1070 le16toh(eeprom_option->type); in upgt_eeprom_parse()
1089 IEEE80211_ADDR_COPY(ic->ic_macaddr, in upgt_eeprom_parse()
1090 eeprom_option->data); in upgt_eeprom_parse()
1096 upgt_eeprom_parse_hwrx(sc, eeprom_option->data); in upgt_eeprom_parse()
1106 upgt_eeprom_parse_freq3(sc, eeprom_option->data, in upgt_eeprom_parse()
1113 upgt_eeprom_parse_freq4(sc, eeprom_option->data, in upgt_eeprom_parse()
1124 upgt_eeprom_parse_freq6(sc, eeprom_option->data, in upgt_eeprom_parse()
1145 (eeprom_option->data + option_len); in upgt_eeprom_parse()
1162 elements = freq3_header->elements; in upgt_eeprom_parse_freq3()
1165 freq3_header->flags, elements); in upgt_eeprom_parse_freq3()
1175 sc->sc_eeprom_freq3[channel] = freq3[i]; in upgt_eeprom_parse_freq3()
1178 le16toh(sc->sc_eeprom_freq3[channel].freq), channel); in upgt_eeprom_parse_freq3()
1196 elements = freq4_header->elements; in upgt_eeprom_parse_freq4()
1197 settings = freq4_header->settings; in upgt_eeprom_parse_freq4()
1200 sc->sc_eeprom_freq6_settings = freq4_header->settings; in upgt_eeprom_parse_freq4()
1203 freq4_header->flags, elements, settings); in upgt_eeprom_parse_freq4()
1215 sc->sc_eeprom_freq4[channel][j].cmd = freq4_2[j]; in upgt_eeprom_parse_freq4()
1216 sc->sc_eeprom_freq4[channel][j].pad = 0; in upgt_eeprom_parse_freq4()
1245 sc->sc_eeprom_freq6[channel] = freq6[i]; in upgt_eeprom_parse_freq6()
1248 le16toh(sc->sc_eeprom_freq6[channel].freq), channel); in upgt_eeprom_parse_freq6()
1259 sc->sc_eeprom_hwrx = option_hwrx->rxfilter - UPGT_EEPROM_RX_CONST; in upgt_eeprom_parse_hwrx()
1262 sc->sc_eeprom_hwrx); in upgt_eeprom_parse_hwrx()
1274 usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(100)); in upgt_eeprom_read()
1291 memset(data_cmd->buf, 0, MCLBYTES); in upgt_eeprom_read()
1293 mem = (struct upgt_lmac_mem *)data_cmd->buf; in upgt_eeprom_read()
1294 mem->addr = htole32(sc->sc_memaddr_frame_start + in upgt_eeprom_read()
1298 eeprom->header1.flags = 0; in upgt_eeprom_read()
1299 eeprom->header1.type = UPGT_H1_TYPE_CTRL; in upgt_eeprom_read()
1300 eeprom->header1.len = htole16(( in upgt_eeprom_read()
1301 sizeof(struct upgt_lmac_eeprom) - in upgt_eeprom_read()
1304 eeprom->header2.reqid = htole32(sc->sc_memaddr_frame_start); in upgt_eeprom_read()
1305 eeprom->header2.type = htole16(UPGT_H2_TYPE_EEPROM); in upgt_eeprom_read()
1306 eeprom->header2.flags = 0; in upgt_eeprom_read()
1308 eeprom->offset = htole16(offset); in upgt_eeprom_read()
1309 eeprom->len = htole16(block); in upgt_eeprom_read()
1311 data_cmd->buflen = sizeof(*mem) + sizeof(*eeprom) + block; in upgt_eeprom_read()
1313 mem->chksum = upgt_chksum_le((uint32_t *)eeprom, in upgt_eeprom_read()
1314 data_cmd->buflen - sizeof(*mem)); in upgt_eeprom_read()
1317 error = mtx_sleep(sc, &sc->sc_mtx, 0, "eeprom_request", hz); in upgt_eeprom_read()
1319 device_printf(sc->sc_dev, in upgt_eeprom_read()
1320 "timeout while waiting for EEPROM data\n"); in upgt_eeprom_read()
1326 if (UPGT_EEPROM_SIZE - offset < block) in upgt_eeprom_read()
1327 block = UPGT_EEPROM_SIZE - offset; in upgt_eeprom_read()
1356 if (!(sc->sc_flags & UPGT_FLAG_FWLOADED) && in upgt_rxeof()
1357 (memcmp(data->buf, "OK", 2) == 0)) { in upgt_rxeof()
1358 sc->sc_flags |= UPGT_FLAG_FWLOADED; in upgt_rxeof()
1369 header = (struct upgt_lmac_header *)(data->buf + 4); in upgt_rxeof()
1371 h1_type = header->header1.type; in upgt_rxeof()
1372 h2_type = le16toh(header->header2.type); in upgt_rxeof()
1375 eeprom = (struct upgt_lmac_eeprom *)(data->buf + 4); in upgt_rxeof()
1376 uint16_t eeprom_offset = le16toh(eeprom->offset); in upgt_rxeof()
1377 uint16_t eeprom_len = le16toh(eeprom->len); in upgt_rxeof()
1383 memcpy(sc->sc_eeprom + eeprom_offset, in upgt_rxeof()
1384 data->buf + sizeof(struct upgt_lmac_eeprom) + 4, in upgt_rxeof()
1393 upgt_tx_done(sc, data->buf + 4); in upgt_rxeof()
1398 m = upgt_rx(sc, data->buf + 4, le16toh(header->header1.len), in upgt_rxeof()
1409 header->header1.type); in upgt_rxeof()
1435 struct ieee80211com *ic = &sc->sc_ic; in upgt_rx()
1443 if (!(sc->sc_flags & UPGT_FLAG_INITDONE)) in upgt_rx()
1454 device_printf(sc->sc_dev, "could not create RX mbuf\n"); in upgt_rx()
1458 memcpy(mtod(m, char *), rxdesc->data, pkglen); in upgt_rx()
1460 m->m_len = m->m_pkthdr.len = pkglen - IEEE80211_CRC_LEN; in upgt_rx()
1463 struct upgt_rx_radiotap_header *tap = &sc->sc_rxtap; in upgt_rx() local
1465 tap->wr_flags = 0; in upgt_rx()
1466 tap->wr_rate = upgt_rx_rate(sc, rxdesc->rate); in upgt_rx()
1467 tap->wr_antsignal = rxdesc->rssi; in upgt_rx()
1471 *rssi = rxdesc->rssi; in upgt_rx()
1478 struct ieee80211com *ic = &sc->sc_ic; in upgt_rx_rate()
1483 if (ic->ic_curmode == IEEE80211_MODE_11B && in upgt_rx_rate()
1487 if (ic->ic_curmode == IEEE80211_MODE_11G && in upgt_rx_rate()
1505 struct upgt_data *data_tx = &sc->sc_tx_data[i]; in upgt_tx_done()
1507 if (data_tx->addr == le32toh(desc->header2.reqid)) { in upgt_tx_done()
1508 upgt_mem_free(sc, data_tx->addr); in upgt_tx_done()
1509 data_tx->ni = NULL; in upgt_tx_done()
1510 data_tx->addr = 0; in upgt_tx_done()
1511 data_tx->m = NULL; in upgt_tx_done()
1515 le32toh(desc->header2.reqid), in upgt_tx_done()
1516 le16toh(desc->status), le16toh(desc->rssi)); in upgt_tx_done()
1518 le16toh(desc->seq)); in upgt_tx_done()
1526 sc->sc_tx_timer = 0; in upgt_tx_done()
1537 for (i = 0; i < sc->sc_memory.pages; i++) { in upgt_mem_free()
1538 if (sc->sc_memory.page[i].addr == addr) { in upgt_mem_free()
1539 sc->sc_memory.page[i].used = 0; in upgt_mem_free()
1544 device_printf(sc->sc_dev, in upgt_mem_free()
1563 device_printf(sc->sc_dev, "could not read microcode %s\n", in upgt_fw_load()
1576 data_cmd->buflen = sizeof(start_fwload_cmd); in upgt_fw_load()
1577 memcpy(data_cmd->buf, start_fwload_cmd, data_cmd->buflen); in upgt_fw_load()
1586 data_cmd->buflen = sizeof(struct upgt_fw_x2_header); in upgt_fw_load()
1587 x2 = (struct upgt_fw_x2_header *)data_cmd->buf; in upgt_fw_load()
1588 memcpy(x2->signature, UPGT_X2_SIGNATURE, UPGT_X2_SIGNATURE_SIZE); in upgt_fw_load()
1589 x2->startaddr = htole32(UPGT_MEMADDR_FIRMWARE_START); in upgt_fw_load()
1590 x2->len = htole32(fw->datasize); in upgt_fw_load()
1591 x2->crc = upgt_crc32_le((uint8_t *)data_cmd->buf + in upgt_fw_load()
1593 sizeof(struct upgt_fw_x2_header) - UPGT_X2_SIGNATURE_SIZE - in upgt_fw_load()
1598 for (offset = 0; offset < fw->datasize; offset += bsize) { in upgt_fw_load()
1599 if (fw->datasize - offset > UPGT_FW_BLOCK_SIZE) in upgt_fw_load()
1602 bsize = fw->datasize - offset; in upgt_fw_load()
1609 n = upgt_fw_copy((const uint8_t *)fw->data + offset, in upgt_fw_load()
1610 data_cmd->buf, bsize); in upgt_fw_load()
1611 data_cmd->buflen = bsize; in upgt_fw_load()
1626 crc32 = upgt_crc32_le(fw->data, fw->datasize); in upgt_fw_load()
1627 *((uint32_t *)(data_cmd->buf) ) = crc32; in upgt_fw_load()
1628 *((uint8_t *)(data_cmd->buf) + 4) = 'g'; in upgt_fw_load()
1629 *((uint8_t *)(data_cmd->buf) + 5) = '\r'; in upgt_fw_load()
1630 data_cmd->buflen = 6; in upgt_fw_load()
1634 usbd_transfer_start(sc->sc_xfer[UPGT_BULK_RX]); in upgt_fw_load()
1635 error = mtx_sleep(sc, &sc->sc_mtx, 0, "upgtfw", 2 * hz); in upgt_fw_load()
1637 device_printf(sc->sc_dev, "firmware load failed\n"); in upgt_fw_load()
1655 /* apply final XOR value as common for CRC-32 */ in upgt_crc32_le()
1664 * 0x7e -> 0x7d 0x5e
1665 * 0x7d -> 0x7d 0x5d
1702 sc->sc_memory.page[i].used = 0; in upgt_mem_init()
1709 sc->sc_memory.page[i].addr = in upgt_mem_init()
1710 sc->sc_memaddr_frame_start + MCLBYTES; in upgt_mem_init()
1712 sc->sc_memory.page[i].addr = in upgt_mem_init()
1713 sc->sc_memory.page[i - 1].addr + MCLBYTES; in upgt_mem_init()
1716 if (sc->sc_memory.page[i].addr + MCLBYTES >= in upgt_mem_init()
1717 sc->sc_memaddr_frame_end) in upgt_mem_init()
1721 i, sc->sc_memory.page[i].addr); in upgt_mem_init()
1724 sc->sc_memory.pages = i; in upgt_mem_init()
1726 DPRINTF(sc, UPGT_DEBUG_FW, "memory pages=%d\n", sc->sc_memory.pages); in upgt_mem_init()
1745 device_printf(sc->sc_dev, "could not read microcode %s\n", in upgt_fw_verify()
1753 for (offset = 0; offset < fw->datasize; offset += sizeof(*uc)) { in upgt_fw_verify()
1754 uc = (const uint32_t *)((const uint8_t *)fw->data + offset); in upgt_fw_verify()
1758 for (; offset < fw->datasize; offset += sizeof(*uc)) { in upgt_fw_verify()
1759 uc = (const uint32_t *)((const uint8_t *)fw->data + offset); in upgt_fw_verify()
1763 if (offset == fw->datasize) { in upgt_fw_verify()
1764 device_printf(sc->sc_dev, in upgt_fw_verify()
1776 while (offset < fw->datasize && bra_end == 0) { in upgt_fw_verify()
1778 p = (const uint8_t *)fw->data + offset; in upgt_fw_verify()
1780 bra_option_type = le32toh(bra_opt->type); in upgt_fw_verify()
1781 bra_option_len = le32toh(bra_opt->len) * sizeof(*uc); in upgt_fw_verify()
1789 device_printf(sc->sc_dev, in upgt_fw_verify()
1794 if (memcmp(UPGT_BRA_FWTYPE_LM86, bra_opt->data, in upgt_fw_verify()
1796 sc->sc_fw_type = UPGT_FWTYPE_LM86; in upgt_fw_verify()
1799 if (memcmp(UPGT_BRA_FWTYPE_LM87, bra_opt->data, in upgt_fw_verify()
1801 sc->sc_fw_type = UPGT_FWTYPE_LM87; in upgt_fw_verify()
1804 device_printf(sc->sc_dev, in upgt_fw_verify()
1824 descr = (const struct upgt_fw_bra_descr *)bra_opt->data; in upgt_fw_verify()
1826 sc->sc_memaddr_frame_start = in upgt_fw_verify()
1827 le32toh(descr->memaddr_space_start); in upgt_fw_verify()
1828 sc->sc_memaddr_frame_end = in upgt_fw_verify()
1829 le32toh(descr->memaddr_space_end); in upgt_fw_verify()
1833 sc->sc_memaddr_frame_start); in upgt_fw_verify()
1836 sc->sc_memaddr_frame_end); in upgt_fw_verify()
1866 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next); in upgt_bulk_tx()
1868 usbd_transfer_start(sc->sc_xfer[UPGT_BULK_TX]); in upgt_bulk_tx()
1884 memcpy(data->buf, init_cmd, sizeof(init_cmd)); in upgt_device_reset()
1885 data->buflen = sizeof(init_cmd); in upgt_device_reset()
1887 usb_pause_mtx(&sc->sc_mtx, USB_MS_TO_TICKS(100)); in upgt_device_reset()
1899 STAILQ_INIT(&sc->sc_tx_active); in upgt_alloc_tx()
1900 STAILQ_INIT(&sc->sc_tx_inactive); in upgt_alloc_tx()
1901 STAILQ_INIT(&sc->sc_tx_pending); in upgt_alloc_tx()
1904 struct upgt_data *data = &sc->sc_tx_data[i]; in upgt_alloc_tx()
1905 data->buf = ((uint8_t *)sc->sc_tx_dma_buf) + (i * MCLBYTES); in upgt_alloc_tx()
1906 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); in upgt_alloc_tx()
1918 STAILQ_INIT(&sc->sc_rx_active); in upgt_alloc_rx()
1919 STAILQ_INIT(&sc->sc_rx_inactive); in upgt_alloc_rx()
1922 struct upgt_data *data = &sc->sc_rx_data[i]; in upgt_alloc_rx()
1923 data->buf = ((uint8_t *)sc->sc_rx_dma_buf) + (i * MCLBYTES); in upgt_alloc_rx()
1924 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); in upgt_alloc_rx()
1933 struct ieee80211com *ic = &sc->sc_ic; in upgt_detach()
1941 sc->sc_flags |= UPGT_FLAG_DETACHED; in upgt_detach()
1943 STAILQ_INIT(&sc->sc_tx_active); in upgt_detach()
1944 STAILQ_INIT(&sc->sc_tx_inactive); in upgt_detach()
1945 STAILQ_INIT(&sc->sc_tx_pending); in upgt_detach()
1947 STAILQ_INIT(&sc->sc_rx_active); in upgt_detach()
1948 STAILQ_INIT(&sc->sc_rx_inactive); in upgt_detach()
1953 callout_drain(&sc->sc_led_ch); in upgt_detach()
1954 callout_drain(&sc->sc_watchdog_ch); in upgt_detach()
1958 usbd_transfer_drain(sc->sc_xfer[x]); in upgt_detach()
1967 usbd_transfer_unsetup(sc->sc_xfer, UPGT_N_XFERS); in upgt_detach()
1970 mbufq_drain(&sc->sc_snd); in upgt_detach()
1971 mtx_destroy(&sc->sc_mtx); in upgt_detach()
1982 struct upgt_data *data = &sc->sc_rx_data[i]; in upgt_free_rx()
1984 data->buf = NULL; in upgt_free_rx()
1985 data->ni = NULL; in upgt_free_rx()
1995 struct upgt_data *data = &sc->sc_tx_data[i]; in upgt_free_tx()
1997 if (data->ni != NULL) in upgt_free_tx()
1998 ieee80211_free_node(data->ni); in upgt_free_tx()
2000 data->buf = NULL; in upgt_free_tx()
2001 data->ni = NULL; in upgt_free_tx()
2013 usbd_transfer_stop(sc->sc_xfer[i]); in upgt_abort_xfers_locked()
2036 stats = &sc->sc_stat; in upgt_sysctl_node()
2037 ctx = device_get_sysctl_ctx(sc->sc_dev); in upgt_sysctl_node()
2038 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); in upgt_sysctl_node()
2044 &stats->st_tx_active, "Active numbers in TX queue"); in upgt_sysctl_node()
2046 &stats->st_tx_inactive, "Inactive numbers in TX queue"); in upgt_sysctl_node()
2048 &stats->st_tx_pending, "Pending numbers in TX queue"); in upgt_sysctl_node()
2058 bf = STAILQ_FIRST(&sc->sc_tx_inactive); in _upgt_getbuf()
2060 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next); in _upgt_getbuf()
2095 bf->addr = upgt_mem_alloc(sc); in upgt_gettxbuf()
2096 if (bf->addr == 0) { in upgt_gettxbuf()
2099 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); in upgt_gettxbuf()
2110 struct ieee80211vap *vap = ni->ni_vap; in upgt_tx_start()
2122 ieee80211_output_seqno_assign(ni, -1, m); in upgt_tx_start()
2128 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { in upgt_tx_start()
2131 device_printf(sc->sc_dev, in upgt_tx_start()
2142 memset(data->buf, 0, MCLBYTES); in upgt_tx_start()
2143 mem = (struct upgt_lmac_mem *)data->buf; in upgt_tx_start()
2144 mem->addr = htole32(data->addr); in upgt_tx_start()
2149 txdesc->header1.flags = UPGT_H1_FLAGS_TX_MGMT; in upgt_tx_start()
2151 memset(txdesc->rates, 0x10, sizeof(txdesc->rates)); in upgt_tx_start()
2154 txdesc->header1.flags = UPGT_H1_FLAGS_TX_DATA; in upgt_tx_start()
2155 memcpy(txdesc->rates, sc->sc_cur_rateset, sizeof(txdesc->rates)); in upgt_tx_start()
2157 txdesc->header1.type = UPGT_H1_TYPE_TX_DATA; in upgt_tx_start()
2158 txdesc->header1.len = htole16(m->m_pkthdr.len); in upgt_tx_start()
2159 txdesc->header2.reqid = htole32(data->addr); in upgt_tx_start()
2160 txdesc->header2.type = htole16(UPGT_H2_TYPE_TX_ACK_YES); in upgt_tx_start()
2161 txdesc->header2.flags = htole16(UPGT_H2_FLAGS_TX_ACK_YES); in upgt_tx_start()
2162 txdesc->type = htole32(UPGT_TX_DESC_TYPE_DATA); in upgt_tx_start()
2163 txdesc->pad3[0] = UPGT_TX_DESC_PAD3_SIZE; in upgt_tx_start()
2166 struct upgt_tx_radiotap_header *tap = &sc->sc_txtap; in upgt_tx_start() local
2168 tap->wt_flags = 0; in upgt_tx_start()
2169 tap->wt_rate = 0; /* XXX where to get from? */ in upgt_tx_start()
2175 m_copydata(m, 0, m->m_pkthdr.len, in upgt_tx_start()
2176 data->buf + (sizeof(*mem) + sizeof(*txdesc))); in upgt_tx_start()
2178 len = sizeof(*mem) + sizeof(*txdesc) + m->m_pkthdr.len; in upgt_tx_start()
2182 mem->chksum = upgt_chksum_le((uint32_t *)txdesc, len - sizeof(*mem)); in upgt_tx_start()
2183 data->ni = ni; in upgt_tx_start()
2184 data->m = m; in upgt_tx_start()
2185 data->buflen = len; in upgt_tx_start()
2198 if (!(if_getcounter(vap->iv_ifp, IFCOUNTER_OPACKETS) % in upgt_tx_start()
2209 struct ieee80211com *ic = &sc->sc_ic; in upgt_bulk_rx_callback()
2215 int rssi = -1; in upgt_bulk_rx_callback()
2221 data = STAILQ_FIRST(&sc->sc_rx_active); in upgt_bulk_rx_callback()
2224 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); in upgt_bulk_rx_callback()
2226 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); in upgt_bulk_rx_callback()
2230 data = STAILQ_FIRST(&sc->sc_rx_inactive); in upgt_bulk_rx_callback()
2233 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); in upgt_bulk_rx_callback()
2234 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); in upgt_bulk_rx_callback()
2235 usbd_xfer_set_frame_data(xfer, 0, data->buf, MCLBYTES); in upgt_bulk_rx_callback()
2248 nf = -95; /* XXX */ in upgt_bulk_rx_callback()
2262 data = STAILQ_FIRST(&sc->sc_rx_active); in upgt_bulk_rx_callback()
2264 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); in upgt_bulk_rx_callback()
2265 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); in upgt_bulk_rx_callback()
2269 counter_u64_add(ic->ic_ierrors, 1); in upgt_bulk_rx_callback()
2285 data = STAILQ_FIRST(&sc->sc_tx_active); in upgt_bulk_tx_callback()
2288 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); in upgt_bulk_tx_callback()
2291 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); in upgt_bulk_tx_callback()
2296 data = STAILQ_FIRST(&sc->sc_tx_pending); in upgt_bulk_tx_callback()
2302 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next); in upgt_bulk_tx_callback()
2304 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next); in upgt_bulk_tx_callback()
2307 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen); in upgt_bulk_tx_callback()
2312 data = STAILQ_FIRST(&sc->sc_tx_active); in upgt_bulk_tx_callback()
2315 if (data->ni != NULL) { in upgt_bulk_tx_callback()
2316 if_inc_counter(data->ni->ni_vap->iv_ifp, in upgt_bulk_tx_callback()
2318 ieee80211_free_node(data->ni); in upgt_bulk_tx_callback()
2319 data->ni = NULL; in upgt_bulk_tx_callback()