rsu: fix RSSI reporting, partially revert r288414.
- Append RCR_APP_PHYSTS bit after firmware loading - otherwise firmware will reset the register and this modification will be lost. (without it Rx PHY descriptor section will contain garbage). - Check if R92S_RXDW0_PHYST bit is set (like it is done in rtwn(4)) - even if infosz is non-zero the section may not contain anything useful. - In case, if descriptor is absent (A-MPDU?) use last calibrated RSSI (rtwn(4) uses RSSI from the previous (sub)frame; probably, this approach should be used here too). Tested with Asus USB-N10, STA mode.
This commit is contained in:
parent
7fa7f12ff8
commit
c057023b75
@ -24,7 +24,6 @@ __FBSDID("$FreeBSD$");
|
||||
* TODO:
|
||||
* o h/w crypto
|
||||
* o hostap / ibss / mesh
|
||||
* o sensible RSSI levels
|
||||
* o power-save operation
|
||||
*/
|
||||
|
||||
@ -216,9 +215,7 @@ static void rsu_event_survey(struct rsu_softc *, uint8_t *, int);
|
||||
static void rsu_event_join_bss(struct rsu_softc *, uint8_t *, int);
|
||||
static void rsu_rx_event(struct rsu_softc *, uint8_t, uint8_t *, int);
|
||||
static void rsu_rx_multi_event(struct rsu_softc *, uint8_t *, int);
|
||||
#if 0
|
||||
static int8_t rsu_get_rssi(struct rsu_softc *, int, void *);
|
||||
#endif
|
||||
static struct mbuf * rsu_rx_copy_to_mbuf(struct rsu_softc *,
|
||||
struct r92s_rx_stat *, int);
|
||||
static struct ieee80211_node * rsu_rx_frame(struct rsu_softc *, struct mbuf *,
|
||||
@ -1806,7 +1803,6 @@ rsu_rx_multi_event(struct rsu_softc *sc, uint8_t *buf, int len)
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static int8_t
|
||||
rsu_get_rssi(struct rsu_softc *sc, int rate, void *physt)
|
||||
{
|
||||
@ -1827,7 +1823,6 @@ rsu_get_rssi(struct rsu_softc *sc, int rate, void *physt)
|
||||
}
|
||||
return (rssi);
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct mbuf *
|
||||
rsu_rx_copy_to_mbuf(struct rsu_softc *sc, struct r92s_rx_stat *stat,
|
||||
@ -1886,13 +1881,13 @@ rsu_rx_frame(struct rsu_softc *sc, struct mbuf *m, int8_t *rssi_p)
|
||||
rate = MS(rxdw3, R92S_RXDW3_RATE);
|
||||
infosz = MS(rxdw0, R92S_RXDW0_INFOSZ) * 8;
|
||||
|
||||
#if 0
|
||||
/* Get RSSI from PHY status descriptor if present. */
|
||||
if (infosz != 0)
|
||||
if (infosz != 0 && (rxdw0 & R92S_RXDW0_PHYST))
|
||||
*rssi_p = rsu_get_rssi(sc, rate, &stat[1]);
|
||||
else
|
||||
#endif
|
||||
*rssi_p = 0;
|
||||
else {
|
||||
/* Cheat and get the last calibrated RSSI */
|
||||
*rssi_p = rsu_hwrssi_to_rssi(sc, sc->sc_currssi);
|
||||
}
|
||||
|
||||
if (ieee80211_radiotap_active(ic)) {
|
||||
struct rsu_rx_radiotap_header *tap = &sc->sc_rxtap;
|
||||
@ -1920,11 +1915,8 @@ rsu_rx_frame(struct rsu_softc *sc, struct mbuf *m, int8_t *rssi_p)
|
||||
/* Bit 7 set means HT MCS instead of rate. */
|
||||
tap->wr_rate = 0x80 | (rate - 12);
|
||||
}
|
||||
#if 0
|
||||
tap->wr_dbm_antsignal = *rssi;
|
||||
#endif
|
||||
/* XXX not nice */
|
||||
tap->wr_dbm_antsignal = rsu_hwrssi_to_rssi(sc, sc->sc_currssi);
|
||||
|
||||
tap->wr_dbm_antsignal = *rssi_p;
|
||||
tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
|
||||
tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
|
||||
};
|
||||
@ -2075,9 +2067,6 @@ rsu_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
m->m_next = NULL;
|
||||
|
||||
ni = rsu_rx_frame(sc, m, &rssi);
|
||||
|
||||
/* Cheat and get the last calibrated RSSI */
|
||||
rssi = rsu_hwrssi_to_rssi(sc, sc->sc_currssi);
|
||||
RSU_UNLOCK(sc);
|
||||
|
||||
if (ni != NULL) {
|
||||
@ -2988,9 +2977,6 @@ rsu_init(struct rsu_softc *sc)
|
||||
/* Enable Rx TCP checksum offload. */
|
||||
rsu_write_4(sc, R92S_RCR,
|
||||
rsu_read_4(sc, R92S_RCR) | 0x04000000);
|
||||
/* Append PHY status. */
|
||||
rsu_write_4(sc, R92S_RCR,
|
||||
rsu_read_4(sc, R92S_RCR) | 0x02000000);
|
||||
|
||||
rsu_write_4(sc, R92S_CR,
|
||||
rsu_read_4(sc, R92S_CR) & ~0xff000000);
|
||||
@ -3026,6 +3012,10 @@ rsu_init(struct rsu_softc *sc)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Append PHY status. */
|
||||
rsu_write_4(sc, R92S_RCR,
|
||||
rsu_read_4(sc, R92S_RCR) | 0x02000000);
|
||||
|
||||
/* Setup multicast filter (must be done after firmware loading). */
|
||||
rsu_set_multi(sc);
|
||||
|
||||
|
@ -510,6 +510,7 @@ struct r92s_rx_stat {
|
||||
#define R92S_RXDW0_QOS 0x00800000
|
||||
#define R92S_RXDW0_SHIFT_M 0x03000000
|
||||
#define R92S_RXDW0_SHIFT_S 24
|
||||
#define R92S_RXDW0_PHYST 0x04000000
|
||||
#define R92S_RXDW0_DECRYPTED 0x08000000
|
||||
|
||||
uint32_t rxdw1;
|
||||
|
Loading…
Reference in New Issue
Block a user