diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index c064589a37..f6e48a844a 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -773,8 +773,10 @@ void dp_peer_ppdu_delayed_ba_cleanup(struct dp_peer *peer); extern void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer); void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer); -extern void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer); -extern void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer); +void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer, + bool reuse); +void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer, + bool reuse); void dp_peer_unref_delete(struct dp_peer *peer); extern void dp_rx_discard(struct dp_vdev *vdev, struct dp_peer *peer, unsigned tid, qdf_nbuf_t msdu_list); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 48814cd27b..dcc91f1758 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5140,7 +5140,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle, if (peer) { qdf_atomic_init(&peer->is_default_route_set); - dp_peer_cleanup(vdev, peer); + dp_peer_cleanup(vdev, peer, true); qdf_spin_lock_bh(&soc->ast_lock); dp_peer_delete_ast_entries(soc, peer); @@ -5896,7 +5896,7 @@ void dp_peer_unref_delete(struct dp_peer *peer) peer->wlanstats_ctx = NULL; /* cleanup the peer data */ - dp_peer_cleanup(vdev, peer); + dp_peer_cleanup(vdev, peer, false); qdf_spin_unlock_bh(&soc->peer_ref_mutex); dp_reset_and_release_peer_mem(soc, pdev, peer, vdev); qdf_spin_lock_bh(&soc->peer_ref_mutex); diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index de90a0042f..2aa267c96a 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -2263,9 +2263,10 @@ void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer) * dp_peer_rx_cleanup() – Cleanup receive TID state * @vdev: Datapath vdev * @peer: Datapath peer + * @reuse: Peer reference reuse * */ -void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) +void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer, bool reuse) { int tid; uint32_t tid_delete_mask = 0; @@ -2295,8 +2296,9 @@ void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) tid_delete_mask); } #endif - for (tid = 0; tid < DP_MAX_TIDS; tid++) - qdf_spinlock_destroy(&peer->rx_tid[tid].tid_lock); + if (!reuse) + for (tid = 0; tid < DP_MAX_TIDS; tid++) + qdf_spinlock_destroy(&peer->rx_tid[tid].tid_lock); } #ifdef FEATURE_PERPKT_INFO @@ -2329,14 +2331,15 @@ void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) * dp_peer_cleanup() – Cleanup peer information * @vdev: Datapath vdev * @peer: Datapath peer + * @reuse: Peer reference reuse * */ -void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) +void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer, bool reuse) { dp_peer_tx_cleanup(vdev, peer); /* cleanup the Rx reorder queues for this peer */ - dp_peer_rx_cleanup(vdev, peer); + dp_peer_rx_cleanup(vdev, peer, reuse); } /* dp_teardown_256_ba_session() - Teardown sessions using 256