Browse Source

qcacmn: cleanup the link peers before ml peer deletion

During the target recovery cleanup the link peers
before ml peer deletion.

Change-Id: I23200a448f7a6a38e4b0e94dc95ea33a0b77eb9d
CRs-Fixed: 3496518
Sai Rupesh Chevuru 2 years ago
parent
commit
66d580c799
1 changed files with 42 additions and 0 deletions
  1. 42 0
      dp/wifi3.0/dp_main.c

+ 42 - 0
dp/wifi3.0/dp_main.c

@@ -3993,10 +3993,50 @@ void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 				     peer->mac_addr.raw, 0,
 				     CDP_LINK_PEER_TYPE);
 }
+
+/**
+ * dp_mlo_link_peer_flush() - flush all the link peers
+ * @soc: Datapath soc handle
+ * @peer: DP peer handle to be checked
+ *
+ * Return: None
+ */
+static void dp_mlo_link_peer_flush(struct dp_soc *soc, struct dp_peer *peer)
+{
+	int cnt = 0;
+	struct dp_peer *link_peer = NULL;
+	struct dp_mld_link_peers link_peers_info = {NULL};
+
+	if (!IS_MLO_DP_MLD_PEER(peer))
+		return;
+
+	/* get link peers with reference */
+	dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info,
+					    DP_MOD_ID_CDP);
+	for (cnt = 0; cnt < link_peers_info.num_links; cnt++) {
+		link_peer = link_peers_info.link_peers[cnt];
+		if (!link_peer)
+			continue;
+
+		/* delete all the link peers */
+		dp_mlo_peer_delete(link_peer->vdev->pdev->soc, link_peer, NULL);
+		/* unmap all the link peers */
+		dp_rx_peer_unmap_handler(link_peer->vdev->pdev->soc,
+					 link_peer->peer_id,
+					 link_peer->vdev->vdev_id,
+					 link_peer->mac_addr.raw, 0,
+					 DP_PEER_WDS_COUNT_INVALID);
+	}
+	dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
+}
 #else
 void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
 {
 }
+
+static void dp_mlo_link_peer_flush(struct dp_soc *soc, struct dp_peer *peer)
+{
+}
 #endif
 /**
  * dp_vdev_flush_peers() - Forcibily Flush peers of vdev
@@ -4053,6 +4093,8 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
 			   IS_MLO_DP_MLD_PEER(peer)) {
 			dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
 				QDF_MAC_ADDR_REF(peer->mac_addr.raw));
+
+			dp_mlo_link_peer_flush(soc, peer);
 			dp_rx_peer_unmap_handler(soc, i,
 						 vdev->vdev_id,
 						 peer->mac_addr.raw, 0,