Shuffle around the RTS/CTS rate/duration logic.

* Turn ath_tx_calc_ctsduration() into a function that
  returns the ctsduration, or -1 for HT rates;
* add a printf() to ath_tx_calc_ctsduration() which will be
  very loud if somehow that function is called with an MCS
  rate;
* Add ath_tx_get_rtscts_rate() which returns the RTS/CTS
  rate to use for the given data rate, incl. the short
  preamble flag;
* Only call ath_tx_calc_ctsduration() for non-11n chipsets;
  11n chipsets don't require the rtscts duration to be
  calculated.
This commit is contained in:
Adrian Chadd 2011-02-22 00:37:53 +00:00
parent 146b49d8cb
commit e42b5dba51
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218932

View File

@ -420,11 +420,12 @@ ath_tx_tag_crypto(struct ath_softc *sc, struct ieee80211_node *ni,
return 1;
}
static void
ath_tx_calc_ctsduration(struct ath_hal *ah, int rix, int cix,
int shortPreamble, int pktlen, const HAL_RATE_TABLE *rt,
int flags, u_int8_t *ctsrate, int *ctsduration)
static uint8_t
ath_tx_get_rtscts_rate(struct ath_hal *ah, const HAL_RATE_TABLE *rt,
int rix, int cix, int shortPreamble)
{
uint8_t ctsrate;
/*
* CTS transmit rate is derived from the transmit rate
* by looking in the h/w rate table. We must also factor
@ -432,7 +433,33 @@ ath_tx_calc_ctsduration(struct ath_hal *ah, int rix, int cix,
*/
/* NB: cix is set above where RTS/CTS is enabled */
KASSERT(cix != 0xff, ("cix not setup"));
(*ctsrate) = rt->info[cix].rateCode;
ctsrate = rt->info[cix].rateCode;
/* XXX this should only matter for legacy rates */
if (shortPreamble)
ctsrate |= rt->info[cix].shortPreamble;
return ctsrate;
}
/*
* Calculate the RTS/CTS duration for legacy frames.
*/
static int
ath_tx_calc_ctsduration(struct ath_hal *ah, int rix, int cix,
int shortPreamble, int pktlen, const HAL_RATE_TABLE *rt,
int flags)
{
int ctsduration = 0;
/* This mustn't be called for HT modes */
if (rt->info[cix].phy == IEEE80211_T_HT) {
printf("%s: HT rate where it shouldn't be (0x%x)\n",
__func__, rt->info[cix].rateCode);
return -1;
}
/*
* Compute the transmit duration based on the frame
* size and the size of an ACK frame. We call into the
@ -443,21 +470,22 @@ ath_tx_calc_ctsduration(struct ath_hal *ah, int rix, int cix,
* use the precalculated ACK durations.
*/
if (shortPreamble) {
(*ctsrate) |= rt->info[cix].shortPreamble;
if (flags & HAL_TXDESC_RTSENA) /* SIFS + CTS */
(*ctsduration) += rt->info[cix].spAckDuration;
(*ctsduration) += ath_hal_computetxtime(ah,
ctsduration += rt->info[cix].spAckDuration;
ctsduration += ath_hal_computetxtime(ah,
rt, pktlen, rix, AH_TRUE);
if ((flags & HAL_TXDESC_NOACK) == 0) /* SIFS + ACK */
(*ctsduration) += rt->info[rix].spAckDuration;
ctsduration += rt->info[rix].spAckDuration;
} else {
if (flags & HAL_TXDESC_RTSENA) /* SIFS + CTS */
(*ctsduration) += rt->info[cix].lpAckDuration;
(*ctsduration) += ath_hal_computetxtime(ah,
ctsduration += rt->info[cix].lpAckDuration;
ctsduration += ath_hal_computetxtime(ah,
rt, pktlen, rix, AH_FALSE);
if ((flags & HAL_TXDESC_NOACK) == 0) /* SIFS + ACK */
(*ctsduration) += rt->info[rix].lpAckDuration;
ctsduration += rt->info[rix].lpAckDuration;
}
return ctsduration;
}
int
@ -714,8 +742,12 @@ ath_tx_start(struct ath_softc *sc, struct ieee80211_node *ni, struct ath_buf *bf
*/
ctsduration = 0;
if (flags & (HAL_TXDESC_RTSENA|HAL_TXDESC_CTSENA)) {
(void) ath_tx_calc_ctsduration(ah, rix, cix, shortPreamble, pktlen,
rt, flags, &ctsrate, &ctsduration);
ctsrate = ath_tx_get_rtscts_rate(ah, rt, rix, cix, shortPreamble);
/* The 11n chipsets do ctsduration calculations for you */
if (! ath_tx_is_11n(sc))
ctsduration = ath_tx_calc_ctsduration(ah, rix, cix, shortPreamble,
pktlen, rt, flags);
/*
* Must disable multi-rate retry when using RTS/CTS.
*/
@ -893,9 +925,12 @@ ath_tx_raw_start(struct ath_softc *sc, struct ieee80211_node *ni,
ctsduration = 0;
if (flags & (HAL_TXDESC_RTSENA|HAL_TXDESC_CTSENA)) {
cix = ath_tx_findrix(sc, params->ibp_ctsrate);
(void) ath_tx_calc_ctsduration(ah, rix, cix,
params->ibp_flags & IEEE80211_BPF_SHORTPRE, pktlen,
rt, flags, &ctsrate, &ctsduration);
ctsrate = ath_tx_get_rtscts_rate(ah, rt, rix, cix, params->ibp_flags & IEEE80211_BPF_SHORTPRE);
/* The 11n chipsets do ctsduration calculations for you */
if (! ath_tx_is_11n(sc))
ctsduration = ath_tx_calc_ctsduration(ah, rix, cix,
params->ibp_flags & IEEE80211_BPF_SHORTPRE, pktlen,
rt, flags);
/*
* Must disable multi-rate retry when using RTS/CTS.
*/