Parcourir la source

qcacmn: Add API to get reference if not logically deleted

There are API to get vdev by reference from psoc by vdev id,
if either the vdev is in any state or the vdev is created state.

The wlan_objmgr_get_vdev_by_id_from_psoc return the vdev reference
only when the vdev is in CREATED state.

If the VDEV is in ALLOCATED or LOGICALLY DELETED state,
the API returns NULL.

In this new API we need to get the reference when
it would be in ALLOCATED state and not in LOGICALLY DELETED state.
We need an API to get vdev by reference only
if the vdev is not in logically deleted state.

Add API to get vdev from psoc by vdev id if
the vdev is allocated state and not in logically deleted state.

CRs-Fixed: 2901595
Change-Id: I1611c7e2a223ca8c4b0c3bf79ded35b2e958d113
Vivek il y a 4 ans
Parent
commit
7bb2bd6eba

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

@@ -1019,6 +1019,37 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
 			wlan_objmgr_ref_dbgid dbg_id);
 #endif
 
+/**
+ * wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del() - retrieve vdev by id
+ * @psoc: PSOC object
+ * @id: vdev id
+ * @dbg_id: id of the caller
+ *
+ * API to find vdev object pointer by vdev id from psoc, ignores the
+ * state check
+ *
+ * This API increments the ref count of the vdev object internally, the
+ * caller has to invoke the wlan_objmgr_vdev_release_ref() to decrement
+ * ref count
+ *
+ * Return: vdev pointer
+ *         NULL on FAILURE
+ */
+#ifdef WLAN_OBJMGR_REF_ID_TRACE
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_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_not_log_del(psoc, vdev_id, dbgid) \
+		wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_debug(psoc, \
+		vdev_id, dbgid, __func__, __LINE__)
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del(
+			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
  * @psoc: PSOC object

+ 58 - 0
umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c

@@ -1046,6 +1046,64 @@ struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_no_state(
 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_id_from_psoc_not_log_del_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 && vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED)
+		wlan_objmgr_vdev_get_ref_debug(vdev, dbg_id, func, line);
+	else
+		vdev = NULL;
+	wlan_psoc_obj_unlock(psoc);
+
+	return vdev;
+}
+
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del_debug);
+#else
+struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			wlan_objmgr_ref_dbgid dbg_id)
+{
+	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 && vdev->obj_state != WLAN_OBJ_STATE_LOGICALLY_DELETED)
+		wlan_objmgr_vdev_get_ref(vdev, dbg_id);
+	else
+		vdev = NULL;
+	wlan_psoc_obj_unlock(psoc);
+
+	return vdev;
+}
+
+qdf_export_symbol(wlan_objmgr_get_vdev_by_id_from_psoc_not_log_del);
+#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,