diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 18 | 
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 2c9da6b2ecb..36618e3a5e6 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -568,7 +568,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  		if (!an->sleeping) {  			ath_tx_queue_tid(txq, tid); -			if (ts->ts_status & ATH9K_TXERR_FILT) +			if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY))  				tid->ac->clear_ps_filter = true;  		}  	} @@ -1773,11 +1773,12 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,  	TX_STAT_INC(txq->axq_qnum, queued);  } -static void setup_frame_info(struct ieee80211_hw *hw, struct sk_buff *skb, +static void setup_frame_info(struct ieee80211_hw *hw, +			     struct ieee80211_sta *sta, +			     struct sk_buff *skb,  			     int framelen)  {  	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(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; @@ -1819,10 +1820,14 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)  {  	struct ath_hw *ah = sc->sc_ah;  	struct ath9k_channel *curchan = ah->curchan; +  	if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) &&  	    (curchan->channelFlags & CHANNEL_5GHZ) &&  	    (chainmask == 0x7) && (rate < 0x90))  		return 0x3; +	else if (AR_SREV_9462(ah) && ath9k_hw_btcoex_is_enabled(ah) && +		 IS_CCK_RATE(rate)) +		return 0x2;  	else  		return chainmask;  } @@ -1935,7 +1940,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,  {  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;  	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); -	struct ieee80211_sta *sta = info->control.sta; +	struct ieee80211_sta *sta = txctl->sta;  	struct ieee80211_vif *vif = info->control.vif;  	struct ath_softc *sc = hw->priv;  	struct ath_txq *txq = txctl->txq; @@ -1979,7 +1984,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,  	    !ieee80211_is_data(hdr->frame_control))  		info->flags |= IEEE80211_TX_CTL_CLEAR_PS_FILT; -	setup_frame_info(hw, skb, frmlen); +	setup_frame_info(hw, sta, skb, frmlen);  	/*  	 * At this point, the vif, hw_key and sta pointers in the tx control @@ -2018,6 +2023,9 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,  	ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); +	if (sc->sc_ah->caldata) +		sc->sc_ah->caldata->paprd_packet_sent = true; +  	if (!(tx_flags & ATH_TX_ERROR))  		/* Frame was ACKed */  		tx_info->flags |= IEEE80211_TX_STAT_ACK;  |