mt76: check return value of mt76_txq_send_burst in mt76_txq_schedule_list
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 24 Feb 2021 11:29:34 +0000 (12:29 +0100)
committerFelix Fietkau <nbd@nbd.name>
Sun, 11 Apr 2021 22:01:22 +0000 (00:01 +0200)
Since mt76_txq_send_burst routine can report a negative error code,
check the returned value before incrementing the number of transmitted
frames in mt76_txq_schedule_list routine.
Return -EBUSY directly if the device is in reset or in power management.

Fixes: 90fdc1717b186 ("mt76: use mac80211 txq scheduling")
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/tx.c

index b8fe8ad..451ed60 100644 (file)
@@ -461,11 +461,11 @@ mt76_txq_schedule_list(struct mt76_phy *phy, enum mt76_txq_id qid)
        int ret = 0;
 
        while (1) {
+               int n_frames = 0;
+
                if (test_bit(MT76_STATE_PM, &phy->state) ||
-                   test_bit(MT76_RESET, &phy->state)) {
-                       ret = -EBUSY;
-                       break;
-               }
+                   test_bit(MT76_RESET, &phy->state))
+                       return -EBUSY;
 
                if (dev->queue_ops->tx_cleanup &&
                    q->queued + 2 * MT_TXQ_FREE_THR >= q->ndesc) {
@@ -497,11 +497,16 @@ mt76_txq_schedule_list(struct mt76_phy *phy, enum mt76_txq_id qid)
                }
 
                if (!mt76_txq_stopped(q))
-                       ret += mt76_txq_send_burst(phy, q, mtxq);
+                       n_frames = mt76_txq_send_burst(phy, q, mtxq);
 
                spin_unlock_bh(&q->lock);
 
                ieee80211_return_txq(phy->hw, txq, false);
+
+               if (unlikely(n_frames < 0))
+                       return n_frames;
+
+               ret += n_frames;
        }
 
        return ret;