Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 3 Oct 2015 22:27:00 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r288639 - head/sys/dev/usb/wlan
Message-ID:  <201510032227.t93MR0dQ047360@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sat Oct  3 22:26:59 2015
New Revision: 288639
URL: https://svnweb.freebsd.org/changeset/base/288639

Log:
  rum(4): fix stats interpretation in rum_ratectl_task()
  
  Testing:
  
  * WUSB54GC, STA mode
  
  Submitted by:	<s3erios@gmail.com>
  Differential Revision:	https://reviews.freebsd.org/D3690

Modified:
  head/sys/dev/usb/wlan/if_rum.c

Modified: head/sys/dev/usb/wlan/if_rum.c
==============================================================================
--- head/sys/dev/usb/wlan/if_rum.c	Sat Oct  3 22:22:26 2015	(r288638)
+++ head/sys/dev/usb/wlan/if_rum.c	Sat Oct  3 22:26:59 2015	(r288639)
@@ -2797,29 +2797,34 @@ rum_ratectl_task(void *arg, int pending)
 {
 	struct rum_vap *rvp = arg;
 	struct ieee80211vap *vap = &rvp->vap;
-	struct ieee80211com *ic = vap->iv_ic;
-	struct rum_softc *sc = ic->ic_softc;
+	struct rum_softc *sc = vap->iv_ic->ic_softc;
 	struct ieee80211_node *ni;
-	int ok, fail;
-	int sum, retrycnt;
+	int ok[3], fail;
+	int sum, success, retrycnt;
 
 	RUM_LOCK(sc);
-	/* read and clear statistic registers (STA_CSR0 to STA_CSR10) */
+	/* read and clear statistic registers (STA_CSR0 to STA_CSR5) */
 	rum_read_multi(sc, RT2573_STA_CSR0, sc->sta, sizeof(sc->sta));
 
-	ok = (le32toh(sc->sta[4]) >> 16) +	/* TX ok w/o retry */
-	    (le32toh(sc->sta[5]) & 0xffff);	/* TX ok w/ retry */
-	fail = (le32toh(sc->sta[5]) >> 16);	/* TX retry-fail count */
-	sum = ok+fail;
-	retrycnt = (le32toh(sc->sta[5]) & 0xffff) + fail;
-
-	ni = ieee80211_ref_node(vap->iv_bss);
-	ieee80211_ratectl_tx_update(vap, ni, &sum, &ok, &retrycnt);
-	(void) ieee80211_ratectl_rate(ni, NULL, 0);
-	ieee80211_free_node(ni);
+	ok[0] = (le32toh(sc->sta[4]) & 0xffff);	/* TX ok w/o retry */
+	ok[1] = (le32toh(sc->sta[4]) >> 16);	/* TX ok w/ one retry */
+	ok[2] = (le32toh(sc->sta[5]) & 0xffff);	/* TX ok w/ multiple retries */
+	fail =  (le32toh(sc->sta[5]) >> 16);	/* TX retry-fail count */
+
+	success = ok[0] + ok[1] + ok[2];
+	sum = success + fail;
+	/* XXX at least */
+	retrycnt = ok[1] + ok[2] * 2 + fail * (rvp->maxretry + 1);
+
+	if (sum != 0) {
+		ni = ieee80211_ref_node(vap->iv_bss);
+		ieee80211_ratectl_tx_update(vap, ni, &sum, &ok, &retrycnt);
+		(void) ieee80211_ratectl_rate(ni, NULL, 0);
+		ieee80211_free_node(ni);
+	}
 
 	/* count TX retry-fail as Tx errors */
-	if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, fail);
+	if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS, fail);
 
 	usb_callout_reset(&rvp->ratectl_ch, hz, rum_ratectl_timeout, rvp);
 	RUM_UNLOCK(sc);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201510032227.t93MR0dQ047360>