For rum(4) and rt2661 part of ral(4):
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 7 Feb 2007 12:34:26 +0000 (12:34 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Wed, 7 Feb 2007 12:34:26 +0000 (12:34 +0000)
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
sys/dev/netif/rum/if_rum.c

index 70fcf11..78d9e38 100644 (file)
@@ -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)) {
index 860ddcf..dfc18b6 100644 (file)
@@ -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 <damien.bergamini@free.fr>
@@ -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)) {