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
このコミットが含まれているのは:
@@ -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_objmgr_peer *wlan_mlo_peer_get_assoc_peer(
|
||||||
struct wlan_mlo_peer_context *ml_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
|
* wlan_mlo_peer_get_bridge_peer() - get bridge peer
|
||||||
* @ml_peer: MLO peer
|
* @ml_peer: MLO peer
|
||||||
|
@@ -321,6 +321,56 @@ struct wlan_objmgr_peer *wlan_mlo_peer_get_bridge_peer(
|
|||||||
|
|
||||||
qdf_export_symbol(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,
|
bool mlo_peer_is_assoc_peer(struct wlan_mlo_peer_context *ml_peer,
|
||||||
struct wlan_objmgr_peer *peer)
|
struct wlan_objmgr_peer *peer)
|
||||||
{
|
{
|
||||||
|
新しいイシューから参照
ユーザーをブロックする