Date: Tue, 16 Aug 2011 14:25:41 +0000 (UTC) From: Adrian Chadd <adrian@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r224912 - in user/adrian/if_ath_tx/sys/dev/ath: . ath_rate/amrr ath_rate/onoe ath_rate/sample Message-ID: <201108161425.p7GEPfGY061356@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: adrian Date: Tue Aug 16 14:25:41 2011 New Revision: 224912 URL: http://svn.freebsd.org/changeset/base/224912 Log: Begin to modify the ath rate path to use the stuff hiding in ath_buf now, rather than passing around all these extra fields. The (eventual) aim is to fully setup ath_buf.bf_state.bfs_rc with the legacy rate code information, then populate the rate series stuff as needed. Then legacy chips can use the bfs_rc rates, and 11n chipsets can use the rate series (which will also be set for legacy rates.) TODO: making sure the short preamble flag is set correctly everywhere. This commit doesn't fully fix onoe/amrr to use the new API, I must do that before I merge this into -HEAD. Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_rate/amrr/amrr.c user/adrian/if_ath_tx/sys/dev/ath/ath_rate/onoe/onoe.c user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.c user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.h user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_rate/amrr/amrr.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/ath_rate/amrr/amrr.c Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/ath_rate/amrr/amrr.c Tue Aug 16 14:25:41 2011 (r224912) @@ -126,7 +126,7 @@ ath_rate_getxtxrates(struct ath_softc *s { struct amrr_node *amn = ATH_NODE_AMRR(an); -/* rix[0] = amn->amn_tx_rate0; */ + rix[0] = amn->amn_tx_rate0; rix[1] = amn->amn_tx_rate1; rix[2] = amn->amn_tx_rate2; rix[3] = amn->amn_tx_rate3; Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_rate/onoe/onoe.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/ath_rate/onoe/onoe.c Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/ath_rate/onoe/onoe.c Tue Aug 16 14:25:41 2011 (r224912) @@ -134,7 +134,7 @@ ath_rate_getxtxrates(struct ath_softc *s { struct onoe_node *on = ATH_NODE_ONOE(an); -/* rix[0] = on->on_tx_rate0; */ + rix[0] = on->on_tx_rate0; rix[1] = on->on_tx_rate1; rix[2] = on->on_tx_rate2; rix[3] = on->on_tx_rate3; Modified: user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/ath_rate/sample/sample.c Tue Aug 16 14:25:41 2011 (r224912) @@ -446,22 +446,24 @@ done: */ void ath_rate_getxtxrates(struct ath_softc *sc, struct ath_node *an, - uint8_t rix0, uint8_t *rix, uint8_t *try) + uint8_t rix0, struct ath_rc_series *rc) { struct sample_node *sn = ATH_NODE_SAMPLE(an); const struct txschedule *sched = &sn->sched[rix0]; KASSERT(rix0 == sched->r0, ("rix0 (%x) != sched->r0 (%x)!\n", rix0, sched->r0)); -/* rix[0] = sched->r0; */ - rix[1] = sched->r1; - rix[2] = sched->r2; - rix[3] = sched->r3; - - try[0] = sched->t0; - try[1] = sched->t1; - try[2] = sched->t2; - try[3] = sched->t3; + rc[0].flags = rc[1].flags = rc[2].flags = rc[3].flags = 0; + + rc[0].rix = sched->r0; + rc[1].rix = sched->r1; + rc[2].rix = sched->r2; + rc[3].rix = sched->r3; + + rc[0].tries = sched->t0; + rc[1].tries = sched->t1; + rc[2].tries = sched->t2; + rc[3].tries = sched->t3; } void Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx.c Tue Aug 16 14:25:41 2011 (r224912) @@ -654,10 +654,6 @@ ath_tx_normal_setup(struct ath_softc *sc HAL_BOOL shortPreamble; struct ath_node *an; u_int pri; - uint8_t try[4], rate[4]; - - bzero(try, sizeof(try)); - bzero(rate, sizeof(rate)); wh = mtod(m0, struct ieee80211_frame *); iswep = wh->i_fc[1] & IEEE80211_FC1_WEP; @@ -972,9 +968,16 @@ ath_tx_normal_setup(struct ath_softc *sc ieee80211_radiotap_tx(vap, m0); } + /* Blank the legacy rate array */ + bzero(&bf->bf_state.bfs_rc, sizeof(bf->bf_state.bfs_rc)); + + /* + * ath_buf_set_rate needs at least one rate/try to setup + * the rate scenario. + */ if (ath_tx_is_11n(sc)) { - rate[0] = rix; - try[0] = try0; + bf->bf_state.bfs_rc[0].rix = rix; + bf->bf_state.bfs_rc[0].tries = try0; } /* Store the decided rate index values away */ @@ -988,6 +991,7 @@ ath_tx_normal_setup(struct ath_softc *sc bf->bf_state.bfs_txantenna = sc->sc_txantenna; bf->bf_state.bfs_flags = flags; bf->bf_txflags = flags; + bf->bf_state.bfs_shpream = shortPreamble; /* XXX this should be done in ath_tx_setrate() */ bf->bf_state.bfs_ctsrate = ctsrate; @@ -1009,17 +1013,15 @@ ath_tx_normal_setup(struct ath_softc *sc if (ismrr) { ATH_NODE_LOCK(an); if (ath_tx_is_11n(sc)) - ath_rate_getxtxrates(sc, an, rix, rate, try); + ath_rate_getxtxrates(sc, an, rix, bf->bf_state.bfs_rc); else ath_rate_setupxtxdesc(sc, an, ds, shortPreamble, rix); ATH_NODE_UNLOCK(an); } /* Setup 11n rate scenario for 11n NICs only */ - if (ath_tx_is_11n(sc)) { - ath_buf_set_rate(sc, ni, bf, pktlen, flags, ctsrate, - (atype == HAL_PKT_TYPE_PSPOLL), rate, try); - } + if (ath_tx_is_11n(sc)) + ath_buf_set_rate(sc, ni, bf); return 0; } @@ -1198,13 +1200,9 @@ ath_tx_raw_start(struct ath_softc *sc, s const HAL_RATE_TABLE *rt; struct ath_desc *ds; u_int pri; - uint8_t try[4], rate[4]; int o_tid = -1; int do_override; - bzero(try, sizeof(try)); - bzero(rate, sizeof(rate)); - wh = mtod(m0, struct ieee80211_frame *); ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); hdrlen = ieee80211_anyhdrsize(wh); @@ -1319,6 +1317,8 @@ ath_tx_raw_start(struct ath_softc *sc, s bf->bf_state.bfs_txantenna = txantenna; bf->bf_state.bfs_flags = flags; bf->bf_txflags = flags; + bf->bf_state.bfs_shpream = + !! (params->ibp_flags & IEEE80211_BPF_SHORTPRE); /* XXX this should be done in ath_tx_setrate() */ bf->bf_state.bfs_ctsrate = ctsrate; @@ -1327,21 +1327,32 @@ ath_tx_raw_start(struct ath_softc *sc, s ath_tx_setds(sc, bf); + /* Blank the legacy rate array */ + bzero(&bf->bf_state.bfs_rc, sizeof(bf->bf_state.bfs_rc)); + if (ath_tx_is_11n(sc)) { - rate[0] = ath_tx_findrix(sc, params->ibp_rate0); - try[0] = params->ibp_try0; + bf->bf_state.bfs_rc[0].rix = ath_tx_findrix(sc, params->ibp_rate0); + bf->bf_state.bfs_rc[0].tries = params->ibp_try0; if (ismrr) { /* Remember, rate[] is actually an array of rix's -adrian */ - rate[0] = ath_tx_findrix(sc, params->ibp_rate0); - rate[1] = ath_tx_findrix(sc, params->ibp_rate1); - rate[2] = ath_tx_findrix(sc, params->ibp_rate2); - rate[3] = ath_tx_findrix(sc, params->ibp_rate3); - - try[0] = params->ibp_try0; - try[1] = params->ibp_try1; - try[2] = params->ibp_try2; - try[3] = params->ibp_try3; + bf->bf_state.bfs_rc[0].rix = + ath_tx_findrix(sc, params->ibp_rate0); + bf->bf_state.bfs_rc[1].rix = + ath_tx_findrix(sc, params->ibp_rate1); + bf->bf_state.bfs_rc[2].rix = + ath_tx_findrix(sc, params->ibp_rate2); + bf->bf_state.bfs_rc[3].rix = + ath_tx_findrix(sc, params->ibp_rate3); + + bf->bf_state.bfs_rc[0].tries = + params->ibp_try0; + bf->bf_state.bfs_rc[1].tries = + params->ibp_try1; + bf->bf_state.bfs_rc[2].tries = + params->ibp_try2; + bf->bf_state.bfs_rc[3].tries = + params->ibp_try3; } } else { if (ismrr) { @@ -1376,8 +1387,7 @@ ath_tx_raw_start(struct ath_softc *sc, s * notice that rix doesn't include any of the "magic" flags txrate * does for communicating "other stuff" to the HAL. */ - ath_buf_set_rate(sc, ni, bf, pktlen, flags, ctsrate, - (atype == HAL_PKT_TYPE_PSPOLL), rate, try); + ath_buf_set_rate(sc, ni, bf); } /* NB: no buffered multicast in power save support */ Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.c ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.c Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.c Tue Aug 16 14:25:41 2011 (r224912) @@ -122,8 +122,7 @@ int ath_max_4ms_framelen[4][32] = { */ static void ath_rateseries_setup(struct ath_softc *sc, struct ieee80211_node *ni, - HAL_11N_RATE_SERIES *series, unsigned int pktlen, uint8_t *rix, - uint8_t *try, int flags) + struct ath_buf *bf, HAL_11N_RATE_SERIES *series) { #define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1) struct ieee80211com *ic = ni->ni_ic; @@ -131,6 +130,9 @@ ath_rateseries_setup(struct ath_softc *s HAL_BOOL shortPreamble = AH_FALSE; const HAL_RATE_TABLE *rt = sc->sc_currates; int i; + int pktlen = bf->bf_state.bfs_pktlen; + int flags = bf->bf_state.bfs_flags; + struct ath_rc_series *rc = bf->bf_state.bfs_rc; if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE)) @@ -139,10 +141,10 @@ ath_rateseries_setup(struct ath_softc *s memset(series, 0, sizeof(HAL_11N_RATE_SERIES) * 4); for (i = 0; i < 4; i++) { /* Only set flags for actual TX attempts */ - if (try[i] == 0) + if (rc[i].tries == 0) continue; - series[i].Tries = try[i]; + series[i].Tries = rc[i].tries; /* * XXX this isn't strictly correct - sc_txchainmask @@ -181,7 +183,7 @@ ath_rateseries_setup(struct ath_softc *s ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) series[i].RateFlags |= HAL_RATESERIES_HALFGI; - series[i].Rate = rt->info[rix[i]].rateCode; + series[i].Rate = rt->info[rc[i].rix].rateCode; /* PktDuration doesn't include slot, ACK, RTS, etc timing - it's just the packet duration */ if (series[i].Rate & IEEE80211_RATE_MCS) { @@ -193,9 +195,10 @@ ath_rateseries_setup(struct ath_softc *s , series[i].RateFlags & HAL_RATESERIES_HALFGI); } else { if (shortPreamble) - series[i].Rate |= rt->info[rix[i]].shortPreamble; + series[i].Rate |= + rt->info[rc[i].rix].shortPreamble; series[i].PktDuration = ath_hal_computetxtime(ah, - rt, pktlen, rix[i], shortPreamble); + rt, pktlen, rc[i].rix, shortPreamble); } } #undef HT_RC_2_STREAMS @@ -227,18 +230,21 @@ ath_rateseries_print(HAL_11N_RATE_SERIES */ void -ath_buf_set_rate(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_buf *bf, - int pktlen, int flags, uint8_t ctsrate, int is_pspoll, uint8_t *rix, uint8_t *try) +ath_buf_set_rate(struct ath_softc *sc, struct ieee80211_node *ni, + struct ath_buf *bf) { HAL_11N_RATE_SERIES series[4]; struct ath_desc *ds = bf->bf_desc; struct ath_desc *lastds = NULL; struct ath_hal *ah = sc->sc_ah; + int is_pspoll = (bf->bf_state.bfs_atype == HAL_PKT_TYPE_PSPOLL); + int ctsrate = bf->bf_state.bfs_ctsrate; + int flags = bf->bf_state.bfs_flags; /* Setup rate scenario */ memset(&series, 0, sizeof(series)); - ath_rateseries_setup(sc, ni, series, pktlen, rix, try, flags); + ath_rateseries_setup(sc, ni, bf, series); /* Enforce AR5416 aggregate limit - can't do RTS w/ an agg frame > 8k */ Modified: user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.h ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.h Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/if_ath_tx_ht.h Tue Aug 16 14:25:41 2011 (r224912) @@ -41,8 +41,6 @@ enum { extern int ath_max_4ms_framelen[4][32]; extern void ath_buf_set_rate(struct ath_softc *sc, - struct ieee80211_node *ni, struct ath_buf *bf, - int pktlen, int flags, uint8_t ctsrate, int is_pspoll, - uint8_t *rix, uint8_t *try); + struct ieee80211_node *ni, struct ath_buf *bf); #endif Modified: user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/if_athrate.h Tue Aug 16 14:25:41 2011 (r224912) @@ -77,6 +77,8 @@ struct ath_ratectrl { struct ath_ratectrl *ath_rate_attach(struct ath_softc *); void ath_rate_detach(struct ath_ratectrl *); +#define ATH_RC_NUM 4 + struct ath_rc_series { uint8_t rix; uint8_t tries; @@ -111,7 +113,7 @@ void ath_rate_newassoc(struct ath_softc * Return the four TX rate index and try counts for the current data packet. */ void ath_rate_getxtxrates(struct ath_softc *sc, struct ath_node *an, - uint8_t rix0, uint8_t *rix, uint8_t *try); + uint8_t rix0, struct ath_rc_series *rc); /* * Return the transmit info for a data packet. If multi-rate state Modified: user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h ============================================================================== --- user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h Tue Aug 16 14:23:16 2011 (r224911) +++ user/adrian/if_ath_tx/sys/dev/ath/if_athvar.h Tue Aug 16 14:25:41 2011 (r224912) @@ -227,10 +227,10 @@ struct ath_buf { int bfs_txpower; /* tx power */ int bfs_txantenna; /* TX antenna config */ enum ieee80211_protmode bfs_protmode; - HAL_11N_RATE_SERIES bfs_rc11n[4]; /* 11n TX series */ + HAL_11N_RATE_SERIES bfs_rc11n[ATH_RC_NUM]; /* 11n TX series */ int bfs_ctsrate; /* CTS rate */ int bfs_ctsduration; /* CTS duration (pre-11n NICs) */ - struct ath_rc_series bfs_rc[4]; /* non-11n TX series */ + struct ath_rc_series bfs_rc[ATH_RC_NUM]; /* non-11n TX series */ } bf_state; }; typedef STAILQ_HEAD(, ath_buf) ath_bufhead;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201108161425.p7GEPfGY061356>