aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/class
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2012-01-16 09:11:57 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2012-01-24 15:18:25 -0500
commit62aaf24dc125d7c55c93e313d15611f152b030c7 (patch)
tree53aa5c498a5ffae8c8c78bef3be0889c9af61bfd /drivers/usb/class
parente8537bd2c4f325a4796da33564ddcef9489b7feb (diff)
USB: cdc-wdm: call wake_up_all to allow driver to shutdown on device removal
wdm_disconnect() waits for the mutex held by wdm_read() before calling wake_up_all(). This causes a deadlock, preventing device removal to complete. Do the wake_up_all() before we start waiting for the locks. Signed-off-by: Bjørn Mork <bjorn@mork.no> Cc: Oliver Neukum <oliver@neukum.org> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/class')
-rw-r--r--drivers/usb/class/cdc-wdm.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 023d271c2614..07aa67611b65 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -786,13 +786,13 @@ static void wdm_disconnect(struct usb_interface *intf)
786 /* to terminate pending flushes */ 786 /* to terminate pending flushes */
787 clear_bit(WDM_IN_USE, &desc->flags); 787 clear_bit(WDM_IN_USE, &desc->flags);
788 spin_unlock_irqrestore(&desc->iuspin, flags); 788 spin_unlock_irqrestore(&desc->iuspin, flags);
789 wake_up_all(&desc->wait);
789 mutex_lock(&desc->rlock); 790 mutex_lock(&desc->rlock);
790 mutex_lock(&desc->wlock); 791 mutex_lock(&desc->wlock);
791 kill_urbs(desc); 792 kill_urbs(desc);
792 cancel_work_sync(&desc->rxwork); 793 cancel_work_sync(&desc->rxwork);
793 mutex_unlock(&desc->wlock); 794 mutex_unlock(&desc->wlock);
794 mutex_unlock(&desc->rlock); 795 mutex_unlock(&desc->rlock);
795 wake_up_all(&desc->wait);
796 if (!desc->count) 796 if (!desc->count)
797 cleanup(desc); 797 cleanup(desc);
798 mutex_unlock(&wdm_mutex); 798 mutex_unlock(&wdm_mutex);