summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMayank Rana <mrana@codeaurora.org>2015-06-27 14:54:14 -0700
committerHemant Kumar <hemantk@codeaurora.org>2016-09-12 15:43:56 -0700
commitf5a8583fbbcd28ffe94b7314b9c4196df4ed833d (patch)
tree06b655e720decef567e9df719ac7522f0c3fe1ba /drivers
parentef529d5647ef2d4fe7f004d78b41e365dbe55178 (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.c14
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;
}