diff options
| author | Ganesh Babu Kumaravel <kganesh@qti.qualcomm.com> | 2013-09-21 07:15:32 +0530 |
|---|---|---|
| committer | Prakash Dhavali <pdhavali@qca.qualcomm.com> | 2013-12-03 14:39:32 -0800 |
| commit | a346ed38bc15c8a662b2099c05f62edc42ef3735 (patch) | |
| tree | e07f71f7dd0e90e4d011f87d4fc0bb906fc99fdf | |
| parent | 104f37b97b7bdb55dc4ecb9ab4293cde4faa727a (diff) | |
cld:enable sleep mode
PCIE SOC Wake needs to be set so that target will go sleep or low
power mode. But before loading the firmware target clocks won't be
set properly. In this case host cannot wakeup target properly.
So till the driver is loaded PCIE wake will be set to awake.
Once the driver is loaded PCIE wake will be set to sleep mode.
With this max perf mode i.e keeping the target always awake
is disabled as well.
Change-Id: Idb5b88e8d5d68cf4c1e226a673cfac53572ceb01
CRs-fixed: 548245
| -rw-r--r-- | CORE/SERVICES/COMMON/hif.h | 11 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/htc_api.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/hif_pci.c | 11 | ||||
| -rw-r--r-- | CORE/SERVICES/HTC/htc.c | 11 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_api.c | 3 |
5 files changed, 34 insertions, 3 deletions
diff --git a/CORE/SERVICES/COMMON/hif.h b/CORE/SERVICES/COMMON/hif.h index b1b752d3755a..0154f1a3a525 100644 --- a/CORE/SERVICES/COMMON/hif.h +++ b/CORE/SERVICES/COMMON/hif.h @@ -588,7 +588,13 @@ inline int HIFDiagWriteMem(HIF_DEVICE *hif_device, A_UINT32 address, A_UINT8 *da * For maximum performance and no power management, set this to 1. * For power management at the cost of performance, set this to 0. */ -#define CONFIG_ATH_PCIE_MAX_PERF 1 +#define CONFIG_ATH_PCIE_MAX_PERF 0 + +/* + * For keeping the target awake till the driver is + * loaded, set this to 1 + */ +#define CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD 1 /* * When CONFIG_ATH_PCIE_MAX_PERF is 0: @@ -632,6 +638,8 @@ inline int HIFDiagWriteMem(HIF_DEVICE *hif_device, A_UINT32 address, A_UINT8 *da extern A_target_id_t HIFGetTargetId(HIF_DEVICE *hifDevice); extern void HIFTargetSleepStateAdjust(A_target_id_t targid, A_BOOL sleep_ok, A_BOOL wait_for_it); +extern void +HIFSetTargetSleep(HIF_DEVICE *hif_device, A_BOOL sleep_ok, A_BOOL wait_for_it); extern A_BOOL HIFTargetForcedAwake(A_target_id_t targid); #define A_TARGET_ID(hifDevice) HIFGetTargetId(hifDevice) @@ -665,6 +673,7 @@ void WAR_PCI_WRITE32(char *addr, u32 offset, u32 value); #else /* CONFIG_ATH_PCIE_MAX_PERF */ +void WAR_PCI_WRITE32(char *addr, u32 offset, u32 value); #define A_TARGET_ACCESS_BEGIN(targid) \ HIFTargetSleepStateAdjust((targid), FALSE, TRUE) diff --git a/CORE/SERVICES/COMMON/htc_api.h b/CORE/SERVICES/COMMON/htc_api.h index 79f70a438b96..8199b8e971b5 100644 --- a/CORE/SERVICES/COMMON/htc_api.h +++ b/CORE/SERVICES/COMMON/htc_api.h @@ -685,4 +685,5 @@ struct s_htc_msg{ #endif void *htc_get_targetdef(HTC_HANDLE htc_handle); +void HTCSetTargetToSleep(void *context); #endif /* _HTC_API_H_ */ diff --git a/CORE/SERVICES/HIF/PCIe/hif_pci.c b/CORE/SERVICES/HIF/PCIe/hif_pci.c index 0bf65463c703..4db4fc73df17 100644 --- a/CORE/SERVICES/HIF/PCIe/hif_pci.c +++ b/CORE/SERVICES/HIF/PCIe/hif_pci.c @@ -1974,8 +1974,8 @@ HIF_PCIDeviceProbed(hif_handle_t hif_hdl) hif_state->fw_indicator_address = FW_INDICATOR_ADDRESS; hif_state->targid = A_TARGET_ID(sc->hif_device); -#if CONFIG_ATH_PCIE_MAX_PERF - /* Force AWAKE forever */ +#if CONFIG_ATH_PCIE_MAX_PERF || CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD + /* Force AWAKE forever/till the driver is loaded */ HIFTargetSleepStateAdjust(hif_state->targid, FALSE, TRUE); #endif @@ -2299,6 +2299,13 @@ HIFTargetSleepStateAdjust(A_target_id_t targid, } } +void +HIFSetTargetSleep(HIF_DEVICE *hif_device, A_BOOL sleep_ok, A_BOOL wait_for_it) +{ + struct HIF_CE_state *hif_state = (struct HIF_CE_state *)hif_device; + HIFTargetSleepStateAdjust(hif_state->targid, sleep_ok, wait_for_it); +} + A_BOOL HIFTargetForcedAwake(A_target_id_t targid) { diff --git a/CORE/SERVICES/HTC/htc.c b/CORE/SERVICES/HTC/htc.c index 64a93168b8b8..0d917df950d2 100644 --- a/CORE/SERVICES/HTC/htc.c +++ b/CORE/SERVICES/HTC/htc.c @@ -771,3 +771,14 @@ void *htc_get_targetdef(HTC_HANDLE htc_handle) return hif_get_targetdef(target->hif_dev); } + +void HTCSetTargetToSleep(void *context) +{ +#if CONFIG_ATH_PCIE_MAX_PERF == 0 +#if CONFIG_ATH_PCIE_AWAKE_WHILE_DRIVER_LOAD + struct ol_softc *sc = (struct ol_softc *)context; + + HIFSetTargetSleep(sc->hif_hdl, true, false); +#endif +#endif +} diff --git a/CORE/VOSS/src/vos_api.c b/CORE/VOSS/src/vos_api.c index 5fd53fbf4caf..cf4ba83d48e4 100644 --- a/CORE/VOSS/src/vos_api.c +++ b/CORE/VOSS/src/vos_api.c @@ -673,12 +673,15 @@ VOS_STATUS vos_preStart( v_CONTEXT_t vosContext ) { VOS_TRACE(VOS_MODULE_ID_SYS, VOS_TRACE_LEVEL_FATAL, "Failed to get ready event from target firmware"); + HTCSetTargetToSleep(vos_get_context(VOS_MODULE_ID_HIF, gpVosContext)); macStop(gpVosContext->pMACContext, HAL_STOP_TYPE_SYS_DEEP_SLEEP); ccmStop(gpVosContext->pMACContext); HTCStop(gpVosContext->htc_ctx); VOS_ASSERT( 0 ); return VOS_STATUS_E_FAILURE; } + + HTCSetTargetToSleep(vos_get_context(VOS_MODULE_ID_HIF, gpVosContext)); #endif #endif /* QCA_WIFI_2_0 */ |
