Commit 87f88dfc authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: OHCI: Remove USB bus reset delay from OHCI handover code

Paul pointed out that the 50-ms sleep during OHCI initialization takes
up a large fraction of a system's boot time.  Things get worse when
there are two OHCI controllers present, each requiring 50 ms.

However, there really is no need to send a 50-ms reset signal out all
the root-hub ports during initialization.  The ports themselves will
be disabled, and the only way to enable a port is to reset it.
Therefore all attached USB devices will receive a proper reset in any
case.  The controller reset does not need to be long enough to reset
those other devices, so the 50-ms delay isn't necessary.

Without the delay, there is no remaining incentive for skipping the
reset when the controller is already in the RESET state.  This patch
removes the test, issuing the command unconditionally, and removes the
following delay.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Suggested-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Tested-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ffa8a31b
...@@ -783,16 +783,10 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) ...@@ -783,16 +783,10 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev)
/* disable interrupts */ /* disable interrupts */
writel((u32) ~0, base + OHCI_INTRDISABLE); writel((u32) ~0, base + OHCI_INTRDISABLE);
/* Reset the USB bus, if the controller isn't already in RESET */ /* Go into the USB_RESET state, preserving RWC (and possibly IR) */
if (control & OHCI_HCFS) {
/* Go into RESET, preserving RWC (and possibly IR) */
writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL); writel(control & OHCI_CTRL_MASK, base + OHCI_CONTROL);
readl(base + OHCI_CONTROL); readl(base + OHCI_CONTROL);
/* drive bus reset for at least 50 ms (7.1.7.5) */
msleep(50);
}
/* software reset of the controller, preserving HcFmInterval */ /* software reset of the controller, preserving HcFmInterval */
if (!no_fminterval) if (!no_fminterval)
fminterval = readl(base + OHCI_FMINTERVAL); fminterval = readl(base + OHCI_FMINTERVAL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment