diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 88ad7c07fd..222a4f914a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3985,11 +3985,39 @@ void dp_peer_delete(struct dp_soc *soc, #endif #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) +static uint8_t +dp_mlo_get_num_link_peer(struct dp_soc *soc, struct dp_peer *peer) +{ + struct dp_peer *mld_peer = NULL; + struct dp_mld_link_peers link_peers_info = {0}; + uint8_t num_link = 0; + + if (IS_MLO_DP_LINK_PEER(peer)) + mld_peer = DP_GET_MLD_PEER_FROM_PEER(peer); + + if (IS_MLO_DP_MLD_PEER(peer)) + mld_peer = peer; + + if (!mld_peer) + return 0; + + /* get link peers with reference */ + dp_get_link_peers_ref_from_mld_peer(soc, mld_peer, &link_peers_info, + DP_MOD_ID_CDP); + num_link = link_peers_info.num_links; + dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP); + return num_link; +} + void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg) { if (!peer->valid) return; + /* skip deleting the SLO peers */ + if (dp_mlo_get_num_link_peer(soc, peer) == 1) + return; + if (IS_MLO_DP_LINK_PEER(peer)) dp_peer_delete_wifi3((struct cdp_soc_t *)soc, peer->vdev->vdev_id, @@ -4033,6 +4061,12 @@ static void dp_mlo_link_peer_flush(struct dp_soc *soc, struct dp_peer *peer) dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP); } #else +static uint8_t +dp_mlo_get_num_link_peer(struct dp_soc *soc, struct dp_peer *peer) +{ + return 0; +} + void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg) { } @@ -4097,6 +4131,12 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap", QDF_MAC_ADDR_REF(peer->mac_addr.raw)); + /* skip deleting the SLO peers */ + if (dp_mlo_get_num_link_peer(soc, peer) == 1) { + dp_peer_unref_delete(peer, DP_MOD_ID_CDP); + continue; + } + dp_mlo_link_peer_flush(soc, peer); dp_rx_peer_unmap_handler(soc, i, vdev->vdev_id, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 90f0ee5826..1bf2f197c2 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -694,6 +694,7 @@ void dp_peer_find_id_to_obj_remove(struct dp_soc *soc, qdf_spin_lock_bh(&soc->peer_map_lock); peer = soc->peer_id_to_obj_map[peer_id]; if (!peer) { + dp_err("unable to get peer during peer id obj map remove"); qdf_spin_unlock_bh(&soc->peer_map_lock); return; }