From 10000aedc1339ec5934da4e8f4502ea1ee5c3d11 Mon Sep 17 00:00:00 2001 From: Shreedhar Parande Date: Tue, 18 Jul 2023 16:14:52 +0530 Subject: [PATCH] qcacmn: Add API to get primary VDEV from ML peer Add API to get primary VDEV using primary link peer. Change-Id: I309070bf33bdae017f174b00ae5eea3d34292a97 CRs-Fixed: 3570511 --- umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h | 12 +++++++ umac/mlo_mgr/src/wlan_mlo_mgr_peer.c | 50 ++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h index 4511a5b0f8..1fc4e7f83f 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h +++ b/umac/mlo_mgr/inc/wlan_mlo_mgr_peer.h @@ -158,6 +158,18 @@ QDF_STATUS wlan_mlo_peer_is_assoc_done(struct wlan_mlo_peer_context *ml_peer); struct wlan_objmgr_peer *wlan_mlo_peer_get_assoc_peer( struct wlan_mlo_peer_context *ml_peer); +/** + * wlan_mlo_peer_get_primary_link_vdev() - Get primary link vdev + * @ml_peer: MLO peer + * + * This function iterates through ml_peer to find primary link + * and returns VDEV to which primary link is attached. + * + * Return: Pointer to vdev, if primary link is found else NULL + */ +struct wlan_objmgr_vdev * +wlan_mlo_peer_get_primary_link_vdev(struct wlan_mlo_peer_context *ml_peer); + /** * wlan_mlo_peer_get_bridge_peer() - get bridge peer * @ml_peer: MLO peer diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c b/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c index 24876e8d0c..9e825cfbb4 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_peer.c @@ -321,6 +321,56 @@ struct wlan_objmgr_peer *wlan_mlo_peer_get_bridge_peer( qdf_export_symbol(wlan_mlo_peer_get_bridge_peer); +struct wlan_objmgr_vdev * +wlan_mlo_peer_get_primary_link_vdev(struct wlan_mlo_peer_context *ml_peer) +{ + struct wlan_mlo_link_peer_entry *peer_entry = NULL; + struct wlan_objmgr_peer *link_peer; + struct wlan_objmgr_vdev *link_vdev; + uint8_t i; + + if (!ml_peer) { + mlo_err("ml_peer is null"); + return NULL; + } + mlo_peer_lock_acquire(ml_peer); + + if ((ml_peer->mlpeer_state != ML_PEER_CREATED) && + (ml_peer->mlpeer_state != ML_PEER_ASSOC_DONE)) { + mlo_peer_lock_release(ml_peer); + mlo_err("ml_peer is not created and association is not done"); + return NULL; + } + + for (i = 0; i < MAX_MLO_LINK_PEERS; i++) { + peer_entry = &ml_peer->peer_list[i]; + link_peer = peer_entry->link_peer; + if (!link_peer) + continue; + + if (peer_entry->is_primary) { + link_vdev = wlan_peer_get_vdev(link_peer); + if (!link_vdev) { + mlo_peer_lock_release(ml_peer); + mlo_err("link vdev not found"); + return NULL; + } + if (wlan_objmgr_vdev_try_get_ref(link_vdev, WLAN_MLO_MGR_ID) != + QDF_STATUS_SUCCESS) { + mlo_peer_lock_release(ml_peer); + mlo_err("taking ref failed"); + return NULL; + } + mlo_peer_lock_release(ml_peer); + return link_vdev; + } + } + mlo_peer_lock_release(ml_peer); + mlo_err("None of the peer is designated as primary"); + + return NULL; +} + bool mlo_peer_is_assoc_peer(struct wlan_mlo_peer_context *ml_peer, struct wlan_objmgr_peer *peer) {