diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 2c250a536b..f0ab60c688 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5199,9 +5199,6 @@ fail0: return QDF_STATUS_E_FAILURE; } - - -#ifdef WLAN_DP_PENDING_MEM_FLUSH /** * dp_pdev_flush_pending_vdevs() - Flush all delete pending vdevs in pdev * @pdev: Datapath PDEV handle @@ -5214,33 +5211,33 @@ fail0: */ static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev) { - struct dp_vdev *vdev = NULL; struct dp_soc *soc = pdev->soc; + struct dp_vdev *vdev_arr[MAX_VDEV_CNT] = {0}; + uint32_t i = 0; + uint32_t num_vdevs = 0; + struct dp_vdev *vdev = NULL; if (TAILQ_EMPTY(&soc->inactive_vdev_list)) return; - while (true) { - qdf_spin_lock_bh(&soc->inactive_vdev_list_lock); - TAILQ_FOREACH(vdev, &soc->inactive_vdev_list, - inactive_list_elem) { - if (vdev->pdev == pdev) - break; - } - qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock); + qdf_spin_lock_bh(&soc->inactive_vdev_list_lock); + TAILQ_FOREACH(vdev, &soc->inactive_vdev_list, + inactive_list_elem) { + if (vdev->pdev != pdev) + continue; - /* vdev will be freed when all peers get cleanup */ - if (vdev) - dp_vdev_flush_peers((struct cdp_vdev *)vdev, 0); - else - break; + vdev_arr[num_vdevs] = vdev; + num_vdevs++; + /* take reference to free */ + dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CDP); + } + qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock); + + for (i = 0; i < num_vdevs; i++) { + dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0); + dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP); } } -#else -static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev) -{ -} -#endif #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT /** @@ -8093,7 +8090,7 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl, dp_peer_vdev_list_remove(soc, vdev, peer); - dp_peer_mlo_delete(soc, peer); + dp_peer_mlo_delete(peer); qdf_spin_lock_bh(&soc->inactive_peer_list_lock); TAILQ_INSERT_TAIL(&soc->inactive_peer_list, peer, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 576da973cb..a8717741e5 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -2523,12 +2523,16 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc, return NULL; } - QDF_ASSERT(peer->peer_id == HTT_INVALID_PEER); - + if (peer->peer_id == HTT_INVALID_PEER) { + dp_monitor_peer_tid_peer_id_update(soc, peer, + peer->peer_id); + } else { + dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG); + QDF_ASSERT(0); + return NULL; + } dp_peer_find_id_to_obj_add(soc, peer, peer_id); dp_mlo_partner_chips_map(soc, peer, peer_id); - dp_monitor_peer_tid_peer_id_update(soc, peer, - peer->peer_id); dp_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE); return peer; diff --git a/dp/wifi3.0/dp_peer.h b/dp/wifi3.0/dp_peer.h index b2ee1e1025..d9b2383b48 100644 --- a/dp/wifi3.0/dp_peer.h +++ b/dp/wifi3.0/dp_peer.h @@ -1398,16 +1398,20 @@ struct dp_peer *dp_peer_get_tgt_peer_by_id(struct dp_soc *soc, /** * dp_peer_mlo_delete() - peer MLO related delete operation - * @soc: Soc handle * @peer: DP peer handle * Return: None */ static inline -void dp_peer_mlo_delete(struct dp_soc *soc, - struct dp_peer *peer) +void dp_peer_mlo_delete(struct dp_peer *peer) { + struct dp_peer *ml_peer; + struct dp_soc *soc; + /* MLO connection link peer */ if (IS_MLO_DP_LINK_PEER(peer)) { + ml_peer = peer->mld_peer; + soc = ml_peer->vdev->pdev->soc; + /* if last link peer deletion, delete MLD peer */ if (dp_mld_peer_del_link_peer(peer->mld_peer, peer) == 0) dp_peer_delete(soc, peer->mld_peer, NULL); @@ -1479,8 +1483,7 @@ void dp_link_peer_del_mld_peer(struct dp_peer *link_peer) } static inline -void dp_peer_mlo_delete(struct dp_soc *soc, - struct dp_peer *peer) +void dp_peer_mlo_delete(struct dp_peer *peer) { }