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
Este commit está contenido en:

cometido por
Madan Koyyalamudi

padre
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);
|
&partner_info.partner_link_info[i].link_addr);
|
||||||
if (tmp_vdev) {
|
if (tmp_vdev) {
|
||||||
mlo_update_connect_req_links(tmp_vdev, 1);
|
mlo_update_connect_req_links(tmp_vdev, 1);
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(
|
wlan_vdev_mlme_set_mlo_vdev(tmp_vdev);
|
||||||
tmp_vdev, WLAN_VDEV_FEXT2_MLO);
|
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(
|
wlan_vdev_mlme_feat_ext2_cap_set(
|
||||||
tmp_vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
tmp_vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
||||||
wlan_vdev_set_link_id(
|
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_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,
|
qdf_mem_copy(&connect_req->ml_parnter_info,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
|
* 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
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
* purpose with or without fee is hereby granted, provided that the above
|
* 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
|
* @wlan_psoc: back pointer to PSOC, its attached to
|
||||||
* @ref_cnt: Ref count
|
* @ref_cnt: Ref count
|
||||||
* @ref_id_dbg: Array to track Ref count
|
* @ref_id_dbg: Array to track Ref count
|
||||||
|
* @wlan_mlo_vdev_count: MLO VDEVs count
|
||||||
*/
|
*/
|
||||||
struct wlan_objmgr_pdev_objmgr {
|
struct wlan_objmgr_pdev_objmgr {
|
||||||
uint8_t wlan_pdev_id;
|
uint8_t wlan_pdev_id;
|
||||||
@@ -209,6 +210,9 @@ struct wlan_objmgr_pdev_objmgr {
|
|||||||
struct wlan_objmgr_psoc *wlan_psoc;
|
struct wlan_objmgr_psoc *wlan_psoc;
|
||||||
qdf_atomic_t ref_cnt;
|
qdf_atomic_t ref_cnt;
|
||||||
qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
|
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;
|
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
|
* wlan_print_pdev_info() - print pdev members
|
||||||
* @pdev: pdev object pointer
|
* @pdev: pdev object pointer
|
||||||
|
@@ -305,7 +305,9 @@ struct wlan_channel {
|
|||||||
* net dev address for non-ML connection
|
* net dev address for non-ML connection
|
||||||
* @mldaddr[]: MLD address
|
* @mldaddr[]: MLD address
|
||||||
* @linkaddr[]: Link MAC 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 {
|
struct wlan_objmgr_vdev_mlme {
|
||||||
enum QDF_OPMODE vdev_opmode;
|
enum QDF_OPMODE vdev_opmode;
|
||||||
@@ -324,6 +326,11 @@ struct wlan_objmgr_vdev_mlme {
|
|||||||
uint8_t linkaddr[QDF_MAC_ADDR_SIZE];
|
uint8_t linkaddr[QDF_MAC_ADDR_SIZE];
|
||||||
#ifdef WLAN_FEATURE_11BE_MLO
|
#ifdef WLAN_FEATURE_11BE_MLO
|
||||||
uint8_t mlo_link_id;
|
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
|
#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;
|
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
|
#else
|
||||||
static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
|
static inline uint8_t wlan_vdev_get_link_id(struct wlan_objmgr_vdev *vdev)
|
||||||
{
|
{
|
||||||
return WLAN_INVALID_LINK_ID;
|
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
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1413,6 +1540,15 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_11BE_MLO
|
#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
|
* wlan_vdev_mlme_is_mlo_ap() - whether it is mlo ap or not
|
||||||
* @vdev: VDEV object
|
* @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)
|
static inline bool wlan_vdev_mlme_is_mlo_ap(struct wlan_objmgr_vdev *vdev)
|
||||||
{
|
{
|
||||||
return (wlan_vdev_mlme_get_opmode(vdev) == QDF_SAP_MODE) &&
|
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
|
* @vdev: VDEV object
|
||||||
*
|
*
|
||||||
* Return: True if it is mlo, otherwise false.
|
* Return: void
|
||||||
*/
|
*/
|
||||||
static inline
|
void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
|
||||||
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);
|
* 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
|
#ifdef WLAN_MCAST_MLO
|
||||||
/**
|
/**
|
||||||
@@ -1516,13 +1649,27 @@ bool wlan_vdev_mlme_is_link_sta_vdev(struct wlan_objmgr_vdev *vdev)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
|
bool wlan_vdev_mlme_is_mlo_vdev(struct wlan_objmgr_vdev *vdev)
|
||||||
{
|
{
|
||||||
return false;
|
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
|
static inline
|
||||||
bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
|
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) 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
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* 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.wlan_peer_count = 0;
|
||||||
pdev->pdev_objmgr.temp_peer_count = 0;
|
pdev->pdev_objmgr.temp_peer_count = 0;
|
||||||
pdev->pdev_objmgr.max_peer_count = wlan_psoc_get_max_peer_count(psoc);
|
pdev->pdev_objmgr.max_peer_count = wlan_psoc_get_max_peer_count(psoc);
|
||||||
|
wlan_pdev_init_mlo_vdev_count(pdev);
|
||||||
/* Save HDD/OSIF pointer */
|
/* Save HDD/OSIF pointer */
|
||||||
pdev->pdev_nif.pdev_ospriv = osdev_priv;
|
pdev->pdev_nif.pdev_ospriv = osdev_priv;
|
||||||
qdf_atomic_init(&pdev->pdev_objmgr.ref_cnt);
|
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);
|
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
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.bss_chan);
|
||||||
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
||||||
qdf_mem_free(vdev);
|
qdf_mem_free(vdev);
|
||||||
@@ -173,6 +175,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wlan_create_vdev_mlo_lock(vdev);
|
||||||
|
|
||||||
wlan_objmgr_vdev_trace_init_lock(vdev);
|
wlan_objmgr_vdev_trace_init_lock(vdev);
|
||||||
/* Initialize spinlock */
|
/* Initialize spinlock */
|
||||||
qdf_spinlock_create(&vdev->vdev_lock);
|
qdf_spinlock_create(&vdev->vdev_lock);
|
||||||
@@ -183,6 +187,7 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create(
|
|||||||
vdev->vdev_objmgr.vdev_id);
|
vdev->vdev_objmgr.vdev_id);
|
||||||
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
||||||
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
||||||
|
wlan_destroy_vdev_mlo_lock(vdev);
|
||||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
qdf_spinlock_destroy(&vdev->vdev_lock);
|
||||||
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||||
qdf_mem_free(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);
|
wlan_objmgr_psoc_vdev_detach(psoc, vdev);
|
||||||
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
qdf_mem_free(vdev->vdev_mlme.bss_chan);
|
||||||
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
qdf_mem_free(vdev->vdev_mlme.des_chan);
|
||||||
|
wlan_destroy_vdev_mlo_lock(vdev);
|
||||||
qdf_spinlock_destroy(&vdev->vdev_lock);
|
qdf_spinlock_destroy(&vdev->vdev_lock);
|
||||||
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
wlan_objmgr_vdev_trace_deinit_lock(vdev);
|
||||||
qdf_mem_free(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;
|
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
|
#endif
|
||||||
#include <wlan_utility.h>
|
#include <wlan_utility.h>
|
||||||
#include <wlan_mlo_mgr_sta.h>
|
#include <wlan_mlo_mgr_sta.h>
|
||||||
|
#include <wlan_objmgr_vdev_obj.h>
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cm_fill_failure_resp_from_cm_id(struct cnx_mgr *cm_ctx,
|
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 */
|
/* Use link address for ML connection */
|
||||||
wlan_vdev_mlme_set_macaddr(cm_ctx->vdev,
|
wlan_vdev_mlme_set_macaddr(cm_ctx->vdev,
|
||||||
cm_ctx->vdev->vdev_mlme.linkaddr);
|
cm_ctx->vdev->vdev_mlme.linkaddr);
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(cm_ctx->vdev,
|
wlan_vdev_mlme_set_mlo_vdev(cm_ctx->vdev);
|
||||||
WLAN_VDEV_FEXT2_MLO);
|
|
||||||
mlme_debug("set link address for ML connection");
|
mlme_debug("set link address for ML connection");
|
||||||
} else {
|
} else {
|
||||||
/* Use net_dev address for non-ML connection */
|
/* 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));
|
QDF_MAC_ADDR_REF(mac->bytes));
|
||||||
}
|
}
|
||||||
|
|
||||||
wlan_vdev_mlme_feat_ext2_cap_clear(cm_ctx->vdev,
|
wlan_vdev_mlme_clear_mlo_vdev(cm_ctx->vdev);
|
||||||
WLAN_VDEV_FEXT2_MLO);
|
|
||||||
mlme_debug("clear MLO cap for non-ML connection");
|
mlme_debug("clear MLO cap for non-ML connection");
|
||||||
}
|
}
|
||||||
wlan_vdev_obj_unlock(cm_ctx->vdev);
|
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
|
static inline void
|
||||||
cm_clear_vdev_mlo_cap(struct wlan_objmgr_vdev *vdev)
|
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*/
|
#else /*WLAN_FEATURE_11BE_MLO_ADV_FEATURE*/
|
||||||
static inline void
|
static inline void
|
||||||
|
@@ -504,7 +504,7 @@ cm_inform_dlm_disconnect_complete(struct wlan_objmgr_vdev *vdev,
|
|||||||
static inline void
|
static inline void
|
||||||
cm_clear_vdev_mlo_cap(struct wlan_objmgr_vdev *vdev)
|
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*/
|
#else /*WLAN_FEATURE_11BE_MLO_ADV_FEATURE*/
|
||||||
static inline void
|
static inline void
|
||||||
|
@@ -48,7 +48,7 @@ bool mlo_ap_vdev_attach(struct wlan_objmgr_vdev *vdev,
|
|||||||
|
|
||||||
dev_ctx = vdev->mlo_dev_ctx;
|
dev_ctx = vdev->mlo_dev_ctx;
|
||||||
wlan_vdev_set_link_id(vdev, link_id);
|
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,
|
* 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;
|
dev_ctx = vdev->mlo_dev_ctx;
|
||||||
wlan_vdev_set_link_id(vdev, link_id);
|
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,
|
* 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");
|
mlo_err("Invalid input");
|
||||||
return;
|
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)
|
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++) {
|
for (i = 0; i < WLAN_UMAC_MLO_MAX_VDEVS; i++) {
|
||||||
if (!mlo_dev_ctx->wlan_vdev_list[i])
|
if (!mlo_dev_ctx->wlan_vdev_list[i])
|
||||||
continue;
|
continue;
|
||||||
wlan_vdev_mlme_feat_ext2_cap_clear(
|
wlan_vdev_mlme_clear_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
|
||||||
mlo_dev_ctx->wlan_vdev_list[i],
|
|
||||||
WLAN_VDEV_FEXT2_MLO);
|
|
||||||
wlan_vdev_mlme_feat_ext2_cap_clear(
|
wlan_vdev_mlme_feat_ext2_cap_clear(
|
||||||
mlo_dev_ctx->wlan_vdev_list[i],
|
mlo_dev_ctx->wlan_vdev_list[i],
|
||||||
WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
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] ||
|
if (!mlo_dev_ctx->wlan_vdev_list[i] ||
|
||||||
(mlo_dev_ctx->wlan_vdev_list[i] == vdev))
|
(mlo_dev_ctx->wlan_vdev_list[i] == vdev))
|
||||||
continue;
|
continue;
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i],
|
wlan_vdev_mlme_set_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
|
||||||
WLAN_VDEV_FEXT2_MLO);
|
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(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_FEXT2_MLO_STA_LINK);
|
||||||
wlan_vdev_set_link_id(
|
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) {
|
if (sta_ctx->connect_req->ml_parnter_info.num_partner_links) {
|
||||||
partner_info = sta_ctx->connect_req->ml_parnter_info;
|
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(
|
wlan_vdev_mlme_feat_ext2_cap_clear(
|
||||||
vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
||||||
mlo_clear_connect_req_links_bmap(vdev);
|
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);
|
&partner_link_info.link_addr);
|
||||||
if (tmp_vdev) {
|
if (tmp_vdev) {
|
||||||
mlo_update_connect_req_links(tmp_vdev, 1);
|
mlo_update_connect_req_links(tmp_vdev, 1);
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(
|
wlan_vdev_mlme_set_mlo_vdev(tmp_vdev);
|
||||||
tmp_vdev, WLAN_VDEV_FEXT2_MLO);
|
|
||||||
wlan_vdev_mlme_feat_ext2_cap_set(
|
wlan_vdev_mlme_feat_ext2_cap_set(
|
||||||
tmp_vdev,
|
tmp_vdev,
|
||||||
WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
WLAN_VDEV_FEXT2_MLO_STA_LINK);
|
||||||
|
Referencia en una nueva incidencia
Block a user