Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 253338
b: refs/heads/master
c: d3ac077
h: refs/heads/master
v: v3
  • Loading branch information
Arjan Mels authored and Greg Kroah-Hartman committed Jun 7, 2011
1 parent 436393f commit ae8b521
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: c11c4eebdd75fc0f443a3f794a2ddc85afed1932
refs/heads/master: d3ac0778801708caecb2b172328064255a350432
21 changes: 21 additions & 0 deletions trunk/drivers/staging/usbip/stub_dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
static int stub_probe(struct usb_interface *interface,
const struct usb_device_id *id);
static void stub_disconnect(struct usb_interface *interface);
static int stub_pre_reset(struct usb_interface *interface);
static int stub_post_reset(struct usb_interface *interface);

/*
* Define device IDs here if you want to explicitly limit exportable devices.
Expand Down Expand Up @@ -59,6 +61,8 @@ struct usb_driver stub_driver = {
.probe = stub_probe,
.disconnect = stub_disconnect,
.id_table = stub_table,
.pre_reset = stub_pre_reset,
.post_reset = stub_post_reset,
};

/*
Expand Down Expand Up @@ -541,3 +545,20 @@ static void stub_disconnect(struct usb_interface *interface)
del_match_busid((char *)udev_busid);
}
}

/*
* Presence of pre_reset and post_reset prevents the driver from being unbound
* when the device is being reset
*/

int stub_pre_reset(struct usb_interface *interface)
{
dev_dbg(&interface->dev, "pre_reset\n");
return 0;
}

int stub_post_reset(struct usb_interface *interface)
{
dev_dbg(&interface->dev, "post_reset\n");
return 0;
}
20 changes: 11 additions & 9 deletions trunk/drivers/staging/usbip/stub_rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -175,16 +175,18 @@ static int tweak_reset_device_cmd(struct urb *urb)
dev_info(&urb->dev->dev, "usb_queue_reset_device\n");

/*
* 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.
* With the implementation of pre_reset and post_reset the driver no
* longer unbinds. This allows the use of synchronous reset.
*/
usb_queue_reset_device(sdev->interface);

if (usb_lock_device_for_reset(sdev->udev, sdev->interface)<0)
{
dev_err(&urb->dev->dev, "could not obtain lock to reset device\n");
return 0;
}
usb_reset_device(sdev->udev);
usb_unlock_device(sdev->udev);

return 0;
}

Expand Down

0 comments on commit ae8b521

Please sign in to comment.