Browse Source

qcacld-3.0: Add additional debugs for roam scan offload commands

Add additional debugs in wmi for roam scan offload mode command
TLVs.
Also add changes to fill scan parameters for Roam scan offload
mode command start scan fixed param.

Change-Id: I9610d54a1f331c5f9910d44b11c5841e034036b8
CRs-Fixed: 2770713
Pragaspathi Thilagaraj 4 years ago
parent
commit
86c2433d79

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

@@ -693,6 +693,7 @@ struct wlan_roam_fils_params {
  * @n_probes: Max number of probes to be sent
  * @scan_ctrl_flags: Scan control flags
  * @scan_ctrl_flags_ext: Scan control flags extended
+ * @rso_adaptive_dwell_mode: Adaptive dwell mode
  * @num_chan: number of channels
  * @num_bssid: number of bssids in tlv bssid_list[]
  * @ie_len: number of bytes in ie data. In the TLV ie_data[]
@@ -716,6 +717,7 @@ struct wlan_roam_scan_params {
 	uint32_t n_probes;
 	uint32_t scan_ctrl_flags;
 	uint32_t scan_ctrl_flags_ext;
+	enum scan_dwelltime_adaptive_mode rso_adaptive_dwell_mode;
 	uint32_t num_chan;
 	uint32_t num_bssid;
 	uint32_t ie_len;
@@ -853,12 +855,20 @@ struct wlan_rso_ese_params {
 };
 #endif
 
+#define ROAM_SCAN_DWELL_TIME_ACTIVE_DEFAULT   (100)
+#define ROAM_SCAN_DWELL_TIME_PASSIVE_DEFAULT  (110)
+#define ROAM_SCAN_MIN_REST_TIME_DEFAULT       (50)
+#define ROAM_SCAN_MAX_REST_TIME_DEFAULT       (500)
+#define ROAM_SCAN_HW_DEF_SCAN_MAX_DURATION    30000 /* 30 secs */
+#define ROAM_SCAN_CHANNEL_SWITCH_TIME         (4)
+
 /**
  * struct roam_offload_scan_params - structure containing roaming offload scan
  * parameters to be filled over WMI_ROAM_SCAN_MODE command.
  * @vdev_id: vdev id
  * @is_rso_stop: flag to tell whether roam req is valid or NULL
  * @rso_mode_info: Roam scan mode related parameters
+ * @rso_scan_params: Roam scan offload scan start params
  * @scan_params: Roaming scan related parameters
  * @assoc_ie_length: Assoc IE length
  * @assoc_ie: Assoc IE buffer
@@ -878,6 +888,7 @@ struct wlan_roam_scan_offload_params {
 	/* Parameters common for LFR-3.0 and LFR-2.0 */
 	bool roaming_scan_policy;
 	struct wlan_roam_scan_mode_params rso_mode_info;
+	struct wlan_roam_scan_params rso_scan_params;
 	uint32_t assoc_ie_length;
 	uint8_t  assoc_ie[MAX_ASSOC_IE_LENGTH];
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD

+ 90 - 25
components/wmi/src/wmi_unified_roam_tlv.c

@@ -1946,6 +1946,10 @@ static uint8_t *wmi_add_fils_tlv(wmi_unified_t wmi_handle,
 		     erp_info->realm_len);
 
 	buf_ptr += sizeof(*fils_tlv);
+	wmi_debug("RSO_CONFIG: ERP: usrname_len:%d next_erp_seq_num:%d rRk_len:%d rIk_len:%d realm_len:%d",
+		  erp_info->username_length, erp_info->next_erp_seq_num,
+		  erp_info->rRk_length, erp_info->rIk_length,
+		  erp_info->realm_len);
 	return buf_ptr;
 }
 #else
@@ -2045,6 +2049,17 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf,
 			src_lfr3_params->rct_validity_timer;
 	roam_offload_params->roam_to_current_bss_disable =
 			src_lfr3_params->disable_self_roam;
+	wmi_debug("RSO_CFG: prefer_5g:%d rssi_cat_gap:%d select_5g_margin:%d ho_delay:%d max_sw_retry:%d no_ack_timeout:%d",
+		  roam_offload_params->prefer_5g,
+		  roam_offload_params->rssi_cat_gap,
+		  roam_offload_params->select_5g_margin,
+		  roam_offload_params->handoff_delay_for_rx,
+		  roam_offload_params->max_mlme_sw_retries,
+		  roam_offload_params->no_ack_timeout);
+	wmi_debug("RSO_CFG: reassoc_fail_timeout:%d rct_validity_time:%d disable_self_roam:%d",
+		  roam_offload_params->reassoc_failure_timeout,
+		  roam_offload_params->roam_candidate_validity_time,
+		  roam_offload_params->roam_to_current_bss_disable);
 
 	/* Fill the capabilities */
 	roam_offload_params->capability = src_lfr3_caps->capability;
@@ -2059,6 +2074,15 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf,
 	qdf_mem_copy((uint8_t *)roam_offload_params->mcsset,
 		     (uint8_t *)src_lfr3_caps->mcsset,
 		     ROAM_OFFLOAD_NUM_MCS_SET);
+	wmi_debug("RSO_CFG: capability:0x%x ht_caps:0x%x ampdu_param:0%x ht_ext_cap:0x%x ht_txbf:0x%x asel_cap:0x%x qos_caps:0x%x qos_en:%d wmm_caps:0x%x",
+		  roam_offload_params->capability,
+		  roam_offload_params->ht_caps_info,
+		  roam_offload_params->ampdu_param,
+		  roam_offload_params->ht_ext_cap,
+		  roam_offload_params->ht_txbf, roam_offload_params->asel_cap,
+		  roam_offload_params->qos_caps,
+		  roam_offload_params->qos_enabled,
+		  roam_offload_params->wmm_caps);
 
 	buf += sizeof(wmi_roam_offload_tlv_param);
 	/*
@@ -2141,25 +2165,10 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf,
 			WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_STRUC, 0);
 			buf += WMI_TLV_HDR_SIZE;
 
-			wmi_debug("vdev[%d] 11r TLV psk_msk_len = %d psk_msk_ext:%d",
+			wmi_debug("RSO_CFG: vdev[%d] 11r TLV psk_msk_len = %d psk_msk_ext:%d",
 				  roam_req->vdev_id,
 				  roam_offload_11r->psk_msk_len,
 				  roam_offload_11r->psk_msk_ext_len);
-			if (roam_offload_11r->psk_msk_len)
-				QDF_TRACE_HEX_DUMP(
-					QDF_MODULE_ID_WMI,
-					QDF_TRACE_LEVEL_DEBUG,
-					roam_offload_11r->psk_msk,
-					WLAN_MAX_PMK_DUMP_BYTES);
-
-			if (roam_offload_11r->psk_msk_ext_len)
-				QDF_TRACE_HEX_DUMP(
-					QDF_MODULE_ID_WMI,
-					QDF_TRACE_LEVEL_DEBUG,
-					roam_offload_11r->psk_msk_ext +
-					(roam_offload_11r->psk_msk_ext_len -
-					 WLAN_MAX_PMK_DUMP_BYTES),
-					WLAN_MAX_PMK_DUMP_BYTES);
 		} else {
 			WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_STRUC,
 				       sizeof(wmi_roam_11i_offload_tlv_param));
@@ -2222,7 +2231,7 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf,
 			WMITLV_SET_HDR(buf, WMITLV_TAG_ARRAY_STRUC, 0);
 			buf += WMI_TLV_HDR_SIZE;
 
-			wmi_info("LFR3: vdev:%d pmk_len = %d pmksa caching:%d OKC:%d sae_same_pmk:%d key_mgmt_offload:%d",
+			wmi_info("RSO_CFG: vdev:%d pmk_len = %d pmksa caching:%d OKC:%d sae_same_pmk:%d key_mgmt_offload:%d",
 				 roam_req->vdev_id, roam_offload_11i->pmk_len,
 				 src_11i_info->fw_pmksa_cache,
 				 src_11i_info->fw_okc,
@@ -2260,7 +2269,8 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf,
 		       roundup(assoc_ies->buf_len, sizeof(uint32_t)));
 	buf += WMI_TLV_HDR_SIZE;
 
-	if (assoc_ies->buf_len != 0)
+	wmi_debug("RSO_CFG: assoc_ies len:%d", assoc_ies->buf_len);
+	if (assoc_ies->buf_len)
 		qdf_mem_copy(buf, roam_req->assoc_ie, assoc_ies->buf_len);
 
 	buf += qdf_roundup(assoc_ies->buf_len, sizeof(uint32_t));
@@ -2283,6 +2293,67 @@ wmi_fill_rso_tlvs(wmi_unified_t wmi_handle, uint8_t *buf_ptr,
 }
 #endif
 
+static QDF_STATUS
+wmi_fill_rso_start_scan_tlv(struct wlan_roam_scan_offload_params *rso_req,
+			    wmi_start_scan_cmd_fixed_param *scan_tlv)
+{
+	struct wlan_roam_scan_params *src_scan_params;
+
+	src_scan_params = &rso_req->rso_scan_params;
+
+	qdf_mem_zero(scan_tlv, sizeof(*scan_tlv));
+	scan_tlv->scan_ctrl_flags = WMI_SCAN_ADD_CCK_RATES |
+				    WMI_SCAN_ADD_OFDM_RATES |
+				    WMI_SCAN_ADD_DS_IE_IN_PROBE_REQ;
+	if (rso_req->is_rso_stop) {
+		scan_tlv->dwell_time_active =
+			ROAM_SCAN_DWELL_TIME_ACTIVE_DEFAULT;
+		scan_tlv->dwell_time_passive =
+			ROAM_SCAN_DWELL_TIME_PASSIVE_DEFAULT;
+		scan_tlv->min_rest_time = ROAM_SCAN_MIN_REST_TIME_DEFAULT;
+		scan_tlv->max_rest_time = ROAM_SCAN_MAX_REST_TIME_DEFAULT;
+		scan_tlv->repeat_probe_time = 0;
+		scan_tlv->probe_spacing_time = 0;
+		scan_tlv->probe_delay = 0;
+		scan_tlv->max_scan_time = ROAM_SCAN_HW_DEF_SCAN_MAX_DURATION;
+		scan_tlv->idle_time = src_scan_params->min_rest_time;
+		scan_tlv->burst_duration = 0;
+
+		return QDF_STATUS_SUCCESS;
+	}
+
+	scan_tlv->dwell_time_active = src_scan_params->dwell_time_active;
+	scan_tlv->dwell_time_passive = src_scan_params->dwell_time_passive;
+	scan_tlv->burst_duration = src_scan_params->burst_duration;
+	scan_tlv->min_rest_time = src_scan_params->min_rest_time;
+	scan_tlv->max_rest_time = src_scan_params->max_rest_time;
+	scan_tlv->repeat_probe_time = src_scan_params->repeat_probe_time;
+	scan_tlv->probe_spacing_time = src_scan_params->probe_spacing_time;
+	scan_tlv->probe_delay = src_scan_params->probe_delay;
+	scan_tlv->max_scan_time = ROAM_SCAN_HW_DEF_SCAN_MAX_DURATION;
+	scan_tlv->idle_time = src_scan_params->idle_time;
+	scan_tlv->n_probes = src_scan_params->n_probes;
+	scan_tlv->scan_ctrl_flags |= src_scan_params->scan_ctrl_flags;
+
+	WMI_SCAN_SET_DWELL_MODE(scan_tlv->scan_ctrl_flags,
+				src_scan_params->rso_adaptive_dwell_mode);
+
+	/* Configure roaming scan behavior (DBS/Non-DBS scan) */
+	if (rso_req->roaming_scan_policy)
+		scan_tlv->scan_ctrl_flags_ext |=
+			WMI_SCAN_DBS_POLICY_FORCE_NONDBS;
+	else
+		scan_tlv->scan_ctrl_flags_ext |=
+			WMI_SCAN_DBS_POLICY_DEFAULT;
+
+	wmi_debug("RSO_CFG: dwell time: active %d passive %d, minrest %d max rest %d repeat probe time %d probe_spacing:%d",
+		  scan_tlv->dwell_time_active, scan_tlv->dwell_time_passive,
+		  scan_tlv->min_rest_time, scan_tlv->max_rest_time,
+		  scan_tlv->repeat_probe_time, scan_tlv->probe_spacing_time);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * send_roam_scan_offload_mode_cmd_tlv() - send roam scan mode request to fw
  * @wmi_handle: wmi handle
@@ -2359,13 +2430,7 @@ send_roam_scan_offload_mode_cmd_tlv(
 		WMITLV_GET_STRUCT_TLVLEN(wmi_start_scan_cmd_fixed_param));
 
 	scan_cmd_fp = (wmi_start_scan_cmd_fixed_param *)buf_ptr;
-	/* Configure roaming scan behavior (DBS/Non-DBS scan) */
-	if (rso_req->roaming_scan_policy)
-		scan_cmd_fp->scan_ctrl_flags_ext |=
-			WMI_SCAN_DBS_POLICY_FORCE_NONDBS;
-	else
-		scan_cmd_fp->scan_ctrl_flags_ext |=
-			WMI_SCAN_DBS_POLICY_DEFAULT;
+	wmi_fill_rso_start_scan_tlv(rso_req, scan_cmd_fp);
 
 	/* Ensure there is no additional IEs */
 	scan_cmd_fp->ie_len = 0;

+ 167 - 27
core/sme/src/csr/csr_api_roam.c

@@ -20349,19 +20349,22 @@ static QDF_STATUS csr_cm_roam_scan_offload_fill_lfr3_config(
 			struct mac_context *mac,
 			struct csr_roam_session *session,
 			struct wlan_roam_scan_offload_params *rso_config,
-			uint8_t command)
+			uint8_t command, uint32_t *mode)
 {
 	struct wlan_objmgr_vdev *vdev;
 	tSirMacCapabilityInfo self_caps;
 	tSirMacQosInfoStation sta_qos_info;
+	enum csr_akm_type akm;
+	eCsrEncryptionType encr;
 	uint16_t *final_caps_val;
 	uint8_t *qos_cfg_val, temp_val;
 	uint32_t pmkid_modes = mac->mlme_cfg->sta.pmkid_modes;
 	uint32_t val = 0;
+	uint16_t vdev_id = session->vdev_id;
 	qdf_size_t val_len;
 	QDF_STATUS status;
 	tpCsrNeighborRoamControlInfo roam_info =
-		&mac->roam.neighborRoamInfo[session->vdev_id];
+		&mac->roam.neighborRoamInfo[vdev_id];
 
 	rso_config->roam_offload_enabled =
 		mac->mlme_cfg->lfr.lfr3_roaming_offload;
@@ -20369,10 +20372,10 @@ static QDF_STATUS csr_cm_roam_scan_offload_fill_lfr3_config(
 		return QDF_STATUS_SUCCESS;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc,
-						    session->vdev_id,
+						    vdev_id,
 						    WLAN_LEGACY_SME_ID);
 	if (!vdev) {
-		sme_err("Vdev:%d is NULL", session->vdev_id);
+		sme_err("Vdev:%d is NULL", vdev_id);
 		return QDF_STATUS_E_FAILURE;
 	}
 
@@ -20395,6 +20398,9 @@ static QDF_STATUS csr_cm_roam_scan_offload_fill_lfr3_config(
 		mac->mlme_cfg->btm.rct_validity_timer;
 	rso_config->rso_lfr3_params.disable_self_roam =
 		!mac->mlme_cfg->lfr.enable_self_bss_roam;
+	if (!roam_info->roam_control_enable &&
+	    mac->mlme_cfg->lfr.roam_force_rssi_trigger)
+		*mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
 
 	/* Fill LFR3 specific self capabilities for roam scan mode TLV */
 	self_caps.ess = 1;
@@ -20497,7 +20503,7 @@ static QDF_STATUS csr_cm_roam_scan_offload_fill_lfr3_config(
 	/* Check whether to send psk_pmk or sae_single pmk info */
 	if (!csr_cm_fill_rso_sae_single_pmk_info(mac,
 						 &rso_config->rso_11i_info,
-						 session->vdev_id)) {
+						 vdev_id)) {
 		rso_config->rso_11i_info.is_sae_same_pmk = false;
 		qdf_mem_copy(rso_config->rso_11i_info.psk_pmk, session->psk_pmk,
 			     sizeof(rso_config->rso_11i_info.psk_pmk));
@@ -20516,8 +20522,10 @@ static QDF_STATUS csr_cm_roam_scan_offload_fill_lfr3_config(
 				       session);
 	csr_cm_update_rso_ese_info(mac, rso_config, roam_info, session);
 
-	/* TODO: Fill auth mode */
-	rso_config->akm = WMI_AUTH_OPEN;
+	akm = mac->roam.roamSession[vdev_id].connectedProfile.AuthType;
+	encr =
+	mac->roam.roamSession[vdev_id].connectedProfile.EncryptionType;
+	rso_config->akm = e_csr_auth_type_to_rsn_authmode(akm, encr);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -20527,12 +20535,137 @@ csr_cm_roam_scan_offload_fill_lfr3_config(
 			struct mac_context *mac,
 			struct csr_roam_session *session,
 			struct wlan_roam_scan_offload_params *rso_config,
-			uint8_t command)
+			uint8_t command, uint32_t *mode)
 {
+	if (mac->mlme_cfg->lfr.roam_force_rssi_trigger)
+		*mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
+
 	return QDF_STATUS_SUCCESS;
 }
 #endif
 
+static void
+csr_cm_roam_scan_offload_fill_scan_params(
+		struct mac_context *mac,
+		struct csr_roam_session *session,
+		struct wlan_roam_scan_offload_params *rso_mode_cfg,
+		struct wlan_roam_scan_channel_list *rso_chan_info,
+		uint8_t command)
+{
+	struct wlan_roam_scan_params *scan_params =
+			&rso_mode_cfg->rso_scan_params;
+	tpCsrNeighborRoamControlInfo roam_info =
+		&mac->roam.neighborRoamInfo[session->vdev_id];
+	uint8_t channels_per_burst = 0;
+	uint16_t roam_scan_home_away_time;
+	eSirDFSRoamScanMode allow_dfs_ch_roam;
+
+	qdf_mem_zero(scan_params, sizeof(*scan_params));
+	if (command == ROAM_SCAN_OFFLOAD_STOP)
+		return;
+
+	/* Parameters updated after association is complete */
+	wlan_scan_cfg_get_passive_dwelltime(mac->psoc,
+					    &scan_params->dwell_time_passive);
+	/*
+	 * Here is the formula,
+	 * T(HomeAway) = N * T(dwell) + (N+1) * T(cs)
+	 * where N is number of channels scanned in single burst
+	 */
+	scan_params->dwell_time_active =
+		roam_info->cfgParams.maxChannelScanTime;
+
+	roam_scan_home_away_time =
+		roam_info->cfgParams.roam_scan_home_away_time;
+	if (roam_scan_home_away_time <
+	    (scan_params->dwell_time_active +
+	     (2 * ROAM_SCAN_CHANNEL_SWITCH_TIME))) {
+		sme_debug("Disable Home away time(%d) as it is less than (2*RF switching time + channel max time)(%d)",
+			  roam_scan_home_away_time,
+			  (scan_params->dwell_time_active +
+			   (2 * ROAM_SCAN_CHANNEL_SWITCH_TIME)));
+		roam_scan_home_away_time = 0;
+	}
+
+	if (roam_scan_home_away_time < (2 * ROAM_SCAN_CHANNEL_SWITCH_TIME)) {
+		/* clearly we can't follow home away time.
+		 * Make it a split scan.
+		 */
+		scan_params->burst_duration = 0;
+	} else {
+		channels_per_burst =
+		  (roam_scan_home_away_time - ROAM_SCAN_CHANNEL_SWITCH_TIME) /
+		  (scan_params->dwell_time_active + ROAM_SCAN_CHANNEL_SWITCH_TIME);
+
+		if (channels_per_burst < 1) {
+			/* dwell time and home away time conflicts */
+			/* we will override dwell time */
+			scan_params->dwell_time_active =
+				roam_scan_home_away_time -
+				(2 * ROAM_SCAN_CHANNEL_SWITCH_TIME);
+			scan_params->burst_duration =
+				scan_params->dwell_time_active;
+		} else {
+			scan_params->burst_duration =
+				channels_per_burst *
+				scan_params->dwell_time_active;
+		}
+	}
+
+	allow_dfs_ch_roam =
+		(eSirDFSRoamScanMode)mac->mlme_cfg->lfr.roaming_dfs_channel;
+	/* Roaming on DFS channels is supported and it is not
+	 * app channel list. It is ok to override homeAwayTime
+	 * to accommodate DFS dwell time in burst
+	 * duration.
+	 */
+	if (allow_dfs_ch_roam == SIR_ROAMING_DFS_CHANNEL_ENABLED_NORMAL &&
+	    roam_scan_home_away_time > 0  &&
+	    rso_chan_info->chan_cache_type != CHANNEL_LIST_STATIC)
+		scan_params->burst_duration =
+			QDF_MAX(scan_params->burst_duration,
+				scan_params->dwell_time_passive);
+
+	scan_params->min_rest_time =
+		roam_info->cfgParams.neighbor_scan_min_period;
+	scan_params->max_rest_time = roam_info->cfgParams.neighborScanPeriod;
+	scan_params->repeat_probe_time =
+		(roam_info->cfgParams.roam_scan_n_probes > 0) ?
+			QDF_MAX(scan_params->dwell_time_active /
+				roam_info->cfgParams.roam_scan_n_probes, 1) : 0;
+	scan_params->probe_spacing_time = 0;
+	scan_params->probe_delay = 0;
+	/* 30 seconds for full scan cycle */
+	scan_params->max_scan_time = ROAM_SCAN_HW_DEF_SCAN_MAX_DURATION;
+	scan_params->idle_time = scan_params->min_rest_time;
+	scan_params->n_probes = roam_info->cfgParams.roam_scan_n_probes;
+
+	if (allow_dfs_ch_roam == SIR_ROAMING_DFS_CHANNEL_DISABLED) {
+		scan_params->scan_ctrl_flags |= WMI_SCAN_BYPASS_DFS_CHN;
+	} else {
+		/* Roaming scan on DFS channel is allowed.
+		 * No need to change any flags for default
+		 * allowDFSChannelRoam = 1.
+		 * Special case where static channel list is given by\
+		 * application that contains DFS channels.
+		 * Assume that the application has knowledge of matching
+		 * APs being active and that probe request transmission
+		 * is permitted on those channel.
+		 * Force active scans on those channels.
+		 */
+
+		if (allow_dfs_ch_roam ==
+		    SIR_ROAMING_DFS_CHANNEL_ENABLED_ACTIVE &&
+		    rso_chan_info->chan_cache_type == CHANNEL_LIST_STATIC &&
+		    rso_chan_info->chan_count)
+			scan_params->scan_ctrl_flags |=
+				WMI_SCAN_FLAG_FORCE_ACTIVE_ON_DFS;
+	}
+
+	scan_params->rso_adaptive_dwell_mode =
+		mac->mlme_cfg->lfr.adaptive_roamscan_dwell_mode;
+}
+
 /**
  * csr_cm_roam_scan_offload_fill_rso_configs  - Fill Roam scan offload related
  * configs for WMI_ROAM_SCAN_MODE command to firmware.
@@ -20544,50 +20677,53 @@ static void csr_cm_roam_scan_offload_fill_rso_configs(
 			struct mac_context *mac,
 			struct csr_roam_session *session,
 			struct wlan_roam_scan_offload_params *rso_mode_cfg,
+			struct wlan_roam_scan_channel_list *rso_chan_info,
 			uint8_t command, uint16_t reason)
 {
 	uint8_t vdev_id = session->vdev_id;
 	tpCsrNeighborRoamControlInfo roam_info =
 			&mac->roam.neighborRoamInfo[vdev_id];
 	uint32_t mode = 0;
-	bool force_rssi_trigger;
 
 	qdf_mem_zero(rso_mode_cfg, sizeof(*rso_mode_cfg));
 
 	rso_mode_cfg->vdev_id = session->vdev_id;
 	rso_mode_cfg->is_rso_stop = (command == ROAM_SCAN_OFFLOAD_STOP);
+	rso_mode_cfg->roaming_scan_policy =
+		mac->mlme_cfg->lfr.roaming_scan_policy;
 
 	/* Fill ROAM SCAN mode TLV parameters */
 	if (roam_info->cfgParams.emptyScanRefreshPeriod)
 		mode |= WMI_ROAM_SCAN_MODE_PERIODIC;
 
-	/* TODO move this inside LFR3 specific handling*/
-	force_rssi_trigger = true;
-	if (force_rssi_trigger)
-		mode |= WMI_ROAM_SCAN_MODE_RSSI_CHANGE;
-
-	rso_mode_cfg->rso_mode_info.roam_scan_mode = mode;
 	rso_mode_cfg->rso_mode_info.min_delay_btw_scans =
 			mac->mlme_cfg->lfr.min_delay_btw_roam_scans;
 	rso_mode_cfg->rso_mode_info.min_delay_roam_trigger_bitmask =
 			mac->mlme_cfg->lfr.roam_trigger_reason_bitmask;
 
-	if (reason == REASON_ROAM_STOP_ALL ||
-	    reason == REASON_DISCONNECTED ||
-	    reason == REASON_ROAM_SYNCH_FAILED) {
-		mode = WMI_ROAM_SCAN_MODE_NONE;
-	} else {
-		if (csr_is_roam_offload_enabled(mac))
-			mode = WMI_ROAM_SCAN_MODE_NONE |
-				WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
-		else
+	if (command == ROAM_SCAN_OFFLOAD_STOP) {
+		if (reason == REASON_ROAM_STOP_ALL ||
+		    reason == REASON_DISCONNECTED ||
+		    reason == REASON_ROAM_SYNCH_FAILED) {
 			mode = WMI_ROAM_SCAN_MODE_NONE;
+		} else {
+			if (csr_is_roam_offload_enabled(mac))
+				mode = WMI_ROAM_SCAN_MODE_NONE |
+					WMI_ROAM_SCAN_MODE_ROAMOFFLOAD;
+			else
+				mode = WMI_ROAM_SCAN_MODE_NONE;
+		}
 	}
 
+	rso_mode_cfg->rso_mode_info.roam_scan_mode = mode;
 	if (command == ROAM_SCAN_OFFLOAD_STOP)
 		return;
 
 	csr_cm_roam_scan_offload_fill_lfr3_config(mac, session, rso_mode_cfg,
+						  command, &mode);
+	rso_mode_cfg->rso_mode_info.roam_scan_mode = mode;
+	csr_cm_roam_scan_offload_fill_scan_params(mac, session, rso_mode_cfg,
+						  rso_chan_info,
 						  command);
 	csr_cm_update_driver_assoc_ies(mac, session, rso_mode_cfg);
 	cm_roam_scan_offload_add_fils_params(mac->psoc, rso_mode_cfg,
@@ -20810,6 +20946,7 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 
 	csr_cm_roam_scan_offload_fill_rso_configs(mac_ctx, session,
 						  &req->rso_config,
+						  &req->rso_chan_info,
 						  ROAM_SCAN_OFFLOAD_START,
 						  reason);
 
@@ -20868,7 +21005,8 @@ wlan_cm_roam_fill_stop_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 
 	csr_cm_roam_scan_offload_fill_rso_configs(mac_ctx, session,
 						  &req->rso_config,
-						  ROAM_SCAN_OFFLOAD_STOP,
+						  NULL,
+						  ROAM_SCAN_OFFLOAD_START,
 						  reason);
 
 	return status;
@@ -20905,15 +21043,17 @@ wlan_cm_roam_fill_update_config_req(struct wlan_objmgr_psoc *psoc,
 	csr_cm_roam_scan_offload_scan_period(mac_ctx, vdev_id,
 					     &req->scan_period_params);
 
+	csr_cm_fill_rso_channel_list(mac_ctx, &req->rso_chan_info, vdev_id,
+				     reason);
+
 	csr_cm_roam_scan_offload_fill_rso_configs(mac_ctx, session,
 						  &req->rso_config,
+						  &req->rso_chan_info,
 						  ROAM_SCAN_OFFLOAD_UPDATE_CFG,
 						  reason);
 
 	csr_cm_roam_scan_offload_ap_profile(mac_ctx, session,
 					    &req->profile_params);
-	csr_cm_fill_rso_channel_list(mac_ctx, &req->rso_chan_info, vdev_id,
-				     reason);
 
 	return QDF_STATUS_SUCCESS;
 }