aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/mlme.c14
-rw-r--r--net/mac80211/status.c2
2 files changed, 13 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 7b3f9df725bd..abb011660803 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -738,9 +738,19 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
738 return; 738 return;
739 739
740 if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) && 740 if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
741 (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) 741 (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) {
742 netif_tx_stop_all_queues(sdata->dev);
743 /*
744 * Flush all the frames queued in the driver before
745 * going to power save
746 */
747 drv_flush(local, false);
742 ieee80211_send_nullfunc(local, sdata, 1); 748 ieee80211_send_nullfunc(local, sdata, 1);
743 749
750 /* Flush once again to get the tx status of nullfunc frame */
751 drv_flush(local, false);
752 }
753
744 if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) && 754 if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
745 (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) || 755 (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) ||
746 (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) { 756 (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
@@ -748,6 +758,8 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
748 local->hw.conf.flags |= IEEE80211_CONF_PS; 758 local->hw.conf.flags |= IEEE80211_CONF_PS;
749 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); 759 ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
750 } 760 }
761
762 netif_tx_start_all_queues(sdata->dev);
751} 763}
752 764
753void ieee80211_dynamic_ps_timer(unsigned long data) 765void ieee80211_dynamic_ps_timer(unsigned long data)
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index 010a559bd872..865185127f51 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -318,8 +318,6 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
318 if (info->flags & IEEE80211_TX_STAT_ACK) { 318 if (info->flags & IEEE80211_TX_STAT_ACK) {
319 local->ps_sdata->u.mgd.flags |= 319 local->ps_sdata->u.mgd.flags |=
320 IEEE80211_STA_NULLFUNC_ACKED; 320 IEEE80211_STA_NULLFUNC_ACKED;
321 ieee80211_queue_work(&local->hw,
322 &local->dynamic_ps_enable_work);
323 } else 321 } else
324 mod_timer(&local->dynamic_ps_timer, jiffies + 322 mod_timer(&local->dynamic_ps_timer, jiffies +
325 msecs_to_jiffies(10)); 323 msecs_to_jiffies(10));