diff options
| author | Mayank Rana <mrana@codeaurora.org> | 2015-06-27 14:54:14 -0700 |
|---|---|---|
| committer | Hemant Kumar <hemantk@codeaurora.org> | 2016-09-12 15:43:56 -0700 |
| commit | f5a8583fbbcd28ffe94b7314b9c4196df4ed833d (patch) | |
| tree | 06b655e720decef567e9df719ac7522f0c3fe1ba /drivers | |
| parent | ef529d5647ef2d4fe7f004d78b41e365dbe55178 (diff) | |
Revert "usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers"
This change reverts Commit f3af36511e60 ("usb: dwc3: gadget: always
enable IOC on bulk/interrupt transfers") which sets IOC bit for both
bulk/interrupt transfers resulting into interrupt for each TRB
completion with event as XFERINPROGRESS. In some cases it has been
observed that controller is not able to complete provided TRB on
bulk-in endpoint causing stall conditions. Hence Fix this issue by not
setting IOC bit for each TRB to receive XFERCOMPLETE interrupt with it.
Change-Id: I5ff08188f37044332f7dadba8d677288e83bfec8
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/dwc3/gadget.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 3d96a8bef5f0..a798c4fa8812 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -891,11 +891,19 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; else trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS; + + if (!req->request.no_interrupt && !chain) + trb->ctrl |= DWC3_TRB_CTRL_IOC; break; case USB_ENDPOINT_XFER_BULK: case USB_ENDPOINT_XFER_INT: trb->ctrl = DWC3_TRBCTL_NORMAL; + if (req->request.num_mapped_sgs > 0) { + if (!last && !chain && + !req->request.no_interrupt) + trb->ctrl |= DWC3_TRB_CTRL_IOC; + } break; default: /* @@ -905,9 +913,6 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, BUG(); } - if (!req->request.no_interrupt && !chain) - trb->ctrl |= DWC3_TRB_CTRL_IOC; - if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; trb->ctrl |= DWC3_TRB_CTRL_CSP; @@ -2477,6 +2482,9 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep, return 1; } + if ((event->status & DEPEVT_STATUS_IOC) && + (trb->ctrl & DWC3_TRB_CTRL_IOC)) + return 0; return 1; } |
