aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/usb/core/hub.c
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2012-02-28 12:42:14 +0000
committerArnd Bergmann <arnd@arndb.de>2012-02-28 12:42:21 +0000
commitfb0b82b32ce17564bc64cede50bf4a3204eecc60 (patch)
tree00b5e466074c6fb373d64c493b3341186024acc7 /drivers/usb/core/hub.c
parentMerge branch 'kirkwood/board' into next/boards (diff)
parentARM: pxa: add dummy clock for pxa25x and pxa27x (diff)
downloadwireguard-linux-fb0b82b32ce17564bc64cede50bf4a3204eecc60.tar.xz
wireguard-linux-fb0b82b32ce17564bc64cede50bf4a3204eecc60.zip
Merge branch 'board-specific' of git://github.com/hzhuang1/linux into next/boards
* 'board-specific' of git://github.com/hzhuang1/linux: (5 commits) ARM: pxa: add dummy clock for pxa25x and pxa27x ARM: mmp: append irq name of gpio device pxa/hx4700: Fix PXA_GPIO_IRQ_BASE/IRQ_NUM values pxa/hx4700: Add ASIC3 LED support pxa/hx4700: Correct StrataFlash block size discovery (update to v3.3-rc5)
Diffstat (limited to 'drivers/usb/core/hub.c')
-rw-r--r--drivers/usb/core/hub.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index a0613d8f9be7..265c2f675d04 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -705,10 +705,26 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
if (type == HUB_INIT3)
goto init3;
- /* After a resume, port power should still be on.
+ /* The superspeed hub except for root hub has to use Hub Depth
+ * value as an offset into the route string to locate the bits
+ * it uses to determine the downstream port number. So hub driver
+ * should send a set hub depth request to superspeed hub after
+ * the superspeed hub is set configuration in initialization or
+ * reset procedure.
+ *
+ * After a resume, port power should still be on.
* For any other type of activation, turn it on.
*/
if (type != HUB_RESUME) {
+ if (hdev->parent && hub_is_superspeed(hdev)) {
+ ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
+ HUB_SET_DEPTH, USB_RT_HUB,
+ hdev->level - 1, 0, NULL, 0,
+ USB_CTRL_SET_TIMEOUT);
+ if (ret < 0)
+ dev_err(hub->intfdev,
+ "set hub depth failed\n");
+ }
/* Speed up system boot by using a delayed_work for the
* hub's initial power-up delays. This is pretty awkward
@@ -987,18 +1003,6 @@ static int hub_configure(struct usb_hub *hub,
goto fail;
}
- if (hub_is_superspeed(hdev) && (hdev->parent != NULL)) {
- ret = usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0),
- HUB_SET_DEPTH, USB_RT_HUB,
- hdev->level - 1, 0, NULL, 0,
- USB_CTRL_SET_TIMEOUT);
-
- if (ret < 0) {
- message = "can't set hub depth";
- goto fail;
- }
- }
-
/* Request the entire hub descriptor.
* hub->descriptor can handle USB_MAXCHILDREN ports,
* but the hub can/will return fewer bytes here.