diff options
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index dc76267e436e..3848140313f5 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -269,6 +269,7 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
269 | enum queue_stop_reason reason) | 269 | enum queue_stop_reason reason) |
270 | { | 270 | { |
271 | struct ieee80211_local *local = hw_to_local(hw); | 271 | struct ieee80211_local *local = hw_to_local(hw); |
272 | struct ieee80211_sub_if_data *sdata; | ||
272 | 273 | ||
273 | if (WARN_ON(queue >= hw->queues)) | 274 | if (WARN_ON(queue >= hw->queues)) |
274 | return; | 275 | return; |
@@ -281,6 +282,11 @@ static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue, | |||
281 | 282 | ||
282 | if (!skb_queue_empty(&local->pending[queue])) | 283 | if (!skb_queue_empty(&local->pending[queue])) |
283 | tasklet_schedule(&local->tx_pending_tasklet); | 284 | tasklet_schedule(&local->tx_pending_tasklet); |
285 | |||
286 | rcu_read_lock(); | ||
287 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
288 | netif_tx_wake_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
289 | rcu_read_unlock(); | ||
284 | } | 290 | } |
285 | 291 | ||
286 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, | 292 | void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue, |
@@ -305,11 +311,17 @@ static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue, | |||
305 | enum queue_stop_reason reason) | 311 | enum queue_stop_reason reason) |
306 | { | 312 | { |
307 | struct ieee80211_local *local = hw_to_local(hw); | 313 | struct ieee80211_local *local = hw_to_local(hw); |
314 | struct ieee80211_sub_if_data *sdata; | ||
308 | 315 | ||
309 | if (WARN_ON(queue >= hw->queues)) | 316 | if (WARN_ON(queue >= hw->queues)) |
310 | return; | 317 | return; |
311 | 318 | ||
312 | __set_bit(reason, &local->queue_stop_reasons[queue]); | 319 | __set_bit(reason, &local->queue_stop_reasons[queue]); |
320 | |||
321 | rcu_read_lock(); | ||
322 | list_for_each_entry_rcu(sdata, &local->interfaces, list) | ||
323 | netif_tx_stop_queue(netdev_get_tx_queue(sdata->dev, queue)); | ||
324 | rcu_read_unlock(); | ||
313 | } | 325 | } |
314 | 326 | ||
315 | void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, | 327 | void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue, |