summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKanchanapally, Vidyullatha <vkanchan@qti.qualcomm.com>2014-07-30 18:40:17 +0530
committerPitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com>2014-08-06 13:37:07 +0530
commit9b2e8472ee306256d212619e7706bbc4457de3f5 (patch)
treef09b553e4f2c26127aedf01922ed704d948c2ccd
parentc14a3f4694f4d3a1b0294a9c91cfc523ccbe0731 (diff)
qcacld: Do not allow suspend if not in power save.
When cfg80211 suspend is called immediately after roaming, the host misses posting ENTER_BMPS request to firmware since the AutoPSEnableTimer of 5 seconds may not have expired by then. This issue is now addressed by not allowing suspend if STA after connection is not in power save state and by reducing the AutoPSEnableTimer value to 1 second in case of roaming. Change-Id: I78fc77cba699220f1bd4e4f5fc2f5e7e18b40e91 CRs-Fixed: 703065
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c13
-rw-r--r--CORE/SME/inc/pmcApi.h3
-rw-r--r--CORE/SME/inc/smeInside.h1
-rw-r--r--CORE/SME/inc/sme_Api.h12
-rw-r--r--CORE/SME/src/pmc/pmcApi.c39
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c26
7 files changed, 93 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index c845ed746462..5603c8cb6b78 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -2224,7 +2224,8 @@ static eHalStatus hdd_RoamSetKeyCompleteHandler( hdd_adapter_t *pAdapter, tCsrRo
{
sme_PsOffloadEnableDeferredPowerSave(
WLAN_HDD_GET_HAL_CTX(pAdapter),
- pAdapter->sessionId);
+ pAdapter->sessionId,
+ pHddStaCtx->hdd_ReassocScenario);
}
}
else
@@ -3042,6 +3043,7 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId,
(WLAN_HDD_GET_CTX(pAdapter))->hdd_mcastbcast_filter_set = FALSE;
}
pHddStaCtx->ft_carrier_on = FALSE;
+ pHddStaCtx->hdd_ReassocScenario = FALSE;
break;
case eCSR_ROAM_FT_START:
@@ -3204,7 +3206,6 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId,
before the ENTER_BMPS_REQ ensures Listen Interval is
regained back to LI * Modulated DTIM */
hdd_set_pwrparams(pHddCtx);
- pHddStaCtx->hdd_ReassocScenario = VOS_FALSE;
/* At this point, device should not be in BMPS;
if due to unexpected scenario, if we are in BMPS,
@@ -3220,6 +3221,8 @@ hdd_smeRoamCallback(void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U32 roamId,
}
}
halStatus = hdd_RoamSetKeyCompleteHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult );
+ if (eCSR_ROAM_RESULT_AUTHENTICATED == roamResult)
+ pHddStaCtx->hdd_ReassocScenario = VOS_FALSE;
}
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
pRoamInfo->roamSynchInProgress = VOS_FALSE;
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index ea7b8bb1c749..b120375b1b04 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -13446,6 +13446,19 @@ int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy,
hddLog(LOG1, FL("Roaming in progress, do not allow suspend"));
return -EAGAIN;
}
+
+ if (pHddCtx->cfg_ini->enablePowersaveOffload &&
+ pHddCtx->cfg_ini->fIsBmpsEnabled &&
+ ((WLAN_HDD_INFRA_STATION == pAdapter->device_mode) ||
+ (WLAN_HDD_P2P_CLIENT == pAdapter->device_mode))) {
+ if (!sme_PsOffloadIsStaInPowerSave(pHddCtx->hHal,
+ pAdapter->sessionId)) {
+ hddLog(VOS_TRACE_LEVEL_DEBUG,
+ FL("STA is not in power save, Do not allow suspend"));
+ return -EAGAIN;
+ }
+ }
+
if (pScanInfo->mScanPending && pAdapter->request)
{
INIT_COMPLETION(pScanInfo->abortscan_event_var);
diff --git a/CORE/SME/inc/pmcApi.h b/CORE/SME/inc/pmcApi.h
index e60447ffef72..46ee179ceb1e 100644
--- a/CORE/SME/inc/pmcApi.h
+++ b/CORE/SME/inc/pmcApi.h
@@ -635,7 +635,8 @@ tANI_BOOLEAN pmcOffloadIsPowerSaveEnabled (tHalHandle hHal, tANI_U32 sessionId,
tPmcPowerSavingMode psMode);
eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal,
- tANI_U32 sessionId);
+ tANI_U32 sessionId,
+ tANI_BOOLEAN isReassoc);
eHalStatus PmcOffloadDisableDeferredStaModePowerSave(tHalHandle hHal,
tANI_U32 sessionId);
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index 8428dd622070..dcd8f044dd52 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -212,6 +212,7 @@ void purgeSmeSessionCmdList(tpAniSirGlobal pMac, tANI_U32 sessionId,
tANI_BOOLEAN smeCommandPending(tpAniSirGlobal pMac);
tANI_BOOLEAN pmcProcessCommand( tpAniSirGlobal pMac, tSmeCmd *pCommand );
tANI_BOOLEAN pmcOffloadProcessCommand(tpAniSirGlobal pMac,tSmeCmd *pCommand);
+tANI_BOOLEAN pmcOffloadIsStaInPowerSave(tpAniSirGlobal pMac, tANI_U32 sessionId);
//this function is used to abort a command where the normal processing of the command
//is terminated without going through the normal path. it is here to take care of callbacks for
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 40660fcfd3c7..ff60e304de3a 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -3565,7 +3565,8 @@ eHalStatus sme_ConfigDisablePowerSave (tHalHandle hHal, tPmcPowerSavingMode psMo
eHalStatus sme_PsOffloadEnablePowerSave (tHalHandle hHal, tANI_U32 sessionId);
eHalStatus sme_PsOffloadDisablePowerSave (tHalHandle hHal, tANI_U32 sessionId);
eHalStatus sme_PsOffloadEnableDeferredPowerSave (tHalHandle hHal,
- tANI_U32 sessionId);
+ tANI_U32 sessionId,
+ tANI_BOOLEAN isReassoc);
eHalStatus sme_PsOffloadDisableDeferredPowerSave (tHalHandle hHal,
tANI_U32 sessionId);
@@ -3777,6 +3778,15 @@ v_BOOL_t sme_GetDFSScanMode(tHalHandle hHal);
-------------------------------------------------------------------------*/
tANI_BOOLEAN sme_staInMiddleOfRoaming(tHalHandle hHal, tANI_U8 sessionId);
+/* ---------------------------------------------------------------------------
+ \fn sme_PsOffloadIsStaInPowerSave
+ \brief This function returns TRUE if STA is in power save
+ \param hHal - HAL handle for device
+ \param sessionId - Session Identifier
+ \- return TRUE or FALSE
+ -------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_PsOffloadIsStaInPowerSave(tHalHandle hHal, tANI_U8 sessionId);
+
#ifdef FEATURE_WLAN_EXTSCAN
/* ---------------------------------------------------------------------------
\fn sme_GetValidChannelsByBand
diff --git a/CORE/SME/src/pmc/pmcApi.c b/CORE/SME/src/pmc/pmcApi.c
index e7a15c8c5895..50bc4c9e45aa 100644
--- a/CORE/SME/src/pmc/pmcApi.c
+++ b/CORE/SME/src/pmc/pmcApi.c
@@ -3917,6 +3917,31 @@ eHalStatus pmcOffloadStopUapsd(tHalHandle hHal, tANI_U32 sessionId)
return status;
}
+tANI_BOOLEAN pmcOffloadIsStaInPowerSave(tpAniSirGlobal pMac, tANI_U32 sessionId)
+{
+ tpPsOffloadPerSessionInfo pmc;
+ tANI_BOOLEAN StainPS = TRUE;
+
+ if(!CSR_IS_SESSION_VALID(pMac, sessionId))
+ {
+ smsLog(pMac, LOGE, FL("Invalid SessionId %x"), sessionId);
+ return TRUE;
+ }
+
+ /* Check whether the give session is Infra and in Connected State */
+ if(!csrIsConnStateConnectedInfra(pMac, sessionId))
+ {
+ smsLog(pMac, LOG1, FL("Sta not infra/connected state %d"), sessionId);
+ return TRUE;
+ }
+ else
+ {
+ pmc = &pMac->pmcOffloadInfo.pmc[sessionId];
+ StainPS = (pmc->pmcState == BMPS) || (pmc->pmcState == UAPSD);
+ return StainPS;
+ }
+}
+
tANI_BOOLEAN pmcOffloadProcessCommand(tpAniSirGlobal pMac, tSmeCmd *pCommand)
{
eHalStatus status = eHAL_STATUS_SUCCESS;
@@ -4236,11 +4261,13 @@ tANI_BOOLEAN pmcOffloadIsPowerSaveEnabled (tHalHandle hHal, tANI_U32 sessionId,
}
eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal,
- tANI_U32 sessionId)
+ tANI_U32 sessionId,
+ tANI_BOOLEAN isReassoc)
{
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
tpPsOffloadPerSessionInfo pmc = &pMac->pmcOffloadInfo.pmc[sessionId];
eHalStatus status = eHAL_STATUS_FAILURE;
+ tANI_U32 timer_value;
if (!pMac->pmcOffloadInfo.staPsEnabled)
{
@@ -4249,8 +4276,16 @@ eHalStatus PmcOffloadEnableDeferredStaModePowerSave(tHalHandle hHal,
return status;
}
+ if(isReassoc)
+ timer_value = AUTO_PS_ENTRY_TIMER_DEFAULT_VALUE;
+ else
+ timer_value = AUTO_DEFERRED_PS_ENTRY_TIMER_DEFAULT_VALUE;
+
+ pmcLog(pMac, LOG1, FL("Start AutoPsTimer for %d isReassoc:%d "),
+ timer_value, isReassoc);
+
status = pmcOffloadStartAutoStaPsTimer(pMac, sessionId,
- AUTO_DEFERRED_PS_ENTRY_TIMER_DEFAULT_VALUE);
+ timer_value);
if (eHAL_STATUS_SUCCESS == status)
{
smsLog(pMac, LOG2,
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 2d385ad5fecf..011453c6be4e 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -12194,7 +12194,8 @@ eHalStatus sme_PsOffloadDisablePowerSave (tHalHandle hHal, tANI_U32 sessionId)
}
eHalStatus sme_PsOffloadEnableDeferredPowerSave (tHalHandle hHal,
- tANI_U32 sessionId)
+ tANI_U32 sessionId,
+ tANI_BOOLEAN isReassoc)
{
eHalStatus status = eHAL_STATUS_FAILURE;
tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
@@ -12202,7 +12203,8 @@ eHalStatus sme_PsOffloadEnableDeferredPowerSave (tHalHandle hHal,
status = sme_AcquireGlobalLock(&pMac->sme);
if (HAL_STATUS_SUCCESS( status ))
{
- status = PmcOffloadEnableDeferredStaModePowerSave(hHal, sessionId);
+ status = PmcOffloadEnableDeferredStaModePowerSave(hHal, sessionId,
+ isReassoc);
sme_ReleaseGlobalLock( &pMac->sme );
}
return (status);
@@ -13126,6 +13128,26 @@ tANI_BOOLEAN sme_staInMiddleOfRoaming(tHalHandle hHal, tANI_U8 sessionId)
return ret;
}
+/* ---------------------------------------------------------------------------
+ \fn sme_PsOffloadIsStaInPowerSave
+ \brief This function returns TRUE if STA is in power save
+ \param hHal - HAL handle for device
+ \param sessionId - Session Identifier
+ \return TRUE or FALSE
+ -------------------------------------------------------------------------*/
+tANI_BOOLEAN sme_PsOffloadIsStaInPowerSave(tHalHandle hHal, tANI_U8 sessionId)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tANI_BOOLEAN ret = FALSE;
+
+ if (eHAL_STATUS_SUCCESS == (status = sme_AcquireGlobalLock(&pMac->sme))) {
+ ret = pmcOffloadIsStaInPowerSave(pMac, sessionId);
+ sme_ReleaseGlobalLock(&pMac->sme);
+ }
+ return ret;
+}
+
VOS_STATUS sme_UpdateDSCPtoUPMapping( tHalHandle hHal,
sme_QosWmmUpType *dscpmapping,
v_U8_t sessionId )