Browse Source

qcacmn: fetch roam vdev from pdev obj

Driver extracts the vdev from peer, self mac address and
vdev_id. But in some APIs, there can be below scenarios
For example:
1. peer is not available for that vdev( roam vdev),
2. API does not have vdev_id,
3. mac address is not known or incorrect,
4. there is no session available.
While roaming, there can be scenario where driver need to
fetch the vdev before peer creation and session is not
available.
For this, driver introduces new API to fetch roam vdev from
pdev object.

Change-Id: I4a2521773b893a8dc0553335bcadac5a84fbc300
CRs-Fixed: 3441493
Rahul Gusain 2 năm trước cách đây
mục cha
commit
4e7ff1e143

+ 4 - 1
umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h

@@ -297,6 +297,7 @@ typedef void (*wlan_objmgr_peer_status_handler)(
  * @WLAN_QMI_ID:                QMI component id
  * @WLAN_QMI_ID:                QMI component id
  * @WLAN_AFC_ID:                AFC reference id
  * @WLAN_AFC_ID:                AFC reference id
  * @WLAN_INTRA_BSS:             Intra bss reference id
  * @WLAN_INTRA_BSS:             Intra bss reference id
+ * @WLAN_ROAM_ID:               Roam reference id
  * @WLAN_REF_ID_MAX:            Max id used to generate ref count tracking array
  * @WLAN_REF_ID_MAX:            Max id used to generate ref count tracking array
  */
  */
  /* New value added to the enum must also be reflected in function
  /* New value added to the enum must also be reflected in function
@@ -408,6 +409,7 @@ typedef enum {
 	WLAN_QMI_ID           = 101,
 	WLAN_QMI_ID           = 101,
 	WLAN_AFC_ID           = 102,
 	WLAN_AFC_ID           = 102,
 	WLAN_INTRA_BSS        = 103,
 	WLAN_INTRA_BSS        = 103,
+	WLAN_ROAM_ID          = 104,
 	WLAN_REF_ID_MAX,
 	WLAN_REF_ID_MAX,
 } wlan_objmgr_ref_dbgid;
 } wlan_objmgr_ref_dbgid;
 
 
@@ -524,7 +526,8 @@ static inline const char *string_from_dbgid(wlan_objmgr_ref_dbgid id)
 					"WLAN_SAWF_ID",
 					"WLAN_SAWF_ID",
 					"WLAN_QMI_ID",
 					"WLAN_QMI_ID",
 					"WLAN_AFC_ID",
 					"WLAN_AFC_ID",
-					"WLAN_INTRA_BSS"
+					"WLAN_INTRA_BSS",
+					"WLAN_ROAM_ID"
 					};
 					};
 
 
 	if (id >= WLAN_REF_ID_MAX)
 	if (id >= WLAN_REF_ID_MAX)

+ 13 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h

@@ -548,6 +548,19 @@ struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
 		wlan_objmgr_ref_dbgid dbg_id);
 		wlan_objmgr_ref_dbgid dbg_id);
 #endif
 #endif
 
 
+/**
+ * wlan_objmgr_pdev_get_roam_vdev() - Get roam vdev of pdev
+ * @pdev: PDEV object
+ * @dbg_id: Object Manager ref debug id
+ *
+ * API to get reference to vdev which is in roaming from pdev.
+ *
+ * Return: reference to roam vdev
+ */
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_roam_vdev(
+						struct wlan_objmgr_pdev *pdev,
+						wlan_objmgr_ref_dbgid dbg_id);
+
 /**
 /**
  * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object
  * wlan_objmgr_pdev_get_comp_private_obj() - get pdev component private object
  * @pdev: PDEV object
  * @pdev: PDEV object

+ 42 - 0
umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c

@@ -32,6 +32,7 @@
 #include "wlan_objmgr_psoc_obj_i.h"
 #include "wlan_objmgr_psoc_obj_i.h"
 #include "wlan_objmgr_pdev_obj_i.h"
 #include "wlan_objmgr_pdev_obj_i.h"
 #include <wlan_utility.h>
 #include <wlan_utility.h>
+#include <wlan_cm_api.h>
 
 
 /*
 /*
  * APIs to Create/Delete Global object APIs
  * APIs to Create/Delete Global object APIs
@@ -820,6 +821,47 @@ struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_first_vdev(
 qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev);
 qdf_export_symbol(wlan_objmgr_pdev_get_first_vdev);
 #endif
 #endif
 
 
+struct wlan_objmgr_vdev *wlan_objmgr_pdev_get_roam_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) {
+			if (wlan_cm_is_vdev_roaming(vdev)) {
+				wlan_pdev_obj_unlock(pdev);
+				return vdev;
+			}
+
+			wlan_objmgr_vdev_release_ref(vdev, dbg_id);
+		}
+
+		prev_node = node;
+	} while (qdf_list_peek_next(vdev_list, prev_node, &node) ==
+						QDF_STATUS_SUCCESS);
+
+	wlan_pdev_obj_unlock(pdev);
+
+	return NULL;
+}
+
 #ifdef WLAN_OBJMGR_REF_ID_TRACE
 #ifdef WLAN_OBJMGR_REF_ID_TRACE
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug(
 struct wlan_objmgr_vdev *wlan_objmgr_get_vdev_by_id_from_pdev_debug(
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,
 			struct wlan_objmgr_pdev *pdev, uint8_t vdev_id,