From d2eb9874270e297fbf618e83fb1c3dc5c5de4e7a Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Wed, 7 Feb 2007 12:34:26 +0000 Subject: [PATCH] For rum(4) and rt2661 part of ral(4): Return -1 in {rum,rt2661}_get_rssi(), if rssi can't be converted to relative RX signal strength. Caller of these two functions will detect the conversion error and use old rssi to feed ieee80211_input(), so when rssi smoothing is in place, rssi conversion error will have no impacts on average rssi. --- sys/dev/netif/ral/rt2661.c | 25 +++++++++++++++++++------ sys/dev/netif/rum/if_rum.c | 22 ++++++++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/sys/dev/netif/ral/rt2661.c b/sys/dev/netif/ral/rt2661.c index 70fcf11045..78d9e382da 100644 --- a/sys/dev/netif/ral/rt2661.c +++ b/sys/dev/netif/ral/rt2661.c @@ -15,7 +15,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * $FreeBSD: src/sys/dev/ral/rt2661.c,v 1.4 2006/03/21 21:15:43 damien Exp $ - * $DragonFly: src/sys/dev/netif/ral/rt2661.c,v 1.12 2007/02/06 14:40:32 sephe Exp $ + * $DragonFly: src/sys/dev/netif/ral/rt2661.c,v 1.13 2007/02/07 12:34:26 sephe Exp $ */ /* @@ -1137,7 +1137,7 @@ rt2661_rx_intr(struct rt2661_softc *sc) struct rt2661_rx_desc *desc; struct rt2661_data *data; bus_addr_t physaddr; - struct ieee80211_frame *wh; + struct ieee80211_frame_min *wh; struct ieee80211_node *ni; struct rt2661_node *rn; struct mbuf *mnew, *m; @@ -1223,6 +1223,13 @@ rt2661_rx_intr(struct rt2661_softc *sc) rssi = rt2661_get_rssi(sc, desc->rssi); + wh = mtod(m, struct ieee80211_frame_min *); + ni = ieee80211_find_rxnode(ic, wh); + + /* Error happened during RSSI conversion. */ + if (rssi < 0) + rssi = ni->ni_rssi; + if (sc->sc_drvbpf != NULL) { struct rt2661_rx_radiotap_header *tap = &sc->sc_rxtap; uint32_t tsf_lo, tsf_hi; @@ -1242,10 +1249,6 @@ rt2661_rx_intr(struct rt2661_softc *sc) bpf_ptap(sc->sc_drvbpf, m, tap, sc->sc_rxtap_len); } - wh = mtod(m, struct ieee80211_frame *); - ni = ieee80211_find_rxnode(ic, - (struct ieee80211_frame_min *)wh); - /* send the frame to the 802.11 layer */ ieee80211_input(ic, m, ni, rssi, 0); @@ -2979,6 +2982,16 @@ rt2661_get_rssi(struct rt2661_softc *sc, uint8_t raw) lna = (raw >> 5) & 0x3; agc = raw & 0x1f; + if (lna == 0) { + /* + * No RSSI mapping + * + * NB: Since RSSI is relative to noise floor, -1 is + * adequate for caller to know error happened. + */ + return -1; + } + rssi = (2 * agc) - RT2661_NOISE_FLOOR; if (IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan)) { diff --git a/sys/dev/netif/rum/if_rum.c b/sys/dev/netif/rum/if_rum.c index 860ddcf10b..dfc18b65f1 100644 --- a/sys/dev/netif/rum/if_rum.c +++ b/sys/dev/netif/rum/if_rum.c @@ -1,5 +1,5 @@ /* $OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $ */ -/* $DragonFly: src/sys/dev/netif/rum/if_rum.c,v 1.5 2007/02/06 14:33:39 sephe Exp $ */ +/* $DragonFly: src/sys/dev/netif/rum/if_rum.c,v 1.6 2007/02/07 12:34:26 sephe Exp $ */ /*- * Copyright (c) 2005, 2006 Damien Bergamini @@ -844,6 +844,13 @@ rum_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) rssi = rum_get_rssi(sc, desc->rssi); + wh = mtod(m, struct ieee80211_frame_min *); + ni = ieee80211_find_rxnode(ic, wh); + + /* Error happened during RSSI conversion. */ + if (rssi < 0) + rssi = ni->ni_rssi; + if (sc->sc_drvbpf != NULL) { struct rum_rx_radiotap_header *tap = &sc->sc_rxtap; @@ -857,9 +864,6 @@ rum_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) bpf_ptap(sc->sc_drvbpf, m, tap, sc->sc_rxtap_len); } - wh = mtod(m, struct ieee80211_frame_min *); - ni = ieee80211_find_rxnode(ic, wh); - /* send the frame to the 802.11 layer */ ieee80211_input(ic, m, ni, rssi, 0); @@ -2246,6 +2250,16 @@ rum_get_rssi(struct rum_softc *sc, uint8_t raw) lna = (raw >> 5) & 0x3; agc = raw & 0x1f; + if (lna == 0) { + /* + * No RSSI mapping + * + * NB: Since RSSI is relative to noise floor, -1 is + * adequate for caller to know error happened. + */ + return -1; + } + rssi = (2 * agc) - RT2573_NOISE_FLOOR; if (IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan)) { -- 2.41.0