Browse Source

qcacmn: Count MLO vdevs in a pdev

Count the MLO vdevs in a pdev. WLAN_VDEV_FEXT2_MLO feature
flag in vdev object is set for all MLO vdevs. Simple solution is
to increment/decrement the count on every set/clear of
WLAN_VDEV_FEXT2_MLO feature flag. Since this feature flag will be
set/clear at multiple places for a given vdev, this approach
will lead to wrong MLO vdev count. To fix this we need to
increment/decrement the count on first set/first clear of
WLAN_VDEV_FEXT2_MLO flag. Add a lock also to prevent the race
conditions.

CRs-Fixed: 3106235
Change-Id: Ice7edde04553088fbb7c9b769508d441ccd6e4bf
Edayilliam Jayadev 3 years ago
parent
commit
40dacfa471

+ 2 - 3
os_if/linux/mlme/src/osif_cm_req.c

@@ -530,8 +530,7 @@ void osif_update_partner_vdev_info(struct wlan_objmgr_vdev *vdev,
 				&partner_info.partner_link_info[i].link_addr);
 		if (tmp_vdev) {
 			mlo_update_connect_req_links(tmp_vdev, 1);
-			wlan_vdev_mlme_feat_ext2_cap_set(
-					tmp_vdev, WLAN_VDEV_FEXT2_MLO);
+			wlan_vdev_mlme_set_mlo_vdev(tmp_vdev);
 			wlan_vdev_mlme_feat_ext2_cap_set(
 					tmp_vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
 			wlan_vdev_set_link_id(
@@ -617,7 +616,7 @@ QDF_STATUS osif_update_mlo_partner_info(
 		}
 
 		wlan_vdev_set_link_id(vdev, linkid);
-		wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_set_mlo_vdev(vdev);
 	}
 
 	qdf_mem_copy(&connect_req->ml_parnter_info,

+ 87 - 1
umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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
@@ -195,6 +195,7 @@ struct wlan_objmgr_pdev_mlme {
  * @wlan_psoc:         back pointer to PSOC, its attached to
  * @ref_cnt:           Ref count
  * @ref_id_dbg:        Array to track Ref count
+ * @wlan_mlo_vdev_count: MLO VDEVs count
  */
 struct wlan_objmgr_pdev_objmgr {
 	uint8_t wlan_pdev_id;
@@ -209,6 +210,9 @@ struct wlan_objmgr_pdev_objmgr {
 	struct wlan_objmgr_psoc *wlan_psoc;
 	qdf_atomic_t ref_cnt;
 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
+#ifdef WLAN_FEATURE_11BE_MLO
+	qdf_atomic_t wlan_mlo_vdev_count;
+#endif
 };
 
 /**
@@ -1157,6 +1161,88 @@ static inline uint8_t wlan_pdev_get_vdev_count(struct wlan_objmgr_pdev *pdev)
 	return pdev->pdev_objmgr.wlan_vdev_count;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * wlan_pdev_init_mlo_vdev_count() - Initialize PDEV MLO vdev count
+ * @pdev: PDEV object
+ *
+ * API to initialize MLO vdev count from PDEV
+ *
+ * Return: void
+ */
+static inline
+void wlan_pdev_init_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+	qdf_atomic_init(&pdev->pdev_objmgr.wlan_mlo_vdev_count);
+}
+
+/**
+ * wlan_pdev_get_mlo_vdev_count() - get PDEV MLO vdev count
+ * @pdev: PDEV object
+ *
+ * API to get MLO vdev count from PDEV
+ *
+ * Return: MLO vdev_count - pdev's MLO vdev count
+ */
+static inline
+uint32_t wlan_pdev_get_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+	return qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_vdev_count);
+}
+
+/**
+ * wlan_pdev_inc_mlo_vdev_count() - Increment PDEV MLO vdev count
+ * @pdev: PDEV object
+ *
+ * API to increment MLO vdev count from PDEV
+ *
+ * Return: void
+ */
+static inline
+void wlan_pdev_inc_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+	qdf_atomic_inc(&pdev->pdev_objmgr.wlan_mlo_vdev_count);
+}
+
+/**
+ * wlan_pdev_dec_mlo_vdev_count() - Decrement PDEV MLO vdev count
+ * @pdev: PDEV object
+ *
+ * API to decrement MLO vdev count from PDEV
+ *
+ * Return: void
+ */
+static inline
+void wlan_pdev_dec_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+	qdf_assert_always
+		(qdf_atomic_read(&pdev->pdev_objmgr.wlan_mlo_vdev_count));
+
+	qdf_atomic_dec(&pdev->pdev_objmgr.wlan_mlo_vdev_count);
+}
+#else
+static inline
+void wlan_pdev_init_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+}
+
+static inline
+uint32_t wlan_pdev_get_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+	return 0;
+}
+
+static inline
+void wlan_pdev_inc_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+}
+
+static inline
+void wlan_pdev_dec_mlo_vdev_count(struct wlan_objmgr_pdev *pdev)
+{
+}
+#endif /* WLAN_FEATURE_11BE_MLO */
+
 /**
  * wlan_print_pdev_info() - print pdev members
  * @pdev: pdev object pointer

+ 164 - 17
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -305,7 +305,9 @@ struct wlan_channel {
  *                      net dev address for non-ML connection
  * @mldaddr[]:          MLD address
  * @linkaddr[]:         Link MAC address
- * @link_id:            link id for mlo connection
+ * @mlo_link_id: link id for mlo connection
+ * @wlan_vdev_mlo_lock: lock to protect the set/clear of
+ * WLAN_VDEV_FEXT2_MLO feature flag in vdev MLME
  */
 struct wlan_objmgr_vdev_mlme {
 	enum QDF_OPMODE vdev_opmode;
@@ -324,6 +326,11 @@ struct wlan_objmgr_vdev_mlme {
 	uint8_t  linkaddr[QDF_MAC_ADDR_SIZE];
 #ifdef WLAN_FEATURE_11BE_MLO
 	uint8_t  mlo_link_id;
+#ifdef WLAN_MLO_USE_SPINLOCK
+	qdf_spinlock_t wlan_vdev_mlo_lock;
+#else
+	qdf_mutex_t wlan_vdev_mlo_lock;
+#endif
 #endif
 };
 
@@ -893,11 +900,131 @@ static inline void wlan_vdev_set_link_id(struct wlan_objmgr_vdev *vdev,
 {
 	vdev->vdev_mlme.mlo_link_id = link_id;
 }
+
+#ifdef WLAN_MLO_USE_SPINLOCK
+/**
+ * wlan_create_vdev_mlo_lock() - API to create spin lock
+ * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
+ * vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_spinlock_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_destroy_vdev_mlo_lock() - API to destroy spin lock
+ * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
+ * vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_spinlock_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_acquire_vdev_mlo_lock() - API to acquire spin lock
+ * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
+ * vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_spin_lock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_release_vdev_mlo_lock() - API to release spin lock
+ * which protects the set/clear of WLAN_VDEV_FEXT2_MLO flag in
+ * vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_spin_unlock_bh(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+#else
+/**
+ * wlan_create_vdev_mlo_lock() - API to create mutex which protects the
+ * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_mutex_create(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_destroy_vdev_mlo_lock() - API to destroy mutex which protects the
+ * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_mutex_destroy(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_acquire_vdev_mlo_lock() - API to acquire mutex which protects the
+ * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_acquire_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_mutex_acquire(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+
+/**
+ * wlan_release_vdev_mlo_lock() - API to release mutex which protects the
+ * set/clear of WLAN_VDEV_FEXT2_MLO flag in vdev MLME ext2 feature caps
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+static inline
+void wlan_release_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+	qdf_mutex_release(&vdev->vdev_mlme.wlan_vdev_mlo_lock);
+}
+#endif /* WLAN_MLO_USE_SPINLOCK */
 #else
 static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
 {
 	return WLAN_INVALID_LINK_ID;
 }
+
+static inline
+void wlan_create_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+}
+
+static inline
+void wlan_destroy_vdev_mlo_lock(struct wlan_objmgr_vdev *vdev)
+{
+}
 #endif
 
 /**
@@ -1413,6 +1540,15 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
 }
 
 #ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * wlan_vdev_mlme_is_mlo_vdev() - Determine whether the given vdev is an MLO
+ * vdev or not
+ * @vdev: VDEV object
+ *
+ * Return: True if it is MLO, otherwise false.
+ */
+bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev);
+
 /**
  * wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
  * @vdev: VDEV object
@@ -1422,27 +1558,24 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
 static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
 {
 	return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
-	       wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_is_mlo_vdev(vdev);
 }
-#else
-static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
-{
-	return false;
-}
-#endif
 
-#ifdef WLAN_FEATURE_11BE_MLO
 /**
- * wlan_vdev_mlme_is_mlo_vdev() - whether it is mlo vdev or not
+ * wlan_vdev_mlme_set_mlo_vdev() - Set vdev as an MLO vdev
  * @vdev: VDEV object
  *
- * Return: True if it is mlo, otherwise false.
+ * Return: void
  */
-static inline
-bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
-{
-	return wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO);
-}
+void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_vdev_mlme_clear_mlo_vdev() - Mark that the vdev is no longer an MLO vdev
+ * @vdev: VDEV object
+ *
+ * Return: void
+ */
+void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
 
 #ifdef WLAN_MCAST_MLO
 /**
@@ -1516,13 +1649,27 @@ bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
 	return false;
 }
 #else
-
 static inline
 bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
 {
 	return false;
 }
 
+static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
+{
+	return false;
+}
+
+static inline
+void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
+{
+}
+
+static inline
+void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
+{
+}
+
 static inline
 bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
 {

+ 2 - 1
umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2016-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
@@ -138,6 +138,7 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create(
 	pdev->pdev_objmgr.wlan_peer_count = 0;
 	pdev->pdev_objmgr.temp_peer_count = 0;
 	pdev->pdev_objmgr.max_peer_count = wlan_psoc_get_max_peer_count(psoc);
+	wlan_pdev_init_mlo_vdev_count(pdev);
 	/* Save HDD/OSIF pointer */
 	pdev->pdev_nif.pdev_ospriv = osdev_priv;
 	qdf_atomic_init(&pdev->pdev_objmgr.ref_cnt);

+ 84 - 1
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -112,6 +112,8 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev)
 	wlan_objmgr_vdev_trace_deinit_lock(vdev);
 	qdf_spinlock_destroy(&vdev->vdev_lock);
 
+	wlan_destroy_vdev_mlo_lock(vdev);
+
 	qdf_mem_free(vdev->vdev_mlme.bss_chan);
 	qdf_mem_free(vdev->vdev_mlme.des_chan);
 	qdf_mem_free(vdev);
@@ -173,6 +175,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
 		return NULL;
 	}
 
+	wlan_create_vdev_mlo_lock(vdev);
+
 	wlan_objmgr_vdev_trace_init_lock(vdev);
 	/* Initialize spinlock */
 	qdf_spinlock_create(&vdev->vdev_lock);
@@ -183,6 +187,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
 					vdev->vdev_objmgr.vdev_id);
 		qdf_mem_free(vdev->vdev_mlme.bss_chan);
 		qdf_mem_free(vdev->vdev_mlme.des_chan);
+		wlan_destroy_vdev_mlo_lock(vdev);
 		qdf_spinlock_destroy(&vdev->vdev_lock);
 		wlan_objmgr_vdev_trace_deinit_lock(vdev);
 		qdf_mem_free(vdev);
@@ -198,6 +203,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
 		wlan_objmgr_psoc_vdev_detach(psoc, vdev);
 		qdf_mem_free(vdev->vdev_mlme.bss_chan);
 		qdf_mem_free(vdev->vdev_mlme.des_chan);
+		wlan_destroy_vdev_mlo_lock(vdev);
 		qdf_spinlock_destroy(&vdev->vdev_lock);
 		wlan_objmgr_vdev_trace_deinit_lock(vdev);
 		qdf_mem_free(vdev);
@@ -1468,4 +1474,81 @@ QDF_STATUS wlan_vdev_get_bss_peer_mld_mac(struct wlan_objmgr_vdev *vdev,
 
 	return QDF_STATUS_SUCCESS;
 }
-#endif
+
+bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	bool is_mlo_vdev;
+
+	if (!vdev) {
+		obj_mgr_err("vdev is NULL");
+		return false;
+	}
+
+	wlan_acquire_vdev_mlo_lock(vdev);
+
+	is_mlo_vdev =
+		wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO);
+
+	wlan_release_vdev_mlo_lock(vdev);
+
+	return is_mlo_vdev;
+}
+
+qdf_export_symbol(wlan_vdev_mlme_is_mlo_vdev);
+
+void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_pdev *pdev;
+
+	if (!vdev) {
+		obj_mgr_err("vdev is NULL");
+		return;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		obj_mgr_err("pdev is NULL");
+		return;
+	}
+
+	wlan_acquire_vdev_mlo_lock(vdev);
+
+	if (wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO)) {
+		wlan_release_vdev_mlo_lock(vdev);
+		return;
+	}
+	wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO);
+
+	wlan_pdev_inc_mlo_vdev_count(pdev);
+
+	wlan_release_vdev_mlo_lock(vdev);
+}
+
+void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_pdev *pdev;
+
+	if (!vdev) {
+		obj_mgr_err("vdev is NULL");
+		return;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		obj_mgr_err("pdev is NULL");
+		return;
+	}
+
+	wlan_acquire_vdev_mlo_lock(vdev);
+
+	if (!wlan_vdev_mlme_feat_ext2_cap_get(vdev, WLAN_VDEV_FEXT2_MLO)) {
+		wlan_release_vdev_mlo_lock(vdev);
+		return;
+	}
+	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO);
+
+	wlan_pdev_dec_mlo_vdev_count(pdev);
+
+	wlan_release_vdev_mlo_lock(vdev);
+}
+#endif /* WLAN_FEATURE_11BE_MLO */

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

@@ -34,6 +34,7 @@
 #endif
 #include <wlan_utility.h>
 #include <wlan_mlo_mgr_sta.h>
+#include <wlan_objmgr_vdev_obj.h>
 
 static void
 cm_fill_failure_resp_from_cm_id(struct cnx_mgr *cm_ctx,
@@ -474,8 +475,7 @@ static void cm_update_vdev_mlme_macaddr(struct cnx_mgr *cm_ctx,
 		/* Use link address for ML connection */
 		wlan_vdev_mlme_set_macaddr(cm_ctx->vdev,
 					   cm_ctx->vdev->vdev_mlme.linkaddr);
-		wlan_vdev_mlme_feat_ext2_cap_set(cm_ctx->vdev,
-						 WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_set_mlo_vdev(cm_ctx->vdev);
 		mlme_debug("set link address for ML connection");
 	} else {
 		/* Use net_dev address for non-ML connection */
@@ -486,8 +486,7 @@ static void cm_update_vdev_mlme_macaddr(struct cnx_mgr *cm_ctx,
 				   QDF_MAC_ADDR_REF(mac->bytes));
 		}
 
-		wlan_vdev_mlme_feat_ext2_cap_clear(cm_ctx->vdev,
-						   WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_clear_mlo_vdev(cm_ctx->vdev);
 		mlme_debug("clear MLO cap for non-ML connection");
 	}
 	wlan_vdev_obj_unlock(cm_ctx->vdev);
@@ -2105,7 +2104,7 @@ cm_update_scan_db_on_connect_success(struct cnx_mgr *cm_ctx,
 static inline void
 cm_clear_vdev_mlo_cap(struct wlan_objmgr_vdev *vdev)
 {
-	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO);
+	wlan_vdev_mlme_clear_mlo_vdev(vdev);
 }
 #else /*WLAN_FEATURE_11BE_MLO_ADV_FEATURE*/
 static inline void

+ 1 - 1
umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c

@@ -504,7 +504,7 @@ cm_inform_dlm_disconnect_complete(struct wlan_objmgr_vdev *vdev,
 static inline void
 cm_clear_vdev_mlo_cap(struct wlan_objmgr_vdev *vdev)
 {
-	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO);
+	wlan_vdev_mlme_clear_mlo_vdev(vdev);
 }
 #else /*WLAN_FEATURE_11BE_MLO_ADV_FEATURE*/
 static inline void

+ 3 - 3
umac/mlo_mgr/src/wlan_mlo_mgr_ap.c

@@ -48,7 +48,7 @@ bool mlo_ap_vdev_attach(struct wlan_objmgr_vdev *vdev,
 
 	dev_ctx = vdev->mlo_dev_ctx;
 	wlan_vdev_set_link_id(vdev, link_id);
-	wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO);
+	wlan_vdev_mlme_set_mlo_vdev(vdev);
 
 	/**
 	 * every link will trigger mlo_ap_vdev_attach,
@@ -86,7 +86,7 @@ bool mlo_ap_vdev_attach(struct wlan_objmgr_vdev *vdev,
 
 	dev_ctx = vdev->mlo_dev_ctx;
 	wlan_vdev_set_link_id(vdev, link_id);
-	wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO);
+	wlan_vdev_mlme_set_mlo_vdev(vdev);
 
 	/**
 	 * every link will trigger mlo_ap_vdev_attach,
@@ -277,7 +277,7 @@ void mlo_ap_vdev_detach(struct wlan_objmgr_vdev *vdev)
 		mlo_err("Invalid input");
 		return;
 	}
-	wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO);
+	wlan_vdev_mlme_clear_mlo_vdev(vdev);
 }
 
 void mlo_ap_link_down_cmpl_notify(struct wlan_objmgr_vdev *vdev)

+ 4 - 8
umac/mlo_mgr/src/wlan_mlo_mgr_sta.c

@@ -254,9 +254,7 @@ void mlo_mld_clear_mlo_cap(struct wlan_objmgr_vdev *vdev)
 	for (i =  0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
 		if (!mlo_dev_ctx->wlan_vdev_list[i])
 			continue;
-		wlan_vdev_mlme_feat_ext2_cap_clear(
-				mlo_dev_ctx->wlan_vdev_list[i],
-				WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_clear_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
 		wlan_vdev_mlme_feat_ext2_cap_clear(
 				mlo_dev_ctx->wlan_vdev_list[i],
 				WLAN_VDEV_FEXT2_MLO_STA_LINK);
@@ -592,8 +590,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
 		if (!mlo_dev_ctx->wlan_vdev_list[i] ||
 		    (mlo_dev_ctx->wlan_vdev_list[i] == vdev))
 			continue;
-		wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i],
-						 WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_set_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
 		wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i],
 						 WLAN_VDEV_FEXT2_MLO_STA_LINK);
 		wlan_vdev_set_link_id(
@@ -1193,7 +1190,7 @@ void mlo_sta_link_handle_pending_connect(struct wlan_objmgr_vdev *vdev)
 
 	if (sta_ctx->connect_req->ml_parnter_info.num_partner_links) {
 		partner_info = sta_ctx->connect_req->ml_parnter_info;
-		wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO);
+		wlan_vdev_mlme_set_mlo_vdev(vdev);
 		wlan_vdev_mlme_feat_ext2_cap_clear(
 				vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
 		mlo_clear_connect_req_links_bmap(vdev);
@@ -1205,8 +1202,7 @@ void mlo_sta_link_handle_pending_connect(struct wlan_objmgr_vdev *vdev)
 					&partner_link_info.link_addr);
 			if (tmp_vdev) {
 				mlo_update_connect_req_links(tmp_vdev, 1);
-				wlan_vdev_mlme_feat_ext2_cap_set(
-						tmp_vdev, WLAN_VDEV_FEXT2_MLO);
+				wlan_vdev_mlme_set_mlo_vdev(tmp_vdev);
 				wlan_vdev_mlme_feat_ext2_cap_set(
 						tmp_vdev,
 						WLAN_VDEV_FEXT2_MLO_STA_LINK);