[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