svn commit: r218240 - head/sys/dev/ath
Adrian Chadd
adrian at freebsd.org
Thu Feb 3 20:38:30 UTC 2011
Hi all,
This commit may have broken TX on if_ath.
I'd appreciate it if people tested things out and got back to me.
In particular, I'd like to make sure that the legacy rates TX with the
short and long preamble correctly.
Thanks,
Adrian
On 4 February 2011 04:30, Adrian Chadd <adrian at freebsd.org> wrote:
> Author: adrian
> Date: Thu Feb 3 20:30:17 2011
> New Revision: 218240
> URL: http://svn.freebsd.org/changeset/base/218240
>
> Log:
> Modify the TX path to set and use the 11n rate scenario bits.
>
> This isn't strictly required to TX (at least non-agg and non-HT40,
> non-short-GI) frames; but as it needs to be done anyway, just get
> it done.
>
> Linux ath9k uses the rate scenario style path for -all- packets,
> legacy or otherwise. This code does much the same.
>
> Beacon TX still uses the legacy, non-rate-scenario TX descriptor
> setup. Ath9k also does this.
>
> This 11n rate scenario path is only called for chips in the AR5416
> HAL; legacy chips use the previous interface for TX'ing.
>
> Modified:
> head/sys/dev/ath/if_ath_tx.c
>
> Modified: head/sys/dev/ath/if_ath_tx.c
> ==============================================================================
> --- head/sys/dev/ath/if_ath_tx.c Thu Feb 3 20:27:20 2011 (r218239)
> +++ head/sys/dev/ath/if_ath_tx.c Thu Feb 3 20:30:17 2011 (r218240)
> @@ -97,6 +97,7 @@ __FBSDID("$FreeBSD$");
>
> #include <dev/ath/if_ath_misc.h>
> #include <dev/ath/if_ath_tx.h>
> +#include <dev/ath/if_ath_tx_ht.h>
>
> /*
> * Whether to use the 11n rate scenario functions or not
> @@ -482,6 +483,10 @@ ath_tx_start(struct ath_softc *sc, struc
> 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;
> @@ -768,10 +773,17 @@ ath_tx_start(struct ath_softc *sc, struc
> txq->axq_intrcnt = 0;
> }
>
> + if (ath_tx_is_11n(sc)) {
> + rate[0] = rix;
> + try[0] = try0;
> + }
> +
> /*
> * Formulate first tx descriptor with tx controls.
> */
> /* XXX check return value? */
> + /* XXX is this ok to call for 11n descriptors? */
> + /* XXX or should it go through the first, next, last 11n calls? */
> ath_hal_setuptxdesc(ah, ds
> , pktlen /* packet length */
> , hdrlen /* header length */
> @@ -792,8 +804,16 @@ ath_tx_start(struct ath_softc *sc, struc
> * when the hardware supports multi-rate retry and
> * we don't use it.
> */
> - if (ismrr)
> - ath_rate_setupxtxdesc(sc, an, ds, shortPreamble, rix);
> + if (ismrr) {
> + if (ath_tx_is_11n(sc))
> + ath_rate_getxtxrates(sc, an, rix, rate, try);
> + else
> + ath_rate_setupxtxdesc(sc, an, ds, shortPreamble, rix);
> + }
> +
> + if (ath_tx_is_11n(sc)) {
> + ath_buf_set_rate(sc, ni, bf, pktlen, flags, ctsrate, rate, try);
> + }
>
> ath_tx_handoff(sc, txq, bf);
> return 0;
> @@ -817,6 +837,10 @@ 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];
> +
> + bzero(try, sizeof(try));
> + bzero(rate, sizeof(rate));
>
> wh = mtod(m0, struct ieee80211_frame *);
> ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
> @@ -925,30 +949,56 @@ ath_tx_raw_start(struct ath_softc *sc, s
> );
> bf->bf_txflags = flags;
>
> - if (ismrr) {
> - rix = ath_tx_findrix(sc, params->ibp_rate1);
> - rate1 = rt->info[rix].rateCode;
> - if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
> - rate1 |= rt->info[rix].shortPreamble;
> - if (params->ibp_try2) {
> - rix = ath_tx_findrix(sc, params->ibp_rate2);
> - rate2 = rt->info[rix].rateCode;
> - if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
> - rate2 |= rt->info[rix].shortPreamble;
> - } else
> - rate2 = 0;
> - if (params->ibp_try3) {
> - rix = ath_tx_findrix(sc, params->ibp_rate3);
> - rate3 = rt->info[rix].rateCode;
> + if (ath_tx_is_11n(sc)) {
> + rate[0] = ath_tx_findrix(sc, params->ibp_rate0);
> + try[0] = 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;
> + }
> + } else {
> + if (ismrr) {
> + rix = ath_tx_findrix(sc, params->ibp_rate1);
> + rate1 = rt->info[rix].rateCode;
> if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
> - rate3 |= rt->info[rix].shortPreamble;
> - } else
> - rate3 = 0;
> - ath_hal_setupxtxdesc(ah, ds
> - , rate1, params->ibp_try1 /* series 1 */
> - , rate2, params->ibp_try2 /* series 2 */
> - , rate3, params->ibp_try3 /* series 3 */
> - );
> + rate1 |= rt->info[rix].shortPreamble;
> + if (params->ibp_try2) {
> + rix = ath_tx_findrix(sc, params->ibp_rate2);
> + rate2 = rt->info[rix].rateCode;
> + if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
> + rate2 |= rt->info[rix].shortPreamble;
> + } else
> + rate2 = 0;
> + if (params->ibp_try3) {
> + rix = ath_tx_findrix(sc, params->ibp_rate3);
> + rate3 = rt->info[rix].rateCode;
> + if (params->ibp_flags & IEEE80211_BPF_SHORTPRE)
> + rate3 |= rt->info[rix].shortPreamble;
> + } else
> + rate3 = 0;
> + ath_hal_setupxtxdesc(ah, ds
> + , rate1, params->ibp_try1 /* series 1 */
> + , rate2, params->ibp_try2 /* series 2 */
> + , rate3, params->ibp_try3 /* series 3 */
> + );
> + }
> + }
> +
> + if (ath_tx_is_11n(sc)) {
> + /*
> + * 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, rate, try);
> }
>
> /* NB: no buffered multicast in power save support */
>
More information about the freebsd-mobile
mailing list