summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c18
-rw-r--r--CORE/SME/inc/pmc.h11
-rw-r--r--CORE/SME/inc/pmcApi.h6
-rw-r--r--CORE/SME/inc/sme_Api.h5
-rw-r--r--CORE/SME/src/pmc/pmc.c15
-rw-r--r--CORE/SME/src/pmc/pmcApi.c41
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c30
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);