Browse Source

qcacmn: Add APIs to get txrx peer, tgt peer and primary link peer

Add APIs to get txrx peer, tgt peer and primary link peer from peer
for both MLO enabled and disabled scenarios.

Change-Id: Ie48711972dd3eef35fdd7bf736e91bfce4cd41f3
CRs-Fixed: 3107160
Harsh Kumar Bijlani 3 năm trước cách đây
mục cha
commit
f4c7e777f0
1 tập tin đã thay đổi với 123 bổ sung0 xóa
  1. 123 0
      dp/wifi3.0/dp_peer.h

+ 123 - 0
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)