|
@@ -113,6 +113,10 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local)
|
|
|
* notify the AP about us leaving the channel and stop all
|
|
|
* STA interfaces.
|
|
|
*/
|
|
|
+
|
|
|
+ ieee80211_stop_queues_by_reason(&local->hw,
|
|
|
+ IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL);
|
|
|
+
|
|
|
mutex_lock(&local->iflist_mtx);
|
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
|
if (!ieee80211_sdata_running(sdata))
|
|
@@ -133,12 +137,9 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local)
|
|
|
sdata, BSS_CHANGED_BEACON_ENABLED);
|
|
|
}
|
|
|
|
|
|
- if (sdata->vif.type != NL80211_IFTYPE_MONITOR) {
|
|
|
- netif_tx_stop_all_queues(sdata->dev);
|
|
|
- if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
|
|
- sdata->u.mgd.associated)
|
|
|
- ieee80211_offchannel_ps_enable(sdata);
|
|
|
- }
|
|
|
+ if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
|
|
+ sdata->u.mgd.associated)
|
|
|
+ ieee80211_offchannel_ps_enable(sdata);
|
|
|
}
|
|
|
mutex_unlock(&local->iflist_mtx);
|
|
|
}
|
|
@@ -166,20 +167,6 @@ void ieee80211_offchannel_return(struct ieee80211_local *local)
|
|
|
sdata->u.mgd.associated)
|
|
|
ieee80211_offchannel_ps_disable(sdata);
|
|
|
|
|
|
- if (sdata->vif.type != NL80211_IFTYPE_MONITOR) {
|
|
|
- /*
|
|
|
- * This may wake up queues even though the driver
|
|
|
- * currently has them stopped. This is not very
|
|
|
- * likely, since the driver won't have gotten any
|
|
|
- * (or hardly any) new packets while we weren't
|
|
|
- * on the right channel, and even if it happens
|
|
|
- * it will at most lead to queueing up one more
|
|
|
- * packet per queue in mac80211 rather than on
|
|
|
- * the interface qdisc.
|
|
|
- */
|
|
|
- netif_tx_wake_all_queues(sdata->dev);
|
|
|
- }
|
|
|
-
|
|
|
if (test_and_clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED,
|
|
|
&sdata->state)) {
|
|
|
sdata->vif.bss_conf.enable_beacon = true;
|
|
@@ -188,6 +175,9 @@ void ieee80211_offchannel_return(struct ieee80211_local *local)
|
|
|
}
|
|
|
}
|
|
|
mutex_unlock(&local->iflist_mtx);
|
|
|
+
|
|
|
+ ieee80211_wake_queues_by_reason(&local->hw,
|
|
|
+ IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL);
|
|
|
}
|
|
|
|
|
|
void ieee80211_handle_roc_started(struct ieee80211_roc_work *roc)
|