diff options
author | Bjørn Mork <bjorn@mork.no> | 2012-01-16 15:11:57 +0100 |
---|---|---|
committer | Simone Willett <swillett@nvidia.com> | 2012-02-09 16:04:16 -0800 |
commit | 2ea18f70f16e7ad815bda8bbcdb3affcea6e7f8b (patch) | |
tree | d8ee7174ef7d0022a4225f6f46a7d306a7872114 /drivers/usb | |
parent | 2feeef6dbb2417bf762bf31316189a7c6202e8ed (diff) |
USB: cdc-wdm: call wake_up_all to allow driver to shutdown on device removal
commit 62aaf24dc125d7c55c93e313d15611f152b030c7 upstream.
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@linuxfoundation.org>
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Change-Id: Ic92d101f26698708a10ba276eff70825d19d6c89
Reviewed-on: http://git-master/r/79686
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r-- | drivers/usb/class/cdc-wdm.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index b1472c31ab75..90581a85134a 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -788,13 +788,13 @@ static void wdm_disconnect(struct usb_interface *intf) /* to terminate pending flushes */ clear_bit(WDM_IN_USE, &desc->flags); spin_unlock_irqrestore(&desc->iuspin, flags); + wake_up_all(&desc->wait); mutex_lock(&desc->rlock); mutex_lock(&desc->wlock); kill_urbs(desc); cancel_work_sync(&desc->rxwork); mutex_unlock(&desc->wlock); mutex_unlock(&desc->rlock); - wake_up_all(&desc->wait); if (!desc->count) cleanup(desc); mutex_unlock(&wdm_mutex); |