Merge branch 'for-linus' of git://git.kernel.dk/linux-block
[pandora-kernel.git] / drivers / staging / usbip / userspace / libsrc / vhci_driver.c
index db43f8d..abbc285 100644 (file)
@@ -2,11 +2,11 @@
  * Copyright (C) 2005-2007 Takahiro Hirofuchi
  */
 
+#include "usbip_common.h"
+#include "vhci_driver.h"
 
-#include "usbip.h"
-
-
-static const char vhci_driver_name[] = "vhci_hcd";
+#undef  PROGNAME
+#define PROGNAME "libusbip"
 
 struct usbip_vhci_driver *vhci_driver;
 
@@ -16,17 +16,19 @@ static struct usbip_imported_device *imported_device_init(struct usbip_imported_
 
        sudev = sysfs_open_device("usb", busid);
        if (!sudev) {
-               err("sysfs_open_device %s", busid);
+               dbg("sysfs_open_device failed: %s", busid);
                goto err;
        }
        read_usb_device(sudev, &idev->udev);
        sysfs_close_device(sudev);
 
        /* add class devices of this imported device */
-       struct class_device *cdev;
-       dlist_for_each_data(vhci_driver->cdev_list, cdev, struct class_device) {
-               if (!strncmp(cdev->devpath, idev->udev.path, strlen(idev->udev.path))) {
-                       struct class_device *new_cdev;
+       struct usbip_class_device *cdev;
+       dlist_for_each_data(vhci_driver->cdev_list, cdev,
+                           struct usbip_class_device) {
+               if (!strncmp(cdev->dev_path, idev->udev.path,
+                            strlen(idev->udev.path))) {
+                       struct usbip_class_device *new_cdev;
 
                        /* alloc and copy because dlist is linked from only one list */
                        new_cdev = calloc(1, sizeof(*new_cdev));
@@ -53,7 +55,7 @@ static int parse_status(char *value)
 
 
        for (int i = 0; i < vhci_driver->nports; i++)
-               bzero(&vhci_driver->idev[i], sizeof(struct usbip_imported_device));
+               memset(&vhci_driver->idev[i], 0, sizeof(vhci_driver->idev[i]));
 
 
        /* skip a header line */
@@ -69,7 +71,7 @@ static int parse_status(char *value)
                                &devid, &socket, lbusid);
 
                if (ret < 5) {
-                       err("scanf %d", ret);
+                       dbg("sscanf failed: %d", ret);
                        BUG();
                }
 
@@ -90,16 +92,16 @@ static int parse_status(char *value)
                        idev->busnum    = (devid >> 16);
                        idev->devnum    = (devid & 0x0000ffff);
 
-                       idev->cdev_list = dlist_new(sizeof(struct class_device));
+                       idev->cdev_list = dlist_new(sizeof(struct usbip_class_device));
                        if (!idev->cdev_list) {
-                               err("init new device");
+                               dbg("dlist_new failed");
                                return -1;
                        }
 
                        if (idev->status != VDEV_ST_NULL && idev->status != VDEV_ST_NOTASSIGNED) {
                                idev = imported_device_init(idev, lbusid);
                                if (!idev) {
-                                       err("init new device");
+                                       dbg("imported_device_init failed");
                                        return -1;
                                }
                        }
@@ -118,29 +120,29 @@ static int parse_status(char *value)
 
 static int check_usbip_device(struct sysfs_class_device *cdev)
 {
-       char clspath[SYSFS_PATH_MAX];   /* /sys/class/video4linux/video0/device     */
-       char devpath[SYSFS_PATH_MAX];   /* /sys/devices/platform/vhci_hcd/usb6/6-1:1.1  */
-
+       char class_path[SYSFS_PATH_MAX]; /* /sys/class/video4linux/video0/device */
+       char dev_path[SYSFS_PATH_MAX];   /* /sys/devices/platform/vhci_hcd/usb6/6-1:1.1 */
        int ret;
+       struct usbip_class_device *usbip_cdev;
 
-       snprintf(clspath, sizeof(clspath), "%s/device", cdev->path);
+       snprintf(class_path, sizeof(class_path), "%s/device", cdev->path);
 
-       ret = sysfs_get_link(clspath, devpath, SYSFS_PATH_MAX);
-       if (!ret) {
-               if (!strncmp(devpath, vhci_driver->hc_device->path,
-                                       strlen(vhci_driver->hc_device->path))) {
+       ret = sysfs_get_link(class_path, dev_path, sizeof(dev_path));
+       if (ret == 0) {
+               if (!strncmp(dev_path, vhci_driver->hc_device->path,
+                            strlen(vhci_driver->hc_device->path))) {
                        /* found usbip device */
-                       struct class_device *cdev;
-
-                       cdev = calloc(1, sizeof(*cdev));
+                       usbip_cdev = calloc(1, sizeof(*usbip_cdev));
                        if (!cdev) {
-                               err("calloc cdev");
+                               dbg("calloc failed");
                                return -1;
                        }
-                       dlist_unshift(vhci_driver->cdev_list, (void*) cdev);
-                       strncpy(cdev->clspath, clspath, sizeof(cdev->clspath));
-                       strncpy(cdev->devpath, devpath, sizeof(cdev->clspath));
-                       dbg("  found %s %s", clspath, devpath);
+                       dlist_unshift(vhci_driver->cdev_list, usbip_cdev);
+                       strncpy(usbip_cdev->class_path, class_path,
+                               sizeof(usbip_cdev->class_path));
+                       strncpy(usbip_cdev->dev_path, dev_path,
+                               sizeof(usbip_cdev->dev_path));
+                       dbg("found: %s %s", class_path, dev_path);
                }
        }
 
@@ -157,11 +159,11 @@ static int search_class_for_usbip_device(char *cname)
 
        class = sysfs_open_class(cname);
        if (!class) {
-               err("open class");
+               dbg("sysfs_open_class failed");
                return -1;
        }
 
-       dbg("class %s", class->name);
+       dbg("class: %s", class->name);
 
        cdev_list = sysfs_get_class_devices(class);
        if (!cdev_list)
@@ -169,7 +171,7 @@ static int search_class_for_usbip_device(char *cname)
                goto out;
 
        dlist_for_each_data(cdev_list, cdev, struct sysfs_class_device) {
-               dbg("   cdev %s", cdev->name);
+               dbg("cdev: %s", cdev->name);
                ret = check_usbip_device(cdev);
                if (ret < 0)
                        goto out;
@@ -187,11 +189,22 @@ static int refresh_class_device_list(void)
        int ret;
        struct dlist *cname_list;
        char *cname;
+       char sysfs_mntpath[SYSFS_PATH_MAX];
+       char class_path[SYSFS_PATH_MAX];
+
+       ret = sysfs_get_mnt_path(sysfs_mntpath, SYSFS_PATH_MAX);
+       if (ret < 0) {
+               dbg("sysfs_get_mnt_path failed");
+               return -1;
+       }
+
+       snprintf(class_path, sizeof(class_path), "%s/%s", sysfs_mntpath,
+                SYSFS_CLASS_NAME);
 
        /* search under /sys/class */
-       cname_list = sysfs_open_directory_list("/sys/class");
+       cname_list = sysfs_open_directory_list(class_path);
        if (!cname_list) {
-               err("open class directory");
+               dbg("sysfs_open_directory failed");
                return -1;
        }
 
@@ -221,45 +234,42 @@ static int refresh_imported_device_list(void)
 
        attr_status = sysfs_get_device_attr(vhci_driver->hc_device, "status");
        if (!attr_status) {
-               err("get attr %s of %s", "status", vhci_driver->hc_device->name);
+               dbg("sysfs_get_device_attr(\"status\") failed: %s",
+                   vhci_driver->hc_device->name);
                return -1;
        }
 
-       dbg("name %s, path %s, len %d, method %d\n", attr_status->name,
-                       attr_status->path, attr_status->len, attr_status->method);
-
-       dbg("%s", attr_status->value);
+       dbg("name: %s  path: %s  len: %d  method: %d  value: %s",
+           attr_status->name, attr_status->path, attr_status->len,
+           attr_status->method, attr_status->value);
 
        return parse_status(attr_status->value);
 }
 
 static int get_nports(void)
 {
+       char *c;
        int nports = 0;
        struct sysfs_attribute *attr_status;
 
        attr_status = sysfs_get_device_attr(vhci_driver->hc_device, "status");
        if (!attr_status) {
-               err("get attr %s of %s", "status", vhci_driver->hc_device->name);
+               dbg("sysfs_get_device_attr(\"status\") failed: %s",
+                   vhci_driver->hc_device->name);
                return -1;
        }
 
-       dbg("name %s, path %s, len %d, method %d\n", attr_status->name,
-                       attr_status->path, attr_status->len, attr_status->method);
-
-       dbg("%s", attr_status->value);
+       dbg("name: %s  path: %s  len: %d  method: %d  value: %s",
+           attr_status->name, attr_status->path, attr_status->len,
+           attr_status->method, attr_status->value);
 
-       {
-               char *c;
-
-               /* skip a header line */
-               c = strchr(attr_status->value, '\n') + 1;
+       /* skip a header line */
+       c = strchr(attr_status->value, '\n') + 1;
 
-               while (*c != '\0') {
-                       /* go to the next line */
-                       c = strchr(c, '\n') + 1;
-                       nports += 1;
-               }
+       while (*c != '\0') {
+               /* go to the next line */
+               c = strchr(c, '\n') + 1;
+               nports += 1;
        }
 
        return nports;
@@ -275,20 +285,21 @@ static int get_hc_busid(char *sysfs_mntpath, char *hc_busid)
 
        int found = 0;
 
-        snprintf(sdriver_path, SYSFS_PATH_MAX, "%s/%s/platform/%s/%s",
-                                sysfs_mntpath, SYSFS_BUS_NAME, SYSFS_DRIVERS_NAME,
-                                vhci_driver_name);
+        snprintf(sdriver_path, SYSFS_PATH_MAX, "%s/%s/%s/%s/%s", sysfs_mntpath,
+                SYSFS_BUS_NAME, USBIP_VHCI_BUS_TYPE, SYSFS_DRIVERS_NAME,
+                USBIP_VHCI_DRV_NAME);
 
         sdriver = sysfs_open_driver_path(sdriver_path);
         if (!sdriver) {
-               info("%s is not found", sdriver_path);
-                info("load usbip-core.ko and vhci-hcd.ko !");
+               dbg("sysfs_open_driver_path failed: %s", sdriver_path);
+                dbg("make sure " USBIP_CORE_MOD_NAME ".ko and "
+                   USBIP_VHCI_DRV_NAME ".ko are loaded!");
                 return -1;
         }
 
        hc_devs = sysfs_get_driver_devices(sdriver);
        if (!hc_devs) {
-               err("get hc list");
+               dbg("sysfs_get_driver failed");
                goto err;
        }
 
@@ -304,7 +315,7 @@ err:
        if (found)
                return 0;
 
-       err("not found usbip hc");
+       dbg("%s not found", hc_busid);
        return -1;
 }
 
@@ -318,13 +329,13 @@ int usbip_vhci_driver_open(void)
 
        vhci_driver = (struct usbip_vhci_driver *) calloc(1, sizeof(*vhci_driver));
        if (!vhci_driver) {
-               err("alloc vhci_driver");
+               dbg("calloc failed");
                return -1;
        }
 
        ret = sysfs_get_mnt_path(vhci_driver->sysfs_mntpath, SYSFS_PATH_MAX);
        if (ret < 0) {
-               err("sysfs must be mounted");
+               dbg("sysfs_get_mnt_path failed");
                goto err;
        }
 
@@ -333,17 +344,18 @@ int usbip_vhci_driver_open(void)
                goto err;
 
        /* will be freed in usbip_driver_close() */
-       vhci_driver->hc_device = sysfs_open_device("platform", hc_busid);
+       vhci_driver->hc_device = sysfs_open_device(USBIP_VHCI_BUS_TYPE,
+                                                  hc_busid);
        if (!vhci_driver->hc_device) {
-               err("get sysfs vhci_driver");
+               dbg("sysfs_open_device failed");
                goto err;
        }
 
        vhci_driver->nports = get_nports();
 
-       info("%d ports available\n", vhci_driver->nports);
+       dbg("available ports: %d", vhci_driver->nports);
 
-       vhci_driver->cdev_list = dlist_new(sizeof(struct class_device));
+       vhci_driver->cdev_list = dlist_new(sizeof(struct usbip_class_device));
        if (!vhci_driver->cdev_list)
                goto err;
 
@@ -402,7 +414,7 @@ int usbip_vhci_refresh_device_list(void)
                        dlist_destroy(vhci_driver->idev[i].cdev_list);
        }
 
-       vhci_driver->cdev_list = dlist_new(sizeof(struct class_device));
+       vhci_driver->cdev_list = dlist_new(sizeof(struct usbip_class_device));
        if (!vhci_driver->cdev_list)
                goto err;
 
@@ -422,7 +434,7 @@ err:
                        dlist_destroy(vhci_driver->idev[i].cdev_list);
        }
 
-       err("refresh device list");
+       dbg("failed to refresh device list");
        return -1;
 }
 
@@ -445,7 +457,8 @@ int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid,
 
        attr_attach = sysfs_get_device_attr(vhci_driver->hc_device, "attach");
        if (!attr_attach) {
-               err("get attach");
+               dbg("sysfs_get_device_attr(\"attach\") failed: %s",
+                   vhci_driver->hc_device->name);
                return -1;
        }
 
@@ -455,11 +468,11 @@ int usbip_vhci_attach_device2(uint8_t port, int sockfd, uint32_t devid,
 
        ret = sysfs_write_attribute(attr_attach, buff, strlen(buff));
        if (ret < 0) {
-               err("write to attach failed");
+               dbg("sysfs_write_attribute failed");
                return -1;
        }
 
-       info("port %d attached", port);
+       dbg("attached port: %d", port);
 
        return 0;
 }
@@ -486,21 +499,21 @@ int usbip_vhci_detach_device(uint8_t port)
 
        attr_detach = sysfs_get_device_attr(vhci_driver->hc_device, "detach");
        if (!attr_detach) {
-               err("get detach");
+               dbg("sysfs_get_device_attr(\"detach\") failed: %s",
+                   vhci_driver->hc_device->name);
                return -1;
        }
 
        snprintf(buff, sizeof(buff), "%u", port);
-       dbg("writing to detach");
        dbg("writing: %s", buff);
 
        ret = sysfs_write_attribute(attr_detach, buff, strlen(buff));
        if (ret < 0) {
-               err("write to detach failed");
+               dbg("sysfs_write_attribute failed");
                return -1;
        }
 
-       info("port %d detached", port);
+       dbg("detached port: %d", port);
 
        return 0;
 }