Commit 3e80fcbc authored by Kalle Valo's avatar Kalle Valo
Browse files

ath11k: mhi: add error handling for suspend and resume



While reviewing the mhi.c I noticed we were just ignoring the errors coming
from MHI subsystem during suspend and resume. Add proper checks and warning
messages. Also pass the error value to callers.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03003-QCAHSPSWPL_V1_V2_SILICONZ_LITE-2

Signed-off-by: default avatarKalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220401173042.17467-3-kvalo@kernel.org
parent 121210ec
Loading
Loading
Loading
Loading
+22 −4
Original line number Original line Diff line number Diff line
@@ -489,16 +489,34 @@ void ath11k_mhi_stop(struct ath11k_pci *ab_pci)
	mhi_unprepare_after_power_down(ab_pci->mhi_ctrl);
	mhi_unprepare_after_power_down(ab_pci->mhi_ctrl);
}
}


void ath11k_mhi_suspend(struct ath11k_pci *ab_pci)
int ath11k_mhi_suspend(struct ath11k_pci *ab_pci)
{
{
	mhi_pm_suspend(ab_pci->mhi_ctrl);
	struct ath11k_base *ab = ab_pci->ab;
	int ret;

	ret = mhi_pm_suspend(ab_pci->mhi_ctrl);
	if (ret) {
		ath11k_warn(ab, "failed to suspend mhi: %d", ret);
		return ret;
	}

	return 0;
}
}


void ath11k_mhi_resume(struct ath11k_pci *ab_pci)
int ath11k_mhi_resume(struct ath11k_pci *ab_pci)
{
{
	struct ath11k_base *ab = ab_pci->ab;
	int ret;

	/* Do force MHI resume as some devices like QCA6390, WCN6855
	/* Do force MHI resume as some devices like QCA6390, WCN6855
	 * are not in M3 state but they are functional. So just ignore
	 * are not in M3 state but they are functional. So just ignore
	 * the MHI state while resuming.
	 * the MHI state while resuming.
	 */
	 */
	mhi_pm_resume_force(ab_pci->mhi_ctrl);
	ret = mhi_pm_resume_force(ab_pci->mhi_ctrl);
	if (ret) {
		ath11k_warn(ab, "failed to resume mhi: %d", ret);
		return ret;
	}

	return 0;
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ void ath11k_mhi_unregister(struct ath11k_pci *ar_pci);
void ath11k_mhi_set_mhictrl_reset(struct ath11k_base *ab);
void ath11k_mhi_set_mhictrl_reset(struct ath11k_base *ab);
void ath11k_mhi_clear_vector(struct ath11k_base *ab);
void ath11k_mhi_clear_vector(struct ath11k_base *ab);


void ath11k_mhi_suspend(struct ath11k_pci *ar_pci);
int ath11k_mhi_suspend(struct ath11k_pci *ar_pci);
void ath11k_mhi_resume(struct ath11k_pci *ar_pci);
int ath11k_mhi_resume(struct ath11k_pci *ar_pci);


#endif
#endif
+2 −6
Original line number Original line Diff line number Diff line
@@ -619,18 +619,14 @@ static int ath11k_pci_hif_suspend(struct ath11k_base *ab)
{
{
	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);
	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);


	ath11k_mhi_suspend(ar_pci);
	return ath11k_mhi_suspend(ar_pci);

	return 0;
}
}


static int ath11k_pci_hif_resume(struct ath11k_base *ab)
static int ath11k_pci_hif_resume(struct ath11k_base *ab)
{
{
	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);
	struct ath11k_pci *ar_pci = ath11k_pci_priv(ab);


	ath11k_mhi_resume(ar_pci);
	return ath11k_mhi_resume(ar_pci);

	return 0;
}
}


static void ath11k_pci_hif_ce_irq_enable(struct ath11k_base *ab)
static void ath11k_pci_hif_ce_irq_enable(struct ath11k_base *ab)