Pārlūkot izejas kodu

qcacmn: Support same link/mld peer mac address

Currently, if mld and link peer has the same mac
address, the peer cannot distinguished with
just the mac address as the search argument.

Hence to support same mld/link peer mac address,
cdp_peer APIs that uses both link and mld peers,
are also given peer_type info. This helps
to perform the operations on the correct peer.

Change-Id: If646755facc8f9a4d9fed2f31c5cc6618fa9a952
CRs-Fixed: 3043428
Namita Nair 3 gadi atpakaļ
vecāks
revīzija
dc6a757028

+ 12 - 1
dp/inc/cdp_txrx_cmn.h

@@ -116,6 +116,16 @@ enum verbose_debug_module {
 #define dp_cdp_nofl_debug(params...) \
 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_DP_CDP, params)
 
+#define DP_PEER_INFO_PARAMS_INIT(peer_info, _vdev_id, \
+				_peer_mac, _addr_align, _peer_type) \
+({	typeof(peer_info) _peer_info = (peer_info); \
+	do {								\
+		(_peer_info)->vdev_id = (_vdev_id);			\
+		(_peer_info)->mac_addr = (_peer_mac);			\
+		(_peer_info)->mac_addr_is_aligned = (_addr_align);	\
+		(_peer_info)->peer_type = (_peer_type);			\
+	} while (0); })
+
 /**
  * @enum vdev_host_stats_id:
  * host stats update from CDP have to set one of the following stats ID
@@ -705,7 +715,8 @@ cdp_peer_delete(ol_txrx_soc_handle soc, uint8_t vdev_id,
 	    !soc->ops->cmn_drv_ops->txrx_peer_delete)
 		return;
 
-	soc->ops->cmn_drv_ops->txrx_peer_delete(soc, vdev_id, peer_mac, bitmap);
+	soc->ops->cmn_drv_ops->txrx_peer_delete(soc, vdev_id, peer_mac,
+						bitmap, CDP_LINK_PEER_TYPE);
 }
 
 #ifdef DP_RX_UDP_OVER_PEER_ROAM

+ 17 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -403,11 +403,13 @@ enum htt_cmn_t2h_en_stats_status {
  * @CDP_INVALID_PEER_TYPE: invalid peer type
  * @CDP_LINK_PEER_TYPE: legacy peer or link peer for MLO connection
  * @CDP_MLD_PEER_TYPE: MLD peer for MLO connection
+ * @CDP_WILD_PEER_TYPE: used to set peer type for same mld/link mac addr
  */
 enum cdp_peer_type {
 	CDP_INVALID_PEER_TYPE,
 	CDP_LINK_PEER_TYPE,
 	CDP_MLD_PEER_TYPE,
+	CDP_WILD_PEER_TYPE,
 };
 
 /**
@@ -424,6 +426,21 @@ struct cdp_peer_setup_info {
 	uint8_t primary_umac_id;
 };
 
+/**
+ * struct cdp_peer_info: peer info for dp hash find
+ * @vdev_id: Vdev ID
+ * @mac_addr: peer mac address to search
+ * @mac_addr_is_aligned: true only if mac_addr type is
+			"union dp_align_mac_addr", otherwise set false always.
+ * @peer_type: link or MLD peer type
+ */
+struct cdp_peer_info {
+	uint8_t vdev_id;
+	uint8_t *mac_addr;
+	bool mac_addr_is_aligned;
+	enum cdp_peer_type peer_type;
+};
+
 /**
  * struct ol_txrx_peer_state - Peer state information
  */

+ 2 - 1
dp/inc/cdp_txrx_ops.h

@@ -266,7 +266,8 @@ struct cdp_cmn_ops {
 
 	QDF_STATUS
 	(*txrx_peer_delete)(struct cdp_soc_t *soc, uint8_t vdev_id,
-			    uint8_t *peer_mac, uint32_t bitmap);
+			    uint8_t *peer_mac, uint32_t bitmap,
+			    enum cdp_peer_type peer_type);
 
 	QDF_STATUS (*txrx_set_monitor_mode)(struct cdp_soc_t *soc,
 					    uint8_t vdev_id,

+ 46 - 17
dp/wifi3.0/dp_main.c

@@ -239,7 +239,8 @@ static inline QDF_STATUS dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl,
 					      enum cdp_peer_type peer_type);
 static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
 				       uint8_t vdev_id,
-				       uint8_t *peer_mac, uint32_t bitmap);
+				       uint8_t *peer_mac, uint32_t bitmap,
+				       enum cdp_peer_type peer_type);
 static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
 				bool unmap_only);
 #ifdef ENABLE_VERBOSE_DEBUG
@@ -6978,6 +6979,20 @@ static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc_hdl,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+void dp_peer_delete(struct dp_soc *soc,
+		    struct dp_peer *peer,
+		    void *arg)
+{
+	if (!peer->valid)
+		return;
+
+	dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
+			     peer->vdev->vdev_id,
+			     peer->mac_addr.raw, 0,
+			     peer->peer_type);
+}
+#else
 void dp_peer_delete(struct dp_soc *soc,
 		    struct dp_peer *peer,
 		    void *arg)
@@ -6987,8 +7002,10 @@ void dp_peer_delete(struct dp_soc *soc,
 
 	dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
 			     peer->vdev->vdev_id,
-			     peer->mac_addr.raw, 0);
+			     peer->mac_addr.raw, 0,
+			     CDP_LINK_PEER_TYPE);
 }
+#endif
 
 /**
  * dp_vdev_flush_peers() - Forcibily Flush peers of vdev
@@ -7126,7 +7143,8 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 		qdf_spin_unlock_bh(&soc->ast_lock);
 
 		dp_peer_delete_wifi3((struct cdp_soc_t *)soc, vdev->vdev_id,
-				     vap_self_peer->mac_addr.raw, 0);
+				     vap_self_peer->mac_addr.raw, 0,
+				     CDP_LINK_PEER_TYPE);
 		dp_peer_unref_delete(vap_self_peer, DP_MOD_ID_CONFIG);
 	}
 
@@ -7272,6 +7290,12 @@ static inline void dp_peer_ast_handle_roam_del(struct dp_soc *soc,
 
 	qdf_spin_unlock_bh(&soc->ast_lock);
 }
+#else
+static inline void dp_peer_ast_handle_roam_del(struct dp_soc *soc,
+					       struct dp_pdev *pdev,
+					       uint8_t *peer_mac_addr)
+{
+}
 #endif
 
 #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
@@ -7632,12 +7656,12 @@ QDF_STATUS dp_peer_mlo_setup(
 	if (!setup_info || !setup_info->mld_peer_mac)
 		return QDF_STATUS_SUCCESS;
 
-	/* To do: remove this check if link/mld peer mac_addr allow to same */
-	if (!qdf_mem_cmp(setup_info->mld_peer_mac, peer->mac_addr.raw,
-			 QDF_MAC_ADDR_SIZE)) {
-		dp_peer_err("Same mac addres for link/mld peer");
-		return QDF_STATUS_E_FAILURE;
-	}
+	dp_info("link peer:" QDF_MAC_ADDR_FMT "mld peer:" QDF_MAC_ADDR_FMT
+		"assoc_link %d, primary_link %d",
+		QDF_MAC_ADDR_REF(peer->mac_addr.raw),
+		QDF_MAC_ADDR_REF(setup_info->mld_peer_mac),
+		setup_info->is_first_link,
+		setup_info->is_primary_link);
 
 	/* if this is the first link peer */
 	if (setup_info->is_first_link)
@@ -7649,9 +7673,9 @@ QDF_STATUS dp_peer_mlo_setup(
 
 	peer->first_link = setup_info->is_first_link;
 	peer->primary_link = setup_info->is_primary_link;
-	mld_peer = dp_peer_find_hash_find(soc,
-					  setup_info->mld_peer_mac,
-					  0, vdev_id, DP_MOD_ID_CDP);
+	mld_peer = dp_mld_peer_find_hash_find(soc,
+					      setup_info->mld_peer_mac,
+					      0, vdev_id, DP_MOD_ID_CDP);
 	if (mld_peer) {
 		if (setup_info->is_first_link) {
 			/* assign rx_tid to mld peer */
@@ -8450,23 +8474,28 @@ void dp_txrx_peer_unref_delete(dp_txrx_ref_handle handle,
 qdf_export_symbol(dp_txrx_peer_unref_delete);
 
 /*
- * dp_peer_detach_wifi3() – Detach txrx peer
+ * dp_peer_delete_wifi3() – Delete txrx peer
  * @soc_hdl: soc handle
  * @vdev_id: id of dp handle
  * @peer_mac: mac of datapath PEER handle
  * @bitmap: bitmap indicating special handling of request.
+ * @peer_type: peer type (link or MLD)
  *
  */
 static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
 				       uint8_t vdev_id,
-				       uint8_t *peer_mac, uint32_t bitmap)
+				       uint8_t *peer_mac, uint32_t bitmap,
+				       enum cdp_peer_type peer_type)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac,
-						      0, vdev_id,
-						      DP_MOD_ID_CDP);
+	struct dp_peer *peer;
+	struct cdp_peer_info peer_info = { 0 };
 	struct dp_vdev *vdev = NULL;
 
+	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac,
+				 false, peer_type);
+	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
+
 	/* Peer can be null for monitor vap mac address */
 	if (!peer) {
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,

+ 184 - 186
dp/wifi3.0/dp_peer.c

@@ -365,6 +365,59 @@ dp_peer_find_hash_index(struct dp_soc *soc,
 	return index;
 }
 
+/*
+ * dp_peer_find_hash_find() - returns legacy or mlo link peer from
+ *			      peer_hash_table matching vdev_id and mac_address
+ * @soc: soc handle
+ * @peer_mac_addr: peer mac address
+ * @mac_addr_is_aligned: is mac addr alligned
+ * @vdev_id: vdev_id
+ * @mod_id: id of module requesting reference
+ *
+ * return: peer in sucsess
+ *         NULL in failure
+ */
+struct dp_peer *dp_peer_find_hash_find(
+				struct dp_soc *soc, uint8_t *peer_mac_addr,
+				int mac_addr_is_aligned, uint8_t vdev_id,
+				enum dp_mod_id mod_id)
+{
+	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
+	uint32_t index;
+	struct dp_peer *peer;
+
+	if (!soc->peer_hash.bins)
+		return NULL;
+
+	if (mac_addr_is_aligned) {
+		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
+	} else {
+		qdf_mem_copy(
+			&local_mac_addr_aligned.raw[0],
+			peer_mac_addr, QDF_MAC_ADDR_SIZE);
+		mac_addr = &local_mac_addr_aligned;
+	}
+	index = dp_peer_find_hash_index(soc, mac_addr);
+	qdf_spin_lock_bh(&soc->peer_hash_lock);
+	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
+		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
+		    ((peer->vdev->vdev_id == vdev_id) ||
+		     (vdev_id == DP_VDEV_ALL))) {
+			/* take peer reference before returning */
+			if (dp_peer_get_ref(soc, peer, mod_id) !=
+						QDF_STATUS_SUCCESS)
+				peer = NULL;
+
+			qdf_spin_unlock_bh(&soc->peer_hash_lock);
+			return peer;
+		}
+	}
+	qdf_spin_unlock_bh(&soc->peer_hash_lock);
+	return NULL; /* failure */
+}
+
+qdf_export_symbol(dp_peer_find_hash_find);
+
 #ifdef WLAN_FEATURE_11BE_MLO
 /*
  * dp_peer_find_hash_detach() - cleanup memory for peer_hash table
@@ -466,66 +519,6 @@ void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer)
 	}
 }
 
-/*
- * dp_peer_find_hash_find() - returns peer from peer_hash_table matching
- *                            vdev_id and mac_address
- * @soc: soc handle
- * @peer_mac_addr: peer mac address
- * @mac_addr_is_aligned: is mac addr alligned
- * @vdev_id: vdev_id
- * @mod_id: id of module requesting reference
- *
- * return: peer in sucsess
- *         NULL in failure
- */
-struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
-				       uint8_t *peer_mac_addr,
-				       int mac_addr_is_aligned,
-				       uint8_t vdev_id,
-				       enum dp_mod_id mod_id)
-{
-	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
-	unsigned index;
-	struct dp_peer *peer;
-
-	if (!soc->peer_hash.bins)
-		return NULL;
-
-	if (mac_addr_is_aligned) {
-		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
-	} else {
-		qdf_mem_copy(
-			&local_mac_addr_aligned.raw[0],
-			peer_mac_addr, QDF_MAC_ADDR_SIZE);
-		mac_addr = &local_mac_addr_aligned;
-	}
-	/* search link peer table firstly */
-	index = dp_peer_find_hash_index(soc, mac_addr);
-	qdf_spin_lock_bh(&soc->peer_hash_lock);
-	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
-		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
-		    ((peer->vdev->vdev_id == vdev_id) ||
-		     (vdev_id == DP_VDEV_ALL))) {
-			/* take peer reference before returning */
-			if (dp_peer_get_ref(soc, peer, mod_id) !=
-						QDF_STATUS_SUCCESS)
-				peer = NULL;
-
-			qdf_spin_unlock_bh(&soc->peer_hash_lock);
-			return peer;
-		}
-	}
-	qdf_spin_unlock_bh(&soc->peer_hash_lock);
-
-	if (soc->arch_ops.mlo_peer_find_hash_find)
-		return soc->arch_ops.mlo_peer_find_hash_find(soc, peer_mac_addr,
-							     mac_addr_is_aligned,
-							     mod_id, vdev_id);
-	return NULL;
-}
-
-qdf_export_symbol(dp_peer_find_hash_find);
-
 /*
  * dp_peer_find_hash_remove() - remove peer from peer_hash_table
  * @soc: soc handle
@@ -566,48 +559,6 @@ void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer)
 		dp_err("unknown peer type %d", peer->peer_type);
 	}
 }
-
-/*
- * dp_peer_exist_on_pdev - check if peer with mac address exist on pdev
- *
- * @soc: Datapath SOC handle
- * @peer_mac_addr: peer mac address
- * @mac_addr_is_aligned: is mac address aligned
- * @pdev: Datapath PDEV handle
- *
- * Return: true if peer found else return false
- */
-static bool dp_peer_exist_on_pdev(struct dp_soc *soc,
-				  uint8_t *peer_mac_addr,
-				  int mac_addr_is_aligned,
-				  struct dp_pdev *pdev)
-{
-	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
-	unsigned int index;
-	struct dp_peer *peer;
-	bool found = false;
-
-	if (mac_addr_is_aligned) {
-		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
-	} else {
-		qdf_mem_copy(
-			&local_mac_addr_aligned.raw[0],
-			peer_mac_addr, QDF_MAC_ADDR_SIZE);
-		mac_addr = &local_mac_addr_aligned;
-	}
-	index = dp_peer_find_hash_index(soc, mac_addr);
-	qdf_spin_lock_bh(&soc->peer_hash_lock);
-	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
-		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
-		    (peer->vdev->pdev == pdev)) {
-			found = true;
-			break;
-		}
-	}
-	qdf_spin_unlock_bh(&soc->peer_hash_lock);
-
-	return found;
-}
 #else
 static QDF_STATUS dp_peer_find_hash_attach(struct dp_soc *soc)
 {
@@ -670,47 +621,6 @@ void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer)
 	qdf_spin_unlock_bh(&soc->peer_hash_lock);
 }
 
-struct dp_peer *dp_peer_find_hash_find(
-				struct dp_soc *soc, uint8_t *peer_mac_addr,
-				int mac_addr_is_aligned, uint8_t vdev_id,
-				enum dp_mod_id mod_id)
-{
-	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
-	unsigned index;
-	struct dp_peer *peer;
-
-	if (!soc->peer_hash.bins)
-		return NULL;
-
-	if (mac_addr_is_aligned) {
-		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
-	} else {
-		qdf_mem_copy(
-			&local_mac_addr_aligned.raw[0],
-			peer_mac_addr, QDF_MAC_ADDR_SIZE);
-		mac_addr = &local_mac_addr_aligned;
-	}
-	index = dp_peer_find_hash_index(soc, mac_addr);
-	qdf_spin_lock_bh(&soc->peer_hash_lock);
-	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
-		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
-		    ((peer->vdev->vdev_id == vdev_id) ||
-		     (vdev_id == DP_VDEV_ALL))) {
-			/* take peer reference before returning */
-			if (dp_peer_get_ref(soc, peer, mod_id) !=
-						QDF_STATUS_SUCCESS)
-				peer = NULL;
-
-			qdf_spin_unlock_bh(&soc->peer_hash_lock);
-			return peer;
-		}
-	}
-	qdf_spin_unlock_bh(&soc->peer_hash_lock);
-	return NULL; /* failure */
-}
-
-qdf_export_symbol(dp_peer_find_hash_find);
-
 void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer)
 {
 	unsigned index;
@@ -735,36 +645,7 @@ void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer)
 	qdf_spin_unlock_bh(&soc->peer_hash_lock);
 }
 
-static bool dp_peer_exist_on_pdev(struct dp_soc *soc,
-				  uint8_t *peer_mac_addr,
-				  int mac_addr_is_aligned,
-				  struct dp_pdev *pdev)
-{
-	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
-	unsigned int index;
-	struct dp_peer *peer;
-	bool found = false;
 
-	if (mac_addr_is_aligned) {
-		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
-	} else {
-		qdf_mem_copy(
-			&local_mac_addr_aligned.raw[0],
-			peer_mac_addr, QDF_MAC_ADDR_SIZE);
-		mac_addr = &local_mac_addr_aligned;
-	}
-	index = dp_peer_find_hash_index(soc, mac_addr);
-	qdf_spin_lock_bh(&soc->peer_hash_lock);
-	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
-		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
-		    (peer->vdev->pdev == pdev)) {
-			found = true;
-			break;
-		}
-	}
-	qdf_spin_unlock_bh(&soc->peer_hash_lock);
-	return found;
-}
 #endif/* WLAN_FEATURE_11BE_MLO */
 
 /*
@@ -1145,6 +1026,93 @@ void dp_peer_mec_hash_detach(struct dp_soc *soc)
 #endif
 
 #ifdef FEATURE_AST
+#ifdef WLAN_FEATURE_11BE_MLO
+/*
+ * dp_peer_exist_on_pdev - check if peer with mac address exist on pdev
+ *
+ * @soc: Datapath SOC handle
+ * @peer_mac_addr: peer mac address
+ * @mac_addr_is_aligned: is mac address aligned
+ * @pdev: Datapath PDEV handle
+ *
+ * Return: true if peer found else return false
+ */
+static bool dp_peer_exist_on_pdev(struct dp_soc *soc,
+				  uint8_t *peer_mac_addr,
+				  int mac_addr_is_aligned,
+				  struct dp_pdev *pdev)
+{
+	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
+	unsigned int index;
+	struct dp_peer *peer;
+	bool found = false;
+
+	if (mac_addr_is_aligned) {
+		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
+	} else {
+		qdf_mem_copy(
+			&local_mac_addr_aligned.raw[0],
+			peer_mac_addr, QDF_MAC_ADDR_SIZE);
+		mac_addr = &local_mac_addr_aligned;
+	}
+	index = dp_peer_find_hash_index(soc, mac_addr);
+	qdf_spin_lock_bh(&soc->peer_hash_lock);
+	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
+		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
+		    (peer->vdev->pdev == pdev)) {
+			found = true;
+			break;
+		}
+	}
+	qdf_spin_unlock_bh(&soc->peer_hash_lock);
+
+	if (found)
+		return found;
+
+	peer = dp_mld_peer_find_hash_find(soc, peer_mac_addr,
+					  mac_addr_is_aligned, DP_VDEV_ALL,
+					  DP_MOD_ID_CDP);
+	if (peer) {
+		if (peer->vdev->pdev == pdev)
+			found = true;
+		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
+	}
+
+	return found;
+}
+#else
+static bool dp_peer_exist_on_pdev(struct dp_soc *soc,
+				  uint8_t *peer_mac_addr,
+				  int mac_addr_is_aligned,
+				  struct dp_pdev *pdev)
+{
+	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
+	unsigned int index;
+	struct dp_peer *peer;
+	bool found = false;
+
+	if (mac_addr_is_aligned) {
+		mac_addr = (union dp_align_mac_addr *)peer_mac_addr;
+	} else {
+		qdf_mem_copy(
+			&local_mac_addr_aligned.raw[0],
+			peer_mac_addr, QDF_MAC_ADDR_SIZE);
+		mac_addr = &local_mac_addr_aligned;
+	}
+	index = dp_peer_find_hash_index(soc, mac_addr);
+	qdf_spin_lock_bh(&soc->peer_hash_lock);
+	TAILQ_FOREACH(peer, &soc->peer_hash.bins[index], hash_list_elem) {
+		if (dp_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) == 0 &&
+		    (peer->vdev->pdev == pdev)) {
+			found = true;
+			break;
+		}
+	}
+	qdf_spin_unlock_bh(&soc->peer_hash_lock);
+	return found;
+}
+#endif /* WLAN_FEATURE_11BE_MLO */
+
 /*
  * dp_peer_ast_hash_attach() - Allocate and initialize AST Hash Table
  * @soc: SoC handle
@@ -2251,6 +2219,29 @@ void dp_peer_ast_set_type(struct dp_soc *soc,
 	ast_entry->type = type;
 }
 #else
+void dp_peer_free_ast_entry(struct dp_soc *soc,
+			    struct dp_ast_entry *ast_entry)
+{
+}
+
+void dp_peer_unlink_ast_entry(struct dp_soc *soc,
+			      struct dp_ast_entry *ast_entry,
+			      struct dp_peer *peer)
+{
+}
+
+void dp_peer_ast_hash_remove(struct dp_soc *soc,
+			     struct dp_ast_entry *ase)
+{
+}
+
+struct dp_ast_entry *dp_peer_ast_hash_find_by_vdevid(struct dp_soc *soc,
+						     uint8_t *ast_mac_addr,
+						     uint8_t vdev_id)
+{
+	return NULL;
+}
+
 QDF_STATUS dp_peer_add_ast(struct dp_soc *soc,
 			   struct dp_peer *peer,
 			   uint8_t *mac_addr,
@@ -2320,12 +2311,6 @@ uint8_t dp_peer_ast_get_next_hop(struct dp_soc *soc,
 {
 	return 0xff;
 }
-
-int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
-		       struct dp_ast_entry *ast_entry, uint32_t flags)
-{
-	return 1;
-}
 #endif
 
 void dp_peer_ast_send_wds_del(struct dp_soc *soc,
@@ -2822,20 +2807,23 @@ void dp_peer_rx_reo_shared_qaddr_delete(struct dp_soc *soc,
  * @peer_id: peer id to be mapped
  * @hw_peer_id: HW ast index
  * @vdev_id: vdev_id
+ * @peer_type: peer type (link or MLD)
  *
  * return: peer in success
  *         NULL in failure
  */
 static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
 	uint8_t *peer_mac_addr, uint16_t peer_id, uint16_t hw_peer_id,
-	uint8_t vdev_id)
+	uint8_t vdev_id, enum cdp_peer_type peer_type)
 {
 	struct dp_peer *peer;
+	struct cdp_peer_info peer_info = { 0 };
 
 	QDF_ASSERT(peer_id <= soc->max_peer_id);
 	/* check if there's already a peer object with this MAC address */
-	peer = dp_peer_find_hash_find(soc, peer_mac_addr,
-		0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG);
+	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac_addr,
+				 false, peer_type);
+	peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CONFIG);
 	dp_peer_err("%pK: peer %pK ID %d vid %d mac " QDF_MAC_ADDR_FMT,
 		    soc, peer, peer_id, vdev_id,
 		    QDF_MAC_ADDR_REF(peer_mac_addr));
@@ -2925,7 +2913,7 @@ dp_rx_mlo_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
 	}
 
 	peer = dp_peer_find_add_id(soc, peer_mac_addr, ml_peer_id,
-				   hw_peer_id, vdev_id);
+				   hw_peer_id, vdev_id, CDP_MLD_PEER_TYPE);
 
 	if (peer) {
 		if (wlan_op_mode_sta == peer->vdev->opmode &&
@@ -3079,7 +3067,8 @@ dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
 		}
 
 		peer = dp_peer_find_add_id(soc, peer_mac_addr, peer_id,
-					   hw_peer_id, vdev_id);
+					   hw_peer_id, vdev_id,
+					   CDP_LINK_PEER_TYPE);
 
 		if (peer) {
 			vdev = peer->vdev;
@@ -5582,14 +5571,23 @@ int dp_get_peer_state(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 {
 	enum ol_txrx_peer_state peer_state;
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_peer *peer =  dp_peer_find_hash_find(soc, peer_mac, 0,
-						       vdev_id, DP_MOD_ID_CDP);
+	struct cdp_peer_info peer_info = { 0 };
+	struct dp_peer *peer;
+	struct dp_peer *tgt_peer;
+
+	DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac,
+				 false, CDP_WILD_PEER_TYPE);
+
+	peer =  dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
 
 	if (!peer)
 		return OL_TXRX_PEER_STATE_INVALID;
 
 	DP_TRACE(DEBUG, "peer %pK stats %d", peer, peer->state);
-	peer_state = peer->state;
+
+	tgt_peer = dp_get_tgt_peer_from_peer(peer);
+	peer_state = tgt_peer->state;
+
 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
 
 	return peer_state;

+ 77 - 2
dp/wifi3.0/dp_peer.h

@@ -1221,6 +1221,68 @@ dp_link_peer_hash_find_by_chip_id(struct dp_soc *soc,
 }
 #endif
 
+/*
+ * dp_mld_peer_find_hash_find() - returns mld peer from mld peer_hash_table
+ *				  matching mac_address
+ * @soc: soc handle
+ * @peer_mac_addr: mld peer mac address
+ * @mac_addr_is_aligned: is mac addr alligned
+ * @vdev_id: vdev_id
+ * @mod_id: id of module requesting reference
+ *
+ * return: peer in sucsess
+ *         NULL in failure
+ */
+static inline
+struct dp_peer *dp_mld_peer_find_hash_find(struct dp_soc *soc,
+					   uint8_t *peer_mac_addr,
+					   int mac_addr_is_aligned,
+					   uint8_t vdev_id,
+					   enum dp_mod_id mod_id)
+{
+	if (soc->arch_ops.mlo_peer_find_hash_find)
+		return soc->arch_ops.mlo_peer_find_hash_find(soc,
+					      peer_mac_addr,
+					      mac_addr_is_aligned,
+					      mod_id, vdev_id);
+	return NULL;
+}
+
+/**
+ * dp_peer_hash_find_wrapper() - find link peer or mld per according to
+				 peer_type
+ * @soc: DP SOC handle
+ * @peer_info: peer information for hash find
+ * @mod_id: ID of module requesting reference
+ *
+ * Return: peer hanlde
+ */
+static inline
+struct dp_peer *dp_peer_hash_find_wrapper(struct dp_soc *soc,
+					  struct cdp_peer_info *peer_info,
+					  enum dp_mod_id mod_id)
+{
+	struct dp_peer *peer = NULL;
+
+	if (peer_info->peer_type == CDP_LINK_PEER_TYPE ||
+	    peer_info->peer_type == CDP_WILD_PEER_TYPE) {
+		peer = dp_peer_find_hash_find(soc, peer_info->mac_addr,
+					      peer_info->mac_addr_is_aligned,
+					      peer_info->vdev_id,
+					      mod_id);
+		if (peer)
+			return peer;
+	}
+	if (peer_info->peer_type == CDP_MLD_PEER_TYPE ||
+	    peer_info->peer_type == CDP_WILD_PEER_TYPE)
+		peer = dp_mld_peer_find_hash_find(
+					soc, peer_info->mac_addr,
+					peer_info->mac_addr_is_aligned,
+					peer_info->vdev_id,
+					mod_id);
+	return peer;
+}
+
 /**
  * dp_link_peer_add_mld_peer() - add mld peer pointer to link peer,
 				 increase mld peer ref_cnt
@@ -1471,8 +1533,7 @@ uint16_t dp_get_link_peer_id_by_lmac_id(struct dp_soc *soc, uint16_t peer_id,
 }
 
 /**
- * dp_peer_get_tgt_peer_hash_find() - get MLD dp_peer handle
-				   for processing
+ * dp_peer_get_tgt_peer_hash_find() - get dp_peer handle
  * @soc: soc handle
  * @peer_mac_addr: peer mac address
  * @mac_addr_is_aligned: is mac addr alligned
@@ -1513,6 +1574,9 @@ struct dp_peer *dp_peer_get_tgt_peer_hash_find(struct dp_soc *soc,
 		/* mlo MLD peer or non-mlo link peer */
 			ta_peer = peer;
 		}
+	} else {
+		dp_peer_err("fail to find peer:" QDF_MAC_ADDR_FMT,
+			    QDF_MAC_ADDR_REF(peer_mac));
 	}
 
 	return ta_peer;
@@ -1736,6 +1800,17 @@ dp_tgt_txrx_peer_get_ref_by_id(struct dp_soc *soc,
 #define IS_MLO_DP_MLD_PEER(_peer) false
 #define DP_GET_MLD_PEER_FROM_PEER(link_peer) NULL
 
+static inline
+struct dp_peer *dp_peer_hash_find_wrapper(struct dp_soc *soc,
+					  struct cdp_peer_info *peer_info,
+					  enum dp_mod_id mod_id)
+{
+	return dp_peer_find_hash_find(soc, peer_info->mac_addr,
+				      peer_info->mac_addr_is_aligned,
+				      peer_info->vdev_id,
+				      mod_id);
+}
+
 static inline
 struct dp_peer *dp_peer_get_tgt_peer_hash_find(struct dp_soc *soc,
 					       uint8_t *peer_mac,

+ 0 - 1
dp/wifi3.0/dp_types.h

@@ -4082,7 +4082,6 @@ struct dp_peer {
 	enum cdp_peer_type peer_type;
 	/*---------for link peer---------*/
 	struct dp_peer *mld_peer;
-
 	/*---------for mld peer----------*/
 	struct dp_peer_link_info link_peers[DP_MAX_MLO_LINKS];
 	uint8_t num_links;