[PATCH] wifi: mt76: usb: re-enable the rx worker when resuming fails
YuanZhe Liu
25031212351 at stu.xidian.edu.cn
Thu Oct 29 19:12:47 PDT 2026
mt76u_resume_rx() returns as soon as submitting the RX buffers fails, so
the mt76_worker_enable() at the end of the function is never reached and
the RX worker stays parked. The mt792x USB reset path relies on
mt76u_stop_rx() and mt76u_resume_rx() being a balanced park/unpark pair:
if firmware download fails, mt7925_init_hardware() retries up to ten
times and calls mt792xu_init_reset() again, which parks the already
parked RX worker. kthread_park() then hits its WARN_ON_ONCE() and
returns -EBUSY:
WARNING: kernel/kthread.c:710 at kthread_park+0x17b/0x1b0
Workqueue: events mt7925_init_work
Call Trace:
mt76_worker_disable drivers/net/wireless/mediatek/mt76/util.h:93 [inline]
mt76u_stop_rx+0x5b/0x2f0 drivers/net/wireless/mediatek/mt76/usb.c:757
mt792xu_init_reset+0x52/0x80 drivers/net/wireless/mediatek/mt76/mt792x_usb.c:477
mt7925_init_hardware drivers/net/wireless/mediatek/mt76/mt7925/init.c:152 [inline]
mt7925_init_work+0x49b/0x7e0 drivers/net/wireless/mediatek/mt76/mt7925/init.c:196
A stalled RX endpoint makes usb_submit_urb() return -EPIPE, which is the
failure that leaves the MCU unresponsive and triggers the retry loop.
Skip the remaining queues but always re-enable the worker, and still
return the error to the caller.
Fixes: 0d2afe09fad5 ("mt76: mt7921: add mt7921u driver")
Cc: stable at vger.kernel.org
Co-developed-by: Bin Yu <byu at xidian.edu.cn>
Signed-off-by: Bin Yu <byu at xidian.edu.cn>
Co-developed-by: Cheng Wen <wencheng at xidian.edu.cn>
Signed-off-by: Cheng Wen <wencheng at xidian.edu.cn>
Signed-off-by: YuanZhe Liu <25031212351 at stu.xidian.edu.cn>
---
drivers/net/wireless/mediatek/mt76/usb.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
index a9af3aa6b80a..1c9bf3679774 100644
--- a/drivers/net/wireless/mediatek/mt76/usb.c
+++ b/drivers/net/wireless/mediatek/mt76/usb.c
@@ -775,23 +775,23 @@ EXPORT_SYMBOL_GPL(mt76u_stop_rx);
int mt76u_resume_rx(struct mt76_dev *dev)
{
- int i;
+ int i, err = 0;
mt76_for_each_q_rx(dev, i) {
struct mt76_queue *q = &dev->q_rx[i];
- int err, j;
+ int j;
for (j = 0; j < q->ndesc; j++)
usb_unpoison_urb(q->entry[j].urb);
err = mt76u_submit_rx_buffers(dev, i);
if (err < 0)
- return err;
+ break;
}
mt76_worker_enable(&dev->usb.rx_worker);
- return 0;
+ return err;
}
EXPORT_SYMBOL_GPL(mt76u_resume_rx);
--
2.34.1
More information about the Linux-mediatek
mailing list