usbip: tools: Add vudc backend to usbip tools
authorKrzysztof Opasiak <k.opasiak@samsung.com>
Tue, 8 Mar 2016 20:49:05 +0000 (21:49 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 26 Apr 2016 22:19:50 +0000 (15:19 -0700)
Adds an equivalent of usbip_host_driver for the vudc. Most
of the code is already shared, but this adds some vudc specific
code for getting information about devices.

Based on code created in cooperation with Open Operating Systems
Student Society at University of Warsaw (O2S3@UW) consisting of:

   Igor Kotrasinski <ikotrasinsk@gmail.com>
   Karol Kosik <karo9@interia.eu>
   Ewelina Kosmider <3w3lfin@gmail.com>
   Dawid Lazarczyk <lazarczyk.dawid@gmail.com>
   Piotr Szulc <ps347277@students.mimuw.edu.pl>

Tutor and project owner:
   Krzysztof Opasiak <k.opasiak@samsung.com>

Signed-off-by: Krzysztof Opasiak <k.opasiak@samsung.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tools/usb/usbip/libsrc/Makefile.am
tools/usb/usbip/libsrc/usbip_common.h
tools/usb/usbip/libsrc/usbip_device_driver.c [new file with mode: 0644]
tools/usb/usbip/libsrc/usbip_device_driver.h [new file with mode: 0644]

index eb62f99cc0eeac83137826c9151c34f6728b7260..90daf95c0804a4a726bb62e595620e22679ab648 100644 (file)
@@ -4,6 +4,7 @@ libusbip_la_LDFLAGS  = -version-info @LIBUSBIP_VERSION@
 
 lib_LTLIBRARIES := libusbip.la
 libusbip_la_SOURCES := names.c names.h usbip_host_driver.c usbip_host_driver.h \
+                      usbip_device_driver.c usbip_device_driver.h \
                       usbip_common.c usbip_common.h usbip_host_common.h \
                       usbip_host_common.c vhci_driver.c vhci_driver.h \
                       sysfs_utils.c sysfs_utils.h
index 15fe792e1e9655bf35e016f0a4de1a1f72737c7f..51ef5fe485dde86f53b7b7debe88682ab3ba693c 100644 (file)
 #define VHCI_STATE_PATH "/var/run/vhci_hcd"
 #endif
 
+#define VUDC_DEVICE_DESCR_FILE "dev_desc"
+
 /* kernel module names */
 #define USBIP_CORE_MOD_NAME    "usbip-core"
 #define USBIP_HOST_DRV_NAME    "usbip-host"
+#define USBIP_DEVICE_DRV_NAME  "usbip-vudc"
 #define USBIP_VHCI_DRV_NAME    "vhci_hcd"
 
 /* sysfs constants */
diff --git a/tools/usb/usbip/libsrc/usbip_device_driver.c b/tools/usb/usbip/libsrc/usbip_device_driver.c
new file mode 100644 (file)
index 0000000..e059b7d
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
+ *              2015 Samsung Electronics
+ * Author:      Igor Kotrasinski <i.kotrasinsk@samsung.com>
+ *
+ * Based on tools/usb/usbip/libsrc/usbip_host_driver.c, which is:
+ * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
+ *               2005-2007 Takahiro Hirofuchi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <fcntl.h>
+#include <string.h>
+#include <linux/usb/ch9.h>
+
+#include <unistd.h>
+
+#include "usbip_host_common.h"
+#include "usbip_device_driver.h"
+
+#undef  PROGNAME
+#define PROGNAME "libusbip"
+
+#define copy_descr_attr16(dev, descr, attr)                    \
+               ((dev)->attr = le16toh((descr)->attr))          \
+
+#define copy_descr_attr(dev, descr, attr)                      \
+               ((dev)->attr = (descr)->attr)                   \
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+static struct {
+       enum usb_device_speed speed;
+       const char *name;
+} speed_names[] = {
+       {
+               .speed = USB_SPEED_UNKNOWN,
+               .name = "UNKNOWN",
+       },
+       {
+               .speed = USB_SPEED_LOW,
+               .name = "low-speed",
+       },
+       {
+               .speed = USB_SPEED_FULL,
+               .name = "full-speed",
+       },
+       {
+               .speed = USB_SPEED_HIGH,
+               .name = "high-speed",
+       },
+       {
+               .speed = USB_SPEED_WIRELESS,
+               .name = "wireless",
+       },
+       {
+               .speed = USB_SPEED_SUPER,
+               .name = "super-speed",
+       },
+};
+
+static
+int read_usb_vudc_device(struct udev_device *sdev, struct usbip_usb_device *dev)
+{
+       const char *path, *name;
+       char filepath[SYSFS_PATH_MAX];
+       struct usb_device_descriptor descr;
+       unsigned i;
+       FILE *fd = NULL;
+       struct udev_device *plat;
+       const char *speed;
+       int ret = 0;
+
+       plat = udev_device_get_parent(sdev);
+       path = udev_device_get_syspath(plat);
+       snprintf(filepath, SYSFS_PATH_MAX, "%s/%s",
+                path, VUDC_DEVICE_DESCR_FILE);
+       fd = fopen(filepath, "r");
+       if (!fd)
+               return -1;
+       ret = fread((char *) &descr, sizeof(descr), 1, fd);
+       if (ret < 0)
+               return -1;
+       fclose(fd);
+
+       copy_descr_attr(dev, &descr, bDeviceClass);
+       copy_descr_attr(dev, &descr, bDeviceSubClass);
+       copy_descr_attr(dev, &descr, bDeviceProtocol);
+       copy_descr_attr(dev, &descr, bNumConfigurations);
+       copy_descr_attr16(dev, &descr, idVendor);
+       copy_descr_attr16(dev, &descr, idProduct);
+       copy_descr_attr16(dev, &descr, bcdDevice);
+
+       strncpy(dev->path, path, SYSFS_PATH_MAX);
+
+       dev->speed = USB_SPEED_UNKNOWN;
+       speed = udev_device_get_sysattr_value(sdev, "current_speed");
+       if (speed) {
+               for (i = 0; i < ARRAY_SIZE(speed_names); i++) {
+                       if (!strcmp(speed_names[i].name, speed)) {
+                               dev->speed = speed_names[i].speed;
+                               break;
+                       }
+               }
+       }
+
+       /* Only used for user output, little sense to output them in general */
+       dev->bNumInterfaces = 0;
+       dev->bConfigurationValue = 0;
+       dev->busnum = 0;
+
+       name = udev_device_get_sysname(plat);
+       strncpy(dev->busid, name, SYSFS_BUS_ID_SIZE);
+       return 0;
+}
+
+static int is_my_device(struct udev_device *dev)
+{
+       const char *driver;
+
+       driver = udev_device_get_property_value(dev, "USB_UDC_NAME");
+       return driver != NULL && !strcmp(driver, USBIP_DEVICE_DRV_NAME);
+}
+
+static int usbip_device_driver_open(struct usbip_host_driver *hdriver)
+{
+       int ret;
+
+       hdriver->ndevs = 0;
+       INIT_LIST_HEAD(&hdriver->edev_list);
+
+       ret = usbip_generic_driver_open(hdriver);
+       if (ret)
+               err("please load " USBIP_CORE_MOD_NAME ".ko and "
+                   USBIP_DEVICE_DRV_NAME ".ko!");
+
+       return ret;
+}
+
+struct usbip_host_driver device_driver = {
+       .edev_list = LIST_HEAD_INIT(device_driver.edev_list),
+       .udev_subsystem = "udc",
+       .ops = {
+               .open = usbip_device_driver_open,
+               .close = usbip_generic_driver_close,
+               .refresh_device_list = usbip_generic_refresh_device_list,
+               .get_device = usbip_generic_get_device,
+               .read_device = read_usb_vudc_device,
+               .is_my_device = is_my_device,
+       },
+};
diff --git a/tools/usb/usbip/libsrc/usbip_device_driver.h b/tools/usb/usbip/libsrc/usbip_device_driver.h
new file mode 100644 (file)
index 0000000..54cb658
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 Karol Kosik <karo9@interia.eu>
+ *              2015 Samsung Electronics
+ * Author:      Igor Kotrasinski <i.kotrasinsk@samsung.com>
+ *
+ * Based on tools/usb/usbip/libsrc/usbip_host_driver.c, which is:
+ * Copyright (C) 2011 matt mooney <mfm@muteddisk.com>
+ *               2005-2007 Takahiro Hirofuchi
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __USBIP_DEVICE_DRIVER_H
+#define __USBIP_DEVICE_DRIVER_H
+
+#include <stdint.h>
+#include "usbip_common.h"
+#include "usbip_host_common.h"
+#include "list.h"
+
+extern struct usbip_host_driver device_driver;
+
+#endif /* __USBIP_DEVICE_DRIVER_H */