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!
This commit is contained in:
parent
24c2763fb1
commit
85dafc6977
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=288357
@ -403,6 +403,7 @@ rsu_attach(device_t self)
|
|||||||
int error;
|
int error;
|
||||||
uint8_t iface_index, bands;
|
uint8_t iface_index, bands;
|
||||||
struct usb_interface *iface;
|
struct usb_interface *iface;
|
||||||
|
const char *rft;
|
||||||
|
|
||||||
device_set_usb_desc(self);
|
device_set_usb_desc(self);
|
||||||
sc->sc_udev = uaa->device;
|
sc->sc_udev = uaa->device;
|
||||||
@ -462,8 +463,37 @@ rsu_attach(device_t self)
|
|||||||
device_printf(self, "could not read ROM\n");
|
device_printf(self, "could not read ROM\n");
|
||||||
goto fail_rom;
|
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]);
|
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_softc = sc;
|
||||||
ic->ic_name = device_get_nameunit(self);
|
ic->ic_name = device_get_nameunit(self);
|
||||||
@ -494,8 +524,8 @@ rsu_attach(device_t self)
|
|||||||
ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
|
ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
|
||||||
|
|
||||||
/* set number of spatial streams */
|
/* set number of spatial streams */
|
||||||
ic->ic_txstream = 1;
|
ic->ic_txstream = sc->sc_ntxstream;
|
||||||
ic->ic_rxstream = 1;
|
ic->ic_rxstream = sc->sc_nrxstream;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set supported .11b and .11g rates. */
|
/* 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->hci_sel = R92S_HCI_SEL_USB | R92S_HCI_SEL_8172;
|
||||||
dmem->nendpoints = sc->sc_nendpoints;
|
dmem->nendpoints = sc->sc_nendpoints;
|
||||||
dmem->chip_version = sc->cut;
|
dmem->chip_version = sc->cut;
|
||||||
/* XXX TODO: rf_config should come from ROM */
|
dmem->rf_config = sc->sc_rftype;
|
||||||
dmem->rf_config = 0x11; /* 1T1R */
|
|
||||||
dmem->vcs_type = R92S_VCS_TYPE_AUTO;
|
dmem->vcs_type = R92S_VCS_TYPE_AUTO;
|
||||||
dmem->vcs_mode = R92S_VCS_MODE_RTS_CTS;
|
dmem->vcs_mode = R92S_VCS_MODE_RTS_CTS;
|
||||||
dmem->turbo_mode = 0;
|
dmem->turbo_mode = 0;
|
||||||
|
@ -157,6 +157,20 @@
|
|||||||
#define RW(var, field, val) \
|
#define RW(var, field, val) \
|
||||||
(((var) & ~field##_M) | SM(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.
|
* Firmware image header.
|
||||||
*/
|
*/
|
||||||
@ -173,6 +187,7 @@ struct r92s_fw_priv {
|
|||||||
uint8_t chip_version;
|
uint8_t chip_version;
|
||||||
uint16_t custid;
|
uint16_t custid;
|
||||||
uint8_t rf_config;
|
uint8_t rf_config;
|
||||||
|
//0x11: 1T1R, 0x12: 1T2R, 0x92: 1T2R turbo, 0x22: 2T2R
|
||||||
uint8_t nendpoints;
|
uint8_t nendpoints;
|
||||||
/* QWORD1 */
|
/* QWORD1 */
|
||||||
uint32_t regulatory;
|
uint32_t regulatory;
|
||||||
@ -755,6 +770,9 @@ struct rsu_softc {
|
|||||||
sc_scanning:1,
|
sc_scanning:1,
|
||||||
sc_scan_pass:1;
|
sc_scan_pass:1;
|
||||||
u_int cut;
|
u_int cut;
|
||||||
|
uint8_t sc_rftype;
|
||||||
|
int8_t sc_nrxstream;
|
||||||
|
int8_t sc_ntxstream;
|
||||||
struct rsu_host_cmd_ring cmdq;
|
struct rsu_host_cmd_ring cmdq;
|
||||||
struct rsu_data sc_rx[RSU_RX_LIST_COUNT];
|
struct rsu_data sc_rx[RSU_RX_LIST_COUNT];
|
||||||
struct rsu_data sc_tx[RSU_TX_LIST_COUNT];
|
struct rsu_data sc_tx[RSU_TX_LIST_COUNT];
|
||||||
|
Loading…
Reference in New Issue
Block a user