kernel/rum: Fix TX rate control. Use usb_pause_ls instead of zsleep.
authorImre Vadasz <imre@vdsz.com>
Thu, 24 Jul 2014 18:19:39 +0000 (20:19 +0200)
committerImre Vadasz <imre@vdsz.com>
Thu, 24 Jul 2014 19:08:40 +0000 (21:08 +0200)
* Fix TX rate control by interpreting the TX statistic counters correctly.
  Taken-From: OpenBSD

* Using usb_pause_ls instead of zsleep seems to avoid deadlocks.

sys/bus/u4b/wlan/if_rum.c

index 1a40f7e..e3d16a0 100644 (file)
@@ -2276,11 +2276,13 @@ rum_ratectl_task(void *arg, int pending)
        /* read and clear statistic registers (STA_CSR0 to STA_CSR10) */
        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 */
+       ok = (le32toh(sc->sta[4]) & 0xffff) +   /* TX no-retry ok count */
+           (le32toh(sc->sta[4]) >> 16) +       /* TX one-retry ok count */
+           (le32toh(sc->sta[5]) & 0xffff);     /* TX more-retry ok count */
        fail = (le32toh(sc->sta[5]) >> 16);     /* TX retry-fail count */
        sum = ok+fail;
-       retrycnt = (le32toh(sc->sta[5]) & 0xffff) + fail;
+       retrycnt = (le32toh(sc->sta[4]) >> 16) +
+           (le32toh(sc->sta[5]) & 0xffff) + fail;
 
        ni = ieee80211_ref_node(vap->iv_bss);
        ieee80211_ratectl_tx_update(vap, ni, &sum, &ok, &retrycnt);
@@ -2381,7 +2383,8 @@ rum_get_rssi(struct rum_softc *sc, uint8_t raw)
 static int
 rum_pause(struct rum_softc *sc, int timeout)
 {
-       zsleep(sc, &wlan_global_serializer, 0, "rumpause", timeout + 1);
+       usb_pause_ls(lockowned(&sc->sc_lock) ? &sc->sc_lock : NULL,
+           &wlan_global_serializer, timeout + 1);
        return (0);
 }