Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Feb 2019 03:52:04 +0000 (UTC)
From:      Andriy Voskoboinyk <avos@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r343731 - stable/12/sys/dev/usb/wlan
Message-ID:  <201902040352.x143q4qH027708@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avos
Date: Mon Feb  4 03:52:04 2019
New Revision: 343731
URL: https://svnweb.freebsd.org/changeset/base/343731

Log:
  MFC r343524:
  rsu(4): do not ignore mgmtrate / mcastrate / ucastrate.
  
  Enforce net80211 rates for control / management / multicast / EAPOL frames
  and allow to override rate for unicast frames via ifconfig(8) 'ucastrate'
  option; by default it still uses f/w rate adaptation for unicast frames.

Modified:
  stable/12/sys/dev/usb/wlan/if_rsu.c
  stable/12/sys/dev/usb/wlan/if_rsureg.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/usb/wlan/if_rsu.c
==============================================================================
--- stable/12/sys/dev/usb/wlan/if_rsu.c	Mon Feb  4 03:44:07 2019	(r343730)
+++ stable/12/sys/dev/usb/wlan/if_rsu.c	Mon Feb  4 03:52:04 2019	(r343731)
@@ -2757,15 +2757,17 @@ static int
 rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 
     struct mbuf *m0, struct rsu_data *data)
 {
+	const struct ieee80211_txparam *tp = ni->ni_txparms;
 	struct ieee80211com *ic = &sc->sc_ic;
         struct ieee80211vap *vap = ni->ni_vap;
 	struct ieee80211_frame *wh;
 	struct ieee80211_key *k = NULL;
 	struct r92s_tx_desc *txd;
-	uint8_t type, cipher;
+	uint8_t rate, ridx, type, cipher;
 	int prio = 0;
 	uint8_t which;
 	int hasqos;
+	int ismcast;
 	int xferlen;
 	int qid;
 
@@ -2773,10 +2775,26 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_no
 
 	wh = mtod(m0, struct ieee80211_frame *);
 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
+	ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
 
 	RSU_DPRINTF(sc, RSU_DEBUG_TX, "%s: data=%p, m=%p\n",
 	    __func__, data, m0);
 
+	/* Choose a TX rate index. */
+	if (type == IEEE80211_FC0_TYPE_MGT ||
+	    type == IEEE80211_FC0_TYPE_CTL ||
+	    (m0->m_flags & M_EAPOL) != 0)
+		rate = tp->mgmtrate;
+	else if (ismcast)
+		rate = tp->mcastrate;
+	else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
+		rate = tp->ucastrate;
+	else
+		rate = 0;
+
+	if (rate != 0)
+		ridx = rate2ridx(rate);
+
 	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
 		k = ieee80211_crypto_encap(ni, m0);
 		if (k == NULL) {
@@ -2855,8 +2873,17 @@ rsu_tx_start(struct rsu_softc *sc, struct ieee80211_no
 	}
 	/* XXX todo: set AGGEN bit if appropriate? */
 	txd->txdw2 |= htole32(R92S_TXDW2_BK);
-	if (IEEE80211_IS_MULTICAST(wh->i_addr1))
+	if (ismcast)
 		txd->txdw2 |= htole32(R92S_TXDW2_BMCAST);
+
+	/* Force mgmt / mcast / ucast rate if needed. */
+	if (rate != 0) {
+		/* Data rate fallback limit (max). */
+		txd->txdw5 |= htole32(SM(R92S_TXDW5_DATARATE_FB_LMT, 0x1f));
+		txd->txdw5 |= htole32(SM(R92S_TXDW5_DATARATE, ridx));
+		txd->txdw4 |= htole32(R92S_TXDW4_DRVRATE);
+	}
+
 	/*
 	 * Firmware will use and increment the sequence number for the
 	 * specified priority.

Modified: stable/12/sys/dev/usb/wlan/if_rsureg.h
==============================================================================
--- stable/12/sys/dev/usb/wlan/if_rsureg.h	Mon Feb  4 03:44:07 2019	(r343730)
+++ stable/12/sys/dev/usb/wlan/if_rsureg.h	Mon Feb  4 03:52:04 2019	(r343731)
@@ -700,9 +700,14 @@ struct r92s_tx_desc {
 
 	uint32_t	txdw4;
 #define R92S_TXDW4_TXBW		0x00040000
+#define R92S_TXDW4_DRVRATE	0x80000000
 
 	uint32_t	txdw5;
-#define R92S_TXDW5_DISFB	0x00008000
+#define R92S_TXDW5_DATARATE_M		0x00007e00
+#define R92S_TXDW5_DATARATE_S		9
+#define R92S_TXDW5_DISFB		0x00008000
+#define R92S_TXDW5_DATARATE_FB_LMT_M	0x001f0000
+#define R92S_TXDW5_DATARATE_FB_LMT_S	16
 
 	uint16_t	ipchksum;
 	uint16_t	tcpchksum;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201902040352.x143q4qH027708>