diff options
author | Felix Fietkau <nbd@openwrt.org> | 2011-02-27 21:46:15 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2011-02-27 21:46:15 +0000 |
commit | 36cf66d06793c50079ddafa7e2c43e47ab1f3cbf (patch) | |
tree | d34236dcab4eb40127ea5cea56582e9e77ae9c26 /package/mac80211/patches/530-mac80211_drv_tim_override.patch | |
parent | 9175837d1145ac68684fffb2bd5d25edeabb7f73 (diff) | |
download | master-187ad058-36cf66d06793c50079ddafa7e2c43e47ab1f3cbf.tar.gz master-187ad058-36cf66d06793c50079ddafa7e2c43e47ab1f3cbf.tar.bz2 master-187ad058-36cf66d06793c50079ddafa7e2c43e47ab1f3cbf.zip |
mac80211: improve ath9k AP A-MPDU PS buffering
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@25779 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'package/mac80211/patches/530-mac80211_drv_tim_override.patch')
-rw-r--r-- | package/mac80211/patches/530-mac80211_drv_tim_override.patch | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/package/mac80211/patches/530-mac80211_drv_tim_override.patch b/package/mac80211/patches/530-mac80211_drv_tim_override.patch index 96e5ea3245..198f658a61 100644 --- a/package/mac80211/patches/530-mac80211_drv_tim_override.patch +++ b/package/mac80211/patches/530-mac80211_drv_tim_override.patch @@ -1,6 +1,6 @@ --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -2209,6 +2209,20 @@ static inline int ieee80211_sta_ps_trans +@@ -2209,6 +2209,18 @@ static inline int ieee80211_sta_ps_trans #define IEEE80211_TX_STATUS_HEADROOM 13 /** @@ -10,10 +10,8 @@ + * them back to mac80211 for retransmission, the station needs to be told + * to wake up using the TIM bitmap in the beacon. + * -+ * This function sets the station's TIM bit - it will be cleared automatically -+ * either when the station wakes up (and mac80211 has flushed out its -+ * buffered frames), or if all remaining buffered frames in mac80211 have -+ * timed out. ++ * This function sets the station's TIM bit - it will be cleared when the ++ * station wakes up. + */ +void ieee80211_sta_set_tim(struct ieee80211_sta *sta); + @@ -23,7 +21,25 @@ * Call this function for all transmitted frames after they have been --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c -@@ -991,3 +991,11 @@ void ieee80211_sta_block_awake(struct ie +@@ -608,7 +608,8 @@ static bool sta_info_cleanup_expire_buff + #endif + dev_kfree_skb(skb); + +- if (skb_queue_empty(&sta->ps_tx_buf)) ++ if (skb_queue_empty(&sta->ps_tx_buf) && ++ !test_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF)) + sta_info_clear_tim_bit(sta); + } + +@@ -899,6 +900,7 @@ void ieee80211_sta_ps_deliver_wakeup(str + struct ieee80211_local *local = sdata->local; + int sent, buffered; + ++ clear_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF); + if (!(local->hw.flags & IEEE80211_HW_AP_LINK_PS)) + drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); + +@@ -991,3 +993,12 @@ void ieee80211_sta_block_awake(struct ie ieee80211_queue_work(hw, &sta->drv_unblock_wk); } EXPORT_SYMBOL(ieee80211_sta_block_awake); @@ -32,6 +48,26 @@ +{ + struct sta_info *sta = container_of(pubsta, struct sta_info, sta); + ++ set_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF); + sta_info_set_tim_bit(sta); +} +EXPORT_SYMBOL(ieee80211_sta_set_tim); +--- a/net/mac80211/sta_info.h ++++ b/net/mac80211/sta_info.h +@@ -43,6 +43,8 @@ + * be in the queues + * @WLAN_STA_PSPOLL: Station sent PS-poll while driver was keeping + * station in power-save mode, reply when the driver unblocks. ++ * @WLAN_STA_PS_DRIVER_BUF: Station has frames pending in driver internal ++ * buffers. Automatically cleared on station wake-up. + */ + enum ieee80211_sta_info_flags { + WLAN_STA_AUTH = 1<<0, +@@ -58,6 +60,7 @@ enum ieee80211_sta_info_flags { + WLAN_STA_BLOCK_BA = 1<<11, + WLAN_STA_PS_DRIVER = 1<<12, + WLAN_STA_PSPOLL = 1<<13, ++ WLAN_STA_PS_DRIVER_BUF = 1<<14, + }; + + #define STA_TID_NUM 16 |