svn commit: r297910 - head/sys/dev/urtwn

Adrian Chadd adrian at FreeBSD.org
Wed Apr 13 05:19:18 UTC 2016


Author: adrian
Date: Wed Apr 13 05:19:16 2016
New Revision: 297910
URL: https://svnweb.freebsd.org/changeset/base/297910

Log:
  [urtwn] use/track the last good RSSI for a given node, rather than no RSSI.
  
  Now that we're decap'ing A-MPDU frame, the firmware is only giving us
  PHY status information for the whole PPDU, rather than duplicatig it
  per frame.
  
  So, we fake it by maintaining the RSSI that we saw in the node struct
  and reuse it.
  
  This prevents us from getting some pretty garbage looking default RSSI
  values, which shows up as RSSI values of like "3" or "4" when doing
  active traffic.
  
  Tested:
  
  * RTL8188EU, STA mode

Modified:
  head/sys/dev/urtwn/if_urtwn.c
  head/sys/dev/urtwn/if_urtwnvar.h

Modified: head/sys/dev/urtwn/if_urtwn.c
==============================================================================
--- head/sys/dev/urtwn/if_urtwn.c	Wed Apr 13 04:13:36 2016	(r297909)
+++ head/sys/dev/urtwn/if_urtwn.c	Wed Apr 13 05:19:16 2016	(r297910)
@@ -360,10 +360,10 @@ static void		urtwn_update_aifs(struct ur
 static void		urtwn_set_promisc(struct urtwn_softc *);
 static void		urtwn_update_promisc(struct ieee80211com *);
 static void		urtwn_update_mcast(struct ieee80211com *);
-static struct ieee80211_node *urtwn_r88e_node_alloc(struct ieee80211vap *,
+static struct ieee80211_node *urtwn_node_alloc(struct ieee80211vap *,
 			    const uint8_t mac[IEEE80211_ADDR_LEN]);
-static void		urtwn_r88e_newassoc(struct ieee80211_node *, int);
-static void		urtwn_r88e_node_free(struct ieee80211_node *);
+static void		urtwn_newassoc(struct ieee80211_node *, int);
+static void		urtwn_node_free(struct ieee80211_node *);
 static void		urtwn_set_chan(struct urtwn_softc *,
 		    	    struct ieee80211_channel *,
 			    struct ieee80211_channel *);
@@ -628,10 +628,10 @@ urtwn_attach(device_t self)
 	ic->ic_update_promisc = urtwn_update_promisc;
 	ic->ic_update_mcast = urtwn_update_mcast;
 	if (sc->chip & URTWN_CHIP_88E) {
-		ic->ic_node_alloc = urtwn_r88e_node_alloc;
-		ic->ic_newassoc = urtwn_r88e_newassoc;
+		ic->ic_node_alloc = urtwn_node_alloc;
+		ic->ic_newassoc = urtwn_newassoc;
 		sc->sc_node_free = ic->ic_node_free;
-		ic->ic_node_free = urtwn_r88e_node_free;
+		ic->ic_node_free = urtwn_node_free;
 	}
 	ic->ic_update_chw = urtwn_update_chw;
 	ic->ic_ampdu_enable = urtwn_ampdu_enable;
@@ -1025,7 +1025,7 @@ urtwn_rx_frame(struct urtwn_softc *sc, s
 	struct r92c_rx_stat *stat;
 	uint32_t rxdw0, rxdw3;
 	uint8_t rate, cipher;
-	int8_t rssi = URTWN_NOISE_FLOOR + 1;
+	int8_t rssi = -127;
 	int infosz;
 
 	stat = mtod(m, struct r92c_rx_stat *);
@@ -1042,6 +1042,7 @@ urtwn_rx_frame(struct urtwn_softc *sc, s
 			rssi = urtwn_r88e_get_rssi(sc, rate, &stat[1]);
 		else
 			rssi = urtwn_get_rssi(sc, rate, &stat[1]);
+		URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: rssi=%d\n", __func__, rssi);
 		/* Update our average RSSI. */
 		urtwn_update_avgrssi(sc, rate, rssi);
 	}
@@ -1070,6 +1071,8 @@ urtwn_rx_frame(struct urtwn_softc *sc, s
 			/* Bit 7 set means HT MCS instead of rate. */
 			tap->wr_rate = 0x80 | (rate - 12);
 		}
+
+		/* XXX TODO: this isn't right; should use the last good RSSI */
 		tap->wr_dbm_antsignal = rssi;
 		tap->wr_dbm_antnoise = URTWN_NOISE_FLOOR;
 	}
@@ -1135,17 +1138,26 @@ tr_setup:
 			m->m_next = NULL;
 
 			ni = urtwn_rx_frame(sc, m, &rssi);
+
+			/* Store a global last-good RSSI */
+			if (rssi != -127)
+				sc->last_rssi = rssi;
+
 			URTWN_UNLOCK(sc);
 
 			nf = URTWN_NOISE_FLOOR;
 			if (ni != NULL) {
+				if (rssi != -127)
+					URTWN_NODE(ni)->last_rssi = rssi;
 				if (ni->ni_flags & IEEE80211_NODE_HT)
 					m->m_flags |= M_AMPDU;
-				(void)ieee80211_input(ni, m, rssi - nf, nf);
+				(void)ieee80211_input(ni, m,
+				    URTWN_NODE(ni)->last_rssi - nf, nf);
 				ieee80211_free_node(ni);
 			} else {
-				(void)ieee80211_input_all(ic, m, rssi - nf,
-				    nf);
+				/* Use last good global RSSI */
+				(void)ieee80211_input_all(ic, m,
+				    sc->last_rssi - nf, nf);
 			}
 			URTWN_LOCK(sc);
 			m = next;
@@ -4868,7 +4880,7 @@ urtwn_update_mcast(struct ieee80211com *
 }
 
 static struct ieee80211_node *
-urtwn_r88e_node_alloc(struct ieee80211vap *vap,
+urtwn_node_alloc(struct ieee80211vap *vap,
     const uint8_t mac[IEEE80211_ADDR_LEN])
 {
 	struct urtwn_node *un;
@@ -4885,12 +4897,16 @@ urtwn_r88e_node_alloc(struct ieee80211va
 }
 
 static void
-urtwn_r88e_newassoc(struct ieee80211_node *ni, int isnew)
+urtwn_newassoc(struct ieee80211_node *ni, int isnew)
 {
 	struct urtwn_softc *sc = ni->ni_ic->ic_softc;
 	struct urtwn_node *un = URTWN_NODE(ni);
 	uint8_t id;
 
+	/* Only do this bit for R88E chips */
+	if (! (sc->chip & URTWN_CHIP_88E))
+		return;
+
 	if (!isnew)
 		return;
 
@@ -4911,7 +4927,7 @@ urtwn_r88e_newassoc(struct ieee80211_nod
 }
 
 static void
-urtwn_r88e_node_free(struct ieee80211_node *ni)
+urtwn_node_free(struct ieee80211_node *ni)
 {
 	struct urtwn_softc *sc = ni->ni_ic->ic_softc;
 	struct urtwn_node *un = URTWN_NODE(ni);

Modified: head/sys/dev/urtwn/if_urtwnvar.h
==============================================================================
--- head/sys/dev/urtwn/if_urtwnvar.h	Wed Apr 13 04:13:36 2016	(r297909)
+++ head/sys/dev/urtwn/if_urtwnvar.h	Wed Apr 13 05:19:16 2016	(r297910)
@@ -96,6 +96,7 @@ struct urtwn_fw_info {
 struct urtwn_node {
 	struct ieee80211_node	ni;	/* must be the first */
 	uint8_t			id;
+	int			last_rssi;
 };
 #define URTWN_NODE(ni)	((struct urtwn_node *)(ni))
 
@@ -191,6 +192,8 @@ struct urtwn_softc {
 	int				ledlink;
 	int				sc_txtimer;
 
+	int				last_rssi;
+
 	int				fwcur;
 	struct urtwn_data		sc_rx[URTWN_RX_LIST_COUNT];
 	urtwn_datahead			sc_rx_active;


More information about the svn-src-head mailing list