From 31eb8e469a4a4711ae9696ad66248a2c2003ee3f Mon Sep 17 00:00:00 2001 From: Karthik Kantamneni Date: Thu, 13 May 2021 20:57:04 +0530 Subject: [PATCH] qcacmn: Track for unbalanced group irqs enable/disable In wlan suspend and resume cases it is seen that group irqs are getting disabled multiple times without getting enabled which is causing irqs to be disabled permenantly. Track for unbalanced disabling/enabling group irqs which helps to root cause the issue. Change-Id: Ic1ef637c317f04b3299f17f19208df11ece3c013 CRs-Fixed: 2939809 --- hif/src/ipcie/if_ipci.c | 28 ++++++++++++++++++++++++++-- hif/src/ipcie/if_ipci.h | 1 + 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/hif/src/ipcie/if_ipci.c b/hif/src/ipcie/if_ipci.c index 3c557eb7885d..a5a08518e3fc 100644 --- a/hif/src/ipcie/if_ipci.c +++ b/hif/src/ipcie/if_ipci.c @@ -931,10 +931,34 @@ void hif_allow_link_low_power_states(struct hif_opaque_softc *hif) int hif_ipci_enable_grp_irqs(struct hif_softc *scn) { - return hif_apps_grp_irqs_enable(GET_HIF_OPAQUE_HDL(scn)); + struct hif_ipci_softc *ipci_scn = HIF_GET_IPCI_SOFTC(scn); + int status; + + if (!ipci_scn->grp_irqs_disabled) { + hif_err("Unbalanced group IRQs Enable called"); + qdf_assert_always(0); + } + + status = hif_apps_grp_irqs_enable(GET_HIF_OPAQUE_HDL(scn)); + if (!status) + ipci_scn->grp_irqs_disabled = false; + + return status; } int hif_ipci_disable_grp_irqs(struct hif_softc *scn) { - return hif_apps_grp_irqs_disable(GET_HIF_OPAQUE_HDL(scn)); + struct hif_ipci_softc *ipci_scn = HIF_GET_IPCI_SOFTC(scn); + int status; + + if (ipci_scn->grp_irqs_disabled) { + hif_err("Unbalanced group IRQs disable called"); + qdf_assert_always(0); + } + + status = hif_apps_grp_irqs_disable(GET_HIF_OPAQUE_HDL(scn)); + if (!status) + ipci_scn->grp_irqs_disabled = true; + + return status; } diff --git a/hif/src/ipcie/if_ipci.h b/hif/src/ipcie/if_ipci.h index afbd9a164632..2481e7cbab74 100644 --- a/hif/src/ipcie/if_ipci.h +++ b/hif/src/ipcie/if_ipci.h @@ -89,6 +89,7 @@ struct hif_ipci_softc { uint32_t register_window; qdf_spinlock_t register_access_lock; qdf_spinlock_t irq_lock; + bool grp_irqs_disabled; #ifdef FEATURE_RUNTIME_PM struct hif_runtime_pm_ctx rpm_ctx; #endif