Procházet zdrojové kódy

qcacmn: Add VDEV refcount debug support

Add debug support for VDEV refcount to take
refcount by module id and decrement corresponding
refcount with same module id

Change-Id: I15c075816994ba70155fefbc0bce208b20fb9a59
Chaithanya Garrepalli před 4 roky
rodič
revize
ddc9e59e8f

+ 11 - 6
dp/wifi3.0/dp_htt.c

@@ -2414,12 +2414,13 @@ static void dp_process_ppdu_stats_user_common_tlv(
 
 	/* returning earlier causes other feilds unpopulated */
 	if (peer_id == DP_SCAN_PEER_ID) {
-		vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id);
+		vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id,
+					     DP_MOD_ID_TX_PPDU_STATS);
 		if (!vdev)
 			return;
 		qdf_mem_copy(ppdu_user_desc->mac_addr, vdev->mac_addr.raw,
 			     QDF_MAC_ADDR_SIZE);
-		dp_vdev_unref_delete(pdev->soc, vdev);
+		dp_vdev_unref_delete(pdev->soc, vdev, DP_MOD_ID_TX_PPDU_STATS);
 	} else {
 		peer = dp_peer_get_ref_by_id(pdev->soc, peer_id,
 					     DP_MOD_ID_TX_PPDU_STATS);
@@ -2432,12 +2433,14 @@ static void dp_process_ppdu_stats_user_common_tlv(
 			 * peer's peer_id but it was removed
 			 */
 			vdev = dp_vdev_get_ref_by_id(pdev->soc,
-						     ppdu_desc->vdev_id);
+						     ppdu_desc->vdev_id,
+						     DP_MOD_ID_TX_PPDU_STATS);
 			if (!vdev)
 				return;
 			qdf_mem_copy(ppdu_user_desc->mac_addr,
 				     vdev->mac_addr.raw, QDF_MAC_ADDR_SIZE);
-			dp_vdev_unref_delete(pdev->soc, vdev);
+			dp_vdev_unref_delete(pdev->soc, vdev,
+					     DP_MOD_ID_TX_PPDU_STATS);
 			return;
 		}
 		qdf_mem_copy(ppdu_user_desc->mac_addr,
@@ -2477,10 +2480,12 @@ static void dp_process_ppdu_stats_user_rate_tlv(struct dp_pdev *pdev,
 	ppdu_user_desc = &ppdu_desc->user[curr_user_index];
 	ppdu_user_desc->tlv_bitmap |= (1 << tlv_type);
 	if (peer_id == DP_SCAN_PEER_ID) {
-		vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id);
+		vdev = dp_vdev_get_ref_by_id(pdev->soc, ppdu_desc->vdev_id,
+					     DP_MOD_ID_TX_PPDU_STATS);
 		if (!vdev)
 			return;
-		dp_vdev_unref_delete(pdev->soc, vdev);
+		dp_vdev_unref_delete(pdev->soc, vdev,
+				     DP_MOD_ID_TX_PPDU_STATS);
 	}
 	ppdu_user_desc->peer_id = peer_id;
 

+ 12 - 5
dp/wifi3.0/dp_internal.h

@@ -956,7 +956,8 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
 				uint16_t peer_id);
 void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
 				   uint16_t peer_id);
-void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev);
+void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
+			  enum dp_mod_id mod_id);
 /*
  * dp_peer_ppdu_delayed_ba_init() Initialize ppdu in peer
  * @peer: Datapath peer
@@ -981,7 +982,7 @@ extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
 					      uint8_t *peer_mac_addr,
 					      int mac_addr_is_aligned,
 					      uint8_t vdev_id,
-					      enum dp_peer_mod_id id);
+					      enum dp_mod_id id);
 
 #ifdef DP_PEER_EXTENDED_API
 /**
@@ -2132,16 +2133,20 @@ void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev)
  *
  * @soc		: core DP soc context
  * @vdev	: DP vdev
+ * @mod_id	: module id
  *
  * Return:	QDF_STATUS_SUCCESS if reference held successfully
  *		else QDF_STATUS_E_INVAL
  */
 static inline
-QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev)
+QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev,
+			   enum dp_mod_id mod_id)
 {
 	if (!qdf_atomic_inc_not_zero(&vdev->ref_cnt))
 		return QDF_STATUS_E_INVAL;
 
+	qdf_atomic_inc(&vdev->mod_refs[mod_id]);
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -2149,11 +2154,13 @@ QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev)
  * dp_vdev_get_ref_by_id() - Returns vdev object given the vdev id
  * @soc: core DP soc context
  * @vdev_id: vdev id from vdev object can be retrieved
+ * @mod_id: module id which is requesting the reference
  *
  * Return: struct dp_vdev*: Pointer to DP vdev object
  */
 static inline struct dp_vdev *
-dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id)
+dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id,
+		      enum dp_mod_id mod_id)
 {
 	struct dp_vdev *vdev = NULL;
 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
@@ -2162,7 +2169,7 @@ dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id)
 	qdf_spin_lock_bh(&soc->vdev_map_lock);
 	vdev = soc->vdev_id_map[vdev_id];
 
-	if (!vdev || dp_vdev_get_ref(soc, vdev) != QDF_STATUS_SUCCESS) {
+	if (!vdev || dp_vdev_get_ref(soc, vdev, mod_id) != QDF_STATUS_SUCCESS) {
 		qdf_spin_unlock_bh(&soc->vdev_map_lock);
 		return NULL;
 	}

+ 3 - 2
dp/wifi3.0/dp_ipa.c

@@ -1786,7 +1786,8 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf, bool *fwd_success)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_IPA);
 	struct dp_pdev *pdev;
 	struct dp_peer *da_peer;
 	struct dp_peer *sa_peer;
@@ -1862,7 +1863,7 @@ bool dp_ipa_rx_intrabss_fwd(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 
 	status = true;
 out:
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_IPA);
 	return status;
 }
 

+ 196 - 104
dp/wifi3.0/dp_main.c

@@ -735,7 +735,8 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
 	struct dp_ast_entry *ast_entry = NULL;
 	struct dp_peer *peer;
 	struct dp_pdev *pdev;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
@@ -747,7 +748,7 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
 					      0, vdev->vdev_id,
 					      DP_MOD_ID_CDP);
 		if (!peer) {
-			dp_vdev_unref_delete(soc, vdev);
+			dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 			return QDF_STATUS_E_FAILURE;
 		}
 
@@ -768,7 +769,7 @@ static QDF_STATUS dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
 		qdf_spin_unlock_bh(&soc->ast_lock);
 	}
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -4340,6 +4341,46 @@ static void dp_soc_reset_txrx_ring_map(struct dp_soc *soc)
 		soc->tx_ring_map[i] = 0;
 }
 
+/*
+ * dp_soc_print_inactive_objects() - prints inactive peer and vdev list
+ * @soc: DP SOC handle
+ *
+ */
+static void dp_soc_print_inactive_objects(struct dp_soc *soc)
+{
+	struct dp_peer *peer = NULL;
+	struct dp_peer *tmp_peer = NULL;
+	struct dp_vdev *vdev = NULL;
+	struct dp_vdev *tmp_vdev = NULL;
+	int i = 0;
+	uint32_t count;
+
+	if (TAILQ_EMPTY(&soc->inactive_peer_list) &&
+	    TAILQ_EMPTY(&soc->inactive_vdev_list))
+		return;
+
+	TAILQ_FOREACH_SAFE(peer, &soc->inactive_peer_list,
+			   inactive_list_elem, tmp_peer) {
+		for (i = 0; i < DP_MOD_ID_MAX; i++) {
+			count = qdf_atomic_read(&peer->mod_refs[i]);
+			if (count)
+				DP_PRINT_STATS("peer %pK Module id %u ==> %u",
+					       peer, i, count);
+		}
+	}
+
+	TAILQ_FOREACH_SAFE(vdev, &soc->inactive_vdev_list,
+			   inactive_list_elem, tmp_vdev) {
+		for (i = 0; i < DP_MOD_ID_MAX; i++) {
+			count = qdf_atomic_read(&vdev->mod_refs[i]);
+			if (count)
+				DP_PRINT_STATS("vdev %pK Module id %u ==> %u",
+					       vdev, i, count);
+		}
+	}
+	QDF_BUG(0);
+}
+
 /**
  * dp_soc_deinit() - Deinitialize txrx SOC
  * @txrx_soc: Opaque DP SOC handle
@@ -4388,8 +4429,10 @@ static void dp_soc_deinit(void *txrx_soc)
 	dp_soc_srng_deinit(soc);
 
 	dp_hw_link_desc_ring_deinit(soc);
-	QDF_ASSERT(TAILQ_EMPTY(&soc->inactive_peer_list));
+
+	dp_soc_print_inactive_objects(soc);
 	qdf_spinlock_destroy(&soc->inactive_peer_list_lock);
+	qdf_spinlock_destroy(&soc->inactive_vdev_list_lock);
 
 	htt_soc_htc_dealloc(soc->htt_handle);
 
@@ -4952,7 +4995,7 @@ static void dp_vdev_id_map_tbl_add(struct dp_soc *soc,
 
 	qdf_spin_lock_bh(&soc->vdev_map_lock);
 
-	if (dp_vdev_get_ref(soc, vdev) !=
+	if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CONFIG) !=
 			QDF_STATUS_SUCCESS) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			  "unable to get vdev reference at MAP vdev %pK vdev_id %u",
@@ -4983,7 +5026,7 @@ static void dp_vdev_id_map_tbl_remove(struct dp_soc *soc,
 	QDF_ASSERT(soc->vdev_id_map[vdev->vdev_id] == vdev);
 
 	soc->vdev_id_map[vdev->vdev_id] = NULL;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG);
 	qdf_spin_unlock_bh(&soc->vdev_map_lock);
 }
 
@@ -5000,7 +5043,7 @@ static void dp_vdev_pdev_list_add(struct dp_soc *soc,
 				  struct dp_vdev *vdev)
 {
 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
-	if (dp_vdev_get_ref(soc, vdev) !=
+	if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CONFIG) !=
 			QDF_STATUS_SUCCESS) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			  "unable to get vdev reference at MAP vdev %pK",
@@ -5038,7 +5081,7 @@ static void dp_vdev_pdev_list_remove(struct dp_soc *soc,
 
 	if (found) {
 		TAILQ_REMOVE(&pdev->vdev_list, vdev, vdev_list_elem);
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG);
 	} else {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "vdev:%pK not found in pdev:%pK vdevlist:%pK",
@@ -5070,6 +5113,7 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
 		dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc,
 						   pdev_id);
 	struct dp_vdev *vdev = qdf_mem_malloc(sizeof(*vdev));
+	int i = 0;
 
 	if (!pdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
@@ -5106,8 +5150,12 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc,
 	vdev->sec_type = cdp_sec_type_none;
 	vdev->multipass_en = false;
 	qdf_atomic_init(&vdev->ref_cnt);
+	for (i = 0; i < DP_MOD_ID_MAX; i++)
+		qdf_atomic_init(&vdev->mod_refs[i]);
+
 	/* Take one reference for create*/
 	qdf_atomic_inc(&vdev->ref_cnt);
+	qdf_atomic_inc(&vdev->mod_refs[DP_MOD_ID_CONFIG]);
 	vdev->num_peers = 0;
 #ifdef notyet
 	vdev->filters_num = 0;
@@ -5190,8 +5238,8 @@ static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc_hdl,
 					 struct ol_txrx_ops *txrx_ops)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev =	dp_vdev_get_ref_by_id(soc, vdev_id,
+						      DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
@@ -5230,7 +5278,7 @@ static QDF_STATUS dp_vdev_register_wifi3(struct cdp_soc_t *soc_hdl,
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_LOW,
 		"DP Vdev Register success");
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -5318,7 +5366,8 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 	struct dp_neighbour_peer *peer = NULL;
 	struct dp_neighbour_peer *temp_peer = NULL;
 	struct dp_peer *vap_self_peer = NULL;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
@@ -5326,7 +5375,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 	pdev = vdev->pdev;
 
 	vap_self_peer = dp_sta_vdev_self_peer_ref_n_get(soc, vdev,
-							DP_MOD_ID_PEER_CONFIG);
+							DP_MOD_ID_CONFIG);
 	if (vap_self_peer) {
 		qdf_spin_lock_bh(&soc->ast_lock);
 		if (vap_self_peer->self_ast_entry) {
@@ -5337,7 +5386,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 
 		dp_peer_delete_wifi3((struct cdp_soc_t *)soc, vdev->vdev_id,
 				     vap_self_peer->mac_addr.raw, 0);
-		dp_peer_unref_delete(vap_self_peer, DP_MOD_ID_PEER_CONFIG);
+		dp_peer_unref_delete(vap_self_peer, DP_MOD_ID_CONFIG);
 	}
 
 	/*
@@ -5388,11 +5437,16 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
 	if (vdev->opmode != wlan_op_mode_monitor)
 		dp_vdev_pdev_list_remove(soc, pdev, vdev);
 
+	/* release reference taken above for find */
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
+
+	qdf_spin_lock_bh(&soc->inactive_vdev_list_lock);
+	TAILQ_INSERT_TAIL(&soc->inactive_vdev_list, vdev, inactive_list_elem);
+	qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
+
 	/* release reference taken at dp_vdev_create */
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CONFIG);
 
-	/* release reference taken above for find */
-	dp_vdev_unref_delete(soc, vdev);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -5428,14 +5482,14 @@ static inline struct dp_peer *dp_peer_can_reuse(struct dp_vdev *vdev,
 
 	peer = dp_peer_find_hash_find(vdev->pdev->soc, peer_mac_addr,
 				      0, vdev->vdev_id,
-				      DP_MOD_ID_PEER_CONFIG);
+				      DP_MOD_ID_CONFIG);
 	if (!peer)
 		return NULL;
 
 	if (peer->bss_peer)
 		return peer;
 
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 	return NULL;
 }
 #else
@@ -5446,14 +5500,14 @@ static inline struct dp_peer *dp_peer_can_reuse(struct dp_vdev *vdev,
 
 	peer = dp_peer_find_hash_find(vdev->pdev->soc, peer_mac_addr,
 				      0, vdev->vdev_id,
-				      DP_MOD_ID_PEER_CONFIG);
+				      DP_MOD_ID_CONFIG);
 	if (!peer)
 		return NULL;
 
 	if (peer->bss_peer && (peer->vdev->vdev_id == vdev->vdev_id))
 		return peer;
 
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 	return NULL;
 }
 #endif
@@ -5515,7 +5569,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	if (!peer_mac_addr)
 		return QDF_STATUS_E_FAILURE;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
@@ -5567,7 +5621,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 
 		dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT);
 
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return QDF_STATUS_SUCCESS;
 	} else {
 		/*
@@ -5591,7 +5645,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			  soc->ctrl_psoc,
 			  WLAN_MD_DP_PEER, "dp_peer");
 	if (!peer) {
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return QDF_STATUS_E_FAILURE; /* failure */
 	}
 
@@ -5602,7 +5656,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	/* store provided params */
 	peer->vdev = vdev;
 	/* get the vdev reference for new peer */
-	dp_vdev_get_ref(soc, vdev);
+	dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CHILD);
 
 	if ((vdev->opmode == wlan_op_mode_sta) &&
 	    !qdf_mem_cmp(peer_mac_addr, &vdev->mac_addr.raw[0],
@@ -5630,7 +5684,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 
 	/* keep one reference for attach */
 	qdf_atomic_inc(&peer->ref_cnt);
-	qdf_atomic_inc(&peer->mod_refs[DP_MOD_ID_PEER_CONFIG]);
+	qdf_atomic_inc(&peer->mod_refs[DP_MOD_ID_CONFIG]);
 
 	dp_peer_vdev_list_add(soc, vdev, peer);
 
@@ -5707,7 +5761,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 
 	dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT);
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -6080,7 +6134,8 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl,
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 	struct dp_pdev *pdev;
 	struct dp_neighbour_peer *peer = NULL;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev || !macaddr)
 		goto fail0;
@@ -6160,12 +6215,12 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl,
 
 		qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
 	}
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return 1;
 
 fail0:
 	if (vdev)
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return 0;
 }
 #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */
@@ -6302,14 +6357,20 @@ dp_peer_authorize(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
  * dp_vdev_unref_delete() - check and process vdev delete
  * @soc : DP specific soc pointer
  * @vdev: DP specific vdev pointer
+ * @mod_id: module id
  *
  */
-void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev)
+void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
+			  enum dp_mod_id mod_id)
 {
 	ol_txrx_vdev_delete_cb vdev_delete_cb = NULL;
 	void *vdev_delete_context = NULL;
 	uint8_t vdev_id = vdev->vdev_id;
 	struct dp_pdev *pdev = vdev->pdev;
+	struct dp_vdev *tmp_vdev = NULL;
+	uint8_t found = 0;
+
+	QDF_ASSERT(qdf_atomic_dec_return(&vdev->mod_refs[mod_id]) >= 0);
 
 	/* Return if this is not the last reference*/
 	if (!qdf_atomic_dec_and_test(&vdev->ref_cnt))
@@ -6342,6 +6403,21 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev)
 
 free_vdev:
 	qdf_spinlock_destroy(&vdev->peer_list_lock);
+
+	qdf_spin_lock_bh(&soc->inactive_vdev_list_lock);
+	TAILQ_FOREACH(tmp_vdev, &soc->inactive_vdev_list,
+		      inactive_list_elem) {
+		if (tmp_vdev == vdev) {
+			found = 1;
+			break;
+		}
+	}
+	if (found)
+		TAILQ_REMOVE(&soc->inactive_vdev_list, vdev,
+			     inactive_list_elem);
+	/* delete this peer from the list */
+	qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
+
 	dp_info("deleting vdev object %pK (%pM)",
 		vdev, vdev->mac_addr.raw);
 	wlan_minidump_remove(vdev);
@@ -6358,7 +6434,7 @@ free_vdev:
  * @mod_id:         ID of module releasing reference
  *
  */
-void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id mod_id)
+void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id mod_id)
 {
 	struct dp_vdev *vdev = peer->vdev;
 	struct dp_pdev *pdev = vdev->pdev;
@@ -6436,7 +6512,7 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id mod_id)
 		/*
 		 * Decrement ref count taken at peer create
 		 */
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CHILD);
 	}
 }
 
@@ -6513,7 +6589,7 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
 	 * PEER_UNMAP message arrives to remove the other
 	 * reference, added by the PEER_MAP message.
 	 */
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 	/*
 	 * Remove the reference taken above
 	 */
@@ -6534,14 +6610,15 @@ static uint8 *dp_get_vdev_mac_addr_wifi3(struct cdp_soc_t *soc_hdl,
 					 uint8_t vdev_id)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	uint8_t *mac = NULL;
 
 	if (!vdev)
 		return NULL;
 
 	mac = vdev->mac_addr.raw;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return mac;
 }
@@ -6559,13 +6636,14 @@ static int dp_vdev_set_wds(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id);
+		dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id,
+				      DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
 
 	vdev->wds_enabled = val;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -6592,7 +6670,8 @@ static uint8_t dp_get_mon_vdev_from_pdev_wifi3(struct cdp_soc_t *soc_hdl,
 static int dp_get_opmode(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	int opmode;
 
 	if (!vdev) {
@@ -6600,7 +6679,7 @@ static int dp_get_opmode(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 		return -EINVAL;
 	}
 	opmode = vdev->opmode;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return opmode;
 }
@@ -6621,14 +6700,15 @@ void dp_get_os_rx_handles_from_vdev_wifi3(struct cdp_soc_t *soc_hdl,
 					  ol_osif_vdev_handle *osif_vdev_p)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return;
 
 	*stack_fn_p = vdev->osif_rx_stack;
 	*osif_vdev_p = vdev->osif_vdev;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 /**
@@ -6643,14 +6723,15 @@ static struct cdp_cfg *dp_get_ctrl_pdev_from_vdev_wifi3(
 						uint8_t vdev_id)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	struct dp_pdev *pdev;
 
 	if (!vdev)
 		return NULL;
 
 	pdev = vdev->pdev;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return pdev ? (struct cdp_cfg *)pdev->wlan_cfg_ctx : NULL;
 }
 
@@ -6809,8 +6890,8 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl,
 	struct dp_pdev *pdev;
 	uint32_t num_entries;
 	struct dp_srng *mon_buf_ring;
-	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	if (!vdev)
@@ -6878,7 +6959,7 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *soc_hdl,
 	}
 
 fail:
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return status;
 }
 
@@ -7062,13 +7143,13 @@ static void dp_enable_vdev_peer_protocol_count(struct cdp_soc_t *soc_hdl,
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_vdev *vdev;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev)
 		return;
 
 	dp_info("enable %d vdev_id %d", enable, vdev_id);
 	vdev->peer_protocol_count_track = enable;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 static void dp_enable_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl,
@@ -7078,13 +7159,13 @@ static void dp_enable_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl,
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_vdev *vdev;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev)
 		return;
 
 	dp_info("drop_mask %d vdev_id %d", drop_mask, vdev_id);
 	vdev->peer_protocol_count_dropmask = drop_mask;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl,
@@ -7094,7 +7175,7 @@ static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl,
 	struct dp_vdev *vdev;
 	int peer_protocol_count_track;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev)
 		return 0;
 
@@ -7103,7 +7184,7 @@ static int dp_is_vdev_peer_protocol_count_enabled(struct cdp_soc_t *soc_hdl,
 	peer_protocol_count_track =
 		vdev->peer_protocol_count_track;
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return peer_protocol_count_track;
 }
 
@@ -7114,7 +7195,7 @@ static int dp_get_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl,
 	struct dp_vdev *vdev;
 	int peer_protocol_count_dropmask;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev)
 		return 0;
 
@@ -7123,7 +7204,7 @@ static int dp_get_vdev_peer_protocol_drop_mask(struct cdp_soc_t *soc_hdl,
 	peer_protocol_count_dropmask =
 		vdev->peer_protocol_count_dropmask;
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return peer_protocol_count_dropmask;
 }
 
@@ -7354,12 +7435,12 @@ static QDF_STATUS dp_get_device_stats(struct cdp_soc_t *soc_hdl, uint8_t id,
 
 	switch (type) {
 	case UPDATE_VDEV_STATS:
-		vdev = dp_vdev_get_ref_by_id(soc, id);
+		vdev = dp_vdev_get_ref_by_id(soc, id, DP_MOD_ID_CDP);
 
 		if (vdev) {
 			status = dp_vdev_getstats((struct cdp_vdev *)vdev,
 						  stats);
-			dp_vdev_unref_delete(soc, vdev);
+			dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		}
 		return status;
 	case UPDATE_PDEV_STATS:
@@ -8340,22 +8421,18 @@ dp_calculate_delay_stats(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 			 qdf_nbuf_t nbuf)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_SUCCESS;
 
-	if (vdev->pdev->delay_stats_flag) {
+	if (vdev->pdev->delay_stats_flag)
 		dp_rx_compute_delay(vdev, nbuf);
-	} else {
-		/*
-		 * Update the per peer delay stats
-		 */
+	else
 		dp_rx_update_peer_delay_stats(soc, nbuf);
 
-	}
-
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -8373,7 +8450,8 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 				    cdp_config_param_type *val)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
@@ -8392,11 +8470,11 @@ static QDF_STATUS dp_get_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			  "param value %d is wrong\n",
 			  param);
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -8415,7 +8493,7 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 {
 	struct dp_soc *dsoc = (struct dp_soc *)cdp_soc;
 	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id(dsoc, vdev_id);
+		dp_vdev_get_ref_by_id(dsoc, vdev_id, DP_MOD_ID_CDP);
 	uint32_t var = 0;
 
 	if (!vdev)
@@ -8505,7 +8583,7 @@ dp_set_vdev_param(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
 	}
 
 	dp_tx_vdev_update_search_flags((struct dp_vdev *)vdev);
-	dp_vdev_unref_delete(dsoc, vdev);
+	dp_vdev_unref_delete(dsoc, vdev, DP_MOD_ID_CDP);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -8652,15 +8730,16 @@ dp_peer_update_pkt_capture_params(ol_txrx_soc_handle soc,
  *
  * Return: QDF_STATUS
  */
-static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle soc,
+static QDF_STATUS dp_set_vdev_dscp_tid_map_wifi3(ol_txrx_soc_handle cdp_soc,
 						 uint8_t vdev_id,
 						 uint8_t map_id)
 {
-	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id);
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(cdp_soc);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	if (vdev) {
 		vdev->dscp_tid_map_id = map_id;
-		dp_vdev_unref_delete((struct dp_soc *)soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return QDF_STATUS_SUCCESS;
 	}
 
@@ -8757,7 +8836,8 @@ static QDF_STATUS dp_txrx_update_vdev_host_stats(struct cdp_soc_t *soc_hdl,
 						 uint16_t stats_id)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
@@ -8776,7 +8856,7 @@ static QDF_STATUS dp_txrx_update_vdev_host_stats(struct cdp_soc_t *soc_hdl,
 		break;
 	}
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -8927,7 +9007,8 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct cdp_vdev_stats *vdev_stats;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return 1;
@@ -8940,7 +9021,7 @@ static int dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		qdf_mem_copy(vdev_stats, &vdev->stats, sizeof(vdev->stats));
 	}
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return 0;
 }
 
@@ -9112,7 +9193,8 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle,
 	int fw_stats;
 	enum cdp_stats stats;
 	int num_stats;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	QDF_STATUS status = QDF_STATUS_E_INVAL;
 
 	if (!vdev || !req) {
@@ -9169,7 +9251,7 @@ QDF_STATUS dp_txrx_stats_request(struct cdp_soc_t *soc_handle,
 				"Wrong Input for TxRx Stats");
 fail0:
 	if (vdev)
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return status;
 }
 
@@ -9393,7 +9475,8 @@ dp_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		       ol_txrx_data_tx_cb callback, void *ctxt)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return;
@@ -9401,7 +9484,7 @@ dp_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	vdev->tx_non_std_data_callback.func = callback;
 	vdev->tx_non_std_data_callback.ctxt = ctxt;
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 /**
@@ -9451,16 +9534,19 @@ dp_pdev_set_dp_txrx_handle(struct cdp_soc_t *soc, uint8_t pdev_id,
  *
  * Return: opaque pointer to dp txrx handle
  */
-static void *dp_vdev_get_dp_ext_handle(ol_txrx_soc_handle soc, uint8_t vdev_id)
+static void *dp_vdev_get_dp_ext_handle(ol_txrx_soc_handle soc_hdl,
+				       uint8_t vdev_id)
 {
-	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id((struct dp_soc *)soc, vdev_id);
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	void *dp_ext_handle;
 
 	if (!vdev)
 		return NULL;
 	dp_ext_handle = vdev->vdev_dp_ext_handle;
 
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return dp_ext_handle;
 }
 
@@ -9477,7 +9563,8 @@ dp_vdev_set_dp_ext_handle(ol_txrx_soc_handle soc_hdl, uint8_t vdev_id,
 			  uint16_t size)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	void *dp_ext_handle;
 
 	if (!vdev)
@@ -9486,13 +9573,13 @@ dp_vdev_set_dp_ext_handle(ol_txrx_soc_handle soc_hdl, uint8_t vdev_id,
 	dp_ext_handle = qdf_mem_malloc(size);
 
 	if (!dp_ext_handle) {
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return QDF_STATUS_E_FAILURE;
 	}
 
 	vdev->vdev_dp_ext_handle = dp_ext_handle;
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -9698,7 +9785,8 @@ static QDF_STATUS  dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl,
 					      uint8_t *rssi)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	struct dp_pdev *pdev;
 	struct dp_neighbour_peer *peer = NULL;
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
@@ -9719,7 +9807,7 @@ static QDF_STATUS  dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl,
 		}
 	}
 	qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex);
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return status;
 }
 
@@ -9731,8 +9819,8 @@ dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc,
 		       uint8_t chan_num)
 {
 	struct dp_soc *soc = (struct dp_soc *)cdp_soc;
-	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	struct dp_pdev *pdev;
 
 	if (!vdev)
@@ -9759,7 +9847,7 @@ dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc,
 			(soc->ctrl_psoc, pdev->pdev_id,
 			 vdev->vdev_id, cmd, bssid, client_macaddr);
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 #endif
@@ -10195,14 +10283,15 @@ static QDF_STATUS dp_set_vdev_pcp_tid_map_wifi3(struct cdp_soc_t *soc_hdl,
 						uint8_t pcp, uint8_t tid)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev)
 		return QDF_STATUS_E_FAILURE;
 
 	vdev->pcp_tid_map[pcp] = tid;
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -10536,8 +10625,8 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl,
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct cdp_vdev_stats *vdev_stats = NULL;
 	uint32_t tx_success;
-	struct dp_vdev *vdev =
-		(struct dp_vdev *)dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
@@ -10549,7 +10638,7 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl,
 	if (!vdev_stats) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			  "DP alloc failure - unable to get alloc vdev stats");
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 		return 0;
 	}
 
@@ -10558,7 +10647,7 @@ static uint32_t dp_tx_get_success_ack_stats(struct cdp_soc_t *soc_hdl,
 	tx_success = vdev_stats->tx.tx_success.num;
 	qdf_mem_free(vdev_stats);
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 	return tx_success;
 }
 
@@ -10751,7 +10840,8 @@ static QDF_STATUS
 dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	struct dp_peer *peer = NULL;
 	QDF_STATUS status;
 	struct dp_req_rx_hw_stats_t *rx_hw_stats;
@@ -10825,7 +10915,7 @@ out:
 	if (peer)
 		dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
 	if (vdev)
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return status;
 }
@@ -11413,6 +11503,8 @@ void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle,
 
 	TAILQ_INIT(&soc->inactive_peer_list);
 	qdf_spinlock_create(&soc->inactive_peer_list_lock);
+	TAILQ_INIT(&soc->inactive_vdev_list);
+	qdf_spinlock_create(&soc->inactive_vdev_list_lock);
 	qdf_spinlock_create(&soc->htt_stats.lock);
 	/* initialize work queue for stats processing */
 	qdf_create_work(0, &soc->htt_stats.work, htt_t2h_stats_handler, soc);
@@ -12069,7 +12161,7 @@ uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id,
 {
 	struct dp_soc *dp_soc = (struct dp_soc *)soc;
 	struct dp_vdev *vdev =
-		dp_vdev_get_ref_by_id(dp_soc, vdev_id);
+		dp_vdev_get_ref_by_id(dp_soc, vdev_id, DP_MOD_ID_CDP);
 	struct dp_peer *peer;
 	uint16_t new_mac_cnt = 0;
 
@@ -12086,7 +12178,7 @@ uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id,
 		}
 	}
 	qdf_spin_unlock_bh(&vdev->peer_list_lock);
-	dp_vdev_unref_delete(dp_soc, vdev);
+	dp_vdev_unref_delete(dp_soc, vdev, DP_MOD_ID_CDP);
 	return new_mac_cnt;
 }
 

+ 14 - 14
dp/wifi3.0/dp_peer.c

@@ -244,7 +244,7 @@ void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer)
 	index = dp_peer_find_hash_index(soc, &peer->mac_addr);
 	qdf_spin_lock_bh(&soc->peer_hash_lock);
 
-	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) !=
+	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) !=
 			QDF_STATUS_SUCCESS) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			  "unable to get peer reference at MAP mac %pM",
@@ -277,7 +277,7 @@ void dp_peer_vdev_list_add(struct dp_soc *soc, struct dp_vdev *vdev,
 			   struct dp_peer *peer)
 {
 	qdf_spin_lock_bh(&vdev->peer_list_lock);
-	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) !=
+	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) !=
 			QDF_STATUS_SUCCESS) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			  "unable to get peer reference at MAP mac %pM",
@@ -321,7 +321,7 @@ void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev,
 	if (found) {
 		TAILQ_REMOVE(&peer->vdev->peer_list, peer,
 			     peer_list_elem);
-		dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+		dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 		vdev->num_peers--;
 	} else {
 		/*Ignoring the remove operation as peer not found*/
@@ -348,7 +348,7 @@ void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
 
 	qdf_spin_lock_bh(&soc->peer_map_lock);
 
-	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_PEER_CONFIG) !=
+	if (dp_peer_get_ref(soc, peer, DP_MOD_ID_CONFIG) !=
 			QDF_STATUS_SUCCESS) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
 			  "unable to get peer reference at MAP mac %pM peer_id %u",
@@ -385,7 +385,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];
 	soc->peer_id_to_obj_map[peer_id] = NULL;
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 	qdf_spin_unlock_bh(&soc->peer_map_lock);
 }
 
@@ -1659,7 +1659,7 @@ static int dp_peer_ast_free_entry_by_mac(struct dp_soc *soc,
  */
 struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
 	uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id,
-	enum dp_peer_mod_id mod_id)
+	enum dp_mod_id mod_id)
 {
 	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
 	unsigned index;
@@ -1719,7 +1719,7 @@ void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer)
 	QDF_ASSERT(found);
 	TAILQ_REMOVE(&soc->peer_hash.bins[index], peer, hash_list_elem);
 
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 	qdf_spin_unlock_bh(&soc->peer_hash_lock);
 }
 
@@ -1758,9 +1758,9 @@ void dp_peer_find_hash_erase(struct dp_soc *soc)
 				/* incr to one */
 				qdf_atomic_inc(&peer->ref_cnt);
 				qdf_atomic_inc(&peer->mod_refs
-						[DP_MOD_ID_PEER_CONFIG]);
+						[DP_MOD_ID_CONFIG]);
 				dp_peer_unref_delete(peer,
-						     DP_MOD_ID_PEER_CONFIG);
+						     DP_MOD_ID_CONFIG);
 			}
 		}
 	}
@@ -1930,7 +1930,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
 	QDF_ASSERT(peer_id <= soc->max_peers);
 	/* check if there's already a peer object with this MAC address */
 	peer = dp_peer_find_hash_find(soc, peer_mac_addr,
-		0 /* is aligned */, vdev_id, DP_MOD_ID_PEER_CONFIG);
+		0 /* is aligned */, vdev_id, DP_MOD_ID_CONFIG);
 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 		  "%s: peer %pK ID %d vid %d mac %pM",
 		  __func__, peer, peer_id, vdev_id, peer_mac_addr);
@@ -1948,7 +1948,7 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
 		 * is received ignore this event
 		 */
 		if (peer->peer_state == DP_PEER_STATE_LOGICAL_DELETE) {
-			dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+			dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 			dp_alert("Peer %pK[%pM] logical delete state vid %d",
 				 peer, peer_mac_addr, vdev_id);
 			return NULL;
@@ -2147,7 +2147,7 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
 	 * Remove a reference to the peer.
 	 * If there are no more references, delete the peer object.
 	 */
-	dp_peer_unref_delete(peer, DP_MOD_ID_PEER_CONFIG);
+	dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
 }
 
 void
@@ -4264,7 +4264,7 @@ dp_set_michael_key(struct cdp_soc_t *soc,
  */
 struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
 					   struct dp_vdev *vdev,
-					   enum dp_peer_mod_id mod_id)
+					   enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer = NULL;
 
@@ -4298,7 +4298,7 @@ struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
  */
 struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
 						struct dp_vdev *vdev,
-						enum dp_peer_mod_id mod_id)
+						enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer;
 

+ 12 - 12
dp/wifi3.0/dp_peer.h

@@ -28,7 +28,7 @@
 
 typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
 			       void *arg);
-void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id id);
+void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);
 
 /**
  * dp_peer_get_ref() - Returns peer object given the peer id
@@ -43,7 +43,7 @@ void dp_peer_unref_delete(struct dp_peer *peer, enum dp_peer_mod_id id);
 static inline
 QDF_STATUS dp_peer_get_ref(struct dp_soc *soc,
 			   struct dp_peer *peer,
-			   enum dp_peer_mod_id mod_id)
+			   enum dp_mod_id mod_id)
 {
 	if (!qdf_atomic_inc_not_zero(&peer->ref_cnt))
 		return QDF_STATUS_E_INVAL;
@@ -66,7 +66,7 @@ QDF_STATUS dp_peer_get_ref(struct dp_soc *soc,
 static inline struct dp_peer *
 __dp_peer_get_ref_by_id(struct dp_soc *soc,
 			uint16_t peer_id,
-			enum dp_peer_mod_id mod_id)
+			enum dp_mod_id mod_id)
 
 {
 	struct dp_peer *peer;
@@ -97,7 +97,7 @@ __dp_peer_get_ref_by_id(struct dp_soc *soc,
 static inline
 struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc,
 				      uint16_t peer_id,
-				      enum dp_peer_mod_id mod_id)
+				      enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer;
 
@@ -153,7 +153,7 @@ dp_clear_peer_internal(struct dp_soc *soc, struct dp_peer *peer)
  */
 static inline void
 dp_vdev_iterate_peer(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg,
-		     enum dp_peer_mod_id mod_id)
+		     enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer;
 	struct dp_peer *tmp_peer;
@@ -189,7 +189,7 @@ dp_vdev_iterate_peer(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg,
  */
 static inline void
 dp_pdev_iterate_peer(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg,
-		     enum dp_peer_mod_id mod_id)
+		     enum dp_mod_id mod_id)
 {
 	struct dp_vdev *vdev;
 
@@ -214,7 +214,7 @@ dp_pdev_iterate_peer(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg,
  */
 static inline void
 dp_soc_iterate_peer(struct dp_soc *soc, dp_peer_iter_func *func, void *arg,
-		    enum dp_peer_mod_id mod_id)
+		    enum dp_mod_id mod_id)
 {
 	struct dp_pdev *pdev;
 	int i;
@@ -248,7 +248,7 @@ static inline void
 dp_vdev_iterate_peer_lock_safe(struct dp_vdev *vdev,
 			       dp_peer_iter_func *func,
 			       void *arg,
-			       enum dp_peer_mod_id mod_id)
+			       enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer;
 	struct dp_peer *tmp_peer;
@@ -315,7 +315,7 @@ static inline void
 dp_pdev_iterate_peer_lock_safe(struct dp_pdev *pdev,
 			       dp_peer_iter_func *func,
 			       void *arg,
-			       enum dp_peer_mod_id mod_id)
+			       enum dp_mod_id mod_id)
 {
 	struct dp_peer *peer;
 	struct dp_peer *tmp_peer;
@@ -396,7 +396,7 @@ static inline void
 dp_soc_iterate_peer_lock_safe(struct dp_soc *soc,
 			      dp_peer_iter_func *func,
 			      void *arg,
-			      enum dp_peer_mod_id mod_id)
+			      enum dp_mod_id mod_id)
 {
 	struct dp_pdev *pdev;
 	int i;
@@ -748,8 +748,8 @@ static inline void dp_peer_ext_stats_ctx_dealloc(struct dp_soc *soc,
 
 struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
 					   struct dp_vdev *vdev,
-					   enum dp_peer_mod_id mod_id);
+					   enum dp_mod_id mod_id);
 struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
 						struct dp_vdev *vdev,
-						enum dp_peer_mod_id mod_id);
+						enum dp_mod_id mod_id);
 #endif /* _DP_PEER_H_ */

+ 3 - 3
dp/wifi3.0/dp_rx.c

@@ -1876,7 +1876,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
 		goto deliver_fail;
 
 	vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_RX);
 	if (!vdev || vdev->delete.pending || !vdev->osif_rx)
 		goto deliver_fail;
 
@@ -1902,7 +1902,7 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
 		    vdev->osif_rx(vdev->osif_vdev, nbuf))
 			goto deliver_fail;
 		DP_STATS_INC(soc, rx.err.pkt_delivered_no_peer, 1);
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_RX);
 		return;
 	}
 
@@ -1911,7 +1911,7 @@ deliver_fail:
 			 QDF_NBUF_CB_RX_PKT_LEN(nbuf));
 	qdf_nbuf_free(nbuf);
 	if (vdev)
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_RX);
 }
 #else
 static inline

+ 2 - 2
dp/wifi3.0/dp_stats.c

@@ -4347,7 +4347,7 @@ void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_vdev *vdev;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
 	if (!vdev)
 		return;
 
@@ -4355,7 +4355,7 @@ void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
 		dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
 						       is_egress, is_rx);
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
 }
 #endif
 

+ 10 - 8
dp/wifi3.0/dp_tx.c

@@ -2179,7 +2179,8 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	qdf_ether_header_t *eh = NULL;
 	struct dp_tx_msdu_info_s msdu_info;
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_TX_EXCEPTION);
 
 	if (qdf_unlikely(!vdev))
 		goto fail;
@@ -2270,12 +2271,12 @@ dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	nbuf = dp_tx_send_msdu_single(vdev, nbuf, &msdu_info,
 			tx_exc_metadata->peer_id, tx_exc_metadata);
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TX_EXCEPTION);
 	return nbuf;
 
 fail:
 	if (vdev)
-		dp_vdev_unref_delete(soc, vdev);
+		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TX_EXCEPTION);
 	dp_verbose_debug("pkt send failed");
 	return nbuf;
 }
@@ -2310,7 +2311,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		return nbuf;
 	}
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_MESH);
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 				"vdev is NULL for vdev_id %d", vdev_id);
@@ -2334,7 +2335,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		if (!nbuf_clone) {
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 				"qdf_nbuf_clone failed");
-			dp_vdev_unref_delete(soc, vdev);
+			dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
 			return nbuf;
 		}
 		qdf_nbuf_set_tx_ftype(nbuf_clone, CB_FTYPE_MESH_TX_INFO);
@@ -2358,7 +2359,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1);
 	}
 
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_MESH);
 	return nbuf;
 }
 
@@ -4139,7 +4140,8 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			 enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_TDLS);
 
 	if (!vdev) {
 		dp_err("vdev handle for id %d is NULL", vdev_id);
@@ -4148,7 +4150,7 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 
 	if (tx_spec & OL_TX_SPEC_NO_FREE)
 		vdev->is_tdls_frame = true;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_TDLS);
 
 	return dp_tx_send(soc_hdl, vdev_id, msdu_list);
 }

+ 3 - 2
dp/wifi3.0/dp_tx_desc.h

@@ -526,7 +526,8 @@ static inline bool
 dp_tx_desc_thresh_reached(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
 	struct dp_tx_desc_pool_s *pool;
 	bool status;
 
@@ -535,7 +536,7 @@ dp_tx_desc_thresh_reached(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 
 	pool = vdev->pool;
 	status = dp_tx_is_threshold_reached(pool, pool->avail_desc);
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 
 	return status;
 }

+ 8 - 6
dp/wifi3.0/dp_tx_flow_control.c

@@ -342,10 +342,12 @@ int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool,
 		pool->status = FLOW_POOL_INVALID;
 		qdf_spin_unlock_bh(&pool->flow_pool_lock);
 		/* Reset TX desc associated to this Vdev as NULL */
-		vdev = dp_vdev_get_ref_by_id(soc, pool->flow_pool_id);
+		vdev = dp_vdev_get_ref_by_id(soc, pool->flow_pool_id,
+					     DP_MOD_ID_MISC);
 		if (vdev) {
 			dp_tx_desc_flush(vdev->pdev, vdev, false);
-			dp_vdev_unref_delete(soc, vdev);
+			dp_vdev_unref_delete(soc, vdev,
+					     DP_MOD_ID_MISC);
 		}
 		dp_err("avail desc less than pool size");
 		return -EAGAIN;
@@ -372,7 +374,7 @@ static void dp_tx_flow_pool_vdev_map(struct dp_pdev *pdev,
 	struct dp_vdev *vdev;
 	struct dp_soc *soc = pdev->soc;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 		   "%s: invalid vdev_id %d",
@@ -385,7 +387,7 @@ static void dp_tx_flow_pool_vdev_map(struct dp_pdev *pdev,
 	pool->pool_owner_ctx = soc;
 	pool->flow_pool_id = vdev_id;
 	qdf_spin_unlock_bh(&pool->flow_pool_lock);
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 /**
@@ -402,7 +404,7 @@ static void dp_tx_flow_pool_vdev_unmap(struct dp_pdev *pdev,
 	struct dp_vdev *vdev;
 	struct dp_soc *soc = pdev->soc;
 
-	vdev = dp_vdev_get_ref_by_id(soc, vdev_id);
+	vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP);
 	if (!vdev) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 		   "%s: invalid vdev_id %d",
@@ -411,7 +413,7 @@ static void dp_tx_flow_pool_vdev_unmap(struct dp_pdev *pdev,
 	}
 
 	vdev->pool = NULL;
-	dp_vdev_unref_delete(soc, vdev);
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
 }
 
 /**

+ 16 - 4
dp/wifi3.0/dp_types.h

@@ -169,11 +169,12 @@ enum dp_peer_state {
 };
 
 /**
- * enum for modules ids of peer reference
+ * enum for modules ids of
  */
-enum dp_peer_mod_id {
+enum dp_mod_id {
 	DP_MOD_ID_TX_COMP,
 	DP_MOD_ID_RX,
+	DP_MOD_ID_HTT_COMP,
 	DP_MOD_ID_RX_ERR,
 	DP_MOD_ID_TX_PPDU_STATS,
 	DP_MOD_ID_RX_PPDU_STATS,
@@ -182,10 +183,16 @@ enum dp_peer_mod_id {
 	DP_MOD_ID_TX_MULTIPASS,
 	DP_MOD_ID_TX_CAPTURE,
 	DP_MOD_ID_NSS_OFFLOAD,
-	DP_MOD_ID_PEER_CONFIG,
+	DP_MOD_ID_CONFIG,
 	DP_MOD_ID_HTT,
 	DP_MOD_ID_IPA,
 	DP_MOD_ID_AST,
+	DP_MOD_ID_MCAST2UCAST,
+	DP_MOD_ID_CHILD,
+	DP_MOD_ID_MESH,
+	DP_MOD_ID_TX_EXCEPTION,
+	DP_MOD_ID_TDLS,
+	DP_MOD_ID_MISC,
 	DP_MOD_ID_MAX,
 };
 
@@ -1508,6 +1515,8 @@ struct dp_soc {
 	struct dp_last_op_info last_op_info;
 	TAILQ_HEAD(, dp_peer) inactive_peer_list;
 	qdf_spinlock_t inactive_peer_list_lock;
+	TAILQ_HEAD(, dp_vdev) inactive_vdev_list;
+	qdf_spinlock_t inactive_vdev_list_lock;
 	/* lock to protect vdev_id_map table*/
 	qdf_spinlock_t vdev_map_lock;
 };
@@ -2303,6 +2312,9 @@ struct dp_vdev {
 #endif
 	/* callback to collect connectivity stats */
 	ol_txrx_stats_rx_fp stats_cb;
+	uint32_t num_peers;
+	/* entry to inactive_list*/
+	TAILQ_ENTRY(dp_vdev) inactive_list_elem;
 
 #ifdef WLAN_SUPPORT_RX_FISA
 	/**
@@ -2316,7 +2328,7 @@ struct dp_vdev {
 	 * peer is created for VDEV
 	 */
 	qdf_atomic_t ref_cnt;
-	uint32_t num_peers;
+	qdf_atomic_t mod_refs[DP_MOD_ID_MAX];
 };