On Mon, Jun 2, 2014 at 6:28 AM, vichy <vichy.kuo@xxxxxxxxx> wrote: > hi Greg: > > 2014-05-31 0:02 GMT+08:00 Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx>: >> On Fri, May 30, 2014 at 11:28:36PM +0800, che-chun Kuo wrote: >>> We found when we plug in/out usb3.0 device for stress testing, once >>> usb_get_device_descriptor fail in hub_port_init, we will call hub_port_disable. >>> Then usb3.0 device may not recover successfully with only hot reset like below function >>> retval = hub_port_reset(hub, port1, udev, delay, false); >>> >>> For covering this error handling, we add warm reset if getting device descriptor fail on usb3.0 devices. >> >> Odd linewrapping :( > since I try to make the explanation more readable, I purposely add > more blank like. > sorry for making you confused. ^^ >> >> Anyway, what makes USB 3 devices so "special" here that they need a >> reset vs. all other devices? > in the beginning, I try to add quirk determination in usb driver. > But get descriptor is the 1st command we get. > if getting descriptor fail, I have no idea how to add quirk > determination in usb driver. > >> >> Are you sure your device isn't just broken somehow? > Yes, your concern is reasonable. > for accelerating the issue happen, I purposely create diff at the end of mail. > And I try 5 devices on my hand, 2 of them will not successfully return > back with only hot reset. > > In usb3.0 spec, warm reset will force usb3.0 jump to Rx.detect. > But hot reset will direct down stream port from to ss.Disabled only > only if time out happen. > That is why I add warm reset when get device descriptor fail. > > appreciate your help, > > diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c > old mode 100644 > new mode 100755 > index f829a1a..ffc5241 > --- a/drivers/usb/core/message.c > +++ b/drivers/usb/core/message.c > @@ -18,6 +18,9 @@ > > #include "usb.h" > > +static int try_flag = 0; > +module_param(try_flag, int, S_IRUGO|S_IWUSR); > + > static void cancel_async_set_config(struct usb_device *udev); > > struct api_context { > @@ -912,6 +915,12 @@ int usb_get_device_descriptor(struct usb_device > *dev, unsigned int size) > if (!desc) > return -ENOMEM; > > + > + if ((try_flag <= 3) &&(dev->speed == USB_SPEED_SUPER) && > (dev->state == USB_STATE_ADDRESS) && (dev->devpath[0] != '0')){ > + printk(KERN_ERR"purposely let get device descriptor fail\n"); > + try_flag ++; > + return -2; > + } > ret = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, size); > if (ret >= 0) > memcpy(&dev->descriptor, desc, size); What is the status of the hub port prior to the warm reset "lsusb -v"? -- 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