summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/wlan/if_run.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/wlan/if_run.c')
-rw-r--r--sys/dev/usb/wlan/if_run.c88
1 files changed, 48 insertions, 40 deletions
diff --git a/sys/dev/usb/wlan/if_run.c b/sys/dev/usb/wlan/if_run.c
index 65f48e4..e69cb06 100644
--- a/sys/dev/usb/wlan/if_run.c
+++ b/sys/dev/usb/wlan/if_run.c
@@ -65,7 +65,7 @@ __FBSDID("$FreeBSD$");
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_regdomain.h>
#include <net80211/ieee80211_radiotap.h>
-#include <net80211/ieee80211_amrr.h>
+#include <net80211/ieee80211_ratectl.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
@@ -290,7 +290,6 @@ static const struct usb_device_id run_devs[] = {
};
MODULE_DEPEND(run, wlan, 1, 1, 1);
-MODULE_DEPEND(run, wlan_amrr, 1, 1, 1);
MODULE_DEPEND(run, usb, 1, 1, 1);
MODULE_DEPEND(run, firmware, 1, 1, 1);
@@ -350,9 +349,9 @@ static int run_key_set(struct ieee80211vap *, const struct ieee80211_key *,
const uint8_t mac[IEEE80211_ADDR_LEN]);
static int run_key_delete(struct ieee80211vap *,
const struct ieee80211_key *);
-static void run_amrr_start(struct run_softc *, struct ieee80211_node *);
-static void run_amrr_to(void *);
-static void run_amrr_cb(void *, int);
+static void run_ratectl_start(struct run_softc *, struct ieee80211_node *);
+static void run_ratectl_to(void *);
+static void run_ratectl_cb(void *, int);
static void run_iter_func(void *, struct ieee80211_node *);
static void run_newassoc(struct ieee80211_node *, int);
static void run_rx_frame(struct run_softc *, struct mbuf *, uint32_t);
@@ -754,14 +753,12 @@ run_vap_create(struct ieee80211com *ic,
rvp->newstate = vap->iv_newstate;
vap->iv_newstate = run_newstate;
- TASK_INIT(&rvp->amrr_task, 0, run_amrr_cb, rvp);
+ TASK_INIT(&rvp->ratectl_task, 0, run_ratectl_cb, rvp);
TASK_INIT(&sc->wme_task, 0, run_wme_update_cb, ic);
TASK_INIT(&sc->usb_timeout_task, 0, run_usb_timeout_cb, sc);
- callout_init((struct callout *)&rvp->amrr_ch, 1);
- ieee80211_amrr_init(&rvp->amrr, vap,
- IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
- IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
- 1000 /* 1 sec */);
+ callout_init((struct callout *)&rvp->ratectl_ch, 1);
+ ieee80211_ratectl_init(vap);
+ ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
/* complete setup */
ieee80211_vap_attach(vap, run_media_change, ieee80211_media_status);
@@ -786,16 +783,16 @@ run_vap_delete(struct ieee80211vap *vap)
sc = ifp->if_softc;
RUN_LOCK(sc);
- sc->sc_rvp->amrr_run = RUN_AMRR_OFF;
+ sc->sc_rvp->ratectl_run = RUN_RATECTL_OFF;
RUN_UNLOCK(sc);
/* drain them all */
- usb_callout_drain(&sc->sc_rvp->amrr_ch);
- ieee80211_draintask(ic, &sc->sc_rvp->amrr_task);
+ usb_callout_drain(&sc->sc_rvp->ratectl_ch);
+ ieee80211_draintask(ic, &sc->sc_rvp->ratectl_task);
ieee80211_draintask(ic, &sc->wme_task);
ieee80211_draintask(ic, &sc->usb_timeout_task);
- ieee80211_amrr_cleanup(&rvp->amrr);
+ ieee80211_ratectl_deinit(vap);
ieee80211_vap_detach(vap);
free(rvp, M_80211_VAP);
sc->sc_rvp = NULL;
@@ -1632,8 +1629,8 @@ run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
IEEE80211_UNLOCK(ic);
RUN_LOCK(sc);
- sc->sc_rvp->amrr_run = RUN_AMRR_OFF;
- usb_callout_stop(&rvp->amrr_ch);
+ sc->sc_rvp->ratectl_run = RUN_RATECTL_OFF;
+ usb_callout_stop(&rvp->ratectl_ch);
if (ostate == IEEE80211_S_RUN) {
/* turn link LED off */
@@ -1681,7 +1678,7 @@ run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
/* enable automatic rate adaptation */
tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
- run_amrr_start(sc, ni);
+ run_ratectl_start(sc, ni);
/* turn link LED on */
run_set_leds(sc, RT2860_LED_RADIO |
@@ -1961,12 +1958,14 @@ fail:
}
static void
-run_amrr_start(struct run_softc *sc, struct ieee80211_node *ni)
+run_ratectl_start(struct run_softc *sc, struct ieee80211_node *ni)
{
struct ieee80211vap *vap = ni->ni_vap;
struct run_vap *rvp = RUN_VAP(vap);
uint32_t sta[3];
+#if 0
uint8_t wcid;
+#endif
RUN_LOCK_ASSERT(sc, MA_OWNED);
@@ -1974,30 +1973,33 @@ run_amrr_start(struct run_softc *sc, struct ieee80211_node *ni)
run_read_region_1(sc, RT2860_TX_STA_CNT0,
(uint8_t *)sta, sizeof sta);
+#if 0
wcid = RUN_AID2WCID(ni == NULL ? 0 : ni->ni_associd);
ieee80211_amrr_node_init(&rvp->amrr, &rvp->amn[wcid], ni);
+#endif
+ ieee80211_ratectl_node_init(ni);
/* start at lowest available bit-rate, AMRR will raise */
ni->ni_txrate = 2;
/* start calibration timer */
- rvp->amrr_run = RUN_AMRR_ON;
- usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp);
+ rvp->ratectl_run = RUN_RATECTL_ON;
+ usb_callout_reset(&rvp->ratectl_ch, hz, run_ratectl_to, rvp);
}
static void
-run_amrr_to(void *arg)
+run_ratectl_to(void *arg)
{
struct run_vap *rvp = arg;
/* do it in a process context, so it can go sleep */
- ieee80211_runtask(rvp->vap.iv_ic, &rvp->amrr_task);
+ ieee80211_runtask(rvp->vap.iv_ic, &rvp->ratectl_task);
/* next timeout will be rescheduled in the callback task */
}
/* ARGSUSED */
static void
-run_amrr_cb(void *arg, int pending)
+run_ratectl_cb(void *arg, int pending)
{
struct run_vap *rvp = arg;
struct ieee80211vap *vap = &rvp->vap;
@@ -2020,8 +2022,8 @@ run_amrr_cb(void *arg, int pending)
ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, rvp);
}
- if(rvp->amrr_run == RUN_AMRR_ON)
- usb_callout_reset(&rvp->amrr_ch, hz, run_amrr_to, rvp);
+ if(rvp->ratectl_run == RUN_RATECTL_ON)
+ usb_callout_reset(&rvp->ratectl_ch, hz, run_ratectl_to, rvp);
}
@@ -2033,10 +2035,11 @@ run_iter_func(void *arg, struct ieee80211_node *ni)
struct ifnet *ifp = ic->ic_ifp;
struct run_softc *sc = ifp->if_softc;
struct ieee80211_node_table *nt = &ic->ic_sta;
- struct ieee80211_amrr_node *amn = &rvp->amn[0]; /* make compiler happy */
uint32_t sta[3], stat;
int error;
uint8_t wcid, mcs, pid;
+ struct ieee80211vap *vap = ni->ni_vap;
+ int txcnt = 0, success = 0, retrycnt = 0;
if(ic->ic_opmode != IEEE80211_M_STA)
IEEE80211_NODE_ITERATE_UNLOCK(nt);
@@ -2056,10 +2059,7 @@ run_iter_func(void *arg, struct ieee80211_node *ni)
continue;
/* update per-STA AMRR stats */
- amn = &rvp->amn[wcid];
- amn->amn_txcnt++;
if (stat & RT2860_TXQ_OK) {
- amn->amn_success++;
/*
* Check if there were retries, ie if the Tx
* success rate is different from the requested
@@ -2069,16 +2069,20 @@ run_iter_func(void *arg, struct ieee80211_node *ni)
mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f;
pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf;
if (mcs + 1 != pid)
- amn->amn_retrycnt++;
+ retrycnt = 1;
+ ieee80211_ratectl_tx_complete(vap, ni,
+ IEEE80211_RATECTL_TX_SUCCESS,
+ &retrycnt, NULL);
} else {
- amn->amn_retrycnt++;
+ retrycnt = 1;
+ ieee80211_ratectl_tx_complete(vap, ni,
+ IEEE80211_RATECTL_TX_SUCCESS,
+ &retrycnt, NULL);
ifp->if_oerrors++;
}
run_read_region_1(sc, RT2860_TX_STAT_FIFO,
(uint8_t *)&stat, sizeof stat);
}
- DPRINTFN(3, "retrycnt=%d txcnt=%d success=%d\n",
- amn->amn_retrycnt, amn->amn_txcnt, amn->amn_success);
} else {
/* read statistic counters (clear on read) and update AMRR state */
error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
@@ -2090,26 +2094,30 @@ run_iter_func(void *arg, struct ieee80211_node *ni)
le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff,
le32toh(sta[0]) & 0xffff);
+#if 0
wcid = RUN_AID2WCID(ni == NULL ? 0 : ni->ni_associd);
amn = &rvp->amn[wcid];
+#endif
/* count failed TX as errors */
ifp->if_oerrors += le32toh(sta[0]) & 0xffff;
- amn->amn_retrycnt =
+ retrycnt =
(le32toh(sta[0]) & 0xffff) + /* failed TX count */
(le32toh(sta[1]) >> 16); /* TX retransmission count */
- amn->amn_txcnt =
- amn->amn_retrycnt +
+ txcnt =
+ retrycnt +
(le32toh(sta[1]) & 0xffff); /* successful TX count */
- amn->amn_success =
+ success =
(le32toh(sta[1]) >> 16) +
(le32toh(sta[1]) & 0xffff);
+ ieee80211_ratectl_tx_update(vap, ni, &txcnt, &success,
+ &retrycnt);
}
- ieee80211_amrr_choose(ni, amn);
+ ieee80211_ratectl_rate(ni, NULL, 0);
skip:;
RUN_UNLOCK(sc);
@@ -4447,7 +4455,7 @@ run_stop(void *arg)
RUN_LOCK_ASSERT(sc, MA_OWNED);
if(sc->sc_rvp != NULL){
- sc->sc_rvp->amrr_run = RUN_AMRR_OFF;
+ sc->sc_rvp->ratectl_run = RUN_RATECTL_OFF;
if (ic->ic_flags & IEEE80211_F_SCAN)
ieee80211_cancel_scan(&sc->sc_rvp->vap);
}
OpenPOWER on IntegriCloud