diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2010-06-21 15:14:47 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-06-21 15:14:47 -0700 |
| commit | 988883492e6fc483249e9d7d8fe3a59b2ed3a5ae (patch) | |
| tree | 15f38b163fb0ba82923132a1e10241d38ae8f80b /usb.current/usb-isp1362-hcd-fix-double-lock.patch | |
| parent | 77933b0a3605d49ac52fd8c04d2f03c80185a432 (diff) | |
| download | patches-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.patch | 66 |
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); |
