aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current/usb-isp1362-hcd-fix-double-lock.patch
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2010-06-21 15:14:47 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2010-06-21 15:14:47 -0700
commit988883492e6fc483249e9d7d8fe3a59b2ed3a5ae (patch)
tree15f38b163fb0ba82923132a1e10241d38ae8f80b /usb.current/usb-isp1362-hcd-fix-double-lock.patch
parent77933b0a3605d49ac52fd8c04d2f03c80185a432 (diff)
downloadpatches-988883492e6fc483249e9d7d8fe3a59b2ed3a5ae.tar.gz
more patches
Diffstat (limited to 'usb.current/usb-isp1362-hcd-fix-double-lock.patch')
-rw-r--r--usb.current/usb-isp1362-hcd-fix-double-lock.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/usb.current/usb-isp1362-hcd-fix-double-lock.patch b/usb.current/usb-isp1362-hcd-fix-double-lock.patch
new file mode 100644
index 00000000000000..d8e8f0950af3c8
--- /dev/null
+++ b/usb.current/usb-isp1362-hcd-fix-double-lock.patch
@@ -0,0 +1,66 @@
+From jslaby@suse.cz Mon Jun 21 14:19:09 2010
+From: Jiri Slaby <jslaby@suse.cz>
+Date: Mon, 21 Jun 2010 17:02:51 +0200
+Subject: USB: isp1362-hcd, fix double lock
+To: gregkh@suse.de
+Cc: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, jirislaby@gmail.com, Lothar Wassmann <LW@KARO-electronics.de>, Michael Hennerich <michael.hennerich@analog.com>, Bryan Wu <cooloney@kernel.org>, Mike Frysinger <vapier@gentoo.org>
+Message-ID: <1277132571-14320-1-git-send-email-jslaby@suse.cz>
+
+
+Stanse found that isp1362_sw_reset tries to take a isp1362_hcd->lock,
+but it is already held in isp1362_hc_stop. Avoid that by introducing
+__isp1362_sw_reset which doesn't take the lock and call it from
+isp1362_hc_stop. isp1362_sw_reset is then as simple as lock --
+__isp1362_sw_reset -- unlock.
+
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+Cc: Lothar Wassmann <LW@KARO-electronics.de>
+Cc: Michael Hennerich <michael.hennerich@analog.com>
+Cc: Bryan Wu <cooloney@kernel.org>
+Cc: Mike Frysinger <vapier@gentoo.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/isp1362-hcd.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/host/isp1362-hcd.c
++++ b/drivers/usb/host/isp1362-hcd.c
+@@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp
+
+ /*-------------------------------------------------------------------------*/
+
+-static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
++static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
+ {
+ int tmp = 20;
+- unsigned long flags;
+-
+- spin_lock_irqsave(&isp1362_hcd->lock, flags);
+
+ isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC);
+ isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR);
+@@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1
+ }
+ if (!tmp)
+ pr_err("Software reset timeout\n");
++}
++
++static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
++{
++ unsigned long flags;
++
++ spin_lock_irqsave(&isp1362_hcd->lock, flags);
++ __isp1362_sw_reset(isp1362_hcd);
+ spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
+ }
+
+@@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_h
+ if (isp1362_hcd->board && isp1362_hcd->board->reset)
+ isp1362_hcd->board->reset(hcd->self.controller, 1);
+ else
+- isp1362_sw_reset(isp1362_hcd);
++ __isp1362_sw_reset(isp1362_hcd);
+
+ if (isp1362_hcd->board && isp1362_hcd->board->clock)
+ isp1362_hcd->board->clock(hcd->self.controller, 0);