Update to 2.6.32.39 Mainline
/drivers/staging/usbip/stub_rx.c
blob:a9cdc4c1d61eb8c7940358e11d47cd863077d391 -> blob:815fb7cc3b2362d45c2af9e0def402d9a24ff195
--- drivers/staging/usbip/stub_rx.c
+++ drivers/staging/usbip/stub_rx.c
@@ -168,23 +168,33 @@ static int tweak_set_configuration_cmd(s
static int tweak_reset_device_cmd(struct urb *urb)
{
- struct stub_priv *priv = (struct stub_priv *) urb->context;
- struct stub_device *sdev = priv->sdev;
+ struct usb_ctrlrequest *req;
+ __u16 value;
+ __u16 index;
+ int ret;
- usbip_uinfo("reset_device %s\n", dev_name(&urb->dev->dev));
+ req = (struct usb_ctrlrequest *) urb->setup_packet;
+ value = le16_to_cpu(req->wValue);
+ index = le16_to_cpu(req->wIndex);
- /*
- * usb_lock_device_for_reset caused a deadlock: it causes the driver
- * to unbind. In the shutdown the rx thread is signalled to shut down
- * but this thread is pending in the usb_lock_device_for_reset.
- *
- * Instead queue the reset.
- *
- * Unfortunatly an existing usbip connection will be dropped due to
- * driver unbinding.
- */
- usb_queue_reset_device(sdev->interface);
- return 0;
+ usbip_uinfo("reset_device (port %d) to %s\n", index,
+ dev_name(&urb->dev->dev));
+
+ /* all interfaces should be owned by usbip driver, so just reset it. */
+ ret = usb_lock_device_for_reset(urb->dev, NULL);
+ if (ret < 0) {
+ dev_err(&urb->dev->dev, "lock for reset\n");
+ return ret;
+ }
+
+ /* try to reset the device */
+ ret = usb_reset_device(urb->dev);
+ if (ret < 0)
+ dev_err(&urb->dev->dev, "device reset\n");
+
+ usb_unlock_device(urb->dev);
+
+ return ret;
}
/*