diff --git a/hif/src/dispatcher/dummy.c b/hif/src/dispatcher/dummy.c index 3691613d2c..d87dfbcdf5 100644 --- a/hif/src/dispatcher/dummy.c +++ b/hif/src/dispatcher/dummy.c @@ -94,3 +94,20 @@ int hif_dummy_target_sleep_state_adjust(struct hif_softc *scn, { return 0; } + +/** + * hif_dummy_enable_power_management - dummy call + * hif_ctx: hif context + * is_packet_log_enabled: true if packet log is enabled + */ +void hif_dummy_enable_power_management(struct hif_softc *hif_ctx, + bool is_packet_log_enabled) +{} + +/** + * hif_dummy_disable_power_management - dummy call + * hif_ctx: hif context + * is_packet_log_enabled: true if packet log is enabled + */ +void hif_dummy_disable_power_management(struct hif_softc *hif_ctx) +{} diff --git a/hif/src/dispatcher/dummy.h b/hif/src/dispatcher/dummy.h index 7daa2ae454..3e421e65b3 100644 --- a/hif/src/dispatcher/dummy.h +++ b/hif/src/dispatcher/dummy.h @@ -32,4 +32,6 @@ int hif_dummy_bus_suspend(struct hif_softc *hif_ctx); int hif_dummy_bus_resume(struct hif_softc *hif_ctx); int hif_dummy_target_sleep_state_adjust(struct hif_softc *scn, bool sleep_ok, bool wait_for_it); - +void hif_dummy_enable_power_management(struct hif_softc *hif_ctx, + bool is_packet_log_enabled); +void hif_dummy_disable_power_management(struct hif_softc *hif_ctx); diff --git a/hif/src/dispatcher/multibus.c b/hif/src/dispatcher/multibus.c index 7f547193fb..e628f31e6c 100644 --- a/hif/src/dispatcher/multibus.c +++ b/hif/src/dispatcher/multibus.c @@ -220,3 +220,35 @@ int hif_dump_registers(struct hif_opaque_softc *hif_hdl) struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl); return hif_sc->bus_ops.hif_dump_registers(hif_sc); } + +/** + * hif_enable_power_management() - enable power management after driver load + * @hif_hdl: opaque pointer to the hif context + * is_packet_log_enabled: true if packet log is enabled + * + * Driver load and firmware download are done in a high performance mode. + * Enable power management after the driver is loaded. + * packet log can require fewer power management features to be enabled. + */ +void hif_enable_power_management(struct hif_opaque_softc *hif_hdl, + bool is_packet_log_enabled) +{ + struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl); + hif_sc->bus_ops.hif_enable_power_management(hif_sc, + is_packet_log_enabled); +} + +/** + * hif_disable_power_management() - reset the bus power management + * @hif_hdl: opaque pointer to the hif context + * + * return the power management of the bus to its default state. + * This isn't necessarily a complete reversal of its counterpart. + * This should be called when unloading the driver. + */ +void hif_disable_power_management(struct hif_opaque_softc *hif_hdl) +{ + struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_hdl); + hif_sc->bus_ops.hif_disable_power_management(hif_sc); +} + diff --git a/hif/src/dispatcher/multibus.h b/hif/src/dispatcher/multibus.h index 11be2829b1..afa36f9142 100644 --- a/hif/src/dispatcher/multibus.h +++ b/hif/src/dispatcher/multibus.h @@ -54,6 +54,10 @@ struct hif_bus_ops { void (*hif_irq_disable)(struct hif_softc *hif_sc, int ce_id); void (*hif_irq_enable)(struct hif_softc *hif_sc, int ce_id); int (*hif_dump_registers)(struct hif_softc *hif_sc); + + void (*hif_enable_power_management)(struct hif_softc *hif_ctx, + bool is_packet_log_enabled); + void (*hif_disable_power_management)(struct hif_softc *hif_ctx); }; #ifdef HIF_SNOC diff --git a/hif/src/dispatcher/multibus_pci.c b/hif/src/dispatcher/multibus_pci.c index 8fdc48c79f..7bb21b13d7 100644 --- a/hif/src/dispatcher/multibus_pci.c +++ b/hif/src/dispatcher/multibus_pci.c @@ -67,6 +67,11 @@ QDF_STATUS hif_initialize_pci_ops(struct hif_softc *hif_sc) bus_ops->hif_irq_disable = &hif_pci_irq_disable; bus_ops->hif_irq_enable = &hif_pci_irq_enable; bus_ops->hif_dump_registers = &hif_pci_dump_registers; + bus_ops->hif_enable_power_management = + &hif_pci_enable_power_management; + bus_ops->hif_disable_power_management = + &hif_pci_disable_power_management; + return QDF_STATUS_SUCCESS; } diff --git a/hif/src/dispatcher/multibus_snoc.c b/hif/src/dispatcher/multibus_snoc.c index f1e77f1b30..cb20438ae7 100644 --- a/hif/src/dispatcher/multibus_snoc.c +++ b/hif/src/dispatcher/multibus_snoc.c @@ -57,6 +57,10 @@ QDF_STATUS hif_initialize_snoc_ops(struct hif_bus_ops *bus_ops) bus_ops->hif_irq_disable = &hif_snoc_irq_disable; bus_ops->hif_irq_enable = &hif_snoc_irq_enable; bus_ops->hif_dump_registers = &hif_snoc_dump_registers; + bus_ops->hif_enable_power_management = + &hif_dummy_enable_power_management; + bus_ops->hif_disable_power_management = + &hif_dummy_disable_power_management; return QDF_STATUS_SUCCESS; } diff --git a/hif/src/dispatcher/pci_api.h b/hif/src/dispatcher/pci_api.h index 3590396d68..0715c0b300 100644 --- a/hif/src/dispatcher/pci_api.h +++ b/hif/src/dispatcher/pci_api.h @@ -46,3 +46,6 @@ int hif_pci_bus_configure(struct hif_softc *scn); void hif_pci_irq_disable(struct hif_softc *scn, int ce_id); void hif_pci_irq_enable(struct hif_softc *scn, int ce_id); int hif_pci_dump_registers(struct hif_softc *scn); +void hif_pci_enable_power_management(struct hif_softc *hif_ctx, + bool is_packet_log_enabled); +void hif_pci_disable_power_management(struct hif_softc *hif_ctx); diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index 9acce4adfc..2196dfee23 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -1178,12 +1178,9 @@ static void hif_disable_power_gating(struct hif_opaque_softc *hif_ctx) * * enables pcie L1 power states */ -static void hif_enable_power_gating(struct hif_opaque_softc *hif_ctx) +static void hif_enable_power_gating(struct hif_pci_softc *sc) { - struct hif_softc *scn = HIF_GET_SOFTC(hif_ctx); - struct hif_pci_softc *sc = HIF_GET_PCI_SOFTC(hif_ctx); - - if (NULL == scn) { + if (NULL == sc) { HIF_ERROR("%s: Could not disable ASPM scn is null", __func__); return; @@ -1202,11 +1199,10 @@ static void hif_enable_power_gating(struct hif_opaque_softc *hif_ctx) * the soc sleep after the driver finishes loading and re-enabling * aspm (hif_enable_power_gating). */ -void hif_enable_power_management(struct hif_opaque_softc *hif_ctx, +void hif_pci_enable_power_management(struct hif_softc *hif_sc, bool is_packet_log_enabled) { - struct hif_pci_softc *pci_ctx = HIF_GET_PCI_SOFTC(hif_ctx); - struct hif_softc *hif_sc = HIF_GET_SOFTC(hif_ctx); + struct hif_pci_softc *pci_ctx = HIF_GET_PCI_SOFTC(hif_sc); if (pci_ctx == NULL) { HIF_ERROR("%s, hif_ctx null", __func__); @@ -1216,7 +1212,7 @@ void hif_enable_power_management(struct hif_opaque_softc *hif_ctx, hif_pm_runtime_start(pci_ctx); if (!is_packet_log_enabled) - hif_enable_power_gating(hif_ctx); + hif_enable_power_gating(pci_ctx); if (!CONFIG_ATH_PCIE_MAX_PERF && CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD) { @@ -1234,7 +1230,7 @@ void hif_enable_power_management(struct hif_opaque_softc *hif_ctx, * if runtime pm is not started. Should be updated to take care * of aspm and soc sleep for driver load. */ -void hif_disable_power_management(struct hif_opaque_softc *hif_ctx) +void hif_pci_disable_power_management(struct hif_softc *hif_ctx) { struct hif_pci_softc *pci_ctx = HIF_GET_PCI_SOFTC(hif_ctx);