|
@@ -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:
|