Module Name: src
Committed By: mlelstv
Date: Tue Oct 8 07:30:58 UTC 2019
Modified Files:
src/sys/dev/usb: if_run.c if_runvar.h
Log Message:
Merge more changes from FreeBSD/OpenBSD. My two run(4) devices now work
again.
To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/usb/if_run.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/usb/if_runvar.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/if_run.c
diff -u src/sys/dev/usb/if_run.c:1.32 src/sys/dev/usb/if_run.c:1.33
--- src/sys/dev/usb/if_run.c:1.32 Tue Jan 22 06:47:20 2019
+++ src/sys/dev/usb/if_run.c Tue Oct 8 07:30:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_run.c,v 1.32 2019/01/22 06:47:20 skrll Exp $ */
+/* $NetBSD: if_run.c,v 1.33 2019/10/08 07:30:58 mlelstv Exp $ */
/* $OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $ */
/*-
@@ -18,12 +18,12 @@
*/
/*-
- * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver.
+ * Ralink Technology RT2700U/RT2800U/RT3000U/RT3900E chipset driver.
* http://www.ralinktech.com/
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.32 2019/01/22 06:47:20 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.33 2019/10/08 07:30:58 mlelstv Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -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: src/sys/dev/usb/if_runvar.h
diff -u src/sys/dev/usb/if_runvar.h:1.5 src/sys/dev/usb/if_runvar.h:1.6
--- src/sys/dev/usb/if_runvar.h:1.5 Sat Oct 5 23:27:20 2019
+++ src/sys/dev/usb/if_runvar.h Tue Oct 8 07:30:58 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_runvar.h,v 1.5 2019/10/05 23:27:20 mrg Exp $ */
+/* $NetBSD: if_runvar.h,v 1.6 2019/10/08 07:30:58 mlelstv Exp $ */
/* $OpenBSD: if_runvar.h,v 1.8 2010/02/08 18:46:47 damien Exp $ */
/*-
@@ -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 {