wlan: Do not let APPS suspend if roaming is in progress
If the Apps enters power collapse (suspend) during roaming (lfr
bgscan split scan, full scan, pre-auth or reassociation);
this shall lead to heart beat failures.
Fix this by protecting entire roaming process by voting
-ve and not letting APPS to power collapse.
CRs-Fixed: 456176
Change-Id: I440fdb02c439a1f8754099ad9acf8eafe4158d4b
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 98f6e7f..7f79fb3 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -4760,6 +4760,7 @@
{
tPmcState pmcState = pmcGetPmcState(pHddCtx->hHal);
tANI_BOOLEAN scanRspPending = csrNeighborRoamScanRspPending(pHddCtx->hHal);
+ tANI_BOOLEAN inMiddleOfRoaming = csrNeighborMiddleOfRoaming(pHddCtx->hHal);
hdd_config_t *pConfig = pHddCtx->cfg_ini;
hdd_adapter_list_node_t *pAdapterNode = NULL, *pNext = NULL;
hdd_adapter_t *pAdapter = NULL;
@@ -4789,11 +4790,12 @@
if (((pConfig->fIsImpsEnabled || pConfig->fIsBmpsEnabled)
&& (pmcState != IMPS && pmcState != BMPS
&& pmcState != STOPPED && pmcState != STANDBY)) ||
- (eANI_BOOLEAN_TRUE == scanRspPending))
+ (eANI_BOOLEAN_TRUE == scanRspPending) ||
+ (eANI_BOOLEAN_TRUE == inMiddleOfRoaming))
{
hddLog( LOGE, "%s: do not allow APPS power collapse-"
- "pmcState = %d scanRspPending = %d",
- __func__, pmcState, scanRspPending );
+ "pmcState = %d scanRspPending = %d inMiddleOfRoaming = %d",
+ __func__, pmcState, scanRspPending, inMiddleOfRoaming );
return FALSE;
}
}
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 7d2e2c6..54a3a39 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -234,6 +234,7 @@
void csrNeighborRoamTranistionPreauthDoneToDisconnected(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamStatePreauthDone(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamScanRspPending(tHalHandle hHal);
+tANI_BOOLEAN csrNeighborMiddleOfRoaming(tHalHandle hHal);
VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold);
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 706a8ee..a2e193c 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -3961,4 +3961,23 @@
return (pMac->roam.neighborRoamInfo.scanRspPending);
}
+/* ---------------------------------------------------------------------------
+ \brief This function returns TRUE if STA is in the middle of roaming states
+
+ \param halHandle - The handle from HDD context.
+
+ \return boolean
+
+---------------------------------------------------------------------------*/
+tANI_BOOLEAN csrNeighborMiddleOfRoaming (tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ tANI_BOOLEAN val = (eCSR_NEIGHBOR_ROAM_STATE_REASSOCIATING == pMac->roam.neighborRoamInfo.neighborRoamState) ||
+ (eCSR_NEIGHBOR_ROAM_STATE_PREAUTHENTICATING == pMac->roam.neighborRoamInfo.neighborRoamState) ||
+ (eCSR_NEIGHBOR_ROAM_STATE_PREAUTH_DONE == pMac->roam.neighborRoamInfo.neighborRoamState) ||
+ (eCSR_NEIGHBOR_ROAM_STATE_REPORT_SCAN == pMac->roam.neighborRoamInfo.neighborRoamState) ||
+ (eCSR_NEIGHBOR_ROAM_STATE_CFG_CHAN_LIST_SCAN == pMac->roam.neighborRoamInfo.neighborRoamState);
+ return (val);
+}
+
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */