From 66d580c7999c60843f85075e72e2cf4576a8b310 Mon Sep 17 00:00:00 2001 From: Sai Rupesh Chevuru Date: Tue, 9 May 2023 15:39:20 +0530 Subject: [PATCH] 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 --- dp/wifi3.0/dp_main.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index cff67e7ce9..86d01c2dcc 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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,