On 2017-10-21 10:04, Alan Stern wrote:
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 <brk...@linux.vnet.ibm.com>
---

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

Hi Mathias and Alan,

I have tested the patch with difference hardware and difference Linux distro(including upstream kernel) this week.

With this patch, USB devices are always showed up when doing kexec and fixes several issues opened by customers.

Please let us know if you have any suggestion for the patch.

Thanks for your help!
Wendy

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to