2012/2/18 Greg KH <greg@xxxxxxxxx>: > On Sat, Feb 18, 2012 at 12:14:26AM +0800, Elric Fu wrote: >> 2012/2/17 Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>: >> > On Fri, 17 Feb 2012, Elric Fu wrote: >> > >> >> The superspeed device attached to a USB 3.0 hub(such as VIA's) >> >> doesn't respond the address device command after resume. The >> >> root cause is the superspeed hub will miss the Hub Depth value >> >> that is used as an offset into the route string to locate the >> >> bits it uses to determine the downstream port number after >> >> reset, and all packets can't be routed to the device attached >> >> to the superspeed hub. >> >> >> >> Hub driver sends a Set Hub Depth request to the superspeed hub >> >> except for USB 3.0 root hub when the hub is initialized and >> >> doesn't send the request again after reset due to the resume >> >> process. So moving the code that sends the Set Hub Depth request >> >> to the superspeed hub from hub_configure() to hub_activate() >> >> is to cover those situations include initialization and reset. >> >> >> >> The patch shoule be backported to kernels as old as 2.6.39. >> >> >> >> Signed-off-by: Elric Fu <elricfu1@xxxxxxxxx> >> >> Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> >> >> --- >> >> drivers/usb/core/hub.c | 30 +++++++++++++++++------------- >> >> 1 file changed, 17 insertions(+), 13 deletions(-) >> >> >> >> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c >> >> index a0613d8..5b3e918 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. >> > >> > Acked-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> >> > >> >> Sorry, I have a little confusion about the Acked-by: and Cc:. I will read >> Documentation/SubmittingPatches carefully again and send V2 patch >> later. > > No need to, this just means that Alan agrees with this patch and that > who ever pickes this up for their tree (be it Sarah or me directly), > will add that to the patch and apply it. > > You do not need to do anything else here at all. OK. I got it. Thanks. > > Sarah, are you going to pick this up, or do you want me to? > > thanks, > > greg k-h Best Regards, Elric Fu -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html