diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 6b23d99a0cb4..17c16fa0f490 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -9139,6 +9139,31 @@ enum hdd_wext_control {
#define CFG_MAX_WOW_FILTERS_MAX (WOW_MAX_BITMAP_FILTERS)
#define CFG_MAX_WOW_FILTERS_DEFAULT (WOW_MAX_BITMAP_FILTERS)
+/*
+ *
+ * gper_min_rssi_threshold_for_roam - Minimum roamable AP RSSI for
+ * candidate selection for PER based roam
+ * @Min: 0
+ * @Max: 96
+ * @Default: 83
+ *
+ * Minimum roamable AP RSSI for candidate selection for PER based roam
+ *
+ * Related: gper_roam_enabled, gper_roam_high_rate_th, gper_roam_low_rate_th,
+ * gper_roam_th_percent, gper_roam_rest_time
+ *
+ * Supported Feature: LFR-3.0
+ *
+ * Usage: Internal
+ *
+ *
+ */
+#define CFG_PER_ROAM_MIN_CANDIDATE_RSSI "gper_min_rssi_threshold_for_roam"
+#define CFG_PER_ROAM_MIN_CANDIDATE_RSSI_MIN (0)
+#define CFG_PER_ROAM_MIN_CANDIDATE_RSSI_MAX (96)
+#define CFG_PER_ROAM_MIN_CANDIDATE_RSSI_DEFAULT (83)
+
+
/*
*
* gEnableImps - Enable/Disable IMPS
@@ -10957,6 +10982,7 @@ struct hdd_config {
uint32_t per_roam_th_percent;
uint32_t per_roam_rest_time;
uint32_t per_roam_mon_time;
+ uint32_t min_candidate_rssi;
enum active_bpf_mode active_uc_bpf_mode;
enum active_bpf_mode active_mc_bc_bpf_mode;
bool enable_bcast_probe_rsp;
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index 7f637e56d62e..9eb654ea1317 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -4255,6 +4255,13 @@ struct reg_table_entry g_registry_table[] = {
CFG_PER_ROAM_MONITOR_TIME_MIN,
CFG_PER_ROAM_MONITOR_TIME_MAX),
+ REG_VARIABLE(CFG_PER_ROAM_MIN_CANDIDATE_RSSI, WLAN_PARAM_Integer,
+ struct hdd_config, min_candidate_rssi,
+ VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
+ CFG_PER_ROAM_MIN_CANDIDATE_RSSI_DEFAULT,
+ CFG_PER_ROAM_MIN_CANDIDATE_RSSI_MIN,
+ CFG_PER_ROAM_MIN_CANDIDATE_RSSI_MAX),
+
REG_VARIABLE(CFG_ACTIVE_UC_BPF_MODE_NAME, WLAN_PARAM_Integer,
struct hdd_config, active_uc_bpf_mode,
VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT,
@@ -5215,7 +5222,9 @@ static void hdd_per_roam_print_ini_config(hdd_context_t *hdd_ctx)
hdd_debug("Name = [%s] Value = [%u]",
CFG_PER_ROAM_MONITOR_TIME,
hdd_ctx->config->per_roam_mon_time);
-
+ hdd_debug("Name = [%s] Value = [%u]",
+ CFG_PER_ROAM_MIN_CANDIDATE_RSSI,
+ hdd_ctx->config->min_candidate_rssi);
}
/**
@@ -7123,6 +7132,10 @@ static void hdd_update_per_config_to_sme(hdd_context_t *hdd_ctx,
hdd_ctx->config->per_roam_mon_time;
sme_config->csrConfig.per_roam_config.rx_per_mon_time =
hdd_ctx->config->per_roam_mon_time;
+
+ /* Assigning minimum roamable AP RSSI for candidate selection */
+ sme_config->csrConfig.per_roam_config.min_candidate_rssi =
+ hdd_ctx->config->min_candidate_rssi;
}
/**
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 10cabc52ebb8..07d050a9de21 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -2747,6 +2747,8 @@ QDF_STATUS csr_change_default_config_param(tpAniSirGlobal pMac,
pParam->per_roam_config.tx_per_mon_time;
pMac->roam.configParam.per_roam_config.rx_per_mon_time =
pParam->per_roam_config.rx_per_mon_time;
+ pMac->roam.configParam.per_roam_config.min_candidate_rssi =
+ pParam->per_roam_config.min_candidate_rssi;
pMac->fEnableDebugLog = pParam->fEnableDebugLog;
@@ -2975,6 +2977,8 @@ QDF_STATUS csr_get_config_param(tpAniSirGlobal pMac, tCsrConfigParam *pParam)
cfg_params->per_roam_config.tx_per_mon_time;
pParam->per_roam_config.rx_per_mon_time =
cfg_params->per_roam_config.rx_per_mon_time;
+ pParam->per_roam_config.min_candidate_rssi =
+ cfg_params->per_roam_config.min_candidate_rssi;
pParam->conc_custom_rule1 = cfg_params->conc_custom_rule1;
pParam->conc_custom_rule2 = cfg_params->conc_custom_rule2;
@@ -17864,15 +17868,18 @@ csr_create_per_roam_request(tpAniSirGlobal mac_ctx, uint8_t session_id)
mac_ctx->roam.configParam.per_roam_config.tx_rate_thresh_percnt;
req_buf->per_config.rx_rate_thresh_percnt =
mac_ctx->roam.configParam.per_roam_config.rx_rate_thresh_percnt;
+ req_buf->per_config.min_candidate_rssi =
+ mac_ctx->roam.configParam.per_roam_config.min_candidate_rssi;
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
- "PER based roaming configuaration enable: %d vdev: %d high_rate_thresh: %d low_rate_thresh: %d rate_thresh_percnt: %d per_rest_time: %d monitor_time: %d",
+ "PER based roaming configuaration enable: %d vdev: %d high_rate_thresh: %d low_rate_thresh: %d rate_thresh_percnt: %d per_rest_time: %d monitor_time: %d min cand rssi: %d",
req_buf->per_config.enable, session_id,
req_buf->per_config.tx_high_rate_thresh,
req_buf->per_config.tx_low_rate_thresh,
req_buf->per_config.tx_rate_thresh_percnt,
req_buf->per_config.per_rest_time,
- req_buf->per_config.tx_per_mon_time);
+ req_buf->per_config.tx_per_mon_time,
+ req_buf->per_config.min_candidate_rssi);
return req_buf;
}