diff options
| author | Ganesh Babu Kumaravel <kganesh@qti.qualcomm.com> | 2014-01-11 04:29:34 +0530 |
|---|---|---|
| committer | Prakash Dhavali <pdhavali@qca.qualcomm.com> | 2014-01-26 00:05:59 -0800 |
| commit | 46d3d1a7293bb9f463ce0a080e0fbbdaca2b0d07 (patch) | |
| tree | 1000ad8f730e9161e08ec901cd82350cd7acaa10 | |
| parent | b772ee87520bef03ec47e7dc587ab1364c438fa1 (diff) | |
qcacld: Powersave handling in static ip address case.
While static address is assigned Framework won't send powersave enabling
command to the driver. So power save won't be enabled with powersave
offload scenario.
So upon association completion auto bmps timer with a duration of 5 secs
is started. In case of DHCP case Framework will send powersave disable
command before starting dhcp. Here this timer will be stopped and
powersave will be enabled upon getting enable powersave from framework
once dhcp is completed.
In static address case upon expiry of this auto bmps timer power save
will be enabled for that session.
CRs-Fixed: 593367
Change-Id: Ib5a0f533edde98ac0c7ca9b2561273c1b8a953d0
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 18 | ||||
| -rw-r--r-- | CORE/SME/inc/pmc.h | 11 | ||||
| -rw-r--r-- | CORE/SME/inc/pmcApi.h | 6 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 5 | ||||
| -rw-r--r-- | CORE/SME/src/pmc/pmc.c | 15 | ||||
| -rw-r--r-- | CORE/SME/src/pmc/pmcApi.c | 41 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 30 |
7 files changed, 118 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index 73c13b18092c..d0e0c906ae6d 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -920,6 +920,15 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo * } #endif + if (pHddCtx->cfg_ini->enablePowersaveOffload && + ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) || + (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))) + { + sme_PsOffloadDisableDeferredPowerSave( + WLAN_HDD_GET_HAL_CTX(pAdapter), + pAdapter->sessionId); + } + //Unblock anyone waiting for disconnect to complete complete(&pAdapter->disconnect_comp_var); return( status ); @@ -1884,6 +1893,15 @@ static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter, tCsrRo WLANTL_STA_AUTHENTICATED ); pHddStaCtx->conn_info.uIsAuthenticated = VOS_TRUE; + + if (pHddCtx->cfg_ini->enablePowersaveOffload && + ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) || + (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))) + { + sme_PsOffloadEnableDeferredPowerSave( + WLAN_HDD_GET_HAL_CTX(pAdapter), + pAdapter->sessionId); + } } else { diff --git a/CORE/SME/inc/pmc.h b/CORE/SME/inc/pmc.h index 3d3e97b23aa5..6c8bc6b6c05c 100644 --- a/CORE/SME/inc/pmc.h +++ b/CORE/SME/inc/pmc.h @@ -51,6 +51,10 @@ /* Auto Ps Entry Timer Default value - 1000 ms */ #define AUTO_PS_ENTRY_TIMER_DEFAULT_VALUE 1000 +/* Auto Deferred Ps Entry Timer value - 5000 ms */ +#define AUTO_DEFERRED_PS_ENTRY_TIMER_DEFAULT_VALUE 5000 + + /* Host power sources. */ typedef enum ePowerSource { @@ -287,6 +291,9 @@ typedef struct sPsOffloadPerSessionInfo /* TRUE if Sta Mode Ps is Enabled */ tANI_BOOLEAN configStaPsEnabled; + /* TRUE if deferred Sta Mode Ps is Enabled */ + tANI_BOOLEAN configDefStaPsEnabled; + /* * Indicates current uapsd status * Enabled/Disabled/Required @@ -424,9 +431,9 @@ eHalStatus pmcOffloadClosePerSession(tHalHandle hHal, tANI_U32 sessionId); eHalStatus pmcOffloadStartPerSession(tHalHandle hHal, tANI_U32 sessionId); eHalStatus pmcOffloadStopPerSession(tHalHandle hHal, tANI_U32 sessionId); - eHalStatus pmcOffloadStartAutoStaPsTimer (tpAniSirGlobal pMac, - tANI_U32 sessionId); + tANI_U32 sessionId, + tANI_U32 timerValue); void pmcOffloadStopAutoStaPsTimer(tpAniSirGlobal pMac, tANI_U32 sessionId); diff --git a/CORE/SME/inc/pmcApi.h b/CORE/SME/inc/pmcApi.h index 0a7be56c2561..82802b3dd7ce 100644 --- a/CORE/SME/inc/pmcApi.h +++ b/CORE/SME/inc/pmcApi.h @@ -630,5 +630,11 @@ eHalStatus pmcOffloadSetTdlsProhibitBmpsStatus(tHalHandle hHal, tANI_BOOLEAN pmcOffloadIsPowerSaveEnabled (tHalHandle hHal, tANI_U32 sessionId, tPmcPowerSavingMode psMode); + +eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal, + tANI_U32 sessionId); + +eHalStatus PmcOffloadDisableDeferredStaModePowerSave(tHalHandle hHal, + tANI_U32 sessionId); #endif diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h index 7d3e2e85fcb7..c3dc77f35f68 100644 --- a/CORE/SME/inc/sme_Api.h +++ b/CORE/SME/inc/sme_Api.h @@ -3241,6 +3241,11 @@ eHalStatus sme_ConfigEnablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMod eHalStatus sme_ConfigDisablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMode); eHalStatus sme_PsOffloadEnablePowerSave (tHalHandle hHal, tANI_U32 sessionId); eHalStatus sme_PsOffloadDisablePowerSave (tHalHandle hHal, tANI_U32 sessionId); +eHalStatus sme_PsOffloadEnableDeferredPowerSave (tHalHandle hHal, + tANI_U32 sessionId); +eHalStatus sme_PsOffloadDisableDeferredPowerSave (tHalHandle hHal, + tANI_U32 sessionId); + /*SME API to convert convert the ini value to the ENUM used in csr and MAC*/ ePhyChanBondState sme_GetCBPhyStateFromCBIniValue(tANI_U32 cb_ini_value); diff --git a/CORE/SME/src/pmc/pmc.c b/CORE/SME/src/pmc/pmc.c index 6fadfc62ba27..f1cba31cd8cd 100644 --- a/CORE/SME/src/pmc/pmc.c +++ b/CORE/SME/src/pmc/pmc.c @@ -2807,7 +2807,7 @@ eHalStatus pmcOffloadStartPerSession(tHalHandle hHal, tANI_U32 sessionId) #ifdef FEATURE_WLAN_TDLS pmc->isTdlsPowerSaveProhibited = FALSE; #endif - + pmc->configDefStaPsEnabled = FALSE; return eHAL_STATUS_SUCCESS; } @@ -2826,6 +2826,7 @@ eHalStatus pmcOffloadStopPerSession(tHalHandle hHal, tANI_U32 sessionId) #ifdef FEATURE_WLAN_TDLS pmc->isTdlsPowerSaveProhibited = FALSE; #endif + pmc->configDefStaPsEnabled = FALSE; pmcOffloadStopAutoStaPsTimer(pMac, sessionId); pmcOffloadDoFullPowerCallbacks(pMac, sessionId, eHAL_STATUS_FAILURE); @@ -3019,7 +3020,8 @@ eHalStatus pmcOffloadEnableStaPsCheck(tpAniSirGlobal pMac, } eHalStatus pmcOffloadStartAutoStaPsTimer (tpAniSirGlobal pMac, - tANI_U32 sessionId) + tANI_U32 sessionId, + tANI_U32 timerValue) { VOS_STATUS vosStatus; tpPsOffloadPerSessionInfo pmc = &pMac->pmcOffloadInfo.pmc[sessionId]; @@ -3027,7 +3029,7 @@ eHalStatus pmcOffloadStartAutoStaPsTimer (tpAniSirGlobal pMac, smsLog(pMac, LOG2, FL("Entering pmcOffloadStartAutoStaPsTimer")); vosStatus = vos_timer_start(&pmc->autoPsEnableTimer, - pmc->autoPsEntryTimerPeriod); + timerValue); if(!VOS_IS_STATUS_SUCCESS(vosStatus)) { if(VOS_STATUS_E_ALREADY == vosStatus) @@ -3395,10 +3397,11 @@ eHalStatus pmcOffloadExitPowersaveState(tpAniSirGlobal pMac, tANI_U32 sessionId) /* Call Full Power Req Cbs */ pmcOffloadDoFullPowerCallbacks(pMac, sessionId, eHAL_STATUS_SUCCESS); - if(pmc->configStaPsEnabled) - pmcOffloadStartAutoStaPsTimer(pMac, sessionId); + if (pmc->configStaPsEnabled || pmc->configDefStaPsEnabled) + pmcOffloadStartAutoStaPsTimer(pMac, sessionId, + pmc->autoPsEntryTimerPeriod); else - smsLog(pMac, LOGE, FL("Master Sta Ps Disabled")); + smsLog(pMac, LOGE, FL("Master Sta Ps Disabled")); return eHAL_STATUS_SUCCESS; } diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c index eb7bc507ac00..0a4b4ceff7bf 100644 --- a/CORE/SME/src/pmc/pmcApi.c +++ b/CORE/SME/src/pmc/pmcApi.c @@ -3509,6 +3509,7 @@ eHalStatus pmcOffloadCleanup(tHalHandle hHal, tANI_U32 sessionId) pmc->uapsdSessionRequired = FALSE; pmc->configStaPsEnabled = FALSE; + pmc->configDefStaPsEnabled = FALSE; pmcOffloadStopAutoStaPsTimer(pMac, sessionId); pmcOffloadDoStartUapsdCallbacks(pMac, sessionId, eHAL_STATUS_FAILURE); return eHAL_STATUS_SUCCESS; @@ -3839,6 +3840,9 @@ eHalStatus PmcOffloadDisableStaModePowerSave(tHalHandle hHal, */ smsLog(pMac, LOGE, FL("sta mode power save already disabled")); + /* Stop the Auto Sta Ps Timer if running */ + pmcOffloadStopAutoStaPsTimer(pMac, sessionId); + pmc->configDefStaPsEnabled = FALSE; } return status; } @@ -4305,3 +4309,40 @@ tANI_BOOLEAN pmcOffloadIsPowerSaveEnabled (tHalHandle hHal, tANI_U32 sessionId, } } +eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal, + tANI_U32 sessionId) +{ + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + tpPsOffloadPerSessionInfo pmc = &pMac->pmcOffloadInfo.pmc[sessionId]; + eHalStatus status = eHAL_STATUS_FAILURE; + + if (!pMac->pmcOffloadInfo.staPsEnabled) + { + smsLog(pMac, LOGE, + FL("STA Mode PowerSave is not enabled in ini")); + return status; + } + + status = pmcOffloadStartAutoStaPsTimer(pMac, sessionId, + AUTO_DEFERRED_PS_ENTRY_TIMER_DEFAULT_VALUE); + if (eHAL_STATUS_SUCCESS == status) + { + smsLog(pMac, LOG2, + FL("Enabled Deferred ps for session %d"), sessionId); + pmc->configDefStaPsEnabled = TRUE; + } + return status; +} + +eHalStatus PmcOffloadDisableDeferredStaModePowerSave(tHalHandle hHal, + tANI_U32 sessionId) +{ + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + tpPsOffloadPerSessionInfo pmc = &pMac->pmcOffloadInfo.pmc[sessionId]; + + /* Stop the Auto Sta Ps Timer if running */ + pmcOffloadStopAutoStaPsTimer(pMac, sessionId); + pmc->configDefStaPsEnabled = FALSE; + return eHAL_STATUS_SUCCESS; +} + diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c index 6df7077457a9..abc47d83b8f4 100644 --- a/CORE/SME/src/sme_common/sme_Api.c +++ b/CORE/SME/src/sme_common/sme_Api.c @@ -10683,6 +10683,36 @@ eHalStatus sme_PsOffloadDisablePowerSave (tHalHandle hHal, tANI_U32 sessionId) return (status); } +eHalStatus sme_PsOffloadEnableDeferredPowerSave (tHalHandle hHal, + tANI_U32 sessionId) +{ + eHalStatus status = eHAL_STATUS_FAILURE; + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + + status = sme_AcquireGlobalLock(&pMac->sme); + if (HAL_STATUS_SUCCESS( status )) + { + status = PmcOffloadEnableDeferredStaModePowerSave(hHal, sessionId); + sme_ReleaseGlobalLock( &pMac->sme ); + } + return (status); +} + +eHalStatus sme_PsOffloadDisableDeferredPowerSave (tHalHandle hHal, + tANI_U32 sessionId) +{ + eHalStatus status = eHAL_STATUS_FAILURE; + tpAniSirGlobal pMac = PMAC_STRUCT(hHal); + + status = sme_AcquireGlobalLock(&pMac->sme); + if (HAL_STATUS_SUCCESS( status )) + { + status = PmcOffloadDisableDeferredStaModePowerSave(hHal, sessionId); + sme_ReleaseGlobalLock( &pMac->sme ); + } + return (status); +} + tANI_S16 sme_GetHTConfig(tHalHandle hHal, tANI_U8 session_id, tANI_U16 ht_capab) { tpAniSirGlobal pMac = PMAC_STRUCT(hHal); |
