diff options
Diffstat (limited to 'drivers/staging/usbip')
-rw-r--r-- | drivers/staging/usbip/Kconfig | 4 | ||||
-rw-r--r-- | drivers/staging/usbip/stub_dev.c | 8 | ||||
-rw-r--r-- | drivers/staging/usbip/stub_rx.c | 2 | ||||
-rw-r--r-- | drivers/staging/usbip/usbip_common.c | 7 | ||||
-rw-r--r-- | drivers/staging/usbip/userspace/configure.ac | 12 | ||||
-rw-r--r-- | drivers/staging/usbip/userspace/doc/usbip.8 | 66 | ||||
-rw-r--r-- | drivers/staging/usbip/userspace/doc/usbip_bind_driver.8 | 42 | ||||
-rw-r--r-- | drivers/staging/usbip/userspace/doc/usbipd.8 | 16 | ||||
-rw-r--r-- | drivers/staging/usbip/vhci_hcd.c | 31 |
9 files changed, 94 insertions, 94 deletions
diff --git a/drivers/staging/usbip/Kconfig b/drivers/staging/usbip/Kconfig index dd13c0220681..199b1d4c0b85 100644 --- a/drivers/staging/usbip/Kconfig +++ b/drivers/staging/usbip/Kconfig @@ -1,6 +1,6 @@ config USBIP_CORE - tristate "USB/IP support (EXPERIMENTAL)" - depends on USB && NET && EXPERIMENTAL + tristate "USB/IP support" + depends on USB && NET default N ---help--- This enables pushing USB packets over IP to allow remote diff --git a/drivers/staging/usbip/stub_dev.c b/drivers/staging/usbip/stub_dev.c index 92ced35e6b7f..c8d79a7f0e0e 100644 --- a/drivers/staging/usbip/stub_dev.c +++ b/drivers/staging/usbip/stub_dev.c @@ -187,10 +187,14 @@ static void stub_shutdown_connection(struct usbip_device *ud) } /* 1. stop threads */ - if (ud->tcp_rx) + if (ud->tcp_rx) { kthread_stop_put(ud->tcp_rx); - if (ud->tcp_tx) + ud->tcp_rx = NULL; + } + if (ud->tcp_tx) { kthread_stop_put(ud->tcp_tx); + ud->tcp_tx = NULL; + } /* * 2. close the socket diff --git a/drivers/staging/usbip/stub_rx.c b/drivers/staging/usbip/stub_rx.c index 1d5b3fc62160..694cfd7596f3 100644 --- a/drivers/staging/usbip/stub_rx.c +++ b/drivers/staging/usbip/stub_rx.c @@ -155,7 +155,7 @@ static int tweak_set_configuration_cmd(struct urb *urb) * eventually reassigned to the device as far as driver matching * condition is kept. * - * Unfortunatelly, an existing usbip connection will be dropped + * Unfortunately, an existing usbip connection will be dropped * due to this driver unbinding. So, skip here. * A user may need to set a special configuration value before * exporting the device. diff --git a/drivers/staging/usbip/usbip_common.c b/drivers/staging/usbip/usbip_common.c index 70f230269329..57f11f9cd8a5 100644 --- a/drivers/staging/usbip/usbip_common.c +++ b/drivers/staging/usbip/usbip_common.c @@ -22,7 +22,9 @@ #include <linux/fs.h> #include <linux/kernel.h> #include <linux/slab.h> +#include <linux/stat.h> #include <linux/module.h> +#include <linux/moduleparam.h> #include <net/sock.h> #include "usbip_common.h" @@ -36,6 +38,8 @@ unsigned long usbip_debug_flag = 0xffffffff; unsigned long usbip_debug_flag; #endif EXPORT_SYMBOL_GPL(usbip_debug_flag); +module_param(usbip_debug_flag, ulong, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(usbip_debug_flag, "debug flags (defined in usbip_common.h)"); /* FIXME */ struct device_attribute dev_attr_usbip_debug; @@ -157,8 +161,7 @@ static void usbip_dump_usb_device(struct usb_device *udev) dev_dbg(dev, "have_langid %d, string_langid %d\n", udev->have_langid, udev->string_langid); - dev_dbg(dev, "maxchild %d, children %p\n", - udev->maxchild, udev->children); + dev_dbg(dev, "maxchild %d\n", udev->maxchild); } static void usbip_dump_request_type(__u8 rt) diff --git a/drivers/staging/usbip/userspace/configure.ac b/drivers/staging/usbip/userspace/configure.ac index bf5cf49cb554..43e641e5ac06 100644 --- a/drivers/staging/usbip/userspace/configure.ac +++ b/drivers/staging/usbip/userspace/configure.ac @@ -56,11 +56,11 @@ AC_ARG_WITH([tcp-wrappers], [AS_HELP_STRING([--with-tcp-wrappers], [use the libwrap (TCP wrappers) library])], dnl [ACTION-IF-GIVEN] - [saved_LIBS="$LIBS" - if test "$withval" = "yes"; then + [if test "$withval" = "yes"; then AC_MSG_RESULT([yes]) AC_MSG_CHECKING([for hosts_access in -lwrap]) - LIBS="-lwrap $LIBS" + saved_LIBS="$LIBS" + LIBS="-lwrap $saved_LIBS" AC_TRY_LINK( [int hosts_access(); int allow_severity, deny_severity;], [hosts_access()], @@ -69,9 +69,9 @@ AC_ARG_WITH([tcp-wrappers], [use tcp wrapper]) wrap_LIB="-lwrap"], [AC_MSG_RESULT([not found]); exit 1]) else - AC_MSG_RESULT([no]) - fi - LIBS="$saved_LIBS"], + AC_MSG_RESULT([no]); + LIBS="$saved_LIBS" + fi], dnl [ACTION-IF-NOT-GIVEN] [AC_MSG_RESULT([(default)]) AC_MSG_CHECKING([for hosts_access in -lwrap]) diff --git a/drivers/staging/usbip/userspace/doc/usbip.8 b/drivers/staging/usbip/userspace/doc/usbip.8 index 1653bb2cd7d1..6e0d74503792 100644 --- a/drivers/staging/usbip/userspace/doc/usbip.8 +++ b/drivers/staging/usbip/userspace/doc/usbip.8 @@ -3,69 +3,87 @@ usbip \- manage USB/IP devices .SH SYNOPSIS .B usbip -[\fIoptions\fR] +[\foptions\R] <\fIcommand\fR> <\fIargs\fR> .SH DESCRIPTION -Devices exported by USB/IP servers can be listed, attached and -detached using this program. +On a USB/IP server, devices can be listed, bound, and unbound using +this program. On a USB/IP client, devices exported by USB/IP servers +can be listed, attached and detached. .SH OPTIONS .HP -\fB\-a\fR, \fB\-\-attach\fR <host> <bus_id> +\fB\-\-debug\fR .IP -Attach a remote USB device. +Print debugging information. +.PP + +.HP +\fB\-\-log\fR +.IP +Log to syslog. +.PP + +.SH COMMANDS +.HP +\fBversion\fR +.IP +Show version and exit. .PP .HP -\fB\-x\fR, \fB\-\-attachall\fR <host> +\fBhelp\fR [\fIcommand\fR] .IP -Attach all remote USB devices on the specific host. +Print the program help message, or help on a specific command, and +then exit. .PP .HP -\fB\-d\fR, \fB\-\-detach\fR <ports> +\fBattach\fR \-\-host=<\fIhost\fR> \-\-busid=<\fIbus_id\fR> +.IP +Attach a remote USB device. +.PP + +.HP +\fBdetach\fR \-\-port=<\fIport\fR> .IP Detach an imported USB device. .PP .HP -\fB\-l\fR, \fB\-\-list\fR <hosts> +\fBbind\fR \-\-busid=<\fIbusid\fR> .IP -List exported USB devices. +Make a device exportable. .PP .HP -\fB\-p\fR, \fB\-\-port\fR +\fBunbind\fR \-\-busid=<\fIbusid\fR> .IP -List virtual USB port status. +Stop exporting a device so it can be used by a local driver. .PP .HP -\fB\-D\fR, \fB\-\-debug\fR +\fBlist\fR \-\-remote=<\fIhost\fR> .IP -Print debugging information. +List USB devices exported by a remote host. .PP .HP -\fB\-v\fR, \fB\-\-version\fR +\fBlist\fR \-\-local .IP -Show version. +List local USB devices. .PP + .SH EXAMPLES - client:# usbip --list server + client:# usbip list --remote=server - List exportable usb devices on the server. - client:# usbip --attach server 1-2 + client:# usbip attach --host=server --busid=1-2 - Connect the remote USB device. - client:# usbip --port - - Show virtual port status. - - client:# usbip --detach 0 + client:# usbip detach --port=0 - Detach the usb device. .SH "SEE ALSO" -\fBusbipd\fP\fB(8)\fB\fP, -\fBusbip_attach_driver\fP\fB(8)\fB\fP +\fBusbipd\fP\fB(8)\fB\fP diff --git a/drivers/staging/usbip/userspace/doc/usbip_bind_driver.8 b/drivers/staging/usbip/userspace/doc/usbip_bind_driver.8 deleted file mode 100644 index d43bbd6be934..000000000000 --- a/drivers/staging/usbip/userspace/doc/usbip_bind_driver.8 +++ /dev/null @@ -1,42 +0,0 @@ -.TH USBIP_BIND_DRIVER "8" "February 2009" "usbip" "System Administration Utilities" -.SH NAME -usbip_bind_driver \- change driver binding for USB/IP - -.SH SYNOPSIS -.B usbip_bind_driver -[\fIoptions\fR] - -.SH DESCRIPTION -Driver bindings for USB devices can be changed using -this program. It is used to export and unexport USB -devices over USB/IP. - -.SH OPTIONS -.TP -\fB\-u\fR, \fB\-\-usbip\fR <busid> -Make a device exportable -.TP -\fB\-o\fR, \fB\-\-other\fR <busid> -Use a device by a local driver -.TP -\fB\-l\fR, \fB\-\-list\fR -Print usb devices and their drivers -.TP -\fB\-L\fR, \fB\-\-list2\fR -Print usb devices and their drivers in parseable mode - -.SH EXAMPLES - - server:# usbip_bind_driver --list - - List driver assignments for usb devices. - - server:# usbip_bind_driver --usbip 1-2 - - Bind usbip-host.ko to the device of busid 1-2. - - A usb device 1-2 is now exportable to other hosts! - - server:# usbip_bind_driver --other 1-2 - - Shutdown exporting and use the device locally. - -.SH "SEE ALSO" -\fBusbip\fP\fB(8)\fB\fP, -\fBusbipd\fP\fB(8)\fB\fP diff --git a/drivers/staging/usbip/userspace/doc/usbipd.8 b/drivers/staging/usbip/userspace/doc/usbipd.8 index 006559f1df25..d896936f1780 100644 --- a/drivers/staging/usbip/userspace/doc/usbipd.8 +++ b/drivers/staging/usbip/userspace/doc/usbipd.8 @@ -10,7 +10,7 @@ usbipd \- USB/IP server daemon provides USB/IP clients access to exported USB devices. Devices have to explicitly be exported using -.B usbip_bind_driver +.B usbip bind before usbipd makes them available to other hosts. The daemon accepts connections from USB/IP clients @@ -29,6 +29,11 @@ Run as a daemon process. Print debugging information. .PP +\fB\-h\fR, \fB\-\-help\fR +.IP +Print the program help message and exit. +.PP + .HP \fB\-v\fR, \fB\-\-version\fR .IP @@ -48,15 +53,14 @@ USB/IP client can connect and use exported devices. server:# usbipd -D - Start usbip daemon. - server:# usbip_bind_driver --list + server:# usbip list --local - List driver assignments for usb devices. - server:# usbip_bind_driver --usbip 1-2 + server:# usbip bind --busid=1-2 - Bind usbip-host.ko to the device of busid 1-2. - A usb device 1-2 is now exportable to other hosts! - - Use 'usbip_bind_driver --other 1-2' when you want to shutdown exporting and use the device locally. + - Use 'usbip unbind --busid=1-2' when you want to shutdown exporting and use the device locally. .SH "SEE ALSO" -\fBusbip\fP\fB(8)\fB\fP, -\fBusbip_attach_driver\fP\fB(8)\fB\fP +\fBusbip\fP\fB(8)\fB\fP diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c index 12a9a5fbc797..620d1beb4587 100644 --- a/drivers/staging/usbip/vhci_hcd.c +++ b/drivers/staging/usbip/vhci_hcd.c @@ -220,7 +220,7 @@ static int vhci_hub_status(struct usb_hcd *hcd, char *buf) pr_info("changed %d\n", changed); - if (hcd->state == HC_STATE_SUSPENDED) + if ((hcd->state == HC_STATE_SUSPENDED) && (changed == 1)) usb_hcd_resume_root_hub(hcd); done: @@ -749,6 +749,7 @@ static void vhci_device_unlink_cleanup(struct vhci_device *vdev) { struct vhci_unlink *unlink, *tmp; + spin_lock(&the_controller->lock); spin_lock(&vdev->priv_lock); list_for_each_entry_safe(unlink, tmp, &vdev->unlink_tx, list) { @@ -757,9 +758,12 @@ static void vhci_device_unlink_cleanup(struct vhci_device *vdev) kfree(unlink); } - list_for_each_entry_safe(unlink, tmp, &vdev->unlink_rx, list) { + while (!list_empty(&vdev->unlink_rx)) { struct urb *urb; + unlink = list_first_entry(&vdev->unlink_rx, struct vhci_unlink, + list); + /* give back URB of unanswered unlink request */ pr_info("unlink cleanup rx %lu\n", unlink->unlink_seqnum); @@ -774,18 +778,24 @@ static void vhci_device_unlink_cleanup(struct vhci_device *vdev) urb->status = -ENODEV; - spin_lock(&the_controller->lock); usb_hcd_unlink_urb_from_ep(vhci_to_hcd(the_controller), urb); + + list_del(&unlink->list); + + spin_unlock(&vdev->priv_lock); spin_unlock(&the_controller->lock); usb_hcd_giveback_urb(vhci_to_hcd(the_controller), urb, urb->status); - list_del(&unlink->list); + spin_lock(&the_controller->lock); + spin_lock(&vdev->priv_lock); + kfree(unlink); } spin_unlock(&vdev->priv_lock); + spin_unlock(&the_controller->lock); } /* @@ -804,11 +814,14 @@ static void vhci_shutdown_connection(struct usbip_device *ud) } /* kill threads related to this sdev, if v.c. exists */ - if (vdev->ud.tcp_rx) + if (vdev->ud.tcp_rx) { kthread_stop_put(vdev->ud.tcp_rx); - if (vdev->ud.tcp_tx) + vdev->ud.tcp_rx = NULL; + } + if (vdev->ud.tcp_tx) { kthread_stop_put(vdev->ud.tcp_tx); - + vdev->ud.tcp_tx = NULL; + } pr_info("stop threads\n"); /* active connection is closed */ @@ -828,11 +841,11 @@ static void vhci_shutdown_connection(struct usbip_device *ud) * disable endpoints. pending urbs are unlinked(dequeued). * * NOTE: After calling rh_port_disconnect(), the USB device drivers of a - * deteched device should release used urbs in a cleanup function(i.e. + * detached device should release used urbs in a cleanup function (i.e. * xxx_disconnect()). Therefore, vhci_hcd does not need to release * pushed urbs and their private data in this function. * - * NOTE: vhci_dequeue() must be considered carefully. When shutdowning + * NOTE: vhci_dequeue() must be considered carefully. When shutting down * a connection, vhci_shutdown_connection() expects vhci_dequeue() * gives back pushed urbs and frees their private data by request of * the cleanup function of a USB driver. When unlinking a urb with an |