The "disabled" port states for USB2 and USB3 are not directly
equivalent. In particular, a disabled USB3 port will not detect new
device connections. The result is that a USB3 device disconnected
from and reconnected to an xHCI root hub port will end up reconnecting
as a USB2 device.
Fix by setting the link state to RxDetect after disabling the port, as
is already done during initialisation.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
portsc |= XHCI_PORTSC_PED;
writel ( portsc, xhci->op + XHCI_OP_PORTSC ( port->address ) );
+ /* Allow time for link state to stabilise */
+ mdelay ( XHCI_LINK_STATE_DELAY_MS );
+
+ /* Set link state to RxDetect for USB3 ports */
+ if ( port->protocol >= USB_PROTO_3_0 ) {
+ portsc &= XHCI_PORTSC_PRESERVE;
+ portsc |= ( XHCI_PORTSC_PLS_RXDETECT | XHCI_PORTSC_LWS );
+ writel ( portsc, xhci->op + XHCI_OP_PORTSC ( port->address ) );
+ }
+
+ /* Allow time for link state to stabilise */
+ mdelay ( XHCI_LINK_STATE_DELAY_MS );
+
return 0;
}