diff options
author | Michael Brown <mcb30@ipxe.org> | 2020-07-02 22:53:11 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2020-07-03 12:10:04 +0100 |
commit | 18d4be8aafe9ea468daed907aca3fd730e8c0d2e (patch) | |
tree | c893992cb726640bd88a2f456bb2f77ff29351e5 | |
parent | 761ed4365a64ac34443a3de4c0e81e4b9491b33e (diff) | |
download | ipxe-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.c | 13 |
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; } |