]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: xhci-pci: Fix USB2-only root hub registration
authorMichal Pecio <michal.pecio@gmail.com>
Mon, 13 Oct 2025 22:55:40 +0000 (01:55 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 14 Oct 2025 07:58:51 +0000 (09:58 +0200)
A recent change to hide USB3 root hubs of USB2-only controllers broke
registration of USB2 root hubs - allow_single_roothub is set too late,
and by this time xhci_run() has already deferred root hub registration
until after the shared HCD is added, which will never happen.

This makes such controllers unusable, but testers didn't notice since
they were only bothered by warnings about empty USB3 root hubs. The bug
causes problems to other people who actually use such HCs and I was
able to confirm it on an ordinary HC by patching to ignore USB3 ports.

Setting allow_single_roothub during early setup fixes things.

Reported-by: Arisa Snowbell <arisa.snowbell@gmail.com>
Closes: https://lore.kernel.org/linux-usb/CABpa4MA9unucCoKtSdzJyOLjHNVy+Cwgz5AnAxPkKw6vuox1Nw@mail.gmail.com/
Reported-by: Michal Kubecek <mkubecek@suse.cz>
Closes: https://lore.kernel.org/linux-usb/lnb5bum7dnzkn3fc7gq6hwigslebo7o4ccflcvsc3lvdgnu7el@fvqpobbdoapl/
Fixes: 719de070f764 ("usb: xhci-pci: add support for hosts with zero USB3 ports")
Tested-by: Arisa Snowbell <arisa.snowbell@gmail.com>
Tested-by: Michal Kubecek <mkubecek@suse.cz>
Suggested-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-pci.c

index 5c8ab519f497d79c1a776557bd400e5488b6eac7..f67a4d9562046fdc32359a200144c9eb161c4e2e 100644 (file)
@@ -582,6 +582,8 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
        if (!usb_hcd_is_primary_hcd(hcd))
                return 0;
 
+       xhci->allow_single_roothub = 1;
+
        if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
                xhci_pme_acpi_rtd3_enable(pdev);
 
@@ -637,7 +639,6 @@ int xhci_pci_common_probe(struct pci_dev *dev, const struct pci_device_id *id)
        xhci = hcd_to_xhci(hcd);
        xhci->reset = reset;
 
-       xhci->allow_single_roothub = 1;
        if (!xhci_has_one_roothub(xhci)) {
                xhci->shared_hcd = usb_create_shared_hcd(&xhci_pci_hc_driver, &dev->dev,
                                                         pci_name(dev), hcd);