Source-Changes-HG archive

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

[src/trunk]: src Add support for Realtek 8192EU.



details:   https://anonhg.NetBSD.org/src/rev/6c422b727272
branches:  trunk
changeset: 818396:6c422b727272
user:      nat <nat%NetBSD.org@localhost>
date:      Wed Oct 12 03:23:29 2016 +0000

description:
Add support for Realtek 8192EU.

OK christos@

diffstat:

 share/man/man4/urtwn.4      |   12 +-
 sys/dev/usb/if_urtwn.c      |  587 +++++++++++++++++++++++++++++++++----------
 sys/dev/usb/if_urtwn_data.h |  223 ++++++++++++++++-
 sys/dev/usb/if_urtwnreg.h   |   87 ++++++-
 sys/dev/usb/if_urtwnvar.h   |   20 +-
 5 files changed, 775 insertions(+), 154 deletions(-)

diffs (truncated from 1928 to 300 lines):

diff -r b26295865d23 -r 6c422b727272 share/man/man4/urtwn.4
--- a/share/man/man4/urtwn.4    Wed Oct 12 03:12:03 2016 +0000
+++ b/share/man/man4/urtwn.4    Wed Oct 12 03:23:29 2016 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: urtwn.4,v 1.14 2014/07/25 15:07:03 nonaka Exp $
+.\" $NetBSD: urtwn.4,v 1.15 2016/10/12 03:23:29 nat Exp $
 .\" $OpenBSD: urtwn.4,v 1.15 2011/11/26 06:39:33 ckuethe Exp $
 .\"
 .\" Copyright (c) 2010 Damien Bergamini <damien.bergamini%free.fr@localhost>
@@ -20,14 +20,15 @@
 .Os
 .Sh NAME
 .Nm urtwn
-.Nd Realtek RTL8188CU/RTL8188EU/RTL8192CU USB IEEE 802.11b/g/n wireless network device
+.Nd Realtek RTL8188CU/RTL8188EU/RTL8192CU/RTL8192EU USB IEEE 802.11b/g/n wireless network device
 .Sh SYNOPSIS
 .Cd "urtwn* at uhub? port ?"
 .Sh DESCRIPTION
 The
 .Nm
 driver supports USB 2.0 wireless network devices based on Realtek
-RTL8188CUS, RTL8188CE-VAU, RTL8188EUS, RTL8188RU, and RTL8192CU chipsets.
+RTL8188CUS, RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU and RTL8192EU
+chipsets.
 .Pp
 The RTL8188CUS and RTL8188EUS are highly integrated 802.11n adapters that
 combine a MAC, a 1T1R capable baseband and an RF in a single chip.
@@ -36,8 +37,8 @@
 The RTL8188CE-VAU is a PCI Express Mini Card adapter that attaches
 to the USB interface.
 .Pp
-The RTL8192CU is a highly integrated multiple-in, multiple-out (MIMO)
-802.11n adapter that combines a MAC, a 2T2R capable baseband and an
+The RTL8192CU and RTL8192EU are highly integrated multiple-in, multiple-out
+(MIMO) 802.11n adapters that combine a MAC, a 2T2R capable baseband and an
 RF in a single chip.
 It operates in the 2GHz spectrum only.
 .Pp
@@ -96,6 +97,7 @@
 .It /libdata/firmware/if_urtwn/rtl8188eufw.bin
 .It /libdata/firmware/if_urtwn/rtl8192cfw.bin
 .It /libdata/firmware/if_urtwn/rtl8192cfwU.bin
+.It /libdata/firmware/if_urtwn/rtl8192efw.bin
 .El
 .Sh HARDWARE
 The following adapters should work:
diff -r b26295865d23 -r 6c422b727272 sys/dev/usb/if_urtwn.c
--- a/sys/dev/usb/if_urtwn.c    Wed Oct 12 03:12:03 2016 +0000
+++ b/sys/dev/usb/if_urtwn.c    Wed Oct 12 03:23:29 2016 +0000
@@ -1,9 +1,10 @@
-/*     $NetBSD: if_urtwn.c,v 1.48 2016/10/12 02:56:45 nat Exp $        */
+/*     $NetBSD: if_urtwn.c,v 1.49 2016/10/12 03:23:29 nat Exp $        */
 /*     $OpenBSD: if_urtwn.c,v 1.42 2015/02/10 23:25:46 mpi Exp $       */
 
 /*-
  * Copyright (c) 2010 Damien Bergamini <damien.bergamini%free.fr@localhost>
  * Copyright (c) 2014 Kevin Lo <kevlo%FreeBSD.org@localhost>
+ * Copyright (c) 2016 Nathanial Sloss <nathanialsloss%yahoo.com.au@localhost>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -19,11 +20,12 @@
  */
 
 /*-
- * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU.
+ * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU
+ * RTL8192EU.
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.48 2016/10/12 02:56:45 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtwn.c,v 1.49 2016/10/12 03:23:29 nat Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -99,10 +101,13 @@
 #define URTWN_DEV(v,p) { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, 0 }
 #define URTWN_RTL8188E_DEV(v,p) \
        { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, FLAG_RTL8188E }
+#define URTWN_RTL8192EU_DEV(v,p) \
+       { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, FLAG_RTL8192E }
 static const struct urtwn_dev {
        struct usb_devno        dev;
        uint32_t                flags;
 #define        FLAG_RTL8188E   __BIT(0)
+#define        FLAG_RTL8192E   __BIT(1)
 } urtwn_devs[] = {
        URTWN_DEV(ABOCOM,       RTL8188CU_1),
        URTWN_DEV(ABOCOM,       RTL8188CU_2),
@@ -184,9 +189,13 @@
        URTWN_RTL8188E_DEV(ELECOM, WDC150SU2M),
        URTWN_RTL8188E_DEV(REALTEK, RTL8188ETV),
        URTWN_RTL8188E_DEV(REALTEK, RTL8188EU),
+       
+       /* URTWN_RTL8192EU */
+       URTWN_RTL8192EU_DEV(REALTEK,    RTL8192EU),
 };
 #undef URTWN_DEV
 #undef URTWN_RTL8188E_DEV
+#undef URTWN_RTL8192EU_DEV
 
 static int     urtwn_match(device_t, cfdata_t, void *);
 static void    urtwn_attach(device_t, device_t, void *);
@@ -223,6 +232,8 @@
                    uint32_t);
 static void    urtwn_r88e_rf_write(struct urtwn_softc *, int, uint8_t,
                    uint32_t);
+static void    urtwn_r92e_rf_write(struct urtwn_softc *, int, uint8_t,
+                   uint32_t);
 static uint32_t        urtwn_rf_read(struct urtwn_softc *, int, uint8_t);
 static int     urtwn_llt_write(struct urtwn_softc *, uint32_t, uint32_t);
 static uint8_t urtwn_efuse_read_1(struct urtwn_softc *, uint16_t);
@@ -262,6 +273,7 @@
 static void    urtwn_watchdog(struct ifnet *);
 static int     urtwn_ioctl(struct ifnet *, u_long, void *);
 static int     urtwn_r92c_power_on(struct urtwn_softc *);
+static int     urtwn_r92e_power_on(struct urtwn_softc *);
 static int     urtwn_r88e_power_on(struct urtwn_softc *);
 static int     urtwn_llt_init(struct urtwn_softc *);
 static void    urtwn_fw_reset(struct urtwn_softc *);
@@ -293,6 +305,7 @@
 static int     urtwn_reset(struct ifnet *);
 static void    urtwn_chip_stop(struct urtwn_softc *);
 static void    urtwn_newassoc(struct ieee80211_node *, int);
+static void    urtwn_delay_ms(struct urtwn_softc *, int ms);
 
 /* Aliases. */
 #define        urtwn_bb_write  urtwn_write_4
@@ -313,8 +326,8 @@
 {
        struct usb_attach_arg *uaa = aux;
 
-       return urtwn_lookup(urtwn_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL ?
-           UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
+       return urtwn_lookup(urtwn_devs, uaa->uaa_vendor, uaa->uaa_product) !=
+           NULL ?  UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
 }
 
 static void
@@ -337,6 +350,8 @@
        dev = urtwn_lookup(urtwn_devs, uaa->uaa_vendor, uaa->uaa_product);
        if (dev != NULL && ISSET(dev->flags, FLAG_RTL8188E))
                SET(sc->chip, URTWN_CHIP_88E);
+       if (dev != NULL && ISSET(dev->flags, FLAG_RTL8192E))
+               SET(sc->chip, URTWN_CHIP_92EU);
 
        aprint_naive("\n");
        aprint_normal("\n");
@@ -357,6 +372,7 @@
 
        mutex_init(&sc->sc_task_mtx, MUTEX_DEFAULT, IPL_NET);
        mutex_init(&sc->sc_tx_mtx, MUTEX_DEFAULT, IPL_NONE);
+       mutex_init(&sc->sc_rx_mtx, MUTEX_DEFAULT, IPL_NONE);
        mutex_init(&sc->sc_fwcmd_mtx, MUTEX_DEFAULT, IPL_NONE);
        mutex_init(&sc->sc_write_mtx, MUTEX_DEFAULT, IPL_NONE);
 
@@ -391,17 +407,22 @@
        if (sc->chip & URTWN_CHIP_92C) {
                sc->ntxchains = (sc->chip & URTWN_CHIP_92C_1T2R) ? 1 : 2;
                sc->nrxchains = 2;
+       } else if (sc->chip & URTWN_CHIP_92EU) {
+               sc->ntxchains = 2;
+               sc->nrxchains = 2;
        } else {
                sc->ntxchains = 1;
                sc->nrxchains = 1;
        }
 
-       if (ISSET(sc->chip, URTWN_CHIP_88E))
+       if (ISSET(sc->chip, URTWN_CHIP_88E) ||
+           ISSET(sc->chip, URTWN_CHIP_92EU))
                urtwn_r88e_read_rom(sc);
        else
                urtwn_read_rom(sc);
 
        aprint_normal_dev(self, "MAC/BB RTL%s, RF 6052 %zdT%zdR, address %s\n",
+           (sc->chip & URTWN_CHIP_92EU) ? "8192EU" :
            (sc->chip & URTWN_CHIP_92C) ? "8192CU" :
            (sc->chip & URTWN_CHIP_88E) ? "8188EU" :
            (sc->board_type == R92C_BOARD_TYPE_HIGHPA) ? "8188RU" :
@@ -539,6 +560,7 @@
        mutex_destroy(&sc->sc_write_mtx);
        mutex_destroy(&sc->sc_fwcmd_mtx);
        mutex_destroy(&sc->sc_tx_mtx);
+       mutex_destroy(&sc->sc_rx_mtx);
        mutex_destroy(&sc->sc_task_mtx);
 
        return 0;
@@ -564,10 +586,11 @@
 urtwn_open_pipes(struct urtwn_softc *sc)
 {
        /* Bulk-out endpoints addresses (from highest to lowest prio). */
-       static const uint8_t epaddr[] = { 0x02, 0x03, 0x05 };
+       static uint8_t epaddr[3];
+       static uint8_t rxepaddr[3];
        usb_interface_descriptor_t *id;
        usb_endpoint_descriptor_t *ed;
-       size_t i, ntx = 0;
+       size_t i, ntx = 0, nrx = 0;
        int error;
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
@@ -578,8 +601,16 @@
                ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
                if (ed != NULL &&
                    UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK &&
-                   UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT)
+                   UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT) {
+                       epaddr[ntx] = ed->bEndpointAddress;
                        ntx++;
+               }
+               if (ed != NULL &&
+                   UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK &&
+                   UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) {
+                       rxepaddr[nrx] = ed->bEndpointAddress;
+                       nrx++;
+               }
        }
        DPRINTFN(DBG_INIT, ("%s: %s: found %zd bulk-out pipes\n",
            device_xname(sc->sc_dev), __func__, ntx));
@@ -588,16 +619,19 @@
                    "%zd: invalid number of Tx bulk pipes\n", ntx);
                return EIO;
        }
-       sc->rx_npipe = 1;
+       sc->rx_npipe = nrx;
        sc->tx_npipe = ntx;
 
        /* Open bulk-in pipe at address 0x81. */
-       error = usbd_open_pipe(sc->sc_iface, 0x81, USBD_EXCLUSIVE_USE,
-           &sc->rx_pipe);
-       if (error != 0) {
-               aprint_error_dev(sc->sc_dev, "could not open Rx bulk pipe"
-                   ": %d\n", error);
-               goto fail;
+       for (i = 0; i < nrx; i++) {
+               error = usbd_open_pipe(sc->sc_iface, rxepaddr[i],
+                   USBD_EXCLUSIVE_USE, &sc->rx_pipe[i]);
+               if (error != 0) {
+                       aprint_error_dev(sc->sc_dev,
+                           "could not open Rx bulk pipe 0x%02x: %d\n",
+                           rxepaddr[i], error);
+                       goto fail;
+               }
        }
 
        /* Open bulk-out pipes (up to 3). */
@@ -632,14 +666,17 @@
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
 
-       /* Close Rx pipe. */
+       /* Close Rx pipes. */
        CTASSERT(sizeof(pipe) == sizeof(void *));
-       pipe = atomic_swap_ptr(&sc->rx_pipe, NULL);
-       if (pipe != NULL) {
-               usbd_close_pipe(pipe);
+       for (i = 0; i < sc->rx_npipe; i++) {
+               pipe = atomic_swap_ptr(&sc->rx_pipe[i], NULL);
+               if (pipe != NULL) {
+                       usbd_close_pipe(pipe);
+               }
        }
+
        /* Close Tx pipes. */
-       for (i = 0; i < R92C_MAX_EPOUT; i++) {
+       for (i = 0; i < sc->tx_npipe; i++) {
                pipe = atomic_swap_ptr(&sc->tx_pipe[i], NULL);
                if (pipe != NULL) {
                        usbd_close_pipe(pipe);
@@ -656,20 +693,24 @@
 
        DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
 
-       for (i = 0; i < URTWN_RX_LIST_COUNT; i++) {
-               data = &sc->rx_data[i];
-
-               data->sc = sc;  /* Backpointer for callbacks. */
-
-               error = usbd_create_xfer(sc->rx_pipe, URTWN_RXBUFSZ,
-                   USBD_SHORT_XFER_OK, 0, &data->xfer);
-               if (error) {
-                       aprint_error_dev(sc->sc_dev,
-                           "could not allocate xfer\n");
-                       break;
+       for (size_t j = 0; j < sc->rx_npipe; j++) {
+               TAILQ_INIT(&sc->rx_free_list[j]);
+               for (i = 0; i < URTWN_RX_LIST_COUNT; i++) {
+                       data = &sc->rx_data[j][i];
+
+                       data->sc = sc;  /* Backpointer for callbacks. */
+
+                       error = usbd_create_xfer(sc->rx_pipe[j], URTWN_RXBUFSZ,
+                           USBD_SHORT_XFER_OK, 0, &data->xfer);
+                       if (error) {
+                               aprint_error_dev(sc->sc_dev,
+                                   "could not allocate xfer\n");
+                               break;
+                       }



Home | Main Index | Thread Index | Old Index