qcacmn: Fix IRQ disable for unit-test suspend on PCIe
pld_disable_irq is a no-op for PCI devices, causing unit-test resume
to fail in some cases. Define new IRQ disable/enable API's in HIF for
unit-test suspend/resume to use.
Change-Id: Ib3e6007025e791c867463c7d9f64512628c4ca0b
CRs-Fixed: 2023978
diff --git a/hif/src/dispatcher/multibus.c b/hif/src/dispatcher/multibus.c
index 8f36158..05f9385 100644
--- a/hif/src/dispatcher/multibus.c
+++ b/hif/src/dispatcher/multibus.c
@@ -35,6 +35,8 @@
#include "dummy.h"
#if defined(HIF_PCI) || defined(HIF_SNOC) || defined(HIF_AHB)
#include "ce_main.h"
+#include "ce_api.h"
+#include "ce_internal.h"
#endif
#include "htc_services.h"
#include "a_types.h"
@@ -412,3 +414,83 @@
struct hif_softc *hif_sc = HIF_GET_SOFTC(scn);
return hif_sc->bus_ops.hif_bus_reset_resume(hif_sc);
}
+
+int hif_apps_irqs_disable(struct hif_opaque_softc *hif_ctx)
+{
+ struct hif_softc *scn;
+ int i;
+
+ scn = HIF_GET_SOFTC(hif_ctx);
+ if (!scn) {
+ QDF_BUG(0);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < scn->ce_count; ++i)
+ disable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, i));
+
+ return 0;
+}
+
+int hif_apps_irqs_enable(struct hif_opaque_softc *hif_ctx)
+{
+ struct hif_softc *scn;
+ int i;
+
+ scn = HIF_GET_SOFTC(hif_ctx);
+ if (!scn) {
+ QDF_BUG(0);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < scn->ce_count; ++i)
+ enable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, i));
+
+ return 0;
+}
+
+int hif_apps_wake_irq_disable(struct hif_opaque_softc *hif_ctx)
+{
+ int errno;
+ struct hif_softc *scn;
+ uint8_t wake_ce_id;
+
+ scn = HIF_GET_SOFTC(hif_ctx);
+ if (!scn) {
+ QDF_BUG(0);
+ return -EINVAL;
+ }
+
+ errno = hif_get_wake_ce_id(scn, &wake_ce_id);
+ if (errno) {
+ HIF_ERROR("%s: failed to get wake CE Id: %d", __func__, errno);
+ return errno;
+ }
+
+ disable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, wake_ce_id));
+
+ return 0;
+}
+
+int hif_apps_wake_irq_enable(struct hif_opaque_softc *hif_ctx)
+{
+ int errno;
+ struct hif_softc *scn;
+ uint8_t wake_ce_id;
+
+ scn = HIF_GET_SOFTC(hif_ctx);
+ if (!scn) {
+ QDF_BUG(0);
+ return -EINVAL;
+ }
+
+ errno = hif_get_wake_ce_id(scn, &wake_ce_id);
+ if (errno) {
+ HIF_ERROR("%s: failed to get wake CE Id: %d", __func__, errno);
+ return errno;
+ }
+
+ enable_irq(scn->bus_ops.hif_map_ce_to_irq(scn, wake_ce_id));
+
+ return 0;
+}