Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/usb Merge more changes from FreeBSD/OpenBSD. My two ...



details:   https://anonhg.NetBSD.org/src/rev/e4e225867bc2
branches:  trunk
changeset: 455115:e4e225867bc2
user:      mlelstv <mlelstv%NetBSD.org@localhost>
date:      Tue Oct 08 07:30:58 2019 +0000

description:
Merge more changes from FreeBSD/OpenBSD. My two run(4) devices now work
again.

diffstat:

 sys/dev/usb/if_run.c    |  341 +++++++++++++++++++++++++++++++++++------------
 sys/dev/usb/if_runvar.h |    6 +-
 2 files changed, 252 insertions(+), 95 deletions(-)

diffs (truncated from 702 to 300 lines):

diff -r e093f795bdf0 -r e4e225867bc2 sys/dev/usb/if_run.c
--- a/sys/dev/usb/if_run.c      Tue Oct 08 07:16:25 2019 +0000
+++ b/sys/dev/usb/if_run.c      Tue Oct 08 07:30:58 2019 +0000
@@ -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 @@
        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 @@
        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 @@
        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 @@
        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 @@
        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 @@
        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_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 @@
 {
        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 @@
 
                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 @@
                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 @@
        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 @@
 }
 
 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 @@
        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 @@
            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 @@
                        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 @@
                    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 @@
        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 @@
 #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 @@
                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 @@
                ifp->if_ierrors++;
                return;
        }
-



Home | Main Index | Thread Index | Old Index