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.
This commit is contained in:
Andriy Voskoboinyk
2017-11-02 00:17:52 +00:00
parent 37ff334548
commit 76ff59295f
+26 -92
View File
@@ -68,8 +68,11 @@ __FBSDID("$FreeBSD$");
#include <dev/usb/usbdi.h> #include <dev/usb/usbdi.h>
#include "usbdevs.h" #include "usbdevs.h"
#include <dev/rtwn/if_rtwn_ridx.h> /* XXX */
#include <dev/usb/wlan/if_rsureg.h> #include <dev/usb/wlan/if_rsureg.h>
#define RSU_RATE_IS_CCK RTWN_RATE_IS_CCK
#ifdef USB_DEBUG #ifdef USB_DEBUG
static int rsu_debug = 0; static int rsu_debug = 0;
SYSCTL_NODE(_hw_usb, OID_AUTO, rsu, CTLFLAG_RW, 0, "USB rsu"); 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); 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. */ /* Hardware does Rx TCP checksum offload. */
/* /*
* This flag can be set for some other * This flag can be set for some other
@@ -2465,65 +2430,34 @@ rsu_rx_frame(struct rsu_softc *sc, struct mbuf *m)
rxs.c_nf = -96; rxs.c_nf = -96;
/* Rate */ /* Rate */
if (!(rxdw3 & R92S_RXDW3_HTC)) { if (rate < 12) {
switch (rate) { rxs.c_rate = ridx2rate[rate];
/* CCK. */ if (RSU_RATE_IS_CCK(rate))
case 0:
rxs.c_rate = 2;
rxs.c_pktflags |= IEEE80211_RX_F_CCK; rxs.c_pktflags |= IEEE80211_RX_F_CCK;
break; else
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;
rxs.c_pktflags |= IEEE80211_RX_F_OFDM; rxs.c_pktflags |= IEEE80211_RX_F_OFDM;
break; } else {
case 5: rxs.c_rate = IEEE80211_RATE_MCS | (rate - 12);
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);
rxs.c_pktflags |= IEEE80211_RX_F_HT; 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); (void) ieee80211_add_rx_params(m, &rxs);
/* Drop descriptor. */ /* Drop descriptor. */