Kaynağa Gözat

qcacld-3.0: Add logic to send RSO start/stop from conenction manager

Add logic to send RSO start and stop from conenction manager.

Change-Id: I6a592e977641d47345233732ed54d356e0ea6a28
CRs-Fixed: 2860870
gaurank kathpalia 4 yıl önce
ebeveyn
işleme
bb393cba13

+ 345 - 1
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -33,6 +33,21 @@
 #include "wlan_blm_api.h"
 #include "wlan_scan_api.h"
 #include "wlan_vdev_mgr_ucfg_api.h"
+#include "wlan_p2p_cfg_api.h"
+#include "wlan_cm_vdev_api.h"
+#include "cfg_nan_api.h"
+
+#ifdef WLAN_FEATURE_SAE
+#define CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap) \
+	(((fw_akm_bitmap) & (1 << AKM_FT_SAE)) ? true : false)
+
+#define CM_IS_FW_SAE_ROAM_SUPPORTED(fw_akm_bitmap) \
+	(((fw_akm_bitmap) & (1 << AKM_SAE)) ? true : false)
+#else
+#define CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap) (false)
+
+#define CM_IS_FW_SAE_ROAM_SUPPORTED(fw_akm_bitmap) (false)
+#endif
 
 /**
  * cm_roam_scan_bmiss_cnt() - set roam beacon miss count
@@ -2572,6 +2587,185 @@ cm_roam_offload_per_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
 	return status;
 }
 
+#ifdef FEATURE_CM_ENABLE
+#ifdef WLAN_ADAPTIVE_11R
+static bool
+cm_is_adaptive_11r_roam_supported(struct wlan_mlme_psoc_ext_obj *mlme_obj,
+				  struct rso_config *rso_cfg)
+{
+	if (rso_cfg->is_adaptive_11r_connection)
+		return mlme_obj->cfg.lfr.tgt_adaptive_11r_cap;
+
+	return true;
+}
+#else
+static bool
+cm_is_adaptive_11r_roam_supported(struct wlan_mlme_psoc_ext_obj *mlme_obj,
+				  struct rso_config *rso_cfg)
+
+{
+	return true;
+}
+#endif
+
+static QDF_STATUS
+cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc,
+		    struct wlan_objmgr_vdev *vdev,
+		    uint8_t command, uint8_t reason)
+{
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+	int32_t akm;
+	struct rso_config *rso_cfg;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+	uint32_t fw_akm_bitmap;
+	bool p2p_disable_sta_roaming = 0, nan_disable_sta_roaming = 0;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_FAILURE;
+
+	rso_cfg = wlan_cm_get_rso_config(vdev);
+	if (!rso_cfg)
+		return QDF_STATUS_E_FAILURE;
+
+	akm = wlan_crypto_get_param(vdev,
+				    WLAN_CRYPTO_PARAM_KEY_MGMT);
+
+	mlme_debug("RSO Command %d, vdev %d, Reason %d AKM %x",
+		   command, vdev_id, reason, akm);
+
+	if (!cm_is_vdev_connected(vdev) &&
+	    (command == ROAM_SCAN_OFFLOAD_UPDATE_CFG ||
+	     command == ROAM_SCAN_OFFLOAD_START ||
+	     command == ROAM_SCAN_OFFLOAD_RESTART)) {
+		mlme_debug("vdev not in connected state and command %d ",
+			   command);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if ((QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FILS_SHA384) ||
+	     QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FILS_SHA256)) &&
+	    !mlme_obj->cfg.lfr.rso_user_config.is_fils_roaming_supported) {
+		mlme_info("FILS Roaming not suppprted by fw, akm %x", akm);
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	if (!cm_is_adaptive_11r_roam_supported(mlme_obj, rso_cfg)) {
+		mlme_info("Adaptive 11r Roaming not suppprted by fw");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	fw_akm_bitmap = mlme_obj->cfg.lfr.fw_akm_bitmap;
+	/* Roaming is not supported currently for OWE akm */
+	if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_OWE) &&
+	    !(fw_akm_bitmap & (1 << AKM_OWE))) {
+		mlme_info("OWE Roaming not suppprted by fw");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	/* Roaming is not supported for SAE authentication */
+	if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_SAE) &&
+	    !CM_IS_FW_SAE_ROAM_SUPPORTED(fw_akm_bitmap)) {
+		mlme_info("Roaming not suppprted for SAE connection");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	if ((QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B) ||
+	     QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_IEEE8021X_SUITE_B_192)) &&
+	     !(fw_akm_bitmap & (1 << AKM_SUITEB))) {
+		mlme_info("Roaming not supported for SUITEB connection");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	/*
+	 * If fw doesn't advertise FT SAE, FT-FILS or FT-Suite-B capability,
+	 * don't support roaming to that profile
+	 */
+	if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_SAE) &&
+	    !CM_IS_FW_FT_SAE_SUPPORTED(fw_akm_bitmap)) {
+		mlme_info("Roaming not suppprted for FT SAE akm");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	if (QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X_SHA384) &&
+	    !(fw_akm_bitmap & (1 << AKM_FT_SUITEB_SHA384))) {
+		mlme_info("Roaming not suppprted for FT Suite-B akm");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	if ((QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384) ||
+	    QDF_HAS_PARAM(akm, WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256)) &&
+	    !(fw_akm_bitmap & (1 << AKM_FT_FILS))) {
+		mlme_info("Roaming not suppprted for FT FILS akm");
+		return QDF_STATUS_E_NOSUPPORT;
+	}
+
+	p2p_disable_sta_roaming =
+		(cfg_p2p_is_roam_config_disabled(psoc) &&
+		(policy_mgr_mode_specific_connection_count(
+					psoc, PM_P2P_CLIENT_MODE, NULL) ||
+		policy_mgr_mode_specific_connection_count(
+					psoc, PM_P2P_GO_MODE, NULL)));
+	nan_disable_sta_roaming =
+	    (cfg_nan_is_roam_config_disabled(psoc) &&
+	    policy_mgr_mode_specific_connection_count(psoc, PM_NDI_MODE, NULL));
+
+	if ((command == ROAM_SCAN_OFFLOAD_START ||
+	     command == ROAM_SCAN_OFFLOAD_UPDATE_CFG) &&
+	     (p2p_disable_sta_roaming || nan_disable_sta_roaming)) {
+		mlme_info("roaming not supported for active %s connection",
+			 p2p_disable_sta_roaming ? "p2p" : "ndi");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	/*
+	 * The Dynamic Config Items Update may happen even if the state is in
+	 * INIT. It is important to ensure that the command is passed down to
+	 * the FW only if the Infra Station is in a connected state. A connected
+	 * station could also be in a PREAUTH or REASSOC states.
+	 * 1) Block all CMDs that are not STOP in INIT State. For STOP always
+	 *    inform firmware irrespective of state.
+	 * 2) Block update cfg CMD if its for REASON_ROAM_SET_BLACKLIST_BSSID,
+	 *    because we need to inform firmware of blacklisted AP for PNO in
+	 *    all states.
+	 */
+	if ((cm_is_vdev_disconnecting(vdev) ||
+	     cm_is_vdev_disconnected(vdev)) &&
+	    (command != ROAM_SCAN_OFFLOAD_STOP) &&
+	    (reason != REASON_ROAM_SET_BLACKLIST_BSSID)) {
+		mlme_info("Scan Command not sent to FW and cmd=%d", command);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static QDF_STATUS cm_is_rso_allowed(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id, uint8_t command,
+				    uint8_t reason)
+{
+	struct wlan_objmgr_vdev *vdev;
+	QDF_STATUS status;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev_id: %d: vdev not found", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+	status = cm_roam_cmd_allowed(psoc, vdev, command, reason);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+
+	return status;
+}
+#else
+static QDF_STATUS cm_is_rso_allowed(struct wlan_objmgr_psoc *psoc,
+				    uint8_t vdev_id, uint8_t command,
+				    uint8_t reason)
+{
+	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
@@ -2583,7 +2777,7 @@ QDF_STATUS cm_roam_send_rso_cmd(struct wlan_objmgr_psoc *psoc,
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
-	status = wlan_cm_roam_cmd_allowed(psoc, vdev_id, rso_command, reason);
+	status = cm_is_rso_allowed(psoc, vdev_id, rso_command, reason);
 
 	if (status == QDF_STATUS_E_NOSUPPORT)
 		return QDF_STATUS_SUCCESS;
@@ -3148,3 +3342,153 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 
 	return status;
 }
+
+#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,
+					struct wlan_objmgr_pdev *pdev,
+					struct wlan_objmgr_vdev *vdev)
+{
+	struct mlme_pmk_info *pmk_info;
+	struct cm_roam_values_copy src_cfg;
+	struct qdf_mac_addr bssid;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+
+	wlan_cm_roam_cfg_get_value(psoc, vdev_id,
+				   IS_SINGLE_PMK, &src_cfg);
+	if (!src_cfg.bool_value)
+		return;
+	/*
+	 * Mark the AP as single PMK capable in Crypto Table
+	 */
+	wlan_vdev_get_bss_peer_mac(vdev, &bssid);
+	wlan_crypto_set_sae_single_pmk_bss_cap(vdev, &bssid, true);
+
+	pmk_info = qdf_mem_malloc(sizeof(*pmk_info));
+	if (!pmk_info)
+		return;
+
+	wlan_cm_get_psk_pmk(pdev, vdev_id, pmk_info->pmk, &pmk_info->pmk_len);
+
+	wlan_mlme_update_sae_single_pmk(vdev, pmk_info);
+
+	qdf_mem_zero(pmk_info, sizeof(*pmk_info));
+	qdf_mem_free(pmk_info);
+}
+#endif
+
+#ifdef FEATURE_CM_ENABLE
+
+static bool cm_is_auth_type_11r(struct wlan_mlme_psoc_ext_obj *mlme_obj,
+				struct wlan_objmgr_vdev *vdev,
+				bool mdie_present)
+{
+	int32_t akm, ucast_cipher;
+
+	akm = wlan_crypto_get_param(vdev,
+				    WLAN_CRYPTO_PARAM_KEY_MGMT);
+	ucast_cipher = wlan_crypto_get_param(vdev,
+					     WLAN_CRYPTO_PARAM_UCAST_CIPHER);
+
+	if (!ucast_cipher ||
+	    ((QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_NONE) ==
+	      ucast_cipher))) {
+		if (mdie_present && mlme_obj->cfg.lfr.enable_ftopen)
+			return true;
+	} else if (QDF_HAS_PARAM(ucast_cipher,
+				 WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA384) ||
+		   QDF_HAS_PARAM(ucast_cipher,
+				 WLAN_CRYPTO_KEY_MGMT_FT_FILS_SHA256) ||
+		   QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_KEY_MGMT_FT_SAE) ||
+		   QDF_HAS_PARAM(ucast_cipher,
+				 WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X) ||
+		   QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_KEY_MGMT_FT_PSK) ||
+		   QDF_HAS_PARAM(ucast_cipher,
+				 WLAN_CRYPTO_KEY_MGMT_FT_IEEE8021X_SHA384)) {
+		return true;
+	}
+
+	return false;
+}
+
+static void cm_roam_start_init(struct wlan_objmgr_psoc *psoc,
+			       struct wlan_objmgr_pdev *pdev,
+			       struct wlan_objmgr_vdev *vdev)
+{
+	struct cm_roam_values_copy src_cfg;
+	bool mdie_present;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+	enum QDF_OPMODE opmode;
+
+	opmode = wlan_vdev_mlme_get_opmode(vdev);
+	if (opmode != QDF_STA_MODE) {
+		sme_debug("Wrong opmode %d", opmode);
+		return;
+	}
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return;
+
+	wlan_cm_init_occupied_ch_freq_list(pdev, psoc, vdev_id);
+
+	/*
+	 * Update RSSI change params to vdev
+	 */
+	src_cfg.uint_value = mlme_obj->cfg.lfr.roam_rescan_rssi_diff;
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
+				   RSSI_CHANGE_THRESHOLD, &src_cfg);
+
+	src_cfg.uint_value = mlme_obj->cfg.lfr.roam_scan_hi_rssi_delay;
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
+				   HI_RSSI_DELAY_BTW_SCANS, &src_cfg);
+
+	wlan_cm_update_roam_scan_scheme_bitmap(psoc, vdev_id,
+					       DEFAULT_ROAM_SCAN_SCHEME_BITMAP);
+	wlan_cm_roam_cfg_get_value(psoc, vdev_id,
+				   MOBILITY_DOMAIN, &src_cfg);
+	mdie_present = src_cfg.bool_value;
+	/* Based on the auth scheme tell if we are 11r */
+	if (cm_is_auth_type_11r(mlme_obj, vdev, mdie_present)) {
+		src_cfg.bool_value = true;
+	} else {
+		src_cfg.bool_value = false;
+	}
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
+				   IS_11R_CONNECTION, &src_cfg);
+
+	if (!mlme_obj->cfg.lfr.roam_scan_offload_enabled)
+		return;
+	/*
+	 * Store the current PMK info of the AP
+	 * to the single pmk global cache if the BSS allows
+	 * single pmk roaming capable.
+	 */
+	cm_store_sae_single_pmk_to_global_cache(psoc, pdev, vdev);
+
+	if (!MLME_IS_ROAM_SYNCH_IN_PROGRESS(psoc, vdev_id))
+		wlan_cm_roam_state_change(pdev, vdev_id,
+					  WLAN_ROAM_RSO_ENABLED,
+					  REASON_CTX_INIT);
+}
+
+void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc)
+		return;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+						    WLAN_MLME_CM_ID);
+	if (!vdev) {
+		mlme_err("vdev_id: %d: vdev not found", vdev_id);
+		return;
+	}
+	cm_roam_start_init(psoc, pdev, vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);
+}
+#endif

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

@@ -121,4 +121,5 @@ void cm_dump_freq_list(struct rso_chan_info *chan_info);
 QDF_STATUS
 cm_roam_send_disable_config(struct wlan_objmgr_psoc *psoc,
 			    uint8_t vdev_id, uint8_t cfg);
+
 #endif /* _WLAN_CM_ROAM_OFFLOAD_H_ */

+ 3 - 3
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -262,6 +262,9 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (op_mode == QDF_STA_MODE)
+		wlan_cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_INIT,
+					  REASON_CONNECT);
 	cm_csr_connect_done_ind(vdev, rsp);
 
 	if (QDF_IS_STATUS_SUCCESS(rsp->connect_status))
@@ -270,9 +273,6 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 				     mlme_get_tdls_chan_switch_prohibited(vdev),
 				     mlme_get_tdls_prohibited(vdev), vdev);
 	wlan_p2p_status_connect(vdev);
-	if (op_mode == QDF_STA_MODE)
-		wlan_cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_INIT,
-					  REASON_CONNECT);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 5 - 4
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -50,11 +50,13 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev,
 
 	cm_csr_disconnect_start_ind(vdev, req);
 
-	user_disconnect = req->source == CM_OSIF_CONNECT ? true : false;
+	user_disconnect = req->source == CM_OSIF_DISCONNECT ? true : false;
 	wlan_p2p_cleanup_roc_by_vdev(vdev);
 	wlan_tdls_notify_sta_disconnect(req->vdev_id, false, user_disconnect,
 					vdev);
-	wlan_cm_abort_rso(pdev, req->vdev_id);
+	if (user_disconnect)
+		cm_roam_state_change(pdev, req->vdev_id, WLAN_ROAM_RSO_STOPPED,
+				     REASON_DRIVER_DISABLED);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -90,13 +92,12 @@ cm_handle_disconnect_req(struct wlan_objmgr_vdev *vdev,
 	if (!discon_req)
 		return QDF_STATUS_E_NOMEM;
 
+	cm_csr_handle_diconnect_req(vdev, req);
 	opmode = wlan_vdev_mlme_get_opmode(vdev);
 	if (opmode == QDF_STA_MODE)
 		wlan_cm_roam_state_change(pdev, vdev_id,
 					  WLAN_ROAM_DEINIT,
 					  REASON_DISCONNECTED);
-
-	cm_csr_handle_diconnect_req(vdev, req);
 	if (rso_cfg->roam_scan_freq_lst.freq_list)
 		qdf_mem_free(rso_cfg->roam_scan_freq_lst.freq_list);
 	rso_cfg->roam_scan_freq_lst.freq_list = NULL;

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

@@ -44,6 +44,7 @@ QDF_STATUS
 wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
 					uint8_t vdev_id);
 
+#ifndef FEATURE_CM_ENABLE
 /**
  * wlan_cm_roam_cmd_allowed() - check roam cmd is allowed or not
  * @psoc: pointer to psoc object
@@ -58,6 +59,7 @@ wlan_cm_enable_roaming_on_connected_sta(struct wlan_objmgr_pdev *pdev,
 QDF_STATUS
 wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			 uint8_t rso_command, uint8_t reason);
+#endif
 
 /**
  * wlan_cm_roam_fill_start_req() - fill start request structure content
@@ -540,6 +542,31 @@ struct wlan_fils_connection_info *wlan_cm_get_fils_connection_info(
 }
 #endif
 
+#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,
+					struct wlan_objmgr_pdev *pdev,
+					struct wlan_objmgr_vdev *vdev);
+#else
+static inline void
+cm_store_sae_single_pmk_to_global_cache(struct wlan_objmgr_psoc *psoc,
+					struct wlan_objmgr_pdev *pdev,
+					struct wlan_objmgr_vdev *vdev)
+{}
+#endif
+
+#ifdef FEATURE_CM_ENABLE
+/**
+ * cm_roam_start_init_on_connect() - init roaming
+ * @pdev: pdev pointer
+ * @vdev_id: vdev_id
+ *
+ * Return: void
+ */
+void cm_roam_start_init_on_connect(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id);
+#endif
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**
  * wlan_cm_roam_extract_btm_response() - Extract BTM rsp stats

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

@@ -202,6 +202,7 @@ struct wlan_chan_list {
  * @is_adaptive_11r_connection: is adaptive 11r connection
  * @hs_20_ap: Hotspot 2.0 AP
  * @mbo_oce_enabled_ap: MBO/OCE enabled network
+ * @is_single_pmk: is single pmk
  * @roam_scan_freq_lst: roam freq list
  */
 struct rso_config {
@@ -228,6 +229,7 @@ struct rso_config {
 	bool is_11r_assoc;
 	bool is_adaptive_11r_connection;
 	bool hs_20_ap;
+	bool is_single_pmk;
 	uint32_t mbo_oce_enabled_ap;
 	struct rso_chan_info roam_scan_freq_lst;
 };
@@ -280,6 +282,7 @@ struct rso_roam_policy_params {
  * @raise_factor_5g: Boost factor
  * @drop_factor_5g: Penalty factor
  * @max_raise_rssi_5g: Maximum amount of Boost that can added
+ * @is_fils_roaming_supported: fils roaming supported
  * @policy_params: roam policy params
  */
 struct rso_config_params {
@@ -297,6 +300,7 @@ struct rso_config_params {
 	uint8_t drop_factor_5g;
 	int max_raise_rssi_5g;
 	uint8_t cat_rssi_offset;
+	bool is_fils_roaming_supported;
 	struct rso_roam_policy_params policy_params;
 };
 
@@ -353,6 +357,7 @@ enum roam_cfg_param {
 	ADAPTIVE_11R_CONNECTION,
 	HS_20_AP,
 	MBO_OCE_ENABLED_AP,
+	IS_SINGLE_PMK,
 };
 
 /**

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

@@ -567,6 +567,7 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
 	struct rso_cfg_params *src_cfg;
 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
 
+	qdf_mem_zero(dst_config, sizeof(*dst_config));
 	mlme_obj = mlme_get_psoc_ext_obj(psoc);
 	if (!mlme_obj)
 		return QDF_STATUS_E_FAILURE;
@@ -647,6 +648,9 @@ QDF_STATUS wlan_cm_roam_cfg_get_value(struct wlan_objmgr_psoc *psoc,
 	case MBO_OCE_ENABLED_AP:
 		dst_config->uint_value = rso_cfg->mbo_oce_enabled_ap;
 		break;
+	case IS_SINGLE_PMK:
+		dst_config->bool_value = rso_cfg->is_single_pmk;
+		break;
 	default:
 		mlme_err("Invalid roam config requested:%d", roam_cfg_type);
 		status = QDF_STATUS_E_FAILURE;
@@ -1014,6 +1018,9 @@ wlan_cm_roam_cfg_set_value(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	case MBO_OCE_ENABLED_AP:
 		rso_cfg->mbo_oce_enabled_ap  = src_config->uint_value;
 		break;
+	case IS_SINGLE_PMK:
+		rso_cfg->is_single_pmk = src_config->bool_value;
+		break;
 	default:
 		mlme_err("Invalid roam config requested:%d", roam_cfg_type);
 		status = QDF_STATUS_E_FAILURE;

+ 1 - 2
core/mac/inc/ani_global.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -760,7 +760,6 @@ struct mac_context {
 	tRrmContext rrm;
 	uint8_t beacon_offload;
 	bool pmf_offload;
-	bool is_fils_roaming_supported;
 	uint32_t f_sta_miracast_mcc_rest_time_val;
 #ifdef WLAN_FEATURE_EXTWOW_SUPPORT
 	csr_readyToExtWoWCallback readyToExtWoWCallback;

+ 2 - 0
core/sme/inc/csr_api.h

@@ -1149,6 +1149,7 @@ typedef QDF_STATUS (*csr_session_close_cb)(uint8_t session_id);
 #define CSR_IS_CONN_NDI(profile)  (false)
 #endif
 
+#ifndef FEATURE_CM_ENABLE
 #ifdef WLAN_FEATURE_SAE
 #define CSR_IS_AUTH_TYPE_SAE(auth_type) \
 	(eCSR_AUTH_TYPE_SAE == auth_type)
@@ -1193,6 +1194,7 @@ typedef QDF_STATUS (*csr_session_close_cb)(uint8_t session_id);
 
 #define CSR_IS_FW_SUITEB_ROAM_SUPPORTED(fw_akm_bitmap) \
 	(((fw_akm_bitmap) & (1 << AKM_SUITEB))  ? true : false)
+#endif
 
 QDF_STATUS csr_set_channels(struct mac_context *mac,
 			    struct csr_config_params *pParam);

+ 0 - 18
core/sme/inc/csr_neighbor_roam.h

@@ -171,18 +171,6 @@ QDF_STATUS csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
 				      enum roam_offload_state state,
 				      uint8_t reason);
 
-/**
- * csr_enable_roaming_on_connected_sta() - Enable roaming on other connected
- *  sta vdev
- * @mac: mac context
- * @vdev_id: vdev id on which roaming should not be enabled
- * @reason: reason for enabling roaming on connected sta vdev
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS
-csr_enable_roaming_on_connected_sta(struct mac_context *mac, uint8_t vdev_id);
-
 /**
  * csr_roam_update_cfg() - Process RSO update cfg request
  * @mac: mac context
@@ -208,12 +196,6 @@ QDF_STATUS csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
 	return QDF_STATUS_E_NOSUPPORT;
 }
 
-static inline QDF_STATUS
-csr_enable_roaming_on_connected_sta(struct mac_context *mac, uint8_t vdev_id)
-{
-	return QDF_STATUS_E_NOSUPPORT;
-}
-
 static inline QDF_STATUS
 csr_roam_update_cfg(struct mac_context *mac, uint8_t vdev_id, uint8_t reason)
 {

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

@@ -3061,19 +3061,6 @@ enum phy_ch_width sme_get_oper_ch_width(struct wlan_objmgr_vdev *vdev);
 int sme_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
 						uint16_t *sec20chan_freq);
 
-/**
- * sme_enable_roaming_on_connected_sta() - Enable roaming on an connected sta
- * @mac_handle: handle returned by mac_open
- * @vdev_id: vdev id
- *
- * The function check if any connected STA is present on which roaming is not
- * enabled and if present enabled roaming on that STA.
- *
- * Return: none
- */
-void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle,
-					 uint8_t vdev_id);
-
 /**
  * sme_send_mgmt_tx() - Sends mgmt frame from CSR to LIM
  * @mac_handle: The handle returned by mac_open

+ 16 - 30
core/sme/src/common/sme_api.c

@@ -6076,8 +6076,6 @@ QDF_STATUS sme_send_rso_connect_params(mac_handle_t mac_handle,
 {
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	tpCsrNeighborRoamControlInfo neighbor_roam_info =
-			&mac->roam.neighborRoamInfo[vdev_id];
 
 	if (vdev_id >= WLAN_MAX_VDEVS) {
 		sme_err("Invalid sme vdev id: %d", vdev_id);
@@ -6089,11 +6087,8 @@ QDF_STATUS sme_send_rso_connect_params(mac_handle_t mac_handle,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (!mac->mlme_cfg->lfr.lfr_enabled ||
-	    (neighbor_roam_info->neighborRoamState !=
-	     eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
-		sme_debug("Fast roam is disabled or not connected(%d)",
-			  neighbor_roam_info->neighborRoamState);
+	if (!mac->mlme_cfg->lfr.lfr_enabled) {
+		sme_debug("lfr enabled %d", mac->mlme_cfg->lfr.lfr_enabled);
 		return QDF_STATUS_E_PERM;
 	}
 
@@ -6137,19 +6132,18 @@ void sme_send_hlp_ie_info(mac_handle_t mac_handle, uint8_t vdev_id,
 	struct hlp_params *params;
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
 	struct csr_roam_session *session = CSR_GET_SESSION(mac, vdev_id);
-	tpCsrNeighborRoamControlInfo neighbor_roam_info =
-				&mac->roam.neighborRoamInfo[vdev_id];
 
 	if (!session) {
 		sme_err("session NULL");
 		return;
 	}
 
-	if (!mac->mlme_cfg->lfr.lfr_enabled ||
-	    (neighbor_roam_info->neighborRoamState !=
-	     eCSR_NEIGHBOR_ROAM_STATE_CONNECTED)) {
-		sme_debug("Fast roam is disabled or not connected(%d)",
-				neighbor_roam_info->neighborRoamState);
+	if (!mac->mlme_cfg->lfr.lfr_enabled) {
+		sme_debug("Fast roam is disabled");
+		return;
+	}
+	if (!csr_is_conn_state_connected(mac, vdev_id)) {
+		sme_debug("vdev not connected");
 		return;
 	}
 
@@ -12139,6 +12133,11 @@ void sme_update_tgt_services(mac_handle_t mac_handle,
 			     struct wma_tgt_services *cfg)
 {
 	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(mac_ctx->psoc);
+	if (!mlme_obj)
+		return;
 
 	mac_ctx->obss_scan_offload = cfg->obss_scan_offload;
 	sme_debug("obss_scan_offload: %d", mac_ctx->obss_scan_offload);
@@ -12147,12 +12146,13 @@ void sme_update_tgt_services(mac_handle_t mac_handle,
 	mac_ctx->pmf_offload = cfg->pmf_offload;
 	QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG,
 		FL("mac_ctx->pmf_offload: %d"), mac_ctx->pmf_offload);
-	mac_ctx->is_fils_roaming_supported =
+	mlme_obj->cfg.lfr.rso_user_config.is_fils_roaming_supported =
 				cfg->is_fils_roaming_supported;
 	mac_ctx->is_11k_offload_supported =
 				cfg->is_11k_offload_supported;
 	sme_debug("pmf_offload: %d fils_roam support %d 11k_offload %d",
-		  mac_ctx->pmf_offload, mac_ctx->is_fils_roaming_supported,
+		  mac_ctx->pmf_offload,
+		  mlme_obj->cfg.lfr.rso_user_config.is_fils_roaming_supported,
 		  mac_ctx->is_11k_offload_supported);
 	mac_ctx->bcn_reception_stats = cfg->bcn_reception_stats;
 }
@@ -14829,20 +14829,6 @@ bool sme_is_conn_state_connected(mac_handle_t mac_handle, uint8_t session_id)
 	return csr_is_conn_state_connected(mac_ctx, session_id);
 }
 
-void sme_enable_roaming_on_connected_sta(mac_handle_t mac_handle,
-					 uint8_t vdev_id)
-{
-	struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle);
-	QDF_STATUS status;
-
-	status = sme_acquire_global_lock(&mac_ctx->sme);
-	if (QDF_IS_STATUS_ERROR(status))
-		return;
-
-	csr_enable_roaming_on_connected_sta(mac_ctx, vdev_id);
-	sme_release_global_lock(&mac_ctx->sme);
-}
-
 int16_t sme_get_oper_chan_freq(struct wlan_objmgr_vdev *vdev)
 {
 	uint8_t vdev_id;

+ 64 - 103
core/sme/src/csr/csr_api_roam.c

@@ -8265,6 +8265,23 @@ QDF_STATUS csr_roam_disconnect(struct mac_context *mac_ctx, uint32_t session_id,
 	return status;
 }
 
+#if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
+static void csr_fill_single_pmk(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+				struct bss_description *bss_desc)
+{
+	struct cm_roam_values_copy src_cfg;
+
+	src_cfg.bool_value = bss_desc->is_single_pmk;
+	wlan_cm_roam_cfg_set_value(psoc, vdev_id,
+				   IS_SINGLE_PMK, &src_cfg);
+}
+#else
+static inline void
+csr_fill_single_pmk(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+		    struct bss_description *bss_desc)
+{}
+#endif
+
 QDF_STATUS
 csr_roam_save_connected_information(struct mac_context *mac,
 				    uint32_t sessionId,
@@ -8356,6 +8373,7 @@ csr_roam_save_connected_information(struct mac_context *mac,
 		src_cfg.uint_value = pSirBssDesc->mbo_oce_enabled_ap;
 		wlan_cm_roam_cfg_set_value(mac->psoc, sessionId,
 					   MBO_OCE_ENABLED_AP, &src_cfg);
+		csr_fill_single_pmk(mac->psoc, sessionId, pSirBssDesc);
 		if (CSR_IS_QOS_BSS(pIesTemp) || pIesTemp->HTCaps.present)
 			/* Some HT AP's dont send WMM IE so in that case we
 			 * assume all HT Ap's are Qos Enabled AP's
@@ -8430,8 +8448,11 @@ csr_clear_other_bss_sae_single_pmk_entry(struct mac_context *mac,
 					 uint8_t vdev_id)
 {
 	struct wlan_objmgr_vdev *vdev;
+	struct cm_roam_values_copy src_cfg;
 
-	if (!bss_desc->is_single_pmk)
+	wlan_cm_roam_cfg_get_value(mac->psoc, vdev_id,
+				   IS_SINGLE_PMK, &src_cfg);
+	if (!src_cfg.bool_value)
 		return;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, vdev_id,
@@ -8454,8 +8475,12 @@ csr_delete_current_bss_sae_single_pmk_entry(struct mac_context *mac,
 {
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_crypto_pmksa pmksa;
+	struct cm_roam_values_copy src_cfg;
 
-	if (!bss_desc->is_single_pmk)
+	wlan_cm_roam_cfg_get_value(mac->psoc, vdev_id,
+				   IS_SINGLE_PMK, &src_cfg);
+
+	if (!src_cfg.bool_value)
 		return;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, vdev_id,
@@ -10023,6 +10048,8 @@ csr_roam_chk_lnk_set_ctx_rsp(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr)
 		if (csr_is_conn_state_connected_infra(mac_ctx, sessionId))
 			csr_roam_link_up(mac_ctx,
 					 session->connectedProfile.bssid);
+#else
+		cm_roam_start_init_on_connect(mac_ctx->pdev, sessionId);
 #endif
 	}
 	if (eSIR_SME_SUCCESS == pRsp->status_code) {
@@ -13514,13 +13541,6 @@ csr_store_sae_single_pmk_to_global_cache(struct mac_context *mac,
 					 uint8_t vdev_id)
 {
 	struct wlan_objmgr_vdev *vdev;
-	struct mlme_pmk_info *pmk_info;
-
-	if (!session->pConnectBssDesc)
-		return;
-
-	if (!session->pConnectBssDesc->is_single_pmk)
-		return;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mac->psoc, vdev_id,
 						    WLAN_LEGACY_SME_ID);
@@ -13528,28 +13548,8 @@ csr_store_sae_single_pmk_to_global_cache(struct mac_context *mac,
 		sme_err("vdev is NULL");
 		return;
 	}
-
-	/*
-	 * Mark the AP as single PMK capable in Crypto Table
-	 */
-	wlan_crypto_set_sae_single_pmk_bss_cap(vdev,
-			(struct qdf_mac_addr *)session->pConnectBssDesc->bssId,
-			true);
-
-	pmk_info = qdf_mem_malloc(sizeof(*pmk_info));
-	if (!pmk_info) {
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-		return;
-	}
-
-	wlan_cm_get_psk_pmk(mac->pdev, vdev_id, pmk_info->pmk,
-			    &pmk_info->pmk_len);
-
-	wlan_mlme_update_sae_single_pmk(vdev, pmk_info);
-
+	cm_store_sae_single_pmk_to_global_cache(mac->psoc, mac->pdev, vdev);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
-	qdf_mem_zero(pmk_info, sizeof(*pmk_info));
-	qdf_mem_free(pmk_info);
 }
 #endif
 
@@ -14045,7 +14045,7 @@ static void csr_fill_connected_profile(struct mac_context *mac_ctx,
 	src_cfg.uint_value = bss_desc->mbo_oce_enabled_ap;
 	wlan_cm_roam_cfg_set_value(mac_ctx->psoc, vdev_id, MBO_OCE_ENABLED_AP,
 				   &src_cfg);
-
+	csr_fill_single_pmk(mac_ctx->psoc, vdev_id, bss_desc);
 	status = wlan_get_parsed_bss_description_ies(mac_ctx, bss_desc,
 						     &bcn_ies);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -14225,13 +14225,6 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 		csr_update_pmk_cache_ft(mac_ctx, vdev_id, session);
 	}
 
-	rsn_cap = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_RSN_CAP);
-	if (rsn_cap >= 0) {
-		if (wma_cli_set2_command(vdev_id, WMI_VDEV_PARAM_RSN_CAPABILITY,
-					 rsn_cap, 0, VDEV_CMD))
-			sme_err("Failed to update WMI_VDEV_PARAM_RSN_CAPABILITY for vdev id %d",
-				vdev_id);
-	}
 	csr_roam_state_change(mac_ctx, eCSR_ROAMING_STATE_JOINED, vdev_id);
 
 	if (!is_wps && (csr_cm_is_fils_connection(rsp) || !ucast_cipher ||
@@ -14242,13 +14235,21 @@ cm_csr_connect_done_ind(struct wlan_objmgr_vdev *vdev,
 	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP))) {
 		csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE,
 					 vdev_id);
+		cm_roam_start_init_on_connect(mac_ctx->pdev, vdev_id);
 	} else {
 		csr_roam_substate_change(mac_ctx,
 					 eCSR_ROAM_SUBSTATE_WAIT_FOR_KEY,
 					 vdev_id);
 		/* start wait for key timer. */
 	}
-	/* Fill legacy structures from resp for success */
+
+	rsn_cap = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_RSN_CAP);
+	if (rsn_cap >= 0) {
+		if (wma_cli_set2_command(vdev_id, WMI_VDEV_PARAM_RSN_CAPABILITY,
+					 rsn_cap, 0, VDEV_CMD))
+			sme_err("Failed to update WMI_VDEV_PARAM_RSN_CAPABILITY for vdev id %d",
+				vdev_id);
+	}
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -16445,6 +16446,23 @@ csr_get_roam_enabled_sta_sessionid(struct mac_context *mac_ctx, uint8_t vdev_id)
 	return WLAN_UMAC_VDEV_ID_MAX;
 }
 
+QDF_STATUS
+csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
+			   enum roam_offload_state state, uint8_t reason)
+{
+	return wlan_cm_roam_state_change(mac->pdev, vdev_id, state, reason);
+}
+
+QDF_STATUS
+csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
+		      uint8_t command, uint8_t reason)
+{
+	return wlan_cm_roam_send_rso_cmd(mac_ctx->psoc, session_id, command,
+					 reason);
+}
+
+#ifndef FEATURE_CM_ENABLE
+
 #ifdef WLAN_ADAPTIVE_11R
 static bool
 csr_is_adaptive_11r_roam_supported(struct wlan_objmgr_psoc *psoc,
@@ -16475,21 +16493,6 @@ csr_is_adaptive_11r_roam_supported(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
-QDF_STATUS
-csr_post_roam_state_change(struct mac_context *mac, uint8_t vdev_id,
-			   enum roam_offload_state state, uint8_t reason)
-{
-	return wlan_cm_roam_state_change(mac->pdev, vdev_id, state, reason);
-}
-
-QDF_STATUS
-csr_roam_offload_scan(struct mac_context *mac_ctx, uint8_t session_id,
-		      uint8_t command, uint8_t reason)
-{
-	return wlan_cm_roam_send_rso_cmd(mac_ctx->psoc, session_id, command,
-					 reason);
-}
-
 QDF_STATUS
 wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			 uint8_t command, uint8_t reason)
@@ -16501,6 +16504,11 @@ wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 	enum csr_akm_type roam_profile_akm = eCSR_AUTH_TYPE_UNKNOWN;
 	uint32_t fw_akm_bitmap;
 	bool p2p_disable_sta_roaming = 0, nan_disable_sta_roaming = 0;
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return QDF_STATUS_E_FAILURE;
 
 	mac_ctx = sme_get_mac_context();
 	if (!mac_ctx) {
@@ -16536,7 +16544,7 @@ wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 		sme_info("Roam profile is NULL");
 
 	if (CSR_IS_AKM_FILS(roam_profile_akm) &&
-	    !mac_ctx->is_fils_roaming_supported) {
+	    !mlme_obj->cfg.lfr.rso_user_config.is_fils_roaming_supported) {
 		sme_info("FILS Roaming not suppprted by fw");
 		return QDF_STATUS_E_NOSUPPORT;
 	}
@@ -16635,7 +16643,7 @@ wlan_cm_roam_cmd_allowed(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 
 	return QDF_STATUS_SUCCESS;
 }
-
+#endif
 /**
  * csr_cm_roam_offload_11k_params() - set roam 11k offload parameters
  * @mac_ctx: global mac ctx
@@ -19307,50 +19315,3 @@ csr_roam_update_cfg(struct mac_context *mac, uint8_t vdev_id, uint8_t reason)
 	return csr_roam_offload_scan(mac, vdev_id, ROAM_SCAN_OFFLOAD_UPDATE_CFG,
 				     reason);
 }
-
-QDF_STATUS
-csr_enable_roaming_on_connected_sta(struct mac_context *mac, uint8_t vdev_id)
-{
-	uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
-	uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
-	uint32_t sta_vdev_id = WLAN_INVALID_VDEV_ID;
-	struct csr_roam_session *session;
-	uint32_t count;
-	uint32_t idx;
-
-	sta_vdev_id = csr_get_roam_enabled_sta_sessionid(mac, vdev_id);
-	if (sta_vdev_id != WLAN_UMAC_VDEV_ID_MAX)
-		return QDF_STATUS_E_FAILURE;
-
-	count = policy_mgr_get_mode_specific_conn_info(mac->psoc,
-						       op_ch_freq_list,
-						       vdev_id_list,
-						       PM_STA_MODE);
-
-	if (!count)
-		return QDF_STATUS_E_FAILURE;
-
-	/*
-	 * Loop through all connected STA vdevs and roaming will be enabled
-	 * on the STA that has a different vdev id from the one passed as
-	 * input and has non zero roam trigger value.
-	 */
-	for (idx = 0; idx < count; idx++) {
-		session = CSR_GET_SESSION(mac, vdev_id_list[idx]);
-		if (vdev_id_list[idx] != vdev_id &&
-		    mlme_get_roam_trigger_bitmap(mac->psoc,
-						 vdev_id_list[idx])) {
-			sta_vdev_id = vdev_id_list[idx];
-			break;
-		}
-	}
-
-	if (sta_vdev_id == WLAN_INVALID_VDEV_ID)
-		return QDF_STATUS_E_FAILURE;
-
-	sme_debug("ROAM: Enabling roaming on vdev[%d]", sta_vdev_id);
-
-	return csr_post_roam_state_change(mac, sta_vdev_id,
-					  WLAN_ROAM_RSO_ENABLED,
-					  REASON_CTX_INIT);
-}