>From c37d436b8832e817ab437baa3324f6c08c846af9 Mon Sep 17 00:00:00 2001
From: Oliver Neukum <[email protected]>
Date: Fri, 16 Jan 2015 15:13:28 +0100
Subject: [PATCH] cdc-wdm: bug in ceasing IO

The work submits the URB and the URB queues the work.
To reliably kill this cycle a flag needs to be set
and one of the kills repeated.

Signed-off-by: Oliver Neukum <[email protected]>
---
 drivers/usb/class/cdc-wdm.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index 5ff7018..e24bad6 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -976,8 +976,10 @@ static void wdm_disconnect(struct usb_interface *intf)
        wake_up_all(&desc->wait);
        mutex_lock(&desc->rlock);
        mutex_lock(&desc->wlock);
+       /* circular dependency. The second kill is needed */
        kill_urbs(desc);
        cancel_work_sync(&desc->rxwork);
+       kill_urbs(desc);
        mutex_unlock(&desc->wlock);
        mutex_unlock(&desc->rlock);
 
@@ -1017,9 +1019,10 @@ static int wdm_suspend(struct usb_interface *intf, 
pm_message_t message)
 
                set_bit(WDM_SUSPENDING, &desc->flags);
                spin_unlock_irq(&desc->iuspin);
-               /* callback submits work - order is essential */
+               /* circular dependency. The second kill is needed */
                kill_urbs(desc);
                cancel_work_sync(&desc->rxwork);
+               kill_urbs(desc);
        }
        if (!PMSG_IS_AUTO(message)) {
                mutex_unlock(&desc->wlock);
@@ -1077,8 +1080,10 @@ static int wdm_pre_reset(struct usb_interface *intf)
        wake_up_all(&desc->wait);
        mutex_lock(&desc->rlock);
        mutex_lock(&desc->wlock);
+       /* circular dependency. The second kill is needed */
        kill_urbs(desc);
        cancel_work_sync(&desc->rxwork);
+       kill_urbs(desc);
        return 0;
 }
 
-- 
1.8.4.5




--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to