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

Cc: Johan Hovold <jhov...@gmail.com>
Signed-off-by: Ming Lei <ming....@canonical.com>
---
 drivers/usb/serial/io_edgeport.c |   14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index c91481d..b9eeec6 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -567,6 +567,7 @@ static void edge_interrupt_callback(struct urb *urb)
        int portNumber;
        int result;
        int status = urb->status;
+       unsigned long flags;
 
        switch (status) {
        case 0:
@@ -592,7 +593,7 @@ static void edge_interrupt_callback(struct urb *urb)
                if (length > 1) {
                        bytes_avail = data[0] | (data[1] << 8);
                        if (bytes_avail) {
-                               spin_lock(&edge_serial->es_lock);
+                               spin_lock_irqsave(&edge_serial->es_lock, flags);
                                edge_serial->rxBytesAvail += bytes_avail;
                                dev_dbg(dev,
                                        "%s - bytes_avail=%d, rxBytesAvail=%d, 
read_in_progress=%d\n",
@@ -615,7 +616,7 @@ static void edge_interrupt_callback(struct urb *urb)
                                                edge_serial->read_in_progress = 
false;
                                        }
                                }
-                               spin_unlock(&edge_serial->es_lock);
+                               spin_unlock_irqrestore(&edge_serial->es_lock, 
flags);
                        }
                }
                /* grab the txcredits for the ports if available */
@@ -628,9 +629,9 @@ static void edge_interrupt_callback(struct urb *urb)
                                port = edge_serial->serial->port[portNumber];
                                edge_port = usb_get_serial_port_data(port);
                                if (edge_port->open) {
-                                       spin_lock(&edge_port->ep_lock);
+                                       spin_lock_irqsave(&edge_port->ep_lock, 
flags);
                                        edge_port->txCredits += txCredits;
-                                       spin_unlock(&edge_port->ep_lock);
+                                       
spin_unlock_irqrestore(&edge_port->ep_lock, flags);
                                        dev_dbg(dev, "%s - txcredits for port%d 
= %d\n",
                                                __func__, portNumber,
                                                edge_port->txCredits);
@@ -671,6 +672,7 @@ static void edge_bulk_in_callback(struct urb *urb)
        int                     retval;
        __u16                   raw_data_length;
        int status = urb->status;
+       unsigned long flags;
 
        if (status) {
                dev_dbg(&urb->dev->dev, "%s - nonzero read bulk status 
received: %d\n",
@@ -690,7 +692,7 @@ static void edge_bulk_in_callback(struct urb *urb)
 
        usb_serial_debug_data(dev, __func__, raw_data_length, data);
 
-       spin_lock(&edge_serial->es_lock);
+       spin_lock_irqsave(&edge_serial->es_lock, flags);
 
        /* decrement our rxBytes available by the number that we just got */
        edge_serial->rxBytesAvail -= raw_data_length;
@@ -714,7 +716,7 @@ static void edge_bulk_in_callback(struct urb *urb)
                edge_serial->read_in_progress = false;
        }
 
-       spin_unlock(&edge_serial->es_lock);
+       spin_unlock_irqrestore(&edge_serial->es_lock, flags);
 }
 
 
-- 
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