mac80211: don't start new netdev queues if driver stopped
If a new netdev (e.g. an AP VLAN) is created while the driver has queues stopped, the new netdev queues will be started even though they shouldn't. This will lead to frames accumulating on the internal mac80211 pending queues instead of properly being held on the netdev queues. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Родитель
a23108248a
Коммит
2b730daace
|
@ -639,8 +639,28 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
|
|||
|
||||
ieee80211_recalc_ps(local, -1);
|
||||
|
||||
if (dev)
|
||||
netif_tx_start_all_queues(dev);
|
||||
if (dev) {
|
||||
unsigned long flags;
|
||||
int n_acs = IEEE80211_NUM_ACS;
|
||||
int ac;
|
||||
|
||||
if (local->hw.queues < IEEE80211_NUM_ACS)
|
||||
n_acs = 1;
|
||||
|
||||
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
||||
if (sdata->vif.cab_queue == IEEE80211_INVAL_HW_QUEUE ||
|
||||
(local->queue_stop_reasons[sdata->vif.cab_queue] == 0 &&
|
||||
skb_queue_empty(&local->pending[sdata->vif.cab_queue]))) {
|
||||
for (ac = 0; ac < n_acs; ac++) {
|
||||
int ac_queue = sdata->vif.hw_queue[ac];
|
||||
|
||||
if (local->queue_stop_reasons[ac_queue] == 0 &&
|
||||
skb_queue_empty(&local->pending[ac_queue]))
|
||||
netif_start_subqueue(dev, ac);
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
||||
}
|
||||
|
||||
return 0;
|
||||
err_del_interface:
|
||||
|
|
Загрузка…
Ссылка в новой задаче