提交 1c815577 编写于 作者: J Jiri Slaby 提交者: Greg Kroah-Hartman

USB: isp1362-hcd, fix double lock

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: NJiri 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: NGreg Kroah-Hartman <gregkh@suse.de>
上级 9a49a14d
...@@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp1362_hcd *isp1362_hcd) ...@@ -2224,12 +2224,9 @@ static void remove_debug_file(struct isp1362_hcd *isp1362_hcd)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) static void __isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
{ {
int tmp = 20; int tmp = 20;
unsigned long flags;
spin_lock_irqsave(&isp1362_hcd->lock, flags);
isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC); isp1362_write_reg16(isp1362_hcd, HCSWRES, HCSWRES_MAGIC);
isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR); isp1362_write_reg32(isp1362_hcd, HCCMDSTAT, OHCI_HCR);
...@@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd) ...@@ -2240,6 +2237,14 @@ static void isp1362_sw_reset(struct isp1362_hcd *isp1362_hcd)
} }
if (!tmp) if (!tmp)
pr_err("Software reset timeout\n"); 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); spin_unlock_irqrestore(&isp1362_hcd->lock, flags);
} }
...@@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_hcd *hcd) ...@@ -2418,7 +2423,7 @@ static void isp1362_hc_stop(struct usb_hcd *hcd)
if (isp1362_hcd->board && isp1362_hcd->board->reset) if (isp1362_hcd->board && isp1362_hcd->board->reset)
isp1362_hcd->board->reset(hcd->self.controller, 1); isp1362_hcd->board->reset(hcd->self.controller, 1);
else else
isp1362_sw_reset(isp1362_hcd); __isp1362_sw_reset(isp1362_hcd);
if (isp1362_hcd->board && isp1362_hcd->board->clock) if (isp1362_hcd->board && isp1362_hcd->board->clock)
isp1362_hcd->board->clock(hcd->self.controller, 0); isp1362_hcd->board->clock(hcd->self.controller, 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册