svn commit: r288357 - head/sys/dev/usb/wlan
Adrian Chadd
adrian at FreeBSD.org
Tue Sep 29 06:56:01 UTC 2015
Author: adrian
Date: Tue Sep 29 06:56:00 2015
New Revision: 288357
URL: https://svnweb.freebsd.org/changeset/base/288357
Log:
rsu(4): Add support for 1T2R and 2T2R NICs.
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!
Modified:
head/sys/dev/usb/wlan/if_rsu.c
head/sys/dev/usb/wlan/if_rsureg.h
Modified: head/sys/dev/usb/wlan/if_rsu.c
==============================================================================
--- head/sys/dev/usb/wlan/if_rsu.c Tue Sep 29 05:25:34 2015 (r288356)
+++ head/sys/dev/usb/wlan/if_rsu.c Tue Sep 29 06:56:00 2015 (r288357)
@@ -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;
Modified: head/sys/dev/usb/wlan/if_rsureg.h
==============================================================================
--- head/sys/dev/usb/wlan/if_rsureg.h Tue Sep 29 05:25:34 2015 (r288356)
+++ head/sys/dev/usb/wlan/if_rsureg.h Tue Sep 29 06:56:00 2015 (r288357)
@@ -158,6 +158,20 @@
(((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.
*/
struct r92s_fw_priv {
@@ -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];
More information about the svn-src-all
mailing list