diff options
Diffstat (limited to 'net/mac80211/status.c')
-rw-r--r-- | net/mac80211/status.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 071ac95c4aa0..b936dd29e92b 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -98,6 +98,10 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
98 | * (b) always process RX events before TX status events if ordering | 98 | * (b) always process RX events before TX status events if ordering |
99 | * can be unknown, for example with different interrupt status | 99 | * can be unknown, for example with different interrupt status |
100 | * bits. | 100 | * bits. |
101 | * (c) if PS mode transitions are manual (i.e. the flag | ||
102 | * %IEEE80211_HW_AP_LINK_PS is set), always process PS state | ||
103 | * changes before calling TX status events if ordering can be | ||
104 | * unknown. | ||
101 | */ | 105 | */ |
102 | if (test_sta_flags(sta, WLAN_STA_PS_STA) && | 106 | if (test_sta_flags(sta, WLAN_STA_PS_STA) && |
103 | skb_queue_len(&sta->tx_filtered) < STA_MAX_TX_BUFFER) { | 107 | skb_queue_len(&sta->tx_filtered) < STA_MAX_TX_BUFFER) { |
@@ -314,8 +318,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
314 | if (info->flags & IEEE80211_TX_STAT_ACK) { | 318 | if (info->flags & IEEE80211_TX_STAT_ACK) { |
315 | local->ps_sdata->u.mgd.flags |= | 319 | local->ps_sdata->u.mgd.flags |= |
316 | IEEE80211_STA_NULLFUNC_ACKED; | 320 | IEEE80211_STA_NULLFUNC_ACKED; |
317 | ieee80211_queue_work(&local->hw, | ||
318 | &local->dynamic_ps_enable_work); | ||
319 | } else | 321 | } else |
320 | mod_timer(&local->dynamic_ps_timer, jiffies + | 322 | mod_timer(&local->dynamic_ps_timer, jiffies + |
321 | msecs_to_jiffies(10)); | 323 | msecs_to_jiffies(10)); |
@@ -339,6 +341,10 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
339 | cookie = local->hw_roc_cookie ^ 2; | 341 | cookie = local->hw_roc_cookie ^ 2; |
340 | local->hw_roc_skb_for_status = NULL; | 342 | local->hw_roc_skb_for_status = NULL; |
341 | } | 343 | } |
344 | |||
345 | if (cookie == local->hw_offchan_tx_cookie) | ||
346 | local->hw_offchan_tx_cookie = 0; | ||
347 | |||
342 | cfg80211_mgmt_tx_status( | 348 | cfg80211_mgmt_tx_status( |
343 | skb->dev, cookie, skb->data, skb->len, | 349 | skb->dev, cookie, skb->data, skb->len, |
344 | !!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC); | 350 | !!(info->flags & IEEE80211_TX_STAT_ACK), GFP_ATOMIC); |