svn commit: r325303 - head/sys/dev/usb/wlan

Andriy Voskoboinyk avos at FreeBSD.org
Thu Nov 2 00:17:54 UTC 2017


Author: avos
Date: Thu Nov  2 00:17:52 2017
New Revision: 325303
URL: https://svnweb.freebsd.org/changeset/base/325303

Log:
  rsu(4): trim code for Rx rate calculation.
  
  Include ridx <-> rate conversion functions from rtwn(4) +
  reuse already calculated value for ieee80211_radiotap(9).
  
  Tested with Asus USB-N10, STA mode.

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	Wed Nov  1 23:20:04 2017	(r325302)
+++ head/sys/dev/usb/wlan/if_rsu.c	Thu Nov  2 00:17:52 2017	(r325303)
@@ -68,8 +68,11 @@ __FBSDID("$FreeBSD$");
 #include <dev/usb/usbdi.h>
 #include "usbdevs.h"
 
+#include <dev/rtwn/if_rtwn_ridx.h>	/* XXX */
 #include <dev/usb/wlan/if_rsureg.h>
 
+#define RSU_RATE_IS_CCK	RTWN_RATE_IS_CCK
+
 #ifdef USB_DEBUG
 static int rsu_debug = 0;
 SYSCTL_NODE(_hw_usb, OID_AUTO, rsu, CTLFLAG_RW, 0, "USB rsu");
@@ -2382,44 +2385,6 @@ rsu_rx_frame(struct rsu_softc *sc, struct mbuf *m)
 		rssi = rsu_hwrssi_to_rssi(sc, sc->sc_currssi);
 	}
 
-	if (ieee80211_radiotap_active(ic)) {
-		struct rsu_rx_radiotap_header *tap = &sc->sc_rxtap;
-
-		/* Map HW rate index to 802.11 rate. */
-		tap->wr_flags = 0;		/* TODO */
-		tap->wr_tsft = rsu_get_tsf_high(sc);
-		if (le32toh(stat->tsf_low) > rsu_get_tsf_low(sc))
-			tap->wr_tsft--;
-		tap->wr_tsft = (uint64_t)htole32(tap->wr_tsft) << 32;
-		tap->wr_tsft += stat->tsf_low;
-
-		if (rate < 12) {
-			switch (rate) {
-			/* CCK. */
-			case  0: tap->wr_rate =   2; break;
-			case  1: tap->wr_rate =   4; break;
-			case  2: tap->wr_rate =  11; break;
-			case  3: tap->wr_rate =  22; break;
-			/* OFDM. */
-			case  4: tap->wr_rate =  12; break;
-			case  5: tap->wr_rate =  18; break;
-			case  6: tap->wr_rate =  24; break;
-			case  7: tap->wr_rate =  36; break;
-			case  8: tap->wr_rate =  48; break;
-			case  9: tap->wr_rate =  72; break;
-			case 10: tap->wr_rate =  96; break;
-			case 11: tap->wr_rate = 108; break;
-			}
-		} else {			/* MCS0~15. */
-			/* Bit 7 set means HT MCS instead of rate. */
-			tap->wr_rate = 0x80 | (rate - 12);
-		}
-
-		tap->wr_dbm_antsignal = rssi;
-		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
-		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
-	};
-
 	/* Hardware does Rx TCP checksum offload. */
 	/*
 	 * This flag can be set for some other
@@ -2465,64 +2430,33 @@ rsu_rx_frame(struct rsu_softc *sc, struct mbuf *m)
 	rxs.c_nf = -96;
 
 	/* Rate */
-	if (!(rxdw3 & R92S_RXDW3_HTC)) {
-		switch (rate) {
-		/* CCK. */
-		case 0:
-			rxs.c_rate = 2;
+	if (rate < 12) {
+		rxs.c_rate = ridx2rate[rate];
+		if (RSU_RATE_IS_CCK(rate))
 			rxs.c_pktflags |= IEEE80211_RX_F_CCK;
-			break;
-		case 1:
-			rxs.c_rate = 4;
-			rxs.c_pktflags |= IEEE80211_RX_F_CCK;
-			break;
-		case 2:
-			rxs.c_rate = 11;
-			rxs.c_pktflags |= IEEE80211_RX_F_CCK;
-			break;
-		case 3:
-			rxs.c_rate = 22;
-			rxs.c_pktflags |= IEEE80211_RX_F_CCK;
-			break;
-		/* OFDM. */
-		case 4:
-			rxs.c_rate = 12;
+		else
 			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 5:
-			rxs.c_rate = 18;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 6:
-			rxs.c_rate = 24;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 7:
-			rxs.c_rate = 36;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 8:
-			rxs.c_rate = 48;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 9:
-			rxs.c_rate = 72;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 10:
-			rxs.c_rate = 96;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		case 11:
-			rxs.c_rate = 108;
-			rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
-			break;
-		}
-	} else if (rate >= 12) {	/* MCS0~15. */
-		/* Bit 7 set means HT MCS instead of rate. */
-		rxs.c_rate = (rate - 12);
+	} else {
+		rxs.c_rate = IEEE80211_RATE_MCS | (rate - 12);
 		rxs.c_pktflags |= IEEE80211_RX_F_HT;
 	}
+
+	if (ieee80211_radiotap_active(ic)) {
+		struct rsu_rx_radiotap_header *tap = &sc->sc_rxtap;
+
+		/* Map HW rate index to 802.11 rate. */
+		tap->wr_flags = 0;		/* TODO */
+		tap->wr_tsft = rsu_get_tsf_high(sc);
+		if (le32toh(stat->tsf_low) > rsu_get_tsf_low(sc))
+			tap->wr_tsft--;
+		tap->wr_tsft = (uint64_t)htole32(tap->wr_tsft) << 32;
+		tap->wr_tsft += stat->tsf_low;
+
+		tap->wr_rate = rxs.c_rate;
+		tap->wr_dbm_antsignal = rssi;
+		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
+		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
+	};
 
 	(void) ieee80211_add_rx_params(m, &rxs);
 


More information about the svn-src-head mailing list