diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index d9b2383b48..a39386c9ae 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -1430,6 +1430,103 @@ QDF_STATUS dp_peer_mlo_setup( uint8_t vdev_id, struct cdp_peer_setup_info *setup_info); +/** + * dp_get_tgt_peer_from_peer() - Get target peer from the given peer + * @peer: datapath peer + * + * Return: MLD peer in case of MLO Link peer + * Peer itself in other cases + */ +static inline +struct dp_peer *dp_get_tgt_peer_from_peer(struct dp_peer *peer) +{ + return IS_MLO_DP_LINK_PEER(peer) ? peer->mld_peer : peer; +} + +/** + * dp_get_primary_link_peer_by_id(): Get primary link peer from the given + * peer id + * @soc: core DP soc context + * @peer_id: peer id + * @mod_id: ID of module requesting reference + * + * Return: primary link peer for the MLO peer + * legacy peer itself in case of legacy peer + */ +static inline +struct dp_peer *dp_get_primary_link_peer_by_id(struct dp_soc *soc, + uint16_t peer_id, + enum dp_mod_id mod_id) +{ + uint8_t i; + struct dp_mld_link_peers link_peers_info; + struct dp_peer *peer; + struct dp_peer *link_peer; + struct dp_peer *primary_peer = NULL; + + peer = dp_peer_get_ref_by_id(soc, peer_id, mod_id); + + if (!peer) + return NULL; + + if (IS_MLO_DP_MLD_PEER(peer)) { + /* get link peers with reference */ + dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info, + mod_id); + + for (i = 0; i < link_peers_info.num_links; i++) { + link_peer = link_peers_info.link_peers[i]; + if (link_peer->primary_link) { + primary_peer = link_peer; + /* + * Take additional reference over + * primary link peer. + */ + dp_peer_get_ref(NULL, primary_peer, mod_id); + break; + } + } + /* release link peers reference */ + dp_release_link_peers_ref(&link_peers_info, mod_id); + dp_peer_unref_delete(peer, mod_id); + } else { + primary_peer = peer; + } + + return primary_peer; +} + +/** + * dp_get_txrx_peer() - Get dp_txrx_peer from passed dp_peer + * @peer: Datapath peer + * + * Return: dp_txrx_peer from MLD peer if peer type is link peer + * dp_txrx_peer from peer itself for other cases + */ +static inline +struct dp_txrx_peer *dp_get_txrx_peer(struct dp_peer *peer) +{ + return IS_MLO_DP_LINK_PEER(peer) ? + peer->mld_peer->txrx_peer : peer->txrx_peer; +} + +/** + * dp_peer_is_primary_link_peer() - Check if peer is primary link peer + * @peer: Datapath peer + * + * Return: true if peer is primary link peer or legacy peer + * false otherwise + */ +static inline +bool dp_peer_is_primary_link_peer(struct dp_peer *peer) +{ + if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link) + return true; + else if (IS_DP_LEGACY_PEER(peer)) + return true; + else + return false; +} #else #define DP_PEER_SET_TYPE(_peer, _type_val) /* no op */ /* is legacy peer */ @@ -1510,6 +1607,32 @@ dp_link_peer_hash_find_by_chip_id(struct dp_soc *soc, mac_addr_is_aligned, vdev_id, mod_id); } + +static inline +struct dp_peer *dp_get_tgt_peer_from_peer(struct dp_peer *peer) +{ + return peer; +} + +static inline +struct dp_peer *dp_get_primary_link_peer_by_id(struct dp_soc *soc, + uint16_t peer_id, + enum dp_mod_id mod_id) +{ + return dp_peer_get_ref_by_id(soc, peer_id, mod_id); +} + +static inline +struct dp_txrx_peer *dp_get_txrx_peer(struct dp_peer *peer) +{ + return peer->txrx_peer; +} + +static inline +bool dp_peer_is_primary_link_peer(struct dp_peer *peer) +{ + return true; +} #endif /* WLAN_FEATURE_11BE_MLO */ #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)