Browse Source

qcacld-3.0: Move rso related process to connection manager [PART 2]

Add new code to implement below functions for connection manager
roam part:
WLAN_ROAMING_IN_PROG/WLAN_ROAM_SYNCH_IN_PROG related handler.
Filling below WMI cmd parameters related process:
WMI_VDEV_PARAM_BMISS_FIRST_BCNT
WMI_VDEV_PARAM_BMISS_FINAL_BCNT
WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE
WMI_ROAM_ENABLE_DISABLE_TRIGGER_REASON_CMDID
WMI_ROAM_SCAN_PERIOD

Change-Id: I28439393a57c72012f9de51f24050f95366294bc
CRs-Fixed: 2738353
hqu 4 years ago
parent
commit
f36840cce8

+ 22 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -2653,4 +2653,26 @@ QDF_STATUS mlme_get_fw_scan_channels(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS
 wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
 					bool *val);
+
+/**
+ * wlan_mlme_get_roam_bmiss_final_bcnt() - Get roam bmiss final count
+ * @psoc: pointer to psoc object
+ * @val:  Pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
+				    uint8_t *val);
+
+/**
+ * wlan_mlme_get_roam_bmiss_first_bcnt() - Get roam bmiss first count
+ * @psoc: pointer to psoc object
+ * @val:  Pointer to the value which will be filled for the caller
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
+				    uint8_t *val);
 #endif /* _WLAN_MLME_API_H_ */

+ 34 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -4047,3 +4047,37 @@ wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS
+wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
+				    uint8_t *val)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		*val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	*val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
+				    uint8_t *val)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		*val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	*val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
+
+	return QDF_STATUS_SUCCESS;
+}

+ 2 - 22
components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c

@@ -984,34 +984,14 @@ QDF_STATUS
 ucfg_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
 				    uint8_t *val)
 {
-	struct wlan_mlme_psoc_ext_obj *mlme_obj;
-
-	mlme_obj = mlme_get_psoc_ext_obj(psoc);
-	if (!mlme_obj) {
-		*val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	*val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
-
-	return QDF_STATUS_SUCCESS;
+	return wlan_mlme_get_roam_bmiss_final_bcnt(psoc, val);
 }
 
 QDF_STATUS
 ucfg_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
 				    uint8_t *val)
 {
-	struct wlan_mlme_psoc_ext_obj *mlme_obj;
-
-	mlme_obj = mlme_get_psoc_ext_obj(psoc);
-	if (!mlme_obj) {
-		*val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
-		return QDF_STATUS_E_INVAL;
-	}
-
-	*val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
-
-	return QDF_STATUS_SUCCESS;
+	return wlan_mlme_get_roam_bmiss_first_bcnt(psoc, val);
 }
 
 QDF_STATUS

+ 196 - 4
components/target_if/connection_mgr/src/target_if_cm_roam_offload.c

@@ -85,6 +85,146 @@ target_if_cm_roam_register_lfr3_ops(struct wlan_cm_roam_tx_ops *tx_ops)
 #endif
 
 #ifdef ROAM_OFFLOAD_V1
+/**
+ * target_if_is_vdev_valid - vdev id is valid or not
+ * @vdev_id: vdev id
+ *
+ * Return: true or false
+ */
+static bool target_if_is_vdev_valid(uint8_t vdev_id)
+{
+	return (vdev_id < WLAN_MAX_VDEVS ? true : false);
+}
+
+/**
+ * target_if_vdev_set_param() - set per vdev params in fw
+ * @wmi_handle: wmi handle
+ * @vdev_id: vdev id
+ * @param_id: parameter id
+ * @param_value: parameter value
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+target_if_vdev_set_param(wmi_unified_t wmi_handle, uint32_t vdev_id,
+			 uint32_t param_id, uint32_t param_value)
+{
+	struct vdev_set_params param = {0};
+
+	if (!target_if_is_vdev_valid(vdev_id)) {
+		target_if_err("vdev_id: %d is invalid, reject the req: param id %d val %d",
+			      vdev_id, param_id, param_value);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	param.vdev_id = vdev_id;
+	param.param_id = param_id;
+	param.param_value = param_value;
+
+	return wmi_unified_vdev_set_param_send(wmi_handle, &param);
+}
+
+/**
+ * target_if_cm_roam_scan_bmiss_cnt() - set bmiss count to fw
+ * @wmi_handle: wmi handle
+ * @req: bmiss count parameters
+ *
+ * Set first & final bmiss count to fw.
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+target_if_cm_roam_scan_bmiss_cnt(wmi_unified_t wmi_handle,
+				 struct wlan_roam_beacon_miss_cnt *req)
+{
+	QDF_STATUS status;
+	uint32_t vdev_id;
+	uint8_t first_bcnt;
+	uint8_t final_bcnt;
+
+	vdev_id = req->vdev_id;
+	first_bcnt = req->roam_bmiss_first_bcnt;
+	final_bcnt = req->roam_bmiss_final_bcnt;
+
+	target_if_debug("first_bcnt: %d, final_bcnt: %d",
+			first_bcnt, final_bcnt);
+
+	status = target_if_vdev_set_param(wmi_handle, vdev_id,
+					  WMI_VDEV_PARAM_BMISS_FIRST_BCNT,
+					  first_bcnt);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		target_if_err("vdev set WMI_VDEV_PARAM_BMISS_FIRST_BCNT params returned error %d",
+			      status);
+		return status;
+	}
+
+	status = target_if_vdev_set_param(wmi_handle, vdev_id,
+					  WMI_VDEV_PARAM_BMISS_FINAL_BCNT,
+					  final_bcnt);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		target_if_err("vdev set WMI_VDEV_PARAM_BMISS_FINAL_BCNT params returned error %d",
+			      status);
+		return status;
+	}
+
+	return status;
+}
+
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+/* target_if_cm_roam_reason_vsie(): set vdev param
+ * WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE
+ * @wmi_handle: handle to WMI
+ * @req: roam reason vsie enable parameters
+ *
+ * Return: void
+ */
+static void
+target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
+			      struct wlan_roam_reason_vsie_enable *req)
+{
+	QDF_STATUS status;
+
+	status = target_if_vdev_set_param(
+				wmi_handle,
+				req->vdev_id,
+				WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE,
+				req->enable_roam_reason_vsie);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		target_if_err("Failed to set vdev param %d",
+			      WMI_VDEV_PARAM_ENABLE_DISABLE_ROAM_REASON_VSIE);
+}
+
+/* target_if_cm_roam_triggers(): send roam triggers to WMI
+ * @wmi_handle: handle to WMI
+ * @req: roam triggers parameters
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
+			   struct wlan_roam_triggers *req)
+{
+	if (!target_if_is_vdev_valid(req->vdev_id))
+		return QDF_STATUS_E_INVAL;
+
+	return wmi_unified_set_roam_triggers(wmi_handle, req);
+}
+#else
+static void
+target_if_cm_roam_reason_vsie(wmi_unified_t wmi_handle,
+			      struct wlan_roam_reason_vsie_enable *req)
+{
+}
+
+static QDF_STATUS
+target_if_cm_roam_triggers(wmi_unified_t wmi_handle,
+			   struct wlan_roam_triggers *req)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
+#endif
+
 /**
  * target_if_cm_roam_scan_offload_rssi_thresh() - Send roam scan rssi threshold
  * commands to wmi
@@ -200,6 +340,28 @@ target_if_cm_roam_scan_offload_rssi_thresh(
 	return status;
 }
 
+/**
+ * target_if_roam_scan_offload_scan_period() - set roam offload scan period
+ * @wmi_handle: wmi handle
+ * @req:  roam scan period parameters
+ *
+ * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+target_if_cm_roam_scan_offload_scan_period(
+				wmi_unified_t wmi_handle,
+				struct wlan_roam_scan_period_params *req)
+{
+	if (!target_if_is_vdev_valid(req->vdev_id)) {
+		target_if_err("Invalid vdev id:%d", req->vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return wmi_unified_roam_scan_offload_scan_period(wmi_handle, req);
+}
+
 /**
  * target_if_cm_roam_send_roam_start() - Send roam start related commands
  * to wmi
@@ -214,17 +376,47 @@ static QDF_STATUS
 target_if_cm_roam_send_roam_start(struct wlan_objmgr_vdev *vdev,
 				  struct wlan_roam_start_config *req)
 {
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	wmi_unified_t wmi_handle;
 
 	wmi_handle = target_if_cm_roam_get_wmi_handle_from_vdev(vdev);
 	if (!wmi_handle)
 		return QDF_STATUS_E_FAILURE;
 
-	target_if_cm_roam_scan_offload_rssi_thresh(wmi_handle,
-						   &req->rssi_params);
-	/* add other wmi commands */
+	status = target_if_cm_roam_scan_offload_rssi_thresh(
+							wmi_handle,
+							&req->rssi_params);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		target_if_err("Sending roam scan offload rssi thresh failed");
+		goto end;
+	}
 
-	return QDF_STATUS_SUCCESS;
+	status = target_if_cm_roam_scan_bmiss_cnt(wmi_handle,
+						  &req->beacon_miss_cnt);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		target_if_err("vdev set bmiss bcnt param failed");
+		goto end;
+	}
+
+	target_if_cm_roam_reason_vsie(wmi_handle, &req->reason_vsie_enable);
+
+	target_if_cm_roam_triggers(wmi_handle, &req->roam_triggers);
+
+	/* Opportunistic scan runs on a timer, value set by
+	 * empty_scan_refresh_period. Age out the entries after 3 such
+	 * cycles.
+	 */
+	if (req->scan_period_params.empty_scan_refresh_period > 0) {
+		status = target_if_cm_roam_scan_offload_scan_period(
+						wmi_handle,
+						&req->scan_period_params);
+		if (QDF_IS_STATUS_ERROR(status))
+			goto end;
+	}
+
+	/* add other wmi commands */
+end:
+	return status;
 }
 
 /**

+ 303 - 39
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -26,6 +26,93 @@
 #include "wlan_cm_tgt_if_tx_api.h"
 #include "wlan_cm_roam_api.h"
 
+/**
+ * wlan_cm_roam_scan_bmiss_cnt() - set roam beacon miss count
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @params: roam beacon miss count parameters
+ *
+ * This function is used to set roam beacon miss count parameters
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_scan_bmiss_cnt(struct wlan_objmgr_psoc *psoc,
+			    uint8_t vdev_id,
+			    struct wlan_roam_beacon_miss_cnt *params)
+{
+	uint8_t beacon_miss_count;
+
+	params->vdev_id = vdev_id;
+
+	wlan_mlme_get_roam_bmiss_first_bcnt(psoc, &beacon_miss_count);
+	params->roam_bmiss_first_bcnt = beacon_miss_count;
+
+	wlan_mlme_get_roam_bmiss_final_bcnt(psoc, &beacon_miss_count);
+	params->roam_bmiss_final_bcnt = beacon_miss_count;
+}
+
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+/**
+ * wlan_cm_roam_reason_vsie() - set roam reason vsie
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @params: roam reason vsie parameters
+ *
+ * This function is used to set roam reason vsie parameters
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc,
+			 uint8_t vdev_id,
+			 struct wlan_roam_reason_vsie_enable *params)
+{
+	uint8_t enable_roam_reason_vsie;
+
+	params->vdev_id = vdev_id;
+
+	wlan_mlme_get_roam_reason_vsie_status(psoc, &enable_roam_reason_vsie);
+	params->enable_roam_reason_vsie = enable_roam_reason_vsie;
+}
+
+/**
+ * wlan_cm_roam_triggers() - set roam triggers
+ * @psoc: psoc pointer
+ * @vdev_id: vdev id
+ * @params: roam triggers parameters
+ *
+ * This function is used to set roam triggers parameters
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
+		      uint8_t vdev_id,
+		      struct wlan_roam_triggers *params)
+{
+	params->vdev_id = vdev_id;
+	params->trigger_bitmap =
+		mlme_get_roam_trigger_bitmap(psoc, vdev_id);
+	wlan_cm_roam_get_vendor_btm_params(psoc, vdev_id,
+					   &params->vendor_btm_param);
+}
+#else
+static void
+wlan_cm_roam_reason_vsie(struct wlan_objmgr_psoc *psoc,
+			 uint8_t vdev_id,
+			 struct wlan_roam_reason_vsie_enable *params)
+{
+}
+
+static void
+wlan_cm_roam_triggers(struct wlan_objmgr_psoc *psoc,
+		      uint8_t vdev_id,
+		      struct wlan_roam_triggers *params)
+{
+}
+#endif
+
 /**
  * cm_roam_init_req() - roam init request handling
  * @psoc: psoc pointer
@@ -34,9 +121,10 @@
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
-				   uint8_t vdev_id,
-				   bool enable)
+static QDF_STATUS
+cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
+		 uint8_t vdev_id,
+		 bool enable)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -49,9 +137,10 @@ static QDF_STATUS cm_roam_init_req(struct wlan_objmgr_psoc *psoc,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
-				    uint8_t vdev_id,
-				    uint8_t reason)
+static QDF_STATUS
+cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
+		  uint8_t vdev_id,
+		  uint8_t reason)
 {
 	struct wlan_roam_start_config *start_req;
 	QDF_STATUS status;
@@ -60,6 +149,12 @@ static QDF_STATUS cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
 	if (!start_req)
 		return QDF_STATUS_E_NOMEM;
 
+	/* fill from mlme directly */
+	wlan_cm_roam_scan_bmiss_cnt(psoc, vdev_id,
+				    &start_req->beacon_miss_cnt);
+	wlan_cm_roam_reason_vsie(psoc, vdev_id, &start_req->reason_vsie_enable);
+	wlan_cm_roam_triggers(psoc, vdev_id, &start_req->roam_triggers);
+
 	/* fill from legacy through this API */
 	wlan_cm_roam_fill_start_req(psoc, vdev_id, start_req, reason);
 
@@ -80,9 +175,10 @@ static QDF_STATUS cm_roam_start_req(struct wlan_objmgr_psoc *psoc,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
-					    uint8_t vdev_id,
-					    uint8_t reason)
+static QDF_STATUS
+cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
+			  uint8_t vdev_id,
+			  uint8_t reason)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -92,10 +188,11 @@ static QDF_STATUS cm_roam_update_config_req(struct wlan_objmgr_psoc *psoc,
  * 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)
+QDF_STATUS
+cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+		     uint8_t vdev_id,
+		     uint8_t rso_command,
+		     uint8_t reason)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
@@ -127,9 +224,10 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
-				   uint8_t vdev_id,
-				   uint8_t reason)
+static QDF_STATUS
+cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
+		 uint8_t vdev_id,
+		 uint8_t reason)
 {
 	/* do the filling as csr_post_rso_stop */
 	return QDF_STATUS_SUCCESS;
@@ -145,9 +243,10 @@ static QDF_STATUS cm_roam_stop_req(struct wlan_objmgr_psoc *psoc,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
-					     uint8_t vdev_id,
-					     uint8_t reason)
+static QDF_STATUS
+cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
+			   uint8_t vdev_id,
+			   uint8_t reason)
 {
 	enum roam_offload_state cur_state;
 	QDF_STATUS status;
@@ -156,6 +255,8 @@ static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
 	cur_state = mlme_get_roam_state(psoc, vdev_id);
 	switch (cur_state) {
 	case WLAN_ROAM_RSO_ENABLED:
+	case WLAN_ROAMING_IN_PROG:
+	case WLAN_ROAM_SYNCH_IN_PROG:
 		status = cm_roam_stop_req(psoc, vdev_id, reason);
 		if (QDF_IS_STATUS_ERROR(status)) {
 			mlme_err("ROAM: Unable to switch to RSO STOP State");
@@ -188,16 +289,23 @@ static QDF_STATUS cm_roam_switch_to_rso_stop(struct wlan_objmgr_pdev *pdev,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
-					   uint8_t vdev_id,
-					   uint8_t reason)
+static QDF_STATUS
+cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
+			 uint8_t vdev_id,
+			 uint8_t reason)
 {
 	QDF_STATUS status;
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 	enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
 
 	switch (cur_state) {
+	/*
+	 * If RSO stop is not done already, send RSO stop first and
+	 * then post deinit.
+	 */
 	case WLAN_ROAM_RSO_ENABLED:
+	case WLAN_ROAMING_IN_PROG:
+	case WLAN_ROAM_SYNCH_IN_PROG:
 		cm_roam_switch_to_rso_stop(pdev, vdev_id, reason);
 		break;
 	case WLAN_ROAM_RSO_STOPPED:
@@ -236,9 +344,10 @@ static QDF_STATUS cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
-					 uint8_t vdev_id,
-					 uint8_t reason)
+static QDF_STATUS
+cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
+		       uint8_t vdev_id,
+		       uint8_t reason)
 {
 	enum roam_offload_state cur_state;
 	uint8_t temp_vdev_id, roam_enabled_vdev_id;
@@ -287,9 +396,14 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
 		}
 		break;
 
+	case WLAN_ROAM_SYNCH_IN_PROG:
+		mlme_set_roam_state(psoc, vdev_id, WLAN_ROAM_INIT);
+		return QDF_STATUS_SUCCESS;
+
 	case WLAN_ROAM_INIT:
 	case WLAN_ROAM_RSO_STOPPED:
 	case WLAN_ROAM_RSO_ENABLED:
+	case WLAN_ROAMING_IN_PROG:
 	/*
 	 * Already the roaming module is initialized at fw,
 	 * just return from here
@@ -323,7 +437,7 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
 }
 
 /**
- * cm_roam_switch_to_rso_start() - roam state handling for rso started
+ * cm_roam_switch_to_rso_enable() - roam state handling for rso started
  * @pdev: pdev pointer
  * @vdev_id: vdev id
  * @reason: reason for changing roam state for the requested vdev id
@@ -332,11 +446,12 @@ static QDF_STATUS cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
-					      uint8_t vdev_id,
-					      uint8_t reason)
+static QDF_STATUS
+cm_roam_switch_to_rso_enable(struct wlan_objmgr_pdev *pdev,
+			     uint8_t vdev_id,
+			     uint8_t reason)
 {
-	enum roam_offload_state cur_state;
+	enum roam_offload_state cur_state, new_roam_state;
 	QDF_STATUS status;
 	uint8_t control_bitmap;
 	bool sup_disabled_roaming;
@@ -345,6 +460,9 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 
 	wlan_mlme_get_roam_scan_offload_enabled(psoc, &rso_allowed);
+	sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(psoc,
+								    vdev_id);
+	control_bitmap = mlme_get_operations_bitmap(psoc, vdev_id);
 
 	cur_state = mlme_get_roam_state(psoc, vdev_id);
 	switch (cur_state) {
@@ -363,6 +481,40 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
 		 * Send RSO update config if roaming already enabled
 		 */
 		rso_command = ROAM_SCAN_OFFLOAD_UPDATE_CFG;
+		break;
+	case WLAN_ROAMING_IN_PROG:
+		/*
+		 * When roam abort happens, the roam offload
+		 * state machine moves to RSO_ENABLED state.
+		 * But if Supplicant disabled roaming is set in case
+		 * of roam invoke or if roaming was disabled due to
+		 * other reasons like SAP start/connect on other vdev,
+		 * the state should be transitioned to RSO STOPPED.
+		 */
+		if (sup_disabled_roaming || control_bitmap)
+			new_roam_state = WLAN_ROAM_RSO_STOPPED;
+		else
+			new_roam_state = WLAN_ROAM_RSO_ENABLED;
+
+		mlme_set_roam_state(psoc, vdev_id, new_roam_state);
+
+		return QDF_STATUS_SUCCESS;
+	case WLAN_ROAM_SYNCH_IN_PROG:
+		/*
+		 * After roam sych propagation is complete, send
+		 * RSO start command to firmware to update AP profile,
+		 * new PCL.
+		 * If this is roam invoke case and supplicant has already
+		 * disabled firmware roaming, then move to RSO stopped state
+		 * instead of RSO enabled.
+		 */
+		if (sup_disabled_roaming || control_bitmap) {
+			new_roam_state = WLAN_ROAM_RSO_STOPPED;
+			mlme_set_roam_state(psoc, vdev_id, new_roam_state);
+
+			return QDF_STATUS_SUCCESS;
+		}
+
 		break;
 	default:
 		return QDF_STATUS_SUCCESS;
@@ -373,7 +525,6 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	control_bitmap = mlme_get_operations_bitmap(psoc, vdev_id);
 	if (control_bitmap) {
 		mlme_debug("ROAM: RSO Disabled internaly: vdev[%d] bitmap[0x%x]",
 			   vdev_id, control_bitmap);
@@ -391,10 +542,9 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
 	 * If supplicant disabled roaming, driver does not send
 	 * RSO cmd to fw. This causes roam invoke to fail in FW
 	 * since RSO start never happened at least once to
-	 * configure roaming engine in FW.
+	 * configure roaming engine in FW. So send RSO start followed
+	 * by RSO stop if supplicant disabled roaming is true.
 	 */
-	sup_disabled_roaming = mlme_get_supplicant_disabled_roaming(psoc,
-								    vdev_id);
 	if (!sup_disabled_roaming)
 		return QDF_STATUS_SUCCESS;
 
@@ -403,10 +553,118 @@ static QDF_STATUS cm_roam_switch_to_rso_start(struct wlan_objmgr_pdev *pdev,
 				    REASON_SUPPLICANT_DISABLED_ROAMING);
 }
 
-QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
-				uint8_t vdev_id,
-				enum roam_offload_state requested_state,
-				uint8_t reason)
+/**
+ * cm_roam_switch_to_roam_start() - roam state handling for ROAMING_IN_PROG
+ * @pdev: pdev pointer
+ * @vdev_id: vdev id
+ * @reason: reason for changing roam state for the requested vdev id
+ *
+ * This function is used for WLAN_ROAMING_IN_PROG roam state handling
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+cm_roam_switch_to_roam_start(struct wlan_objmgr_pdev *pdev,
+			     uint8_t vdev_id,
+			     uint8_t reason)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+	enum roam_offload_state cur_state =
+				mlme_get_roam_state(psoc, vdev_id);
+	switch (cur_state) {
+	case WLAN_ROAM_RSO_ENABLED:
+		mlme_set_roam_state(psoc, vdev_id, WLAN_ROAMING_IN_PROG);
+		break;
+
+	case WLAN_ROAM_RSO_STOPPED:
+		/*
+		 * When supplicant has disabled roaming, roam invoke triggered
+		 * from supplicant can cause firmware to send roam start
+		 * notification. Allow roam start in this condition.
+		 */
+		if (mlme_get_supplicant_disabled_roaming(psoc, vdev_id) &&
+		    mlme_is_roam_invoke_in_progress(psoc, vdev_id)) {
+			mlme_set_roam_state(psoc, vdev_id,
+					    WLAN_ROAMING_IN_PROG);
+			break;
+		}
+	case WLAN_ROAM_INIT:
+	case WLAN_ROAM_DEINIT:
+	case WLAN_ROAM_SYNCH_IN_PROG:
+	default:
+		mlme_err("ROAM: Roaming start received in invalid state: %d",
+			 cur_state);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+/**
+ * cm_roam_switch_to_roam_sync() - roam state handling for roam sync
+ * @pdev: pdev pointer
+ * @vdev_id: vdev id
+ * @reason: reason for changing roam state for the requested vdev id
+ *
+ * This function is used for WLAN_ROAM_SYNCH_IN_PROG roam state handling
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+cm_roam_switch_to_roam_sync(struct wlan_objmgr_pdev *pdev,
+			    uint8_t vdev_id,
+			    uint8_t reason)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+	struct wlan_objmgr_vdev *vdev;
+	enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
+
+	switch (cur_state) {
+	case WLAN_ROAM_RSO_ENABLED:
+		/*
+		 * Roam synch can come directly without roam start
+		 * after waking up from power save mode or in case of
+		 * deauth roam trigger to stop data path queues
+		 */
+	case WLAN_ROAMING_IN_PROG:
+		vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+							    WLAN_MLME_NB_ID);
+		if (!wlan_vdev_is_up(vdev)) {
+			mlme_err("ROAM: STA not in connected state");
+			return QDF_STATUS_E_FAILURE;
+		}
+
+		mlme_set_roam_state(psoc, vdev_id, WLAN_ROAM_SYNCH_IN_PROG);
+		break;
+	case WLAN_ROAM_RSO_STOPPED:
+		/*
+		 * If roaming is disabled by Supplicant and if this transition
+		 * is due to roaming invoked by the supplicant, then allow
+		 * this state transition
+		 */
+		if (mlme_get_supplicant_disabled_roaming(psoc, vdev_id) &&
+		    mlme_is_roam_invoke_in_progress(psoc, vdev_id)) {
+			mlme_set_roam_state(psoc, vdev_id,
+					    WLAN_ROAM_SYNCH_IN_PROG);
+			break;
+		}
+	case WLAN_ROAM_INIT:
+	case WLAN_ROAM_DEINIT:
+	case WLAN_ROAM_SYNCH_IN_PROG:
+	default:
+		mlme_err("ROAM: Roam synch not allowed in [%d] state",
+			 cur_state);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
+		     uint8_t vdev_id,
+		     enum roam_offload_state requested_state,
+		     uint8_t reason)
 {
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct wlan_objmgr_vdev *vdev;
@@ -433,11 +691,17 @@ QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 		status = cm_roam_switch_to_init(pdev, vdev_id, reason);
 		break;
 	case WLAN_ROAM_RSO_ENABLED:
-		status = cm_roam_switch_to_rso_start(pdev, vdev_id, reason);
+		status = cm_roam_switch_to_rso_enable(pdev, vdev_id, reason);
 		break;
 	case WLAN_ROAM_RSO_STOPPED:
 		status = cm_roam_switch_to_rso_stop(pdev, vdev_id, reason);
 		break;
+	case WLAN_ROAMING_IN_PROG:
+		status = cm_roam_switch_to_roam_start(pdev, vdev_id, reason);
+		break;
+	case WLAN_ROAM_SYNCH_IN_PROG:
+		status = cm_roam_switch_to_roam_sync(pdev, vdev_id, reason);
+		break;
 	default:
 		mlme_debug("ROAM: Invalid roam state %d", requested_state);
 		break;

+ 10 - 8
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.h

@@ -39,10 +39,11 @@
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
-				uint8_t vdev_id,
-				uint8_t rso_command,
-				uint8_t reason);
+QDF_STATUS
+cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
+		     uint8_t vdev_id,
+		     uint8_t rso_command,
+		     uint8_t reason);
 
 /**
  * cm_roam_state_change() - Post roam state change to roam state machine
@@ -55,9 +56,10 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
-				uint8_t vdev_id,
-				enum roam_offload_state requested_state,
-				uint8_t reason);
+QDF_STATUS
+cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
+		     uint8_t vdev_id,
+		     enum roam_offload_state requested_state,
+		     uint8_t reason);
 #endif
 #endif

+ 88 - 31
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_public_srtuct.h

@@ -86,6 +86,37 @@
 #define REASON_ROAM_HANDOFF_DONE                    52
 #define REASON_ROAM_ABORT                           53
 
+/**
+ * struct wlan_cm_roam_vendor_btm_params - vendor config roam control param
+ * @scan_freq_scheme: scan frequency scheme from enum
+ * qca_roam_scan_freq_scheme
+ * @connected_rssi_threshold: RSSI threshold of the current
+ * connected AP
+ * @candidate_rssi_threshold: RSSI threshold of the
+ * candidate AP
+ * @user_roam_reason: Roam triggered reason code, value zero is for enable
+ * and non zero value is disable
+ */
+struct wlan_cm_roam_vendor_btm_params {
+	uint32_t scan_freq_scheme;
+	uint32_t connected_rssi_threshold;
+	uint32_t candidate_rssi_threshold;
+	uint32_t user_roam_reason;
+};
+
+/**
+ * struct wlan_roam_triggers - vendor configured roam triggers
+ * @vdev_id: vdev id
+ * @trigger_bitmap: vendor configured roam trigger bitmap as
+ *		    defined @enum roam_control_trigger_reason
+ * @control_param: roam trigger param
+ */
+struct wlan_roam_triggers {
+	uint32_t vdev_id;
+	uint32_t trigger_bitmap;
+	struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
+};
+
 #ifdef ROAM_OFFLOAD_V1
 #define NOISE_FLOOR_DBM_DEFAULT          (-96)
 #define RSSI_MIN_VALUE                   (-128)
@@ -152,13 +183,70 @@ struct wlan_roam_offload_scan_rssi_params {
 	uint32_t bg_scan_client_bitmap;
 };
 
+/**
+ * struct wlan_roam_beacon_miss_cnt - roam beacon miss count
+ * @vdev_id: vdev id
+ * @roam_bmiss_first_bcnt: First beacon miss count
+ * @roam_bmiss_final_bcnt: Final beacon miss count
+ */
+struct wlan_roam_beacon_miss_cnt {
+	uint32_t vdev_id;
+	uint8_t roam_bmiss_first_bcnt;
+	uint8_t roam_bmiss_final_bcnt;
+};
+
+/**
+ * struct wlan_roam_reason_vsie_enable - roam reason vsie enable parameters
+ * @vdev_id: vdev id
+ * @enable_roam_reason_vsie: enable/disable inclusion of roam Reason
+ * in Re(association) frame
+ */
+struct wlan_roam_reason_vsie_enable {
+	uint32_t vdev_id;
+	uint8_t enable_roam_reason_vsie;
+};
+
+/**
+ * struct wlan_roam_scan_period_params - Roam scan period parameters
+ * @vdev_id: Vdev for which the scan period parameters are sent
+ * @empty_scan_refresh_period: empty scan refresh period
+ * @scan_period: Opportunistic scan runs on a timer for scan_period
+ * @scan_age: Duration after which the scan entries are to be aged out
+ * @roam_scan_inactivity_time: inactivity monitoring time in ms for which the
+ * device is considered to be inactive
+ * @roam_inactive_data_packet_count: Maximum allowed data packets count during
+ * roam_scan_inactivity_time.
+ * @roam_scan_period_after_inactivity: Roam scan period in ms after device is
+ * in inactive state.
+ * @full_scan_period: Full scan period is the idle period in seconds
+ * between two successive full channel roam scans.
+ */
+struct wlan_roam_scan_period_params {
+	uint32_t vdev_id;
+	uint32_t empty_scan_refresh_period;
+	uint32_t scan_period;
+	uint32_t scan_age;
+	uint32_t roam_scan_inactivity_time;
+	uint32_t roam_inactive_data_packet_count;
+	uint32_t roam_scan_period_after_inactivity;
+	uint32_t full_scan_period;
+};
+
 /**
  * struct wlan_roam_start_config - structure containing parameters for
  * roam start config
  * @rssi_params: roam scan rssi threshold parameters
+ * @beacon_miss_cnt: roam beacon miss count parameters
+ * @reason_vsie_enable: roam reason vsie enable parameters
+ * @roam_triggers: roam triggers parameters
+ * @scan_period_params: roam scan period parameters
  */
 struct wlan_roam_start_config {
 	struct wlan_roam_offload_scan_rssi_params rssi_params;
+	struct wlan_roam_beacon_miss_cnt beacon_miss_cnt;
+	struct wlan_roam_reason_vsie_enable reason_vsie_enable;
+	struct wlan_roam_triggers roam_triggers;
+	struct wlan_roam_scan_period_params scan_period_params;
 	/* other wmi cmd structures */
 };
 
@@ -285,37 +373,6 @@ enum roam_scan_freq_scheme {
 	ROAM_SCAN_FREQ_SCHEME_FULL_SCAN = 2,
 };
 
-/**
- * struct wlan_cm_roam_vendor_btm_params - vendor config roam control param
- * @scan_freq_scheme: scan frequency scheme from enum
- * qca_roam_scan_freq_scheme
- * @connected_rssi_threshold: RSSI threshold of the current
- * connected AP
- * @candidate_rssi_threshold: RSSI threshold of the
- * candidate AP
- * @user_roam_reason: Roam triggered reason code, value zero is for enable
- * and non zero value is disable
- */
-struct wlan_cm_roam_vendor_btm_params {
-	uint32_t scan_freq_scheme;
-	uint32_t connected_rssi_threshold;
-	uint32_t candidate_rssi_threshold;
-	uint32_t user_roam_reason;
-};
-
-/**
- * struct wlan_roam_triggers - vendor configured roam triggers
- * @vdev_id: vdev id
- * @trigger_bitmap: vendor configured roam trigger bitmap as
- *		    defined @enum roam_control_trigger_reason
- * @control_param: roam trigger param
- */
-struct wlan_roam_triggers {
-	uint32_t vdev_id;
-	uint32_t trigger_bitmap;
-	struct wlan_cm_roam_vendor_btm_params vendor_btm_param;
-};
-
 /**
  * struct wlan_cm_roam  - Connection manager roam configs, state and roam
  * data related structure

+ 24 - 12
components/wmi/inc/wmi_unified_roam_api.h

@@ -73,6 +73,18 @@ wmi_unified_set_rssi_monitoring_cmd(wmi_unified_t wmi_handle,
 QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 		wmi_unified_t wmi_handle,
 		struct wlan_roam_offload_scan_rssi_params *roam_req);
+
+/**
+ * wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
+ * @wmi_handle: wmi handle
+ * @param: pointer to roam scan period params to be sent to fw
+ *
+ * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
+	wmi_unified_t wmi_handle, struct wlan_roam_scan_period_params *param);
 #else
 /**
  * wmi_unified_roam_scan_offload_rssi_thresh_cmd() - set roam scan rssi
@@ -88,6 +100,18 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 		wmi_unified_t wmi_handle,
 		struct roam_offload_scan_rssi_params *roam_req);
+
+/**
+ * wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
+ * @wmi_handle: wmi handle
+ * @param: pointer to roam scan period params to be sent to fw
+ *
+ * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
+ *
+ * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
+	wmi_unified_t wmi_handle, struct roam_scan_period_params *param);
 #endif
 
 /**
@@ -289,18 +313,6 @@ QDF_STATUS wmi_unified_roam_scan_offload_cmd(wmi_unified_t wmi_handle,
 					     uint32_t command,
 					     uint32_t vdev_id);
 
-/**
- * wmi_unified_roam_scan_offload_scan_period() - set roam offload scan period
- * @wmi_handle: wmi handle
- * @param: pointer to roam scan period params to be sent to fw
- *
- * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
- *
- * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
- */
-QDF_STATUS wmi_unified_roam_scan_offload_scan_period(
-	wmi_unified_t wmi_handle, struct roam_scan_period_params *param);
-
 /**
  * wmi_unified_roam_scan_offload_chan_list_cmd() - set roam offload channel list
  * @wmi_handle: wmi handle

+ 1 - 1
components/wmi/inc/wmi_unified_roam_param.h

@@ -127,7 +127,6 @@ struct roam_offload_scan_rssi_params {
 	uint32_t bg_scan_client_bitmap;
 	uint32_t flags;
 };
-#endif
 
 /**
  * struct roam_scan_period_params - Roam scan period parameters
@@ -152,6 +151,7 @@ struct roam_scan_period_params {
 	uint32_t roam_scan_period_after_inactivity;
 	uint32_t full_scan_period;
 };
+#endif
 
 /**
  * struct wmi_mawc_roam_params - Motion Aided wireless connectivity params

+ 23 - 11
components/wmi/src/wmi_unified_roam_api.c

@@ -57,6 +57,18 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 
 	return QDF_STATUS_E_FAILURE;
 }
+
+QDF_STATUS
+wmi_unified_roam_scan_offload_scan_period(
+				wmi_unified_t wmi_handle,
+				struct wlan_roam_scan_period_params *param)
+{
+	if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
+		return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
+							wmi_handle, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
 #else
 QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 		wmi_unified_t wmi_handle,
@@ -68,6 +80,17 @@ QDF_STATUS wmi_unified_roam_scan_offload_rssi_thresh_cmd(
 
 	return QDF_STATUS_E_FAILURE;
 }
+
+QDF_STATUS
+wmi_unified_roam_scan_offload_scan_period(wmi_unified_t wmi_handle,
+					  struct roam_scan_period_params *param)
+{
+	if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
+		return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
+							wmi_handle, param);
+
+	return QDF_STATUS_E_FAILURE;
+}
 #endif
 
 QDF_STATUS wmi_unified_roam_mawc_params_cmd(
@@ -221,17 +244,6 @@ QDF_STATUS wmi_unified_roam_scan_offload_cmd(wmi_unified_t wmi_handle,
 	return QDF_STATUS_E_FAILURE;
 }
 
-QDF_STATUS
-wmi_unified_roam_scan_offload_scan_period(wmi_unified_t wmi_handle,
-					  struct roam_scan_period_params *param)
-{
-	if (wmi_handle->ops->send_roam_scan_offload_scan_period_cmd)
-		return wmi_handle->ops->send_roam_scan_offload_scan_period_cmd(
-							wmi_handle, param);
-
-	return QDF_STATUS_E_FAILURE;
-}
-
 QDF_STATUS
 wmi_unified_roam_scan_offload_chan_list_cmd(wmi_unified_t wmi_handle,
 					    uint8_t chan_count,

+ 138 - 69
components/wmi/src/wmi_unified_roam_tlv.c

@@ -300,6 +300,75 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 
 	return status;
 }
+
+/**
+ * send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
+ * @wmi_handle: wmi handle
+ * @param: roam scan parameters to be sent to firmware
+ *
+ * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+send_roam_scan_offload_scan_period_cmd_tlv(
+		wmi_unified_t wmi_handle,
+		struct wlan_roam_scan_period_params *param)
+{
+	QDF_STATUS status;
+	wmi_buf_t buf = NULL;
+	int len;
+	uint8_t *buf_ptr;
+	wmi_roam_scan_period_fixed_param *scan_period_fp;
+
+	/* Send scan period values */
+	len = sizeof(wmi_roam_scan_period_fixed_param);
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	buf_ptr = (uint8_t *)wmi_buf_data(buf);
+	scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
+	WMITLV_SET_HDR(&scan_period_fp->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+			       (wmi_roam_scan_period_fixed_param));
+	/* fill in scan period values */
+	scan_period_fp->vdev_id = param->vdev_id;
+	scan_period_fp->roam_scan_period = param->scan_period;
+	scan_period_fp->roam_scan_age = param->scan_age;
+	scan_period_fp->inactivity_time_period =
+			param->roam_scan_inactivity_time;
+	scan_period_fp->roam_inactive_count =
+			param->roam_inactive_data_packet_count;
+	scan_period_fp->roam_scan_period_after_inactivity =
+			param->roam_scan_period_after_inactivity;
+	/* Firmware expects the full scan preriod in msec whereas host
+	 * provides the same in seconds.
+	 * Convert it to msec and send to firmware
+	 */
+	scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
+
+	wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
+		  scan_period_fp->roam_scan_period,
+		  scan_period_fp->roam_scan_age,
+		  scan_period_fp->roam_full_scan_period);
+
+	wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
+		  scan_period_fp->inactivity_time_period,
+		  scan_period_fp->roam_inactive_count,
+		  scan_period_fp->roam_scan_period_after_inactivity);
+
+	wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
+	status = wmi_unified_cmd_send(wmi_handle, buf, len,
+				      WMI_ROAM_SCAN_PERIOD);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		wmi_buf_free(buf);
+		return status;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
 #else
 static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 		wmi_unified_t wmi_handle,
@@ -431,6 +500,75 @@ static QDF_STATUS send_roam_scan_offload_rssi_thresh_cmd_tlv(
 
 	return status;
 }
+
+/**
+ * send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
+ * @wmi_handle: wmi handle
+ * @param: roam scan parameters to be sent to firmware
+ *
+ * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
+ *
+ * Return: QDF status
+ */
+static QDF_STATUS
+send_roam_scan_offload_scan_period_cmd_tlv(
+		wmi_unified_t wmi_handle,
+		struct roam_scan_period_params *param)
+{
+	QDF_STATUS status;
+	wmi_buf_t buf = NULL;
+	int len;
+	uint8_t *buf_ptr;
+	wmi_roam_scan_period_fixed_param *scan_period_fp;
+
+	/* Send scan period values */
+	len = sizeof(wmi_roam_scan_period_fixed_param);
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	buf_ptr = (uint8_t *)wmi_buf_data(buf);
+	scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
+	WMITLV_SET_HDR(&scan_period_fp->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
+		       WMITLV_GET_STRUCT_TLVLEN
+			       (wmi_roam_scan_period_fixed_param));
+	/* fill in scan period values */
+	scan_period_fp->vdev_id = param->vdev_id;
+	scan_period_fp->roam_scan_period = param->scan_period;
+	scan_period_fp->roam_scan_age = param->scan_age;
+	scan_period_fp->inactivity_time_period =
+			param->roam_scan_inactivity_time;
+	scan_period_fp->roam_inactive_count =
+			param->roam_inactive_data_packet_count;
+	scan_period_fp->roam_scan_period_after_inactivity =
+			param->roam_scan_period_after_inactivity;
+	/* Firmware expects the full scan preriod in msec whereas host
+	 * provides the same in seconds.
+	 * Convert it to msec and send to firmware
+	 */
+	scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
+
+	wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
+		  scan_period_fp->roam_scan_period,
+		  scan_period_fp->roam_scan_age,
+		  scan_period_fp->roam_full_scan_period);
+
+	wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
+		  scan_period_fp->inactivity_time_period,
+		  scan_period_fp->roam_inactive_count,
+		  scan_period_fp->roam_scan_period_after_inactivity);
+
+	wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
+	status = wmi_unified_cmd_send(wmi_handle, buf, len,
+				      WMI_ROAM_SCAN_PERIOD);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		wmi_buf_free(buf);
+		return status;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif
 
 static QDF_STATUS send_roam_mawc_params_cmd_tlv(wmi_unified_t wmi_handle,
@@ -2327,75 +2465,6 @@ error:
 	return status;
 }
 
-/**
- * send_roam_scan_offload_scan_period_cmd_tlv() - set roam offload scan period
- * @wmi_handle: wmi handle
- * @param: roam scan parameters to be sent to firmware
- *
- * Send WMI_ROAM_SCAN_PERIOD parameters to fw.
- *
- * Return: QDF status
- */
-static QDF_STATUS
-send_roam_scan_offload_scan_period_cmd_tlv(
-		wmi_unified_t wmi_handle,
-		struct roam_scan_period_params *param)
-{
-	QDF_STATUS status;
-	wmi_buf_t buf = NULL;
-	int len;
-	uint8_t *buf_ptr;
-	wmi_roam_scan_period_fixed_param *scan_period_fp;
-
-	/* Send scan period values */
-	len = sizeof(wmi_roam_scan_period_fixed_param);
-	buf = wmi_buf_alloc(wmi_handle, len);
-	if (!buf)
-		return QDF_STATUS_E_NOMEM;
-
-	buf_ptr = (uint8_t *)wmi_buf_data(buf);
-	scan_period_fp = (wmi_roam_scan_period_fixed_param *)buf_ptr;
-	WMITLV_SET_HDR(&scan_period_fp->tlv_header,
-		       WMITLV_TAG_STRUC_wmi_roam_scan_period_fixed_param,
-		       WMITLV_GET_STRUCT_TLVLEN
-			       (wmi_roam_scan_period_fixed_param));
-	/* fill in scan period values */
-	scan_period_fp->vdev_id = param->vdev_id;
-	scan_period_fp->roam_scan_period = param->scan_period;
-	scan_period_fp->roam_scan_age = param->scan_age;
-	scan_period_fp->inactivity_time_period =
-			param->roam_scan_inactivity_time;
-	scan_period_fp->roam_inactive_count =
-			param->roam_inactive_data_packet_count;
-	scan_period_fp->roam_scan_period_after_inactivity =
-			param->roam_scan_period_after_inactivity;
-	/* Firmware expects the full scan preriod in msec whereas host
-	 * provides the same in seconds.
-	 * Convert it to msec and send to firmware
-	 */
-	scan_period_fp->roam_full_scan_period = param->full_scan_period * 1000;
-
-	wmi_debug("roam_scan_period=%d, roam_scan_age=%d, full_scan_period= %u",
-		  scan_period_fp->roam_scan_period,
-		  scan_period_fp->roam_scan_age,
-		  scan_period_fp->roam_full_scan_period);
-
-	wmi_debug("inactiviy time:%d inactive cnt:%d time after inactivity:%d",
-		  scan_period_fp->inactivity_time_period,
-		  scan_period_fp->roam_inactive_count,
-		  scan_period_fp->roam_scan_period_after_inactivity);
-
-	wmi_mtrace(WMI_ROAM_SCAN_PERIOD, NO_SESSION, 0);
-	status = wmi_unified_cmd_send(wmi_handle, buf, len,
-				      WMI_ROAM_SCAN_PERIOD);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		wmi_buf_free(buf);
-		return status;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
 /**
  * send_roam_scan_offload_chan_list_cmd_tlv() - set roam offload channel list
  * @wmi_handle: wmi handle

+ 46 - 5
core/sme/src/csr/csr_api_roam.c

@@ -19184,10 +19184,11 @@ csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
 
 #ifdef ROAM_OFFLOAD_V1
 #if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
-QDF_STATUS wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
-				    uint8_t vdev_id,
-				    uint8_t command,
-				    uint8_t reason)
+QDF_STATUS
+wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
+			 uint8_t vdev_id,
+			 uint8_t command,
+			 uint8_t reason)
 {
 	uint8_t *state = NULL;
 	struct csr_roam_session *session;
@@ -19343,7 +19344,8 @@ QDF_STATUS wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
  *
  * Return: None
  */
-static void wlan_cm_roam_scan_offload_rssi_thresh(
+static void
+wlan_cm_roam_scan_offload_rssi_thresh(
 			struct mac_context *mac_ctx,
 			struct csr_roam_session *session,
 			struct wlan_roam_offload_scan_rssi_params *params)
@@ -19426,6 +19428,41 @@ static void wlan_cm_roam_scan_offload_rssi_thresh(
 		roam_info->cfgParams.rssi_thresh_offset_5g;
 }
 
+/**
+ * wlan_cm_roam_scan_offload_scan_period() - set roam offload scan period
+ * parameters
+ * @mac_ctx: global mac ctx
+ * @session: csr roam session
+ * @params:  roam offload scan period related parameters
+ *
+ * This function is used to set roam offload scan period related parameters
+ *
+ * Return: None
+ */
+static void
+wlan_cm_roam_scan_offload_scan_period(
+				struct mac_context *mac_ctx,
+				struct csr_roam_session *session,
+				struct wlan_roam_scan_period_params *params)
+{
+	tpCsrNeighborRoamControlInfo roam_info =
+			&mac_ctx->roam.neighborRoamInfo[session->vdev_id];
+
+	params->vdev_id = session->vdev_id;
+	params->empty_scan_refresh_period =
+				roam_info->cfgParams.emptyScanRefreshPeriod;
+	params->scan_period = params->empty_scan_refresh_period;
+	params->scan_age = (3 * params->empty_scan_refresh_period);
+	params->roam_scan_inactivity_time =
+				roam_info->cfgParams.roam_scan_inactivity_time;
+	params->roam_inactive_data_packet_count =
+			roam_info->cfgParams.roam_inactive_data_packet_count;
+	params->roam_scan_period_after_inactivity =
+			roam_info->cfgParams.roam_scan_period_after_inactivity;
+	params->full_scan_period =
+			roam_info->cfgParams.full_roam_scan_period;
+}
+
 QDF_STATUS
 wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
 			    uint8_t vdev_id,
@@ -19453,6 +19490,10 @@ wlan_cm_roam_fill_start_req(struct wlan_objmgr_psoc *psoc,
 					      session,
 					      &req->rssi_params);
 
+	wlan_cm_roam_scan_offload_scan_period(mac_ctx,
+					      session,
+					      &req->scan_period_params);
+
 	/* fill other struct similar to wlan_roam_offload_scan_rssi_params */
 
 	return status;

+ 15 - 9
core/wma/src/wma_scan_roam.c

@@ -698,14 +698,6 @@ wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
 		  roam_params->roam_bad_rssi_thresh_offset_2g);
 	return status;
 }
-#else
-QDF_STATUS
-wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
-				  struct roam_offload_scan_req *roam_req)
-{
-	return QDF_STATUS_E_NOSUPPORT;
-}
-#endif
 
 /**
  * wma_roam_scan_offload_scan_period() - set roam offload scan period
@@ -743,7 +735,21 @@ wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
 	return wmi_unified_roam_scan_offload_scan_period(wma_handle->wmi_handle,
 							 &scan_period_params);
 }
+#else
+QDF_STATUS
+wma_roam_scan_offload_rssi_thresh(tp_wma_handle wma_handle,
+				  struct roam_offload_scan_req *roam_req)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
 
+QDF_STATUS
+wma_roam_scan_offload_scan_period(tp_wma_handle wma_handle,
+				  struct roam_offload_scan_req *roam_req)
+{
+	return QDF_STATUS_E_NOSUPPORT;
+}
+#endif
 /**
  * wma_roam_scan_offload_rssi_change() - set roam offload RSSI change threshold
  * @wma_handle: wma handle
@@ -1863,7 +1869,7 @@ wma_send_idle_roam_params(tp_wma_handle wma_handle,
  *
  * Return: Void
  */
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
+#if defined(WLAN_FEATURE_ROAM_OFFLOAD) && !defined(ROAM_OFFLOAD_V1)
 static void wma_set_vdev_roam_reason_vsie(tp_wma_handle wma, uint8_t vdev_id,
 					  bool is_roam_reason_vsie_enabled)
 {