diff options
| -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); |
