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:

committed by
Madan Koyyalamudi

parent
70a8e8a708
commit
40dacfa471
@@ -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,
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
@@ -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 */
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user