From 788c5bdba4e61b9a9da848f6278cb7b1d8b5c109 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Fri, 29 Apr 2011 14:12:21 +0200 Subject: [PATCH] --- yaml --- r: 248739 b: refs/heads/master c: d771d8aa37805f5bf75808b12b737f39ee97f5d4 h: refs/heads/master i: 248737: 985eeb96487f51a6306ac7e09c3d055cc648dce8 248735: 5509f75236a798847dd2eec9b49a665dfec9da85 v: v3 --- [refs] | 2 +- trunk/drivers/usb/class/cdc-wdm.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 31d8855c4223..be60b458942d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b4026c4584cd70858d4d3450abfb1cd0714d4f32 +refs/heads/master: d771d8aa37805f5bf75808b12b737f39ee97f5d4 diff --git a/trunk/drivers/usb/class/cdc-wdm.c b/trunk/drivers/usb/class/cdc-wdm.c index a97c018dd419..2b9ff518b509 100644 --- a/trunk/drivers/usb/class/cdc-wdm.c +++ b/trunk/drivers/usb/class/cdc-wdm.c @@ -542,6 +542,8 @@ static int wdm_open(struct inode *inode, struct file *file) mutex_lock(&desc->lock); if (!desc->count++) { + desc->werr = 0; + desc->rerr = 0; rv = usb_submit_urb(desc->validity, GFP_KERNEL); if (rv < 0) { desc->count--; @@ -853,6 +855,18 @@ static int wdm_pre_reset(struct usb_interface *intf) struct wdm_device *desc = usb_get_intfdata(intf); mutex_lock(&desc->lock); + kill_urbs(desc); + + /* + * we notify everybody using poll of + * an exceptional situation + * must be done before recovery lest a spontaneous + * message from the device is lost + */ + spin_lock_irq(&desc->iuspin); + desc->rerr = -EINTR; + spin_unlock_irq(&desc->iuspin); + wake_up_all(&desc->wait); return 0; }