瀏覽代碼

qcacmn: Add debug support for vdev reference and release

Add function name and line number while taking/releasing
references for vdev to trace Object Manager references

Change-Id: Ie8a7d77db2f3c7b58536ab267c665299cb67152e
Alok Singh 5 年之前
父節點
當前提交
192bbaa088

+ 73 - 15
umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h

@@ -354,13 +354,24 @@ QDF_STATUS wlan_objmgr_trigger_pdev_comp_priv_object_deletion(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug(
+			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, dbgid) \
+		wlan_objmgr_get_vdev_by_id_from_pdev_debug(pdev, \
+		vdev_id, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
- * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id from
- *                                                      pdev
+ * wlan_objmgr_get_vdev_by_id_from_pdev_no_state() - find vdev using id
+ *                                                         from pdev
  * @pdev: PDEV object
  * @vdev_id: vdev id
  * @dbg_id: id of the caller
@@ -374,9 +385,21 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug(
+			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_id_from_pdev_no_state(pdev, \
+	vdev_id, dbgid) \
+		wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug(pdev, \
+		vdev_id, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_macaddr_from_pdev() - find vdev using macaddr
@@ -393,9 +416,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(
+		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *fnc, int ln);
+
+#define wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, macaddr, dbgid) \
+		wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr, \
+		dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
 		wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state() - find vdev using
@@ -413,9 +447,46 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev
+	*wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(
+		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(pdev, macaddr, \
+	dbgid) \
+		wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev, \
+		macaddr, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
 		wlan_objmgr_ref_dbgid dbg_id);
+#endif
+
+/**
+ * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev
+ * @pdev: PDEV object
+ * @dbg_id:   Object Manager ref debug id
+ *
+ * API to get reference to first vdev of pdev.
+ *
+ * Return: reference to first vdev
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev_debug(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line);
+
+#define wlan_objmgr_pdev_get_first_vdev(pdev, dbgid) \
+		wlan_objmgr_pdev_get_first_vdev_debug(pdev, dbgid, \
+		__func__, __LINE__)
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object
@@ -795,19 +866,6 @@ QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
 void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
 						wlan_objmgr_ref_dbgid id);
 
-/**
- * wlan_objmgr_pdev_get_first_vdev() - Get first vdev of pdev
- * @pdev: PDEV object
- * @dbg_id:   Object Manager ref debug id
- *
- * API to get reference to first vdev of pdev.
- *
- * Return: reference to first vdev
- */
-struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
-		struct wlan_objmgr_pdev *pdev,
-		wlan_objmgr_ref_dbgid dbg_id);
-
 /**
  * wlan_objmgr_pdev_get_pdev_id() - get pdev id
  * @pdev: PDEV object

+ 59 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h

@@ -896,10 +896,22 @@ struct wlan_objmgr_pdev *wlan_objmgr_get_pdev_by_macaddr_no_state(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(
+			struct wlan_objmgr_psoc *psoc,
+			enum QDF_OPMODE opmode,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, opmode, dbgid) \
+		wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(psoc, opmode, \
+		dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc(
 			struct wlan_objmgr_psoc *psoc,
 			enum QDF_OPMODE opmode,
 			wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_id_from_psoc() - retrieve vdev by id
@@ -916,9 +928,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_debug(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, dbgid) \
+		wlan_objmgr_get_vdev_by_id_from_psoc_debug(psoc, vdev_id, \
+		dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc(
 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_id_from_psoc_no_state() - retrieve vdev by id
@@ -936,9 +959,20 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_id_from_psoc_no_state(psoc, vdev_id, dbgid) \
+		wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(psoc, \
+		vdev_id, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_macaddr_from_psoc() - retrieve vdev by macaddr
@@ -956,9 +990,21 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(
+		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
+		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_macaddr_from_psoc(psoc, pdev_id, macaddr, \
+	dbgid) \
+		wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(psoc, pdev_id, \
+		macaddr, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc(
 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
 		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state() - retrieve vdev by
@@ -978,9 +1024,22 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc(
  * Return: vdev pointer
  *         NULL on FAILURE
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev
+	*wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(
+		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
+		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line);
+
+#define wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(psoc, pdev_id, \
+	macaddr, dbgid) \
+		wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(psoc, \
+		pdev_id, macaddr, dbgid, __func__, __LINE__)
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(
 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
 		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_psoc_obj_lock() - Acquire PSOC spinlock

+ 112 - 46
umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h

@@ -232,7 +232,6 @@
 /* Invalid VDEV identifier */
 #define WLAN_INVALID_VDEV_ID 255
 
-
 /**
  * struct wlan_vdev_create_params - Create params, HDD/OSIF passes this
  *				    structure While creating VDEV
@@ -576,34 +575,6 @@ static inline struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_head(
 	return vdev;
 }
 
-/**
- * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
- * @pdev: PDEV object
- * @dbg_id: id of the caller
- *
- * API to get the head active vdev of given pdev (of pdev's vdev list)
- *
- * Return:
- */
-struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
-		struct wlan_objmgr_pdev *pdev,
-		wlan_objmgr_ref_dbgid dbg_id);
-
-/**
- * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
- * @vdev: VDEV object
- * @vdev_list: qdf_list_t
- * @dbg_id: id of the caller
- *
- * API to get the head active vdev of given vdev (of pdev's vdev list)
- *
- * Return:
- * @peer: head peer
- */
-struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
-				struct wlan_objmgr_pdev *pdev,
-				qdf_list_t *vdev_list,
-				wlan_objmgr_ref_dbgid dbg_id);
 
 /**
  * wlan_vdev_get_next_vdev_of_pdev() - get next vdev
@@ -637,23 +608,6 @@ static inline struct wlan_objmgr_vdev *wlan_vdev_get_next_vdev_of_pdev(
 	return vdev_next;
 }
 
-/**
- * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
- * @pdev: PDEV object
- * @vdev_list: qdf_list_t
- * @vdev: VDEV object
- * @dbg_id: id of the caller
- *
- * API to get next active vdev object pointer of vdev
- *
- * Return:
- * @vdev_next: VDEV object
- */
-struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
-					struct wlan_objmgr_pdev *pdev,
-					qdf_list_t *vdev_list,
-					struct wlan_objmgr_vdev *vdev,
-					wlan_objmgr_ref_dbgid dbg_id);
 
 
 /**
@@ -1265,8 +1219,17 @@ static inline uint16_t wlan_vdev_get_peer_count(struct wlan_objmgr_vdev *vdev)
  *
  * Return: void
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
+				    wlan_objmgr_ref_dbgid id,
+				    const char *func, int line);
+
+#define wlan_objmgr_vdev_get_ref(vdev, dbgid) \
+		wlan_objmgr_vdev_get_ref_debug(vdev, dbgid, __func__, __LINE__)
+#else
 void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
 				wlan_objmgr_ref_dbgid id);
+#endif
 
 /**
  * wlan_objmgr_vdev_try_get_ref() - increment ref count, if allowed
@@ -1277,8 +1240,18 @@ void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
  *
  * Return: void
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
+					      wlan_objmgr_ref_dbgid id,
+					      const char *func, int line);
+
+#define wlan_objmgr_vdev_try_get_ref(vdev, dbgid) \
+		wlan_objmgr_vdev_try_get_ref_debug(vdev, dbgid, \
+		__func__, __LINE__)
+#else
 QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
 						wlan_objmgr_ref_dbgid id);
+#endif
 
 /**
  * wlan_objmgr_vdev_release_ref() - decrement ref count
@@ -1290,8 +1263,101 @@ QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
  *
  * Return: void
  */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
+					wlan_objmgr_ref_dbgid id,
+					const char *func, int line);
+
+#define wlan_objmgr_vdev_release_ref(vdev, dbgid)\
+		wlan_objmgr_vdev_release_ref_debug(vdev, dbgid, \
+		__func__, __LINE__)
+#else
 void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
 						wlan_objmgr_ref_dbgid id);
+#endif
+
+/**
+ * wlan_vdev_get_next_active_vdev_of_pdev() - get next active vdev
+ * @pdev: PDEV object
+ * @vdev_list: qdf_list_t
+ * @vdev: VDEV object
+ * @dbg_id: id of the caller
+ *
+ * API to get next active vdev object pointer of vdev
+ *
+ * Return:
+ * @vdev_next: VDEV object
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
+					struct wlan_objmgr_pdev *pdev,
+					qdf_list_t *vdev_list,
+					struct wlan_objmgr_vdev *vdev,
+					wlan_objmgr_ref_dbgid dbg_id,
+					const char *func, int line);
+
+#define wlan_vdev_get_next_active_vdev_of_pdev(pdev, vdev_list, vdev, dbgid) \
+		wlan_vdev_get_next_active_vdev_of_pdev_debug(pdev, vdev_list, \
+		vdev, dbgid, __func__, __LINE__)
+#else
+struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
+					struct wlan_objmgr_pdev *pdev,
+					qdf_list_t *vdev_list,
+					struct wlan_objmgr_vdev *vdev,
+					wlan_objmgr_ref_dbgid dbg_id);
+#endif
+
+/**
+ * wlan_pdev_peek_active_first_vdev() - get first active vdev from pdev list
+ * @pdev: PDEV object
+ * @dbg_id: id of the caller
+ *
+ * API to get the head active vdev of given pdev (of pdev's vdev list)
+ *
+ * Return:
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line);
+
+#define wlan_pdev_peek_active_first_vdev(pdev, dbgid) \
+		wlan_pdev_peek_active_first_vdev_debug(pdev, dbgid, \
+		__func__, __LINE__)
+#else
+struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id);
+#endif
+
+/**
+ * wlan_pdev_vdev_list_peek_active_head() - get first active vdev from pdev list
+ * @vdev: VDEV object
+ * @vdev_list: qdf_list_t
+ * @dbg_id: id of the caller
+ *
+ * API to get the head active vdev of given vdev (of pdev's vdev list)
+ *
+ * Return:
+ * @peer: head peer
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
+				struct wlan_objmgr_pdev *pdev,
+				qdf_list_t *vdev_list,
+				wlan_objmgr_ref_dbgid dbg_id,
+				const char *func, int line);
+
+#define wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list, dbgid) \
+		wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list, \
+		dbgid, __func__, __LINE__)
+#else
+struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
+				struct wlan_objmgr_pdev *pdev,
+				qdf_list_t *vdev_list,
+				wlan_objmgr_ref_dbgid dbg_id);
+#endif
 
 /**
  * wlan_objmgr_vdev_peer_freed_notify() - Notifies modules about peer freed

+ 354 - 140
umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c

@@ -623,6 +623,234 @@ QDF_STATUS wlan_objmgr_pdev_vdev_detach(struct wlan_objmgr_pdev *pdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+void *wlan_objmgr_pdev_get_comp_private_obj(
+		struct wlan_objmgr_pdev *pdev,
+		enum wlan_umac_comp_id id)
+{
+	void *comp_priv_obj;
+
+	/* component id is invalid */
+	if (id >= WLAN_UMAC_MAX_COMPONENTS) {
+		QDF_BUG(0);
+		return NULL;
+	}
+
+	if (!pdev) {
+		QDF_BUG(0);
+		return NULL;
+	}
+
+	comp_priv_obj = pdev->pdev_comp_priv_obj[id];
+
+	return comp_priv_obj;
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_get_comp_private_obj);
+
+void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
+			      wlan_objmgr_ref_dbgid id)
+{
+	if (!pdev) {
+		obj_mgr_err("pdev obj is NULL");
+		QDF_ASSERT(0);
+		return;
+	}
+	qdf_atomic_inc(&pdev->pdev_objmgr.ref_cnt);
+	qdf_atomic_inc(&pdev->pdev_objmgr.ref_id_dbg[id]);
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_get_ref);
+
+QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
+					wlan_objmgr_ref_dbgid id)
+{
+	uint8_t pdev_id;
+
+	if (!pdev) {
+		obj_mgr_err("pdev obj is NULL");
+		QDF_ASSERT(0);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	wlan_pdev_obj_lock(pdev);
+	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
+	if (pdev->obj_state != WLAN_OBJ_STATE_CREATED) {
+		wlan_pdev_obj_unlock(pdev);
+		if (pdev->pdev_objmgr.print_cnt++ <=
+				WLAN_OBJMGR_RATELIMIT_THRESH)
+			obj_mgr_err(
+			"[Ref id: %d] pdev [%d] is not in Created(st:%d)",
+					id, pdev_id, pdev->obj_state);
+		return QDF_STATUS_E_RESOURCES;
+	}
+
+	wlan_objmgr_pdev_get_ref(pdev, id);
+	wlan_pdev_obj_unlock(pdev);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_try_get_ref);
+
+void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
+				  wlan_objmgr_ref_dbgid id)
+{
+	uint8_t pdev_id;
+
+	if (!pdev) {
+		obj_mgr_err("pdev obj is NULL");
+		QDF_ASSERT(0);
+		return;
+	}
+
+	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
+
+	if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_id_dbg[id])) {
+		obj_mgr_err("pdev (id:%d)ref cnt was not taken by %d",
+			    pdev_id, id);
+		wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg,
+					  QDF_TRACE_LEVEL_FATAL);
+		WLAN_OBJMGR_BUG(0);
+		return;
+	}
+
+	if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_cnt)) {
+		obj_mgr_err("pdev ref cnt is 0: pdev-id:%d", pdev_id);
+		WLAN_OBJMGR_BUG(0);
+		return;
+	}
+
+	qdf_atomic_dec(&pdev->pdev_objmgr.ref_id_dbg[id]);
+	/* Decrement ref count, free pdev, if ref count == 0 */
+	if (qdf_atomic_dec_and_test(&pdev->pdev_objmgr.ref_cnt))
+		wlan_objmgr_pdev_obj_destroy(pdev);
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_release_ref);
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev_debug(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line)
+{
+	struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr;
+	qdf_list_t *vdev_list = NULL;
+	struct wlan_objmgr_vdev *vdev;
+	qdf_list_node_t *node = NULL;
+	qdf_list_node_t *prev_node = NULL;
+
+	wlan_pdev_obj_lock(pdev);
+
+	/* VDEV list */
+	vdev_list = &objmgr->wlan_vdev_list;
+	if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) {
+		wlan_pdev_obj_unlock(pdev);
+		return NULL;
+	}
+
+	do {
+		vdev = qdf_container_of(node, struct wlan_objmgr_vdev,
+					vdev_node);
+		if (wlan_objmgr_vdev_try_get_ref_debug(vdev,
+						       dbg_id, func, line) ==
+						QDF_STATUS_SUCCESS) {
+			wlan_pdev_obj_unlock(pdev);
+			return vdev;
+		}
+
+		prev_node = node;
+	} while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+						QDF_STATUS_SUCCESS);
+
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev_debug);
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr;
+	qdf_list_t *vdev_list = NULL;
+	struct wlan_objmgr_vdev *vdev;
+	qdf_list_node_t *node = NULL;
+	qdf_list_node_t *prev_node = NULL;
+
+	wlan_pdev_obj_lock(pdev);
+
+	/* VDEV list */
+	vdev_list = &objmgr->wlan_vdev_list;
+	if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) {
+		wlan_pdev_obj_unlock(pdev);
+		return NULL;
+	}
+
+	do {
+		vdev = qdf_container_of(node, struct wlan_objmgr_vdev,
+					vdev_node);
+		if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) ==
+						QDF_STATUS_SUCCESS) {
+			wlan_pdev_obj_unlock(pdev);
+			return vdev;
+		}
+
+		prev_node = node;
+	} while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+						QDF_STATUS_SUCCESS);
+
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
+}
+
+qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug(
+			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_vdev *vdev_next;
+	struct wlan_objmgr_pdev_objmgr *objmgr;
+	qdf_list_t *vdev_list;
+
+	wlan_pdev_obj_lock(pdev);
+
+	objmgr = &pdev->pdev_objmgr;
+	vdev_list = &objmgr->wlan_vdev_list;
+	/* Get first vdev */
+	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
+	/**
+	 * Iterate through pdev's vdev list, till vdev id matches with
+	 * entry of vdev list
+	 */
+	while (vdev) {
+		if (wlan_vdev_get_id(vdev) == vdev_id) {
+			if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
+							       func, line) !=
+				QDF_STATUS_SUCCESS)
+				vdev = NULL;
+
+			wlan_pdev_obj_unlock(pdev);
+			return vdev;
+		}
+		/* get next vdev */
+		vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev);
+		vdev = vdev_next;
+	}
+	wlan_pdev_obj_unlock(pdev);
+	return NULL;
+}
+
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id)
@@ -638,8 +866,10 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
 	vdev_list = &objmgr->wlan_vdev_list;
 	/* Get first vdev */
 	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
-	/* Iterate through pdev's vdev list, till vdev id matches with
-	entry of vdev list */
+	/**
+	 * Iterate through pdev's vdev list, till vdev id matches with
+	 * entry of vdev list
+	 */
 	while (vdev) {
 		if (wlan_vdev_get_id(vdev) == vdev_id) {
 			if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) !=
@@ -656,8 +886,50 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev(
 	wlan_pdev_obj_unlock(pdev);
 	return NULL;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug(
+			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_vdev *vdev_next;
+	struct wlan_objmgr_pdev_objmgr *objmgr;
+	qdf_list_t *vdev_list;
+
+	wlan_pdev_obj_lock(pdev);
+
+	objmgr = &pdev->pdev_objmgr;
+	vdev_list = &objmgr->wlan_vdev_list;
+	/* Get first vdev */
+	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
+	/**
+	 * Iterate through pdev's vdev list, till vdev id matches with
+	 * entry of vdev list
+	 */
+	while (vdev) {
+		if (wlan_vdev_get_id(vdev) == vdev_id) {
+			wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id,
+						       func, line);
+			wlan_pdev_obj_unlock(pdev);
+
+			return vdev;
+		}
+		/* get next vdev */
+		vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev);
+		vdev = vdev_next;
+	}
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
+}
 
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_no_state_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id)
@@ -692,11 +964,15 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_no_state(
 
 	return NULL;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_pdev_no_state);
+#endif
 
-struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(
 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
-		wlan_objmgr_ref_dbgid dbg_id)
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *fnc, int ln)
 {
 	struct wlan_objmgr_vdev *vdev;
 	struct wlan_objmgr_vdev *vdev_next;
@@ -708,13 +984,16 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
 	vdev_list = &objmgr->wlan_vdev_list;
 	/* Get first vdev */
 	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
-	/* Iterate through pdev's vdev list, till vdev macaddr matches with
-	entry of vdev list */
+	/**
+	 * Iterate through pdev's vdev list, till vdev macaddr matches with
+	 * entry of vdev list
+	 */
 	while (vdev) {
 		if (QDF_IS_STATUS_SUCCESS(
 		    WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr))) {
 			if (QDF_IS_STATUS_SUCCESS(
-				wlan_objmgr_vdev_try_get_ref(vdev, dbg_id))) {
+				wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
+								   fnc, ln))) {
 				wlan_pdev_obj_unlock(pdev);
 				return vdev;
 			}
@@ -727,8 +1006,8 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
 
 	return NULL;
 }
-
-struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev(
 		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
 		wlan_objmgr_ref_dbgid dbg_id)
 {
@@ -742,15 +1021,18 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
 	vdev_list = &objmgr->wlan_vdev_list;
 	/* Get first vdev */
 	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
-	/* Iterate through pdev's vdev list, till vdev macaddr matches with
-	entry of vdev list */
+	/**
+	 * Iterate through pdev's vdev list, till vdev macaddr matches with
+	 * entry of vdev list
+	 */
 	while (vdev) {
-		if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr)
-					== QDF_STATUS_SUCCESS) {
-			wlan_objmgr_vdev_get_ref(vdev, dbg_id);
-			wlan_pdev_obj_unlock(pdev);
-
-			return vdev;
+		if (QDF_IS_STATUS_SUCCESS(
+		    WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr))) {
+			if (QDF_IS_STATUS_SUCCESS(
+				wlan_objmgr_vdev_try_get_ref(vdev, dbg_id))) {
+				wlan_pdev_obj_unlock(pdev);
+				return vdev;
+			}
 		}
 		/* get next vdev */
 		vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev);
@@ -760,150 +1042,82 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
 
 	return NULL;
 }
+#endif
 
-void *wlan_objmgr_pdev_get_comp_private_obj(
-		struct wlan_objmgr_pdev *pdev,
-		enum wlan_umac_comp_id id)
-{
-	void *comp_priv_obj;
-
-	/* component id is invalid */
-	if (id >= WLAN_UMAC_MAX_COMPONENTS) {
-		QDF_BUG(0);
-		return NULL;
-	}
-
-	if (!pdev) {
-		QDF_BUG(0);
-		return NULL;
-	}
-
-	comp_priv_obj = pdev->pdev_comp_priv_obj[id];
-
-	return comp_priv_obj;
-}
-qdf_export_symbol(wlan_objmgr_pdev_get_comp_private_obj);
-
-void wlan_objmgr_pdev_get_ref(struct wlan_objmgr_pdev *pdev,
-					wlan_objmgr_ref_dbgid id)
-{
-	if (!pdev) {
-		obj_mgr_err("pdev obj is NULL");
-		QDF_ASSERT(0);
-		return;
-	}
-	qdf_atomic_inc(&pdev->pdev_objmgr.ref_cnt);
-	qdf_atomic_inc(&pdev->pdev_objmgr.ref_id_dbg[id]);
-
-	return;
-}
-qdf_export_symbol(wlan_objmgr_pdev_get_ref);
-
-QDF_STATUS wlan_objmgr_pdev_try_get_ref(struct wlan_objmgr_pdev *pdev,
-						wlan_objmgr_ref_dbgid id)
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev
+	*wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(
+		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line)
 {
-	uint8_t pdev_id;
-
-	if (!pdev) {
-		obj_mgr_err("pdev obj is NULL");
-		QDF_ASSERT(0);
-		return QDF_STATUS_E_FAILURE;
-	}
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_vdev *vdev_next;
+	struct wlan_objmgr_pdev_objmgr *objmgr;
+	qdf_list_t *vdev_list;
 
 	wlan_pdev_obj_lock(pdev);
-	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
-	if (pdev->obj_state != WLAN_OBJ_STATE_CREATED) {
-		wlan_pdev_obj_unlock(pdev);
-		if (pdev->pdev_objmgr.print_cnt++ <=
-				WLAN_OBJMGR_RATELIMIT_THRESH)
-			obj_mgr_err(
-			"[Ref id: %d] pdev [%d] is not in Created(st:%d)",
-					id, pdev_id, pdev->obj_state);
-		return QDF_STATUS_E_RESOURCES;
-	}
-
-	wlan_objmgr_pdev_get_ref(pdev, id);
-	wlan_pdev_obj_unlock(pdev);
-
-	return QDF_STATUS_SUCCESS;
-}
-qdf_export_symbol(wlan_objmgr_pdev_try_get_ref);
-
-void wlan_objmgr_pdev_release_ref(struct wlan_objmgr_pdev *pdev,
-						wlan_objmgr_ref_dbgid id)
-{
-	uint8_t pdev_id;
-
-	if (!pdev) {
-		obj_mgr_err("pdev obj is NULL");
-		QDF_ASSERT(0);
-		return;
-	}
-
-	pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
-
-	if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_id_dbg[id])) {
-		obj_mgr_err("pdev (id:%d)ref cnt was not taken by %d",
-				pdev_id, id);
-		wlan_objmgr_print_ref_ids(pdev->pdev_objmgr.ref_id_dbg,
-					  QDF_TRACE_LEVEL_FATAL);
-		WLAN_OBJMGR_BUG(0);
-		return;
-	}
+	objmgr = &pdev->pdev_objmgr;
+	vdev_list = &objmgr->wlan_vdev_list;
+	/* Get first vdev */
+	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
+	/**
+	 * Iterate through pdev's vdev list, till vdev macaddr matches with
+	 * entry of vdev list
+	 */
+	while (vdev) {
+		if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr)
+					== QDF_STATUS_SUCCESS) {
+			wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id,
+						       func, line);
+			wlan_pdev_obj_unlock(pdev);
 
-	if (!qdf_atomic_read(&pdev->pdev_objmgr.ref_cnt)) {
-		obj_mgr_err("pdev ref cnt is 0: pdev-id:%d", pdev_id);
-		WLAN_OBJMGR_BUG(0);
-		return;
+			return vdev;
+		}
+		/* get next vdev */
+		vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev);
+		vdev = vdev_next;
 	}
+	wlan_pdev_obj_unlock(pdev);
 
-	qdf_atomic_dec(&pdev->pdev_objmgr.ref_id_dbg[id]);
-	/* Decrement ref count, free pdev, if ref count == 0 */
-	if (qdf_atomic_dec_and_test(&pdev->pdev_objmgr.ref_cnt))
-		wlan_objmgr_pdev_obj_destroy(pdev);
-
-	return;
+	return NULL;
 }
-qdf_export_symbol(wlan_objmgr_pdev_release_ref);
-
-struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
-		struct wlan_objmgr_pdev *pdev,
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state(
+		struct wlan_objmgr_pdev *pdev, uint8_t *macaddr,
 		wlan_objmgr_ref_dbgid dbg_id)
 {
-	struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr;
-	qdf_list_t *vdev_list = NULL;
 	struct wlan_objmgr_vdev *vdev;
-	qdf_list_node_t *node = NULL;
-	qdf_list_node_t *prev_node = NULL;
+	struct wlan_objmgr_vdev *vdev_next;
+	struct wlan_objmgr_pdev_objmgr *objmgr;
+	qdf_list_t *vdev_list;
 
 	wlan_pdev_obj_lock(pdev);
-
-	/* VDEV list */
+	objmgr = &pdev->pdev_objmgr;
 	vdev_list = &objmgr->wlan_vdev_list;
-	if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) {
-		wlan_pdev_obj_unlock(pdev);
-		return NULL;
-	}
-
-	do {
-		vdev = qdf_container_of(node, struct wlan_objmgr_vdev,
-					vdev_node);
-		if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) ==
-						QDF_STATUS_SUCCESS) {
+	/* Get first vdev */
+	vdev = wlan_pdev_vdev_list_peek_head(vdev_list);
+	/**
+	 * Iterate through pdev's vdev list, till vdev macaddr matches with
+	 * entry of vdev list
+	 */
+	while (vdev) {
+		if (WLAN_ADDR_EQ(wlan_vdev_mlme_get_macaddr(vdev), macaddr)
+					== QDF_STATUS_SUCCESS) {
+			wlan_objmgr_vdev_get_ref(vdev, dbg_id);
 			wlan_pdev_obj_unlock(pdev);
+
 			return vdev;
 		}
-
-		prev_node = node;
-	} while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
-						QDF_STATUS_SUCCESS);
-
+		/* get next vdev */
+		vdev_next = wlan_vdev_get_next_vdev_of_pdev(vdev_list, vdev);
+		vdev = vdev_next;
+	}
 	wlan_pdev_obj_unlock(pdev);
 
 	return NULL;
 }
-
-qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev);
+#endif
 
 #ifdef WLAN_OBJMGR_DEBUG
 void wlan_print_pdev_info(struct wlan_objmgr_pdev *pdev)

+ 200 - 25
umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c

@@ -942,45 +942,37 @@ QDF_STATUS wlan_objmgr_psoc_vdev_detach(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
-struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc(
-			struct wlan_objmgr_psoc *psoc,
-			enum QDF_OPMODE opmode,
-			wlan_objmgr_ref_dbgid dbg_id)
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_debug(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
 {
-	struct wlan_objmgr_vdev *vdev = NULL;
-	int vdev_cnt = 0;
-	uint16_t max_vdev_cnt;
+	struct wlan_objmgr_vdev *vdev;
 
 	/* if PSOC is NULL, return */
 	if (!psoc)
 		return NULL;
+	/* vdev id is invalid */
+	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
+		return NULL;
 
 	wlan_psoc_obj_lock(psoc);
-
-	max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
 	/* retrieve vdev pointer from vdev list */
-	while (vdev_cnt < max_vdev_cnt) {
-		vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt];
-		vdev_cnt++;
-		if (!vdev)
-			continue;
-		wlan_vdev_obj_lock(vdev);
-		if (vdev->vdev_mlme.vdev_opmode == opmode) {
-			wlan_vdev_obj_unlock(vdev);
-			if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) !=
-							QDF_STATUS_SUCCESS) {
-				vdev = NULL;
-				continue;
-			}
-			break;
-		}
-		wlan_vdev_obj_unlock(vdev);
+	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
+	if (vdev) {
+		if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
+						       func, line) !=
+			QDF_STATUS_SUCCESS)
+			vdev = NULL;
 	}
 	wlan_psoc_obj_unlock(psoc);
 
 	return vdev;
 }
 
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc(
 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id)
@@ -1006,8 +998,38 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc(
 
 	return vdev;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+
+	/* if PSOC is NULL, return */
+	if (!psoc)
+		return NULL;
+	/* vdev id is invalid */
+	if (vdev_id >= wlan_psoc_get_max_vdev_count(psoc))
+		return NULL;
+
+	wlan_psoc_obj_lock(psoc);
+	/* retrieve vdev pointer from vdev list */
+	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
+	if (vdev)
+		wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, func, line);
+
+	wlan_psoc_obj_unlock(psoc);
+
+	return vdev;
+}
 
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
 			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 			wlan_objmgr_ref_dbgid dbg_id)
@@ -1031,8 +1053,123 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
 
 	return vdev;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_no_state);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc_debug(
+			struct wlan_objmgr_psoc *psoc,
+			enum QDF_OPMODE opmode,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev = NULL;
+	int vdev_cnt = 0;
+	uint16_t max_vdev_cnt;
+
+	/* if PSOC is NULL, return */
+	if (!psoc)
+		return NULL;
+
+	wlan_psoc_obj_lock(psoc);
+
+	max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
+	/* retrieve vdev pointer from vdev list */
+	while (vdev_cnt < max_vdev_cnt) {
+		vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt];
+		vdev_cnt++;
+		if (!vdev)
+			continue;
+		wlan_vdev_obj_lock(vdev);
+		if (vdev->vdev_mlme.vdev_opmode == opmode) {
+			wlan_vdev_obj_unlock(vdev);
+			if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
+							       func, line) !=
+				QDF_STATUS_SUCCESS) {
+				vdev = NULL;
+				continue;
+			}
+			break;
+		}
+		wlan_vdev_obj_unlock(vdev);
+	}
+	wlan_psoc_obj_unlock(psoc);
+
+	return vdev;
+}
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_opmode_from_psoc(
+			struct wlan_objmgr_psoc *psoc,
+			enum QDF_OPMODE opmode,
+			wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_vdev *vdev = NULL;
+	int vdev_cnt = 0;
+	uint16_t max_vdev_cnt;
+
+	/* if PSOC is NULL, return */
+	if (!psoc)
+		return NULL;
+
+	wlan_psoc_obj_lock(psoc);
+
+	max_vdev_cnt = wlan_psoc_get_max_vdev_count(psoc);
+	/* retrieve vdev pointer from vdev list */
+	while (vdev_cnt < max_vdev_cnt) {
+		vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_cnt];
+		vdev_cnt++;
+		if (!vdev)
+			continue;
+		wlan_vdev_obj_lock(vdev);
+		if (vdev->vdev_mlme.vdev_opmode == opmode) {
+			wlan_vdev_obj_unlock(vdev);
+			if (wlan_objmgr_vdev_try_get_ref(vdev, dbg_id) !=
+							QDF_STATUS_SUCCESS) {
+				vdev = NULL;
+				continue;
+			}
+			break;
+		}
+		wlan_vdev_obj_unlock(vdev);
+	}
+	wlan_psoc_obj_unlock(psoc);
+
+	return vdev;
+}
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug(
+		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
+		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev;
 
+	/* if PSOC is NULL, return */
+	if (!psoc)
+		return NULL;
+
+	if (!macaddr)
+		return NULL;
+
+	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
+	if (!pdev) {
+		obj_mgr_err("pdev is null");
+		return NULL;
+	}
+	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_debug(pdev, macaddr,
+							       dbg_id,
+							       func, line);
+	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
+
+	return vdev;
+}
+
+qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc(
 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
 		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
@@ -1057,8 +1194,44 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc(
 
 	return vdev;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev
+	*wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug(
+		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
+		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev;
 
+	/* if PSOC is NULL, return */
+	if (!psoc)
+		return NULL;
+
+	if (!macaddr)
+		return NULL;
+
+	pdev = wlan_objmgr_get_pdev_by_id(psoc, pdev_id, dbg_id);
+	if (!pdev) {
+		obj_mgr_err("pdev is null");
+		return NULL;
+	}
+	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev_no_state_debug(pdev,
+									macaddr,
+									dbg_id,
+									func,
+									line);
+	wlan_objmgr_pdev_release_ref(pdev, dbg_id);
+
+	return vdev;
+}
+
+qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state_debug);
+#else
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(
 		struct wlan_objmgr_psoc *psoc, uint8_t pdev_id,
 		uint8_t *macaddr, wlan_objmgr_ref_dbgid dbg_id)
@@ -1083,7 +1256,9 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state(
 
 	return vdev;
 }
+
 qdf_export_symbol(wlan_objmgr_get_vdev_by_macaddr_from_psoc_no_state);
+#endif
 
 static void wlan_obj_psoc_peerlist_add_tail(qdf_list_t *obj_list,
 				struct wlan_objmgr_peer *obj)

+ 252 - 51
umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c

@@ -279,7 +279,6 @@ static QDF_STATUS wlan_objmgr_vdev_obj_destroy(struct wlan_objmgr_vdev *vdev)
 
 	vdev_id = wlan_vdev_get_id(vdev);
 
-	wlan_print_vdev_info(vdev);
 	obj_mgr_debug("Physically deleting vdev %d", vdev_id);
 
 	if (vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED) {
@@ -970,8 +969,26 @@ void *wlan_objmgr_vdev_get_comp_private_obj(
 }
 qdf_export_symbol(wlan_objmgr_vdev_get_comp_private_obj);
 
-void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
-						wlan_objmgr_ref_dbgid id)
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+static inline void
+wlan_objmgr_vdev_ref_trace(struct wlan_objmgr_vdev *vdev,
+			   wlan_objmgr_ref_dbgid id,
+			   const char *func, int line)
+{
+}
+
+static inline void
+wlan_objmgr_vdev_deref_trace(struct wlan_objmgr_vdev *vdev,
+			     wlan_objmgr_ref_dbgid id,
+			     const char *func, int line)
+{
+}
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+void wlan_objmgr_vdev_get_ref_debug(struct wlan_objmgr_vdev *vdev,
+				    wlan_objmgr_ref_dbgid id,
+				    const char *func, int line)
 {
 	if (!vdev) {
 		obj_mgr_err("vdev obj is NULL for id:%d", id);
@@ -982,12 +999,32 @@ void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
 	qdf_atomic_inc(&vdev->vdev_objmgr.ref_cnt);
 	qdf_atomic_inc(&vdev->vdev_objmgr.ref_id_dbg[id]);
 
+	wlan_objmgr_vdev_ref_trace(vdev, id, func, line);
 	return;
 }
+
+qdf_export_symbol(wlan_objmgr_vdev_get_ref_debug);
+#else
+void wlan_objmgr_vdev_get_ref(struct wlan_objmgr_vdev *vdev,
+			      wlan_objmgr_ref_dbgid id)
+{
+	if (!vdev) {
+		obj_mgr_err("vdev obj is NULL for id:%d", id);
+		QDF_ASSERT(0);
+		return;
+	}
+	/* Increment ref count */
+	qdf_atomic_inc(&vdev->vdev_objmgr.ref_cnt);
+	qdf_atomic_inc(&vdev->vdev_objmgr.ref_id_dbg[id]);
+}
+
 qdf_export_symbol(wlan_objmgr_vdev_get_ref);
+#endif
 
-QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
-						wlan_objmgr_ref_dbgid id)
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+QDF_STATUS wlan_objmgr_vdev_try_get_ref_debug(struct wlan_objmgr_vdev *vdev,
+					      wlan_objmgr_ref_dbgid id,
+					      const char *func, int line)
 {
 	uint8_t vdev_id;
 
@@ -1011,50 +1048,152 @@ QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
 	}
 
 	/* Increment ref count */
-	wlan_objmgr_vdev_get_ref(vdev, id);
+	wlan_objmgr_vdev_get_ref_debug(vdev, id, func, line);
 	wlan_vdev_obj_unlock(vdev);
 
 	return QDF_STATUS_SUCCESS;
 }
-qdf_export_symbol(wlan_objmgr_vdev_try_get_ref);
 
-void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
-						wlan_objmgr_ref_dbgid id)
+qdf_export_symbol(wlan_objmgr_vdev_try_get_ref_debug);
+#else
+QDF_STATUS wlan_objmgr_vdev_try_get_ref(struct wlan_objmgr_vdev *vdev,
+					wlan_objmgr_ref_dbgid id)
 {
 	uint8_t vdev_id;
 
 	if (!vdev) {
 		obj_mgr_err("vdev obj is NULL for id:%d", id);
 		QDF_ASSERT(0);
-		return;
+		return QDF_STATUS_E_FAILURE;
 	}
 
+	wlan_vdev_obj_lock(vdev);
 	vdev_id = wlan_vdev_get_id(vdev);
+	if (vdev->obj_state != WLAN_OBJ_STATE_CREATED) {
+		wlan_vdev_obj_unlock(vdev);
+		if (vdev->vdev_objmgr.print_cnt++ <=
+				WLAN_OBJMGR_RATELIMIT_THRESH)
+			obj_mgr_err(
+			"[Ref id: %d] vdev(%d) is not in Created state(%d)",
+				id, vdev_id, vdev->obj_state);
 
-	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) {
-		obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d",
-			      vdev_id, id);
-		wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg,
-					  QDF_TRACE_LEVEL_FATAL);
-		WLAN_OBJMGR_BUG(0);
-		return;
+		return QDF_STATUS_E_RESOURCES;
 	}
 
-	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) {
-		obj_mgr_alert("vdev ref cnt is 0");
-		WLAN_OBJMGR_BUG(0);
-		return;
+	/* Increment ref count */
+	wlan_objmgr_vdev_get_ref(vdev, id);
+	wlan_vdev_obj_unlock(vdev);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+qdf_export_symbol(wlan_objmgr_vdev_try_get_ref);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev_debug(
+			struct wlan_objmgr_pdev *pdev,
+			qdf_list_t *vdev_list,
+			struct wlan_objmgr_vdev *vdev,
+			wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev_next;
+	qdf_list_node_t *node = &vdev->vdev_node;
+	qdf_list_node_t *prev_node = NULL;
+
+	if (!node)
+		return NULL;
+
+	wlan_pdev_obj_lock(pdev);
+	prev_node = node;
+	while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+							QDF_STATUS_SUCCESS) {
+		vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev,
+					     vdev_node);
+		if (wlan_objmgr_vdev_try_get_ref_debug(vdev_next, dbg_id,
+						       func, line) ==
+			QDF_STATUS_SUCCESS) {
+			wlan_pdev_obj_unlock(pdev);
+			return vdev_next;
+		}
+
+		prev_node = node;
 	}
-	qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]);
+	wlan_pdev_obj_unlock(pdev);
 
-	/* Decrement ref count, free vdev, if ref count == 0 */
-	if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt))
-		wlan_objmgr_vdev_obj_destroy(vdev);
+	return NULL;
+}
+#else
+struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
+			struct wlan_objmgr_pdev *pdev,
+			qdf_list_t *vdev_list,
+			struct wlan_objmgr_vdev *vdev,
+			wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_vdev *vdev_next;
+	qdf_list_node_t *node = &vdev->vdev_node;
+	qdf_list_node_t *prev_node = NULL;
 
-	return;
+	if (!node)
+		return NULL;
+
+	wlan_pdev_obj_lock(pdev);
+	prev_node = node;
+	while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+							QDF_STATUS_SUCCESS) {
+		vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev,
+					     vdev_node);
+		if (wlan_objmgr_vdev_try_get_ref(vdev_next, dbg_id) ==
+						QDF_STATUS_SUCCESS) {
+			wlan_pdev_obj_unlock(pdev);
+			return vdev_next;
+		}
+
+		prev_node = node;
+	}
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
 }
-qdf_export_symbol(wlan_objmgr_vdev_release_ref);
+#endif
+
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head_debug(
+			struct wlan_objmgr_pdev *pdev,
+			qdf_list_t *vdev_list, wlan_objmgr_ref_dbgid dbg_id,
+			const char *func, int line)
+{
+	struct wlan_objmgr_vdev *vdev;
+	qdf_list_node_t *node = NULL;
+	qdf_list_node_t *prev_node = NULL;
+
+	wlan_pdev_obj_lock(pdev);
+
+	if (qdf_list_peek_front(vdev_list, &node) != QDF_STATUS_SUCCESS) {
+		wlan_pdev_obj_unlock(pdev);
+		return NULL;
+	}
 
+	do {
+		vdev = qdf_container_of(node, struct wlan_objmgr_vdev,
+					vdev_node);
+		if (wlan_objmgr_vdev_try_get_ref_debug(vdev, dbg_id,
+						       func, line) ==
+						QDF_STATUS_SUCCESS) {
+			wlan_pdev_obj_unlock(pdev);
+			return vdev;
+		}
+
+		prev_node = node;
+	} while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+						QDF_STATUS_SUCCESS);
+
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
+}
+#else
 struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
 			struct wlan_objmgr_pdev *pdev,
 			qdf_list_t *vdev_list, wlan_objmgr_ref_dbgid dbg_id)
@@ -1087,7 +1226,24 @@ struct wlan_objmgr_vdev *wlan_pdev_vdev_list_peek_active_head(
 
 	return NULL;
 }
+#endif
 
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev_debug(
+		struct wlan_objmgr_pdev *pdev,
+		wlan_objmgr_ref_dbgid dbg_id,
+		const char *func, int line)
+{
+	struct wlan_objmgr_pdev_objmgr *objmgr = &pdev->pdev_objmgr;
+	qdf_list_t *vdev_list;
+
+	/* VDEV list */
+	vdev_list = &objmgr->wlan_vdev_list;
+
+	return wlan_pdev_vdev_list_peek_active_head_debug(pdev, vdev_list,
+						    dbg_id, func, line);
+}
+#else
 struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
 		struct wlan_objmgr_pdev *pdev,
 		wlan_objmgr_ref_dbgid dbg_id)
@@ -1101,39 +1257,84 @@ struct wlan_objmgr_vdev *wlan_pdev_peek_active_first_vdev(
 	return wlan_pdev_vdev_list_peek_active_head(pdev, vdev_list,
 						    dbg_id);
 }
+#endif
 
-struct wlan_objmgr_vdev *wlan_vdev_get_next_active_vdev_of_pdev(
-			struct wlan_objmgr_pdev *pdev,
-			qdf_list_t *vdev_list,
-			struct wlan_objmgr_vdev *vdev,
-			wlan_objmgr_ref_dbgid dbg_id)
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+void wlan_objmgr_vdev_release_ref_debug(struct wlan_objmgr_vdev *vdev,
+					wlan_objmgr_ref_dbgid id,
+					const char *func, int line)
 {
-	struct wlan_objmgr_vdev *vdev_next;
-	qdf_list_node_t *node = &vdev->vdev_node;
-	qdf_list_node_t *prev_node = NULL;
+	uint8_t vdev_id;
 
-	if (!node)
-		return NULL;
+	if (!vdev) {
+		obj_mgr_err("vdev obj is NULL for id:%d", id);
+		QDF_ASSERT(0);
+		return;
+	}
 
-	wlan_pdev_obj_lock(pdev);
-	prev_node = node;
-	while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
-							QDF_STATUS_SUCCESS) {
-		vdev_next = qdf_container_of(node, struct wlan_objmgr_vdev,
-								vdev_node);
-		if (wlan_objmgr_vdev_try_get_ref(vdev_next, dbg_id) ==
-						QDF_STATUS_SUCCESS) {
-			wlan_pdev_obj_unlock(pdev);
-			return vdev_next;
-		}
+	vdev_id = wlan_vdev_get_id(vdev);
 
-		prev_node = node;
+	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) {
+		obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d",
+			      vdev_id, id);
+		wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg,
+					  QDF_TRACE_LEVEL_FATAL);
+		WLAN_OBJMGR_BUG(0);
+		return;
 	}
-	wlan_pdev_obj_unlock(pdev);
 
-	return NULL;
+	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) {
+		obj_mgr_alert("vdev ref cnt is 0");
+		WLAN_OBJMGR_BUG(0);
+		return;
+	}
+	qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]);
+	wlan_objmgr_vdev_deref_trace(vdev, id, func, line);
+
+	/* Decrement ref count, free vdev, if ref count == 0 */
+	if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt))
+		wlan_objmgr_vdev_obj_destroy(vdev);
+}
+
+qdf_export_symbol(wlan_objmgr_vdev_release_ref_debug);
+#else
+void wlan_objmgr_vdev_release_ref(struct wlan_objmgr_vdev *vdev,
+				  wlan_objmgr_ref_dbgid id)
+{
+	uint8_t vdev_id;
+
+	if (!vdev) {
+		obj_mgr_err("vdev obj is NULL for id:%d", id);
+		QDF_ASSERT(0);
+		return;
+	}
+
+	vdev_id = wlan_vdev_get_id(vdev);
+
+	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_id_dbg[id])) {
+		obj_mgr_alert("vdev (id:%d)ref cnt was not taken by %d",
+			      vdev_id, id);
+		wlan_objmgr_print_ref_ids(vdev->vdev_objmgr.ref_id_dbg,
+					  QDF_TRACE_LEVEL_FATAL);
+		WLAN_OBJMGR_BUG(0);
+		return;
+	}
+
+	if (!qdf_atomic_read(&vdev->vdev_objmgr.ref_cnt)) {
+		obj_mgr_alert("vdev ref cnt is 0");
+		WLAN_OBJMGR_BUG(0);
+		return;
+	}
+	qdf_atomic_dec(&vdev->vdev_objmgr.ref_id_dbg[id]);
+
+	/* Decrement ref count, free vdev, if ref count == 0 */
+	if (qdf_atomic_dec_and_test(&vdev->vdev_objmgr.ref_cnt))
+		wlan_objmgr_vdev_obj_destroy(vdev);
 }
 
+qdf_export_symbol(wlan_objmgr_vdev_release_ref);
+#endif
+
 #ifdef WLAN_OBJMGR_DEBUG
 void wlan_print_vdev_info(struct wlan_objmgr_vdev *vdev)
 {