diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 4e55eb2e6cfd..746cf6d50415 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -505,15 +505,32 @@ int dp_peer_add_ast(struct dp_soc *soc, uint32_t flags) { struct dp_ast_entry *ast_entry; - struct dp_vdev *vdev = peer->vdev; + struct dp_vdev *vdev = NULL; struct dp_pdev *pdev = NULL; uint8_t next_node_mac[6]; + bool peer_ref_cnt = false; int ret = -1; + if (peer->delete_in_progress) + return 0; + + if (type != CDP_TXRX_AST_TYPE_STATIC && + type != CDP_TXRX_AST_TYPE_SELF) { + peer_ref_cnt = true; + qdf_spin_lock_bh(&soc->peer_ref_mutex); + qdf_atomic_inc(&peer->ref_cnt); + qdf_spin_unlock_bh(&soc->peer_ref_mutex); + } + + vdev = peer->vdev; if (!vdev) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("Peers vdev is NULL")); QDF_ASSERT(0); + /*Handling case when assert is disabled*/ + if (peer_ref_cnt) + dp_peer_unref_delete(peer); + return ret; } @@ -545,6 +562,8 @@ int dp_peer_add_ast(struct dp_soc *soc, pdev->pdev_id); if (ast_entry) { qdf_spin_unlock_bh(&soc->ast_lock); + if (peer_ref_cnt) + dp_peer_unref_delete(peer); return 0; } } else { @@ -565,6 +584,8 @@ int dp_peer_add_ast(struct dp_soc *soc, dp_peer_del_ast(soc, ast_entry); } qdf_spin_unlock_bh(&soc->ast_lock); + if (peer_ref_cnt) + dp_peer_unref_delete(peer); return 0; } } @@ -575,6 +596,8 @@ add_ast_entry: if (!ast_entry) { qdf_spin_unlock_bh(&soc->ast_lock); + if (peer_ref_cnt) + dp_peer_unref_delete(peer); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("fail to allocate ast_entry")); QDF_ASSERT(0); @@ -647,9 +670,14 @@ add_ast_entry: mac_addr, next_node_mac, flags)) + if (peer_ref_cnt) + dp_peer_unref_delete(peer); return 0; } + if (peer_ref_cnt) + dp_peer_unref_delete(peer); + return ret; }