summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/ath/ath9k/hw-ops.h
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-04-18 01:28:09 +0400
committerJohn W. Linville <linville@tuxdriver.com>2011-04-19 23:38:06 +0400
commit5519541d5a5f19893546883547e2f0f2e5934df7 (patch)
treeae581edfed4ce3382b22076cb03174756e004830 /drivers/net/wireless/ath/ath9k/hw-ops.h
parent8e22ad323fb5b7cefb572bd8730e3abef95cdf90 (diff)
downloadlinux-5519541d5a5f19893546883547e2f0f2e5934df7.tar.xz
ath9k: fix powersave frame filtering/buffering in AP mode
This patch fixes a long standing issue of pending packets in the queue being sent (and retransmitted many times) to sleeping stations. This was made worse by aggregation through driver-internal retransmitting of A-MDPU subframes. Previously the hardware tx filter was cleared unconditionally for every single packet - with this patch it uses the IEEE80211_TX_CTL_CLEAR_PS_FILT for unaggregated frames. A sta_notify driver op is added to stop aggregation for stations when they enter powersave mode. Subframes stay buffered inside the driver, to ensure that the BlockAck window keeps a sane state. Since the driver uses software aggregation, the clearing of the tx filter needs to be handled by the driver instead of mac80211 for aggregated frames. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/hw-ops.h')
-rw-r--r--drivers/net/wireless/ath/ath9k/hw-ops.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h
index 22ee888b0baf..9dd90a85ad63 100644
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
@@ -122,6 +122,11 @@ static inline void ath9k_hw_set11n_burstduration(struct ath_hw *ah, void *ds,
ath9k_hw_ops(ah)->set11n_burstduration(ah, ds, burstDuration);
}
+static inline void ath9k_hw_set_clrdmask(struct ath_hw *ah, void *ds, bool val)
+{
+ ath9k_hw_ops(ah)->set_clrdmask(ah, ds, val);
+}
+
/* Private hardware call ops */
/* PHY ops */