Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 29 Jan 2008 20:44:58 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 134412 for review
Message-ID:  <200801292044.m0TKiwfe008917@repoman.freebsd.org>

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

Change 134412 by sam@sam_ebb on 2008/01/29 20:44:56

	convert ral to use wlan_rssadapt instead of its private
	copy of the code; this is mostly a first step towards
	ripping rssadapt use out entirely; lightly tested in sta
	mode on both 2560 and 2661 cards

Affected files ...

.. //depot/projects/vap/sys/dev/ral/if_ral_pci.c#5 edit
.. //depot/projects/vap/sys/dev/ral/if_ralrate.c#4 delete
.. //depot/projects/vap/sys/dev/ral/if_ralrate.h#4 delete
.. //depot/projects/vap/sys/dev/ral/rt2560.c#12 edit
.. //depot/projects/vap/sys/dev/ral/rt2560var.h#8 edit
.. //depot/projects/vap/sys/dev/ral/rt2661.c#9 edit
.. //depot/projects/vap/sys/dev/ral/rt2661var.h#6 edit
.. //depot/projects/vap/sys/modules/ral/Makefile#5 edit

Differences ...

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

@@ -50,16 +50,17 @@
 
 #include <net80211/ieee80211_var.h>
 #include <net80211/ieee80211_radiotap.h>
+#include <net80211/ieee80211_rssadapt.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>
 
-#include <dev/ral/if_ralrate.h>
 #include <dev/ral/rt2560var.h>
 #include <dev/ral/rt2661var.h>
 
 MODULE_DEPEND(ral, pci, 1, 1, 1);
 MODULE_DEPEND(ral, wlan, 1, 1, 1);
+MODULE_DEPEND(ral, wlan_rssadapt, 1, 1, 1);
 
 struct ral_pci_ident {
 	uint16_t	vendor;

==== //depot/projects/vap/sys/dev/ral/rt2560.c#12 (text) ====

@@ -55,6 +55,7 @@
 #include <net80211/ieee80211_phy.h>
 #include <net80211/ieee80211_radiotap.h>
 #include <net80211/ieee80211_regdomain.h>
+#include <net80211/ieee80211_rssadapt.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
@@ -62,7 +63,6 @@
 #include <netinet/ip.h>
 #include <netinet/if_ether.h>
 
-#include <dev/ral/if_ralrate.h>
 #include <dev/ral/rt2560reg.h>
 #include <dev/ral/rt2560var.h>
 
@@ -108,6 +108,7 @@
 			    struct ieee80211_node_table *);
 static void		rt2560_iter_func(void *, struct ieee80211_node *);
 static void		rt2560_update_rssadapt(void *);
+static void		rt2560_newassoc(struct ieee80211_node *, int);
 static int		rt2560_newstate(struct ieee80211vap *,
 			    enum ieee80211_state, int);
 static uint16_t		rt2560_eeprom_read(struct rt2560_softc *, uint8_t);
@@ -211,7 +212,6 @@
 	    MTX_DEF | MTX_RECURSE);
 
 	callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0);
-	callout_init(&sc->rssadapt_ch, CALLOUT_MPSAFE);
 
 	/* retrieve RT2560 rev. no */
 	sc->asic_rev = RAL_READ(sc, RT2560_CSR0);
@@ -296,6 +296,7 @@
 	ieee80211_init_channels(ic, NULL, &bands);
 
 	ieee80211_ifattach(ic);
+	ic->ic_newassoc = rt2560_newassoc;
 	ic->ic_raw_xmit = rt2560_raw_xmit;
 	ic->ic_updateslot = rt2560_update_slot;
 	ic->ic_node_alloc = rt2560_node_alloc;
@@ -358,7 +359,6 @@
 	
 	rt2560_stop(sc);
 	RAL_LOCK(sc);
-	callout_stop(&sc->rssadapt_ch);
 
 	bpfdetach(ifp);
 	ieee80211_ifdetach(ic);
@@ -401,6 +401,9 @@
 	vap->iv_newstate = rt2560_newstate;
 	vap->iv_update_beacon = rt2560_beacon_update;
 
+	callout_init(&rvp->rssadapt_ch, CALLOUT_MPSAFE);
+	ieee80211_rssadapt_init(&rvp->rssadapt, vap);
+
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	ic->ic_opmode = opmode;
@@ -412,6 +415,7 @@
 {
 	struct rt2560_vap *rvp = RT2560_VAP(vap);
 
+	callout_stop(&rvp->rssadapt_ch);
 	ieee80211_vap_detach(vap);
 	free(rvp, M_80211_VAP);
 }
@@ -748,9 +752,10 @@
 static void
 rt2560_iter_func(void *arg, struct ieee80211_node *ni)
 {
-	struct rt2560_node *rn = (struct rt2560_node *)ni;
+	struct ieee80211vap *vap = arg;
 
-	ral_rssadapt_updatestats(&rn->rssadapt);
+	if (ni->ni_vap == vap)
+		ieee80211_rssadapt_updatestats(&RT2560_NODE(ni)->rssadapt);
 }
 
 /*
@@ -760,15 +765,25 @@
 static void
 rt2560_update_rssadapt(void *arg)
 {
-	struct rt2560_softc *sc = arg;
-	struct ieee80211com *ic = &sc->sc_ic;
+	struct ieee80211vap *vap = arg;
+	struct rt2560_vap *rvp = RT2560_VAP(vap);
+
+	if (vap->iv_opmode != IEEE80211_M_STA) {
+		struct ieee80211com *ic = vap->iv_ic;
+		ieee80211_iterate_nodes(&ic->ic_sta, rt2560_iter_func, arg);
+	} else
+		rt2560_iter_func(arg, vap->iv_bss);
 
-	RAL_LOCK(sc);
+	callout_reset(&rvp->rssadapt_ch, hz / 10, rt2560_update_rssadapt, vap);
+}
 
-	ieee80211_iterate_nodes(&ic->ic_sta, rt2560_iter_func, arg);
-	callout_reset(&sc->rssadapt_ch, hz / 10, rt2560_update_rssadapt, sc);
+static void
+rt2560_newassoc(struct ieee80211_node *ni, int isnew)
+{
+	struct ieee80211vap *vap = ni->ni_vap;
 
-	RAL_UNLOCK(sc);
+	ieee80211_rssadapt_node_init(&RT2560_VAP(vap)->rssadapt,
+	    &RT2560_NODE(ni)->rssadapt, ni);
 }
 
 static int
@@ -776,6 +791,7 @@
 {
 	struct rt2560_vap *rvp = RT2560_VAP(vap);
 	struct rt2560_softc *sc = vap->iv_ic->ic_ifp->if_softc;
+	const struct ieee80211_txparam *tp;
 	enum ieee80211_state ostate;
 	struct ieee80211_node *ni;
 	struct mbuf *m;
@@ -785,9 +801,9 @@
 
 	switch (nstate) {
 	case IEEE80211_S_INIT:
-		callout_stop(&sc->rssadapt_ch);
+		if (ostate == IEEE80211_S_RUN) {
+			callout_stop(&rvp->rssadapt_ch);
 
-		if (ostate == IEEE80211_S_RUN) {
 			/* abort TSF synchronization */
 			RAL_WRITE(sc, RT2560_CSR14, 0);
 
@@ -824,15 +840,19 @@
 		rt2560_update_led(sc, 1, 0);
 
 		if (vap->iv_opmode != IEEE80211_M_MONITOR) {
-			callout_reset(&sc->rssadapt_ch, hz / 10,
-			    rt2560_update_rssadapt, sc);
+			if (vap->iv_opmode == IEEE80211_M_STA) {
+				/* fake a join to init the tx rate */
+				rt2560_newassoc(ni, 1);
+			}
+
+			tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
+			if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
+				callout_reset(&rvp->rssadapt_ch, hz / 10,
+				    rt2560_update_rssadapt, vap);
 
 			rt2560_enable_tsf_sync(sc);
 		}
 		break;
-	case IEEE80211_S_SCAN:
-	case IEEE80211_S_AUTH:
-	case IEEE80211_S_ASSOC:
 	default:
 		break;
 	}
@@ -958,6 +978,7 @@
 	struct rt2560_tx_desc *desc;
 	struct rt2560_tx_data *data;
 	struct rt2560_node *rn;
+	struct mbuf *m;
 
 	bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
 	    BUS_DMASYNC_POSTREAD);
@@ -972,13 +993,14 @@
 			break;
 
 		rn = (struct rt2560_node *)data->ni;
+		m = data->m;
 
 		switch (le32toh(desc->flags) & RT2560_TX_RESULT_MASK) {
 		case RT2560_TX_SUCCESS:
 			DPRINTFN(sc, 10, "%s\n", "data frame sent successfully");
-			if (data->id.id_node != NULL) {
-				ral_rssadapt_raise_rate(&rn->rssadapt,
-				    &data->id);
+			if (data->rix != IEEE80211_FIXED_RATE_NONE) {
+				ieee80211_rssadapt_tx_complete(&rn->rssadapt, 1,
+				    m->m_pkthdr.len, data->rix, data->rssi);
 			}
 			ifp->if_opackets++;
 			break;
@@ -992,9 +1014,9 @@
 		case RT2560_TX_FAIL_RETRY:
 			DPRINTFN(sc, 9, "%s\n",
 			    "sending data frame failed (too much retries)");
-			if (data->id.id_node != NULL) {
-				ral_rssadapt_lower_rate(data->ni,
-				    &rn->rssadapt, &data->id);
+			if (data->rix != IEEE80211_FIXED_RATE_NONE) {
+				ieee80211_rssadapt_tx_complete(&rn->rssadapt, 0,
+				    m->m_pkthdr.len, data->rix, data->rssi);
 			}
 			ifp->if_oerrors++;
 			break;
@@ -1010,7 +1032,7 @@
 		bus_dmamap_sync(sc->txq.data_dmat, data->map,
 		    BUS_DMASYNC_POSTWRITE);
 		bus_dmamap_unload(sc->txq.data_dmat, data->map);
-		m_freem(data->m);
+		m_freem(m);
 		data->m = NULL;
 		ieee80211_free_node(data->ni);
 		data->ni = NULL;
@@ -1126,7 +1148,7 @@
 
 /*
  * Some frames were processed by the hardware cipher engine and are ready for
- * transmission to the IEEE802.11 layer.
+ * handoff to the IEEE802.11 layer.
  */
 static void
 rt2560_decryption_intr(struct rt2560_softc *sc)
@@ -1138,7 +1160,6 @@
 	bus_addr_t physaddr;
 	struct ieee80211_frame *wh;
 	struct ieee80211_node *ni;
-	struct rt2560_node *rn;
 	struct mbuf *mnew, *m;
 	int hw, error;
 
@@ -1229,8 +1250,6 @@
 			    htole64(((uint64_t)tsf_hi << 32) | tsf_lo);
 			tap->wr_flags = 0;
 			tap->wr_rate = rt2560_rxrate(desc);
-			tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
-			tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
 			tap->wr_antenna = sc->rx_ant;
 			tap->wr_antsignal = RT2560_RSSI(sc, desc->rssi);
 
@@ -1245,12 +1264,6 @@
 		if (ni != NULL) {
 			(void) ieee80211_input(ni, m,
 			    RT2560_RSSI(sc, desc->rssi), RT2560_NOISE_FLOOR, 0);
-
-			/* give rssi to the rate adatation algorithm */
-			rn = (struct rt2560_node *)ni;
-			ral_rssadapt_input(ni, &rn->rssadapt,
-			    RT2560_RSSI(sc, desc->rssi));
-
 			ieee80211_free_node(ni);
 		} else
 			(void) ieee80211_input_all(ic, m,
@@ -1538,7 +1551,8 @@
 rt2560_tx_bcn(struct rt2560_softc *sc, struct mbuf *m0,
     struct ieee80211_node *ni)
 {
-	struct ieee80211com *ic = &sc->sc_ic;
+	struct ieee80211vap *vap = ni->ni_vap;
+	struct ieee80211com *ic = ni->ni_ic;
 	struct rt2560_tx_desc *desc;
 	struct rt2560_tx_data *data;
 	bus_dma_segment_t segs[RT2560_MAX_SCATTER];
@@ -1547,7 +1561,8 @@
 	desc = &sc->bcnq.desc[sc->bcnq.cur];
 	data = &sc->bcnq.data[sc->bcnq.cur];
 
-	rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 2;
+	/* XXX maybe a separate beacon rate? */
+	rate = vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)].mgmtrate;
 
 	error = bus_dmamap_load_mbuf_sg(sc->bcnq.data_dmat, data->map, m0,
 	    segs, &nsegs, BUS_DMA_NOWAIT);
@@ -1592,7 +1607,8 @@
 rt2560_tx_mgt(struct rt2560_softc *sc, struct mbuf *m0,
     struct ieee80211_node *ni)
 {
-	struct ieee80211com *ic = &sc->sc_ic;
+	struct ieee80211vap *vap = ni->ni_vap;
+	struct ieee80211com *ic = ni->ni_ic;
 	struct rt2560_tx_desc *desc;
 	struct rt2560_tx_data *data;
 	struct ieee80211_frame *wh;
@@ -1605,7 +1621,7 @@
 	desc = &sc->prioq.desc[sc->prioq.cur];
 	data = &sc->prioq.data[sc->prioq.cur];
 
-	rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
+	rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
 
 	wh = mtod(m0, struct ieee80211_frame *);
 
@@ -1640,6 +1656,8 @@
 
 	data->m = m0;
 	data->ni = ni;
+	/* management frames are not taken into account for rssadapt */
+	data->rix = IEEE80211_FIXED_RATE_NONE;
 
 	wh = mtod(m0, struct ieee80211_frame *);
 
@@ -1693,6 +1711,7 @@
 	rate = params->ibp_rate0 & IEEE80211_RATE_VAL;
 	/* XXX validate */
 	if (rate == 0) {
+		/* XXX fall back to mcast/mgmt rate? */
 		m_freem(m0);
 		return EINVAL;
 	}
@@ -1805,9 +1824,9 @@
 		struct ieee80211_rateset *rs;
 
 		rs = &ni->ni_rates;
-		rn = (struct rt2560_node *)ni;
-		ni->ni_txrate = ral_rssadapt_choose(&rn->rssadapt, rs, wh,
-		    m0->m_pkthdr.len, NULL, 0);
+		rn = RT2560_NODE(ni);
+		ni->ni_txrate = ieee80211_rssadapt_choose(&rn->rssadapt, rs,
+		    m0->m_pkthdr.len);
 		rate = rs->rs_rates[ni->ni_txrate];
 	}
 	rate &= IEEE80211_RATE_VAL;
@@ -1866,7 +1885,7 @@
 		data->ni = ni;
 
 		/* RTS frames are not taken into account for rssadapt */
-		data->id.id_node = NULL;
+		data->rix = IEEE80211_FIXED_RATE_NONE;
 
 		rt2560_setup_tx_desc(sc, desc, RT2560_TX_ACK |
 		    RT2560_TX_MORE_FRAG, m->m_pkthdr.len, rtsrate, 1,
@@ -1926,8 +1945,6 @@
 
 		tap->wt_flags = 0;
 		tap->wt_rate = rate;
-		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
-		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
 		tap->wt_antenna = sc->tx_ant;
 
 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
@@ -1938,13 +1955,11 @@
 
 	/* remember link conditions for rate adaptation algorithm */
 	if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
-		data->id.id_len = m0->m_pkthdr.len;
-		data->id.id_rateidx = ni->ni_txrate;
-		data->id.id_node = ni;
+		data->rix = ni->ni_txrate;
 		/* XXX probably need last rssi value and not avg */
-		data->id.id_rssi = ic->ic_node_getrssi(ni);
+		data->rssi = ic->ic_node_getrssi(ni);
 	} else
-		data->id.id_node = NULL;
+		data->rix = IEEE80211_FIXED_RATE_NONE;
 
 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
 		flags |= RT2560_TX_ACK;
@@ -2254,6 +2269,11 @@
 
 	RAL_LOCK(sc);
 	rt2560_set_chan(sc, ic->ic_curchan);
+
+	sc->sc_txtap.wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
+	sc->sc_txtap.wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
+	sc->sc_rxtap.wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
+	sc->sc_rxtap.wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
 	RAL_UNLOCK(sc);
 
 }

==== //depot/projects/vap/sys/dev/ral/rt2560var.h#8 (text) ====

@@ -55,7 +55,8 @@
 	bus_dmamap_t			map;
 	struct mbuf			*m;
 	struct ieee80211_node		*ni;
-	struct ral_rssdesc		id;
+	uint8_t				rix;
+	int8_t				rssi;
 };
 
 struct rt2560_tx_ring {
@@ -94,12 +95,15 @@
 
 struct rt2560_node {
 	struct ieee80211_node	ni;
-	struct ral_rssadapt	rssadapt;
+	struct ieee80211_rssadapt_node rssadapt;
 };
+#define	RT2560_NODE(ni)		((struct rt2560_node *)(ni))
 
 struct rt2560_vap {
 	struct ieee80211vap	ral_vap;
 	struct ieee80211_beacon_offsets	ral_bo;
+	struct ieee80211_rssadapt rssadapt;
+	struct callout		rssadapt_ch;
 
 	int			(*ral_newstate)(struct ieee80211vap *,
 				    enum ieee80211_state, int);
@@ -116,7 +120,6 @@
 	struct mtx		sc_mtx;
 
 	struct callout		watchdog_ch;
-	struct callout		rssadapt_ch;
 
 	int			sc_tx_timer;
 	int                     sc_invalid;

==== //depot/projects/vap/sys/dev/ral/rt2661.c#9 (text) ====

@@ -54,6 +54,7 @@
 #include <net80211/ieee80211_var.h>
 #include <net80211/ieee80211_radiotap.h>
 #include <net80211/ieee80211_regdomain.h>
+#include <net80211/ieee80211_rssadapt.h>
 
 #include <netinet/in.h>
 #include <netinet/in_systm.h>
@@ -61,7 +62,6 @@
 #include <netinet/ip.h>
 #include <netinet/if_ether.h>
 
-#include <dev/ral/if_ralrate.h>
 #include <dev/ral/rt2661reg.h>
 #include <dev/ral/rt2661var.h>
 #include <dev/ral/rt2661_ucode.h>
@@ -102,6 +102,7 @@
 			    struct rt2661_rx_ring *);
 static struct		ieee80211_node *rt2661_node_alloc(
 			    struct ieee80211_node_table *);
+static void		rt2661_newassoc(struct ieee80211_node *, int);
 static int		rt2661_newstate(struct ieee80211vap *,
 			    enum ieee80211_state, int);
 static uint16_t		rt2661_eeprom_read(struct rt2661_softc *, uint8_t);
@@ -215,7 +216,6 @@
 	    MTX_DEF | MTX_RECURSE);
 
 	callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0);
-	callout_init(&sc->rssadapt_ch, CALLOUT_MPSAFE);
 
 	/* wait for NIC to initialize */
 	for (ntries = 0; ntries < 1000; ntries++) {
@@ -327,6 +327,7 @@
 	ieee80211_init_channels(ic, NULL, &bands);
 
 	ieee80211_ifattach(ic);
+	ic->ic_newassoc = rt2661_newassoc;
 	ic->ic_node_alloc = rt2661_node_alloc;
 /*	ic->ic_wme.wme_update = rt2661_wme_update;*/
 	ic->ic_scan_start = rt2661_scan_start;
@@ -378,7 +379,6 @@
 	RAL_LOCK(sc);
 	rt2661_stop_locked(sc);
 	callout_stop(&sc->watchdog_ch);
-	callout_stop(&sc->rssadapt_ch);
 
 	bpfdetach(ifp);
 	ieee80211_ifdetach(ic);
@@ -425,6 +425,9 @@
 	vap->iv_update_beacon = rt2661_beacon_update;
 #endif
 
+	callout_init(&rvp->rssadapt_ch, CALLOUT_MPSAFE);
+	ieee80211_rssadapt_init(&rvp->rssadapt, vap);
+
 	/* complete setup */
 	ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status);
 	ic->ic_opmode = opmode;
@@ -436,6 +439,7 @@
 {
 	struct rt2661_vap *rvp = RT2661_VAP(vap);
 
+	callout_stop(&rvp->rssadapt_ch);
 	ieee80211_vap_detach(vap);
 	free(rvp, M_80211_VAP);
 }
@@ -781,9 +785,10 @@
 static void
 rt2661_iter_func(void *arg, struct ieee80211_node *ni)
 {
-	struct rt2661_node *rn = (struct rt2661_node *)ni;
+	struct ieee80211vap *vap = arg;
 
-	ral_rssadapt_updatestats(&rn->rssadapt);
+	if (ni->ni_vap == vap)
+		ieee80211_rssadapt_updatestats(&RT2661_NODE(ni)->rssadapt);
 }
 
 /*
@@ -793,15 +798,25 @@
 static void
 rt2661_update_rssadapt(void *arg)
 {
-	struct rt2661_softc *sc = arg;
-	struct ieee80211com *ic = &sc->sc_ic;
+	struct ieee80211vap *vap = arg;
+	struct rt2661_vap *rvp = RT2661_VAP(vap);
+
+	if (vap->iv_opmode != IEEE80211_M_STA) {
+		struct ieee80211com *ic = vap->iv_ic;
+		ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg);
+	} else
+		rt2661_iter_func(arg, vap->iv_bss);
 
-	RAL_LOCK(sc);
+	callout_reset(&rvp->rssadapt_ch, hz / 10, rt2661_update_rssadapt, vap);
+}
 
-	ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg);
-	callout_reset(&sc->rssadapt_ch, hz / 10, rt2661_update_rssadapt, sc);
+static void
+rt2661_newassoc(struct ieee80211_node *ni, int isnew)
+{
+	struct ieee80211vap *vap = ni->ni_vap;
 
-	RAL_UNLOCK(sc);
+	ieee80211_rssadapt_node_init(&RT2661_VAP(vap)->rssadapt,
+	    &RT2661_NODE(ni)->rssadapt, ni);
 }
 
 static int
@@ -810,6 +825,7 @@
 	struct rt2661_vap *rvp = RT2661_VAP(vap);
 	struct ieee80211com *ic = vap->iv_ic;
 	struct rt2661_softc *sc = ic->ic_ifp->if_softc;
+	const struct ieee80211_txparam *tp;
 	enum ieee80211_state ostate;
 	struct ieee80211_node *ni;
 	uint32_t tmp;
@@ -819,9 +835,9 @@
 
 	switch (nstate) {
 	case IEEE80211_S_INIT:
-		callout_stop(&sc->rssadapt_ch);
+		if (ostate == IEEE80211_S_RUN) {
+			callout_stop(&rvp->rssadapt_ch);
 
-		if (ostate == IEEE80211_S_RUN) {
 			/* abort TSF synchronization */
 			tmp = RAL_READ(sc, RT2661_TXRX_CSR9);
 			RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp & ~0x00ffffff);
@@ -844,14 +860,19 @@
 		}
 
 		if (vap->iv_opmode != IEEE80211_M_MONITOR) {
-			callout_reset(&sc->rssadapt_ch, hz / 10,
-			    rt2661_update_rssadapt, sc);
+			if (vap->iv_opmode == IEEE80211_M_STA) {
+				/* fake a join to init the tx rate */
+				rt2661_newassoc(ni, 1);
+			}
+
+			tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
+			if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
+				callout_reset(&rvp->rssadapt_ch, hz / 10,
+				    rt2661_update_rssadapt, vap);
+
 			rt2661_enable_tsf_sync(sc);
 		}
 		break;
-	case IEEE80211_S_SCAN:
-	case IEEE80211_S_AUTH:
-	case IEEE80211_S_ASSOC:
 	default:
 		break;
 	}	
@@ -959,9 +980,10 @@
 
 			DPRINTFN(sc, 10, "data frame sent successfully after "
 			    "%d retries\n", retrycnt);
-			if (retrycnt == 0 && data->id.id_node != NULL) {
-				ral_rssadapt_raise_rate(&rn->rssadapt,
-				    &data->id);
+			if (retrycnt == 0 &&
+			    data->rix != IEEE80211_FIXED_RATE_NONE) {
+				ieee80211_rssadapt_tx_complete(&rn->rssadapt, 1,
+				    m->m_pkthdr.len, data->rix, data->rssi);
 			}
 			ifp->if_opackets++;
 			break;
@@ -969,9 +991,9 @@
 		case RT2661_TX_RETRY_FAIL:
 			DPRINTFN(sc, 9, "%s\n",
 			    "sending data frame failed (too much retries)");
-			if (data->id.id_node != NULL) {
-				ral_rssadapt_lower_rate(ni,
-				    &rn->rssadapt, &data->id);
+			if (data->rix != IEEE80211_FIXED_RATE_NONE) {
+				ieee80211_rssadapt_tx_complete(&rn->rssadapt, 0,
+				    m->m_pkthdr.len, data->rix, data->rssi);
 			}
 			ifp->if_oerrors++;
 			break;
@@ -1043,7 +1065,6 @@
 	bus_addr_t physaddr;
 	struct ieee80211_frame *wh;
 	struct ieee80211_node *ni;
-	struct rt2661_node *rn;
 	struct mbuf *mnew, *m;
 	int error;
 
@@ -1139,8 +1160,6 @@
 			    htole64(((uint64_t)tsf_hi << 32) | tsf_lo);
 			tap->wr_flags = 0;
 			tap->wr_rate = rt2661_rxrate(desc);
-			tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
-			tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
 			tap->wr_antsignal = rssi < 0 ? 0 : rssi;
 
 			bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
@@ -1159,11 +1178,6 @@
 
 			(void) ieee80211_input(ni, m, rssi,
 			    RT2661_NOISE_FLOOR, 0);
-
-			/* give rssi to the rate adatation algorithm */
-			rn = (struct rt2661_node *)ni;
-			ral_rssadapt_input(ni, &rn->rssadapt, rssi);
-
 			ieee80211_free_node(ni);
 		} else
 			(void) ieee80211_input_all(ic, m, rssi,
@@ -1462,7 +1476,8 @@
 rt2661_tx_mgt(struct rt2661_softc *sc, struct mbuf *m0,
     struct ieee80211_node *ni)
 {
-	struct ieee80211com *ic = &sc->sc_ic;
+	struct ieee80211vap *vap = ni->ni_vap;
+	struct ieee80211com *ic = ni->ni_ic;
 	struct rt2661_tx_desc *desc;
 	struct rt2661_tx_data *data;
 	struct ieee80211_frame *wh;
@@ -1475,8 +1490,7 @@
 	desc = &sc->mgtq.desc[sc->mgtq.cur];
 	data = &sc->mgtq.data[sc->mgtq.cur];
 
-	/* send mgt frames at the lowest available rate */
-	rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
+	rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
 
 	wh = mtod(m0, struct ieee80211_frame *);
 
@@ -1502,14 +1516,14 @@
 
 		tap->wt_flags = 0;
 		tap->wt_rate = rate;
-		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
-		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
 
 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
 	}
 
 	data->m = m0;
 	data->ni = ni;
+	/* management frames are not taken into account for rssadapt */
+	data->rix = IEEE80211_FIXED_RATE_NONE;
 
 	wh = mtod(m0, struct ieee80211_frame *);
 
@@ -1608,8 +1622,8 @@
 
 		rs = &ni->ni_rates;
 		rn = (struct rt2661_node *)ni;
-		ni->ni_txrate = ral_rssadapt_choose(&rn->rssadapt, rs,
-		    wh, m0->m_pkthdr.len, NULL, 0);
+		ni->ni_txrate = ieee80211_rssadapt_choose(&rn->rssadapt, rs,
+		    m0->m_pkthdr.len);
 		rate = rs->rs_rates[ni->ni_txrate];
 	}
 	rate &= IEEE80211_RATE_VAL;
@@ -1672,7 +1686,7 @@
 		data->ni = ni;
 
 		/* RTS frames are not taken into account for rssadapt */
-		data->id.id_node = NULL;
+		data->rix = IEEE80211_FIXED_RATE_NONE;
 
 		rt2661_setup_tx_desc(sc, desc, RT2661_TX_NEED_ACK |
 		    RT2661_TX_MORE_FRAG, 0, m->m_pkthdr.len, rtsrate, segs,
@@ -1742,13 +1756,11 @@
 
 	/* remember link conditions for rate adaptation algorithm */
 	if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) {
-		data->id.id_len = m0->m_pkthdr.len;
-		data->id.id_rateidx = ni->ni_txrate;
-		data->id.id_node = ni;
-		/* XXX probably want last value, not avg */
-		data->id.id_rssi = ic->ic_node_getrssi(ni);
+		data->rix = ni->ni_txrate;
+		/* XXX probably need last rssi value and not avg */
+		data->rssi = ic->ic_node_getrssi(ni);
 	} else
-		data->id.id_node = NULL;
+		data->rix = IEEE80211_FIXED_RATE_NONE;
 
 	if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
 		flags |= RT2661_TX_NEED_ACK;
@@ -2166,8 +2178,7 @@
 	u_int i, chan;
 
 	chan = ieee80211_chan2ieee(ic, c);
-	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
-		return;
+	KASSERT(chan != 0 && chan != IEEE80211_CHAN_ANY, ("chan 0x%x", chan));
 
 	/* select the appropriate RF settings based on what EEPROM says */
 	rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2;
@@ -2956,6 +2967,11 @@
 
 	RAL_LOCK(sc);
 	rt2661_set_chan(sc, ic->ic_curchan);
+
+	sc->sc_txtap.wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
+	sc->sc_txtap.wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
+	sc->sc_rxtap.wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
+	sc->sc_rxtap.wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
 	RAL_UNLOCK(sc);
 
 }

==== //depot/projects/vap/sys/dev/ral/rt2661var.h#6 (text) ====

@@ -51,7 +51,8 @@
 	bus_dmamap_t		map;
 	struct mbuf		*m;
 	struct ieee80211_node	*ni;
-	struct ral_rssdesc	id;
+	uint8_t			rix;
+	int8_t			rssi;
 };
 
 struct rt2661_tx_ring {
@@ -87,11 +88,14 @@
 
 struct rt2661_node {
 	struct ieee80211_node	ni;
-	struct ral_rssadapt	rssadapt;
+	struct ieee80211_rssadapt_node rssadapt;
 };
+#define	RT2661_NODE(ni)		((struct rt2661_node *)(ni))
 
 struct rt2661_vap {
 	struct ieee80211vap	ral_vap;
+	struct ieee80211_rssadapt rssadapt;
+	struct callout		rssadapt_ch;
 
 	int			(*ral_newstate)(struct ieee80211vap *,
 				    enum ieee80211_state, int);
@@ -108,7 +112,6 @@
 	struct mtx			sc_mtx;
 
 	struct callout			watchdog_ch;
-	struct callout			rssadapt_ch;
 
 	int				sc_tx_timer;
 	int                             sc_invalid;

==== //depot/projects/vap/sys/modules/ral/Makefile#5 (text+ko) ====

@@ -2,8 +2,8 @@
 
 .PATH: ${.CURDIR}/../../dev/ral
 
-KMOD    = if_ral
-SRCS    = rt2560.c rt2661.c if_ralrate.c if_ral_pci.c \
-          device_if.h bus_if.h pci_if.h
+KMOD=	if_ral
+SRCS=	rt2560.c rt2661.c if_ral_pci.c
+SRCS+=	device_if.h bus_if.h pci_if.h
 
 .include <bsd.kmod.mk>



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