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: 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>
This commit is contained in:
Родитель
9a49a14da4
Коммит
1c81557782
|
@ -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;
|
||||
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 isp1362_hcd *isp1362_hcd)
|
|||
}
|
||||
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_hcd *hcd)
|
|||
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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче