]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
usb: dwc2: make the scheduler handle excessive NAKs better
authorNick Hudson <skrll@netbsd.org>
Thu, 11 Sep 2014 22:22:48 +0000 (15:22 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 Sep 2014 22:39:22 +0000 (15:39 -0700)
I'm seeing problems with a d-link dwcl-g122 wifi dongle that
someone sent me. There are reports of other wifi dongles with the
same/similar problem. The devices appear to be NAKing to the point
of confusing the dwc2 driver completely.

The attached patch helps with my d-link dwl-g122 - it's adapted
from the Raspberry Pi dwc_otg driver, which is a modified version
of the Synopsys vendor driver. The error recovery is still valid
after the patch, I think.

Cc: Dom Cobley <popcornmix@gmail.com>
Signed-off-by: Nick Hudson <skrll@netbsd.org>
Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc2/hcd_intr.c

index 47b9eb5389b468d4710263bdd9a8d052cbba635c..f06249c1b9189f5924f16d14375c904255101941 100644 (file)
@@ -1890,12 +1890,20 @@ static void dwc2_hc_chhltd_intr_dma(struct dwc2_hsotg *hsotg,
                                        "hcint 0x%08x, intsts 0x%08x\n",
                                        chan->hcint,
                                        readl(hsotg->regs + GINTSTS));
+                               goto error;
                        }
                }
        } else {
                dev_info(hsotg->dev,
                         "NYET/NAK/ACK/other in non-error case, 0x%08x\n",
                         chan->hcint);
+error:
+               /* Failthrough: use 3-strikes rule */
+               qtd->error_count++;
+               dwc2_update_urb_state_abn(hsotg, chan, chnum, qtd->urb,
+                                         qtd, DWC2_HC_XFER_XACT_ERR);
+               dwc2_hcd_save_data_toggle(hsotg, chan, chnum, qtd);
+               dwc2_halt_channel(hsotg, chan, qtd, DWC2_HC_XFER_XACT_ERR);
        }
 }