aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/mac.c
diff options
context:
space:
mode:
authorLuis R. Rodriguez <lrodriguez@atheros.com>2009-11-24 02:53:25 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-11-28 15:04:49 -0500
commite7824a50662f7f79b1a739f705b4d906c31cf221 (patch)
tree20f92622698f9f07524db55691e0322b298031db /drivers/net/wireless/ath/ath9k/mac.c
parent6b65b6ad016f048547127946d1afe4ba41c74296 (diff)
ath9k: fix processing of TX PS null data frames
When mac80211 was telling us to go into Powersave we listened and immediately turned RX off. This meant hardware would not see the ACKs from the AP we're associated with and hardware we'd end up retransmiting the null data frame in a loop helplessly. Fix this by keeping track of the transmitted nullfunc frames and only when we are sure the AP has sent back an ACK do we go ahead and shut RX off. Signed-off-by: Vasanthakumar Thiagarajan <vasanth@atheros.com> Signed-off-by: Vivek Natarajan <Vivek.Natarajan@atheros.com> Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/mac.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/mac.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
index 46466ffebcb0..09ed441eb6ba 100644
--- a/drivers/net/wireless/ath/ath9k/mac.c
+++ b/drivers/net/wireless/ath/ath9k/mac.c
@@ -231,6 +231,8 @@ int ath9k_hw_txprocdesc(struct ath_hw *ah, struct ath_desc *ds)
231 ds->ds_txstat.ts_status = 0; 231 ds->ds_txstat.ts_status = 0;
232 ds->ds_txstat.ts_flags = 0; 232 ds->ds_txstat.ts_flags = 0;
233 233
234 if (ads->ds_txstatus1 & AR_FrmXmitOK)
235 ds->ds_txstat.ts_status |= ATH9K_TX_ACKED;
234 if (ads->ds_txstatus1 & AR_ExcessiveRetries) 236 if (ads->ds_txstatus1 & AR_ExcessiveRetries)
235 ds->ds_txstat.ts_status |= ATH9K_TXERR_XRETRY; 237 ds->ds_txstat.ts_status |= ATH9K_TXERR_XRETRY;
236 if (ads->ds_txstatus1 & AR_Filtered) 238 if (ads->ds_txstatus1 & AR_Filtered)
@@ -926,6 +928,13 @@ void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds,
926} 928}
927EXPORT_SYMBOL(ath9k_hw_setuprxdesc); 929EXPORT_SYMBOL(ath9k_hw_setuprxdesc);
928 930
931/*
932 * This can stop or re-enables RX.
933 *
934 * If bool is set this will kill any frame which is currently being
935 * transferred between the MAC and baseband and also prevent any new
936 * frames from getting started.
937 */
929bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set) 938bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set)
930{ 939{
931 u32 reg; 940 u32 reg;