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, |
