svn commit: r287901 - head/sys/dev/usb/wlan
Adrian Chadd
adrian at FreeBSD.org
Thu Sep 17 04:45:30 UTC 2015
Author: adrian
Date: Thu Sep 17 04:45:29 2015
New Revision: 287901
URL: https://svnweb.freebsd.org/changeset/base/287901
Log:
Bring over the QoS logic from the Linux r92su driver.
* the tx descriptor TID is priority, not TID.
* the tx descriptor queue id mapping is separate from the
TID/priority; rather than just "BE".
TODO:
* go and re-re-re-verify the queue mappings; the linux and openbsd
mappings aren't exactly the same. I need to verify all of this
before I try to flip on 11n RX.
Modified:
head/sys/dev/usb/wlan/if_rsu.c
Modified: head/sys/dev/usb/wlan/if_rsu.c
==============================================================================
--- head/sys/dev/usb/wlan/if_rsu.c Thu Sep 17 04:43:07 2015 (r287900)
+++ head/sys/dev/usb/wlan/if_rsu.c Thu Sep 17 04:45:29 2015 (r287901)
@@ -425,6 +425,7 @@ rsu_attach(device_t self)
IEEE80211_C_BGSCAN | /* Background scan. */
#endif
IEEE80211_C_SHPREAMBLE | /* Short preamble supported. */
+ IEEE80211_C_WME | /* WME/QoS */
IEEE80211_C_SHSLOT | /* Short slot time supported. */
IEEE80211_C_WPA; /* WPA/RSN. */
@@ -1752,10 +1753,11 @@ rsu_tx_start(struct rsu_softc *sc, struc
struct ieee80211_key *k = NULL;
struct r92s_tx_desc *txd;
uint8_t type;
- uint8_t tid = 0;
+ int prio = 0;
uint8_t which;
int hasqos;
int xferlen;
+ int qid;
RSU_ASSERT_LOCKED(sc);
@@ -1776,6 +1778,23 @@ rsu_tx_start(struct rsu_softc *sc, struc
}
wh = mtod(m0, struct ieee80211_frame *);
}
+ /* If we have QoS then use it */
+ /* XXX TODO: mbuf WME/PRI versus TID? */
+ if (IEEE80211_QOS_HAS_SEQ(wh)) {
+ /* Has QoS */
+ prio = M_WME_GETAC(m0);
+ which = rsu_wme_ac_xfer_map[prio];
+ hasqos = 1;
+ } else {
+ /* Non-QoS TID */
+ /* XXX TODO: tid=0 for non-qos TID? */
+ which = rsu_wme_ac_xfer_map[WME_AC_BE];
+ hasqos = 0;
+ prio = 0;
+ }
+
+ qid = rsu_ac2qid[prio];
+#if 0
switch (type) {
case IEEE80211_FC0_TYPE_CTL:
case IEEE80211_FC0_TYPE_MGT:
@@ -1786,7 +1805,7 @@ rsu_tx_start(struct rsu_softc *sc, struc
break;
}
hasqos = 0;
-
+#endif
/* Fill Tx descriptor. */
txd = (struct r92s_tx_desc *)data->buf;
memset(txd, 0, sizeof(*txd));
@@ -1797,8 +1816,7 @@ rsu_tx_start(struct rsu_softc *sc, struc
R92S_TXDW0_OWN | R92S_TXDW0_FSG | R92S_TXDW0_LSG);
txd->txdw1 |= htole32(
- SM(R92S_TXDW1_MACID, R92S_MACID_BSS) |
- SM(R92S_TXDW1_QSEL, R92S_TXDW1_QSEL_BE));
+ SM(R92S_TXDW1_MACID, R92S_MACID_BSS) | SM(R92S_TXDW1_QSEL, qid));
if (!hasqos)
txd->txdw1 |= htole32(R92S_TXDW1_NONQOS);
#ifdef notyet
@@ -1826,9 +1844,9 @@ rsu_tx_start(struct rsu_softc *sc, struc
txd->txdw2 |= htole32(R92S_TXDW2_BMCAST);
/*
* Firmware will use and increment the sequence number for the
- * specified TID.
+ * specified priority.
*/
- txd->txdw3 |= htole32(SM(R92S_TXDW3_SEQ, tid));
+ txd->txdw3 |= htole32(SM(R92S_TXDW3_SEQ, prio));
if (ieee80211_radiotap_active_vap(vap)) {
struct rsu_tx_radiotap_header *tap = &sc->sc_txtap;
More information about the svn-src-head
mailing list