USB: ohci-at91: add a reset function to fix race condition
A possible race condition appears because we are not initializing the ohci->regs before calling usb_hcd_request_irqs(). We move the call to ohci_init() in hcd->driver->reset() instead of hcd->driver->start() to fix this. This was experienced when we share the same IRQ line between OHCI and EHCI controllers. Signed-off-by: Nicolas Ferre <nicolas.ferre@atmel.com> Tested-by: Christian Eggers <christian.eggers@kathrein.de> Cc: stable <stable@vger.kernel.org> Acked-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
7a82f612fa
Коммит
07e4e556ef
|
@ -223,7 +223,7 @@ static void __devexit usb_hcd_at91_remove(struct usb_hcd *hcd,
|
|||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static int __devinit
|
||||
ohci_at91_start (struct usb_hcd *hcd)
|
||||
ohci_at91_reset (struct usb_hcd *hcd)
|
||||
{
|
||||
struct at91_usbh_data *board = hcd->self.controller->platform_data;
|
||||
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
|
||||
|
@ -233,6 +233,14 @@ ohci_at91_start (struct usb_hcd *hcd)
|
|||
return ret;
|
||||
|
||||
ohci->num_ports = board->ports;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit
|
||||
ohci_at91_start (struct usb_hcd *hcd)
|
||||
{
|
||||
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
|
||||
int ret;
|
||||
|
||||
if ((ret = ohci_run(ohci)) < 0) {
|
||||
dev_err(hcd->self.controller, "can't start %s\n",
|
||||
|
@ -419,6 +427,7 @@ static const struct hc_driver ohci_at91_hc_driver = {
|
|||
/*
|
||||
* basic lifecycle operations
|
||||
*/
|
||||
.reset = ohci_at91_reset,
|
||||
.start = ohci_at91_start,
|
||||
.stop = ohci_stop,
|
||||
.shutdown = ohci_shutdown,
|
||||
|
|
Загрузка…
Ссылка в новой задаче