Index: sys/dev/usb/if_run.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_run.c,v retrieving revision 1.32 diff -p -u -r1.32 if_run.c --- sys/dev/usb/if_run.c 22 Jan 2019 06:47:20 -0000 1.32 +++ sys/dev/usb/if_run.c 6 Oct 2019 16:09:24 -0000 @@ -18,7 +18,7 @@ */ /*- - * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver. + * Ralink Technology RT2700U/RT2800U/RT3000U/RT3900E chipset driver. * http://www.ralinktech.com/ */ @@ -122,6 +122,8 @@ static const struct usb_devno run_devs[] USB_ID(ASUSTEK, RT2870_5), USB_ID(ASUSTEK, RT3070), USB_ID(ASUSTEK, RT3070_1), + USB_ID(ASUSTEK, USBN53), + USB_ID(ASUSTEK, USBN66), USB_ID(ASUSTEK2, USBN11), USB_ID(AZUREWAVE, RT2870_1), USB_ID(AZUREWAVE, RT2870_2), @@ -138,6 +140,7 @@ static const struct usb_devno run_devs[] USB_ID(BELKIN, F7D1101V2), USB_ID(BELKIN, RT2870_1), USB_ID(BELKIN, RT2870_2), + USB_ID(BELKIN, RTL8192CU_2), USB_ID(BEWAN, RT3070), USB_ID(CISCOLINKSYS, AE1000), USB_ID(CISCOLINKSYS, AM10), @@ -162,6 +165,10 @@ static const struct usb_devno run_devs[] USB_ID(CYBERTAN, RT2870), USB_ID(DLINK, RT2870), USB_ID(DLINK, RT3072), + USB_ID(DLINK, DWA127), + USB_ID(DLINK, DWA140B3), + USB_ID(DLINK, DWA160B2), + USB_ID(DLINK, DWA162), USB_ID(DLINK2, DWA130), USB_ID(DLINK2, RT2870_1), USB_ID(DLINK2, RT2870_2), @@ -203,6 +210,9 @@ static const struct usb_devno run_devs[] USB_ID(LINKSYS4, WUSB600N), USB_ID(LINKSYS4, WUSB600NV2), USB_ID(LOGITEC, LANW300NU2), + USB_ID(LOGITEC, LANW300NU2S), + USB_ID(LOGITEC, LAN_W300ANU2), + USB_ID(LOGITEC, LAN_W450ANU2E), USB_ID(LOGITEC, RT2870_1), USB_ID(LOGITEC, RT2870_2), USB_ID(LOGITEC, RT2870_3), @@ -257,6 +267,7 @@ static const struct usb_devno run_devs[] USB_ID(RALINK, RT3072), USB_ID(RALINK, RT3370), USB_ID(RALINK, RT3572), + USB_ID(RALINK, RT3573), USB_ID(RALINK, RT5370), USB_ID(RALINK, RT5572), USB_ID(RALINK, RT8070), @@ -276,9 +287,11 @@ static const struct usb_devno run_devs[] USB_ID(SITECOMEU, RT2870_2), USB_ID(SITECOMEU, RT2870_3), USB_ID(SITECOMEU, RT3070_1), + USB_ID(SITECOMEU, RT3070_3), USB_ID(SITECOMEU, RT3072_3), USB_ID(SITECOMEU, RT3072_4), USB_ID(SITECOMEU, RT3072_5), + USB_ID(SITECOMEU, RT3072_6), USB_ID(SITECOMEU, WL302), USB_ID(SITECOMEU, WL315), USB_ID(SITECOMEU, WL321), @@ -352,7 +365,7 @@ static int run_rt3070_rf_write(struct r static int run_bbp_read(struct run_softc *, uint8_t, uint8_t *); static int run_bbp_write(struct run_softc *, uint8_t, uint8_t); static int run_mcu_cmd(struct run_softc *, uint8_t, uint16_t); -static const char * run_get_rf(int); +static const char * run_get_rf(uint16_t); static void run_rt3593_get_txpower(struct run_softc *); static void run_get_txpower(struct run_softc *); static int run_read_eeprom(struct run_softc *); @@ -850,6 +863,11 @@ run_alloc_tx_ring(struct run_softc *sc, { struct run_tx_ring *txq = &sc->txq[qid]; int i, error; + uint16_t txwisize; + + txwisize = sizeof(struct rt2860_txwi); + if (sc->mac_ver == 0x5592) + txwisize += sizeof(uint32_t); txq->cur = txq->queued = 0; @@ -870,8 +888,7 @@ run_alloc_tx_ring(struct run_softc *sc, data->buf = usbd_get_buffer(data->xfer); /* zeroize the TXD + TXWI part */ - memset(data->buf, 0, sizeof(struct rt2870_txd) + - sizeof(struct rt2860_txwi)); + memset(data->buf, 0, sizeof(struct rt2870_txd) + txwisize); } if (error != 0) fail: run_free_tx_ring(sc, qid); @@ -942,7 +959,9 @@ run_load_microcode(struct run_softc *sc) return error; usbd_delay_ms(sc->sc_udev, 10); + run_write(sc, RT2860_H2M_BBPAGENT, 0); run_write(sc, RT2860_H2M_MAILBOX, 0); + run_write(sc, RT2860_H2M_INTSRC, 0); if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0) return error; @@ -1106,6 +1125,7 @@ run_efuse_read(struct run_softc *sc, uin if ((error = run_read(sc, reg, &tmp)) != 0) return error; + tmp >>= (8 * (addr & 0x3)); *val = (addr & 1) ? tmp >> 16 : tmp & 0xffff; return 0; } @@ -1315,7 +1335,7 @@ b4inc(uint32_t b32, int8_t delta) } static const char * -run_get_rf(int rev) +run_get_rf(uint16_t rev) { switch (rev) { case RT2860_RF_2820: return "RT2820"; @@ -1487,34 +1507,45 @@ run_read_eeprom(struct run_softc *sc) ic->ic_myaddr[4] = val & 0xff; ic->ic_myaddr[5] = val >> 8; - /* read vendor BBP settings */ - for (i = 0; i < 10; i++) { - run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val); - sc->bbp[i].val = val & 0xff; - sc->bbp[i].reg = val >> 8; - DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val)); - } - - /* read vendor RF settings */ - for (i = 0; i < 8; i++) { - run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, &val); - sc->rf[i].val = val & 0xff; - sc->rf[i].reg = val >> 8; - DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg, - sc->rf[i].val)); + if (sc->mac_ver < 0x3593) { + /* read vendor BBP settings */ + for (i = 0; i < 10; i++) { + run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val); + sc->bbp[i].val = val & 0xff; + sc->bbp[i].reg = val >> 8; + DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, + sc->bbp[i].val)); + } + + if (sc->mac_ver >= 0x3071) { + /* read vendor RF settings */ + for (i = 0; i < 8; i++) { + run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, + &val); + sc->rf[i].val = val & 0xff; + sc->rf[i].reg = val >> 8; + DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg, + sc->rf[i].val)); + } + } } /* read RF frequency offset from EEPROM */ - run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS : + RT3593_EEPROM_FREQ, &val); sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0; DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff)); - + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS : + RT3593_EEPROM_FREQ, &val); if ((val >> 8) != 0xff) { /* read LEDs operating mode */ sc->leds = val >> 8; - run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]); - run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]); - run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED1 : + RT3593_EEPROM_LED1, &sc->led[0]); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED2 : + RT3593_EEPROM_LED2, &sc->led[1]); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED3 : + RT3593_EEPROM_LED3, &sc->led[2]); } else { /* broken EEPROM, use default settings */ sc->leds = 0x01; @@ -1526,7 +1557,10 @@ run_read_eeprom(struct run_softc *sc) sc->leds, sc->led[0], sc->led[1], sc->led[2])); /* read RF information */ - run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); + if (sc->mac_ver == 0x5390 || sc->mac_ver == 0x5392) + run_srom_read(sc, 0x00, &val); + else + run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); if (val == 0xffff) { DPRINTF(("invalid EEPROM antenna info, using default\n")); if (sc->mac_ver == 0x3572) { @@ -1546,11 +1580,15 @@ run_read_eeprom(struct run_softc *sc) sc->nrxchains = 2; } } else { - sc->rf_rev = (val >> 8) & 0xf; + if (sc->mac_ver == 0x5390 || sc->mac_ver == 0x5392) { + sc->rf_rev = val; + run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); + } else + sc->rf_rev = (val >> 8) & 0xf; sc->ntxchains = (val >> 4) & 0xf; sc->nrxchains = val & 0xf; } - DPRINTF(("EEPROM RF rev=0x%02x chains=%dT%dR\n", + DPRINTF(("EEPROM RF rev=0x%04x chains=%dT%dR\n", sc->rf_rev, sc->ntxchains, sc->nrxchains)); run_srom_read(sc, RT2860_EEPROM_CONFIG, &val); @@ -1607,11 +1645,14 @@ run_read_eeprom(struct run_softc *sc) sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx])); } + DPRINTF(("mac_ver %hx\n", sc->mac_ver)); /* read RSSI offsets and LNA gains from EEPROM */ - run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_2GHZ : + RT3593_EEPROM_RSSI1_2GHZ, &val); sc->rssi_2ghz[0] = val & 0xff; /* Ant A */ sc->rssi_2ghz[1] = val >> 8; /* Ant B */ - run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val); + run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_2GHZ : + RT3593_EEPROM_RSSI2_2GHZ, &val); if (sc->mac_ver >= 0x3070) { if (sc->mac_ver == 0x3593) { sc->txmixgain_2ghz = 0; @@ -1633,7 +1674,7 @@ run_read_eeprom(struct run_softc *sc) sc->lna[2] = val >> 8; /* channel group 2 */ run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ : - RT3593_EEPROM_RSSI2_5GHZ, &val); + RT3593_EEPROM_RSSI1_5GHZ, &val); sc->rssi_5ghz[0] = val & 0xff; /* Ant A */ sc->rssi_5ghz[1] = val >> 8; /* Ant B */ run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ : @@ -2207,6 +2248,11 @@ run_rx_frame(struct run_softc *sc, uint8 #endif rxwi = (struct rt2860_rxwi *)buf; + rxwisize = sizeof(struct rt2860_rxwi); + if (sc->mac_ver == 0x5592) + rxwisize += sizeof(uint64_t); + else if (sc->mac_ver == 0x3593) + rxwisize += sizeof(uint32_t); len = le16toh(rxwi->len) & 0xfff; if (__predict_false(len > dmalen)) { DPRINTF(("bad RXWI length %u > %u\n", len, dmalen)); @@ -2221,19 +2267,7 @@ run_rx_frame(struct run_softc *sc, uint8 return; } - rxwisize = sizeof(struct rt2860_rxwi); - if (sc->mac_ver == 0x5592) - rxwisize += sizeof(uint64_t); - else if (sc->mac_ver == 0x3593) - rxwisize += sizeof(uint32_t); - - wh = (struct ieee80211_frame *)(((uint8_t *)rxwi) + rxwisize); -#ifdef RUN_HWCRYPTO - if (wh->i_fc[1] & IEEE80211_FC1_WEP) { - wh->i_fc[1] &= ~IEEE80211_FC1_WEP; - decrypted = 1; - } -#endif + wh = (struct ieee80211_frame *)(buf + rxwisize); if (__predict_false((flags & RT2860_RX_MICERR))) { /* report MIC failures to net80211 for TKIP */ @@ -2241,13 +2275,20 @@ run_rx_frame(struct run_softc *sc, uint8 ifp->if_ierrors++; return; } - + if (flags & RT2860_RX_L2PAD) { u_int hdrlen = ieee80211_hdrspace(ic, wh); memmove((uint8_t *)wh + 2, wh, hdrlen); wh = (struct ieee80211_frame *)((uint8_t *)wh + 2); } +#ifdef RUN_HWCRYPTO + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { + wh->i_fc[1] &= ~IEEE80211_FC1_WEP; + decrypted = 1; + } +#endif + /* could use m_devget but net80211 wants contig mgmt frames */ MGETHDR(m, M_DONTWAIT, MT_DATA); if (__predict_false(m == NULL)) { @@ -2342,12 +2383,19 @@ run_rxeof(struct usbd_xfer *xfer, void * uint8_t *buf; uint32_t dmalen; int xferlen; + uint16_t rxwisize; if (__predict_false(sc->sc_flags & RUN_DETACHING)) return; + rxwisize = sizeof(struct rt2860_rxwi); + if (sc->mac_ver == 0x5592) + rxwisize += sizeof(uint64_t); + else if (sc->mac_ver == 0x3593) + rxwisize += sizeof(uint32_t); + if (__predict_false(status != USBD_NORMAL_COMPLETION)) { - DPRINTF(("RX status=%d\n", status)); + DPRINTF(("RX status=%s\n", usbd_errstr(status))); if (status == USBD_STALLED) usbd_clear_endpoint_stall_async(sc->rxq.pipeh); if (status != USBD_CANCELLED) @@ -2357,7 +2405,7 @@ run_rxeof(struct usbd_xfer *xfer, void * usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL); if (__predict_false(xferlen < (int)(sizeof(uint32_t) + - sizeof(struct rt2860_rxwi) + sizeof(struct rt2870_rxd)))) { + rxwisize + sizeof(struct rt2870_rxd)))) { DPRINTF(("xfer too short %d\n", xferlen)); goto skip; } @@ -2385,7 +2433,11 @@ run_rxeof(struct usbd_xfer *xfer, void * skip: /* setup a new transfer */ usbd_setup_xfer(xfer, data, data->buf, RUN_MAX_RXSZ, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof); - (void)usbd_transfer(xfer); + status = usbd_transfer(xfer); + if (status != USBD_NORMAL_COMPLETION && + status != USBD_IN_PROGRESS) + device_printf(sc->sc_dev, "requeuing rx failed: %s\n", + usbd_errstr(status)); } static void @@ -2397,22 +2449,27 @@ run_txeof(struct usbd_xfer *xfer, void * struct ifnet *ifp = &sc->sc_if; int s; + s = splnet(); + txq->queued--; + sc->qfullmsk &= ~(1 << data->qid); + if (__predict_false(status != USBD_NORMAL_COMPLETION)) { - DPRINTF(("TX status=%d\n", status)); + if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) + return; + + DPRINTF(("%s: usb error on tx: %s\n", + device_xname(sc->sc_dev), usbd_errstr(status))); if (status == USBD_STALLED) usbd_clear_endpoint_stall_async(txq->pipeh); ifp->if_oerrors++; + splx(s); return; } - s = splnet(); sc->sc_tx_timer = 0; ifp->if_opackets++; - if (--txq->queued < RUN_TX_RING_COUNT) { - sc->qfullmsk &= ~(1 << data->qid); - ifp->if_flags &= ~IFF_OACTIVE; - run_start(ifp); - } + ifp->if_flags &= ~IFF_OACTIVE; + run_start(ifp); splx(s); } @@ -2429,10 +2486,12 @@ run_tx(struct run_softc *sc, struct mbuf struct run_tx_data *data; struct rt2870_txd *txd; struct rt2860_txwi *txwi; - uint16_t dur, mcs; - uint8_t type, tid, qid, qos = 0; - int error, hasqos, ridx, ctl_ridx, xferlen, txwisize; + uint16_t qos, dur, mcs; + uint16_t txwisize; + uint8_t type, tid, qid; + int hasqos, ridx, ctl_ridx, xferlen; uint8_t pad; + usbd_status status; wh = mtod(m, struct ieee80211_frame *); @@ -2455,6 +2514,7 @@ run_tx(struct run_softc *sc, struct mbuf tid = qos & IEEE80211_QOS_TID; qid = TID_TO_WME_AC(tid); } else { + qos = 0; tid = 0; qid = WME_AC_BE; } @@ -2478,9 +2538,11 @@ run_tx(struct run_softc *sc, struct mbuf /* get MCS code from rate index */ mcs = rt2860_rates[ridx].mcs; - txwisize = (sc->mac_ver == 0x5592) ? - sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi); + txwisize = sizeof(struct rt2860_txwi); + if (sc->mac_ver == 0x5592) + txwisize += sizeof(uint32_t); xferlen = txwisize + m->m_pkthdr.len; + /* roundup to 32-bit alignment */ xferlen = (xferlen + 3) & ~3; @@ -2511,7 +2573,7 @@ run_tx(struct run_softc *sc, struct mbuf mcs |= RT2860_PHY_SHPRE; } else mcs |= RT2860_PHY_OFDM; - txwi->phy |= htole16(mcs); + txwi->phy = htole16(mcs); txwi->txop = RT2860_TX_TXOP_BACKOFF; @@ -2556,10 +2618,13 @@ run_tx(struct run_softc *sc, struct mbuf usbd_setup_xfer(data->xfer, data, data->buf, xferlen, USBD_FORCE_SHORT_XFER, RUN_TX_TIMEOUT, run_txeof); - error = usbd_transfer(data->xfer); - if (__predict_false(error != USBD_IN_PROGRESS && - error != USBD_NORMAL_COMPLETION)) - return error; + status = usbd_transfer(data->xfer); + if (__predict_false(status != USBD_IN_PROGRESS && + status != USBD_NORMAL_COMPLETION)) { + device_printf(sc->sc_dev, "queuing tx failed: %s\n", + usbd_errstr(status)); + return EIO; + } ieee80211_free_node(ni); @@ -2719,21 +2784,73 @@ run_select_chan_group(struct run_softc * run_bbp_write(sc, 62, 0x37 - sc->lna[group]); run_bbp_write(sc, 63, 0x37 - sc->lna[group]); run_bbp_write(sc, 64, 0x37 - sc->lna[group]); - run_bbp_write(sc, 86, 0x00); + if (sc->mac_ver < 0x3572) + run_bbp_write(sc, 86, 0x00); + + if (sc->mac_ver == 0x3593) { + run_bbp_write(sc, 77, 0x98); + run_bbp_write(sc, 83, (group == 0) ? 0x8a : 0x9a); + } if (group == 0) { if (sc->ext_2ghz_lna) { - run_bbp_write(sc, 82, 0x62); - run_bbp_write(sc, 75, 0x46); + if (sc->mac_ver >= 0x5390) + run_bbp_write(sc, 75, 0x52); + else { + run_bbp_write(sc, 82, 0x62); + run_bbp_write(sc, 75, 0x46); + } } else { - run_bbp_write(sc, 82, 0x84); - run_bbp_write(sc, 75, 0x50); + if (sc->mac_ver == 0x5592) { + run_bbp_write(sc, 79, 0x1c); + run_bbp_write(sc, 80, 0x0e); + run_bbp_write(sc, 81, 0x3a); + run_bbp_write(sc, 82, 0x62); + + run_bbp_write(sc, 195, 0x80); + run_bbp_write(sc, 196, 0xe0); + run_bbp_write(sc, 195, 0x81); + run_bbp_write(sc, 196, 0x1f); + run_bbp_write(sc, 195, 0x82); + run_bbp_write(sc, 196, 0x38); + run_bbp_write(sc, 195, 0x83); + run_bbp_write(sc, 196, 0x32); + run_bbp_write(sc, 195, 0x85); + run_bbp_write(sc, 196, 0x28); + run_bbp_write(sc, 195, 0x86); + run_bbp_write(sc, 196, 0x19); + } else if (sc->mac_ver >= 0x5390) { + run_bbp_write(sc, 75, 0x50); + } else { + run_bbp_write(sc, 82, + (sc->mac_ver == 0x3593) ? 0x62 : 0x84); + run_bbp_write(sc, 75, 0x50); + } } } else { - if (sc->mac_ver == 0x3572) + if (sc->mac_ver == 0x5592) { + run_bbp_write(sc, 79, 0x18); + run_bbp_write(sc, 80, 0x08); + run_bbp_write(sc, 81, 0x38); + run_bbp_write(sc, 82, 0x92); + + run_bbp_write(sc, 195, 0x80); + run_bbp_write(sc, 196, 0xf0); + run_bbp_write(sc, 195, 0x81); + run_bbp_write(sc, 196, 0x1e); + run_bbp_write(sc, 195, 0x82); + run_bbp_write(sc, 196, 0x28); + run_bbp_write(sc, 195, 0x83); + run_bbp_write(sc, 196, 0x20); + run_bbp_write(sc, 195, 0x85); + run_bbp_write(sc, 196, 0x7f); + run_bbp_write(sc, 195, 0x86); + run_bbp_write(sc, 196, 0x7f); + } else if (sc->mac_ver == 0x3572) run_bbp_write(sc, 82, 0x94); else - run_bbp_write(sc, 82, 0xf2); + run_bbp_write(sc, 82, + (sc->mac_ver == 0x3593) ? 0x82 : 0xf2); if (sc->ext_5ghz_lna) run_bbp_write(sc, 75, 0x46); else @@ -2747,6 +2864,8 @@ run_select_chan_group(struct run_softc * /* enable appropriate Power Amplifiers and Low Noise Amplifiers */ tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN; + if (sc->mac_ver == 0x3593) + tmp |= RT3593_LNA_PE_G2_EN | RT3593_LNA_PE_A2_EN; if (sc->nrxchains > 1) tmp |= RT2860_LNA_PE1_EN; if (group == 0) { /* 2GHz */ @@ -2757,6 +2876,10 @@ run_select_chan_group(struct run_softc * tmp |= RT2860_PA_PE_A0_EN; if (sc->ntxchains > 1) tmp |= RT2860_PA_PE_A1_EN; + if (sc->mac_ver == 0x3593) { + if (sc->ntxchains > 2) + tmp |= RT3593_PA_PE_G2_EN; + } } if (sc->mac_ver == 0x3572) { run_rt3070_rf_write(sc, 8, 0x00); @@ -2765,6 +2888,20 @@ run_select_chan_group(struct run_softc * } else run_write(sc, RT2860_TX_PIN_CFG, tmp); + if (sc->mac_ver == 0x5592) { + run_bbp_write(sc, 195, 0x8d); + run_bbp_write(sc, 196, 0x1a); + } + + if (sc->mac_ver == 0x3593) { + run_read(sc, RT2860_GPIO_CTRL, &tmp); + tmp &= ~0x01010000; + if (group == 0) + tmp |= 0x00010000; + tmp = (tmp & ~0x00009090) | 0x00000090; + run_write(sc, RT2860_GPIO_CTRL, tmp); + } + /* set initial AGC value */ if (group == 0) { /* 2GHz band */ if (sc->mac_ver >= 0x3070) @@ -3578,19 +3715,29 @@ run_set_rx_antenna(struct run_softc *sc, uint32_t tmp; uint8_t bbp152; - if (sc->rf_rev == RT5390_RF_5370) { - run_bbp_read(sc, 152, &bbp152); - bbp152 &= ~0x80; - if (aux) - bbp152 |= 0x80; - run_bbp_write(sc, 152, bbp152); - } else { - run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux); - run_read(sc, RT2860_GPIO_CTRL, &tmp); - tmp &= ~0x0808; - if (aux) + if (aux) { + if (sc->rf_rev == RT5390_RF_5370) { + run_bbp_read(sc, 152, &bbp152); + bbp152 &= ~0x80; + run_bbp_write(sc, 152, bbp152); + } else { + run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 0); + run_read(sc, RT2860_GPIO_CTRL, &tmp); + tmp &= ~0x0808; tmp |= 0x08; - run_write(sc, RT2860_GPIO_CTRL, tmp); + run_write(sc, RT2860_GPIO_CTRL, tmp); + } + } else { + if (sc->rf_rev == RT5390_RF_5370) { + run_bbp_read(sc, 152, &bbp152); + bbp152 |= 0x80; + run_bbp_write(sc, 152, bbp152); + } else { + run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux); + run_read(sc, RT2860_GPIO_CTRL, &tmp); + tmp &= ~0x0808; + run_write(sc, RT2860_GPIO_CTRL, tmp); + } } } @@ -3915,7 +4062,8 @@ run_bbp_init(struct run_softc *sc) if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101) run_bbp_write(sc, 84, 0x19); - if (sc->mac_ver >= 0x3070) { + if (sc->mac_ver >= 0x3070 && (sc->mac_ver != 0x3593 && + sc->mac_ver != 0x5592)) { run_bbp_write(sc, 79, 0x13); run_bbp_write(sc, 80, 0x05); run_bbp_write(sc, 81, 0x33); @@ -3979,8 +4127,12 @@ run_rt3070_rf_init(struct run_softc *sc) /* patch LNA_PE_G1 */ run_read(sc, RT3070_GPIO_SWITCH, &tmp); run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20); - } else if (sc->mac_ver == 0x3070) { - /* increase voltage from 1.2V to 1.35V */ + } else if (sc->mac_ver == 0x3070 && sc->mac_rev < 0x0201) { + /* + * Change voltage from 1.2V to 1.35V for RT3070. + * The DAC issue (RT3070_LD0_CFG0) has been fixed + * in RT3070(F). + */ run_read(sc, RT3070_LDO_CFG0, &tmp); tmp = (tmp & ~0x0f000000) | 0x0d000000; run_write(sc, RT3070_LDO_CFG0, tmp); @@ -4501,6 +4653,7 @@ run_init(struct ifnet *ifp) uint32_t tmp; uint8_t bbp1, bbp3; int i, error, qid, ridx, ntries; + usbd_status status; for (ntries = 0; ntries < 100; ntries++) { if ((error = run_read(sc, RT2860_ASIC_VER_ID, &tmp)) != 0) @@ -4733,10 +4886,14 @@ run_init(struct ifnet *ifp) usbd_setup_xfer(data->xfer, data, data->buf, RUN_MAX_RXSZ, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof); - error = usbd_transfer(data->xfer); - if (error != USBD_NORMAL_COMPLETION && - error != USBD_IN_PROGRESS) + status = usbd_transfer(data->xfer); + if (status != USBD_NORMAL_COMPLETION && + status != USBD_IN_PROGRESS) { + device_printf(sc->sc_dev, "queuing rx failed: %s\n", + usbd_errstr(status)); + error = EIO; goto fail; + } } if ((error = run_txrx_enable(sc)) != 0) Index: sys/dev/usb/if_runvar.h =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_runvar.h,v retrieving revision 1.5 diff -p -u -r1.5 if_runvar.h --- sys/dev/usb/if_runvar.h 5 Oct 2019 23:27:20 -0000 1.5 +++ sys/dev/usb/if_runvar.h 6 Oct 2019 16:09:25 -0000 @@ -29,7 +29,7 @@ /* NB: "11" is the maximum number of padding bytes needed for Tx */ #define RUN_MAX_TXSZ \ (sizeof(struct rt2870_txd) + \ - sizeof(struct rt2860_rxwi) + \ + sizeof(struct rt2860_txwi) + \ MCLBYTES + 11) #define RUN_TX_TIMEOUT 5000 /* ms */ @@ -37,7 +37,7 @@ #define RUN_RX_RING_COUNT 1 #define RUN_TX_RING_COUNT 8 -#define RT2870_WCID_MAX 253 +#define RT2870_WCID_MAX 64 #define RUN_AID2WCID(aid) ((aid) & 0xff) struct run_rx_radiotap_header {