aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2020-07-02 22:53:11 +0100
committerMichael Brown <mcb30@ipxe.org>2020-07-03 12:10:04 +0100
commit18d4be8aafe9ea468daed907aca3fd730e8c0d2e (patch)
treec893992cb726640bd88a2f456bb2f77ff29351e5
parent761ed4365a64ac34443a3de4c0e81e4b9491b33e (diff)
downloadipxe-18d4be8aafe9ea468daed907aca3fd730e8c0d2e.zip
ipxe-18d4be8aafe9ea468daed907aca3fd730e8c0d2e.tar.gz
ipxe-18d4be8aafe9ea468daed907aca3fd730e8c0d2e.tar.bz2
[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>
-rw-r--r--src/drivers/usb/xhci.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c
index e9a7f4c..21c3e00 100644
--- a/src/drivers/usb/xhci.c
+++ b/src/drivers/usb/xhci.c
@@ -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;
}