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
This commit is contained in:
Edayilliam Jayadev
2022-01-10 10:43:18 +05:30
committed by Madan Koyyalamudi
parent 70a8e8a708
commit 40dacfa471
9 changed files with 351 additions and 40 deletions

View File

@@ -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,

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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 */

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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);