Browse Source

qcacld-3.0: Enable RSO for ML connection

For MLO connection, roaming is enabled
after ML link is up.

Change-Id: Ib042a9593bef9f287b92f0b256c942f8133a7f71
CRs-Fixed: 3098637
Amruta Kulkarni 3 years ago
parent
commit
f99679197f

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

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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 above
@@ -35,6 +35,7 @@
 #include "cfg_ucfg_api.h"
 #include "wlan_roam_debug.h"
 #include "wlan_mlo_mgr_sta.h"
+#include "wlan_mlo_mgr_roam.h"
 
 #ifdef WLAN_FEATURE_FILS_SK
 void cm_update_hlp_info(struct wlan_objmgr_vdev *vdev,
@@ -1377,7 +1378,8 @@ static void cm_process_connect_complete(struct wlan_objmgr_psoc *psoc,
 	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_104) ||
 	    QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP))) {
 		cm_csr_set_ss_none(vdev_id);
-		cm_roam_start_init_on_connect(pdev, vdev_id);
+		if (!wlan_vdev_mlme_is_mlo_vdev(vdev))
+			cm_roam_start_init_on_connect(pdev, vdev_id);
 	} else {
 		if (rsp->is_wps_connection)
 			key_interval =
@@ -1398,6 +1400,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 	struct wlan_objmgr_pdev *pdev;
 	struct wlan_objmgr_psoc *psoc;
 	enum QDF_OPMODE op_mode;
+	QDF_STATUS status;
 
 	if (!vdev || !rsp) {
 		mlme_err("vdev or rsp is NULL");
@@ -1435,10 +1438,15 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 		wlan_p2p_status_connect(vdev);
 	}
 
-	if (op_mode == QDF_STA_MODE)
+	if (op_mode == QDF_STA_MODE &&
+	    !wlan_vdev_mlme_is_mlo_vdev(vdev))
 		wlan_cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_INIT,
 					  REASON_CONNECT);
 
+	status = mlo_enable_rso(pdev, vdev);
+	if (QDF_IS_STATUS_ERROR(status))
+		return status;
+
 	return QDF_STATUS_SUCCESS;
 }
 

+ 20 - 1
components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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 above
@@ -88,6 +88,19 @@ mlo_get_sta_link_mac_addr(uint8_t vdev_id,
 bool
 is_multi_link_roam(struct roam_offload_synch_ind *sync_ind);
 
+/**
+ * mlo_enable_rso - Enable rso on assoc vdev
+ *
+ * @pdev: pdev pointer
+ * @vdev: assoc vdev pointer
+ *
+ * This api will be called to enable RSO for MLO connection.
+ *
+ * Return: qdf_status success or fail
+ */
+QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev,
+			  struct wlan_objmgr_vdev *vdev);
+
 #else
 static inline QDF_STATUS
 mlo_get_sta_link_mac_addr(uint8_t vdev_id,
@@ -103,5 +116,11 @@ is_multi_link_roam(struct roam_offload_synch_ind *sync_ind)
 	return false;
 }
 
+static inline
+QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev,
+			  struct wlan_objmgr_vdev *vdev)
+{
+	return QDF_STATUS_SUCCESS;
+}
 #endif /* WLAN_FEATURE_11BE_MLO */
 #endif

+ 21 - 1
components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. 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 above
@@ -69,3 +69,23 @@ bool is_multi_link_roam(struct roam_offload_synch_ind *sync_ind)
 
 	return false;
 }
+
+QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev,
+			  struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_vdev *assoc_vdev;
+
+	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev)) {
+		assoc_vdev = wlan_mlo_get_assoc_link_vdev(vdev);
+		if (!assoc_vdev) {
+			mlo_err("Assoc vdev is null");
+			return QDF_STATUS_E_NULL_VALUE;
+		}
+
+		cm_roam_start_init_on_connect(pdev,
+					      wlan_vdev_get_id(assoc_vdev));
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+

+ 2 - 1
core/sme/src/csr/csr_api_roam.c

@@ -4120,7 +4120,8 @@ csr_roam_chk_lnk_set_ctx_rsp(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr)
 		csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE,
 					 sessionId);
 		cm_stop_wait_for_key_timer(mac_ctx->psoc, sessionId);
-		cm_roam_start_init_on_connect(mac_ctx->pdev, sessionId);
+		if (!wlan_vdev_mlme_get_is_mlo_vdev(mac_ctx->psoc, sessionId))
+			cm_roam_start_init_on_connect(mac_ctx->pdev, sessionId);
 	}
 	if (eSIR_SME_SUCCESS == pRsp->status_code) {
 		qdf_copy_macaddr(&roam_info->peerMac, &pRsp->peer_macaddr);