Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4a0cd967 authored by Sarah Sharp's avatar Sarah Sharp Committed by Greg Kroah-Hartman
Browse files

USB: xhci: Set route string for all devices.



The xHCI driver needs to set the route string in the slot context of all
devices, not just SuperSpeed devices.  The route string concept was added
in the USB 3.0 specification, section 10.1.3.2.  Each hub in the topology
is expected to have no more than 15 ports in order for the route string of
a device to be unique.  SuperSpeed hubs are restricted to only having 15
ports, but FS/LS/HS hubs are not.  The xHCI specification says that if the
port number the device is under is greater than 15, that portion of the
route string shall be set to 15.

Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a50c8aa9
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -413,8 +413,13 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
		} else {
		} else {
			snprintf(dev->devpath, sizeof dev->devpath,
			snprintf(dev->devpath, sizeof dev->devpath,
				"%s.%d", parent->devpath, port1);
				"%s.%d", parent->devpath, port1);
			/* Route string assumes hubs have less than 16 ports */
			if (port1 < 15)
				dev->route = parent->route +
				dev->route = parent->route +
					(port1 << ((parent->level - 1)*4));
					(port1 << ((parent->level - 1)*4));
			else
				dev->route = parent->route +
					(15 << ((parent->level - 1)*4));
		}
		}


		dev->dev.parent = &parent->dev;
		dev->dev.parent = &parent->dev;
+1 −1
Original line number Original line Diff line number Diff line
@@ -360,9 +360,9 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
	/* 3) Only the control endpoint is valid - one endpoint context */
	/* 3) Only the control endpoint is valid - one endpoint context */
	slot_ctx->dev_info |= LAST_CTX(1);
	slot_ctx->dev_info |= LAST_CTX(1);


	slot_ctx->dev_info |= (u32) udev->route;
	switch (udev->speed) {
	switch (udev->speed) {
	case USB_SPEED_SUPER:
	case USB_SPEED_SUPER:
		slot_ctx->dev_info |= (u32) udev->route;
		slot_ctx->dev_info |= (u32) SLOT_SPEED_SS;
		slot_ctx->dev_info |= (u32) SLOT_SPEED_SS;
		break;
		break;
	case USB_SPEED_HIGH:
	case USB_SPEED_HIGH: