Răsfoiți Sursa

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
Karthik Kantamneni 4 ani în urmă
părinte
comite
4dc1443151
2 a modificat fișierele cu 27 adăugiri și 2 ștergeri
  1. 26 2
      hif/src/ipcie/if_ipci.c
  2. 1 0
      hif/src/ipcie/if_ipci.h

+ 26 - 2
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;
 }

+ 1 - 0
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