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 -- 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