Message ID | 20180615220131.65402-1-dmitry.torokhov@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi, On Fri, Jun 15, 2018 at 3:01 PM, Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote: > When handling split transactions we will try to delay retry after > getting a NAK from the device. This works well for BULK transfers that > can be polled for essentially forever. Unfortunately, on slower systems > at boot time, when the kernel is busy enumerating all the devices (USB > or not), we issue a bunch of control requests (reading device > descriptors, etc). If we get a NAK for the IN part of the control > request and delay retry for too long (because the system is busy), we > may confuse the device when we finally get to reissue SSPLIT/CSPLIT IN > and the device will respond with STALL. As a result we end up with > failure to get device descriptor and will fail to enumerate the device: > > [ 3.428801] usb 2-1.2.1: new full-speed USB device number 9 using dwc2 > [ 3.508576] usb 2-1.2.1: device descriptor read/8, error -32 > [ 3.699150] usb 2-1.2.1: device descriptor read/8, error -32 > [ 3.891653] usb 2-1.2.1: new full-speed USB device number 10 using dwc2 > [ 3.968859] usb 2-1.2.1: device descriptor read/8, error -32 > ... > > Let's not delay retries of split CONTROL IN transfers, as this allows us > to reliably enumerate devices at boot time. > > Fixes 38d2b5fb75c1 ("usb: dwc2: host: Don't retry NAKed transactions right away") nit: I think there's supposed to be a ":" after "Fixes" > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> > --- > drivers/usb/dwc2/hcd_intr.c | 9 +++++++-- > 1 file changed, 7 insertions(+), 2 deletions(-) This seems like a sane fix to me. Reviewed-by: Douglas Anderson <dianders@chromium.org> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c index a5dfd9d8bd9a2..d423b6a49f96c 100644 --- a/drivers/usb/dwc2/hcd_intr.c +++ b/drivers/usb/dwc2/hcd_intr.c @@ -1212,7 +1212,10 @@ static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg, * avoid interrupt storms we'll wait before retrying if we've got * several NAKs. If we didn't do this we'd retry directly from the * interrupt handler and could end up quickly getting another - * interrupt (another NAK), which we'd retry. + * interrupt (another NAK), which we'd retry. Note that we do not + * delay retries for IN parts of control requests, as those are expected + * to complete fairly quickly, and if we delay them we risk confusing + * the device and cause it issue STALL. * * Note that in DMA mode software only gets involved to re-send NAKed * transfers for split transactions, so we only need to apply this @@ -1225,7 +1228,9 @@ static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg, qtd->error_count = 0; qtd->complete_split = 0; qtd->num_naks++; - qtd->qh->want_wait = qtd->num_naks >= DWC2_NAKS_BEFORE_DELAY; + qtd->qh->want_wait = qtd->num_naks >= DWC2_NAKS_BEFORE_DELAY && + !(chan->ep_type == USB_ENDPOINT_XFER_CONTROL && + chan->ep_is_in); dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_NAK); goto handle_nak_done; }
When handling split transactions we will try to delay retry after getting a NAK from the device. This works well for BULK transfers that can be polled for essentially forever. Unfortunately, on slower systems at boot time, when the kernel is busy enumerating all the devices (USB or not), we issue a bunch of control requests (reading device descriptors, etc). If we get a NAK for the IN part of the control request and delay retry for too long (because the system is busy), we may confuse the device when we finally get to reissue SSPLIT/CSPLIT IN and the device will respond with STALL. As a result we end up with failure to get device descriptor and will fail to enumerate the device: [ 3.428801] usb 2-1.2.1: new full-speed USB device number 9 using dwc2 [ 3.508576] usb 2-1.2.1: device descriptor read/8, error -32 [ 3.699150] usb 2-1.2.1: device descriptor read/8, error -32 [ 3.891653] usb 2-1.2.1: new full-speed USB device number 10 using dwc2 [ 3.968859] usb 2-1.2.1: device descriptor read/8, error -32 ... Let's not delay retries of split CONTROL IN transfers, as this allows us to reliably enumerate devices at boot time. Fixes 38d2b5fb75c1 ("usb: dwc2: host: Don't retry NAKed transactions right away") Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> --- drivers/usb/dwc2/hcd_intr.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)