usb: gadget: u_bam: Correct nested locking flags
Previously the driver used the same flags variable to lock two different
spinlocks. This causes interrupts to stay disabled when the function
exits. Correct this by only doing irqsave and irqrestore on the
outermost spinlock.
Change-Id: I8a4942b4bbcd8fda5a31176f6133843456ddd0f5
Signed-off-by: Jeff Ohlstein <johlstei@codeaurora.org>
diff --git a/drivers/usb/gadget/u_bam.c b/drivers/usb/gadget/u_bam.c
index 1369f4f..23e0da8 100644
--- a/drivers/usb/gadget/u_bam.c
+++ b/drivers/usb/gadget/u_bam.c
@@ -602,7 +602,7 @@
struct bam_ch_info *d;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
if (!port || !port->port_usb)
goto free_buf_out;
@@ -619,7 +619,7 @@
dev_kfree_skb_any(skb);
free_buf_out:
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
}
@@ -643,9 +643,9 @@
unsigned long flags;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
port->port_usb = 0;
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
/* disable endpoints */
@@ -664,13 +664,13 @@
unsigned long flags;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
if (!port->port_usb) {
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
return;
}
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
if (!test_bit(BAM_CH_READY, &d->flags))
@@ -714,9 +714,9 @@
}
port->gr->out->driver_data = port;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
port->port_usb = port->gr;
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
ret = usb_bam_connect(d->connection_idx, &d->src_pipe_idx,
@@ -775,10 +775,10 @@
/* if usb is online, try opening bam_ch */
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
if (port->port_usb)
queue_work(gbam_wq, &port->connect_w);
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
break;
@@ -807,12 +807,12 @@
d = &port->data_ch;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
if (port->port_usb) {
ep_in = port->port_usb->in;
ep_out = port->port_usb->out;
}
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
if (ep_in)
@@ -946,7 +946,7 @@
if (!port)
continue;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
d = &port->data_ch;
@@ -969,7 +969,7 @@
test_bit(BAM_CH_OPENED, &d->flags),
test_bit(BAM_CH_READY, &d->flags));
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
}
@@ -994,7 +994,7 @@
continue;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
d = &port->data_ch;
@@ -1004,7 +1004,7 @@
d->tohost_drp_cnt = 0;
d->tomodem_drp_cnt = 0;
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
}
return count;
@@ -1071,10 +1071,10 @@
gbam_free_buffers(port);
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
port->port_usb = 0;
n_tx_req_queued = 0;
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
/* disable endpoints */
@@ -1136,7 +1136,7 @@
gr->out->driver_data = port;
spin_lock_irqsave(&port->port_lock_ul, flags);
- spin_lock_irqsave(&port->port_lock_dl, flags);
+ spin_lock(&port->port_lock_dl);
port->port_usb = gr;
d->to_host = 0;
@@ -1144,7 +1144,7 @@
d->pending_with_bam = 0;
d->tohost_drp_cnt = 0;
d->tomodem_drp_cnt = 0;
- spin_unlock_irqrestore(&port->port_lock_dl, flags);
+ spin_unlock(&port->port_lock_dl);
spin_unlock_irqrestore(&port->port_lock_ul, flags);
}