Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: run(4) fails to scan



On Mon, Jul 15, 2019 at 07:25:45PM +0200, Manuel Bouyer wrote:
> Hello,
> I'm trying to use this wifi USB adapter:
> run0 at uhub7 port 1
> run0: Ralink (0x148f) 802.11 n WLAN (0x5370), rev 2.00/1.01, addr 3
> run0: MAC/BBP RT5390 (rev 0x0502), RF RT5592 (MIMO 1T1R), address e8:4e:e8:4e:af:44
> run0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
> run0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
> run0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
> 
> (tested on 8.1 and HEAD).
> wpa_supplicant doesn't find any AP (it finds dozens with the internal
> wpi(4)) and wiconfig fails with:
> rochebonne# wiconfig run0 -D
> scanning .............wiconfig: ioctl: Operation now in progress
> 
> (the same command with wpi0 finds 12).
> 
> Is anyone using such an adapter with NetBSD ?

I have:

run0 at uhub4 port 2
run0: Ralink (0x148f) 802.11 n WLAN (0x5370), rev 2.00/1.01, addr 5
run0: MAC/BBP RT5390 (rev 0x0502), RF RT5592 (MIMO 1T1R), address 3c:33:3c:33:70:96
run0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
run0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
run0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps

and it fails to scan as well.

OpenBSD works fine, and there are quite a few differences for this variant
in the driver.

There is at least one inverted condition (selecting the wrong antenna), but
that didn't fix it for me. I tried to bring in other changes but nothing
made it work (and I ran out of time). Latest change I used attached.

Martin
Index: if_run.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/if_run.c,v
retrieving revision 1.32
diff -u -p -r1.32 if_run.c
--- if_run.c	22 Jan 2019 06:47:20 -0000	1.32
+++ if_run.c	15 Jul 2019 17:29:15 -0000
@@ -18,7 +18,7 @@
  */
 
 /*-
- * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver.
+ * Ralink Technology RT2700U/RT2800U/RT3000U/RT3900E chipset driver.
  * http://www.ralinktech.com/
  */
 
@@ -69,10 +69,12 @@ __KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1
 #include <dev/ic/rt2860reg.h>		/* shared with ral(4) */
 #include <dev/usb/if_runvar.h>
 
+#define	RUN_DEBUG
+
 #ifdef RUN_DEBUG
 #define DPRINTF(x)	do { if (run_debug) printf x; } while (0)
 #define DPRINTFN(n, x)	do { if (run_debug >= (n)) printf x; } while (0)
-int run_debug = 0;
+int run_debug = 255;
 #else
 #define DPRINTF(x)
 #define DPRINTFN(n, x)
@@ -850,6 +852,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 +877,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 +948,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;
 
@@ -1468,7 +1476,7 @@ run_read_eeprom(struct run_softc *sc)
 	if (sc->mac_ver >= 0x3070) {
 		run_read(sc, RT3070_EFUSE_CTRL, &tmp);
 		DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp));
-		if (tmp & RT3070_SEL_EFUSE)
+		if (tmp & RT3070_SEL_EFUSE || sc->mac_ver == 0x3593)
 			sc->sc_srom_read = run_efuse_read_2;
 	}
 
@@ -1526,7 +1534,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,13 +1557,19 @@ 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",
 	    sc->rf_rev, sc->ntxchains, sc->nrxchains));
 
+	/* check if RF supports automatic Tx access gain control */
 	run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
 	DPRINTF(("EEPROM CFG 0x%04x\n", val));
 	/* check if driver should patch the DAC issue */
@@ -2342,6 +2359,13 @@ run_rxeof(struct usbd_xfer *xfer, void *
 	uint8_t *buf;
 	uint32_t dmalen;
 	int xferlen;
+	uint16_t rxwisize;
+
+	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(sc->sc_flags & RUN_DETACHING))
 		return;
@@ -2356,8 +2380,8 @@ 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)))) {
+	if (__predict_false(xferlen < (int)(sizeof(uint32_t) + rxwisize +
+	    sizeof(struct rt2870_rxd)))) {
 		DPRINTF(("xfer too short %d\n", xferlen));
 		goto skip;
 	}
@@ -2481,6 +2505,7 @@ run_tx(struct run_softc *sc, struct mbuf
 	txwisize = (sc->mac_ver == 0x5592) ?
 	    sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
 	xferlen = txwisize + m->m_pkthdr.len;
+
 	/* roundup to 32-bit alignment */
 	xferlen = (xferlen + 3) & ~3;
 
@@ -3581,7 +3606,7 @@ run_set_rx_antenna(struct run_softc *sc,
 	if (sc->rf_rev == RT5390_RF_5370) {
 		run_bbp_read(sc, 152, &bbp152);
 		bbp152 &= ~0x80;
-		if (aux)
+		if (!aux)
 			bbp152 |= 0x80;
 		run_bbp_write(sc, 152, bbp152);
 	} else {
@@ -3915,7 +3940,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);


Home | Main Index | Thread Index | Old Index