Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Mar 2008 05:35:24 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 137690 for review
Message-ID:  <200803140535.m2E5ZOaA097153@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=137690

Change 137690 by sam@sam_ebb on 2008/03/14 05:34:39

	o track amrr changes
	o replace callout thread to update amrr state by inline
	  calls to ieee80211_amrr_choose

Affected files ...

.. //depot/projects/vap/sys/dev/bwi/if_bwi.c#5 edit
.. //depot/projects/vap/sys/dev/bwi/if_bwivar.h#3 edit

Differences ...

==== //depot/projects/vap/sys/dev/bwi/if_bwi.c#5 (text+ko) ====

@@ -113,7 +113,6 @@
 static void	bwi_updateslot(struct ifnet *);
 static struct ieee80211_node *bwi_node_alloc(struct ieee80211_node_table *);
 static void	bwi_newassoc(struct ieee80211_node *, int);
-static void	bwi_amrr_timeout(void *);
 static int	bwi_media_change(struct ifnet *);
 
 static void	bwi_calibrate(void *);
@@ -600,7 +599,6 @@
 	const uint8_t bssid[IEEE80211_ADDR_LEN],
 	const uint8_t mac[IEEE80211_ADDR_LEN])
 {
-	struct bwi_softc *sc = ic->ic_ifp->if_softc;
 	struct bwi_vap *bvp;
 	struct ieee80211vap *vap;
 
@@ -621,10 +619,10 @@
 #if 0
 	vap->iv_update_beacon = bwi_beacon_update;
 #endif
-	callout_init_mtx(&bvp->bv_amrr_ch, &sc->sc_mtx, 0);
 	ieee80211_amrr_init(&bvp->bv_amrr, vap,
 	    IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
-	    IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD);
+	    IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
+	    500 /*ms*/);
 
 	/* complete setup */
 	ieee80211_vap_attach(vap, bwi_media_change, ieee80211_media_status);
@@ -637,7 +635,7 @@
 {
 	struct bwi_vap *bvp = BWI_VAP(vap);
 
-	callout_drain(&bvp->bv_amrr_ch);
+	ieee80211_amrr_cleanup(&bvp->bv_amrr);
 	ieee80211_vap_detach(vap);
 	free(bvp, M_80211_VAP);
 }
@@ -1749,14 +1747,12 @@
 	struct bwi_vap *bvp = BWI_VAP(vap);
 	struct ifnet *ifp = vap->iv_ic->ic_ifp;
 	struct bwi_softc *sc = ifp->if_softc;
-	const struct ieee80211_txparam *tp;
 	struct bwi_mac *mac;
 	struct ieee80211_node *ni;
 	int error;
 
 	BWI_LOCK(sc);
 
-	callout_stop(&bvp->bv_amrr_ch);
 	callout_stop(&sc->sc_calib_ch);
 
 	if (nstate == IEEE80211_S_INIT)
@@ -1791,12 +1787,6 @@
 			bwi_newassoc(ni, 1);
 		}
 
-		/* start automatic rate control timer */
-		tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
-		if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
-			callout_reset(&bvp->bv_amrr_ch, hz / 2,
-			    bwi_amrr_timeout, vap);
-
 		callout_reset(&sc->sc_calib_ch, hz, bwi_calibrate, sc);
 	} else {
 		bwi_set_bssid(sc, bwi_zero_addr);
@@ -1821,41 +1811,11 @@
 bwi_newassoc(struct ieee80211_node *ni, int isnew)
 {
 	struct ieee80211vap *vap = ni->ni_vap;
-	int i;
 
-	ieee80211_amrr_node_init(&BWI_VAP(vap)->bv_amrr, &BWI_NODE(ni)->amn);
-
-	/* set rate to some reasonable initial value */
-	for (i = ni->ni_rates.rs_nrates - 1;
-	     i > 0 && (ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) > 72;
-	     i--);
-	ni->ni_txrate = i;
-}
-
-static void
-bwi_iter_func(void *arg, struct ieee80211_node *ni)
-{
-	struct ieee80211vap *vap = arg;
-	struct bwi_node *bn = BWI_NODE(ni);
-
-	ieee80211_amrr_choose(&BWI_VAP(vap)->bv_amrr, ni, &bn->amn);
+	ieee80211_amrr_node_init(&BWI_VAP(vap)->bv_amrr,
+	    &BWI_NODE(ni)->amn, ni);
 }
 
-static void
-bwi_amrr_timeout(void *arg)
-{
-	struct ieee80211vap *vap = arg;
-	struct ieee80211com *ic = vap->iv_ic;
-
-	BWI_ASSERT_LOCKED(sc);
-
-	if (vap->iv_opmode == IEEE80211_M_STA)
-		bwi_iter_func(vap, vap->iv_bss);
-	else
-		ieee80211_iterate_nodes(&ic->ic_sta, bwi_iter_func, vap);
-	callout_reset(&BWI_VAP(vap)->bv_amrr_ch, hz / 2, bwi_amrr_timeout, vap);
-}
-
 static int
 bwi_media_change(struct ifnet *ifp)
 {
@@ -3039,14 +2999,14 @@
 	else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
 		rate = rate_fb = tp->ucastrate;
 	else {
-		rate = ni->ni_rates.rs_rates[ni->ni_txrate] & 
-		    IEEE80211_RATE_VAL;
-		tb->tb_rate_idx[0] = ni->ni_txrate;
+		tb->tb_rate_idx[0] =
+		    ieee80211_amrr_choose(ni, &BWI_NODE(ni)->amn);
+		rate = ni->ni_txrate;
 
-		if (ni->ni_txrate > 0) {
-			rate_fb = ni->ni_rates.rs_rates[ni->ni_txrate - 1] &
+		if (tb->tb_rate_idx[0] > 0) {
+			tb->tb_rate_idx[1] = tb->tb_rate_idx[0] - 1;
+			rate_fb = ni->ni_rates.rs_rates[tb->tb_rate_idx[1]] &
 				  IEEE80211_RATE_VAL;
-			tb->tb_rate_idx[1] = ni->ni_txrate - 1;
 		} else {
 			rate_fb = rate;
 			tb->tb_rate_idx[1] = tb->tb_rate_idx[0];
@@ -3424,12 +3384,11 @@
 		/* NB: update rate control only for unicast frames */
 		if (hdr->txh_mac_ctrl & htole32(BWI_TXH_MAC_C_ACK)) {
 			/* Feed back 'acked and data_txcnt' */
-			if (acked &&
+			ieee80211_amrr_tx_complete(&bn->amn,
+			   (acked &&
 			    (data_txcnt <= BWI_SHRETRY_FB ||
-			     tb->tb_rate_idx[0] == tb->tb_rate_idx[1]))
-				bn->amn.amn_success++;
-			bn->amn.amn_txcnt++;
-			bn->amn.amn_retrycnt += data_txcnt-1;
+			     tb->tb_rate_idx[0] == tb->tb_rate_idx[1])),
+			   data_txcnt-1);
 		}
 
 		/*

==== //depot/projects/vap/sys/dev/bwi/if_bwivar.h#3 (text+ko) ====

@@ -539,7 +539,6 @@
 struct bwi_vap {
 	struct ieee80211vap	bv_vap;
 	struct ieee80211_amrr	bv_amrr;
-	struct callout		bv_amrr_ch;
 	int			(*bv_newstate)(struct ieee80211vap *,
 				    enum ieee80211_state, int);
 };



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