From: Michael Brown Date: Fri, 18 Jul 2025 13:24:23 +0000 (+0100) Subject: [xhci] Use root hub port number to determine slot type X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eca97c2ee2e44c606f6c9664003751ae0f444c72;p=thirdparty%2Fipxe.git [xhci] Use root hub port number to determine slot type We currently use the downstream hub's port number to determine the xHCI slot type for a newly connected USB device. The downstream hub port number is irrelevant to the xHCI controller's supported protocols table: the relevant value is the number of the root hub port through which the device is attached. Fix by using the root hub port number instead of the immediate parent hub's port number. This bug has not previously been detected since the slot type for the first N root hub ports will invariably be zero to indicate that these are USB ports. For any xHCI controller with a sufficiently large number of root hub ports, the code would therefore end up happening to calculate the correct slot type value despite using an incorrect port number. Signed-off-by: Michael Brown --- diff --git a/src/drivers/usb/xhci.c b/src/drivers/usb/xhci.c index 30ee09bbb..b7781f3ed 100644 --- a/src/drivers/usb/xhci.c +++ b/src/drivers/usb/xhci.c @@ -2770,6 +2770,7 @@ static int xhci_endpoint_stream ( struct usb_endpoint *ep, */ static int xhci_device_open ( struct usb_device *usb ) { struct xhci_device *xhci = usb_bus_get_hostdata ( usb->port->hub->bus ); + struct usb_port *root_port = usb_root_hub_port ( usb ); struct usb_port *tt = usb_transaction_translator ( usb ); struct xhci_slot *slot; struct xhci_slot *tt_slot; @@ -2779,7 +2780,7 @@ static int xhci_device_open ( struct usb_device *usb ) { int rc; /* Determine applicable slot type */ - type = xhci_port_slot_type ( xhci, usb->port->address ); + type = xhci_port_slot_type ( xhci, root_port->address ); if ( type < 0 ) { rc = type; DBGC ( xhci, "XHCI %s-%d has no slot type\n",