On Fri, 20 Oct 2017, Brian King wrote: > On 10/19/2017 12:04 PM, Alan Stern wrote: > > On Thu, 19 Oct 2017, Mathias Nyman wrote: > > > >> Current shutdown routine just forces the host controller to stop, it clears the > >> run bit and polls the "halted" status for 16ms. Apparently we don't see the halted > >> bit within 16ms. > >> > >> Spec say that the correct way to stop is to first command all transfer rings to stop, > >> then stop the command ring, and after that stop the host controller. > >> > >> If we just bluntly stop the host (as we do) spec say (xhci 5.4.1.1) it should stop > >> anyway within 16ms, but undefined behavior may occur. > >> > >> So the options in xHCI are down to: > >> 1. just clear the run bit and ignore checking any status. > >> - really fast shutdown routine for xhci > >> 2. clear run bit and increase status polling time, see if we get rid of error message. > >> - can get rid of error message but no actual change, well, we would know if host stopped > >> 3. properly stop all transfer rings and command ring, and then stop host. > >> - cleanest and slowest way, do we care about this? everything should be reset after shutdown. > > > > Or you could use a sledgehammer approach, and do a hardware reset of > > the controller chip. > > > > Alan Stern > > > > Sort of like this? With this patch I can successfully kexec boot kernels and my > USB devices show up every time. Without it, I see xhci init failures consistently > on the kexec booted kernels and the xhci load fails. > > 8< > > Fixes kexec boot. Without a hard reset, some USB chips will fail to > initialize in a kexec booted kernel. > > Signed-off-by: Brian King <brking@xxxxxxxxxxxxxxxxxx> > --- > > Index: linux.git/drivers/usb/host/xhci.c > =================================================================== > --- linux.git.orig/drivers/usb/host/xhci.c > +++ linux.git/drivers/usb/host/xhci.c > @@ -729,6 +729,7 @@ static void xhci_shutdown(struct usb_hcd > /* Yet another workaround for spurious wakeups at shutdown with HSW */ > if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) > pci_set_power_state(to_pci_dev(hcd->self.sysdev), PCI_D3hot); > + pci_reset_function_locked(to_pci_dev(hcd->self.sysdev)); > } > > #ifdef CONFIG_PM The decision is up to Mathias. However, I suspect this code won't work very well on systems where the xHCI controller is not on a PCI bus (if any systems like that exist). Also, there doesn't seem to be much point in setting the power state to D3hot immediately before resetting the controller. Alan Stern -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html