浏览代码

usb: usbip tool: Add ncontrollers in vhci_driver structure

A new field ncontrollers is added to the vhci_driver structure.
And this field is stored by scanning the vhci_hcd* dirs in the
platform udev.

Suggested-and-reviewed-by: Krzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: Yuyang Du <yuyang.du@intel.com>
Acked-by: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Yuyang Du 8 年之前
父节点
当前提交
aa3ecb9154
共有 2 个文件被更改,包括 37 次插入0 次删除
  1. 36 0
      tools/usb/usbip/libsrc/vhci_driver.c
  2. 1 0
      tools/usb/usbip/libsrc/vhci_driver.h

+ 36 - 0
tools/usb/usbip/libsrc/vhci_driver.c

@@ -7,6 +7,7 @@
 #include <limits.h>
 #include <limits.h>
 #include <netdb.h>
 #include <netdb.h>
 #include <libudev.h>
 #include <libudev.h>
+#include <dirent.h>
 #include "sysfs_utils.h"
 #include "sysfs_utils.h"
 
 
 #undef  PROGNAME
 #undef  PROGNAME
@@ -134,6 +135,33 @@ static int get_nports(void)
 	return (int)strtoul(attr_nports, NULL, 10);
 	return (int)strtoul(attr_nports, NULL, 10);
 }
 }
 
 
+static int vhci_hcd_filter(const struct dirent *dirent)
+{
+	return strcmp(dirent->d_name, "vhci_hcd") >= 0;
+}
+
+static int get_ncontrollers(void)
+{
+	struct dirent **namelist;
+	struct udev_device *platform;
+	int n;
+
+	platform = udev_device_get_parent(vhci_driver->hc_device);
+	if (platform == NULL)
+		return -1;
+
+	n = scandir(udev_device_get_syspath(platform), &namelist, vhci_hcd_filter, NULL);
+	if (n < 0)
+		err("scandir failed");
+	else {
+		for (int i = 0; i < n; i++)
+			free(namelist[i]);
+		free(namelist);
+	}
+
+	return n;
+}
+
 /*
 /*
  * Read the given port's record.
  * Read the given port's record.
  *
  *
@@ -230,6 +258,14 @@ int usbip_vhci_driver_open(void)
 		goto err;
 		goto err;
 	}
 	}
 
 
+	vhci_driver->ncontrollers = get_ncontrollers();
+	dbg("available controllers: %d", vhci_driver->ncontrollers);
+
+	if (vhci_driver->ncontrollers <=0) {
+		err("no available usb controllers");
+		goto err;
+	}
+
 	if (refresh_imported_device_list())
 	if (refresh_imported_device_list())
 		goto err;
 		goto err;
 
 

+ 1 - 0
tools/usb/usbip/libsrc/vhci_driver.h

@@ -31,6 +31,7 @@ struct usbip_vhci_driver {
 	/* /sys/devices/platform/vhci_hcd */
 	/* /sys/devices/platform/vhci_hcd */
 	struct udev_device *hc_device;
 	struct udev_device *hc_device;
 
 
+	int ncontrollers;
 	int nports;
 	int nports;
 	struct usbip_imported_device idev[MAXNPORT];
 	struct usbip_imported_device idev[MAXNPORT];
 };
 };