]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
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)
committerKelsey Skunberg <kelsey.skunberg@canonical.com>
Mon, 24 May 2021 23:46:37 +0000 (17:46 -0600)
BugLink: https://bugs.launchpad.net/bugs/1929455
[ Upstream commit 57b8b57516c5108b0078051a31c68dc9dfcbf68f ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/net/wireless/mediatek/mt76/tx.c

index d5953223d7cfa49711b08dbbe1467964b7c85c6f..c678f3e01311dbc006468abfd443430d5819e499 100644 (file)
@@ -455,11 +455,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) {
@@ -491,11 +491,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;