|
@@ -938,6 +938,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|
|
struct ieee80211_tx_rate *rates;
|
|
|
const struct ieee80211_rate *rate;
|
|
|
struct ieee80211_hdr *hdr;
|
|
|
+ struct ath_frame_info *fi = get_frame_info(bf->bf_mpdu);
|
|
|
int i;
|
|
|
u8 rix = 0;
|
|
|
|
|
@@ -948,18 +949,7 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|
|
|
|
|
/* set dur_update_en for l-sig computation except for PS-Poll frames */
|
|
|
info->dur_update = !ieee80211_is_pspoll(hdr->frame_control);
|
|
|
-
|
|
|
- /*
|
|
|
- * We check if Short Preamble is needed for the CTS rate by
|
|
|
- * checking the BSS's global flag.
|
|
|
- * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
|
|
- */
|
|
|
- rate = ieee80211_get_rts_cts_rate(sc->hw, tx_info);
|
|
|
- info->rtscts_rate = rate->hw_value;
|
|
|
-
|
|
|
- if (tx_info->control.vif &&
|
|
|
- tx_info->control.vif->bss_conf.use_short_preamble)
|
|
|
- info->rtscts_rate |= rate->hw_value_short;
|
|
|
+ info->rtscts_rate = fi->rtscts_rate;
|
|
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
|
bool is_40, is_sgi, is_sp;
|
|
@@ -1001,13 +991,13 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
|
|
|
}
|
|
|
|
|
|
/* legacy rates */
|
|
|
+ rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
|
|
if ((tx_info->band == IEEE80211_BAND_2GHZ) &&
|
|
|
!(rate->flags & IEEE80211_RATE_ERP_G))
|
|
|
phy = WLAN_RC_PHY_CCK;
|
|
|
else
|
|
|
phy = WLAN_RC_PHY_OFDM;
|
|
|
|
|
|
- rate = &sc->sbands[tx_info->band].bitrates[rates[i].idx];
|
|
|
info->rates[i].Rate = rate->hw_value;
|
|
|
if (rate->hw_value_short) {
|
|
|
if (rates[i].flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
|
|
@@ -1788,10 +1778,22 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
|
struct ieee80211_sta *sta = tx_info->control.sta;
|
|
|
struct ieee80211_key_conf *hw_key = tx_info->control.hw_key;
|
|
|
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
|
+ const struct ieee80211_rate *rate;
|
|
|
struct ath_frame_info *fi = get_frame_info(skb);
|
|
|
struct ath_node *an = NULL;
|
|
|
enum ath9k_key_type keytype;
|
|
|
+ bool short_preamble = false;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * We check if Short Preamble is needed for the CTS rate by
|
|
|
+ * checking the BSS's global flag.
|
|
|
+ * But for the rate series, IEEE80211_TX_RC_USE_SHORT_PREAMBLE is used.
|
|
|
+ */
|
|
|
+ if (tx_info->control.vif &&
|
|
|
+ tx_info->control.vif->bss_conf.use_short_preamble)
|
|
|
+ short_preamble = true;
|
|
|
|
|
|
+ rate = ieee80211_get_rts_cts_rate(hw, tx_info);
|
|
|
keytype = ath9k_cmn_get_hw_crypto_keytype(skb);
|
|
|
|
|
|
if (sta)
|
|
@@ -1806,6 +1808,9 @@ static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb,
|
|
|
fi->keyix = ATH9K_TXKEYIX_INVALID;
|
|
|
fi->keytype = keytype;
|
|
|
fi->framelen = framelen;
|
|
|
+ fi->rtscts_rate = rate->hw_value;
|
|
|
+ if (short_preamble)
|
|
|
+ fi->rtscts_rate |= rate->hw_value_short;
|
|
|
}
|
|
|
|
|
|
u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
|