aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelipe Balbi <balbi@ti.com>2014-09-04 11:28:10 -0400
committerFelipe Balbi <balbi@ti.com>2014-09-05 10:16:55 -0400
commit0b93a4c838fa10370d72f86fe712426ac63804de (patch)
treea834b4e0ff9188981ec9c4f1ac5bea773b6fd0e6
parent81a60b7f5c143ab3cdcd9943c9b4b7c63c32fc31 (diff)
usb: dwc3: fix TRB completion when multiple TRBs are started
After commit 2ec2a8be (usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers) we created a situation where it was possible to hang a bulk/interrupt endpoint if we had more than one pending request in our queue and they were both started with a single Start Transfer command. The problems triggers because we had not enabled Transfer In Progress event for those endpoints and we were not able to process early giveback of requests completed without LST bit set. Fix the problem by finally enabling Xfer In Progress event for all endpoint types, except control. Fixes: 2ec2a8be (usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers) Cc: <stable@vger.kernel.org> # v3.14+ Reported-by: Pratyush Anand <pratyush.anand@st.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
-rw-r--r--drivers/usb/dwc3/gadget.c8
1 files changed, 1 insertions, 7 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index e8fb231630f7..490a6ca00733 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -527,7 +527,7 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep,
527 dep->stream_capable = true; 527 dep->stream_capable = true;
528 } 528 }
529 529
530 if (usb_endpoint_xfer_isoc(desc)) 530 if (!usb_endpoint_xfer_control(desc))
531 params.param1 |= DWC3_DEPCFG_XFER_IN_PROGRESS_EN; 531 params.param1 |= DWC3_DEPCFG_XFER_IN_PROGRESS_EN;
532 532
533 /* 533 /*
@@ -2042,12 +2042,6 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
2042 dwc3_endpoint_transfer_complete(dwc, dep, event); 2042 dwc3_endpoint_transfer_complete(dwc, dep, event);
2043 break; 2043 break;
2044 case DWC3_DEPEVT_XFERINPROGRESS: 2044 case DWC3_DEPEVT_XFERINPROGRESS:
2045 if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
2046 dev_dbg(dwc->dev, "%s is not an Isochronous endpoint\n",
2047 dep->name);
2048 return;
2049 }
2050
2051 dwc3_endpoint_transfer_complete(dwc, dep, event); 2045 dwc3_endpoint_transfer_complete(dwc, dep, event);
2052 break; 2046 break;
2053 case DWC3_DEPEVT_XFERNOTREADY: 2047 case DWC3_DEPEVT_XFERNOTREADY: