ソースを参照

qcacld-3.0: Move ESE channel list code to connection manager

Move ESE channel list code to connection manager.

Change-Id: I885ba96eaff435a8f3f4366d6d201e6f2d648e6e
CRs-fixed: 2885327
gaurank kathpalia 4 年 前
コミット
006888171e

+ 13 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -764,6 +764,19 @@ QDF_STATUS wlan_strip_ie(uint8_t *addn_ie, uint16_t *addn_ielen,
 bool wlan_is_channel_present_in_list(qdf_freq_t *freq_lst,
 				     uint32_t num_chan, qdf_freq_t chan_freq);
 
+/**
+ * wlan_roam_is_channel_valid() - validate channel frequency
+ * @reg: regulatory context
+ * @chan_freq: channel frequency
+ *
+ * This function validates channel frequency present in valid channel
+ * list or not.
+ *
+ * Return: true or false
+ */
+bool wlan_roam_is_channel_valid(struct wlan_mlme_reg *reg,
+				qdf_freq_t chan_freq);
+
 int8_t wlan_get_cfg_max_tx_power(struct wlan_objmgr_psoc *psoc,
 				 struct wlan_objmgr_pdev *pdev,
 				 uint32_t ch_freq);

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

@@ -3059,6 +3059,26 @@ bool wlan_is_channel_present_in_list(qdf_freq_t *freq_lst,
 	return false;
 }
 
+bool wlan_roam_is_channel_valid(struct wlan_mlme_reg *reg, qdf_freq_t chan_freq)
+{
+	bool valid = false;
+	uint32_t i;
+	uint32_t len = reg->valid_channel_list_num;
+
+	for (i = 0; (i < len); i++) {
+		if (wlan_reg_is_dsrc_freq(
+			reg->valid_channel_freq_list[i]))
+			continue;
+
+		if (chan_freq == reg->valid_channel_freq_list[i]) {
+			valid = true;
+			break;
+		}
+	}
+
+	return valid;
+}
+
 int8_t wlan_get_cfg_max_tx_power(struct wlan_objmgr_psoc *psoc,
 				 struct wlan_objmgr_pdev *pdev,
 				 uint32_t ch_freq)

+ 444 - 10
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -1236,7 +1236,7 @@ cm_is_dfs_unsafe_extra_band_chan(struct wlan_objmgr_vdev *vdev,
 	roam_policy = &mlme_obj->cfg.lfr.rso_user_config.policy_params;
 	if ((mlme_obj->cfg.lfr.roaming_dfs_channel ==
 	     ROAMING_DFS_CHANNEL_DISABLED ||
-	     roam_policy->dfs_mode == CSR_STA_ROAM_POLICY_DFS_DISABLED) &&
+	     roam_policy->dfs_mode == STA_ROAM_POLICY_DFS_DISABLED) &&
 	    (wlan_reg_is_dfs_for_freq(pdev, freq)))
 		return true;
 
@@ -2889,11 +2889,7 @@ static QDF_STATUS cm_is_rso_allowed(struct wlan_objmgr_psoc *psoc,
 	return wlan_cm_roam_cmd_allowed(psoc, vdev_id, command, reason);
 }
 #endif
-/*
- * similar to csr_roam_offload_scan, will be used from many legacy
- * process directly, generate a new function wlan_cm_roam_send_rso_cmd
- * for external usage.
- */
+
 QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
 				uint8_t vdev_id, uint8_t rso_command,
 				uint8_t reason)
@@ -3474,6 +3470,444 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 	return status;
 }
 
+#ifdef FEATURE_WLAN_ESE
+static QDF_STATUS
+cm_roam_channels_filter_by_current_band(struct wlan_objmgr_pdev *pdev,
+					uint8_t vdev_id,
+					qdf_freq_t *in_chan_freq_list,
+					uint8_t in_num_chan,
+					qdf_freq_t *out_chan_freq_list,
+					uint8_t *merged_num_chan)
+{
+	uint8_t i = 0;
+	uint8_t num_chan = 0;
+	uint32_t curr_ap_op_chan_freq =
+		wlan_get_operation_chan_freq_vdev_id(pdev, vdev_id);
+
+	/* Check for NULL pointer */
+	if (!in_chan_freq_list)
+		return QDF_STATUS_E_INVAL;
+
+	/* Check for NULL pointer */
+	if (!out_chan_freq_list)
+		return QDF_STATUS_E_INVAL;
+
+	if (in_num_chan > CFG_VALID_CHANNEL_LIST_LEN) {
+		mlme_err("Wrong Number of Input Channels %d", in_num_chan);
+		return QDF_STATUS_E_INVAL;
+	}
+	for (i = 0; i < in_num_chan; i++) {
+		if (WLAN_REG_IS_SAME_BAND_FREQS(curr_ap_op_chan_freq,
+						in_chan_freq_list[i])) {
+			out_chan_freq_list[num_chan] = in_chan_freq_list[i];
+			num_chan++;
+		}
+	}
+
+	/* Return final number of channels */
+	*merged_num_chan = num_chan;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS cm_roam_merge_channel_lists(qdf_freq_t *in_chan_freq_list,
+					      uint8_t in_num_chan,
+					      qdf_freq_t *out_chan_freq_list,
+					      uint8_t out_num_chan,
+					      uint8_t *merged_num_chan)
+{
+	uint8_t i = 0;
+	uint8_t j = 0;
+	uint8_t num_chan = out_num_chan;
+
+	/* Check for NULL pointer */
+	if (!in_chan_freq_list)
+		return QDF_STATUS_E_INVAL;
+
+	/* Check for NULL pointer */
+	if (!out_chan_freq_list)
+		return QDF_STATUS_E_INVAL;
+
+	if (in_num_chan > CFG_VALID_CHANNEL_LIST_LEN) {
+		mlme_err("Wrong Number of Input Channels %d", in_num_chan);
+		return QDF_STATUS_E_INVAL;
+	}
+	if (out_num_chan >= CFG_VALID_CHANNEL_LIST_LEN) {
+		mlme_err("Wrong Number of Output Channels %d", out_num_chan);
+		return QDF_STATUS_E_INVAL;
+	}
+	/* Add the "new" channels in the input list to the end of the
+	 * output list.
+	 */
+	for (i = 0; i < in_num_chan; i++) {
+		for (j = 0; j < out_num_chan; j++) {
+			if (in_chan_freq_list[i] == out_chan_freq_list[j])
+				break;
+		}
+		if (j == out_num_chan) {
+			if (in_chan_freq_list[i]) {
+				mlme_debug("Adding extra %d to roam channel list",
+					   in_chan_freq_list[i]);
+				out_chan_freq_list[num_chan] =
+							in_chan_freq_list[i];
+				num_chan++;
+			}
+		}
+		if (num_chan >= CFG_VALID_CHANNEL_LIST_LEN) {
+			mlme_debug("Merge Neighbor channel list reached Max limit %d",
+				   in_num_chan);
+			break;
+		}
+	}
+
+	/* Return final number of channels */
+	*merged_num_chan = num_chan;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS cm_create_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev,
+					    struct rso_config *rso_cfg,
+					    uint8_t vdev_id,
+					    qdf_freq_t *chan_freq_list,
+					    uint8_t num_chan,
+					    const enum band_info band)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	uint8_t out_num_chan = 0;
+	uint8_t in_chan_num = num_chan;
+	qdf_freq_t *in_ptr = chan_freq_list;
+	uint8_t i = 0;
+	qdf_freq_t *freq_list;
+	qdf_freq_t *tmp_chan_freq_list;
+	uint8_t merged_out_chan_num = 0;
+	struct rso_chan_info *chan_lst;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+	struct wlan_mlme_reg *reg;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return QDF_STATUS_E_INVAL;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_INVAL;
+
+	reg = &mlme_obj->cfg.reg;
+	chan_lst = &rso_cfg->roam_scan_freq_lst;
+	/*
+	 * Create a Union of occupied channel list learnt by the DUT along
+	 * with the Neighbor report Channels. This increases the chances of
+	 * the DUT to get a candidate AP while roaming even if the Neighbor
+	 * Report is not able to provide sufficient information.
+	 */
+	if (rso_cfg->occupied_chan_lst.num_chan) {
+		cm_roam_merge_channel_lists(rso_cfg->occupied_chan_lst.freq_list,
+					    rso_cfg->occupied_chan_lst.num_chan,
+					    in_ptr, in_chan_num,
+					    &merged_out_chan_num);
+		in_chan_num = merged_out_chan_num;
+	}
+
+	freq_list = qdf_mem_malloc(CFG_VALID_CHANNEL_LIST_LEN *
+				       sizeof(qdf_freq_t));
+	if (!freq_list)
+		return QDF_STATUS_E_NOMEM;
+
+	if (band == BAND_2G) {
+		for (i = 0; i < in_chan_num; i++) {
+			if (WLAN_REG_IS_24GHZ_CH_FREQ(in_ptr[i]) &&
+			    wlan_roam_is_channel_valid(reg, in_ptr[i])) {
+				freq_list[out_num_chan++] = in_ptr[i];
+			}
+		}
+	} else if (band == BAND_5G) {
+		for (i = 0; i < in_chan_num; i++) {
+			/* Add 5G Non-DFS channel */
+			if (WLAN_REG_IS_5GHZ_CH_FREQ(in_ptr[i]) &&
+			    wlan_roam_is_channel_valid(reg, in_ptr[i]) &&
+			    !wlan_reg_is_dfs_for_freq(pdev, in_ptr[i])) {
+				freq_list[out_num_chan++] = in_ptr[i];
+			}
+		}
+	} else if (band == BAND_ALL) {
+		for (i = 0; i < in_chan_num; i++) {
+			if (wlan_roam_is_channel_valid(reg, in_ptr[i]) &&
+			    !wlan_reg_is_dfs_for_freq(pdev, in_ptr[i])) {
+				freq_list[out_num_chan++] = in_ptr[i];
+			}
+		}
+	} else {
+		mlme_warn("Invalid band, No operation carried out (Band %d)",
+			  band);
+		qdf_mem_free(freq_list);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	tmp_chan_freq_list = qdf_mem_malloc(CFG_VALID_CHANNEL_LIST_LEN *
+					    sizeof(qdf_freq_t));
+	if (!tmp_chan_freq_list) {
+		qdf_mem_free(freq_list);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	/*
+	 * if roaming within band is enabled, then select only the
+	 * in band channels .
+	 * This is required only if the band capability is set to ALL,
+	 * E.g., if band capability is only 2.4G then all the channels in the
+	 * list are already filtered for 2.4G channels, hence ignore this check
+	 */
+	if ((band == BAND_ALL) && mlme_obj->cfg.lfr.roam_intra_band)
+		cm_roam_channels_filter_by_current_band(pdev, vdev_id,
+							freq_list, out_num_chan,
+							tmp_chan_freq_list,
+							&out_num_chan);
+
+	/* Prepare final roam scan channel list */
+	if (out_num_chan) {
+		/* Clear the channel list first */
+		cm_flush_roam_channel_list(chan_lst);
+		chan_lst->freq_list =
+			qdf_mem_malloc(out_num_chan * sizeof(qdf_freq_t));
+		if (!chan_lst->freq_list) {
+			chan_lst->num_chan = 0;
+			status = QDF_STATUS_E_NOMEM;
+			goto error;
+		}
+		for (i = 0; i < out_num_chan; i++)
+			chan_lst->freq_list[i] = tmp_chan_freq_list[i];
+
+		chan_lst->num_chan = out_num_chan;
+	}
+
+error:
+	qdf_mem_free(tmp_chan_freq_list);
+	qdf_mem_free(freq_list);
+
+	return status;
+}
+#endif
+
+static const char *cm_get_config_item_string(uint8_t reason)
+{
+	switch (reason) {
+	CASE_RETURN_STRING(REASON_LOOKUP_THRESH_CHANGED);
+	CASE_RETURN_STRING(REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
+	CASE_RETURN_STRING(REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
+	CASE_RETURN_STRING(REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
+	CASE_RETURN_STRING(REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
+	default:
+		return "unknown";
+	}
+}
+
+QDF_STATUS cm_neighbor_roam_update_config(struct wlan_objmgr_pdev *pdev,
+					  uint8_t vdev_id, uint8_t value,
+					  uint8_t reason)
+{
+	uint8_t old_value;
+	struct wlan_objmgr_vdev *vdev;
+	struct rso_config *rso_cfg;
+	struct rso_cfg_params *cfg_params;
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return QDF_STATUS_E_FAILURE;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev object is NULL for vdev %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+	rso_cfg = wlan_cm_get_rso_config(vdev);
+	if (!rso_cfg) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+		return QDF_STATUS_E_FAILURE;
+	}
+	cfg_params = &rso_cfg->cfg_param;
+	switch (reason) {
+	case REASON_LOOKUP_THRESH_CHANGED:
+		old_value = cfg_params->neighbor_lookup_threshold;
+		cfg_params->neighbor_lookup_threshold = value;
+		break;
+	case REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED:
+		old_value = cfg_params->opportunistic_threshold_diff;
+		cfg_params->opportunistic_threshold_diff = value;
+		break;
+	case REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED:
+		old_value = cfg_params->roam_rescan_rssi_diff;
+		cfg_params->roam_rescan_rssi_diff = value;
+		rso_cfg->rescan_rssi_delta = value;
+		break;
+	case REASON_ROAM_BMISS_FIRST_BCNT_CHANGED:
+		old_value = cfg_params->roam_bmiss_first_bcn_cnt;
+		cfg_params->roam_bmiss_first_bcn_cnt = value;
+		break;
+	case REASON_ROAM_BMISS_FINAL_BCNT_CHANGED:
+		old_value = cfg_params->roam_bmiss_final_cnt;
+		cfg_params->roam_bmiss_final_cnt = value;
+		break;
+	default:
+		mlme_debug("Unknown update cfg reason");
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+		return QDF_STATUS_E_FAILURE;
+	}
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+	mlme_debug("CONNECTED, send update cfg cmd");
+	wlan_roam_update_cfg(psoc, vdev_id, reason);
+
+	mlme_debug("LFR config for %s changed from %d to %d",
+		   cm_get_config_item_string(reason), old_value, value);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+void cm_flush_roam_channel_list(struct rso_chan_info *channel_info)
+{
+	/* Free up the memory first (if required) */
+	if (channel_info->freq_list) {
+		qdf_mem_free(channel_info->freq_list);
+		channel_info->freq_list = NULL;
+		channel_info->num_chan = 0;
+	}
+}
+
+static void
+cm_restore_default_roaming_params(struct wlan_mlme_psoc_ext_obj *mlme_obj,
+				   struct wlan_objmgr_vdev *vdev)
+{
+	struct rso_config *rso_cfg;
+	struct rso_cfg_params *cfg_params;
+
+	rso_cfg = wlan_cm_get_rso_config(vdev);
+	if (!rso_cfg)
+		return;
+	cfg_params = &rso_cfg->cfg_param;
+	cfg_params->enable_scoring_for_roam =
+			mlme_obj->cfg.roam_scoring.enable_scoring_for_roam;
+	cfg_params->empty_scan_refresh_period =
+			mlme_obj->cfg.lfr.empty_scan_refresh_period;
+	cfg_params->full_roam_scan_period =
+			mlme_obj->cfg.lfr.roam_full_scan_period;
+	cfg_params->neighbor_scan_period =
+			mlme_obj->cfg.lfr.neighbor_scan_timer_period;
+	cfg_params->neighbor_lookup_threshold =
+			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
+	cfg_params->roam_rssi_diff =
+			mlme_obj->cfg.lfr.roam_rssi_diff;
+	cfg_params->bg_rssi_threshold =
+			mlme_obj->cfg.lfr.bg_rssi_threshold;
+
+	cfg_params->max_chan_scan_time =
+			mlme_obj->cfg.lfr.neighbor_scan_max_chan_time;
+	cfg_params->roam_scan_home_away_time =
+			mlme_obj->cfg.lfr.roam_scan_home_away_time;
+	cfg_params->roam_scan_n_probes =
+			mlme_obj->cfg.lfr.roam_scan_n_probes;
+	cfg_params->roam_scan_inactivity_time =
+			mlme_obj->cfg.lfr.roam_scan_inactivity_time;
+	cfg_params->roam_inactive_data_packet_count =
+			mlme_obj->cfg.lfr.roam_inactive_data_packet_count;
+	cfg_params->roam_scan_period_after_inactivity =
+			mlme_obj->cfg.lfr.roam_scan_period_after_inactivity;
+}
+
+QDF_STATUS cm_roam_control_restore_default_config(struct wlan_objmgr_pdev *pdev,
+						  uint8_t vdev_id)
+{
+	QDF_STATUS status = QDF_STATUS_E_INVAL;
+	struct rso_chan_info *chan_info;
+	struct wlan_objmgr_vdev *vdev;
+	struct rso_config *rso_cfg;
+	struct rso_cfg_params *cfg_params;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		goto out;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		goto out;
+
+	if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled) {
+		mlme_err("roam_scan_offload_enabled is not supported");
+		goto out;
+	}
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev object is NULL for vdev %d", vdev_id);
+		goto out;
+	}
+	rso_cfg = wlan_cm_get_rso_config(vdev);
+	if (!rso_cfg) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+		goto out;
+	}
+	cfg_params = &rso_cfg->cfg_param;
+	mlme_obj->cfg.lfr.rso_user_config.roam_scan_control = false;
+
+	chan_info = &cfg_params->pref_chan_info;
+	cm_flush_roam_channel_list(chan_info);
+
+	chan_info = &cfg_params->specific_chan_info;
+	cm_flush_roam_channel_list(chan_info);
+
+	mlme_reinit_control_config_lfr_params(psoc, &mlme_obj->cfg.lfr);
+
+	cm_restore_default_roaming_params(mlme_obj, vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+
+	if (MLME_IS_ROAM_STATE_RSO_ENABLED(psoc, vdev_id)) {
+		cm_roam_send_rso_cmd(psoc, vdev_id,
+				     ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+				     REASON_FLUSH_CHANNEL_LIST);
+		cm_roam_send_rso_cmd(psoc, vdev_id,
+				     ROAM_SCAN_OFFLOAD_UPDATE_CFG,
+				     REASON_SCORING_CRITERIA_CHANGED);
+	}
+
+	status = QDF_STATUS_SUCCESS;
+out:
+	return status;
+}
+
+void cm_roam_restore_default_config(struct wlan_objmgr_pdev *pdev,
+				    uint8_t vdev_id)
+{
+	struct wlan_roam_triggers triggers;
+	struct cm_roam_values_copy src_config;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return;
+
+	if (mlme_obj->cfg.lfr.roam_scan_offload_enabled) {
+		src_config.bool_value = 0;
+		wlan_cm_roam_cfg_set_value(psoc, vdev_id, ROAM_CONFIG_ENABLE,
+					   &src_config);
+	}
+
+	triggers.vdev_id = vdev_id;
+	triggers.trigger_bitmap = wlan_mlme_get_roaming_triggers(psoc);
+	mlme_debug("Reset roam trigger bitmap to 0x%x", triggers.trigger_bitmap);
+	cm_rso_set_roam_trigger(pdev, vdev_id, &triggers);
+	cm_roam_control_restore_default_config(pdev, vdev_id);
+}
+
 #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
 void
 cm_store_sae_single_pmk_to_global_cache(struct wlan_objmgr_psoc *psoc,
@@ -3565,7 +3999,7 @@ static void cm_roam_start_init(struct wlan_objmgr_psoc *psoc,
 
 	opmode = wlan_vdev_mlme_get_opmode(vdev);
 	if (opmode != QDF_STA_MODE) {
-		sme_debug("Wrong opmode %d", opmode);
+		mlme_debug("Wrong opmode %d", opmode);
 		return;
 	}
 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
@@ -3633,9 +4067,8 @@ void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
 	cm_roam_start_init(psoc, pdev, vdev);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
 }
-#endif
 
-#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && defined(FEATURE_CM_ENABLE)
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
 static QDF_STATUS
 cm_find_roam_candidate(struct wlan_objmgr_pdev *pdev,
 		       struct cnx_mgr *cm_ctx,
@@ -3873,4 +4306,5 @@ bool cm_roam_offload_enabled(struct wlan_objmgr_psoc *psoc)
 
 	return val;
 }
-#endif
+#endif  /* WLAN_FEATURE_ROAM_OFFLOAD */
+#endif  /* FEATURE_CM_ENABLE */

+ 39 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h

@@ -136,6 +136,45 @@ cm_start_roam_invoke(struct wlan_objmgr_psoc *psoc,
 #endif
 #endif
 
+#ifdef FEATURE_WLAN_ESE
+/**
+ * cm_create_roam_scan_channel_list() - create roam scan channel list
+ * @pdev: pdev
+ * @rso_cfg: roam config
+ * @vdev_id: vdev id
+ * @chan_freq_list: pointer to channel list
+ * @num_chan: number of channels
+ * @band: band enumeration
+ *
+ * This function modifies the roam scan channel list as per AP neighbor
+ * report; AP neighbor report may be empty or may include only other AP
+ * channels; in any case, we merge the channel list with the learned occupied
+ * channels list.
+ * if the band is 2.4G, then make sure channel list contains only 2.4G
+ * valid channels if the band is 5G, then make sure channel list contains
+ * only 5G valid channels
+ *
+ * Return: QDF_STATUS enumeration
+ */
+QDF_STATUS cm_create_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev,
+					    struct rso_config *rso_cfg,
+					    uint8_t vdev_id,
+					    qdf_freq_t *chan_freq_list,
+					    uint8_t num_chan,
+					    const enum band_info band);
+#endif
+
+QDF_STATUS cm_neighbor_roam_update_config(struct wlan_objmgr_pdev *pdev,
+					  uint8_t vdev_id, uint8_t value,
+					  uint8_t reason);
+void cm_flush_roam_channel_list(struct rso_chan_info *channel_info);
+
+QDF_STATUS cm_roam_control_restore_default_config(struct wlan_objmgr_pdev *pdev,
+						  uint8_t vdev_id);
+
+void cm_roam_restore_default_config(struct wlan_objmgr_pdev *pdev,
+				    uint8_t vdev_id);
+
 /**
  * cm_roam_send_disable_config() - Send roam module enable/disable cfg to fw
  * @psoc: PSOC pointer

+ 9 - 0
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -76,6 +76,7 @@ cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
 	struct wlan_objmgr_pdev *pdev;
 	uint8_t vdev_id;
 	struct rso_config *rso_cfg;
+	struct wlan_objmgr_psoc *psoc;
 
 	if (!vdev || !req)
 		return QDF_STATUS_E_FAILURE;
@@ -86,6 +87,12 @@ cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
 			 CM_PREFIX_REF(req->req.vdev_id, req->cm_id));
 		return QDF_STATUS_E_INVAL;
 	}
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		mlme_err(CM_PREFIX_FMT "psoc not found",
+			 CM_PREFIX_REF(req->req.vdev_id, req->cm_id));
+		return QDF_STATUS_E_INVAL;
+	}
 	rso_cfg = wlan_cm_get_rso_config(vdev);
 	if (!rso_cfg)
 		return QDF_STATUS_E_INVAL;
@@ -98,6 +105,8 @@ cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_NOMEM;
 
 	cm_csr_handle_diconnect_req(vdev, req);
+	wlan_roam_reset_roam_params(psoc);
+	cm_roam_restore_default_config(pdev, vdev_id);
 	opmode = wlan_vdev_mlme_get_opmode(vdev);
 	if (opmode == QDF_STA_MODE)
 		wlan_cm_roam_state_change(pdev, vdev_id,

+ 6 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

@@ -312,6 +312,12 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
 				      enum roam_cfg_param roam_cfg_type,
 				      struct cm_roam_values_copy *dst_config);
 
+static inline void
+wlan_cm_flush_roam_channel_list(struct rso_chan_info *channel_info)
+{
+	cm_flush_roam_channel_list(channel_info);
+}
+
 /**
  * wlan_cm_roam_cfg_set_value  - Set RSO config value
  * @psoc: psoc pointer

+ 10 - 8
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_struct.h

@@ -311,16 +311,16 @@ struct rso_config {
 
 /**
  * enum sta_roam_policy_dfs_mode - state of DFS mode for STA ROME policy
- * @CSR_STA_ROAM_POLICY_NONE: DFS mode attribute is not valid
- * @CSR_STA_ROAM_POLICY_DFS_ENABLED:  DFS mode is enabled
- * @CSR_STA_ROAM_POLICY_DFS_DISABLED: DFS mode is disabled
- * @CSR_STA_ROAM_POLICY_DFS_DEPRIORITIZE: Deprioritize DFS channels in scanning
+ * @STA_ROAM_POLICY_NONE: DFS mode attribute is not valid
+ * @STA_ROAM_POLICY_DFS_ENABLED:  DFS mode is enabled
+ * @STA_ROAM_POLICY_DFS_DISABLED: DFS mode is disabled
+ * @STA_ROAM_POLICY_DFS_DEPRIORITIZE: Deprioritize DFS channels in scanning
  */
 enum sta_roam_policy_dfs_mode {
-	CSR_STA_ROAM_POLICY_NONE,
-	CSR_STA_ROAM_POLICY_DFS_ENABLED,
-	CSR_STA_ROAM_POLICY_DFS_DISABLED,
-	CSR_STA_ROAM_POLICY_DFS_DEPRIORITIZE
+	STA_ROAM_POLICY_NONE,
+	STA_ROAM_POLICY_DFS_ENABLED,
+	STA_ROAM_POLICY_DFS_DISABLED,
+	STA_ROAM_POLICY_DFS_DEPRIORITIZE
 };
 
 /**
@@ -358,6 +358,7 @@ struct rso_roam_policy_params {
  * @drop_factor_5g: Penalty factor
  * @max_raise_rssi_5g: Maximum amount of Boost that can added
  * @is_fils_roaming_supported: fils roaming supported
+ * @roam_scan_control: roam scan control
  * @policy_params: roam policy params
  * @neighbor_report_offload: neighbor report offload params
  */
@@ -377,6 +378,7 @@ struct rso_config_params {
 	int max_raise_rssi_5g;
 	uint8_t cat_rssi_offset;
 	bool is_fils_roaming_supported;
+	bool roam_scan_control;
 	struct rso_roam_policy_params policy_params;
 	struct cm_roam_neighbor_report_offload_params neighbor_report_offload;
 };

+ 16 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_ucfg_api.h

@@ -52,6 +52,22 @@ ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
 QDF_STATUS ucfg_cm_abort_roam_scan(struct wlan_objmgr_pdev *pdev,
 				   uint8_t vdev_id);
 
+#ifdef FEATURE_WLAN_ESE
+/**
+ * ucfg_cm_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
+ * @pdev: pdev pointer
+ * @vdev_id: vdev_id id
+ * @chan_freq_list: Output channel list
+ * @num_chan: Output number of channels
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS ucfg_cm_set_ese_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev,
+						  uint8_t vdev_id,
+						  qdf_freq_t *chan_freq_list,
+						  uint8_t num_chan);
+#endif
+
 /**
  * ucfg_cm_rso_set_roam_trigger() - Send roam trigger bitmap firmware
  * @pdev: Pointer to pdev

+ 3 - 12
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -852,8 +852,9 @@ void cm_dump_freq_list(struct rso_chan_info *chan_info)
 	if (chan_info->freq_list) {
 		for (i = 0; i < chan_info->num_chan; i++) {
 			if (j < buflen)
-				j += snprintf(channel_list + j, buflen - j,
-					      "%d ", chan_info->freq_list[i]);
+				j += qdf_scnprintf(channel_list + j, buflen - j,
+						   "%d ",
+						   chan_info->freq_list[i]);
 			else
 				break;
 		}
@@ -902,16 +903,6 @@ static QDF_STATUS cm_create_bg_scan_roam_channel_list(struct rso_chan_info *chan
 	return status;
 }
 
-static void cm_flush_roam_channel_list(struct rso_chan_info *channel_info)
-{
-	/* Free up the memory first (if required) */
-	if (channel_info->freq_list) {
-		qdf_mem_free(channel_info->freq_list);
-		channel_info->freq_list = NULL;
-		channel_info->num_chan = 0;
-	}
-}
-
 static QDF_STATUS
 cm_update_roam_scan_channel_list(uint8_t vdev_id,
 				 struct rso_chan_info *chan_info,

+ 65 - 2
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_ucfg_api.c

@@ -23,6 +23,7 @@
 #include "wlan_mlme_ucfg_api.h"
 #include "wlan_cm_roam_ucfg_api.h"
 #include "../../core/src/wlan_cm_roam_offload.h"
+#include "wlan_reg_ucfg_api.h"
 
 QDF_STATUS
 ucfg_user_space_enable_disable_rso(struct wlan_objmgr_pdev *pdev,
@@ -124,6 +125,70 @@ release_ref:
 	return status;
 }
 
+#ifdef FEATURE_WLAN_ESE
+QDF_STATUS ucfg_cm_set_ese_roam_scan_channel_list(struct wlan_objmgr_pdev *pdev,
+						  uint8_t vdev_id,
+						  qdf_freq_t *chan_freq_list,
+						  uint8_t num_chan)
+{
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	enum band_info band = -1;
+	uint32_t band_bitmap;
+	struct wlan_objmgr_vdev *vdev;
+	struct rso_config *rso_cfg;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return QDF_STATUS_E_INVAL;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_INVAL;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev object is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+	status = cm_roam_acquire_lock(vdev);
+	if (QDF_IS_STATUS_ERROR(status))
+		goto release_ref;
+
+	rso_cfg = wlan_cm_get_rso_config(vdev);
+	if (!rso_cfg) {
+		status = QDF_STATUS_E_FAILURE;
+		goto error;
+	}
+
+	mlme_debug("Chan list Before");
+	cm_dump_freq_list(&rso_cfg->roam_scan_freq_lst);
+	ucfg_reg_get_band(pdev, &band_bitmap);
+	band = wlan_reg_band_bitmap_to_band_info(band_bitmap);
+	status = cm_create_roam_scan_channel_list(pdev, rso_cfg, num_chan,
+						  chan_freq_list, num_chan,
+						  band);
+	if (QDF_IS_STATUS_SUCCESS(status)) {
+		mlme_debug("Chan list After");
+		cm_dump_freq_list(&rso_cfg->roam_scan_freq_lst);
+	}
+
+	if (mlme_obj->cfg.lfr.roam_scan_offload_enabled)
+		wlan_roam_update_cfg(psoc, vdev_id,
+				     REASON_CHANNEL_LIST_CHANGED);
+
+
+error:
+	cm_roam_release_lock(vdev);
+release_ref:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+
+	return status;
+}
+#endif
+
 #ifdef FEATURE_CM_ENABLE
 #ifdef WLAN_FEATURE_FILS_SK
 QDF_STATUS
@@ -147,9 +212,7 @@ ucfg_cm_update_fils_config(struct wlan_objmgr_psoc *psoc,
 	return status;
 }
 #endif
-#endif
 
-#ifdef FEATURE_CM_ENABLE
 QDF_STATUS
 ucfg_wlan_cm_roam_invoke(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			 struct qdf_mac_addr *bssid, qdf_freq_t ch_freq)

+ 1 - 1
core/hdd/src/wlan_hdd_cfg.c

@@ -979,7 +979,7 @@ QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx)
 	cds_set_multicast_logging(hdd_ctx->config->multicast_host_fw_msgs);
 
 	mlme_obj->cfg.lfr.rso_user_config.policy_params.dfs_mode =
-		CSR_STA_ROAM_POLICY_DFS_ENABLED;
+		STA_ROAM_POLICY_DFS_ENABLED;
 	mlme_obj->cfg.lfr.rso_user_config.policy_params.skip_unsafe_channels = 0;
 
 	status = hdd_set_sme_cfgs_related_to_mlme(hdd_ctx, sme_config);

+ 4 - 4
core/hdd/src/wlan_hdd_cfg80211.c

@@ -12053,14 +12053,14 @@ static enum sta_roam_policy_dfs_mode wlan_hdd_get_sta_roam_dfs_mode(
 {
 	switch (mode) {
 	case DFS_MODE_ENABLE:
-		return CSR_STA_ROAM_POLICY_DFS_ENABLED;
+		return STA_ROAM_POLICY_DFS_ENABLED;
 	case DFS_MODE_DISABLE:
-		return CSR_STA_ROAM_POLICY_DFS_DISABLED;
+		return STA_ROAM_POLICY_DFS_DISABLED;
 	case DFS_MODE_DEPRIORITIZE:
-		return CSR_STA_ROAM_POLICY_DFS_DEPRIORITIZE;
+		return STA_ROAM_POLICY_DFS_DEPRIORITIZE;
 	default:
 		hdd_err("STA Roam policy dfs mode is NONE");
-		return  CSR_STA_ROAM_POLICY_NONE;
+		return  STA_ROAM_POLICY_NONE;
 	}
 }
 

+ 4 - 4
core/hdd/src/wlan_hdd_ioctl.c

@@ -5008,10 +5008,10 @@ static int drv_cmd_set_ccx_roam_scan_channels(struct hdd_adapter *adapter,
 		goto exit;
 	}
 
-	status = sme_set_ese_roam_scan_channel_list(mac_handle,
-						    adapter->vdev_id,
-						    channel_freq_list,
-						    num_channels);
+	status = ucfg_cm_set_ese_roam_scan_channel_list(hdd_ctx->pdev,
+							adapter->vdev_id,
+							channel_freq_list,
+							num_channels);
 	if (QDF_STATUS_SUCCESS != status) {
 		hdd_err("Failed to update channel list information");
 		ret = -EINVAL;

+ 0 - 5
core/sme/inc/csr_internal.h

@@ -64,10 +64,6 @@
 	( \
 	  ((mac)->mlme_cfg->lfr.roam_prefer_5ghz) \
 	)
-#define CSR_IS_ROAM_INTRA_BAND_ENABLED(mac) \
-	( \
-	  ((mac)->mlme_cfg->lfr.roam_intra_band) \
-	)
 #define CSR_IS_FASTROAM_IN_CONCURRENCY_INI_FEATURE_ENABLED(mac) \
 	( \
 	  ((mac)->mlme_cfg->lfr.enable_fast_roam_in_concurrency) \
@@ -312,7 +308,6 @@ struct csr_config {
 	bool mcc_rts_cts_prot_enable;
 	bool mcc_bcast_prob_resp_enable;
 	uint8_t fAllowMCCGODiffBI;
-	bool nRoamScanControl;
 	uint32_t nVhtChannelWidth;
 	bool send_smps_action;
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH

+ 20 - 61
core/sme/inc/csr_neighbor_roam.h

@@ -94,34 +94,12 @@ typedef struct sCsrNeighborRoamControlInfo {
 /* All the necessary Function declarations are here */
 QDF_STATUS csr_neighbor_roam_indicate_connect(struct mac_context *mac,
 		uint8_t sessionId, QDF_STATUS status);
-#endif
-#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
-QDF_STATUS csr_roam_control_restore_default_config(struct mac_context *mac,
-						   uint8_t vdev_id);
-void csr_roam_restore_default_config(struct mac_context *mac_ctx,
-				     uint8_t vdev_id);
-#else
-static inline
-QDF_STATUS csr_roam_control_restore_default_config(struct mac_context *mac,
-						   uint8_t vdev_id)
-{
-	return QDF_STATUS_SUCCESS;
-}
-static inline void csr_roam_restore_default_config(struct mac_context *mac_ctx,
-						   uint8_t vdev_id)
-{
-}
-#endif
-#ifndef FEATURE_CM_ENABLE
 QDF_STATUS csr_neighbor_roam_indicate_disconnect(struct mac_context *mac,
 		uint8_t sessionId);
 QDF_STATUS csr_neighbor_roam_init(struct mac_context *mac, uint8_t sessionId);
 void csr_neighbor_roam_close(struct mac_context *mac, uint8_t sessionId);
 QDF_STATUS csr_neighbor_roam_preauth_rsp_handler(struct mac_context *mac,
 		uint8_t sessionId, QDF_STATUS limStatus);
-#endif
-bool csr_neighbor_roam_is11r_assoc(struct mac_context *mac, uint8_t sessionId);
-#ifndef FEATURE_CM_ENABLE
 #ifdef WLAN_FEATURE_HOST_ROAM
 void csr_neighbor_roam_tranistion_preauth_done_to_disconnected(
 		struct mac_context *mac, uint8_t sessionId);
@@ -147,23 +125,6 @@ static inline void csr_neighbor_roam_purge_preauth_failed_list(
 {}
 #endif
 bool csr_neighbor_middle_of_roaming(struct mac_context *mac, uint8_t sessionId);
-#endif
-QDF_STATUS csr_neighbor_roam_update_config(struct mac_context *mac_ctx,
-		uint8_t session_id, uint8_t value, uint8_t reason);
-QDF_STATUS csr_neighbor_roam_channels_filter_by_current_band(
-		struct mac_context *mac, uint8_t sessionId,
-		uint32_t *input_chan_freq_list,
-		uint8_t inputNumOfChannels,
-		uint32_t *out_chan_freq_list,
-		uint8_t *pMergedOutputNumOfChannels);
-QDF_STATUS csr_neighbor_roam_merge_channel_lists(struct mac_context *mac,
-		uint32_t *pinput_chan_freq_list,
-		uint8_t inputNumOfChannels,
-		uint32_t *out_chan_freq_list,
-		uint8_t outputNumOfChannels,
-		uint8_t *pMergedOutputNumOfChannels);
-
-#ifndef FEATURE_CM_ENABLE
 #if defined(WLAN_FEATURE_FILS_SK)
 /**
  * csr_update_fils_config - Update FILS config to CSR roam session
@@ -186,8 +147,27 @@ QDF_STATUS csr_neighbor_roam_sssid_scan_done(struct mac_context *mac,
 		uint8_t sessionId, QDF_STATUS status);
 QDF_STATUS csr_neighbor_roam_start_lfr_scan(struct mac_context *mac,
 		uint8_t sessionId);
+void csr_neighbor_roam_state_transition(struct mac_context *mac_ctx,
+		uint8_t newstate, uint8_t session);
+uint8_t *csr_neighbor_roam_state_to_string(uint8_t state);
+QDF_STATUS csr_neighbor_roam_issue_preauth_req(struct mac_context *mac,
+		uint8_t sessionId);
+bool csr_neighbor_roam_is_preauth_candidate(struct mac_context *mac,
+		    uint8_t sessionId, tSirMacAddr bssId);
+#ifdef FEATURE_WLAN_LFR_METRICS
+void csr_neighbor_roam_send_lfr_metric_event(struct mac_context *mac_ctx,
+		uint8_t session_id, tSirMacAddr bssid, eRoamCmdStatus status);
+#else
+static inline void csr_neighbor_roam_send_lfr_metric_event(
+		struct mac_context *mac_ctx, uint8_t session_id,
+		tSirMacAddr bssid, eRoamCmdStatus status)
+{}
 #endif
 
+QDF_STATUS csr_roam_copy_connected_profile(struct mac_context *mac,
+		uint32_t sessionId, struct csr_roam_profile *pDstProfile);
+#endif /* FEATURE_CM_ENABLE */
+
 #ifdef FEATURE_WLAN_ESE
 QDF_STATUS csr_set_cckm_ie(struct mac_context *mac, const uint8_t sessionId,
 		const uint8_t *pCckmIe, const uint8_t ccKmIeLen);
@@ -196,6 +176,7 @@ QDF_STATUS csr_roam_read_tsf(struct mac_context *mac, uint8_t *pTimestamp,
 		const uint8_t sessionId);
 #endif
 #endif /* FEATURE_WLAN_ESE */
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 QDF_STATUS csr_roam_synch_callback(struct mac_context *mac,
 	struct roam_offload_synch_ind *roam_synch_data,
@@ -297,28 +278,6 @@ csr_roam_pmkid_req_callback(uint8_t vdev_id,
 	return QDF_STATUS_E_NOSUPPORT;
 }
 #endif
-#ifndef FEATURE_CM_ENABLE
-void csr_neighbor_roam_state_transition(struct mac_context *mac_ctx,
-		uint8_t newstate, uint8_t session);
-uint8_t *csr_neighbor_roam_state_to_string(uint8_t state);
-QDF_STATUS csr_neighbor_roam_issue_preauth_req(struct mac_context *mac,
-		uint8_t sessionId);
-bool csr_neighbor_roam_is_preauth_candidate(struct mac_context *mac,
-		    uint8_t sessionId, tSirMacAddr bssId);
-#ifdef FEATURE_WLAN_LFR_METRICS
-void csr_neighbor_roam_send_lfr_metric_event(struct mac_context *mac_ctx,
-		uint8_t session_id, tSirMacAddr bssid, eRoamCmdStatus status);
-#else
-static inline void csr_neighbor_roam_send_lfr_metric_event(
-		struct mac_context *mac_ctx, uint8_t session_id,
-		tSirMacAddr bssid, eRoamCmdStatus status)
-{}
-#endif
-
-QDF_STATUS csr_roam_copy_connected_profile(struct mac_context *mac,
-		uint32_t sessionId, struct csr_roam_profile *pDstProfile);
-#endif
-
 /**
  * csr_invoke_neighbor_report_request - Send neighbor report invoke command to
  *					WMA

+ 0 - 4
core/sme/inc/sme_api.h

@@ -1173,10 +1173,6 @@ QDF_STATUS
 sme_update_roam_scan_freq_list(mac_handle_t mac_handle, uint8_t vdev_id,
 			       uint32_t *freq_list, uint8_t num_chan,
 			       uint32_t freq_list_type);
-QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
-					      uint8_t sessionId,
-					      uint32_t *chan_freq_list,
-					      uint8_t numChannels);
 QDF_STATUS sme_get_roam_scan_channel_list(mac_handle_t mac_handle,
 					  uint32_t *freq_list,
 					  uint8_t *pNumChannels,

+ 0 - 36
core/sme/inc/sme_inside.h

@@ -185,42 +185,6 @@ void csr_reinit_wm_status_change_cmd(struct mac_context *mac,
 QDF_STATUS sme_acquire_global_lock(struct sme_context *sme);
 QDF_STATUS sme_release_global_lock(struct sme_context *sme);
 
-/**
- * csr_flush_cfg_bg_scan_roam_channel_list() - Flush the channel list
- * @channel_info: Channel list to be flushed
- *
- * Return: None
- */
-void csr_flush_cfg_bg_scan_roam_channel_list(struct rso_chan_info *channel_info);
-
-#ifdef FEATURE_WLAN_ESE
-/**
- * csr_create_roam_scan_channel_list() - create roam scan channel list
- * @mac: Global mac pointer
- * @rso_cfg: roam config
- * @sessionId: session id
- * @chan_freq_list: pointer to channel list
- * @numChannels: number of channels
- * @band: band enumeration
- *
- * This function modifies the roam scan channel list as per AP neighbor
- * report; AP neighbor report may be empty or may include only other AP
- * channels; in any case, we merge the channel list with the learned occupied
- * channels list.
- * if the band is 2.4G, then make sure channel list contains only 2.4G
- * valid channels if the band is 5G, then make sure channel list contains
- * only 5G valid channels
- *
- * Return: QDF_STATUS enumeration
- */
-QDF_STATUS csr_create_roam_scan_channel_list(struct mac_context *mac,
-		struct rso_config *rso_cfg,
-		uint8_t sessionId,
-		uint32_t *chan_freq_list,
-		uint8_t numChannels,
-		const enum band_info band);
-#endif
-
 ePhyChanBondState csr_convert_cb_ini_value_to_phy_cb_state(uint32_t cbIniValue);
 void csr_process_set_dual_mac_config(struct mac_context *mac, tSmeCmd *command);
 void csr_process_set_antenna_mode(struct mac_context *mac, tSmeCmd *command);

+ 21 - 126
core/sme/src/common/sme_api.c

@@ -1752,117 +1752,6 @@ QDF_STATUS sme_get_tsm_stats(mac_handle_t mac_handle,
 	}
 	return status;
 }
-
-/**
- * sme_set_ese_roam_scan_channel_list() - To set ese roam scan channel list
- * @mac_handle: Opaque handle to the global MAC context
- * @sessionId: sme session id
- * @chan_freq_list: Output channel list
- * @numChannels: Output number of channels
- *
- * This routine is called to set ese roam scan channel list.
- * This is a synchronous call
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS sme_set_ese_roam_scan_channel_list(mac_handle_t mac_handle,
-					      uint8_t sessionId,
-					      uint32_t *chan_freq_list,
-					      uint8_t numChannels)
-{
-	struct mac_context *mac = MAC_CONTEXT(mac_handle);
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	uint16_t channel_list_len = CFG_VALID_CHANNEL_LIST_LEN * 5;
-	uint8_t *old_ch_list;
-	uint8_t *new_ch_list;
-	uint8_t i = 0, j = 0;
-	enum band_info band = -1;
-	uint32_t band_bitmap;
-	struct wlan_objmgr_vdev *vdev;
-	struct rso_config *rso_cfg;
-	struct rso_chan_info *chan_lst;
-
-	if (sessionId >= WLAN_MAX_VDEVS) {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  FL("Invalid sme session id: %d"), sessionId);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	old_ch_list = qdf_mem_malloc(channel_list_len);
-	if (!old_ch_list) {
-		sme_err("memory alloc failed for channel list");
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	new_ch_list = qdf_mem_malloc(channel_list_len);
-	if (!new_ch_list) {
-		sme_err("memory alloc failed for channel list");
-		qdf_mem_free(old_ch_list);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	status = sme_acquire_global_lock(&mac->sme);
-	if (!QDF_IS_STATUS_SUCCESS(status))
-		goto error;
-
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, sessionId,
-						    WLAN_LEGACY_SME_ID);
-	if (!vdev) {
-		sme_err("vdev object is NULL");
-		sme_release_global_lock(&mac->sme);
-		status = QDF_STATUS_E_FAILURE;
-		goto error;
-	}
-
-	rso_cfg = wlan_cm_get_rso_config(vdev);
-	if (!rso_cfg) {
-		sme_release_global_lock(&mac->sme);
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		status = QDF_STATUS_E_FAILURE;
-		goto error;
-	}
-
-	chan_lst = &rso_cfg->roam_scan_freq_lst;
-
-	if (chan_lst->freq_list) {
-		for (i = 0; i < chan_lst->num_chan; i++) {
-			j += snprintf(old_ch_list + j,
-				channel_list_len - j, "%d",
-				chan_lst->freq_list[i]);
-		}
-	}
-	ucfg_reg_get_band(mac->pdev, &band_bitmap);
-	band = wlan_reg_band_bitmap_to_band_info(band_bitmap);
-	status = csr_create_roam_scan_channel_list(mac, rso_cfg, sessionId,
-				chan_freq_list, numChannels,
-				band);
-	if (QDF_IS_STATUS_SUCCESS(status)) {
-		if (chan_lst->freq_list) {
-			j = 0;
-			for (i = 0; i < chan_lst->num_chan; i++) {
-				j += snprintf(new_ch_list + j,
-					channel_list_len - j, "%d",
-					chan_lst->freq_list[i]);
-			}
-		}
-		sme_debug("ESE roam scan chnl list successfully set to %s-old value is %s",
-			  new_ch_list, old_ch_list);
-	}
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-
-	if (mac->mlme_cfg->lfr.roam_scan_offload_enabled)
-		wlan_roam_update_cfg(mac->psoc, sessionId,
-				    REASON_CHANNEL_LIST_CHANGED);
-
-	sme_release_global_lock(&mac->sme);
-
-error:
-	qdf_mem_free(new_ch_list);
-	qdf_mem_free(old_ch_list);
-
-	return status;
-}
-
 #endif /* FEATURE_WLAN_ESE */
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
@@ -5674,7 +5563,8 @@ bool sme_is_channel_valid(mac_handle_t mac_handle, uint32_t chan_freq)
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
 
-		valid = csr_roam_is_channel_valid(mac, chan_freq);
+		valid = wlan_roam_is_channel_valid(&mac->mlme_cfg->reg,
+						   chan_freq);
 
 		sme_release_global_lock(&mac->sme);
 	}
@@ -6320,8 +6210,9 @@ QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
 	cfg_params = &rso_cfg->cfg_param;
 	sme_debug("LFR runtime successfully set roam scan control to %d - old value is %d",
 		  roamScanControl,
-		  mac->roam.configParam.nRoamScanControl);
-	if (!roamScanControl && mac->roam.configParam.nRoamScanControl) {
+		  mac->mlme_cfg->lfr.rso_user_config.roam_scan_control);
+	if (!roamScanControl &&
+	    mac->mlme_cfg->lfr.rso_user_config.roam_scan_control) {
 		/**
 		 * Clear the specific channel info cache when roamScanControl
 		 * is set to 0. If any preffered channel list is configured,
@@ -6329,7 +6220,7 @@ QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
 		 */
 		sme_debug("LFR runtime successfully cleared roam scan cache");
 		specific_channel_info = &cfg_params->specific_chan_info;
-		csr_flush_cfg_bg_scan_roam_channel_list(specific_channel_info);
+		wlan_cm_flush_roam_channel_list(specific_channel_info);
 		if (mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
 		/** Clear the static channel in FW by REASON_FLUSH_CHANNEL_LIST
 		 *  and then append channel list with dynamic channels in the FW
@@ -6342,7 +6233,7 @@ QDF_STATUS sme_set_roam_scan_control(mac_handle_t mac_handle, uint8_t sessionId,
 					    REASON_CHANNEL_LIST_CHANGED);
 		}
 	}
-	mac->roam.configParam.nRoamScanControl = roamScanControl;
+	mac->mlme_cfg->lfr.rso_user_config.roam_scan_control = roamScanControl;
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
 	sme_release_global_lock(&mac->sme);
 
@@ -6529,7 +6420,7 @@ QDF_STATUS sme_set_roam_opportunistic_scan_threshold_diff(
 
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
-		status = csr_neighbor_roam_update_config(mac, sessionId,
+		status = cm_neighbor_roam_update_config(mac->pdev, sessionId,
 				nOpportunisticThresholdDiff,
 				REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
 		if (QDF_IS_STATUS_SUCCESS(status)) {
@@ -6577,7 +6468,7 @@ QDF_STATUS sme_set_roam_rescan_rssi_diff(mac_handle_t mac_handle,
 
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
-		status = csr_neighbor_roam_update_config(mac, sessionId,
+		status = cm_neighbor_roam_update_config(mac->pdev, sessionId,
 				nRoamRescanRssiDiff,
 				REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
 		if (QDF_IS_STATUS_SUCCESS(status))
@@ -6625,7 +6516,7 @@ QDF_STATUS sme_set_roam_bmiss_first_bcnt(mac_handle_t mac_handle,
 
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
-		status = csr_neighbor_roam_update_config(mac, sessionId,
+		status = cm_neighbor_roam_update_config(mac->pdev, sessionId,
 				nRoamBmissFirstBcnt,
 				REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
 		if (QDF_IS_STATUS_SUCCESS(status)) {
@@ -6658,7 +6549,7 @@ QDF_STATUS sme_set_roam_bmiss_final_bcnt(mac_handle_t mac_handle,
 
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
-		status = csr_neighbor_roam_update_config(mac, sessionId,
+		status = cm_neighbor_roam_update_config(mac->pdev, sessionId,
 				nRoamBmissFinalBcnt,
 				REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
 		if (QDF_IS_STATUS_SUCCESS(status)) {
@@ -6686,7 +6577,7 @@ sme_set_neighbor_lookup_rssi_threshold(mac_handle_t mac_handle,
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_ERROR(status))
 		return status;
-	csr_neighbor_roam_update_config(mac, vdev_id,
+	cm_neighbor_roam_update_config(mac->pdev, vdev_id,
 					neighbor_lookup_rssi_threshold,
 					REASON_LOOKUP_THRESH_CHANGED);
 	sme_release_global_lock(&mac->sme);
@@ -6827,7 +6718,7 @@ QDF_STATUS sme_roam_control_restore_default_config(mac_handle_t mac_handle,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	return csr_roam_control_restore_default_config(mac, vdev_id);
+	return cm_roam_control_restore_default_config(mac->pdev, vdev_id);
 }
 
 /*
@@ -7145,7 +7036,7 @@ QDF_STATUS sme_change_roam_scan_channel_list(mac_handle_t mac_handle,
 	src_config.chan_info.freq_list = channel_freq_list;
 	src_config.chan_info.num_chan = numChannels;
 
-	mac->roam.configParam.nRoamScanControl = 1;
+	mac->mlme_cfg->lfr.rso_user_config.roam_scan_control = true;
 	return wlan_cm_roam_cfg_set_value(mac->psoc, sessionId,
 					  ROAM_SPECIFIC_CHAN,
 					  &src_config);
@@ -7171,7 +7062,7 @@ sme_update_roam_scan_freq_list(mac_handle_t mac_handle, uint8_t vdev_id,
 						  ROAM_PREFERRED_CHAN,
 						  &src_config);
 	} else {
-		mac->roam.configParam.nRoamScanControl = 1;
+		mac->mlme_cfg->lfr.rso_user_config.roam_scan_control = true;
 		return wlan_cm_roam_cfg_set_value(mac->psoc, vdev_id,
 						  ROAM_SPECIFIC_CHAN,
 						  &src_config);
@@ -7309,7 +7200,7 @@ bool sme_get_roam_scan_control(mac_handle_t mac_handle)
 {
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
 
-	return mac->roam.configParam.nRoamScanControl;
+	return mac->mlme_cfg->lfr.rso_user_config.roam_scan_control;
 }
 
 /*
@@ -13123,8 +13014,12 @@ bool sme_roam_is_ese_assoc(struct csr_roam_info *roam_info)
 bool sme_neighbor_roam_is11r_assoc(mac_handle_t mac_handle, uint8_t session_id)
 {
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
+	struct cm_roam_values_copy config;
+
+	wlan_cm_roam_cfg_get_value(mac_ctx->psoc, session_id, IS_11R_CONNECTION,
+				   &config);
 
-	return csr_neighbor_roam_is11r_assoc(mac_ctx, session_id);
+	return config.bool_value;
 }
 
 #ifdef WLAN_FEATURE_WOW_PULSE

+ 11 - 164
core/sme/src/csr/csr_api_roam.c

@@ -902,7 +902,7 @@ QDF_STATUS csr_update_channel_list(struct mac_context *mac)
 		if ((CHANNEL_STATE_ENABLE == channel_state) ||
 		    mac->scan.fEnableDFSChnlScan) {
 			if ((roam_policy->dfs_mode ==
-				CSR_STA_ROAM_POLICY_DFS_DISABLED) &&
+				STA_ROAM_POLICY_DFS_DISABLED) &&
 				(channel_state == CHANNEL_STATE_DFS)) {
 				QDF_TRACE(QDF_MODULE_ID_SME,
 					QDF_TRACE_LEVEL_DEBUG,
@@ -1446,16 +1446,6 @@ static void init_config_param(struct mac_context *mac)
 		WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1;
 }
 
-void csr_flush_cfg_bg_scan_roam_channel_list(struct rso_chan_info *channel_info)
-{
-	/* Free up the memory first (if required) */
-	if (channel_info->freq_list) {
-		qdf_mem_free(channel_info->freq_list);
-		channel_info->freq_list = NULL;
-		channel_info->num_chan = 0;
-	}
-}
-
 /**
  * csr_flush_roam_scan_chan_lists() - Flush the roam channel lists
  * @mac: Global MAC context
@@ -1483,136 +1473,12 @@ csr_flush_roam_scan_chan_lists(struct mac_context *mac, uint8_t vdev_id)
 		return;
 	}
 	cfg_params = &rso_cfg->cfg_param;
-	csr_flush_cfg_bg_scan_roam_channel_list(&cfg_params->pref_chan_info);
-	csr_flush_cfg_bg_scan_roam_channel_list(
-					&cfg_params->specific_chan_info);
+	wlan_cm_flush_roam_channel_list(&cfg_params->pref_chan_info);
+	wlan_cm_flush_roam_channel_list(&cfg_params->specific_chan_info);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
 }
 
 #ifdef FEATURE_WLAN_ESE
-QDF_STATUS csr_create_roam_scan_channel_list(struct mac_context *mac,
-					     struct rso_config *rso_cfg,
-					     uint8_t sessionId,
-					     uint32_t *chan_freq_list,
-					     uint8_t numChannels,
-					     const enum band_info band)
-{
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	uint8_t out_num_chan = 0;
-	uint8_t inNumChannels = numChannels;
-	uint32_t *in_ptr = chan_freq_list;
-	uint8_t i = 0;
-	uint32_t *csr_freq_list;
-	uint32_t *tmp_chan_freq_list;
-	uint8_t mergedOutputNumOfChannels = 0;
-	struct rso_chan_info *chan_lst;
-
-	chan_lst = &rso_cfg->roam_scan_freq_lst;
-	/*
-	 * Create a Union of occupied channel list learnt by the DUT along
-	 * with the Neighbor report Channels. This increases the chances of
-	 * the DUT to get a candidate AP while roaming even if the Neighbor
-	 * Report is not able to provide sufficient information.
-	 */
-	if (rso_cfg->occupied_chan_lst.num_chan) {
-		csr_neighbor_roam_merge_channel_lists(mac,
-					rso_cfg->occupied_chan_lst.freq_list,
-					rso_cfg->occupied_chan_lst.num_chan,
-					in_ptr, inNumChannels,
-					&mergedOutputNumOfChannels);
-		inNumChannels = mergedOutputNumOfChannels;
-	}
-
-	csr_freq_list = qdf_mem_malloc(CFG_VALID_CHANNEL_LIST_LEN *
-				       sizeof(uint32_t));
-	if (!csr_freq_list) {
-		sme_err("memory allocation failed for csr_freq_list");
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	if (BAND_2G == band) {
-		for (i = 0; i < inNumChannels; i++) {
-			if (WLAN_REG_IS_24GHZ_CH_FREQ(in_ptr[i]) &&
-			    csr_roam_is_channel_valid(mac, in_ptr[i])) {
-				csr_freq_list[out_num_chan++] = in_ptr[i];
-			}
-		}
-	} else if (BAND_5G == band) {
-		for (i = 0; i < inNumChannels; i++) {
-			/* Add 5G Non-DFS channel */
-			if (WLAN_REG_IS_5GHZ_CH_FREQ(in_ptr[i]) &&
-			    csr_roam_is_channel_valid(mac, in_ptr[i]) &&
-			    !wlan_reg_is_dfs_for_freq(mac->pdev, in_ptr[i])) {
-				csr_freq_list[out_num_chan++] = in_ptr[i];
-			}
-		}
-	} else if (BAND_ALL == band) {
-		for (i = 0; i < inNumChannels; i++) {
-			if (csr_roam_is_channel_valid(mac, in_ptr[i]) &&
-			    !wlan_reg_is_dfs_for_freq(mac->pdev, in_ptr[i])) {
-				csr_freq_list[out_num_chan++] = in_ptr[i];
-			}
-		}
-	} else {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_WARN,
-			  "Invalid band, No operation carried out (Band %d)",
-			  band);
-		qdf_mem_free(csr_freq_list);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	tmp_chan_freq_list = qdf_mem_malloc(CFG_VALID_CHANNEL_LIST_LEN *
-					    sizeof(uint32_t));
-	if (!tmp_chan_freq_list) {
-		sme_err("memory allocation failed for tmp_chan_freq_list");
-		qdf_mem_free(csr_freq_list);
-		return QDF_STATUS_E_NOMEM;
-	}
-
-	/*
-	 * if roaming within band is enabled, then select only the
-	 * in band channels .
-	 * This is required only if the band capability is set to ALL,
-	 * E.g., if band capability is only 2.4G then all the channels in the
-	 * list are already filtered for 2.4G channels, hence ignore this check
-	 */
-	if ((BAND_ALL == band) && CSR_IS_ROAM_INTRA_BAND_ENABLED(mac)) {
-		csr_neighbor_roam_channels_filter_by_current_band(
-						mac,
-						sessionId,
-						csr_freq_list,
-						out_num_chan,
-						tmp_chan_freq_list,
-						&out_num_chan);
-	}
-	/* Prepare final roam scan channel list */
-	if (out_num_chan) {
-		/* Clear the channel list first */
-		if (chan_lst->freq_list) {
-			qdf_mem_free(chan_lst->freq_list);
-			chan_lst->freq_list = NULL;
-			chan_lst->num_chan = 0;
-		}
-		chan_lst->freq_list =
-			qdf_mem_malloc(out_num_chan * sizeof(qdf_freq_t));
-		if (!chan_lst->freq_list) {
-			chan_lst->num_chan = 0;
-			status = QDF_STATUS_E_NOMEM;
-			goto error;
-		}
-		for (i = 0; i < out_num_chan; i++)
-			chan_lst->freq_list[i] = tmp_chan_freq_list[i];
-
-		chan_lst->num_chan = out_num_chan;
-	}
-
-error:
-	qdf_mem_free(tmp_chan_freq_list);
-	qdf_mem_free(csr_freq_list);
-
-	return status;
-}
-
 /**
  * csr_roam_is_ese_assoc() - is this ese association
  * @mac_ctx: Global MAC context
@@ -5280,7 +5146,12 @@ void csr_roam_complete(struct mac_context *mac_ctx,
 /* Returns whether the current association is a 11r assoc or not */
 bool csr_roam_is11r_assoc(struct mac_context *mac, uint8_t sessionId)
 {
-	return csr_neighbor_roam_is11r_assoc(mac, sessionId);
+	struct cm_roam_values_copy config;
+
+	wlan_cm_roam_cfg_get_value(mac->psoc, sessionId, IS_11R_CONNECTION,
+				   &config);
+
+	return config.bool_value;
 }
 
 bool csr_roam_is_fast_roam_enabled(struct mac_context *mac, uint8_t vdev_id)
@@ -9922,8 +9793,8 @@ csr_roam_get_scan_filter_from_profile(struct mac_context *mac_ctx,
 					filter->num_of_channels);
 				break;
 			}
-			if (csr_roam_is_channel_valid(mac_ctx,
-						      ch_info->freq_list[i]) &&
+			if (wlan_roam_is_channel_valid(&mac_ctx->mlme_cfg->reg,
+						       ch_info->freq_list[i]) &&
 			    wlan_cm_dual_sta_is_freq_allowed(
 				    mac_ctx->psoc, ch_info->freq_list[i],
 				    profile->csrPersona)) {
@@ -11864,27 +11735,6 @@ int8_t csr_get_cfg_max_tx_power(struct mac_context *mac, uint32_t ch_freq)
 	return wlan_get_cfg_max_tx_power(mac->psoc, mac->pdev, ch_freq);
 }
 
-bool csr_roam_is_channel_valid(struct mac_context *mac, uint32_t chan_freq)
-{
-	bool valid = false;
-	uint32_t i;
-	uint32_t len = mac->mlme_cfg->reg.valid_channel_list_num;
-
-	for (i = 0; (i < len); i++) {
-		if (wlan_reg_is_dsrc_freq(
-			mac->mlme_cfg->reg.valid_channel_freq_list[i]))
-			continue;
-
-		if (chan_freq ==
-		    mac->mlme_cfg->reg.valid_channel_freq_list[i]) {
-			valid = true;
-			break;
-		}
-	}
-
-	return valid;
-}
-
 #ifndef FEATURE_CM_ENABLE
 static bool csr_is_encryption_in_list(struct mac_context *mac,
 				      tCsrEncryptionList *pCipherList,
@@ -13379,9 +13229,6 @@ QDF_STATUS cm_csr_handle_diconnect_req(struct wlan_objmgr_vdev *vdev,
 	csr_update_prev_ap_info(session, vdev);
 	csr_qos_send_disconnect_ind(mac_ctx, vdev_id);
 
-	wlan_roam_reset_roam_params(mac_ctx->psoc);
-	csr_roam_restore_default_config(mac_ctx, vdev_id);
-
 	return QDF_STATUS_SUCCESS;
 }
 

+ 0 - 12
core/sme/src/csr/csr_inside_api.h

@@ -304,18 +304,6 @@ bool csr_is_phy_mode_match(struct mac_context *mac, uint32_t phyMode,
 			   enum csr_cfgdot11mode *pReturnCfgDot11Mode,
 			   tDot11fBeaconIEs *pIes);
 
-/**
- * csr_roam_is_channel_valid() - validate channel frequency
- * @mac: mac context
- * @chan_freq: channel frequency
- *
- * This function validates channel frequency present in valid channel
- * list or not.
- *
- * Return: true or false
- */
-bool csr_roam_is_channel_valid(struct mac_context *mac, uint32_t chan_freq);
-
 /**
  * csr_get_cfg_valid_channels() - Get valid channel frequency list
  * @mac: mac context

+ 3 - 359
core/sme/src/csr/csr_neighbor_roam.c

@@ -23,6 +23,8 @@
  * transitions and Legacy roaming for Android platform.
  */
 
+#ifndef FEATURE_CM_ENABLE
+
 #include "wma_types.h"
 #include "csr_inside_api.h"
 #include "sme_qos_internal.h"
@@ -36,20 +38,6 @@
 #include "wlan_policy_mgr_api.h"
 #include "wlan_mlme_api.h"
 
-static const char *lfr_get_config_item_string(uint8_t reason)
-{
-	switch (reason) {
-	CASE_RETURN_STRING(REASON_LOOKUP_THRESH_CHANGED);
-	CASE_RETURN_STRING(REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED);
-	CASE_RETURN_STRING(REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED);
-	CASE_RETURN_STRING(REASON_ROAM_BMISS_FIRST_BCNT_CHANGED);
-	CASE_RETURN_STRING(REASON_ROAM_BMISS_FINAL_BCNT_CHANGED);
-	default:
-		return "unknown";
-	}
-}
-
-#ifndef FEATURE_CM_ENABLE
 void csr_neighbor_roam_state_transition(struct mac_context *mac_ctx,
 		uint8_t newstate, uint8_t session)
 {
@@ -109,70 +97,7 @@ void csr_neighbor_roam_send_lfr_metric_event(
 	}
 }
 #endif
-#endif
 
-QDF_STATUS csr_neighbor_roam_update_config(struct mac_context *mac_ctx,
-		uint8_t session_id, uint8_t value, uint8_t reason)
-{
-	struct cm_roam_values_copy src_cfg;
-	uint8_t old_value;
-	struct wlan_objmgr_vdev *vdev;
-	struct rso_config *rso_cfg;
-	struct rso_cfg_params *cfg_params;
-
-	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac_ctx->pdev, session_id,
-						    WLAN_LEGACY_SME_ID);
-	if (!vdev) {
-		sme_err("vdev object is NULL for vdev %d", session_id);
-		return QDF_STATUS_E_FAILURE;
-	}
-	rso_cfg = wlan_cm_get_rso_config(vdev);
-	if (!rso_cfg) {
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		return QDF_STATUS_E_FAILURE;
-	}
-	cfg_params = &rso_cfg->cfg_param;
-	switch (reason) {
-	case REASON_LOOKUP_THRESH_CHANGED:
-		old_value = cfg_params->neighbor_lookup_threshold;
-		cfg_params->neighbor_lookup_threshold = value;
-		break;
-	case REASON_OPPORTUNISTIC_THRESH_DIFF_CHANGED:
-		old_value = cfg_params->opportunistic_threshold_diff;
-		cfg_params->opportunistic_threshold_diff = value;
-		break;
-	case REASON_ROAM_RESCAN_RSSI_DIFF_CHANGED:
-		old_value = cfg_params->roam_rescan_rssi_diff;
-		cfg_params->roam_rescan_rssi_diff = value;
-		src_cfg.uint_value = value;
-		wlan_cm_roam_cfg_set_value(mac_ctx->psoc, session_id,
-					   RSSI_CHANGE_THRESHOLD,
-					   &src_cfg);
-		break;
-	case REASON_ROAM_BMISS_FIRST_BCNT_CHANGED:
-		old_value = cfg_params->roam_bmiss_first_bcn_cnt;
-		cfg_params->roam_bmiss_first_bcn_cnt = value;
-		break;
-	case REASON_ROAM_BMISS_FINAL_BCNT_CHANGED:
-		old_value = cfg_params->roam_bmiss_final_cnt;
-		cfg_params->roam_bmiss_final_cnt = value;
-		break;
-	default:
-		sme_debug("Unknown update cfg reason");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		return QDF_STATUS_E_FAILURE;
-	}
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-	sme_debug("CONNECTED, send update cfg cmd");
-	wlan_roam_update_cfg(mac_ctx->psoc, session_id, reason);
-
-	sme_debug("LFR config for %s changed from %d to %d",
-		  lfr_get_config_item_string(reason), old_value, value);
-
-	return QDF_STATUS_SUCCESS;
-}
-
-#ifndef FEATURE_CM_ENABLE
 /**
  * csr_neighbor_roam_reset_connected_state_control_info()
  *
@@ -365,270 +290,7 @@ csr_neighbor_roam_get_scan_filter_from_profile(struct mac_context *mac,
 
 	return QDF_STATUS_SUCCESS;
 }
-#endif
-
-/**
- * csr_neighbor_roam_channels_filter_by_current_band()
- *
- * @mac_ctx: Pointer to Global MAC structure
- * @session_id: Session ID
- * @input_chan_freq_list: The input channel list
- * @input_num_of_ch: The number of channels in input channel list
- * @out_chan_freq_list: The output channel list
- * @output_num_of_ch: The number of channels in output channel list
- * @merged_output_num_of_ch: The final number of channels in the
- *				output channel list.
- *
- * This function is used to filter out the channels based on the
- * currently associated AP channel
- *
- * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
- */
-QDF_STATUS csr_neighbor_roam_channels_filter_by_current_band(struct mac_context *
-						mac,
-						uint8_t sessionId,
-						uint32_t *input_chan_freq_list,
-						uint8_t inputNumOfChannels,
-						uint32_t *out_chan_freq_list,
-						uint8_t *
-						pMergedOutputNumOfChannels)
-{
-	uint8_t i = 0;
-	uint8_t numChannels = 0;
-	uint32_t curr_ap_op_chan_freq =
-		wlan_get_operation_chan_freq_vdev_id(mac->pdev, sessionId);
-	/* Check for NULL pointer */
-	if (!input_chan_freq_list)
-		return QDF_STATUS_E_INVAL;
-
-	/* Check for NULL pointer */
-	if (!out_chan_freq_list)
-		return QDF_STATUS_E_INVAL;
-
-	if (inputNumOfChannels > CFG_VALID_CHANNEL_LIST_LEN) {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Wrong Number of Input Channels %d",
-			  __func__, inputNumOfChannels);
-		return QDF_STATUS_E_INVAL;
-	}
-	for (i = 0; i < inputNumOfChannels; i++) {
-		if (WLAN_REG_IS_SAME_BAND_FREQS(
-				curr_ap_op_chan_freq,
-				input_chan_freq_list[i])) {
-			out_chan_freq_list[numChannels] =
-				input_chan_freq_list[i];
-			numChannels++;
-		}
-	}
-
-	/* Return final number of channels */
-	*pMergedOutputNumOfChannels = numChannels;
-
-	return QDF_STATUS_SUCCESS;
-}
-
-/**
- * csr_neighbor_roam_channels_filter_by_current_band()
- *
- * @mac_ctx: Pointer to Global MAC structure
- * @pinput_chan_freq_list: The additional channels to merge in
- *          to the "merged" channels list.
- * @input_num_of_ch: The number of additional channels.
- * @out_chan_freq_list: The place to put the "merged" channel list.
- * @output_num_of_ch: The original number of channels in the
- *			"merged" channels list.
- * @merged_output_num_of_ch: The final number of channels in the
- *				"merged" channel list.
- *
- * This function is used to merge two channel list.
- * NB: If called with outputNumOfChannels == 0, this routines simply
- * copies the input channel list to the output channel list. if number
- * of merged channels are more than 100, num of channels set to 100
- *
- * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_FAILURE otherwise
- */
-QDF_STATUS csr_neighbor_roam_merge_channel_lists(struct mac_context *mac,
-						 uint32_t *pinput_chan_freq_list,
-						 uint8_t inputNumOfChannels,
-						 uint32_t *out_chan_freq_list,
-						 uint8_t outputNumOfChannels,
-						 uint8_t *
-						 pMergedOutputNumOfChannels)
-{
-	uint8_t i = 0;
-	uint8_t j = 0;
-	uint8_t numChannels = outputNumOfChannels;
-
-	/* Check for NULL pointer */
-	if (!pinput_chan_freq_list)
-		return QDF_STATUS_E_INVAL;
-
-	/* Check for NULL pointer */
-	if (!out_chan_freq_list)
-		return QDF_STATUS_E_INVAL;
-
-	if (inputNumOfChannels > CFG_VALID_CHANNEL_LIST_LEN) {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Wrong Number of Input Channels %d",
-			  __func__, inputNumOfChannels);
-		return QDF_STATUS_E_INVAL;
-	}
-	if (outputNumOfChannels >= CFG_VALID_CHANNEL_LIST_LEN) {
-		QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR,
-			  "%s: Wrong Number of Output Channels %d",
-			  __func__, outputNumOfChannels);
-		return QDF_STATUS_E_INVAL;
-	}
-	/* Add the "new" channels in the input list to the end of the
-	 * output list.
-	 */
-	for (i = 0; i < inputNumOfChannels; i++) {
-		for (j = 0; j < outputNumOfChannels; j++) {
-			if (pinput_chan_freq_list[i]
-				== out_chan_freq_list[j])
-				break;
-		}
-		if (j == outputNumOfChannels) {
-			if (pinput_chan_freq_list[i]) {
-				QDF_TRACE(QDF_MODULE_ID_SME,
-					  QDF_TRACE_LEVEL_DEBUG,
-					  "%s: [INFOLOG] Adding extra %d to Neighbor channel list",
-					  __func__, pinput_chan_freq_list[i]);
-				out_chan_freq_list[numChannels] =
-					pinput_chan_freq_list[i];
-				numChannels++;
-			}
-		}
-		if (numChannels >= CFG_VALID_CHANNEL_LIST_LEN) {
-			QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
-				  "%s: Merge Neighbor channel list reached Max limit %d",
-				__func__, numChannels);
-			break;
-		}
-	}
-
-	/* Return final number of channels */
-	*pMergedOutputNumOfChannels = numChannels;
-
-	return QDF_STATUS_SUCCESS;
-}
-
-#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
-static void
-csr_restore_default_roaming_params(struct mac_context *mac,
-				   struct wlan_objmgr_vdev *vdev)
-{
-	struct rso_config *rso_cfg;
-	struct rso_cfg_params *cfg_params;
-	struct wlan_mlme_psoc_ext_obj *mlme_obj;
 
-	mlme_obj = mlme_get_psoc_ext_obj(mac->psoc);
-	if (!mlme_obj)
-		return;
-
-	rso_cfg = wlan_cm_get_rso_config(vdev);
-	if (!rso_cfg)
-		return;
-	cfg_params = &rso_cfg->cfg_param;
-	cfg_params->enable_scoring_for_roam =
-			mlme_obj->cfg.roam_scoring.enable_scoring_for_roam;
-	cfg_params->empty_scan_refresh_period =
-			mlme_obj->cfg.lfr.empty_scan_refresh_period;
-	cfg_params->full_roam_scan_period =
-			mlme_obj->cfg.lfr.roam_full_scan_period;
-	cfg_params->neighbor_scan_period =
-			mlme_obj->cfg.lfr.neighbor_scan_timer_period;
-	cfg_params->neighbor_lookup_threshold =
-			mlme_obj->cfg.lfr.neighbor_lookup_rssi_threshold;
-	cfg_params->roam_rssi_diff =
-			mlme_obj->cfg.lfr.roam_rssi_diff;
-	cfg_params->bg_rssi_threshold =
-			mlme_obj->cfg.lfr.bg_rssi_threshold;
-
-	cfg_params->max_chan_scan_time =
-			mlme_obj->cfg.lfr.neighbor_scan_max_chan_time;
-	cfg_params->roam_scan_home_away_time =
-			mlme_obj->cfg.lfr.roam_scan_home_away_time;
-	cfg_params->roam_scan_n_probes =
-			mlme_obj->cfg.lfr.roam_scan_n_probes;
-	cfg_params->roam_scan_inactivity_time =
-			mlme_obj->cfg.lfr.roam_scan_inactivity_time;
-	cfg_params->roam_inactive_data_packet_count =
-			mlme_obj->cfg.lfr.roam_inactive_data_packet_count;
-	cfg_params->roam_scan_period_after_inactivity =
-			mlme_obj->cfg.lfr.roam_scan_period_after_inactivity;
-}
-
-QDF_STATUS csr_roam_control_restore_default_config(struct mac_context *mac,
-						   uint8_t vdev_id)
-{
-	QDF_STATUS status = QDF_STATUS_E_INVAL;
-	struct rso_chan_info *chan_info;
-	struct wlan_objmgr_vdev *vdev;
-	struct rso_config *rso_cfg;
-	struct rso_cfg_params *cfg_params;
-
-	if (!mac->mlme_cfg->lfr.roam_scan_offload_enabled) {
-		sme_err("roam_scan_offload_enabled is not supported");
-		goto out;
-	}
-
-	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(mac->pdev, vdev_id,
-						    WLAN_LEGACY_SME_ID);
-	if (!vdev) {
-		sme_err("vdev object is NULL for vdev %d", vdev_id);
-		goto out;
-	}
-	rso_cfg = wlan_cm_get_rso_config(vdev);
-	if (!rso_cfg) {
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		goto out;
-	}
-	cfg_params = &rso_cfg->cfg_param;
-	mac->roam.configParam.nRoamScanControl = false;
-
-	chan_info = &cfg_params->pref_chan_info;
-	csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
-
-	chan_info = &cfg_params->specific_chan_info;
-	csr_flush_cfg_bg_scan_roam_channel_list(chan_info);
-
-	mlme_reinit_control_config_lfr_params(mac->psoc, &mac->mlme_cfg->lfr);
-
-	csr_restore_default_roaming_params(mac, vdev);
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-
-	/* Flush static and dynamic channels in ROAM scan list in firmware */
-	wlan_roam_update_cfg(mac->psoc, vdev_id, REASON_FLUSH_CHANNEL_LIST);
-	wlan_roam_update_cfg(mac->psoc, vdev_id, REASON_SCORING_CRITERIA_CHANGED);
-
-	status = QDF_STATUS_SUCCESS;
-out:
-	return status;
-}
-
-void csr_roam_restore_default_config(struct mac_context *mac_ctx,
-				     uint8_t vdev_id)
-{
-	struct wlan_roam_triggers triggers;
-	struct cm_roam_values_copy src_config;
-
-	if (mac_ctx->mlme_cfg->lfr.roam_scan_offload_enabled) {
-		src_config.bool_value = 0;
-		wlan_cm_roam_cfg_set_value(mac_ctx->psoc, vdev_id,
-				   ROAM_CONFIG_ENABLE,
-				   &src_config);
-	}
-
-	triggers.vdev_id = vdev_id;
-	triggers.trigger_bitmap = wlan_mlme_get_roaming_triggers(mac_ctx->psoc);
-	sme_debug("Reset roam trigger bitmap to 0x%x", triggers.trigger_bitmap);
-	cm_rso_set_roam_trigger(mac_ctx->pdev, vdev_id, &triggers);
-	csr_roam_control_restore_default_config(mac_ctx, vdev_id);
-}
-#endif
-
-#ifndef FEATURE_CM_ENABLE
 /**
  * csr_neighbor_roam_indicate_disconnect() - To indicate disconnect
  * @mac: The handle returned by mac_open
@@ -737,7 +399,7 @@ QDF_STATUS csr_neighbor_roam_indicate_disconnect(struct mac_context *mac,
 	 */
 	if (!csr_neighbor_middle_of_roaming(mac, sessionId)) {
 		wlan_roam_reset_roam_params(mac->psoc);
-		csr_roam_restore_default_config(mac, sessionId);
+		cm_roam_restore_default_config(mac->pdev, sessionId);
 	}
 
 	/*Inform the Firmware to STOP Scanning as the host has a disconnect. */
@@ -1064,25 +726,7 @@ void csr_neighbor_roam_close(struct mac_context *mac, uint8_t sessionId)
 		eCSR_NEIGHBOR_ROAM_STATE_CLOSED, sessionId);
 
 }
-#endif
-
-/**
- * csr_neighbor_roam_is11r_assoc() - Check if association type is 11R
- * @mac_ctx: MAC Global context
- * @session_id: Session ID
- *
- * Return: true if 11r Association, false otherwise.
- */
-bool csr_neighbor_roam_is11r_assoc(struct mac_context *mac_ctx, uint8_t session_id)
-{
-	struct cm_roam_values_copy config;
-
-	wlan_cm_roam_cfg_get_value(mac_ctx->psoc, session_id, IS_11R_CONNECTION,
-				   &config);
-	return config.bool_value;
-}
 
-#ifndef FEATURE_CM_ENABLE
 /*
  * csr_neighbor_middle_of_roaming() -
  * This function returns true if STA is in the middle of roaming states

+ 9 - 3
core/sme/src/rrm/sme_rrm.c

@@ -1200,7 +1200,8 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
 
 		if (beacon_req->channel_info.chan_num != 255) {
 			chan_valid =
-				csr_roam_is_channel_valid(mac, bcn_chan_freq);
+				wlan_roam_is_channel_valid(&mac->mlme_cfg->reg,
+							   bcn_chan_freq);
 
 			if (chan_valid) {
 				rrm_freq_list[num_chan] = bcn_chan_freq;
@@ -1215,7 +1216,8 @@ QDF_STATUS sme_rrm_process_beacon_report_req_ind(struct mac_context *mac,
 			bcn_chan_freq =
 				beacon_req->channel_list.chan_freq_lst[i];
 			chan_valid =
-				csr_roam_is_channel_valid(mac, bcn_chan_freq);
+				wlan_roam_is_channel_valid(&mac->mlme_cfg->reg,
+							   bcn_chan_freq);
 
 			if (chan_valid) {
 				rrm_freq_list[num_chan] = bcn_chan_freq;
@@ -1421,7 +1423,9 @@ rrm_calculate_neighbor_ap_roam_score(struct mac_context *mac_ctx,
 	uint32_t roam_score = 0;
 #ifdef FEATURE_WLAN_ESE
 	uint8_t session_id;
+	struct cm_roam_values_copy config;
 #endif
+
 	if (!nbr_report_desc) {
 		QDF_ASSERT(0);
 		return;
@@ -1473,8 +1477,10 @@ rrm_calculate_neighbor_ap_roam_score(struct mac_context *mac_ctx,
 check_11r_assoc:
 #ifdef FEATURE_WLAN_ESE
 	session_id = nbr_report_desc->sessionId;
+	wlan_cm_roam_cfg_get_value(mac_ctx->psoc, session_id, IS_11R_CONNECTION,
+				   &config);
 	/* It has come in the report so its the best score */
-	if (csr_neighbor_roam_is11r_assoc(mac_ctx, session_id) == false) {
+	if (!config.bool_value) {
 		/* IAPP Route so lets make use of this info save all AP, as the
 		 * list does not come all the time. Save and reuse till the next
 		 * AP List comes to us. Even save our own MAC address. Will be