Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Oct 2008 18:22:44 +0000 (UTC)
From:      Sam Leffler <sam@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r184368 - in head/sys/dev/ath: . ath_rate/sample
Message-ID:  <200810271822.m9RIMiKh049025@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: sam
Date: Mon Oct 27 18:22:44 2008
New Revision: 184368
URL: http://svn.freebsd.org/changeset/base/184368

Log:
  o With the addition of HT rates the set of h/w codes has a much wider range
    making the use of sc_hwmap to do direct mapping impractical.  Switch to
    indexing by the rate index instead of the rate code and adjust associated
    state and logic appropriately.  This has several benefits including
    simplification of the led code.
  o fix radiotap capture of HT rates
  o fix conditional compilation of HT radiotap support to be based on the
    hal having 5416 support; not the ABI version as hal builds may or may
    not include 5416 support

Modified:
  head/sys/dev/ath/ath_rate/sample/sample.c
  head/sys/dev/ath/if_ath.c
  head/sys/dev/ath/if_athvar.h

Modified: head/sys/dev/ath/ath_rate/sample/sample.c
==============================================================================
--- head/sys/dev/ath/ath_rate/sample/sample.c	Mon Oct 27 18:08:12 2008	(r184367)
+++ head/sys/dev/ath/ath_rate/sample/sample.c	Mon Oct 27 18:22:44 2008	(r184368)
@@ -493,9 +493,11 @@ ath_rate_tx_complete(struct ath_softc *s
 	const struct ath_tx_status *ts = &bf->bf_status.ds_txstat;
 	const struct ath_desc *ds0 = &bf->bf_desc[0];
 	int final_rate, short_tries, long_tries, frame_size;
+	const HAL_RATE_TABLE *rt = sc->sc_currates;
 	int mrr;
 
-	final_rate = sc->sc_hwmap[ts->ts_rate &~ HAL_TXSTAT_ALTRATE].ieeerate;
+	final_rate = sc->sc_hwmap[
+	    rt->rateCodeToIndex[ts->ts_rate &~ HAL_TXSTAT_ALTRATE]].ieeerate;
 	short_tries = ts->ts_shortretry;
 	long_tries = ts->ts_longretry + 1;
 	frame_size = ds0->ds_ctl0 & 0x0fff; /* low-order 12 bits of ds_ctl0 */
@@ -557,19 +559,19 @@ ath_rate_tx_complete(struct ath_softc *s
 			hwrate3 = MS(ds0->ds_ctl3, AR5416_XmitRate3);
 		}
 
-		rate0 = sc->sc_hwmap[hwrate0].ieeerate;
+		rate0 = sc->sc_hwmap[rt->rateCodeToIndex[hwrate0]].ieeerate;
 		tries0 = MS(ds0->ds_ctl2, AR_XmitDataTries0);
 		ndx0 = rate_to_ndx(sn, rate0);
 
-		rate1 = sc->sc_hwmap[hwrate1].ieeerate;
+		rate1 = sc->sc_hwmap[rt->rateCodeToIndex[hwrate1]].ieeerate;
 		tries1 = MS(ds0->ds_ctl2, AR_XmitDataTries1);
 		ndx1 = rate_to_ndx(sn, rate1);
 
-		rate2 = sc->sc_hwmap[hwrate2].ieeerate;
+		rate2 = sc->sc_hwmap[rt->rateCodeToIndex[hwrate2]].ieeerate;
 		tries2 = MS(ds0->ds_ctl2, AR_XmitDataTries2);
 		ndx2 = rate_to_ndx(sn, rate2);
 
-		rate3 = sc->sc_hwmap[hwrate3].ieeerate;
+		rate3 = sc->sc_hwmap[rt->rateCodeToIndex[hwrate3]].ieeerate;
 		tries3 = MS(ds0->ds_ctl2, AR_XmitDataTries3);
 		ndx3 = rate_to_ndx(sn, rate3);
 

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c	Mon Oct 27 18:08:12 2008	(r184367)
+++ head/sys/dev/ath/if_ath.c	Mon Oct 27 18:22:44 2008	(r184368)
@@ -114,12 +114,6 @@ CTASSERT(ATH_BCBUF <= 8);
 	 ((((u_int8_t *)(p))[0]      ) | (((u_int8_t *)(p))[1] <<  8) |	\
 	  (((u_int8_t *)(p))[2] << 16) | (((u_int8_t *)(p))[3] << 24)))
 
-enum {
-	ATH_LED_TX,
-	ATH_LED_RX,
-	ATH_LED_POLL,
-};
-
 #define	CTRY_XR9	5001		/* Ubiquiti XR9 */
 
 static struct ieee80211vap *ath_vap_create(struct ieee80211com *,
@@ -3898,12 +3892,13 @@ static int
 ath_rx_tap(struct ifnet *ifp, struct mbuf *m,
 	const struct ath_rx_status *rs, u_int64_t tsf, int16_t nf)
 {
-#define	CHAN_HT		htole32(CHANNEL_HT20|CHANNEL_HT40PLUS|CHANNEL_HT40MINUS)
 #define	CHAN_HT20	htole32(IEEE80211_CHAN_HT20)
 #define	CHAN_HT40U	htole32(IEEE80211_CHAN_HT40U)
 #define	CHAN_HT40D	htole32(IEEE80211_CHAN_HT40D)
+#define	CHAN_HT		(CHAN_HT20|CHAN_HT40U|CHAN_HT40D)
 	struct ath_softc *sc = ifp->if_softc;
-	u_int8_t rix;
+	const HAL_RATE_TABLE *rt;
+	uint8_t rix;
 
 	/*
 	 * Discard anything shorter than an ack or cts.
@@ -3914,12 +3909,14 @@ ath_rx_tap(struct ifnet *ifp, struct mbu
 		sc->sc_stats.ast_rx_tooshort++;
 		return 0;
 	}
-	rix = rs->rs_rate;
+	rt = sc->sc_currates;
+	KASSERT(rt != NULL, ("no rate table, mode %u", sc->sc_curmode));
+	rix = rt->rateCodeToIndex[rs->rs_rate];
 	sc->sc_rx_th.wr_rate = sc->sc_hwmap[rix].ieeerate;
 	sc->sc_rx_th.wr_flags = sc->sc_hwmap[rix].rxflags;
-#if HAL_ABI_VERSION >= 0x07050400
+#ifdef AH_SUPPORT_AR5416
 	sc->sc_rx_th.wr_chan_flags &= ~CHAN_HT;
-	if (sc->sc_rx_th.wr_rate & 0x80) {		/* HT rate */
+	if (sc->sc_rx_th.wr_rate & IEEE80211_RATE_MCS) {	/* HT rate */
 		if ((rs->rs_flags & HAL_RX_2040) == 0)
 			sc->sc_rx_th.wr_chan_flags |= CHAN_HT20;
 		else if (sc->sc_curchan.channelFlags & CHANNEL_HT40PLUS)
@@ -3941,10 +3938,10 @@ ath_rx_tap(struct ifnet *ifp, struct mbu
 	bpf_mtap2(ifp->if_bpf, &sc->sc_rx_th, sc->sc_rx_th_len, m);
 
 	return 1;
+#undef CHAN_HT
 #undef CHAN_HT20
 #undef CHAN_HT40U
 #undef CHAN_HT40D
-#undef CHAN_HT
 }
 
 static void
@@ -4175,9 +4172,11 @@ rx_accept:
 		}
 
 		if (IFF_DUMPPKTS(sc, ATH_DEBUG_RECV)) {
+			const HAL_RATE_TABLE *rt = sc->sc_currates;
+			uint8_t rix = rt->rateCodeToIndex[rs->rs_rate];
+
 			ieee80211_dump_pkt(ic, mtod(m, caddr_t), len,
-				   sc->sc_hwmap[rs->rs_rate].ieeerate,
-				   rs->rs_rssi);
+			    sc->sc_hwmap[rix].ieeerate, rs->rs_rssi);
 		}
 
 		m_adj(m, -IEEE80211_CRC_LEN);
@@ -4235,10 +4234,11 @@ rx_accept:
 			 * periodic beacon frames to trigger the poll event.
 			 */
 			if (type == IEEE80211_FC0_TYPE_DATA) {
-				sc->sc_rxrate = rs->rs_rate;
-				ath_led_event(sc, ATH_LED_RX);
+				const HAL_RATE_TABLE *rt = sc->sc_currates;
+				ath_led_event(sc, 
+				    rt->rateCodeToIndex[rs->rs_rate]);
 			} else if (ticks - sc->sc_ledevent >= sc->sc_ledidle)
-				ath_led_event(sc, ATH_LED_POLL);
+				ath_led_event(sc, 0);
 		}
 rx_next:
 		STAILQ_INSERT_TAIL(&sc->sc_rxbuf, bf, bf_list);
@@ -4759,7 +4759,7 @@ ath_tx_start(struct ath_softc *sc, struc
 		} else {
 			ath_rate_findrate(sc, an, shortPreamble, pktlen,
 				&rix, &try0, &txrate);
-			sc->sc_txrate = txrate;		/* for LED blinking */
+			sc->sc_txrix = rix;		/* for LED blinking */
 			sc->sc_lastdatarix = rix;	/* for fast frames */
 			if (try0 != ATH_TXMAXTRY)
 				ismrr = 1;
@@ -4916,18 +4916,18 @@ ath_tx_start(struct ath_softc *sc, struc
 
 	if (IFF_DUMPPKTS(sc, ATH_DEBUG_XMIT))
 		ieee80211_dump_pkt(ic, mtod(m0, caddr_t), m0->m_len,
-			sc->sc_hwmap[txrate].ieeerate, -1);
+			sc->sc_hwmap[rix].ieeerate, -1);
 
 	if (bpf_peers_present(ifp->if_bpf)) {
 		u_int64_t tsf = ath_hal_gettsf64(ah);
 
 		sc->sc_tx_th.wt_tsf = htole64(tsf);
-		sc->sc_tx_th.wt_flags = sc->sc_hwmap[txrate].txflags;
+		sc->sc_tx_th.wt_flags = sc->sc_hwmap[rix].txflags;
 		if (iswep)
 			sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP;
 		if (isfrag)
 			sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_FRAG;
-		sc->sc_tx_th.wt_rate = sc->sc_hwmap[txrate].ieeerate;
+		sc->sc_tx_th.wt_rate = sc->sc_hwmap[rix].ieeerate;
 		sc->sc_tx_th.wt_txpower = ni->ni_txpower;
 		sc->sc_tx_th.wt_antenna = sc->sc_txantenna;
 
@@ -5143,7 +5143,7 @@ ath_tx_proc_q0(void *arg, int npending)
 	ifp->if_timer = 0;
 
 	if (sc->sc_softled)
-		ath_led_event(sc, ATH_LED_TX);
+		ath_led_event(sc, sc->sc_txrix);
 
 	ath_start(ifp);
 }
@@ -5180,7 +5180,7 @@ ath_tx_proc_q0123(void *arg, int npendin
 	ifp->if_timer = 0;
 
 	if (sc->sc_softled)
-		ath_led_event(sc, ATH_LED_TX);
+		ath_led_event(sc, sc->sc_txrix);
 
 	ath_start(ifp);
 }
@@ -5209,7 +5209,7 @@ ath_tx_proc(void *arg, int npending)
 	ifp->if_timer = 0;
 
 	if (sc->sc_softled)
-		ath_led_event(sc, ATH_LED_TX);
+		ath_led_event(sc, sc->sc_txrix);
 
 	ath_start(ifp);
 }
@@ -6121,26 +6121,12 @@ ath_led_blink(struct ath_softc *sc, int 
 }
 
 static void
-ath_led_event(struct ath_softc *sc, int event)
+ath_led_event(struct ath_softc *sc, int rix)
 {
-
 	sc->sc_ledevent = ticks;	/* time of last event */
 	if (sc->sc_blinking)		/* don't interrupt active blink */
 		return;
-	switch (event) {
-	case ATH_LED_POLL:
-		ath_led_blink(sc, sc->sc_hwmap[0].ledon,
-			sc->sc_hwmap[0].ledoff);
-		break;
-	case ATH_LED_TX:
-		ath_led_blink(sc, sc->sc_hwmap[sc->sc_txrate].ledon,
-			sc->sc_hwmap[sc->sc_txrate].ledoff);
-		break;
-	case ATH_LED_RX:
-		ath_led_blink(sc, sc->sc_hwmap[sc->sc_rxrate].ledon,
-			sc->sc_hwmap[sc->sc_rxrate].ledoff);
-		break;
-	}
+	ath_led_blink(sc, sc->sc_hwmap[rix].ledon, sc->sc_hwmap[rix].ledoff);
 }
 
 static int
@@ -6233,20 +6219,19 @@ ath_setcurmode(struct ath_softc *sc, enu
 			sc->sc_rixmap[ieeerate | IEEE80211_RATE_MCS] = i;
 	}
 	memset(sc->sc_hwmap, 0, sizeof(sc->sc_hwmap));
-	for (i = 0; i < 32; i++) {
-		u_int8_t ix = rt->rateCodeToIndex[i];
-		if (ix == 0xff) {
+	for (i = 0; i < N(sc->sc_hwmap); i++) {
+		if (i >= rt->rateCount) {
 			sc->sc_hwmap[i].ledon = (500 * hz) / 1000;
 			sc->sc_hwmap[i].ledoff = (130 * hz) / 1000;
 			continue;
 		}
 		sc->sc_hwmap[i].ieeerate =
-			rt->info[ix].dot11Rate & IEEE80211_RATE_VAL;
-		if (rt->info[ix].phy == IEEE80211_T_HT)
+			rt->info[i].dot11Rate & IEEE80211_RATE_VAL;
+		if (rt->info[i].phy == IEEE80211_T_HT)
 			sc->sc_hwmap[i].ieeerate |= IEEE80211_RATE_MCS;
 		sc->sc_hwmap[i].txflags = IEEE80211_RADIOTAP_F_DATAPAD;
-		if (rt->info[ix].shortPreamble ||
-		    rt->info[ix].phy == IEEE80211_T_OFDM)
+		if (rt->info[i].shortPreamble ||
+		    rt->info[i].phy == IEEE80211_T_OFDM)
 			sc->sc_hwmap[i].txflags |= IEEE80211_RADIOTAP_F_SHORTPRE;
 		/* NB: receive frames include FCS */
 		sc->sc_hwmap[i].rxflags = sc->sc_hwmap[i].txflags |
@@ -6443,7 +6428,9 @@ ath_ioctl(struct ifnet *ifp, u_long cmd,
 		sc->sc_stats.ast_tx_rssi = ATH_RSSI(sc->sc_halstats.ns_avgtxrssi);
 		sc->sc_stats.ast_rx_rssi = ATH_RSSI(sc->sc_halstats.ns_avgrssi);
 		rt = sc->sc_currates;
-		sc->sc_stats.ast_tx_rate = sc->sc_hwmap[sc->sc_txrate].ieeerate;
+		/* XXX HT rates */
+		sc->sc_stats.ast_tx_rate =
+		    rt->info[sc->sc_txrix].dot11Rate &~ IEEE80211_RATE_BASIC;
 		return copyout(&sc->sc_stats,
 		    ifr->ifr_data, sizeof (sc->sc_stats));
 #ifdef ATH_DIAGAPI
@@ -6894,7 +6881,7 @@ ath_tx_raw_start(struct ath_softc *sc, s
 	txrate = rt->info[rix].rateCode;
 	if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
 		txrate |= rt->info[rix].shortPreamble;
-	sc->sc_txrate = txrate;
+	sc->sc_txrix = rix;
 	try0 = params->ibp_try0;
 	ismrr = (params->ibp_try1 != 0);
 	txantenna = params->ibp_pri >> 2;
@@ -6932,16 +6919,16 @@ ath_tx_raw_start(struct ath_softc *sc, s
 
 	if (IFF_DUMPPKTS(sc, ATH_DEBUG_XMIT))
 		ieee80211_dump_pkt(ic, mtod(m0, caddr_t), m0->m_len,
-			sc->sc_hwmap[txrate].ieeerate, -1);
+			sc->sc_hwmap[rix].ieeerate, -1);
 	
 	if (bpf_peers_present(ifp->if_bpf)) {
 		u_int64_t tsf = ath_hal_gettsf64(ah);
 
 		sc->sc_tx_th.wt_tsf = htole64(tsf);
-		sc->sc_tx_th.wt_flags = sc->sc_hwmap[txrate].txflags;
+		sc->sc_tx_th.wt_flags = sc->sc_hwmap[rix].txflags;
 		if (wh->i_fc[1] & IEEE80211_FC1_WEP)
 			sc->sc_tx_th.wt_flags |= IEEE80211_RADIOTAP_F_WEP;
-		sc->sc_tx_th.wt_rate = sc->sc_hwmap[txrate].ieeerate;
+		sc->sc_tx_th.wt_rate = sc->sc_hwmap[rix].ieeerate;
 		sc->sc_tx_th.wt_txpower = ni->ni_txpower;
 		sc->sc_tx_th.wt_antenna = sc->sc_txantenna;
 

Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h	Mon Oct 27 18:08:12 2008	(r184367)
+++ head/sys/dev/ath/if_athvar.h	Mon Oct 27 18:22:44 2008	(r184368)
@@ -284,8 +284,7 @@ struct ath_softc {
 	u_int			sc_ledon;	/* pin setting for LED on */
 	u_int			sc_ledidle;	/* idle polling interval */
 	int			sc_ledevent;	/* time of last LED event */
-	u_int8_t		sc_rxrate;	/* current rx rate for LED */
-	u_int8_t		sc_txrate;	/* current tx rate for LED */
+	u_int8_t		sc_txrix;	/* current tx rate for LED */
 	u_int16_t		sc_ledoff;	/* off time for current blink */
 	struct callout		sc_ledtimer;	/* led off timer */
 



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