diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 31 | 
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index d59dd01d6cd..4d571394c7a 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -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) @@ -1776,10 +1766,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) @@ -1794,6 +1796,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)  |