[PATCH] xhci: Hard reset controller on shutdown.

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

 



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



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

  Powered by Linux