[xhci] Set link state to RxDetect after disabling USB3 root hub port

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>
pull/119/head
Michael Brown 2020-07-02 22:53:11 +01:00
parent 761ed4365a
commit 18d4be8aaf
1 changed files with 13 additions and 0 deletions

View File

@ -3051,6 +3051,19 @@ static int xhci_root_disable ( struct usb_hub *hub, struct usb_port *port ) {
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;
}