Эх сурвалжийг харах

qcacld-3.0: Introduce ini to configure roam RSSI diff for 6 GHz AP

This is applicable only when the roaming happens from 2.4 GHz/5 GHz
to 6 GHz AP.
The value is used to check if the 6 GHz AP to which we are roaming
(from 2.4 GHz/ 5 GHz) is better than current AP in terms of RSSI.
This checking is disabled if the value is set to zero.

Change-Id: I77f1183e1fd704dfa153841e669a20c9e75d0fe7
CRs-Fixed: 3353346
Srikanth Marepalli 2 жил өмнө
parent
commit
b73718cf7d

+ 1 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -2132,6 +2132,7 @@ static void mlme_init_lfr_cfg(struct wlan_objmgr_psoc *psoc,
 	lfr->roam_preauth_retry_count =
 	lfr->roam_preauth_retry_count =
 		cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT);
 		cfg_get(psoc, CFG_LFR3_ROAM_PREAUTH_RETRY_COUNT);
 	lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF);
 	lfr->roam_rssi_diff = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF);
+	lfr->roam_rssi_diff_6ghz = cfg_get(psoc, CFG_LFR_ROAM_RSSI_DIFF_6GHZ);
 	lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH);
 	lfr->bg_rssi_threshold = cfg_get(psoc, CFG_LFR_ROAM_BG_RSSI_TH);
 	lfr->roam_scan_offload_enabled =
 	lfr->roam_scan_offload_enabled =
 		cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
 		cfg_get(psoc, CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);

+ 30 - 0
components/mlme/dispatcher/inc/cfg_mlme_lfr.h

@@ -1356,6 +1356,35 @@
 	CFG_VALUE_OR_DEFAULT, \
 	CFG_VALUE_OR_DEFAULT, \
 	"Enable roam based on rssi")
 	"Enable roam based on rssi")
 
 
+/*
+ * <ini>
+ * RoamRssiDiff6GHz - Enable roam to 6 GHz AP based on rssi
+ * @Min: 0
+ * @Max: 100
+ * @Default: 5
+ *
+ * This INI is used to decide whether to roam to 6 GHz AP or not based on RSSI.
+ * AP1 is the currently associated AP(2.4 GHz / 5 GHz) and AP2(6 GHz) is chosen
+ * for roaming. The Roaming will happen only if AP2 has better Signal Quality
+ * and it has a RSSI better than AP1. RoamRssiDiff6GHz is the number of units
+ * (typically measured in dB) AP2 is better than AP1.
+ *
+ * Related: None
+ *
+ * Supported Feature: Roaming
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_LFR_ROAM_RSSI_DIFF_6GHZ CFG_INI_UINT( \
+	"RoamRssiDiff6GHz", \
+	0, \
+	100, \
+	5, \
+	CFG_VALUE_OR_DEFAULT, \
+	"Enable 6 GHz roam based on rssi")
+
 /*
 /*
  * <ini>
  * <ini>
  * bg_rssi_threshold - To set RSSI Threshold for BG scan roaming
  * bg_rssi_threshold - To set RSSI Threshold for BG scan roaming
@@ -3242,6 +3271,7 @@
 	CFG(CFG_LFR_MAWC_FEATURE_ENABLED) \
 	CFG(CFG_LFR_MAWC_FEATURE_ENABLED) \
 	CFG(CFG_LFR_FAST_TRANSITION_ENABLED) \
 	CFG(CFG_LFR_FAST_TRANSITION_ENABLED) \
 	CFG(CFG_LFR_ROAM_RSSI_DIFF) \
 	CFG(CFG_LFR_ROAM_RSSI_DIFF) \
+	CFG(CFG_LFR_ROAM_RSSI_DIFF_6GHZ) \
 	CFG(CFG_LFR_ROAM_BG_RSSI_TH) \
 	CFG(CFG_LFR_ROAM_BG_RSSI_TH) \
 	CFG(CFG_LFR_ENABLE_WES_MODE) \
 	CFG(CFG_LFR_ENABLE_WES_MODE) \
 	CFG(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED) \
 	CFG(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED) \

+ 2 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1865,6 +1865,7 @@ struct fw_scan_channels {
  * @roam_preauth_retry_count:       Configure the max number of preauth retry
  * @roam_preauth_retry_count:       Configure the max number of preauth retry
  * @roam_preauth_no_ack_timeout:    Configure the no ack timeout period
  * @roam_preauth_no_ack_timeout:    Configure the no ack timeout period
  * @roam_rssi_diff:                 Enable roam based on rssi
  * @roam_rssi_diff:                 Enable roam based on rssi
+ * @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP.
  * @roam_scan_offload_enabled:      Enable Roam Scan Offload
  * @roam_scan_offload_enabled:      Enable Roam Scan Offload
  * @neighbor_scan_timer_period:     Neighbor scan timer period
  * @neighbor_scan_timer_period:     Neighbor scan timer period
  * @neighbor_scan_min_timer_period: Min neighbor scan timer period
  * @neighbor_scan_min_timer_period: Min neighbor scan timer period
@@ -1991,6 +1992,7 @@ struct wlan_mlme_lfr_cfg {
 	uint32_t roam_preauth_retry_count;
 	uint32_t roam_preauth_retry_count;
 	uint32_t roam_preauth_no_ack_timeout;
 	uint32_t roam_preauth_no_ack_timeout;
 	uint8_t roam_rssi_diff;
 	uint8_t roam_rssi_diff;
+	uint8_t roam_rssi_diff_6ghz;
 	uint8_t bg_rssi_threshold;
 	uint8_t bg_rssi_threshold;
 	bool roam_scan_offload_enabled;
 	bool roam_scan_offload_enabled;
 	uint32_t neighbor_scan_timer_period;
 	uint32_t neighbor_scan_timer_period;

+ 49 - 0
components/target_if/connection_mgr/src/target_if_cm_roam_offload.c

@@ -421,6 +421,39 @@ target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev,
 	return status;
 	return status;
 }
 }
 
 
+/**
+ * target_if_cm_roam_rssi_diff_6ghz() - Send the roam RSSI diff value to FW
+ * which is used to decide how better the RSSI of the new/roamable 6GHz AP
+ * should be for roaming.
+ * @vdev: vdev object
+ * @roam_rssi_diff_6ghz: RSSI diff value to be used for roaming to 6 GHz AP
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
+				 uint8_t roam_rssi_diff_6ghz)
+{
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+	uint8_t vdev_id;
+	wmi_unified_t wmi_handle;
+
+	wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
+	if (!wmi_handle)
+		return status;
+
+	vdev_id = wlan_vdev_get_id(vdev);
+	status = target_if_roam_set_param(
+				wmi_handle, vdev_id,
+				WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP,
+				roam_rssi_diff_6ghz);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		target_if_err("Failed to set WMI_ROAM_PARAM_ROAM_RSSI_BOOST_FOR_6GHZ_CAND_AP");
+
+	return status;
+}
+
 static void
 static void
 target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 {
 {
@@ -476,6 +509,13 @@ target_if_cm_roam_full_scan_6ghz_on_disc(struct wlan_objmgr_vdev *vdev,
 {
 {
 	return QDF_STATUS_E_NOSUPPORT;
 	return QDF_STATUS_E_NOSUPPORT;
 }
 }
+
+static QDF_STATUS
+target_if_cm_roam_rssi_diff_6ghz(struct wlan_objmgr_vdev *vdev,
+				 uint8_t roam_rssi_diff_6ghz)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
 #endif
 #endif
 
 
 /**
 /**
@@ -1490,6 +1530,11 @@ target_if_cm_roam_send_start(struct wlan_objmgr_vdev *vdev,
 
 
 	is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
 	is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
 	target_if_cm_roam_mcc_disallow(vdev, vdev_id, is_mcc_disallowed);
 	target_if_cm_roam_mcc_disallow(vdev, vdev_id, is_mcc_disallowed);
+
+	if (req->wlan_roam_rssi_diff_6ghz)
+		target_if_cm_roam_rssi_diff_6ghz(vdev,
+						 req->wlan_roam_rssi_diff_6ghz);
+
 	/* add other wmi commands */
 	/* add other wmi commands */
 end:
 end:
 	return status;
 	return status;
@@ -1886,6 +1931,10 @@ target_if_cm_roam_send_update_config(struct wlan_objmgr_vdev *vdev,
 		is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
 		is_mcc_disallowed = !wlan_cm_same_band_sta_allowed(psoc);
 		target_if_cm_roam_mcc_disallow(vdev, vdev_id,
 		target_if_cm_roam_mcc_disallow(vdev, vdev_id,
 					       is_mcc_disallowed);
 					       is_mcc_disallowed);
+
+		if (req->wlan_roam_rssi_diff_6ghz)
+			target_if_cm_roam_rssi_diff_6ghz(
+					vdev, req->wlan_roam_rssi_diff_6ghz);
 	}
 	}
 end:
 end:
 	return status;
 	return status;

+ 14 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -3005,6 +3005,7 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	struct rso_config *rso_cfg;
 	struct rso_config *rso_cfg;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_pdev *pdev;
 	struct wlan_objmgr_pdev *pdev;
+	struct cm_roam_values_copy temp;
 
 
 	start_req = qdf_mem_malloc(sizeof(*start_req));
 	start_req = qdf_mem_malloc(sizeof(*start_req));
 	if (!start_req)
 	if (!start_req)
@@ -3072,6 +3073,9 @@ cm_roam_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	start_req->wlan_roam_full_scan_6ghz_on_disc =
 	start_req->wlan_roam_full_scan_6ghz_on_disc =
 				wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc);
 				wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc);
 
 
+	wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp);
+	start_req->wlan_roam_rssi_diff_6ghz = temp.uint_value;
+
 	status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req);
 	status = wlan_cm_tgt_send_roam_start_req(psoc, vdev_id, start_req);
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
 		mlme_debug("fail to send roam start");
 		mlme_debug("fail to send roam start");
@@ -3101,6 +3105,7 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	struct rso_config *rso_cfg;
 	struct rso_config *rso_cfg;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_pdev *pdev;
 	struct wlan_objmgr_pdev *pdev;
+	struct cm_roam_values_copy temp;
 
 
 	cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
 	cm_roam_set_roam_reason_better_ap(psoc, vdev_id, false);
 
 
@@ -3166,6 +3171,9 @@ cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	update_req->wlan_roam_full_scan_6ghz_on_disc =
 	update_req->wlan_roam_full_scan_6ghz_on_disc =
 				wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc);
 				wlan_cm_roam_get_full_scan_6ghz_on_disc(psoc);
 
 
+	wlan_cm_roam_cfg_get_value(psoc, vdev_id, ROAM_RSSI_DIFF_6GHZ, &temp);
+	update_req->wlan_roam_rssi_diff_6ghz = temp.uint_value;
+
 	status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
 	status = wlan_cm_tgt_send_roam_update_req(psoc, vdev_id, update_req);
 	if (QDF_IS_STATUS_ERROR(status))
 	if (QDF_IS_STATUS_ERROR(status))
 		mlme_debug("fail to send update config");
 		mlme_debug("fail to send update config");
@@ -4981,6 +4989,8 @@ cm_restore_default_roaming_params(struct wlan_mlme_psoc_ext_obj *mlme_obj,
 			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
 	cfg_params->roam_rssi_diff =
 	cfg_params->roam_rssi_diff =
 			mlme_obj->cfg.lfr.roam_rssi_diff;
 			mlme_obj->cfg.lfr.roam_rssi_diff;
+	cfg_params->roam_rssi_diff_6ghz =
+			mlme_obj->cfg.lfr.roam_rssi_diff_6ghz;
 	cfg_params->bg_rssi_threshold =
 	cfg_params->bg_rssi_threshold =
 			mlme_obj->cfg.lfr.bg_rssi_threshold;
 			mlme_obj->cfg.lfr.bg_rssi_threshold;
 
 
@@ -5468,6 +5478,10 @@ static void cm_roam_start_init(struct wlan_objmgr_psoc *psoc,
 	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
 	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
 				   IS_11R_CONNECTION, &src_cfg);
 				   IS_11R_CONNECTION, &src_cfg);
 
 
+	src_cfg.uint_value = mlme_obj->cfg.lfr.roam_rssi_diff_6ghz;
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
+				   ROAM_RSSI_DIFF_6GHZ, &src_cfg);
+
 	if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled)
 	if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled)
 		return;
 		return;
 	/*
 	/*

+ 9 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -307,6 +307,7 @@ struct rso_cfg_params {
 	uint32_t full_roam_scan_period;
 	uint32_t full_roam_scan_period;
 	bool enable_scoring_for_roam;
 	bool enable_scoring_for_roam;
 	uint8_t roam_rssi_diff;
 	uint8_t roam_rssi_diff;
+	uint8_t roam_rssi_diff_6ghz;
 	uint8_t bg_rssi_threshold;
 	uint8_t bg_rssi_threshold;
 	uint16_t roam_scan_home_away_time;
 	uint16_t roam_scan_home_away_time;
 	uint8_t roam_scan_n_probes;
 	uint8_t roam_scan_n_probes;
@@ -661,6 +662,7 @@ struct rso_config_params {
  * @MBO_OCE_ENABLED_AP: MBO/OCE enabled network
  * @MBO_OCE_ENABLED_AP: MBO/OCE enabled network
  * @LOST_LINK_RSSI: lost link RSSI
  * @LOST_LINK_RSSI: lost link RSSI
  * @ROAM_BAND: Allowed band for roaming in FW
  * @ROAM_BAND: Allowed band for roaming in FW
+ * @ROAM_RSSI_DIFF_6GHZ: roam rssi diff for 6 GHz AP
  */
  */
 enum roam_cfg_param {
 enum roam_cfg_param {
 	RSSI_CHANGE_THRESHOLD,
 	RSSI_CHANGE_THRESHOLD,
@@ -691,6 +693,7 @@ enum roam_cfg_param {
 	LOST_LINK_RSSI,
 	LOST_LINK_RSSI,
 	ROAM_BAND,
 	ROAM_BAND,
 	HI_RSSI_SCAN_RSSI_DELTA,
 	HI_RSSI_SCAN_RSSI_DELTA,
+	ROAM_RSSI_DIFF_6GHZ,
 };
 };
 
 
 /**
 /**
@@ -1782,6 +1785,8 @@ struct wlan_roam_mlo_config {
  * scan that are already scanned as part of partial scan.
  * scan that are already scanned as part of partial scan.
  * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full
  * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full
  * scan only on prior discovery of any 6 GHz support in the environment.
  * scan only on prior discovery of any 6 GHz support in the environment.
+ * @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of
+ * the new/roamable 6GHz AP should be for roaming.
  */
  */
 struct wlan_roam_start_config {
 struct wlan_roam_start_config {
 	struct wlan_roam_offload_scan_rssi_params rssi_params;
 	struct wlan_roam_offload_scan_rssi_params rssi_params;
@@ -1806,6 +1811,7 @@ struct wlan_roam_start_config {
 	uint16_t wlan_roam_ho_delay_config;
 	uint16_t wlan_roam_ho_delay_config;
 	uint8_t wlan_exclude_rm_partial_scan_freq;
 	uint8_t wlan_exclude_rm_partial_scan_freq;
 	uint8_t wlan_roam_full_scan_6ghz_on_disc;
 	uint8_t wlan_roam_full_scan_6ghz_on_disc;
+	uint8_t wlan_roam_rssi_diff_6ghz;
 	/* other wmi cmd structures */
 	/* other wmi cmd structures */
 };
 };
 
 
@@ -1861,6 +1867,8 @@ struct wlan_roam_stop_config {
  * scan that are already scanned as part of partial scan.
  * scan that are already scanned as part of partial scan.
  * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full
  * @wlan_roam_full_scan_6ghz_on_disc: Include the 6 GHz channels in roam full
  * scan only on prior discovery of any 6 GHz support in the environment.
  * scan only on prior discovery of any 6 GHz support in the environment.
+ * @wlan_roam_rssi_diff_6ghz: This value is used as to how better the RSSI of
+ * the new/roamable 6GHz AP should be for roaming.
  */
  */
 struct wlan_roam_update_config {
 struct wlan_roam_update_config {
 	struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
 	struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
@@ -1879,6 +1887,7 @@ struct wlan_roam_update_config {
 	uint16_t wlan_roam_ho_delay_config;
 	uint16_t wlan_roam_ho_delay_config;
 	uint8_t wlan_exclude_rm_partial_scan_freq;
 	uint8_t wlan_exclude_rm_partial_scan_freq;
 	uint8_t wlan_roam_full_scan_6ghz_on_disc;
 	uint8_t wlan_roam_full_scan_6ghz_on_disc;
+	uint8_t wlan_roam_rssi_diff_6ghz;
 };
 };
 
 
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)

+ 8 - 0
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -762,6 +762,9 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
 	case ROAM_RSSI_DIFF:
 	case ROAM_RSSI_DIFF:
 		dst_config->uint_value = src_cfg->roam_rssi_diff;
 		dst_config->uint_value = src_cfg->roam_rssi_diff;
 		break;
 		break;
+	case ROAM_RSSI_DIFF_6GHZ:
+		dst_config->uint_value = src_cfg->roam_rssi_diff_6ghz;
+		break;
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 		dst_config->uint_value = src_cfg->neighbor_lookup_threshold;
 		dst_config->uint_value = src_cfg->neighbor_lookup_threshold;
 		break;
 		break;
@@ -1334,6 +1337,9 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			cm_roam_update_cfg(psoc, vdev_id,
 			cm_roam_update_cfg(psoc, vdev_id,
 					   REASON_RSSI_DIFF_CHANGED);
 					   REASON_RSSI_DIFF_CHANGED);
 		break;
 		break;
+	case ROAM_RSSI_DIFF_6GHZ:
+		dst_cfg->roam_rssi_diff_6ghz = src_config->uint_value;
+		break;
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 	case NEIGHBOUR_LOOKUP_THRESHOLD:
 		dst_cfg->neighbor_lookup_threshold = src_config->uint_value;
 		dst_cfg->neighbor_lookup_threshold = src_config->uint_value;
 		break;
 		break;
@@ -1567,6 +1573,8 @@ QDF_STATUS wlan_cm_rso_config_init(struct wlan_objmgr_vdev *vdev,
 		mlme_obj->cfg.lfr.roam_scan_hi_rssi_ub;
 		mlme_obj->cfg.lfr.roam_scan_hi_rssi_ub;
 	cfg_params->roam_rssi_diff =
 	cfg_params->roam_rssi_diff =
 		mlme_obj->cfg.lfr.roam_rssi_diff;
 		mlme_obj->cfg.lfr.roam_rssi_diff;
+	cfg_params->roam_rssi_diff_6ghz =
+		mlme_obj->cfg.lfr.roam_rssi_diff_6ghz;
 	cfg_params->bg_rssi_threshold =
 	cfg_params->bg_rssi_threshold =
 		mlme_obj->cfg.lfr.bg_rssi_threshold;
 		mlme_obj->cfg.lfr.bg_rssi_threshold;