diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c
index 22b776a0ba..7142592782 100644
--- a/components/mlme/core/src/wlan_mlme_main.c
+++ b/components/mlme/core/src/wlan_mlme_main.c
@@ -2147,6 +2147,12 @@ mlme_init_roam_score_config(struct wlan_objmgr_psoc *psoc,
min_rssi_param->min_rssi =
cfg_get(psoc, CFG_BMISS_ROAM_MIN_RSSI);
min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_BMISS;
+
+ min_rssi_param = &mlme_cfg->trig_min_rssi[MIN_RSSI_2G_TO_5G_ROAM];
+ min_rssi_param->min_rssi =
+ cfg_get(psoc, CFG_2G_TO_5G_ROAM_MIN_RSSI);
+ min_rssi_param->trigger_reason = ROAM_TRIGGER_REASON_HIGH_RSSI;
+
}
/**
diff --git a/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h b/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h
index 1d52767f8e..007e46a018 100644
--- a/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h
+++ b/components/mlme/dispatcher/inc/cfg_mlme_roam_scoring.h
@@ -229,6 +229,33 @@
CFG_VALUE_OR_DEFAULT, \
"Minimum RSSI of candidate AP for Bmiss roam trigger")
+/*
+ *
+ * min_rssi_for_2g_to_5g_roam - Candidate AP minimum RSSI for
+ * 2G to 5G roam trigger (in dBm)
+ * @Min: -120
+ * @Max: 0
+ * @Default: -70
+ *
+ * Minimum RSSI value of the candidate AP to consider it as candidate
+ * for 2G to 5G roam.
+ *
+ * Related: None
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: Internal/External
+ *
+ *
+ */
+#define CFG_2G_TO_5G_ROAM_MIN_RSSI CFG_INI_INT( \
+ "min_rssi_for_2g_to_5g_roam", \
+ -120, \
+ 0, \
+ -70, \
+ CFG_VALUE_OR_DEFAULT, \
+ "Minimum RSSI of candidate AP for 2G to 5G roam trigger")
+
/*
*
* idle_roam_score_delta - Roam score delta value in percentage for idle roam.
@@ -323,6 +350,7 @@
CFG(CFG_APSD_ENABLED) \
CFG(CFG_DISCONNECT_ROAM_TRIGGER_MIN_RSSI) \
CFG(CFG_BMISS_ROAM_MIN_RSSI) \
+ CFG(CFG_2G_TO_5G_ROAM_MIN_RSSI) \
CFG(CFG_IDLE_ROAM_SCORE_DELTA) \
CFG(CFG_BTM_ROAM_SCORE_DELTA) \
CFG(CFG_VENDOR_ROAM_SCORE_ALGORITHM)
diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
index 1481d5d137..e254d8ab19 100644
--- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
+++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h
@@ -2391,7 +2391,7 @@ struct wlan_mlme_cfg {
struct wlan_mlme_dot11_mode dot11_mode;
struct wlan_mlme_reg reg;
struct roam_trigger_score_delta trig_score_delta[NUM_OF_ROAM_TRIGGERS];
- struct roam_trigger_min_rssi trig_min_rssi[NUM_OF_ROAM_TRIGGERS];
+ struct roam_trigger_min_rssi trig_min_rssi[NUM_OF_ROAM_MIN_RSSI];
struct wlan_mlme_ratemask ratemask_cfg;
};
diff --git a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c
index 0e0f95d1de..b2ec47fbad 100644
--- a/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c
+++ b/components/target_if/connection_mgr/src/target_if_cm_roam_offload.c
@@ -627,6 +627,12 @@ target_if_cm_roam_scan_offload_ap_profile(
req->min_rssi_params[BMISS_MIN_RSSI].min_rssi -=
NOISE_FLOOR_DBM_DEFAULT;
req->min_rssi_params[BMISS_MIN_RSSI].min_rssi &= 0x000000ff;
+
+ req->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi -=
+ NOISE_FLOOR_DBM_DEFAULT;
+ req->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi &=
+ 0x000000ff;
+
}
return wmi_unified_send_roam_scan_offload_ap_cmd(wmi_handle, req);
diff --git a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h
index 56c771c408..0403191051 100644
--- a/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h
+++ b/components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h
@@ -289,8 +289,10 @@ struct scoring_param {
#define IDLE_ROAM_TRIGGER 0
#define BTM_ROAM_TRIGGER 1
+#define NUM_OF_ROAM_MIN_RSSI 3
#define DEAUTH_MIN_RSSI 0
#define BMISS_MIN_RSSI 1
+#define MIN_RSSI_2G_TO_5G_ROAM 2
/**
* enum roam_trigger_reason - Reason for triggering roam
@@ -381,7 +383,7 @@ struct ap_profile_params {
uint8_t vdev_id;
struct ap_profile profile;
struct scoring_param param;
- struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS];
+ struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_MIN_RSSI];
struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS];
};
diff --git a/components/wmi/src/wmi_unified_roam_tlv.c b/components/wmi/src/wmi_unified_roam_tlv.c
index 498d51a020..13bf9cfada 100644
--- a/components/wmi/src/wmi_unified_roam_tlv.c
+++ b/components/wmi/src/wmi_unified_roam_tlv.c
@@ -3036,7 +3036,7 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle,
len += WMI_TLV_HDR_SIZE;
len += NUM_OF_ROAM_TRIGGERS * sizeof(*score_delta_param);
len += WMI_TLV_HDR_SIZE;
- len += NUM_OF_ROAM_TRIGGERS * sizeof(*min_rssi_param);
+ len += NUM_OF_ROAM_MIN_RSSI * sizeof(*min_rssi_param);
buf = wmi_buf_alloc(wmi_handle, len);
if (!buf)
return QDF_STATUS_E_NOMEM;
@@ -3240,7 +3240,7 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle,
buf_ptr += sizeof(*score_delta_param);
WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
- (NUM_OF_ROAM_TRIGGERS * sizeof(*min_rssi_param)));
+ (NUM_OF_ROAM_MIN_RSSI * sizeof(*min_rssi_param)));
buf_ptr += WMI_TLV_HDR_SIZE;
min_rssi_param = (wmi_roam_cnd_min_rssi_param *)buf_ptr;
@@ -3266,6 +3266,18 @@ send_roam_scan_offload_ap_profile_cmd_tlv(wmi_unified_t wmi_handle,
min_rssi_param->candidate_min_rssi =
ap_profile->min_rssi_params[BMISS_MIN_RSSI].min_rssi;
+ buf_ptr += sizeof(*min_rssi_param);
+ min_rssi_param = (wmi_roam_cnd_min_rssi_param *)buf_ptr;
+ WMITLV_SET_HDR(&min_rssi_param->tlv_header,
+ WMITLV_TAG_STRUC_wmi_roam_cnd_min_rssi_param,
+ WMITLV_GET_STRUCT_TLVLEN(wmi_roam_cnd_min_rssi_param));
+ trig_reason =
+ ap_profile->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].trigger_reason;
+ min_rssi_param->roam_trigger_reason =
+ convert_roam_trigger_reason(trig_reason);
+ min_rssi_param->candidate_min_rssi =
+ ap_profile->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi;
+
wmi_mtrace(WMI_ROAM_AP_PROFILE, NO_SESSION, 0);
status = wmi_unified_cmd_send(wmi_handle, buf,
len, WMI_ROAM_AP_PROFILE);
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index a4165a8561..2d5a724bdf 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -2338,7 +2338,7 @@ struct roam_offload_scan_req {
uint32_t roam_inactive_data_packet_count;
uint32_t roam_scan_period_after_inactivity;
uint32_t btm_query_bitmask;
- struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_TRIGGERS];
+ struct roam_trigger_min_rssi min_rssi_params[NUM_OF_ROAM_MIN_RSSI];
struct roam_trigger_score_delta score_delta_param[NUM_OF_ROAM_TRIGGERS];
uint32_t full_roam_scan_period;
};
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index c7fca3c6f8..c9ade41653 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -17710,6 +17710,9 @@ csr_create_roam_scan_offload_request(struct mac_context *mac_ctx,
mac_ctx->mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI];
req_buf->min_rssi_params[BMISS_MIN_RSSI] =
mac_ctx->mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI];
+ req_buf->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM] =
+ mac_ctx->mlme_cfg->trig_min_rssi[MIN_RSSI_2G_TO_5G_ROAM];
+
req_buf->score_delta_param[IDLE_ROAM_TRIGGER] =
mac_ctx->mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER];
req_buf->score_delta_param[BTM_ROAM_TRIGGER] =
@@ -19978,6 +19981,9 @@ csr_cm_roam_scan_offload_ap_profile(struct mac_context *mac_ctx,
mac_ctx->mlme_cfg->trig_min_rssi[DEAUTH_MIN_RSSI];
params->min_rssi_params[BMISS_MIN_RSSI] =
mac_ctx->mlme_cfg->trig_min_rssi[BMISS_MIN_RSSI];
+ params->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM] =
+ mac_ctx->mlme_cfg->trig_min_rssi[MIN_RSSI_2G_TO_5G_ROAM];
+
params->score_delta_param[IDLE_ROAM_TRIGGER] =
mac_ctx->mlme_cfg->trig_score_delta[IDLE_ROAM_TRIGGER];
params->score_delta_param[BTM_ROAM_TRIGGER] =
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index f26e869186..6645ad17ea 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -1420,6 +1420,9 @@ static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
roam_req->min_rssi_params[DEAUTH_MIN_RSSI];
ap_profile.min_rssi_params[BMISS_MIN_RSSI] =
roam_req->min_rssi_params[BMISS_MIN_RSSI];
+ ap_profile.min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM] =
+ roam_req->min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM];
+
if (!db2dbm_enabled) {
ap_profile.min_rssi_params[DEAUTH_MIN_RSSI].min_rssi -=
WMA_NOISE_FLOOR_DBM_DEFAULT;
@@ -1430,6 +1433,11 @@ static QDF_STATUS wma_roam_scan_offload_ap_profile(tp_wma_handle wma_handle,
WMA_NOISE_FLOOR_DBM_DEFAULT;
ap_profile.min_rssi_params[BMISS_MIN_RSSI].min_rssi &=
0x000000ff;
+
+ ap_profile.min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi -=
+ WMA_NOISE_FLOOR_DBM_DEFAULT;
+ ap_profile.min_rssi_params[MIN_RSSI_2G_TO_5G_ROAM].min_rssi &=
+ 0x000000ff;
}
ap_profile.score_delta_param[IDLE_ROAM_TRIGGER] =