diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c
index f20f5af546cc..666da310b29e 100644
--- a/components/mlme/core/src/wlan_mlme_main.c
+++ b/components/mlme/core/src/wlan_mlme_main.c
@@ -1863,6 +1863,8 @@ static void mlme_init_scoring_cfg(struct wlan_objmgr_psoc *psoc,
cfg_get(psoc, CFG_ROAM_TRIGGER_BITMAP);
scoring_cfg->roam_score_delta = cfg_get(psoc, CFG_ROAM_SCORE_DELTA);
scoring_cfg->apsd_enabled = (bool)cfg_default(CFG_APSD_ENABLED);
+ scoring_cfg->min_roam_score_delta =
+ cfg_get(psoc, CFG_CAND_MIN_ROAM_SCORE_DELTA);
}
static void mlme_init_oce_cfg(struct wlan_objmgr_psoc *psoc,
diff --git a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h
index d5c39bc3fab2..26cc36939a3d 100644
--- a/components/mlme/dispatcher/inc/cfg_mlme_scoring.h
+++ b/components/mlme/dispatcher/inc/cfg_mlme_scoring.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -1035,6 +1035,40 @@
CFG_VALUE_OR_DEFAULT, \
"candidate AP's percentage roam score delta")
+/*
+ *
+ * min_roam_score_delta - Difference of roam score values between connected
+ * AP and roam candidate AP.
+ * @Min: 0
+ * @Max: 10000
+ * @Default: 1850
+ *
+ * This ini is used during CU and low rssi based roam triggers, consider
+ * AP as roam candidate only if its roam score is better than connected
+ * AP score by at least min_roam_score_delta.
+ * If user configured "roam_score_delta" and "min_roam_score_delta" both,
+ * then firmware selects roam candidate AP by considering values of both
+ * INIs.
+ * Example: If DUT is connected with AP1 and roam candidate AP2 has roam
+ * score greater than roam_score_delta and min_roam_score_delta then only
+ * firmware will trigger roaming to AP2.
+ *
+ * Related: roam_score_delta
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: Internal
+ *
+ *
+ */
+#define CFG_CAND_MIN_ROAM_SCORE_DELTA CFG_INI_UINT( \
+ "min_roam_score_delta", \
+ 0, \
+ 10000, \
+ 1850, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Diff between connected AP's and candidate AP's roam score")
+
/*
*
* enable_scoring_for_roam - enable/disable scoring logic in FW for candidate
@@ -1256,6 +1290,7 @@
CFG(CFG_SCORING_OCE_WAN_SCORE_IDX_15_TO_12) \
CFG(CFG_ROAM_TRIGGER_BITMAP) \
CFG(CFG_ROAM_SCORE_DELTA) \
+ CFG(CFG_CAND_MIN_ROAM_SCORE_DELTA) \
CFG(CFG_ENABLE_SCORING_FOR_ROAM) \
CFG(CFG_APSD_ENABLED) \
CFG(CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI) \
diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
index c1da33782bd0..f3e241d11978 100644
--- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
+++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
@@ -1877,6 +1877,8 @@ struct wlan_mlme_per_slot_scoring {
* @roam_score_delta: percentage delta in roam score
* @apsd_enabled: Enable automatic power save delivery
* @vendor_roam_score_algorithm: Preferred vendor roam score algorithm
+ * @min_roam_score_delta: Minimum difference between connected AP's and
+ * candidate AP's roam score to start roaming.
*/
struct wlan_mlme_scoring_cfg {
bool enable_scoring_for_roam;
@@ -1891,6 +1893,7 @@ struct wlan_mlme_scoring_cfg {
uint32_t roam_score_delta;
bool apsd_enabled;
uint32_t vendor_roam_score_algorithm;
+ uint32_t min_roam_score_delta;
};
/* struct wlan_mlme_threshold - Threshold related config items
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 984045f70619..da38756e7a93 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -18817,6 +18817,8 @@ static void csr_update_score_params(struct mac_context *mac_ctx,
bss_score_params->oce_wan_scoring.score_pcnt11_to_8;
req_score_params->oce_wan_scoring.score_pcnt15_to_12 =
bss_score_params->oce_wan_scoring.score_pcnt15_to_12;
+ req_score_params->cand_min_roam_score_delta =
+ bss_score_params->min_roam_score_delta;
}
uint8_t csr_get_roam_enabled_sta_sessionid(struct mac_context *mac_ctx)