Browse Source

qcacmn: Request runtime PM resume after receiving WAKE MSI

For PCIe DRV (L1SS sleep) suspend, firmware will trigger a WAKE MSI
to wake up host so that request runtime PM resume for this case.

Change-Id: I959d3b1053b7aef5fe80889553958cf9394c8c38
CRs-fixed: 2450284
Yue Ma 6 years ago
parent
commit
2bdc2baea6
3 changed files with 16 additions and 0 deletions
  1. 4 0
      hif/inc/hif.h
  2. 3 0
      hif/src/hif_main.c
  3. 9 0
      hif/src/pcie/if_pci.c

+ 4 - 0
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)
 {}
 

+ 3 - 0
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 */

+ 9 - 0
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)
 {