aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2009-09-04 13:53:17 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-09-23 09:46:40 -0400
commit4a0cd9670f22c308bc5936ee9734d8ee3f1baa52 (patch)
treef03257a5882a68b5eaae42189d5c1c401c37b57a /drivers/usb
parenta50c8aa953c65fd690eca03a2618ac445a3da05d (diff)
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: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/usb.c9
-rw-r--r--drivers/usb/host/xhci-mem.c2
2 files changed, 8 insertions, 3 deletions
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index 30dd2636f262..b1b85abb9a2d 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -413,8 +413,13 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent,
413 } else { 413 } else {
414 snprintf(dev->devpath, sizeof dev->devpath, 414 snprintf(dev->devpath, sizeof dev->devpath,
415 "%s.%d", parent->devpath, port1); 415 "%s.%d", parent->devpath, port1);
416 dev->route = parent->route + 416 /* Route string assumes hubs have less than 16 ports */
417 (port1 << ((parent->level - 1)*4)); 417 if (port1 < 15)
418 dev->route = parent->route +
419 (port1 << ((parent->level - 1)*4));
420 else
421 dev->route = parent->route +
422 (15 << ((parent->level - 1)*4));
418 } 423 }
419 424
420 dev->dev.parent = &parent->dev; 425 dev->dev.parent = &parent->dev;
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 6e6797a38780..e046f0f6ee6a 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -360,9 +360,9 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud
360 /* 3) Only the control endpoint is valid - one endpoint context */ 360 /* 3) Only the control endpoint is valid - one endpoint context */
361 slot_ctx->dev_info |= LAST_CTX(1); 361 slot_ctx->dev_info |= LAST_CTX(1);
362 362
363 slot_ctx->dev_info |= (u32) udev->route;
363 switch (udev->speed) { 364 switch (udev->speed) {
364 case USB_SPEED_SUPER: 365 case USB_SPEED_SUPER:
365 slot_ctx->dev_info |= (u32) udev->route;
366 slot_ctx->dev_info |= (u32) SLOT_SPEED_SS; 366 slot_ctx->dev_info |= (u32) SLOT_SPEED_SS;
367 break; 367 break;
368 case USB_SPEED_HIGH: 368 case USB_SPEED_HIGH: