diff options
Diffstat (limited to 'package/mac80211/patches/520-mac80211_drv_tim_override.patch')
-rw-r--r-- | package/mac80211/patches/520-mac80211_drv_tim_override.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/package/mac80211/patches/520-mac80211_drv_tim_override.patch b/package/mac80211/patches/520-mac80211_drv_tim_override.patch new file mode 100644 index 000000000..535e35927 --- /dev/null +++ b/package/mac80211/patches/520-mac80211_drv_tim_override.patch @@ -0,0 +1,73 @@ +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -2216,6 +2216,18 @@ static inline int ieee80211_sta_ps_trans + #define IEEE80211_TX_STATUS_HEADROOM 13 + + /** ++ * ieee80211_sta_set_tim - set the TIM bit for a sleeping station ++ * ++ * If a driver buffers frames for a powersave station instead of passing ++ * 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 when the ++ * station wakes up. ++ */ ++void ieee80211_sta_set_tim(struct ieee80211_sta *sta); ++ ++/** + * ieee80211_tx_status - transmit status callback + * + * Call this function for all transmitted frames after they have been +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -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); ++ ++void ieee80211_sta_set_tim(struct ieee80211_sta *pubsta) ++{ ++ 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 |