diff --git a/hif/inc/hif.h b/hif/inc/hif.h index a59d70f27e..aab6b7be14 100644 --- a/hif/inc/hif.h +++ b/hif/inc/hif.h @@ -744,6 +744,7 @@ void hif_clear_stats(struct hif_opaque_softc *hif_ctx); #ifdef FEATURE_RUNTIME_PM struct hif_pm_runtime_lock; void hif_fastpath_resume(struct hif_opaque_softc *hif_ctx); +int hif_pm_runtime_request_resume(struct hif_opaque_softc *hif_ctx); int hif_pm_runtime_get(struct hif_opaque_softc *hif_ctx); void hif_pm_runtime_get_noresume(struct hif_opaque_softc *hif_ctx); int hif_pm_runtime_put(struct hif_opaque_softc *hif_ctx); @@ -761,6 +762,9 @@ struct hif_pm_runtime_lock { const char *name; }; static inline void hif_fastpath_resume(struct hif_opaque_softc *hif_ctx) {} +static inline int +hif_pm_runtime_request_resume(struct hif_opaque_softc *hif_ctx) +{ return 0; } static inline void hif_pm_runtime_get_noresume(struct hif_opaque_softc *hif_ctx) {} diff --git a/hif/src/hif_main.c b/hif/src/hif_main.c index 12d9f79193..fcdf028724 100644 --- a/hif/src/hif_main.c +++ b/hif/src/hif_main.c @@ -1265,12 +1265,15 @@ irqreturn_t hif_wake_interrupt_handler(int irq, void *context) irqreturn_t hif_wake_interrupt_handler(int irq, void *context) { struct hif_softc *scn = context; + struct hif_opaque_softc *hif_ctx = GET_HIF_OPAQUE_HDL(scn); HIF_INFO("wake interrupt received on irq %d", irq); if (scn->initial_wakeup_cb) scn->initial_wakeup_cb(scn->initial_wakeup_priv); + hif_pm_runtime_request_resume(hif_ctx); + return IRQ_HANDLED; } #endif /* WLAN_SUSPEND_RESUME_TEST */ diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index 74be81cffd..d027c1ac75 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -3858,6 +3858,15 @@ void hif_pci_irq_disable(struct hif_softc *scn, int ce_id) } #ifdef FEATURE_RUNTIME_PM +int hif_pm_runtime_request_resume(struct hif_opaque_softc *hif_ctx) +{ + struct hif_pci_softc *sc = HIF_GET_PCI_SOFTC(hif_ctx); + + if (!sc) + return -EINVAL; + + return hif_pm_request_resume(sc->dev); +} void hif_pm_runtime_get_noresume(struct hif_opaque_softc *hif_ctx) {