Merge tag 'mt76-for-kvalo-2020-12-04' of https://github.com/nbd168/wireless
[linux-2.6-microblaze.git] / drivers / net / wireless / mediatek / mt76 / usb.c
index 8139378..dc85010 100644 (file)
@@ -1039,7 +1039,6 @@ void mt76u_stop_tx(struct mt76_dev *dev)
 {
        int ret;
 
-       mt76_worker_disable(&dev->tx_worker);
        mt76_worker_disable(&dev->usb.status_worker);
 
        ret = wait_event_timeout(dev->tx_wait, !mt76_has_tx_pending(&dev->phy),
@@ -1060,6 +1059,8 @@ void mt76u_stop_tx(struct mt76_dev *dev)
                                usb_kill_urb(q->entry[j].urb);
                }
 
+               mt76_worker_disable(&dev->tx_worker);
+
                /* On device removal we maight queue skb's, but mt76u_tx_kick()
                 * will fail to submit urb, cleanup those skb's manually.
                 */
@@ -1068,17 +1069,19 @@ void mt76u_stop_tx(struct mt76_dev *dev)
                        if (!q)
                                continue;
 
-                       entry = q->entry[q->tail];
-                       q->entry[q->tail].done = false;
-
-                       mt76_queue_tx_complete(dev, q, &entry);
+                       while (q->queued > 0) {
+                               entry = q->entry[q->tail];
+                               q->entry[q->tail].done = false;
+                               mt76_queue_tx_complete(dev, q, &entry);
+                       }
                }
+
+               mt76_worker_enable(&dev->tx_worker);
        }
 
        cancel_work_sync(&dev->usb.stat_work);
        clear_bit(MT76_READING_STATS, &dev->phy.state);
 
-       mt76_worker_enable(&dev->tx_worker);
        mt76_worker_enable(&dev->usb.status_worker);
 
        mt76_tx_status_check(dev, NULL, true);