wlan: FirstSet of Run Time Config variables
Support for run time configuration of
1. GET/SET ROAM DELTA
2. GET/SET ROAM SCAN PERIOD
3. GET/SET ROAM SCAN CHANNELS
4. GET/SET COUNTRYREV
6. GET/SET BAND
7. GET/SET ROAMTRIGGER
Prefer5G, RssiCatCap, FWMonitoring is removed from the ini
if LFR/CCX is enabled, FW RSSI Monitoring is enabled internally
CRs-Fixed: 450908
Change-Id: I21755ace757479949ef711ff4501c331fd333cc9
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index c1d764f..87253a6 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -233,6 +233,14 @@
tANI_U8 *ChannelList; //it will be an array of channels
}tCsrChannelInfo, *tpCsrChannelInfo;
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+typedef struct tagCsrCountryChannelInfo
+{
+ tCsrChannelInfo countryValidChannelList;
+ tANI_U8 revision; /* KR 25, 25 is the country revision index
+ to the list of valid channels */
+}tCsrCountryChannelInfo, *tpCsrCountryChannelInfo;
+#endif
typedef struct tagCsrSSIDInfo
{
tSirMacSSid SSID;
@@ -924,6 +932,7 @@
sCsrChannel neighborScanChanList;
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
+ tANI_U16 nEmptyScanRefreshPeriod;
}tCsrNeighborRoamConfigParams;
#endif
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 73c58ef..3d29840 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -498,6 +498,7 @@
sCsrChannel neighborScanChanList;
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
+ tANI_U16 nEmptyScanRefreshPeriod;
}tCsrNeighborRoamConfig;
#endif
@@ -1053,6 +1054,9 @@
#define CSR_IS_CHANNEL_5GHZ(chnNum) \
(((chnNum) >= CSR_MIN_5GHz_CHANNEL_NUMBER) && ((chnNum) <= CSR_MAX_5GHz_CHANNEL_NUMBER))
+#define CSR_IS_CHANNEL_DFS(chnNum) \
+ (NV_CHANNEL_ENABLE != vos_nv_getChannelEnabledState(chnNum))
+
#define CSR_IS_CHANNEL_24GHZ(chnNum) \
(((chnNum) > 0) && ((chnNum) <= CSR_MAX_24GHz_CHANNEL_NUMBER))
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 1c3ff4d..7d2e2c6 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -84,6 +84,10 @@
tANI_U32 minChannelScanTime;
tANI_U32 maxChannelScanTime;
tANI_U16 neighborResultsRefreshPeriod;
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+ tCsrCountryChannelInfo countryChannelInfo;
+#endif
+ tANI_U16 emptyScanRefreshPeriod;
} tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams;
#define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255
@@ -160,7 +164,14 @@
eThirdEmptyScan,
eFourthEmptyScan,
eFifthEmptyScan,
+ eMaxEmptyScan=eFifthEmptyScan,
} eNeighborRoamEmptyScanCount;
+
+typedef enum
+{
+ DEFAULT_SCAN=0,
+ SPLIT_SCAN_OCCUPIED_LIST=1,
+} eNeighborRoamScanMode;
#endif
/* Complete control information for neighbor roam algorithm */
@@ -173,6 +184,7 @@
tANI_U8 currAPoperationChannel; // current assoc AP
tPalTimerHandle neighborScanTimer;
tPalTimerHandle neighborResultsRefreshTimer;
+ tPalTimerHandle emptyScanRefreshTimer;
tCsrTimerInfo neighborScanTimerInfo;
tCsrNeighborRoamChannelInfo roamChannelInfo;
tANI_U8 currentNeighborLookupThreshold;
@@ -197,6 +209,7 @@
new profile does not match previous
we re-initialize occupied channel list */
tANI_S8 lookupDOWNRssi;
+ tANI_U8 uScanMode;
#endif
} tCsrNeighborRoamControlInfo, *tpCsrNeighborRoamControlInfo;
@@ -221,7 +234,7 @@
void csrNeighborRoamTranistionPreauthDoneToDisconnected(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamStatePreauthDone(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamScanRspPending(tHalHandle hHal);
-v_U8_t *csrNeighborRoamStateToString(v_U8_t state);
+VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold);
#endif /* WLAN_FEATURE_NEIGHBOR_ROAMING */
diff --git a/CORE/SME/inc/smeInside.h b/CORE/SME/inc/smeInside.h
index abae34d..e99f94f 100644
--- a/CORE/SME/inc/smeInside.h
+++ b/CORE/SME/inc/smeInside.h
@@ -301,7 +301,16 @@
eHalStatus csrTdlsTeardownReq(tHalHandle hHal, tANI_U8 sessionId,
tCsrTdlsTeardownRequest *teardown);
#endif
-
#endif /* FEATURE_WLAN_TDLS */
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+eHalStatus csrFlushAndCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
+ const tANI_U8 *pChannelList,
+ const tANI_U8 numChannels);
+eHalStatus csrUpdateBgScanConfigIniChannelList(tpAniSirGlobal pMac, eCsrBand eBand);
+eHalStatus csrInitCountryValidChannelList(tpAniSirGlobal pMac, tANI_U8 revision);
+void csr_SetRevision(tpAniSirGlobal pMac, tANI_U8 revision);
+#endif
+
+
#endif //#if !defined( __SMEINSIDE_H )
diff --git a/CORE/SME/inc/smeInternal.h b/CORE/SME/inc/smeInternal.h
index 4a13731..bca3dc6 100644
--- a/CORE/SME/inc/smeInternal.h
+++ b/CORE/SME/inc/smeInternal.h
@@ -131,6 +131,16 @@
SME_STATE_READY,
} eSmeState;
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+/* enumeration for Korea country revision index,
+ index to the list of valid channels */
+typedef enum eSmeKRRevision
+{
+ SME_KR_3 = 3,
+ SME_KR_24 = 24,
+ SME_KR_25 = 25,
+} eSmeKRRevision;
+#endif
#define SME_IS_START(pMac) (SME_STATE_STOP != (pMac)->sme.state)
#define SME_IS_READY(pMac) (SME_STATE_READY == (pMac)->sme.state)
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 12598c2..b37c141 100755
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2257,6 +2257,20 @@
eHalStatus sme_UpdateImmediateRoamRssiDiff(tHalHandle hHal, v_U8_t nImmediateRoamRssiDiff);
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateRoamRssiDiff
+ \brief Update RoamRssiDiff
+ This function is called through dynamic setConfig callback function
+ to configure RoamRssiDiff
+ Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
+ \param hHal - HAL handle for device
+ \param RoamRssiDiff - minimum rssi difference between potential
+ candidate and current AP.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateRoamRssiDiff(tHalHandle hHal, v_U8_t RoamRssiDiff);
+
/*--------------------------------------------------------------------------
\brief sme_UpdateFastTransitionEnabled() - enable/disable Fast Transition support at runtime
It is used at in the REG_DYNAMIC_VARIABLE macro definition of
@@ -2275,7 +2289,7 @@
#ifdef FEATURE_WLAN_LFR
/*--------------------------------------------------------------------------
\brief sme_UpdateIsFastRoamIniFeatureEnabled() - enable/disable LFR support at runtime
- It is used at in the REG_DYNAMIC_VARIABLE macro definition of
+ It is used at in the REG_DYNAMIC_VARIABLE macro definition of
isFastRoamIniFeatureEnabled.
This is a synchronuous call
\param hHal - The handle returned by macOpen.
@@ -2284,7 +2298,7 @@
\sa
--------------------------------------------------------------------------*/
-eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled(tHalHandle hHal,
+eHalStatus sme_UpdateIsFastRoamIniFeatureEnabled(tHalHandle hHal,
v_BOOL_t isFastRoamIniFeatureEnabled);
#endif /* FEATURE_WLAN_LFR */
@@ -2319,6 +2333,152 @@
eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
v_BOOL_t fEnableFwRssiMonitoring);
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborLookupRssiThreshold(tHalHandle hHal,
+ v_U8_t neighborLookupRssiThreshold);
+
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborReassocRssiThreshold() - update neighbor reassoc rssi threshold
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborReassocRssiThreshold(tHalHandle hHal,
+ v_U8_t neighborReassocRssiThreshold);
+
+/*--------------------------------------------------------------------------
+ \brief sme_getNeighborLookupRssiThreshold() - get neighbor lookup rssi threshold
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_getNeighborLookupRssiThreshold(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborScanRefreshPeriod() - set neighbor scan results refresh period
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanRefreshPeriod(tHalHandle hHal,
+ v_U16_t neighborScanResultsRefreshPeriod);
+
+/*--------------------------------------------------------------------------
+ \brief sme_getNeighborScanRefreshPeriod() - get neighbor scan results refresh period
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanRefreshPeriod(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_getEmptyScanRefreshPeriod() - get empty scan refresh period
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U16_t sme_getEmptyScanRefreshPeriod(tHalHandle hHal);
+
+
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+/*--------------------------------------------------------------------------
+ \brief sme_getRoamRssiDiff() - get Roam rssi diff
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_getRoamRssiDiff(tHalHandle hHal);
+
+/*--------------------------------------------------------------------------
+ \brief sme_ChangeRoamScanChannelList() - Change roam scan channel list
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_ChangeRoamScanChannelList(tHalHandle hHal, tANI_U8 *pChannelList,
+ tANI_U8 numChannels);
+
+/*--------------------------------------------------------------------------
+ \brief sme_ChangeCountryValidChannelListByRevision() - Change Korea valid channel list
+ based on country revision number
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_ChangeCountryValidChannelListByRevision(tHalHandle hHal,
+ tANI_U8 Revision);
+
+/*--------------------------------------------------------------------------
+ \brief csrUpdateBgScanConfigIniChannelList() - Update bgscan roam cache
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_UpdateBgScanConfigIniChannelList(tHalHandle hHal,
+ eCsrBand eBand);
+
+
+/*--------------------------------------------------------------------------
+ \brief sme_getRoamScanChannelList() - get roam scan channel list
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_getRoamScanChannelList(tHalHandle hHal, tANI_U8 *pChannelList,
+ tANI_U8 *pNumChannels);
+
+/*--------------------------------------------------------------------------
+ \brief sme_GetCountryRevision() - get Country revision index
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_GetCountryRevision(tHalHandle hHal, tANI_U8 *pRevision);
+
+#endif
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateEmptyScanRefreshPeriod
+ \brief Update nnEmptyScanRefreshPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nnEmptyScanRefreshPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nEmptyScanRefreshPeriod - scan period following empty scan results.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod);
+
/* ---------------------------------------------------------------------------
\fn sme_IsFeatureSupportedByFW
\brief Check if an feature is enabled by FW
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 27d5519..d8a57aa 100755
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -123,6 +123,17 @@
Static Type declarations
------------------------------------------------------------------------*/
static tCsrRoamSession csrRoamRoamSession[CSR_ROAM_SESSION_MAX];
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+static const char KR_3[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 36, 40, 44, 48, 52, 56, 60, 64, 100, 104,
+ 108, 112, 116, 120, 124, 149, 153, 157, 161};
+static const char KR_24[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 36, 40, 44, 48, 52, 56, 60, 64, 100, 104,
+ 108, 112, 116, 120, 124, 149, 153, 157, 161};
+static const char KR_25[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 36, 40, 44, 48, 149, 153, 157, 161};
+#endif
+
/*--------------------------------------------------------------------------
Type declarations
------------------------------------------------------------------------*/
@@ -966,6 +977,7 @@
pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[1] = 6;
pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList[2] = 11;
pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod = 20000; //20 seconds
+ pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod = 0;
#endif
#ifdef WLAN_FEATURE_11AC
pMac->roam.configParam.nVhtChannelWidth = WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
@@ -984,6 +996,209 @@
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
return pMac->roam.configParam.bandCapability;
}
+
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+tANI_BOOLEAN csrIsChannelInCountryValidList(tpAniSirGlobal pMac, tANI_U8 channel)
+{
+ /* Get country code from CFG */
+ tANI_U8 *pCountryCode = pMac->scan.countryCodeCurrent;
+ tANI_U8 i = 0;
+ v_BOOL_t retVal = FALSE;
+ tANI_U8 *pCountryValidChannelList = pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.countryValidChannelList.ChannelList;
+ tANI_U8 *pNumChannels = &pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.countryValidChannelList.numOfChannels;
+
+ /* Compare against KR valid list */
+ if ((0 == strncmp(pCountryCode, "KR", 2)) &&
+ (NULL != pCountryValidChannelList))
+ {
+ for (i = 0; i <(*pNumChannels); i++)
+ {
+ if (channel == pCountryValidChannelList[i])
+ {
+ retVal = TRUE;
+ break;
+ }
+ }
+ }
+ else
+ {
+ retVal = csrRoamIsChannelValid(pMac, channel);
+ }
+
+ return retVal;
+}
+
+void csr_SetRevision(tpAniSirGlobal pMac, tANI_U8 revision)
+{
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ pNeighborRoamInfo->cfgParams.countryChannelInfo.revision = revision;
+}
+
+/*
+ This function flushes the roam scan cache and creates fresh cache
+ based on the input channel list
+*/
+eHalStatus csrFlushAndCreateBgScanRoamChannelList(tpAniSirGlobal pMac,
+ const tANI_U8 *pChannelList,
+ const tANI_U8 numChannels)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+
+ /* Free up the memory first (if required) */
+ if (NULL != pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ {
+ vos_mem_free(pNeighborRoamInfo->cfgParams.channelInfo.ChannelList);
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
+ }
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels = numChannels;
+
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList =
+ vos_mem_malloc(pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels);
+
+ if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ {
+ smsLog(pMac, LOGE, FL("Memory Allocation for CFG Channel List failed"));
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels = 0;
+ return eHAL_STATUS_RESOURCES;
+ }
+
+ /* Update the roam global structure */
+ palCopyMemory(pMac->hHdd, pNeighborRoamInfo->cfgParams.channelInfo.ChannelList,
+ pChannelList,
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels);
+ return status;
+}
+
+/* This function modifies the bgscan channel list set via config ini or
+ runtime, whenever the band changes.
+ if the band is auto, then no operation is performed on the channel list
+ if the band is 2.4G, then make sure channel list contains only 2.4G valid channels
+ if the band is 5G, then make sure channel list contains only 5G valid channels
+*/
+eHalStatus csrUpdateBgScanConfigIniChannelList(tpAniSirGlobal pMac,
+ eCsrBand eBand)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ tANI_U8 outNumChannels = 0;
+ tANI_U8 inNumChannels = 0;
+ tANI_U8 *inPtr = NULL;
+ tANI_U8 i = 0;
+ tANI_U8 ChannelList[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
+
+ if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "No update required for channel list "
+ "either cfg.ini channel list is not set up or "
+ "auto band (Band %d)", eBand);
+ return status;
+ }
+
+ inNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
+ inPtr = pNeighborRoamInfo->cfgParams.channelInfo.ChannelList;
+ if (eCSR_BAND_24 == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ if (CSR_IS_CHANNEL_24GHZ(inPtr[i]) && csrIsChannelInCountryValidList(pMac, inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ }
+ else if (eCSR_BAND_5G == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ /* Add 5G Non-DFS channel */
+ if (CSR_IS_CHANNEL_5GHZ(inPtr[i]) &&
+ csrIsChannelInCountryValidList(pMac, inPtr[i]) &&
+ !CSR_IS_CHANNEL_DFS(inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ }
+ else if (eCSR_BAND_ALL == eBand)
+ {
+ for (i = 0; i < inNumChannels; i++)
+ {
+ if (csrIsChannelInCountryValidList(pMac, inPtr[i]) &&
+ !CSR_IS_CHANNEL_DFS(inPtr[i]))
+ {
+ ChannelList[outNumChannels++] = inPtr[i];
+ }
+ }
+ csrFlushAndCreateBgScanRoamChannelList(pMac, ChannelList, outNumChannels);
+ }
+ else
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
+ "Invalid band, No operation carried out (Band %d)", eBand);
+ status = eHAL_STATUS_INVALID_PARAMETER;
+ }
+
+ return status;
+}
+
+/*
+ This function initializes the valid channel list based on country code
+*/
+eHalStatus csrInitCountryValidChannelList(tpAniSirGlobal pMac,
+ tANI_U8 Revision)
+{
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ tANI_U8 *pOutChannelList = pNeighborRoamInfo->cfgParams.countryChannelInfo.countryValidChannelList.ChannelList;
+ tANI_U8 *pNumChannels = &pNeighborRoamInfo->cfgParams.countryChannelInfo.countryValidChannelList.numOfChannels;
+ const tANI_U8 *pChannelList = NULL;
+
+ if (SME_KR_3 == Revision)
+ {
+ pChannelList = KR_3;
+ *pNumChannels = sizeof(KR_3)/sizeof(KR_3[0]);
+ }
+ else if (SME_KR_24 == Revision)
+ {
+ pChannelList = KR_24;
+ *pNumChannels = sizeof(KR_24)/sizeof(KR_24[0]);
+ }
+ else if (SME_KR_25 == Revision)
+ {
+ pChannelList = KR_25;
+ *pNumChannels = sizeof(KR_25)/sizeof(KR_25[0]);
+ }
+ else
+ return eHAL_STATUS_INVALID_PARAMETER;
+
+ /* Free up the memory first */
+ if (NULL != pOutChannelList)
+ {
+ vos_mem_free(pOutChannelList);
+ pOutChannelList = NULL;
+ }
+
+ pOutChannelList = vos_mem_malloc(*pNumChannels);
+
+ if (NULL == pOutChannelList)
+ {
+ smsLog(pMac, LOGE, FL("Memory Allocation for CFG Channel List failed"));
+ *pNumChannels = 0;
+ return eHAL_STATUS_RESOURCES;
+ }
+
+ /* Update the roam global structure */
+ palCopyMemory(pMac->hHdd, pOutChannelList, pChannelList, *pNumChannels);
+ return status;
+}
+
+#endif
+
eHalStatus csrSetBand(tHalHandle hHal, eCsrBand eBand)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
@@ -991,10 +1206,10 @@
if (CSR_IS_PHY_MODE_A_ONLY(pMac) &&
(eBand == eCSR_BAND_24))
{
- /* DOT11 mode configured to 11a only and received
+ /* DOT11 mode configured to 11a only and received
request to change the band to 2.4 GHz */
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
- "failed to set band cfg80211 = %u, band = %u\n",
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "failed to set band cfg80211 = %u, band = %u\n",
pMac->roam.configParam.uCfgDot11Mode, eBand);
return eHAL_STATUS_INVALID_PARAMETER;
}
@@ -1002,23 +1217,28 @@
CSR_IS_PHY_MODE_G_ONLY(pMac)) &&
(eBand == eCSR_BAND_5G))
{
- /* DOT11 mode configured to 11b/11g only and received
+ /* DOT11 mode configured to 11b/11g only and received
request to change the band to 5 GHz */
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
- "failed to set band dot11mode = %u, band = %u\n",
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,
+ "failed to set band dot11mode = %u, band = %u\n",
pMac->roam.configParam.uCfgDot11Mode, eBand);
return eHAL_STATUS_INVALID_PARAMETER;
}
- VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
"Band changed to %u (0 - ALL, 1 - 2.4 GHZ, 2 - 5GHZ)\n", eBand);
- pMac->roam.configParam.eBand = eBand;
- pMac->roam.configParam.bandCapability = eBand;
+ pMac->roam.configParam.eBand = eBand;
+ pMac->roam.configParam.bandCapability = eBand;
csrScanGetSupportedChannels( pMac );
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+ csrUpdateBgScanConfigIniChannelList( pMac, eBand );
+#endif
status = csrInitGetChannels( pMac );
if (eHAL_STATUS_SUCCESS == status)
csrInitChannelList( hHal );
return status;
}
+
+
/* The funcns csrConvertCBIniValueToPhyCBState and csrConvertPhyCBStateToIniValue have been
* introduced to convert the ini value to the ENUM used in csr and MAC for CB state
* Ideally we should have kept the ini value and enum value same and representing the same
@@ -1323,8 +1543,9 @@
smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
- smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
- smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
+ smsLog( pMac, LOG1, "nMaxNeighborRetries = %d\n", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
+ smsLog( pMac, LOG1, "nNeighborResultsRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod);
+ smsLog( pMac, LOG1, "nEmptyScanRefreshPeriod = %d\n", pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod);
{
int i;
smsLog( pMac, LOG1, FL("Num of Channels in CFG Channel List: %d\n"), pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels);
diff --git a/CORE/SME/src/csr/csrApiScan.c b/CORE/SME/src/csr/csrApiScan.c
index 970be45..59b6b07 100755
--- a/CORE/SME/src/csr/csrApiScan.c
+++ b/CORE/SME/src/csr/csrApiScan.c
@@ -5503,8 +5503,7 @@
*/
|| ((eCSR_SCAN_HO_BG_SCAN == pSrcReq->requestType) &&
(pSrcReq->ChannelInfo.numOfChannels > 1) &&
- (pSrcReq->ChannelInfo.ChannelList[index] > 48 &&
- pSrcReq->ChannelInfo.ChannelList[index] < 149))
+ (CSR_IS_CHANNEL_DFS(pSrcReq->ChannelInfo.ChannelList[index])))
#endif
)
{
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index 7e8addd..706a8ee 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -328,6 +328,46 @@
}
}
+VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold)
+{
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED == pNeighborRoamInfo->neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in CONNECTED state, so deregister all and re-register for DOWN event again"));
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+ csrNeighborRoamDeregAllRssiIndication(pMac);
+ pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold = neighborLookupRssiThreshold;
+ pNeighborRoamInfo->currentNeighborLookupThreshold = pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold;
+
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Registering neighbor lookup DOWN event with TL, RSSI = %d"), pNeighborRoamInfo->currentNeighborLookupThreshold);
+ /* Register Neighbor Lookup threshold callback with TL for DOWN event only */
+ vosStatus = WLANTL_RegRSSIIndicationCB(pMac->roam.gVosContext, (v_S7_t)pNeighborRoamInfo->currentNeighborLookupThreshold * (-1),
+ WLANTL_HO_THRESHOLD_DOWN,
+ csrNeighborRoamNeighborLookupDOWNCallback,
+ VOS_MODULE_ID_SME, pMac);
+ if (!VOS_IS_STATUS_SUCCESS(vosStatus))
+ {
+ //err msg
+ smsLog(pMac, LOGW, FL(" Couldn't register csrNeighborRoamNeighborLookupDOWNCallback with TL: Status = %d"), vosStatus);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT == pNeighborRoamInfo->neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, FL("Currently in INIT state, safe to set lookupRssi threshold"));
+ pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold = neighborLookupRssiThreshold;
+ pNeighborRoamInfo->currentNeighborLookupThreshold = pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold;
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Unexpected state %d, returning failure"), pNeighborRoamInfo->neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
/* ---------------------------------------------------------------------------
\fn csrNeighborRoamReassocIndCallback
@@ -383,6 +423,7 @@
/* We dont need to run this timer any more. */
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerStop(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
csrNeighborRoamTriggerHandoff(pMac, pNeighborRoamInfo);
@@ -421,6 +462,9 @@
/* Stop neighbor scan results refresh timer */
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ /* Stop empty scan results refresh timer */
+ palTimerStop(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
+
/* Abort any ongoing scan */
if (eANI_BOOLEAN_TRUE == pNeighborRoamInfo->scanRspPending)
{
@@ -518,6 +562,7 @@
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
+ pNeighborRoamInfo->uScanMode = DEFAULT_SCAN;
#endif
}
@@ -543,6 +588,7 @@
/* We dont need to run this timer any more. */
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerStop(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
#ifdef WLAN_FEATURE_VOWIFI_11R
/* Do not free up the preauth done list here */
@@ -570,6 +616,8 @@
/* Stop scan refresh timer */
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ /* Stop empty scan results refresh timer */
+ palTimerStop(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
/* Purge roamable AP list */
csrNeighborRoamFreeRoamableBSSList(pMac, &pNeighborRoamInfo->roamableAPList);
return;
@@ -1357,12 +1405,16 @@
VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
eHalStatus status = eHAL_STATUS_SUCCESS;
+#ifdef FEATURE_WLAN_LFR
+ tANI_BOOLEAN performPeriodicScan =
+ (pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod) ? TRUE : FALSE;
+#endif
/* Stop neighbor scan timer */
status = palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
if (eHAL_STATUS_SUCCESS != status)
{
- smsLog(pMac, LOGW, FL(" palTimerStop failed with status %d\n"), status);
+ smsLog(pMac, LOGW, FL("stopping neighborScanTimer failed with status %d\n"), status);
}
/*
@@ -1376,6 +1428,25 @@
{
pNeighborRoamInfo->uEmptyScanCount = eFifthEmptyScan;
}
+ if ((abs(pNeighborRoamInfo->lookupDOWNRssi) >
+ abs(pNeighborRoamInfo->cfgParams.neighborReassocThreshold)) &&
+ ((pNeighborRoamInfo->uEmptyScanCount == eSecondEmptyScan) ||
+ (pNeighborRoamInfo->uEmptyScanCount == eFourthEmptyScan)))
+ {
+ /*
+ * If the scan was triggered due to lookupDOWNRssi > reassoc threshold,
+ * then it would be a contiguous scan on all valid non-DFS channels.
+ * In this mode, there is no need to trigger an immediate scan upon
+ * empty scan results for the second and fourth time (which would
+ * be equivalent to scanning on channels in non-occupied list).
+ * Incrementing uEmptyScanCount will correspond to skipping this step.
+ * NOTE: double increment of uEmptyScanCount corresponds to completion
+ * of scans on all valid channels.
+ */
+ ++pNeighborRoamInfo->uEmptyScanCount;
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, "Extra increment of empty scan count (=%d)"
+ " in contiguous scan mode", pNeighborRoamInfo->uEmptyScanCount);
+ }
#endif
if (((pNeighborRoamInfo->currentNeighborLookupThreshold+3) <
pNeighborRoamInfo->cfgParams.neighborReassocThreshold)
@@ -1431,31 +1502,65 @@
/* Immediately scan on channels in non-occupied list */
csrNeighborRoamTransitToCFGChanScan(pMac);
}
- else if (pNeighborRoamInfo->uEmptyScanCount == eThirdEmptyScan)
+ else if (pNeighborRoamInfo->uEmptyScanCount >= eThirdEmptyScan)
{
/* Empty scan results for the third time */
+ if (performPeriodicScan)
+ {
+ smsLog(pMac, LOGE, FL("Performing periodic scan, uEmptyScanCount=%d"),
+ pNeighborRoamInfo->uEmptyScanCount);
- /* Start neighbor scan results refresh timer */
- if (eHAL_STATUS_SUCCESS !=
- palTimerStart(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer,
- pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod * PAL_TIMER_TO_MS_UNIT,
- eANI_BOOLEAN_FALSE))
- {
- smsLog(pMac, LOGE, FL("Neighbor results refresh timer failed to start (%d)"),
- status);
- vos_mem_free(pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList);
- pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList = NULL;
- vosStatus = VOS_STATUS_E_FAILURE;
+ /*
+ * Set uEmptyScanCount to MAX so that we always enter this
+ * condition on subsequent empty scan results
+ */
+ pNeighborRoamInfo->uEmptyScanCount = eMaxEmptyScan;
+
+ /* From here on, ONLY scan on channels in the occupied list */
+ pNeighborRoamInfo->uScanMode = SPLIT_SCAN_OCCUPIED_LIST;
+
+ /* Start empty scan refresh timer */
+ if (eHAL_STATUS_SUCCESS !=
+ palTimerStart(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer,
+ pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod * PAL_TIMER_TO_MS_UNIT,
+ eANI_BOOLEAN_FALSE))
+ {
+ smsLog(pMac, LOGE, FL("Empty scan refresh timer failed to start (%d)"),
+ status);
+ vos_mem_free(pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList);
+ pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList = NULL;
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ else
+ {
+ smsLog(pMac, LOGE, FL("Empty scan refresh timer started (%ld ms)"),
+ (pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod));
+ }
}
else
{
- smsLog(pMac, LOG2, FL("Neighbor results refresh timer started (%ld ms)"),
- (pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod * PAL_TIMER_TO_MS_UNIT));
+ /* Start neighbor scan results refresh timer */
+ if (eHAL_STATUS_SUCCESS !=
+ palTimerStart(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer,
+ pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod * PAL_TIMER_TO_MS_UNIT,
+ eANI_BOOLEAN_FALSE))
+ {
+ smsLog(pMac, LOGE, FL("Neighbor results refresh timer failed to start (%d)"),
+ status);
+ vos_mem_free(pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList);
+ pNeighborRoamInfo->roamChannelInfo.currentChannelListInfo.ChannelList = NULL;
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ else
+ {
+ smsLog(pMac, LOG2, FL("Neighbor results refresh timer started (%ld ms)"),
+ (pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod * PAL_TIMER_TO_MS_UNIT));
+ }
}
}
- NEIGHBOR_ROAM_DEBUG(pMac, LOG2, "Neighbor roam empty scan count=%d",
- pNeighborRoamInfo->uEmptyScanCount);
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, "Neighbor roam empty scan count=%d scan mode=%d",
+ pNeighborRoamInfo->uEmptyScanCount, pNeighborRoamInfo->uScanMode);
#endif
return vosStatus;
}
@@ -1514,6 +1619,7 @@
* after the scan, reset empty scan count.
*/
pNeighborRoamInfo->uEmptyScanCount = 0;
+ pNeighborRoamInfo->uScanMode = DEFAULT_SCAN;
#endif
#ifdef WLAN_FEATURE_VOWIFI_11R
/* If this is a non-11r association, then we can register the reassoc callback here as we have some
@@ -1748,6 +1854,12 @@
return eHAL_STATUS_SUCCESS;
}
+ if (eCSR_NEIGHBOR_ROAM_STATE_INIT == pNeighborRoamInfo->neighborRoamState)
+ {
+ smsLog(pMac, LOGE, FL("Received in INIT state. Must have disconnected. Ignore it"));
+ return eHAL_STATUS_SUCCESS;
+ }
+
NEIGHBOR_ROAM_DEBUG(pMac, LOGW, "%s: process scan results", __func__);
hstatus = csrNeighborRoamProcessScanComplete(pMac);
@@ -1943,35 +2055,46 @@
tCsrBGScanRequest bgScanParams;
int numOfChannels = 0, i = 0;
tANI_U8 *channelList = NULL;
+ tANI_U8 *pInChannelList = NULL;
palZeroMemory(pMac->hHdd, &bgScanParams, sizeof(tCsrBGScanRequest));
/* Contiguously scan all channels from valid list */
NEIGHBOR_ROAM_DEBUG(pMac, LOG2, "%s: get valid channel list", __func__);
- numOfChannels = sizeof(pMac->roam.validChannelList);
-
- if(!HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac,
- (tANI_U8 *)pMac->roam.validChannelList,
- (tANI_U32 *) &numOfChannels)))
+
+ if (NULL != pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.countryValidChannelList.ChannelList)
{
- smsLog(pMac, LOGE, FL("Could not get valid channel list"));
- return eHAL_STATUS_FAILURE;
+ /* this list is filled only if the country code is set to KR */
+ numOfChannels = pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.countryValidChannelList.numOfChannels;
+ pInChannelList = pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.countryValidChannelList.ChannelList;
}
-
+ else
+ {
+ numOfChannels = sizeof(pMac->roam.validChannelList);
+
+ if(!HAL_STATUS_SUCCESS(csrGetCfgValidChannels(pMac,
+ (tANI_U8 *)pMac->roam.validChannelList,
+ (tANI_U32 *) &numOfChannels)))
+ {
+ smsLog(pMac, LOGE, FL("Could not get valid channel list"));
+ return eHAL_STATUS_FAILURE;
+ }
+ pInChannelList = pMac->roam.validChannelList;
+ }
channelList = vos_mem_malloc( numOfChannels );
if( NULL == channelList )
{
smsLog(pMac, LOGE, FL("could not allocate memory for channelList"));
return eHAL_STATUS_FAILURE;
}
- vos_mem_copy(channelList, (tANI_U8 *)pMac->roam.validChannelList,
+ vos_mem_copy(channelList, (tANI_U8 *)pInChannelList,
numOfChannels * sizeof(tANI_U8));
bgScanParams.ChannelInfo.numOfChannels = numOfChannels;
bgScanParams.ChannelInfo.ChannelList = channelList;
for (i = 0; i < numOfChannels; i++)
{
- NEIGHBOR_ROAM_DEBUG(pMac, LOGW, "%s: valid channel list = %d\n",
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGW, "%s: valid channel list = %d\n",
__func__, bgScanParams.ChannelInfo.ChannelList[i]);
}
csrNeighborRoamFillNonChannelBgScanParams(pMac, &bgScanParams);
@@ -2044,6 +2167,44 @@
return;
}
+void csrNeighborRoamEmptyScanRefreshTimerCallback(void *context)
+{
+ tCsrTimerInfo *pInfo = (tCsrTimerInfo *)context;
+ tpAniSirGlobal pMac = pInfo->pMac;
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+
+ /* Reset all the variables just as no scan had happened before */
+ csrNeighborRoamResetConnectedStateControlInfo(pMac);
+
+#if defined WLAN_FEATURE_VOWIFI_11R && defined WLAN_FEATURE_VOWIFI
+ if ((pNeighborRoamInfo->is11rAssoc) && (pMac->rrm.rrmSmeContext.rrmConfig.rrmEnabled))
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("11R Association:Neighbor Lookup Down event received in CONNECTED state"));
+ vosStatus = csrNeighborRoamIssueNeighborRptRequest(pMac);
+ if (VOS_STATUS_SUCCESS != vosStatus)
+ {
+ smsLog(pMac, LOGE, FL("Neighbor report request failed. status = %d\n"), vosStatus);
+ return;
+ }
+ /* Increment the neighbor report retry count after sending the neighbor request successfully */
+ pNeighborRoamInfo->FTRoamInfo.currentNeighborRptRetryNum++;
+ pNeighborRoamInfo->FTRoamInfo.neighborRptPending = eANI_BOOLEAN_TRUE;
+ CSR_NEIGHBOR_ROAM_STATE_TRANSITION(eCSR_NEIGHBOR_ROAM_STATE_REPORT_QUERY)
+ }
+ else
+#endif
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac, LOGE, FL("Non 11R or CCX Association:empty scan refresh timer expired"));
+ vosStatus = csrNeighborRoamTransitToCFGChanScan(pMac);
+ if (VOS_STATUS_SUCCESS != vosStatus)
+ {
+ return;
+ }
+ }
+ return;
+}
+
/* ---------------------------------------------------------------------------
\fn csrNeighborRoamResultsRefreshTimerCallback
@@ -2671,8 +2832,9 @@
channelList, numOfChannels * sizeof(tANI_U8));
}
#ifdef FEATURE_WLAN_LFR
- else if (abs(pNeighborRoamInfo->lookupDOWNRssi) >
- abs(pNeighborRoamInfo->cfgParams.neighborReassocThreshold))
+ else if ((pNeighborRoamInfo->uScanMode == DEFAULT_SCAN) &&
+ (abs(pNeighborRoamInfo->lookupDOWNRssi) >
+ abs(pNeighborRoamInfo->cfgParams.neighborReassocThreshold)))
{
/*
* Trigger a contiguous scan on all channels when the
@@ -2706,8 +2868,9 @@
numOfChannels = pMac->scan.occupiedChannels.numChannels;
if (numOfChannels
#ifdef FEATURE_WLAN_LFR
- && ((pNeighborRoamInfo->uEmptyScanCount == 0) ||
- ((pNeighborRoamInfo->uEmptyScanCount % 2) == 1))
+ && ((pNeighborRoamInfo->uScanMode == SPLIT_SCAN_OCCUPIED_LIST) ||
+ (pNeighborRoamInfo->uEmptyScanCount == 0) ||
+ ((pNeighborRoamInfo->uEmptyScanCount % 2) == 1))
#endif
)
{
@@ -2715,7 +2878,13 @@
* Always scan channels in the occupied channel list
* before scanning on the non-occupied list.
*/
- NEIGHBOR_ROAM_DEBUG(pMac, LOG1, "Switching to occupied channel list");
+ NEIGHBOR_ROAM_DEBUG(pMac, LOG2, "Switching to occupied channel list"
+#ifdef FEATURE_WLAN_LFR
+ "-uScanMode=%d, uEmptyScanCount=%d",
+ pNeighborRoamInfo->uScanMode,
+ pNeighborRoamInfo->uEmptyScanCount
+#endif
+ );
VOS_ASSERT(currChannelListInfo->ChannelList == NULL);
currChannelListInfo->ChannelList = vos_mem_malloc(numOfChannels);
@@ -2745,8 +2914,8 @@
* formed by CSR.
*/
NEIGHBOR_ROAM_DEBUG(pMac, LOG1, "Switching to non-occupied channel list");
- status = csrNeighborRoamPrepareNonOccupiedChannelList(pMac,
- (tANI_U8 *)pMac->roam.validChannelList,
+ status = csrNeighborRoamPrepareNonOccupiedChannelList(pMac,
+ (tANI_U8 *)pMac->roam.validChannelList,
numOfChannels,
channelList,
&numOfChannels);
@@ -3094,6 +3263,7 @@
// state.
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
palTimerStop(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerStop(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
if (!CSR_IS_ROAM_SUBSTATE_DISASSOC_HO( pMac, sessionId )) {
/*
* Disconnect indication during Disassoc Handoff sub-state
@@ -3208,6 +3378,7 @@
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
+ pNeighborRoamInfo->uScanMode = DEFAULT_SCAN;
#endif
@@ -3376,11 +3547,23 @@
pNeighborRoamInfo->cfgParams.neighborReassocThreshold = pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold;
pNeighborRoamInfo->cfgParams.neighborScanPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod;
pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod;
-
- pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels =
+ pNeighborRoamInfo->cfgParams.emptyScanRefreshPeriod = pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod;
+
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+ pNeighborRoamInfo->cfgParams.countryChannelInfo.revision = SME_KR_25;
+ pNeighborRoamInfo->cfgParams.countryChannelInfo.countryValidChannelList.ChannelList = NULL;
+ pNeighborRoamInfo->cfgParams.countryChannelInfo.countryValidChannelList.numOfChannels = 0;
+
+ if (0 == strncmp(pMac->scan.countryCodeCurrent, "KR", 2))
+ {
+ csrInitCountryValidChannelList(pMac, SME_KR_25);
+ }
+#endif
+
+ pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels =
pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels;
- pNeighborRoamInfo->cfgParams.channelInfo.ChannelList =
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList =
vos_mem_malloc(pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels);
if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
@@ -3390,7 +3573,7 @@
}
/* Update the roam global structure from CFG */
- palCopyMemory(pMac->hHdd, pNeighborRoamInfo->cfgParams.channelInfo.ChannelList,
+ palCopyMemory(pMac->hHdd, pNeighborRoamInfo->cfgParams.channelInfo.ChannelList,
pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.channelList,
pMac->roam.configParam.neighborRoamConfig.neighborScanChanList.numChannels);
@@ -3399,6 +3582,7 @@
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->lookupDOWNRssi = 0;
pNeighborRoamInfo->uEmptyScanCount = 0;
+ pNeighborRoamInfo->uScanMode = DEFAULT_SCAN;
palZeroMemory(pMac->hHdd, &pNeighborRoamInfo->prevConnProfile,
sizeof(tCsrRoamConnectedProfile));
#endif
@@ -3411,7 +3595,7 @@
if (eHAL_STATUS_SUCCESS != status)
{
- smsLog(pMac, LOGE, FL("Response wait Timer allocation failed"));
+ smsLog(pMac, LOGE, FL("Neighbor scan timer allocation failed"));
vos_mem_free(pNeighborRoamInfo->cfgParams.channelInfo.ChannelList);
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
return eHAL_STATUS_RESOURCES;
@@ -3422,14 +3606,27 @@
if (eHAL_STATUS_SUCCESS != status)
{
- smsLog(pMac, LOGE, FL("Response wait Timer allocation failed"));
- smsLog(pMac, LOGE, FL("LL Open of roamable AP List failed"));
+ smsLog(pMac, LOGE, FL("Neighbor results refresh timer allocation failed"));
vos_mem_free(pNeighborRoamInfo->cfgParams.channelInfo.ChannelList);
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
return eHAL_STATUS_RESOURCES;
}
+ status = palTimerAlloc(pMac->hHdd, &pNeighborRoamInfo->emptyScanRefreshTimer,
+ csrNeighborRoamEmptyScanRefreshTimerCallback,
+ (void *)&pNeighborRoamInfo->neighborScanTimerInfo);
+
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ smsLog(pMac, LOGE, FL("Empty scan refresh timer allocation failed"));
+ vos_mem_free(pNeighborRoamInfo->cfgParams.channelInfo.ChannelList);
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
+ palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
+ palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ return eHAL_STATUS_RESOURCES;
+ }
+
status = csrLLOpen(pMac->hHdd, &pNeighborRoamInfo->roamableAPList);
if (eHAL_STATUS_SUCCESS != status)
{
@@ -3438,6 +3635,7 @@
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerFree(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
return eHAL_STATUS_RESOURCES;
}
@@ -3456,6 +3654,7 @@
pNeighborRoamInfo->cfgParams.channelInfo.ChannelList = NULL;
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerFree(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
csrLLClose(&pNeighborRoamInfo->roamableAPList);
return eHAL_STATUS_RESOURCES;
}
@@ -3498,6 +3697,7 @@
pNeighborRoamInfo->neighborScanTimerInfo.sessionId = CSR_SESSION_ID_INVALID;
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborScanTimer);
palTimerFree(pMac->hHdd, pNeighborRoamInfo->neighborResultsRefreshTimer);
+ palTimerFree(pMac->hHdd, pNeighborRoamInfo->emptyScanRefreshTimer);
/* Should free up the nodes in the list before closing the double Linked list */
csrNeighborRoamFreeRoamableBSSList(pMac, &pNeighborRoamInfo->roamableAPList);
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 78da5a8..35d1445 100755
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -892,7 +892,7 @@
smeOpen must be called before any other SME APIs can be involved.
smeOpen must be called after macOpen.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME is successfully initialized.
@@ -1018,7 +1018,7 @@
and there power using information from nvRAM
This function is called only for AP.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\Param pSmeConfigParams - a pointer to a caller allocated object of
@@ -1053,7 +1053,7 @@
\brief sme_getSoftApDomain() - Get the current regulatory domain of softAp.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by HostapdAdapter.
\Param v_REGDOMAIN_t - The current Regulatory Domain requested for SoftAp.
@@ -1108,7 +1108,7 @@
It is used at driver start up to inform RIVA of the default channel
configuration.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
@@ -1137,7 +1137,7 @@
Modules inside SME apply the new configuration at the next transaction.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\Param pSmeConfigParams - a pointer to a caller allocated object of
@@ -1208,7 +1208,7 @@
API provides info regarding 11d only at reset but we can extend this for
other params (PMC, QoS) which needs to be initialized again at reset.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
@@ -1251,7 +1251,7 @@
The function is called by HDD at the end of initialization stage so PE/HAL can
enable the NIC to running state.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - eWNI_SME_SYS_READY_IND is sent to PE
@@ -1344,7 +1344,7 @@
The function starts each module in SME, PMC, CCM, CSR, etc. . Upon
successfully return, all modules are ready to run.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME is ready.
@@ -1447,7 +1447,7 @@
The function is called by a message dispatcher when to process a message
targeted for SME.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\param pMsg - A pointer to a caller allocated object of tSirMsgQ.
@@ -1821,7 +1821,7 @@
The function stops each module in SME, PMC, CCM, CSR, etc. . Upon
return, all modules are at idle state ready to start.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen
\return eHAL_STATUS_SUCCESS - SME is stopped.
@@ -1887,7 +1887,7 @@
No SME APIs can be involved after smeClose except smeOpen.
smeClose must be called before macClose.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen
\return eHAL_STATUS_SUCCESS - SME is successfully close.
@@ -2013,7 +2013,7 @@
/* ---------------------------------------------------------------------------
\fn sme_ScanRequest
\brief a wrapper function to Request a 11d or full scan from CSR.
- This is an asynchronuous call
+ This is an asynchronous call
\param pScanRequestID - pointer to an object to get back the request ID
\param callback - a callback function that scan calls upon finish, will not
be called if csrScanRequest returns error
@@ -2076,7 +2076,7 @@
/* ---------------------------------------------------------------------------
\fn sme_ScanGetResult
\brief a wrapper function to request scan results from CSR.
- This is a synchronuous call
+ This is a synchronous call
\param pFilter - If pFilter is NULL, all cached results are returned
\param phResult - an object for the result.
\return eHalStatus
@@ -2103,7 +2103,7 @@
/* ---------------------------------------------------------------------------
\fn sme_ScanFlushResult
\brief a wrapper function to request CSR to clear scan results.
- This is a synchronuous call
+ This is a synchronous call
\return eHalStatus
---------------------------------------------------------------------------*/
eHalStatus sme_ScanFlushResult(tHalHandle hHal, tANI_U8 sessionId)
@@ -2140,7 +2140,7 @@
\fn sme_ScanResultGetFirst
\brief a wrapper function to request CSR to returns the first element of
scan result.
- This is a synchronuous call
+ This is a synchronous call
\param hScanResult - returned from csrScanGetResult
\return tCsrScanResultInfo * - NULL if no result
---------------------------------------------------------------------------*/
@@ -2167,7 +2167,7 @@
\brief a wrapper function to request CSR to returns the next element of
scan result. It can be called without calling csrScanResultGetFirst
first
- This is a synchronuous call
+ This is a synchronous call
\param hScanResult - returned from csrScanGetResult
\return Null if no result or reach the end
---------------------------------------------------------------------------*/
@@ -2192,7 +2192,7 @@
/* ---------------------------------------------------------------------------
\fn sme_ScanSetBGScanparams
\brief a wrapper function to request CSR to set BG scan params in PE
- This is a synchronuous call
+ This is a synchronous call
\param pScanReq - BG scan request structure
\return eHalStatus
---------------------------------------------------------------------------*/
@@ -2219,7 +2219,7 @@
\fn sme_ScanResultPurge
\brief a wrapper function to request CSR to remove all items(tCsrScanResult)
in the list and free memory for each item
- This is a synchronuous call
+ This is a synchronous call
\param hScanResult - returned from csrScanGetResult. hScanResult is
considered gone by
calling this function and even before this function reutrns.
@@ -2243,7 +2243,7 @@
/* ---------------------------------------------------------------------------
\fn sme_ScanGetPMKIDCandidateList
\brief a wrapper function to return the PMKID candidate list
- This is a synchronuous call
+ This is a synchronous call
\param pPmkidList - caller allocated buffer point to an array of
tPmkidCandidateInfo
\param pNumItems - pointer to a variable that has the number of
@@ -2323,7 +2323,7 @@
/* ---------------------------------------------------------------------------
\fn sme_RoamConnect
\brief a wrapper function to request CSR to inititiate an association
- This is an asynchronuous call.
+ This is an asynchronous call.
\param sessionId - the sessionId returned by sme_OpenSession.
\param pProfile - description of the network to which to connect
\param hBssListIn - a list of BSS descriptor to roam to. It is returned
@@ -2413,7 +2413,7 @@
\fn sme_RoamConnectToLastProfile
\brief a wrapper function to request CSR to disconnect and reconnect with
the same profile
- This is an asynchronuous call.
+ This is an asynchronous call.
\return eHalStatus. It returns fail if currently connected
---------------------------------------------------------------------------*/
eHalStatus sme_RoamConnectToLastProfile(tHalHandle hHal, tANI_U8 sessionId)
@@ -2441,7 +2441,7 @@
/* ---------------------------------------------------------------------------
\fn sme_RoamDisconnect
\brief a wrapper function to request CSR to disconnect from a network
- This is an asynchronuous call.
+ This is an asynchronous call.
\param reason -- To indicate the reason for disconnecting. Currently, only
eCSR_DISCONNECT_REASON_MIC_ERROR is meanful.
\return eHalStatus
@@ -2700,7 +2700,7 @@
\fn sme_RoamGetConnectState
\brief a wrapper function to request CSR to return the current connect state
of Roaming
- This is a synchronuous call.
+ This is a synchronous call.
\return eHalStatus
---------------------------------------------------------------------------*/
eHalStatus sme_RoamGetConnectState(tHalHandle hHal, tANI_U8 sessionId, eCsrConnectState *pState)
@@ -2730,7 +2730,7 @@
\brief a wrapper function to request CSR to return the current connect
profile. Caller must call csrRoamFreeConnectProfile after it is done
and before reuse for another csrRoamGetConnectProfile call.
- This is a synchronuous call.
+ This is a synchronous call.
\param pProfile - pointer to a caller allocated structure
tCsrRoamConnectedProfile
\return eHalStatus. Failure if not connected
@@ -2762,7 +2762,7 @@
\fn sme_RoamFreeConnectProfile
\brief a wrapper function to request CSR to free and reinitialize the
profile returned previously by csrRoamGetConnectProfile.
- This is a synchronuous call.
+ This is a synchronous call.
\param pProfile - pointer to a caller allocated structure
tCsrRoamConnectedProfile
\return eHalStatus.
@@ -2786,7 +2786,7 @@
/* ---------------------------------------------------------------------------
\fn sme_RoamSetPMKIDCache
\brief a wrapper function to request CSR to return the PMKID candidate list
- This is a synchronuous call.
+ This is a synchronous call.
\param pPMKIDCache - caller allocated buffer point to an array of
tPmkidCacheInfo
\param numItems - a variable that has the number of tPmkidCacheInfo
@@ -2825,7 +2825,7 @@
\fn sme_RoamGetSecurityReqIE
\brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE CSR
passes to PE to JOIN request or START_BSS request
- This is a synchronuous call.
+ This is a synchronous call.
\param pLen - caller allocated memory that has the length of pBuf as input.
Upon returned, *pLen has the needed or IE length in pBuf.
\param pBuf - Caller allocated memory that contain the IE field, if any,
@@ -2861,7 +2861,7 @@
\fn sme_RoamGetSecurityRspIE
\brief a wrapper function to request CSR to return the WPA or RSN or WAPI IE from
the beacon or probe rsp if connected
- This is a synchronuous call.
+ This is a synchronous call.
\param pLen - caller allocated memory that has the length of pBuf as input.
Upon returned, *pLen has the needed or IE length in pBuf.
\param pBuf - Caller allocated memory that contain the IE field, if any,
@@ -2899,7 +2899,7 @@
\fn sme_RoamGetNumPMKIDCache
\brief a wrapper function to request CSR to return number of PMKID cache
entries
- This is a synchronuous call.
+ This is a synchronous call.
\return tANI_U32 - the number of PMKID cache entries
---------------------------------------------------------------------------*/
tANI_U32 sme_RoamGetNumPMKIDCache(tHalHandle hHal, tANI_U8 sessionId)
@@ -2929,7 +2929,7 @@
/* ---------------------------------------------------------------------------
\fn sme_RoamGetPMKIDCache
\brief a wrapper function to request CSR to return PMKID cache from CSR
- This is a synchronuous call.
+ This is a synchronous call.
\param pNum - caller allocated memory that has the space of the number of
pBuf tPmkidCacheInfo as input. Upon returned, *pNum has the
needed or actually number in tPmkidCacheInfo.
@@ -2966,7 +2966,7 @@
\fn sme_GetConfigParam
\brief a wrapper function that HDD calls to get the global settings
currently maintained by CSR.
- This is a synchronuous call.
+ This is a synchronous call.
\param pParam - caller allocated memory
\return eHalStatus
---------------------------------------------------------------------------*/
@@ -3003,7 +3003,7 @@
/* ---------------------------------------------------------------------------
\fn sme_CfgSetInt
\brief a wrapper function that HDD calls to set parameters in CFG.
- This is a synchronuous call.
+ This is a synchronous call.
\param cfgId - Configuration Parameter ID (type) for STA.
\param ccmValue - The information related to Configuration Parameter ID
which needs to be saved in CFG
@@ -3022,7 +3022,7 @@
/* ---------------------------------------------------------------------------
\fn sme_CfgSetStr
\brief a wrapper function that HDD calls to set parameters in CFG.
- This is a synchronuous call.
+ This is a synchronous call.
\param cfgId - Configuration Parameter ID (type) for STA.
\param pStr - Pointer to the byte array which carries the information needs
to be saved in CFG
@@ -6879,8 +6879,20 @@
eHalStatus sme_UpdateRoamPrefer5GHz(tHalHandle hHal, v_BOOL_t nRoamPrefer5GHz)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
- pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
- return(eHAL_STATUS_SUCCESS);
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: gRoamPrefer5GHz is changed from %d to %d", __func__,
+ pMac->roam.configParam.nRoamPrefer5GHz,
+ nRoamPrefer5GHz);
+ pMac->roam.configParam.nRoamPrefer5GHz = nRoamPrefer5GHz;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
}
/* ---------------------------------------------------------------------------
@@ -6898,15 +6910,60 @@
eHalStatus sme_UpdateImmediateRoamRssiDiff(tHalHandle hHal, v_U8_t nImmediateRoamRssiDiff)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
- pMac->roam.configParam.nImmediateRoamRssiDiff = nImmediateRoamRssiDiff;
- return(eHAL_STATUS_SUCCESS);
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set immediate roam rssi diff to %d - old value is %d - roam state is %d",
+ nImmediateRoamRssiDiff,
+ pMac->roam.configParam.nImmediateRoamRssiDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.nImmediateRoamRssiDiff = nImmediateRoamRssiDiff;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateRoamRssiDiff
+ \brief Update RoamRssiDiff
+ This function is called through dynamic setConfig callback function
+ to configure RoamRssiDiff
+ Usage: adb shell iwpriv wlan0 setConfig RoamRssiDiff=[0 .. 125]
+ \param hHal - HAL handle for device
+ \param RoamRssiDiff - minimum rssi difference between potential
+ candidate and current AP.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateRoamRssiDiff(tHalHandle hHal, v_U8_t RoamRssiDiff)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam rssi diff to %d - old value is %d - roam state is %d",
+ RoamRssiDiff,
+ pMac->roam.configParam.RoamRssiDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.RoamRssiDiff = RoamRssiDiff;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
}
/*--------------------------------------------------------------------------
\brief sme_UpdateFastTransitionEnabled() - enable/disable Fast Transition support at runtime
It is used at in the REG_DYNAMIC_VARIABLE macro definition of
isFastTransitionEnabled.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME update isFastTransitionEnabled config successfully.
Other status means SME is failed to update isFastTransitionEnabled.
@@ -6916,9 +6973,20 @@
v_BOOL_t isFastTransitionEnabled)
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
- pMac->roam.configParam.isFastTransitionEnabled = isFastTransitionEnabled;
- return eHAL_STATUS_SUCCESS;
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: FastTransitionEnabled is changed from %d to %d", __func__,
+ pMac->roam.configParam.isFastTransitionEnabled,
+ isFastTransitionEnabled);
+ pMac->roam.configParam.isFastTransitionEnabled = isFastTransitionEnabled;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
}
#endif /* (WLAN_FEATURE_VOWIFI_11R) || (FEATURE_WLAN_CCX) || (FEATURE_WLAN_LFR) */
@@ -6927,7 +6995,7 @@
\brief sme_UpdateIsFastRoamIniFeatureEnabled() - enable/disable LFR support at runtime
It is used at in the REG_DYNAMIC_VARIABLE macro definition of
isFastRoamIniFeatureEnabled.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME update isFastRoamIniFeatureEnabled config successfully.
Other status means SME is failed to update isFastRoamIniFeatureEnabled.
@@ -6938,24 +7006,26 @@
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: FastRoamEnabled is changed from %d to %d", __func__,
+ pMac->roam.configParam.isFastRoamIniFeatureEnabled,
+ isFastRoamIniFeatureEnabled);
pMac->roam.configParam.isFastRoamIniFeatureEnabled = isFastRoamIniFeatureEnabled;
if(TRUE == isFastRoamIniFeatureEnabled)
{
- sme_UpdateFastTransitionEnabled(hHal, TRUE);
sme_UpdateConfigFwRssiMonitoring(hHal, TRUE);
}
else
{
- /* CCX also depend on FW Monitoring/FastTransition.
- Hence Disabling LFR should check for CCX enable before disabling FW Monitoring and Fast Transition */
+ /* CCX also depend on FW Monitoring.
+ Hence Disabling LFR should check for CCX enable before disabling FW Monitoring */
#ifdef FEATURE_WLAN_CCX
if(FALSE == pMac->roam.configParam.isCcxIniFeatureEnabled)
#endif
{
VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
- "%s: Turn off FW Monitoring/Fast Transition", __func__);
- sme_UpdateFastTransitionEnabled(hHal, FALSE);
+ "%s: Turn off FW Monitoring", __func__);
sme_UpdateConfigFwRssiMonitoring(hHal, FALSE);
}
}
@@ -6969,7 +7039,7 @@
\brief sme_UpdateIsCcxFeatureEnabled() - enable/disable CCX support at runtime
It is used at in the REG_DYNAMIC_VARIABLE macro definition of
isCcxIniFeatureEnabled.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME update isCcxIniFeatureEnabled config successfully.
Other status means SME is failed to update isCcxIniFeatureEnabled.
@@ -6981,6 +7051,10 @@
{
tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO,
+ "%s: CcxEnabled is changed from %d to %d", __func__,
+ pMac->roam.configParam.isCcxIniFeatureEnabled,
+ isCcxIniFeatureEnabled);
pMac->roam.configParam.isCcxIniFeatureEnabled = isCcxIniFeatureEnabled;
if(TRUE == isCcxIniFeatureEnabled)
@@ -6990,7 +7064,7 @@
}
else
{
- /* LFR also depend on FW Monitoring/FastTransition.
+ /* LFR also depend on FW Monitoring.
Hence Disabling CCX should check for LFR enable before disabling FW Monitoring and Fast Transition */
#ifdef FEATURE_WLAN_LFR
if(FALSE == pMac->roam.configParam.isFastRoamIniFeatureEnabled)
@@ -7010,7 +7084,7 @@
\brief sme_UpdateConfigFwRssiMonitoring() - enable/disable firmware RSSI Monitoring at runtime
It is used at in the REG_DYNAMIC_VARIABLE macro definition of
fEnableFwRssiMonitoring.
- This is a synchronuous call
+ This is a synchronous call
\param hHal - The handle returned by macOpen.
\return eHAL_STATUS_SUCCESS - SME update fEnableFwRssiMonitoring. config successfully.
Other status means SME is failed to update fEnableFwRssiMonitoring.
@@ -7022,7 +7096,6 @@
{
eHalStatus halStatus = eHAL_STATUS_SUCCESS;
-
if (ccmCfgSetInt(hHal, WNI_CFG_PS_ENABLE_RSSI_MONITOR, fEnableFwRssiMonitoring,
NULL, eANI_BOOLEAN_FALSE)==eHAL_STATUS_FAILURE)
{
@@ -7034,6 +7107,355 @@
return (halStatus);
}
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborLookupRssiThreshold(tHalHandle hHal,
+ v_U8_t neighborLookupRssiThreshold)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrNeighborRoamSetLookupRssiThreshold(pMac, neighborLookupRssiThreshold);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set Lookup threshold to %d - old value is %d - roam state is %d",
+ neighborLookupRssiThreshold,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold =
+ neighborLookupRssiThreshold;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborReassocRssiThreshold() - update neighbor reassoc rssi threshold
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborReassocRssiThreshold(tHalHandle hHal,
+ v_U8_t neighborReassocRssiThreshold)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set Reassoc threshold to %d - old value is %d - roam state is %d",
+ neighborReassocRssiThreshold,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold =
+ neighborReassocRssiThreshold;
+ pMac->roam.neighborRoamInfo.cfgParams.neighborReassocThreshold =
+ neighborReassocRssiThreshold;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+
+/*--------------------------------------------------------------------------
+ \brief sme_getNeighborLookupRssiThreshold() - get neighbor lookup rssi threshold
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_getNeighborLookupRssiThreshold(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_setNeighborScanRefreshPeriod() - set neighbor scan results refresh period
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_setNeighborScanRefreshPeriod(tHalHandle hHal,
+ v_U16_t neighborScanResultsRefreshPeriod)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan refresh period to %d - old value is %d - roam state is %d",
+ neighborScanResultsRefreshPeriod,
+ pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod =
+ neighborScanResultsRefreshPeriod;
+ pMac->roam.neighborRoamInfo.cfgParams.neighborResultsRefreshPeriod =
+ neighborScanResultsRefreshPeriod;
+
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_getNeighborScanRefreshPeriod() - get neighbor scan results refresh period
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - Neighbor scan results refresh period value
+ \sa
+ --------------------------------------------------------------------------*/
+v_U16_t sme_getNeighborScanRefreshPeriod(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_getEmptyScanRefreshPeriod() - get empty scan refresh period
+ This is a synchronuous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+v_U16_t sme_getEmptyScanRefreshPeriod(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod;
+}
+
+#if defined (WLAN_FEATURE_VOWIFI_11R) || defined (FEATURE_WLAN_CCX) || defined(FEATURE_WLAN_LFR)
+/*--------------------------------------------------------------------------
+ \brief sme_getRoamRssiDiff() - get Roam rssi diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return v_U16_t - Rssi diff value
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_getRoamRssiDiff(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.RoamRssiDiff;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_ChangeRoamScanChannelList() - Change roam scan channel list
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_ChangeRoamScanChannelList(tHalHandle hHal, tANI_U8 *pChannelList,
+ tANI_U8 numChannels)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ tANI_U8 oldChannelList[128] = {0};
+ tANI_U8 newChannelList[128] = {0};
+ tANI_U8 i = 0, j = 0;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ if (NULL != pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ {
+ for (i = 0; i < pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels; i++)
+ {
+ j += snprintf(oldChannelList + j, sizeof(oldChannelList) - j," %d",
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
+ }
+ }
+ csrFlushAndCreateBgScanRoamChannelList(pMac, pChannelList, numChannels);
+ status = csrUpdateBgScanConfigIniChannelList(pMac, csrGetCurrentBand(hHal));
+
+ if (NULL != pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ {
+ j = 0;
+ for (i = 0; i < pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels; i++)
+ {
+ j += snprintf(newChannelList + j, sizeof(newChannelList) - j," %d",
+ pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i]);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan channels to %s - old value is %s - roam state is %d",
+ newChannelList, oldChannelList,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_ChangeCountryValidChannelListByRevision() - Change Korea valid channel list
+ based on country revision number
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_ChangeCountryValidChannelListByRevision(tHalHandle hHal,
+ tANI_U8 Revision)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set country/revision to %s/%d - old value is %s/%d - roam state is %d",
+ "KR", Revision, "KR",
+ pMac->roam.neighborRoamInfo.cfgParams.countryChannelInfo.revision,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ csr_SetRevision(pMac, Revision);
+ csrInitCountryValidChannelList(pMac, Revision);
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+
+/*--------------------------------------------------------------------------
+ \brief csrUpdateBgScanConfigIniChannelList() - Update bgscan roam cache
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_UpdateBgScanConfigIniChannelList(tHalHandle hHal,
+ eCsrBand eBand)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return csrUpdateBgScanConfigIniChannelList(pMac, eBand);
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_getRoamScanChannelList() - get roam scan channel list
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_getRoamScanChannelList(tHalHandle hHal, tANI_U8 *pChannelList,
+ tANI_U8 *pNumChannels)
+{
+ int i = 0;
+ tANI_U8 *pOutPtr = pChannelList;
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ if (NULL == pNeighborRoamInfo->cfgParams.channelInfo.ChannelList)
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_WARN,
+ "Roam Scan channel list is NOT yet initialized");
+ sme_ReleaseGlobalLock( &pMac->sme );
+ return eHAL_STATUS_NOT_INITIALIZED;
+ }
+
+ *pNumChannels = pNeighborRoamInfo->cfgParams.channelInfo.numOfChannels;
+ for (i = 0; i < (*pNumChannels); i++)
+ {
+ pOutPtr[i] = pNeighborRoamInfo->cfgParams.channelInfo.ChannelList[i];
+ }
+ pOutPtr[i] = '\0';
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+}
+
+/*--------------------------------------------------------------------------
+ \brief sme_GetCountryRevision() - get Country revision index
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen.
+ \return eHAL_STATUS_SUCCESS - SME update config successful.
+ Other status means SME is failed to update
+ \sa
+ --------------------------------------------------------------------------*/
+eHalStatus sme_GetCountryRevision(tHalHandle hHal, tANI_U8 *pRevision)
+{
+ /* this is valid for Country KR only now */
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &pMac->roam.neighborRoamInfo;
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ *pRevision = pNeighborRoamInfo->cfgParams.countryChannelInfo.revision;
+
+ return status;
+}
+
+#endif
+
+/* ---------------------------------------------------------------------------
+ \fn sme_UpdateEmptyScanRefreshPeriod
+ \brief Update nEmptyScanRefreshPeriod
+ This function is called through dynamic setConfig callback function
+ to configure nEmptyScanRefreshPeriod
+ Usage: adb shell iwpriv wlan0 setConfig nEmptyScanRefreshPeriod=[0 .. 60]
+ \param hHal - HAL handle for device
+ \param nEmptyScanRefreshPeriod - scan period following empty scan results.
+ \- return Success or failure
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_UpdateEmptyScanRefreshPeriod(tHalHandle hHal, v_U16_t nEmptyScanRefreshPeriod)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set roam scan period to %d - old value is %d - roam state is %d",
+ nEmptyScanRefreshPeriod,
+ pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nEmptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
+ pMac->roam.neighborRoamInfo.cfgParams.emptyScanRefreshPeriod = nEmptyScanRefreshPeriod;
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+
+ return status ;
+
+}
+
/* ---------------------------------------------------------------------------