[PATCH v2 2/2] wifi: mt76: mt7921: reset on HIF resume timeout
Hedi Ben Hamida
hedihamida096 at gmail.com
Sat Oct 24 06:16:53 PDT 2026
On some MT7922 firmware the HIF_CTRL resume command does not return a
response after D3, so mt7921_pci_resume() returns -ETIMEDOUT and the
PM core reports the resume as failed:
mt7921e 0000:03:00.0: Message 00020007 (seq 6) timeout
mt7921e 0000:03:00.0: PM: dpm_run_callback(): pci_pm_resume returns -110
The driver already resets the device on this error, and the reset
restores it. Treat the timeout as recovered after queueing the reset
and return success, so the PM core does not mark the resume as failed.
Tested on MEDIATEK MT7922 (14c3:7922) on kernel 6.12.113: suspend/resume
no longer returns -110 and Wi-Fi recovers; hibernate/resume still works.
Cc: stable at vger.kernel.org
Signed-off-by: Hedi Ben Hamida <hedihamida096 at gmail.com>
---
drivers/net/wireless/mediatek/mt76/mt7921/pci.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
index 00532b29f..dce88fcc7 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7921/pci.c
@@ -597,6 +597,14 @@ static int _mt7921_pci_resume(struct device *device, bool restore)
mt76_connac_mcu_set_deep_sleep(&dev->mt76, false);
err = mt76_connac_mcu_set_hif_suspend(mdev, false, true);
+ if (err == -ETIMEDOUT) {
+ /* Firmware may not reply after D3; the reset recovers it. */
+ dev_warn(dev->mt76.dev,
+ "HIF resume timed out, resetting\n");
+ pm->suspended = false;
+ mt792x_reset(&dev->mt76);
+ return 0;
+ }
if (err < 0)
goto failed;
--
2.47.3
More information about the Linux-mediatek
mailing list