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