Skip to content

Commit 69c6335

Browse files
matnymangregkh
authored andcommitted
usb: port: Don't try to peer unused USB ports based on location
Unused USB ports may have bogus location data in ACPI PLD tables. This causes port peering failures as these unused USB2 and USB3 ports location may match. Due to these failures the driver prints a "usb: port power management may be unreliable" warning, and unnecessarily blocks port power off during runtime suspend. This was debugged on a couple DELL systems where the unused ports all returned zeroes in their location data. Similar bugreports exist for other systems. Don't try to peer or match ports that have connect type set to USB_PORT_NOT_USED. Fixes: 3bfd659 ("usb: find internal hub tier mismatch via acpi") Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218465 Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218486 Tested-by: Paul Menzel <pmenzel@molgen.mpg.de> Link: https://lore.kernel.org/linux-usb/5406d361-f5b7-4309-b0e6-8c94408f7d75@molgen.mpg.de Cc: stable@vger.kernel.org # v3.16+ Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218490 Link: https://lore.kernel.org/r/20240222233343.71856-1-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent f90ce1e commit 69c6335

File tree

1 file changed

+3
-2
lines changed

1 file changed

+3
-2
lines changed

drivers/usb/core/port.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ static int match_location(struct usb_device *peer_hdev, void *p)
573573
struct usb_hub *peer_hub = usb_hub_to_struct_hub(peer_hdev);
574574
struct usb_device *hdev = to_usb_device(port_dev->dev.parent->parent);
575575

576-
if (!peer_hub)
576+
if (!peer_hub || port_dev->connect_type == USB_PORT_NOT_USED)
577577
return 0;
578578

579579
hcd = bus_to_hcd(hdev->bus);
@@ -584,7 +584,8 @@ static int match_location(struct usb_device *peer_hdev, void *p)
584584

585585
for (port1 = 1; port1 <= peer_hdev->maxchild; port1++) {
586586
peer = peer_hub->ports[port1 - 1];
587-
if (peer && peer->location == port_dev->location) {
587+
if (peer && peer->connect_type != USB_PORT_NOT_USED &&
588+
peer->location == port_dev->location) {
588589
link_peers_report(port_dev, peer);
589590
return 1; /* done */
590591
}

0 commit comments

Comments
 (0)