Re: [PATCH] xhci: Hard reset controller on shutdown.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux