|
@@ -738,9 +738,19 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
|
|
return;
|
|
|
|
|
|
if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
|
|
|
- (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)))
|
|
|
+ (!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) {
|
|
|
+ netif_tx_stop_all_queues(sdata->dev);
|
|
|
+ /*
|
|
|
+ * Flush all the frames queued in the driver before
|
|
|
+ * going to power save
|
|
|
+ */
|
|
|
+ drv_flush(local, false);
|
|
|
ieee80211_send_nullfunc(local, sdata, 1);
|
|
|
|
|
|
+ /* Flush once again to get the tx status of nullfunc frame */
|
|
|
+ drv_flush(local, false);
|
|
|
+ }
|
|
|
+
|
|
|
if (!((local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) &&
|
|
|
(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) ||
|
|
|
(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
|
|
@@ -748,6 +758,8 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
|
|
local->hw.conf.flags |= IEEE80211_CONF_PS;
|
|
|
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
|
|
}
|
|
|
+
|
|
|
+ netif_tx_start_all_queues(sdata->dev);
|
|
|
}
|
|
|
|
|
|
void ieee80211_dynamic_ps_timer(unsigned long data)
|