diff --git a/os_if/linux/mlme/src/osif_cm_req.c b/os_if/linux/mlme/src/osif_cm_req.c index baea6cfa03..ddb27fa05b 100644 --- a/os_if/linux/mlme/src/osif_cm_req.c +++ b/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, diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h index 1783bdc621..0c0ede1eed 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h +++ b/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 diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index f4f3503595..eaf711a336 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/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) { diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c index bcfa747c26..f7db8dff29 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c +++ b/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); diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c index f6f2add7ae..9b7c067333 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c +++ b/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 */ diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c index 1dd1d280f8..803af931f9 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c @@ -34,6 +34,7 @@ #endif #include #include +#include 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 diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c index 0b39483551..3b22f89a7c 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c +++ b/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 diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_ap.c b/umac/mlo_mgr/src/wlan_mlo_mgr_ap.c index 6e9c414dfc..cc26e255f7 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_ap.c +++ b/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) diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c index dbd1045a9a..2607814c0a 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c +++ b/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);