Modifications to host driver wrapper and its related operations (i.e. bind/unbind). usbip_get_device() method was not used. The implementation of the method searches a bound devices list by list index. The position in the list is meaningless for any operations so it is assumed not to be used in future. For this patch set, a method to find a bound device in the bound devices list by bus-id is needed. usbip_get_device() is re-implemented as a function to find a bound device by bus-id. bind and unbind function are exported to reuse by new connect and disconnect operation. Here, connect and disconnect is NEW-3 and NEW-4 respactively in diagram below. EXISTING) - invites devices from application(vhci)-side +------+ +------------------+ device--+ STUB | | application/VHCI | +------+ +------------------+ (server) (client) 1) # usbipd ... start daemon = = = 2) # usbip list --local 3) # usbip bind <--- list bound devices --- 4) # usbip list --remote <--- import a device ------ 5) # usbip attach = = = X disconnected 6) # usbip detach 7) usbip unbind NEW) - dedicates devices from device(stub)-side +------+ +------------------+ device--+ STUB | | application/VHCI | +------+ +------------------+ (client) (server) 1) # usbipa ... start daemon = = = 2) # usbip list --local 3) # usbip connect --- export a device ------> = = = 4) # usbip disconnect --- un-export a device ---> Bind and unbind are done in connect and disconnect internally. Signed-off-by: Nobuo Iwata <nobuo.iwata@xxxxxxxxxxxxxxx> --- tools/usb/usbip/libsrc/usbip_host_common.c | 6 ++---- tools/usb/usbip/libsrc/usbip_host_common.h | 8 ++++---- tools/usb/usbip/src/usbip.h | 3 +++ tools/usb/usbip/src/usbip_bind.c | 4 ++-- tools/usb/usbip/src/usbip_unbind.c | 4 ++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/tools/usb/usbip/libsrc/usbip_host_common.c b/tools/usb/usbip/libsrc/usbip_host_common.c index 9d41522..6a98d6c 100644 --- a/tools/usb/usbip/libsrc/usbip_host_common.c +++ b/tools/usb/usbip/libsrc/usbip_host_common.c @@ -256,17 +256,15 @@ int usbip_export_device(struct usbip_exported_device *edev, int sockfd) } struct usbip_exported_device *usbip_generic_get_device( - struct usbip_host_driver *hdriver, int num) + struct usbip_host_driver *hdriver, char *busid) { struct list_head *i; struct usbip_exported_device *edev; - int cnt = 0; list_for_each(i, &hdriver->edev_list) { edev = list_entry(i, struct usbip_exported_device, node); - if (num == cnt) + if (!strncmp(busid, edev->udev.busid, SYSFS_BUS_ID_SIZE)) return edev; - cnt++; } return NULL; diff --git a/tools/usb/usbip/libsrc/usbip_host_common.h b/tools/usb/usbip/libsrc/usbip_host_common.h index a64b803..f9a9def 100644 --- a/tools/usb/usbip/libsrc/usbip_host_common.h +++ b/tools/usb/usbip/libsrc/usbip_host_common.h @@ -38,7 +38,7 @@ struct usbip_host_driver_ops { void (*close)(struct usbip_host_driver *hdriver); int (*refresh_device_list)(struct usbip_host_driver *hdriver); struct usbip_exported_device * (*get_device)( - struct usbip_host_driver *hdriver, int num); + struct usbip_host_driver *hdriver, char *busid); int (*read_device)(struct udev_device *sdev, struct usbip_usb_device *dev); @@ -86,11 +86,11 @@ static inline int usbip_refresh_device_list(struct usbip_host_driver *hdriver) } static inline struct usbip_exported_device * -usbip_get_device(struct usbip_host_driver *hdriver, int num) +usbip_get_device(struct usbip_host_driver *hdriver, char *busid) { if (!hdriver->ops.get_device) return NULL; - return hdriver->ops.get_device(hdriver, num); + return hdriver->ops.get_device(hdriver, busid); } /* Helper functions for implementing driver backend */ @@ -99,6 +99,6 @@ void usbip_generic_driver_close(struct usbip_host_driver *hdriver); int usbip_generic_refresh_device_list(struct usbip_host_driver *hdriver); int usbip_export_device(struct usbip_exported_device *edev, int sockfd); struct usbip_exported_device *usbip_generic_get_device( - struct usbip_host_driver *hdriver, int num); + struct usbip_host_driver *hdriver, char *busid); #endif /* __USBIP_HOST_COMMON_H */ diff --git a/tools/usb/usbip/src/usbip.h b/tools/usb/usbip/src/usbip.h index 84fe66a..c296910 100644 --- a/tools/usb/usbip/src/usbip.h +++ b/tools/usb/usbip/src/usbip.h @@ -37,4 +37,7 @@ void usbip_list_usage(void); void usbip_bind_usage(void); void usbip_unbind_usage(void); +int usbip_bind_device(char *busid); +int usbip_unbind_device(char *busid); + #endif /* __USBIP_H */ diff --git a/tools/usb/usbip/src/usbip_bind.c b/tools/usb/usbip/src/usbip_bind.c index fa46141..2401745 100644 --- a/tools/usb/usbip/src/usbip_bind.c +++ b/tools/usb/usbip/src/usbip_bind.c @@ -139,7 +139,7 @@ static int unbind_other(char *busid) return status; } -static int bind_device(char *busid) +int usbip_bind_device(char *busid) { int rc; struct udev *udev; @@ -200,7 +200,7 @@ int usbip_bind(int argc, char *argv[]) switch (opt) { case 'b': - ret = bind_device(optarg); + ret = usbip_bind_device(optarg); goto out; default: goto err_out; diff --git a/tools/usb/usbip/src/usbip_unbind.c b/tools/usb/usbip/src/usbip_unbind.c index a4a496c..324d986 100644 --- a/tools/usb/usbip/src/usbip_unbind.c +++ b/tools/usb/usbip/src/usbip_unbind.c @@ -39,7 +39,7 @@ void usbip_unbind_usage(void) printf("usage: %s", usbip_unbind_usage_string); } -static int unbind_device(char *busid) +int usbip_unbind_device(char *busid) { char bus_type[] = "usb"; int rc, ret = -1; @@ -127,7 +127,7 @@ int usbip_unbind(int argc, char *argv[]) switch (opt) { case 'b': - ret = unbind_device(optarg); + ret = usbip_unbind_device(optarg); goto out; default: goto err_out; -- 2.1.0 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html