On 18/08/15 13:39, Roger Quadros wrote:
Plugging and unplugging a USB-OTG adapter with a USB device into a
am437x-gp-evm dual-role port (USB1) causes XHCI to malfunction
and USB device to be no longer detected after a few iterations.
The triggering case is so
1) USB1 in peripheal mode
2) plug OTG adapter with USB device
3) USB1 switches to host mode
4) Detects new USB device
5) unplug OTG adapter
6) OTG core tries to remove host controller while new device
is being processed.
At 6 some races are observed in the XHCI driver causing it to
malfunction. See kernel log at the end of this mail.
This series tries to address some of the issues.
Althouth it is not 100% fool proof yet and XHCI can still get
stuck up for a few seconds occasionally, it did recover always
in a max of 10 seconds and the USB device was enumerated after
During a dual-role switch, usb_remove_hcd() and usb_add_hcd()
will be called consecutively for both Shared and Primary
HCDs. This can happen asynchronously and we have to be prepared
Even after this series I do occasionally see a delay of 5 seconds
during adapter detach. (please see kernel log below).
Is it possible to further optimize so that when xhci_stop is called
we don't depend entirely on timeout timers to stop queued commands?