aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff
diff options
context:
space:
mode:
Diffstat (limited to 'recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff')
-rw-r--r--recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff69
1 files changed, 69 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff b/recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff
new file mode 100644
index 0000000000..c93a5b06c8
--- /dev/null
+++ b/recipes/linux/linux-omap-2.6.27/musb-fix-ISO-in-unlink.diff
@@ -0,0 +1,69 @@
+From: Ajay Kumar Gupta <ajay.gupta@ti.com>
+To: linux-omap@vger.kernel.org
+Cc: linux-usb@vger.kernel.org, felipe.balbi@nokia.com,
+ stern@rowland.harvard.edu, Ajay Kumar Gupta <ajay.gupta@ti.com>
+Subject: [PATCH v3] OMAP:MUSB: Corrects urb unlink function path
+Date: Mon, 25 Aug 2008 10:52:16 +0530
+
+Fixes kernel panic while ISO IN transfer is aborted.Replaced
+usb_hcd_unlink_urb_from_ep() from musb_giveback() to __musb_giveback()
+to make sure urb is unlinked before giveback when __musb_giveback() is
+called from musb_urb_dequeue().
+
+Acquired musb->lock() before usb_hcd_unlink_urb_from_ep() within in
+enqueue path.
+
+Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
+---
+ drivers/usb/musb/musb_host.c | 7 +++++--
+ 1 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
+index 08e421f..4279311 100644
+--- a/drivers/usb/musb/musb_host.c
++++ b/drivers/usb/musb/musb_host.c
+@@ -291,6 +291,7 @@ __acquires(musb->lock)
+ urb->actual_length, urb->transfer_buffer_length
+ );
+
++ usb_hcd_unlink_urb_from_ep(musb_to_hcd(musb), urb);
+ spin_unlock(&musb->lock);
+ usb_hcd_giveback_urb(musb_to_hcd(musb), urb, status);
+ spin_lock(&musb->lock);
+@@ -353,8 +354,6 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
+ break;
+ }
+
+- usb_hcd_unlink_urb_from_ep(musb_to_hcd(musb), urb);
+-
+ qh->is_ready = 0;
+ __musb_giveback(musb, urb, status);
+ qh->is_ready = ready;
+@@ -1787,7 +1786,9 @@ static int musb_urb_enqueue(
+ */
+ qh = kzalloc(sizeof *qh, mem_flags);
+ if (!qh) {
++ spin_lock_irqsave(&musb->lock, flags);
+ usb_hcd_unlink_urb_from_ep(hcd, urb);
++ spin_unlock_irqrestore(&musb->lock, flags);
+ return -ENOMEM;
+ }
+
+@@ -1899,7 +1900,9 @@ static int musb_urb_enqueue(
+
+ done:
+ if (ret != 0) {
++ spin_lock_irqsave(&musb->lock, flags);
+ usb_hcd_unlink_urb_from_ep(hcd, urb);
++ spin_unlock_irqrestore(&musb->lock, flags);
+ kfree(qh);
+ }
+ return ret;
+--
+1.5.6
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-omap" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+