[SRU][R][PATCH 1/1] UBUNTU: SAUCE: wifi: ath12k: avoid MHI deinit during suspend

ChunAn Wu an.wu at canonical.com
Mon Jul 13 08:33:54 UTC 2026


From: Saikiran <bjsaikiran at gmail.com>

BugLink: https://bugs.launchpad.net/bugs/2160183

Commit 8d5f4da8d70b ("wifi: ath12k: support suspend/resume")
introduced ath12k system suspend/resume support. The suspend path uses
MHI_POWER_OFF_KEEP_DEV so the MHI child devices remain available for
resume, but ath12k_mhi_stop() still unconditionally deinitializes the
MHI host context afterwards.

On WCN7850 this can leave resume in a half-initialized MHI state: BHI
image loading fails, POWER_ON returns -ETIMEDOUT, and a later resume
step rejects INIT because ATH12K_MHI_INIT is already set. The normal
resume callback then waits ATH12K_RESET_TIMEOUT_HZ before failing,
causing a roughly 20 second resume delay.

Skip MHI DEINIT during suspend and avoid repeating INIT when the state
bit is already set. Full power-down paths still deinitialize MHI as
before.

This is based on the upstream mailing-list proposal from Saikiran. It is
not yet merged upstream, so keep it as SAUCE while validating on the
affected platform.

Fixes: 8d5f4da8d70b ("wifi: ath12k: support suspend/resume")
Link: https://lore.kernel.org/all/20260202151720.49904-1-bjsaikiran@gmail.com/
Signed-off-by: Saikiran <bjsaikiran at gmail.com>
Signed-off-by: ChunAn Wu <an.wu at canonical.com>
---
 drivers/net/wireless/ath/ath12k/mhi.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ath/ath12k/mhi.c b/drivers/net/wireless/ath/ath12k/mhi.c
index ee87f00bc5de..064318d05d52 100644
--- a/drivers/net/wireless/ath/ath12k/mhi.c
+++ b/drivers/net/wireless/ath/ath12k/mhi.c
@@ -485,9 +485,11 @@ int ath12k_mhi_start(struct ath12k_pci *ab_pci)
 
 	ab_pci->mhi_ctrl->timeout_ms = MHI_TIMEOUT_DEFAULT_MS;
 
-	ret = ath12k_mhi_set_state(ab_pci, ATH12K_MHI_INIT);
-	if (ret)
-		goto out;
+	if (!test_bit(ATH12K_MHI_INIT, &ab_pci->mhi_state)) {
+		ret = ath12k_mhi_set_state(ab_pci, ATH12K_MHI_INIT);
+		if (ret)
+			goto out;
+	}
 
 	ret = ath12k_mhi_set_state(ab_pci, ATH12K_MHI_POWER_ON);
 	if (ret)
@@ -510,7 +512,8 @@ void ath12k_mhi_stop(struct ath12k_pci *ab_pci, bool is_suspend)
 	else
 		ath12k_mhi_set_state(ab_pci, ATH12K_MHI_POWER_OFF);
 
-	ath12k_mhi_set_state(ab_pci, ATH12K_MHI_DEINIT);
+	if (!is_suspend)
+		ath12k_mhi_set_state(ab_pci, ATH12K_MHI_DEINIT);
 }
 
 void ath12k_mhi_suspend(struct ath12k_pci *ab_pci)
-- 
2.34.1



More information about the kernel-team mailing list