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