diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index f17f93c2c5e6..70df6204d96a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -3802,6 +3802,7 @@ void dp_peer_unref_delete(void *peer_handle) struct dp_peer *tmppeer; int found = 0; uint16_t peer_id; + uint16_t vdev_id; /* * Hold the lock all the way from checking if the peer ref count @@ -3819,6 +3820,7 @@ void dp_peer_unref_delete(void *peer_handle) peer, qdf_atomic_read(&peer->ref_cnt)); if (qdf_atomic_dec_and_test(&peer->ref_cnt)) { peer_id = peer->peer_ids[0]; + vdev_id = vdev->vdev_id; /* * Make sure that the reference to the peer in @@ -3875,9 +3877,9 @@ void dp_peer_unref_delete(void *peer_handle) " - its last peer is done"), vdev, vdev->mac_addr.raw); /* all peers are gone, go ahead and delete it */ - dp_tx_flow_pool_unmap_handler(pdev, vdev->vdev_id, + dp_tx_flow_pool_unmap_handler(pdev, vdev_id, FLOW_TYPE_VDEV, - vdev->vdev_id); + vdev_id); dp_tx_vdev_detach(vdev); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, @@ -3885,6 +3887,7 @@ void dp_peer_unref_delete(void *peer_handle) vdev, vdev->mac_addr.raw); qdf_mem_free(vdev); + vdev = NULL; if (vdev_delete_cb) vdev_delete_cb(vdev_delete_context); } @@ -3892,21 +3895,30 @@ void dp_peer_unref_delete(void *peer_handle) qdf_spin_unlock_bh(&soc->peer_ref_mutex); } + if (vdev) { + if (vdev->vap_bss_peer == peer) { + vdev->vap_bss_peer = NULL; + } + } + if (soc->cdp_soc.ol_ops->peer_unref_delete) { soc->cdp_soc.ol_ops->peer_unref_delete(pdev->osif_pdev, - vdev->vdev_id, peer->mac_addr.raw); + vdev_id, peer->mac_addr.raw); } + + if (!vdev || !vdev->vap_bss_peer) { + goto free_peer; + } + #ifdef notyet qdf_mempool_free(soc->osdev, soc->mempool_ol_ath_peer, peer); #else - if (!vdev || !vdev->vap_bss_peer) - goto free_peer; - bss_peer = vdev->vap_bss_peer; DP_UPDATE_STATS(bss_peer, peer); free_peer: qdf_mem_free(peer); + #endif } else { qdf_spin_unlock_bh(&soc->peer_ref_mutex);