]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
rsu(4): Add support for 1T2R and 2T2R NICs.
authoradrian <adrian@FreeBSD.org>
Tue, 29 Sep 2015 06:56:00 +0000 (06:56 +0000)
committeradrian <adrian@FreeBSD.org>
Tue, 29 Sep 2015 06:56:00 +0000 (06:56 +0000)
This logic is mostly crimed from the reference driver and the linux
r92su driver.

I verified that it (a) worked on the rsu hardware I have, and (b)
did traffic testing whilst watching what ath(4) sent as a hostap.
It successfully sent MCS8..15 rates (which requires 2-stream reception)
as well as MCS0..7 (which is 1-stream.)

Tested:

* RTL8712, 1T1R NIC, MCS rates 0..7.
* RTL8712, 1T2R NIC, MCS rates 0..15

TODO:

* Find a 2T2R NIC!

sys/dev/usb/wlan/if_rsu.c
sys/dev/usb/wlan/if_rsureg.h

index ee650364b604422acdd34e5bae01f77b6fea443e..c4c6cc957635d8ec86a0de2c781c9f3a22e69438 100644 (file)
@@ -403,6 +403,7 @@ rsu_attach(device_t self)
        int error;
        uint8_t iface_index, bands;
        struct usb_interface *iface;
+       const char *rft;
 
        device_set_usb_desc(self);
        sc->sc_udev = uaa->device;
@@ -462,8 +463,37 @@ rsu_attach(device_t self)
                device_printf(self, "could not read ROM\n");
                goto fail_rom;
        }
+
+       /* Figure out TX/RX streams */
+       switch (sc->rom[84]) {
+       case 0x0:
+               sc->sc_rftype = RTL8712_RFCONFIG_1T1R;
+               sc->sc_nrxstream = 1;
+               sc->sc_ntxstream = 1;
+               rft = "1T1R";
+               break;
+       case 0x1:
+               sc->sc_rftype = RTL8712_RFCONFIG_1T2R;
+               sc->sc_nrxstream = 2;
+               sc->sc_ntxstream = 1;
+               rft = "1T2R";
+               break;
+       case 0x2:
+               sc->sc_rftype = RTL8712_RFCONFIG_2T2R;
+               sc->sc_nrxstream = 2;
+               sc->sc_ntxstream = 2;
+               rft = "2T2R";
+               break;
+       default:
+               device_printf(sc->sc_dev,
+                   "%s: unknown board type (rfconfig=0x%02x)\n",
+                   __func__,
+                   sc->rom[84]);
+               goto fail_rom;
+       }
+
        IEEE80211_ADDR_COPY(ic->ic_macaddr, &sc->rom[0x12]);
-       device_printf(self, "MAC/BB RTL8712 cut %d\n", sc->cut);
+       device_printf(self, "MAC/BB RTL8712 cut %d %s\n", sc->cut, rft);
 
        ic->ic_softc = sc;
        ic->ic_name = device_get_nameunit(self);
@@ -494,8 +524,8 @@ rsu_attach(device_t self)
                ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
 
                /* set number of spatial streams */
-               ic->ic_txstream = 1;
-               ic->ic_rxstream = 1;
+               ic->ic_txstream = sc->sc_ntxstream;
+               ic->ic_rxstream = sc->sc_nrxstream;
        }
 
        /* Set supported .11b and .11g rates. */
@@ -2664,8 +2694,7 @@ rsu_load_firmware(struct rsu_softc *sc)
        dmem->hci_sel = R92S_HCI_SEL_USB | R92S_HCI_SEL_8172;
        dmem->nendpoints = sc->sc_nendpoints;
        dmem->chip_version = sc->cut;
-       /* XXX TODO: rf_config should come from ROM */
-       dmem->rf_config = 0x11; /* 1T1R */
+       dmem->rf_config = sc->sc_rftype;
        dmem->vcs_type = R92S_VCS_TYPE_AUTO;
        dmem->vcs_mode = R92S_VCS_MODE_RTS_CTS;
        dmem->turbo_mode = 0;
index 4929c80ec317881b3a9887d2f1171fe7cad8bbfe..28801972286aa0d2526e9c484708c36bde16a4fc 100644 (file)
 #define RW(var, field, val)                                            \
        (((var) & ~field##_M) | SM(field, val))
 
+/*
+ * ROM field with RF config.
+ */
+enum {
+       RTL8712_RFCONFIG_1T = 0x10,
+       RTL8712_RFCONFIG_2T = 0x20,
+       RTL8712_RFCONFIG_1R = 0x01,
+       RTL8712_RFCONFIG_2R = 0x02,
+       RTL8712_RFCONFIG_1T1R = 0x11,
+       RTL8712_RFCONFIG_1T2R = 0x12,
+       RTL8712_RFCONFIG_TURBO = 0x92,
+       RTL8712_RFCONFIG_2T2R = 0x22
+};
+
 /*
  * Firmware image header.
  */
@@ -173,6 +187,7 @@ struct r92s_fw_priv {
        uint8_t         chip_version;
        uint16_t        custid;
        uint8_t         rf_config;
+//0x11:  1T1R, 0x12: 1T2R, 0x92: 1T2R turbo, 0x22: 2T2R
        uint8_t         nendpoints;
        /* QWORD1 */
        uint32_t        regulatory;
@@ -755,6 +770,9 @@ struct rsu_softc {
                                        sc_scanning:1,
                                        sc_scan_pass:1;
        u_int                           cut;
+       uint8_t                         sc_rftype;
+       int8_t                          sc_nrxstream;
+       int8_t                          sc_ntxstream;
        struct rsu_host_cmd_ring        cmdq;
        struct rsu_data                 sc_rx[RSU_RX_LIST_COUNT];
        struct rsu_data                 sc_tx[RSU_TX_LIST_COUNT];