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@vger.kernel.org Co-developed-by: Bin Yu Signed-off-by: Bin Yu Co-developed-by: Cheng Wen Signed-off-by: Cheng Wen Signed-off-by: YuanZhe Liu <25031212351@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