Bläddra i källkod

Merge "qcacmn: Add wlan utility API to retrieve vdev from interface name"

Linux Build Service Account 7 år sedan
förälder
incheckning
ec1afd2982
2 ändrade filer med 64 tillägg och 0 borttagningar
  1. 27 0
      umac/cmn_services/utils/inc/wlan_utility.h
  2. 37 0
      umac/cmn_services/utils/src/wlan_utility.c

+ 27 - 0
umac/cmn_services/utils/inc/wlan_utility.h

@@ -28,6 +28,16 @@
 #include <wlan_objmgr_pdev_obj.h>
 #include <wlan_objmgr_vdev_obj.h>
 
+/**
+ * struct wlan_find_vdev_filter - find vdev filter object. this can be extended
+ * @ifname:           interface name of vdev
+ * @found_vdev:       found vdev object matching one or more of above params
+ */
+struct wlan_find_vdev_filter {
+	char *ifname;
+	struct wlan_objmgr_vdev *found_vdev;
+};
+
 /**
  * wlan_chan_to_freq() - converts channel to frequency
  * @chan: channel number
@@ -89,4 +99,21 @@ bool wlan_is_emulation_platform(uint32_t phy_version);
 uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
 				 uint8_t vdev_id,
 				 wlan_objmgr_ref_dbgid dbg_id);
+
+/**
+ * wlan_util_get_vdev_by_ifname() - function to return vdev object from psoc
+ * matching given interface name
+ * @psoc    : psoc object
+ * @ifname  : interface name
+ * @ref_id  : object manager ref id
+ *
+ * This function returns vdev object from psoc by interface name. If found this
+ * will also take reference with given ref_id
+ *
+ * Return : vdev object if found, NULL otherwise
+ */
+struct wlan_objmgr_vdev *wlan_util_get_vdev_by_ifname(
+				struct wlan_objmgr_psoc *psoc, char *ifname,
+				wlan_objmgr_ref_dbgid ref_id);
+
 #endif /* _WLAN_UTILITY_H_ */

+ 37 - 0
umac/cmn_services/utils/src/wlan_utility.c

@@ -22,6 +22,8 @@
 
 #include "wlan_utility.h"
 #include <wlan_cmn.h>
+#include "wlan_osif_priv.h"
+#include <net/cfg80211.h>
 
 uint32_t wlan_chan_to_freq(uint8_t chan)
 {
@@ -126,3 +128,38 @@ uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
 	return pdev_id;
 }
 EXPORT_SYMBOL(wlan_get_pdev_id_from_vdev_id);
+
+static void wlan_util_get_vdev_by_ifname_cb(struct wlan_objmgr_psoc *psoc,
+					    void *obj, void *arg)
+{
+	struct wlan_objmgr_vdev *vdev = obj;
+	struct wlan_find_vdev_filter *filter = arg;
+
+	if (filter->found_vdev)
+		return;
+
+	wlan_vdev_obj_lock(vdev);
+	if (!qdf_str_cmp(vdev->vdev_nif.osdev->wdev->netdev->name,
+			 filter->ifname)) {
+		filter->found_vdev = vdev;
+	}
+	wlan_vdev_obj_unlock(vdev);
+}
+
+struct wlan_objmgr_vdev *wlan_util_get_vdev_by_ifname(
+				struct wlan_objmgr_psoc *psoc, char *ifname,
+				wlan_objmgr_ref_dbgid ref_id)
+{
+	struct wlan_find_vdev_filter filter = {0};
+
+	filter.ifname = ifname;
+	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
+				     wlan_util_get_vdev_by_ifname_cb,
+				     &filter, 0, ref_id);
+
+	if (filter.found_vdev)
+		wlan_objmgr_vdev_get_ref(filter.found_vdev, ref_id);
+
+	return filter.found_vdev;
+}
+EXPORT_SYMBOL(wlan_util_get_vdev_by_ifname);