summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNaveen Rawat <nrawat@qca.qualcomm.com>2014-01-21 13:19:41 -0800
committerPrakash Dhavali <pdhavali@qca.qualcomm.com>2014-01-29 12:06:39 -0800
commit137aaa8ac2c004f937fd5a2acf862cd4cbd846fe (patch)
treebd464dff9689bda9ff8c340b1a8d129d48676d76
parent1f9d04fbd45c6091865a45e710f73b7e77d172a6 (diff)
qcacld: Knobs for some LFR parameters
1) Opportunistic Scan threshold diff Used for changing the level at which opportunistic scan will run. 2) RoamRssiDiff Used for changing the drop in RSSI that will trigger a precautionary scan. Change-Id: Ib60c2d6a4de438982b2fa65bf6da472d069da0e5 CRs-Fixed: 602311
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h24
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg.c48
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c83
-rw-r--r--CORE/MAC/inc/sirApi.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c16
-rw-r--r--CORE/SERVICES/WMA/wma.h2
-rw-r--r--CORE/SME/inc/csrApi.h2
-rw-r--r--CORE/SME/inc/csrInternal.h2
-rw-r--r--CORE/SME/inc/csrNeighborRoam.h12
-rw-r--r--CORE/SME/inc/sme_Api.h51
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c8
-rw-r--r--CORE/SME/src/csr/csrNeighborRoam.c122
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c105
13 files changed, 468 insertions, 9 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 4f7a8c7debfa..2137fbd00d72 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -1215,6 +1215,28 @@ typedef enum
#define CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_MAX (120)
#define CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_DEFAULT (78)
+/*
+ * This parameter is the drop in RSSI value that will trigger a precautionary
+ * scan by firmware.
+ * MAX value is choose so that this type of scan can be disabled by user.
+ */
+#define CFG_ROAM_RESCAN_RSSI_DIFF_NAME "gRoamRescanRssiDiff"
+#define CFG_ROAM_RESCAN_RSSI_DIFF_MIN (0)
+#define CFG_ROAM_RESCAN_RSSI_DIFF_MAX (100)
+#define CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT (5)
+
+/*
+ * This parameter is the RSSI diff above neighbor lookup threshold, when
+ * opportunistic scan should be triggered.
+ * MAX value is choose so that this type of scan can be always enabled by user.
+ * MIN value will cause opportunistic scan to be triggered in neighbor lookup
+ * RSSI range.
+ */
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_NAME "gOpportunisticThresholdDiff"
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MIN (0)
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MAX (127)
+#define CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT (30)
+
#define CFG_NEIGHBOR_SCAN_CHAN_LIST_NAME "gNeighborScanChannelList"
#define CFG_NEIGHBOR_SCAN_CHAN_LIST_DEFAULT ""
@@ -2303,6 +2325,8 @@ typedef struct
v_U16_t nNeighborScanPeriod;
v_U8_t nNeighborReassocRssiThreshold;
v_U8_t nNeighborLookupRssiThreshold;
+ v_U8_t nOpportunisticThresholdDiff;
+ v_U8_t nRoamRescanRssiDiff;
v_U8_t neighborScanChanList[WNI_CFG_VALID_CHANNEL_LIST_LEN];
v_U16_t nNeighborScanMinChanTime;
v_U16_t nNeighborScanMaxChanTime;
diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c
index a2e7f6ca6e23..943d40c3a808 100644
--- a/CORE/HDD/src/wlan_hdd_cfg.c
+++ b/CORE/HDD/src/wlan_hdd_cfg.c
@@ -159,6 +159,28 @@ static void cbNotifySetFwRssiMonitoring(hdd_context_t *pHddCtx, unsigned long No
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+static void cbNotifySetOpportunisticScanThresholdDiff(hdd_context_t *pHddCtx,
+ unsigned long NotifyId)
+{
+ /*
+ * at the point this routine is called, the value in the cfg_ini table
+ * has already been updated
+ */
+ sme_SetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal),
+ pHddCtx->cfg_ini->nOpportunisticThresholdDiff );
+}
+
+static void cbNotifySetRoamRescanRssiDiff(hdd_context_t *pHddCtx,
+ unsigned long NotifyId)
+{
+ /*
+ * at the point this routine is called, the value in the cfg_ini table
+ * has already been updated
+ */
+ sme_SetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal),
+ pHddCtx->cfg_ini->nRoamRescanRssiDiff);
+}
+
static void cbNotifySetNeighborLookupRssiThreshold(hdd_context_t *pHddCtx, unsigned long NotifyId)
{
// at the point this routine is called, the value in the cfg_ini table has already been updated
@@ -1859,6 +1881,22 @@ REG_TABLE_ENTRY g_registry_table[] =
CFG_NEIGHBOR_LOOKUP_RSSI_THRESHOLD_MAX,
cbNotifySetNeighborLookupRssiThreshold, 0 ),
+ REG_DYNAMIC_VARIABLE( CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, nOpportunisticThresholdDiff,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MIN,
+ CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_MAX,
+ cbNotifySetOpportunisticScanThresholdDiff, 0 ),
+
+ REG_DYNAMIC_VARIABLE( CFG_ROAM_RESCAN_RSSI_DIFF_NAME, WLAN_PARAM_Integer,
+ hdd_config_t, nRoamRescanRssiDiff,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT,
+ CFG_ROAM_RESCAN_RSSI_DIFF_MIN,
+ CFG_ROAM_RESCAN_RSSI_DIFF_MAX,
+ cbNotifySetRoamRescanRssiDiff, 0 ),
+
REG_VARIABLE_STRING( CFG_NEIGHBOR_SCAN_CHAN_LIST_NAME, WLAN_PARAM_String,
hdd_config_t, neighborScanChanList,
VAR_FLAGS_OPTIONAL,
@@ -3376,6 +3414,12 @@ static void print_hdd_cfg(hdd_context_t *pHddCtx)
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborReassocRssiThreshold] Value = [%u] ",pHddCtx->cfg_ini->nNeighborReassocRssiThreshold);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborLookupRssiThreshold] Value = [%u] ",pHddCtx->cfg_ini->nNeighborLookupRssiThreshold);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [nOpportunisticThresholdDiff] Value = [%u] ",
+ pHddCtx->cfg_ini->nOpportunisticThresholdDiff);
+ VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH,
+ "Name = [nRoamRescanRssiDiff] Value = [%u] ",
+ pHddCtx->cfg_ini->nRoamRescanRssiDiff);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborScanMinChanTime] Value = [%u] ",pHddCtx->cfg_ini->nNeighborScanMinChanTime);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nNeighborScanMaxChanTime] Value = [%u] ",pHddCtx->cfg_ini->nNeighborScanMaxChanTime);
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO_HIGH, "Name = [nMaxNeighborRetries] Value = [%u] ",pHddCtx->cfg_ini->nMaxNeighborReqTries);
@@ -4960,6 +5004,10 @@ VOS_STATUS hdd_set_sme_config( hdd_context_t *pHddCtx )
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
smeConfig.csrConfig.neighborRoamConfig.nNeighborReassocRssiThreshold = pConfig->nNeighborReassocRssiThreshold;
smeConfig.csrConfig.neighborRoamConfig.nNeighborLookupRssiThreshold = pConfig->nNeighborLookupRssiThreshold;
+ smeConfig.csrConfig.neighborRoamConfig.nOpportunisticThresholdDiff =
+ pConfig->nOpportunisticThresholdDiff;
+ smeConfig.csrConfig.neighborRoamConfig.nRoamRescanRssiDiff =
+ pConfig->nRoamRescanRssiDiff;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanMaxChanTime = pConfig->nNeighborScanMaxChanTime;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanMinChanTime = pConfig->nNeighborScanMinChanTime;
smeConfig.csrConfig.neighborRoamConfig.nNeighborScanTimerPeriod = pConfig->nNeighborScanPeriod;
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index b72aea7c7290..d311e4c4b0da 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -3218,6 +3218,89 @@ int hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
goto exit;
}
}
+ else if (strncmp(command, "SETOPPORTUNISTICRSSIDIFF", 24) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 nOpportunisticThresholdDiff = CFG_OPPORTUNISTIC_SCAN_THRESHOLD_DIFF_DEFAULT;
+
+ /* Move pointer to ahead of SETOPPORTUNISTICRSSIDIFF<delimiter> */
+ value = value + 25;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &nOpportunisticThresholdDiff);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed.", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set Opportunistic Threshold diff = %d",
+ __func__,
+ nOpportunisticThresholdDiff);
+
+ sme_SetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal),
+ nOpportunisticThresholdDiff);
+ }
+ else if (strncmp(priv_data.buf, "GETOPPORTUNISTICRSSIDIFF", 24) == 0)
+ {
+ tANI_S8 val = sme_GetRoamOpportunisticScanThresholdDiff((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = scnprintf(extra, sizeof(extra), "%s %d", command, val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
+ else if (strncmp(command, "SETROAMRESCANRSSIDIFF", 21) == 0)
+ {
+ tANI_U8 *value = command;
+ tANI_U8 nRoamRescanRssiDiff = CFG_ROAM_RESCAN_RSSI_DIFF_DEFAULT;
+
+ /* Move pointer to ahead of SETROAMRESCANRSSIDIFF<delimiter> */
+ value = value + 22;
+ /* Convert the value from ascii to integer */
+ ret = kstrtou8(value, 10, &nRoamRescanRssiDiff);
+ if (ret < 0)
+ {
+ /* If the input value is greater than max value of datatype, then also
+ kstrtou8 fails */
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: kstrtou8 failed.", __func__);
+ ret = -EINVAL;
+ goto exit;
+ }
+
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
+ "%s: Received Command to Set Roam Rescan RSSI Diff = %d",
+ __func__,
+ nRoamRescanRssiDiff);
+ sme_SetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal),
+ nRoamRescanRssiDiff);
+ }
+ else if (strncmp(priv_data.buf, "GETROAMRESCANRSSIDIFF", 21) == 0)
+ {
+ tANI_U8 val = sme_GetRoamRescanRssiDiff((tHalHandle)(pHddCtx->hHal));
+ char extra[32];
+ tANI_U8 len = 0;
+
+ len = scnprintf(extra, sizeof(extra), "%s %d", command, val);
+ if (copy_to_user(priv_data.buf, &extra, len + 1))
+ {
+ VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
+ "%s: failed to copy data to user buffer", __func__);
+ ret = -EFAULT;
+ goto exit;
+ }
+ }
#endif /* WLAN_FEATURE_VOWIFI_11R || FEATURE_WLAN_CCX || FEATURE_WLAN_LFR */
#ifdef FEATURE_WLAN_LFR
else if (strncmp(command, "SETFASTROAM", 11) == 0)
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index c0a204d08be7..9a018334673e 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -3802,6 +3802,8 @@ typedef struct sSirRoamOffloadScanReq
eAniBoolean RoamScanOffloadEnabled;
eAniBoolean MAWCEnabled;
tANI_S8 LookupThreshold;
+ tANI_U8 OpportunisticScanThresholdDiff;
+ tANI_U8 RoamRescanRssiDiff;
tANI_U8 RoamRssiDiff;
tANI_U8 ChannelCacheType;
tANI_U8 Command;
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 868aedc4df47..0e5804f8b6a0 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -4463,11 +4463,12 @@ VOS_STATUS wma_roam_scan_offload_init_connect(tp_wma_handle wma_handle)
*/
/* rssi_thresh = 10 is low enough */
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle, WMA_ROAM_LOW_RSSI_TRIGGER_VERYLOW,
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff);
vos_status = wma_roam_scan_offload_scan_period(wma_handle,
WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT, WMA_ROAM_OPP_SCAN_AGING_PERIOD_DEFAULT);
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT, WMA_ROAM_BEACON_WEIGHT_DEFAULT);
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff,
+ WMA_ROAM_BEACON_WEIGHT_DEFAULT);
wma_roam_scan_fill_ap_profile(wma_handle, pMac, NULL, &ap_profile);
vos_status = wma_roam_scan_offload_ap_profile(wma_handle, &ap_profile);
@@ -4532,9 +4533,10 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
/* First parameter is positive rssi value to trigger rssi based scan.
* Opportunistic scan is started at 30 dB higher that trigger rssi.
*/
+
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
- (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ (roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
+ roam_req->OpportunisticScanThresholdDiff);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
@@ -4552,7 +4554,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
* 2 times the current beacon's rssi.
*/
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT,
+ roam_req->RoamRescanRssiDiff,
WMA_ROAM_BEACON_WEIGHT_DEFAULT);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
@@ -4625,7 +4627,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
vos_status = wma_roam_scan_offload_rssi_thresh(wma_handle,
(roam_req->LookupThreshold - WMA_NOISE_FLOOR_DBM_DEFAULT),
- WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT);
+ roam_req->OpportunisticScanThresholdDiff);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
}
@@ -4638,7 +4640,7 @@ VOS_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
}
vos_status = wma_roam_scan_offload_rssi_change(wma_handle,
- WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT,
+ roam_req->RoamRescanRssiDiff,
WMA_ROAM_BEACON_WEIGHT_DEFAULT);
if (vos_status != VOS_STATUS_SUCCESS) {
break;
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index a493d0eab50e..3cdf793ee847 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -151,8 +151,6 @@
#define WMA_ROAM_MAX_REST_TIME_DEFAULT (500)
#define WMA_ROAM_LOW_RSSI_TRIGGER_DEFAULT (20)
#define WMA_ROAM_LOW_RSSI_TRIGGER_VERYLOW (10)
-#define WMA_ROAM_RSSI_THRESH_DIFF_DEFAULT (30)
-#define WMA_ROAM_RSSI_CHANGE_RESCAN_DEFAULT (5)
#define WMA_ROAM_BEACON_WEIGHT_DEFAULT (14)
#define WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT (120000)
#define WMA_ROAM_OPP_SCAN_AGING_PERIOD_DEFAULT (WMA_ROAM_OPP_SCAN_PERIOD_DEFAULT * 5)
diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h
index 411391e22849..39da69fcbcab 100644
--- a/CORE/SME/inc/csrApi.h
+++ b/CORE/SME/inc/csrApi.h
@@ -968,6 +968,8 @@ typedef struct tagCsrNeighborRoamConfigParams
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
tANI_U16 nEmptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
}tCsrNeighborRoamConfigParams;
#endif
diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h
index 879c119c22de..77b44c364692 100644
--- a/CORE/SME/inc/csrInternal.h
+++ b/CORE/SME/inc/csrInternal.h
@@ -510,6 +510,8 @@ typedef struct tagCsrNeighborRoamConfig
tANI_U8 nMaxNeighborRetries;
tANI_U16 nNeighborResultsRefreshPeriod;
tANI_U16 nEmptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
}tCsrNeighborRoamConfig;
#endif
diff --git a/CORE/SME/inc/csrNeighborRoam.h b/CORE/SME/inc/csrNeighborRoam.h
index 1c78207c0667..f0d4f143e140 100644
--- a/CORE/SME/inc/csrNeighborRoam.h
+++ b/CORE/SME/inc/csrNeighborRoam.h
@@ -69,6 +69,8 @@ typedef struct sCsrNeighborRoamCfgParams
tANI_U32 maxChannelScanTime;
tANI_U16 neighborResultsRefreshPeriod;
tANI_U16 emptyScanRefreshPeriod;
+ tANI_U8 nOpportunisticThresholdDiff;
+ tANI_U8 nRoamRescanRssiDiff;
} tCsrNeighborRoamCfgParams, *tpCsrNeighborRoamCfgParams;
#define CSR_NEIGHBOR_ROAM_INVALID_CHANNEL_INDEX 255
@@ -169,6 +171,8 @@ typedef struct sCsrNeighborRoamControlInfo
tCsrTimerInfo neighborScanTimerInfo;
tCsrNeighborRoamChannelInfo roamChannelInfo;
tANI_U8 currentNeighborLookupThreshold;
+ tANI_U8 currentOpportunisticThresholdDiff;
+ tANI_U8 currentRoamRescanRssiDiff;
tANI_BOOLEAN scanRspPending;
tANI_TIMESTAMP scanRequestTimeStamp;
tDblLinkList roamableAPList; // List of current FT candidates
@@ -226,6 +230,12 @@ tANI_BOOLEAN csrNeighborRoamStatePreauthDone(tpAniSirGlobal pMac);
tANI_BOOLEAN csrNeighborRoamScanRspPending(tHalHandle hHal);
tANI_BOOLEAN csrNeighborMiddleOfRoaming(tHalHandle hHal);
VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t neighborLookupRssiThreshold);
+VOS_STATUS
+csrNeighborRoamSetOpportunisticScanThresholdDiff(tpAniSirGlobal pMac,
+ v_U8_t nOpportunisticThresholdDiff);
+VOS_STATUS
+csrNeighborRoamSetRoamRescanRssiDiff(tpAniSirGlobal pMac,
+ v_U8_t nRoamRescanRssiDiff);
VOS_STATUS csrNeighborRoamUpdateFastRoamingEnabled(tpAniSirGlobal pMac, const v_BOOL_t fastRoamEnabled);
VOS_STATUS csrNeighborRoamUpdateCcxModeEnabled(tpAniSirGlobal pMac, const v_BOOL_t ccxMode);
VOS_STATUS csrNeighborRoamChannelsFilterByCurrentBand(
@@ -268,6 +278,8 @@ VOS_STATUS csrNeighborRoamMergeChannelLists(tpAniSirGlobal pMac,
#define REASON_OS_REQUESTED_ROAMING_NOW 15
#define REASON_SCAN_CH_TIME_CHANGED 16
#define REASON_SCAN_HOME_TIME_CHANGED 17
+#define REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED 18
+#define REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED 19
eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reason);
eHalStatus csrNeighborRoamCandidateFoundIndHdlr(tpAniSirGlobal pMac, void* pMsg);
eHalStatus csrNeighborRoamHandoffReqHdlr(tpAniSirGlobal pMac, void* pMsg);
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index 73bea8197c1f..e605b55a3d1e 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2719,6 +2719,57 @@ eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
v_BOOL_t fEnableFwRssiMonitoring);
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamRescanRssiDiff
+ \brief Update Roam Rescan RSSI diff
+ This function is called through dynamic setConfig callback function
+ to configure nRoamRescanRssiDiff
+ \param hHal - HAL handle for device
+ \param nRoamRescanRssiDiff - Roam Rescan Rssi Diff
+ \return eHAL_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
+ successfully.
+ else SME is failed to update nRoamRescanRssiDiff
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_SetRoamRescanRssiDiff(tHalHandle hHal,
+ const v_U8_t nRoamRescanRssiDiff);
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamRescanRssiDiff
+ \brief gets Roam Rescan RSSI diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nRoamRescanRssiDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamRescanRssiDiff(tHalHandle hHal);
+
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamOpportunisticScanThresholdDiff
+ \brief Update Opportunistic Scan threshold diff
+ This function is called through dynamic setConfig callback function
+ to configure nOpportunisticThresholdDiff
+ \param hHal - HAL handle for device
+ \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
+ \return eHAL_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
+ successfully.
+ else SME is failed to update nOpportunisticThresholdDiff.
+ -------------------------------------------------------------------------*/
+
+eHalStatus sme_SetRoamOpportunisticScanThresholdDiff(tHalHandle hHal,
+ const v_U8_t nOpportunisticThresholdDiff);
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamOpportunisticScanThresholdDiff()
+ \brief gets Opportunistic Scan threshold diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nOpportunisticThresholdDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamOpportunisticScanThresholdDiff(tHalHandle hHal);
+
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronuous call
diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c
index 45a49711be2e..f794967949a3 100644
--- a/CORE/SME/src/csr/csrApiRoam.c
+++ b/CORE/SME/src/csr/csrApiRoam.c
@@ -1079,6 +1079,8 @@ static void initConfigParam(tpAniSirGlobal pMac)
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries = 3;
pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold = 120;
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff = 30;
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff = 5;
pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold = 125;
pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime = 20;
pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime = 40;
@@ -1754,6 +1756,8 @@ eHalStatus csrChangeDefaultConfigParam(tpAniSirGlobal pMac, tCsrConfigParam *pPa
smsLog( pMac, LOG1, "nNeighborScanTimerPerioid = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod);
smsLog( pMac, LOG1, "nNeighborReassocRssiThreshold = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold);
smsLog( pMac, LOG1, "nNeighborLookupRssiThreshold = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold);
+ smsLog( pMac, LOG1, "nOpportunisticThresholdDiff = %d", pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff);
+ smsLog( pMac, LOG1, "nRoamRescanRssiDiff = %d", pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff);
smsLog( pMac, LOG1, "nNeighborScanMinChanTime = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime);
smsLog( pMac, LOG1, "nNeighborScanMaxChanTime = %d", pMac->roam.configParam.neighborRoamConfig.nNeighborScanMaxChanTime);
smsLog( pMac, LOG1, "nMaxNeighborRetries = %d", pMac->roam.configParam.neighborRoamConfig.nMaxNeighborRetries);
@@ -15838,6 +15842,10 @@ eHalStatus csrRoamOffloadScan(tpAniSirGlobal pMac, tANI_U8 command, tANI_U8 reas
pMac->roam.roamSession[sessionId].connectedProfile.mcEncryptionType;
pRequestBuf->LookupThreshold =
(v_S7_t)pNeighborRoamInfo->cfgParams.neighborLookupThreshold * (-1);
+ pRequestBuf->OpportunisticScanThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pRequestBuf->RoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
pRequestBuf->RoamRssiDiff =
pMac->roam.configParam.RoamRssiDiff;
pRequestBuf->Command = command;
diff --git a/CORE/SME/src/csr/csrNeighborRoam.c b/CORE/SME/src/csr/csrNeighborRoam.c
index bbcc8d7730fc..22bdf60b3917 100644
--- a/CORE/SME/src/csr/csrNeighborRoam.c
+++ b/CORE/SME/src/csr/csrNeighborRoam.c
@@ -514,6 +514,112 @@ VOS_STATUS csrNeighborRoamSetLookupRssiThreshold(tpAniSirGlobal pMac, v_U8_t nei
return vosStatus;
}
+VOS_STATUS
+csrNeighborRoamSetOpportunisticScanThresholdDiff(tpAniSirGlobal pMac,
+ v_U8_t nOpportunisticThresholdDiff)
+{
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in CONNECTED state, so deregister"
+ " all and re-register for DOWN event again"));
+
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ pMac->roam.neighborRoamInfo.currentOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
+ }
+#endif
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in INIT state, safe to set"
+ " opportunistic threshold diff"));
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ pMac->roam.neighborRoamInfo.currentOpportunisticThresholdDiff =
+ nOpportunisticThresholdDiff;
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOGE,
+ FL("Unexpected state %d"
+ " returning failure"),
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
+VOS_STATUS
+csrNeighborRoamSetRoamRescanRssiDiff(tpAniSirGlobal pMac,
+ v_U8_t nRoamRescanRssiDiff)
+{
+ VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
+
+ if (eCSR_NEIGHBOR_ROAM_STATE_CONNECTED
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in CONNECTED state, so deregister"
+ " all and re-register for DOWN event again"));
+
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ pMac->roam.neighborRoamInfo.currentRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+
+ /* De-register existing lookup UP/DOWN, Rssi indications */
+#ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD
+ if (pMac->roam.configParam.isRoamOffloadScanEnabled)
+ {
+ csrRoamOffloadScan(pMac,
+ ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+ REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
+ }
+#endif
+ }
+ else if (eCSR_NEIGHBOR_ROAM_STATE_INIT
+ == pMac->roam.neighborRoamInfo.neighborRoamState)
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOG2,
+ FL("Currently in INIT state, safe to set"
+ " roam rescan rssi diff"));
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ pMac->roam.neighborRoamInfo.currentRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ }
+ else
+ {
+ NEIGHBOR_ROAM_DEBUG(pMac,
+ LOGE,
+ FL("Unexpected state %d"
+ " returning failure"),
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ vosStatus = VOS_STATUS_E_FAILURE;
+ }
+ return vosStatus;
+}
+
/* ---------------------------------------------------------------------------
\fn csrNeighborRoamReassocIndCallback
@@ -712,6 +818,10 @@ static void csrNeighborRoamDeregAllRssiIndication(tpAniSirGlobal pMac)
/* Reset thresholds only after deregistering DOWN event from TL */
pNeighborRoamInfo->currentNeighborLookupThreshold =
pNeighborRoamInfo->cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
@@ -4171,6 +4281,10 @@ eHalStatus csrNeighborRoamIndicateConnect(tpAniSirGlobal pMac, tANI_U8 sessionId
pNeighborRoamInfo->neighborScanTimerInfo.sessionId = sessionId;
pNeighborRoamInfo->currentNeighborLookupThreshold =
pNeighborRoamInfo->cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->uEmptyScanCount = 0;
pNeighborRoamInfo->lookupDOWNRssi = 0;
@@ -4356,6 +4470,10 @@ eHalStatus csrNeighborRoamInit(tpAniSirGlobal pMac)
pNeighborRoamInfo->cfgParams.minChannelScanTime = pMac->roam.configParam.neighborRoamConfig.nNeighborScanMinChanTime;
pNeighborRoamInfo->cfgParams.maxNeighborRetries = 0;
pNeighborRoamInfo->cfgParams.neighborLookupThreshold = pMac->roam.configParam.neighborRoamConfig.nNeighborLookupRssiThreshold;
+ pNeighborRoamInfo->cfgParams.nOpportunisticThresholdDiff =
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->cfgParams.nRoamRescanRssiDiff =
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
pNeighborRoamInfo->cfgParams.neighborReassocThreshold = pMac->roam.configParam.neighborRoamConfig.nNeighborReassocRssiThreshold;
pNeighborRoamInfo->cfgParams.neighborScanPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborScanTimerPeriod;
pNeighborRoamInfo->cfgParams.neighborResultsRefreshPeriod = pMac->roam.configParam.neighborRoamConfig.nNeighborResultsRefreshPeriod;
@@ -4380,6 +4498,10 @@ eHalStatus csrNeighborRoamInit(tpAniSirGlobal pMac)
vos_mem_set(pNeighborRoamInfo->currAPbssid, sizeof(tCsrBssid), 0);
pNeighborRoamInfo->currentNeighborLookupThreshold = pMac->roam.neighborRoamInfo.cfgParams.neighborLookupThreshold;
+ pNeighborRoamInfo->currentOpportunisticThresholdDiff =
+ pMac->roam.neighborRoamInfo.cfgParams.nOpportunisticThresholdDiff;
+ pNeighborRoamInfo->currentRoamRescanRssiDiff =
+ pMac->roam.neighborRoamInfo.cfgParams.nRoamRescanRssiDiff;
#ifdef FEATURE_WLAN_LFR
pNeighborRoamInfo->lookupDOWNRssi = 0;
pNeighborRoamInfo->uEmptyScanCount = 0;
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 28cd9257abcf..93c40bc7fe60 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -9182,6 +9182,111 @@ eHalStatus sme_UpdateConfigFwRssiMonitoring(tHalHandle hHal,
}
#ifdef WLAN_FEATURE_NEIGHBOR_ROAMING
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamOpportunisticScanThresholdDiff
+ \brief Update Opportunistic Scan threshold diff
+ This function is called through dynamic setConfig callback function
+ to configure nOpportunisticThresholdDiff
+ \param hHal - HAL handle for device
+ \param nOpportunisticThresholdDiff - Opportunistic Scan threshold diff
+ \return eHAL_STATUS_SUCCESS - SME update nOpportunisticThresholdDiff config
+ successfully.
+ else SME is failed to update nOpportunisticThresholdDiff.
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamOpportunisticScanThresholdDiff(tHalHandle hHal,
+ const v_U8_t nOpportunisticThresholdDiff)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrNeighborRoamSetOpportunisticScanThresholdDiff(pMac,
+ nOpportunisticThresholdDiff);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set "
+ "opportunistic threshold diff to %d"
+ " - old value is %d - roam state is %d",
+ nOpportunisticThresholdDiff,
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff = nOpportunisticThresholdDiff;
+ }
+ sme_ReleaseGlobalLock( &pMac->sme );
+ }
+ return status;
+}
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamOpportunisticScanThresholdDiff()
+ \brief gets Opportunistic Scan threshold diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_U8_t - nOpportunisticThresholdDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamOpportunisticScanThresholdDiff(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nOpportunisticThresholdDiff;
+}
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SetRoamRescanRssiDiff
+ \brief Update roam rescan rssi diff
+ This function is called through dynamic setConfig callback function
+ to configure nRoamRescanRssiDiff
+ \param hHal - HAL handle for device
+ \param nRoamRescanRssiDiff - roam rescan rssi diff
+ \return eHAL_STATUS_SUCCESS - SME update nRoamRescanRssiDiff config
+ successfully.
+ else SME is failed to update nRoamRescanRssiDiff.
+ -------------------------------------------------------------------------*/
+eHalStatus sme_SetRoamRescanRssiDiff(tHalHandle hHal,
+ const v_U8_t nRoamRescanRssiDiff)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ eHalStatus status = eHAL_STATUS_SUCCESS;
+
+ status = sme_AcquireGlobalLock( &pMac->sme );
+ if ( HAL_STATUS_SUCCESS( status ) )
+ {
+ status = csrNeighborRoamSetRoamRescanRssiDiff(pMac,
+ nRoamRescanRssiDiff);
+ if (HAL_STATUS_SUCCESS(status))
+ {
+ VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_DEBUG,
+ "LFR runtime successfully set "
+ "opportunistic threshold diff to %d"
+ " - old value is %d - roam state is %d",
+ nRoamRescanRssiDiff,
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff,
+ pMac->roam.neighborRoamInfo.neighborRoamState);
+ pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff =
+ nRoamRescanRssiDiff;
+ }
+ sme_ReleaseGlobalLock(&pMac->sme);
+ }
+ return status;
+}
+
+/*--------------------------------------------------------------------------
+ \fn sme_GetRoamRescanRssiDiff
+ \brief gets roam rescan rssi diff
+ This is a synchronous call
+ \param hHal - The handle returned by macOpen
+ \return v_S7_t - nRoamRescanRssiDiff
+ \sa
+ --------------------------------------------------------------------------*/
+v_U8_t sme_GetRoamRescanRssiDiff(tHalHandle hHal)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT( hHal );
+ return pMac->roam.configParam.neighborRoamConfig.nRoamRescanRssiDiff;
+}
+
/*--------------------------------------------------------------------------
\brief sme_setNeighborLookupRssiThreshold() - update neighbor lookup rssi threshold
This is a synchronous call