diff options
Diffstat (limited to 'drivers/staging/usbip/userspace/libsrc/vhci_driver.c')
-rw-r--r-- | drivers/staging/usbip/userspace/libsrc/vhci_driver.c | 167 |
1 files changed, 90 insertions, 77 deletions
diff --git a/drivers/staging/usbip/userspace/libsrc/vhci_driver.c b/drivers/staging/usbip/userspace/libsrc/vhci_driver.c index db43f8d2eb8..abbc285f433 100644 --- a/drivers/staging/usbip/userspace/libsrc/vhci_driver.c +++ b/drivers/staging/usbip/userspace/libsrc/vhci_driver.c @@ -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; } |