Complete() will be run with interrupt enabled, so change to
spin_lock_irqsave().

Cc: Oliver Neukum <oli...@neukum.org>
Signed-off-by: Ming Lei <ming....@canonical.com>
---
 drivers/usb/class/cdc-wdm.c |   16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
index d3318a0..a54bbb2 100644
--- a/drivers/usb/class/cdc-wdm.c
+++ b/drivers/usb/class/cdc-wdm.c
@@ -143,10 +143,12 @@ found:
 static void wdm_out_callback(struct urb *urb)
 {
        struct wdm_device *desc;
+       unsigned long flags;
+
        desc = urb->context;
-       spin_lock(&desc->iuspin);
+       spin_lock_irqsave(&desc->iuspin, flags);
        desc->werr = urb->status;
-       spin_unlock(&desc->iuspin);
+       spin_unlock_irqrestore(&desc->iuspin, flags);
        kfree(desc->outbuf);
        desc->outbuf = NULL;
        clear_bit(WDM_IN_USE, &desc->flags);
@@ -158,8 +160,9 @@ static void wdm_in_callback(struct urb *urb)
        struct wdm_device *desc = urb->context;
        int status = urb->status;
        int length = urb->actual_length;
+       unsigned long flags;
 
-       spin_lock(&desc->iuspin);
+       spin_lock_irqsave(&desc->iuspin, flags);
        clear_bit(WDM_RESPONDING, &desc->flags);
 
        if (status) {
@@ -203,7 +206,7 @@ skip_error:
        wake_up(&desc->wait);
 
        set_bit(WDM_READ, &desc->flags);
-       spin_unlock(&desc->iuspin);
+       spin_unlock_irqrestore(&desc->iuspin, flags);
 }
 
 static void wdm_int_callback(struct urb *urb)
@@ -213,6 +216,7 @@ static void wdm_int_callback(struct urb *urb)
        int status = urb->status;
        struct wdm_device *desc;
        struct usb_cdc_notification *dr;
+       unsigned long flags;
 
        desc = urb->context;
        dr = (struct usb_cdc_notification *)desc->sbuf;
@@ -261,7 +265,7 @@ static void wdm_int_callback(struct urb *urb)
                goto exit;
        }
 
-       spin_lock(&desc->iuspin);
+       spin_lock_irqsave(&desc->iuspin, flags);
        clear_bit(WDM_READ, &desc->flags);
        responding = test_and_set_bit(WDM_RESPONDING, &desc->flags);
        if (!responding && !test_bit(WDM_DISCONNECTING, &desc->flags)
@@ -270,7 +274,7 @@ static void wdm_int_callback(struct urb *urb)
                dev_dbg(&desc->intf->dev, "%s: usb_submit_urb %d",
                        __func__, rv);
        }
-       spin_unlock(&desc->iuspin);
+       spin_unlock_irqrestore(&desc->iuspin, flags);
        if (rv < 0) {
                clear_bit(WDM_RESPONDING, &desc->flags);
                if (rv == -EPERM)
-- 
1.7.9.5

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

Reply via email to