aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3
diff options
context:
space:
mode:
authorPaul Zimmerman <Paul.Zimmerman@synopsys.com>2012-04-27 07:17:35 -0400
committerFelipe Balbi <balbi@ti.com>2014-03-05 15:40:03 -0500
commitb992e6813e257269e9599ca07be8bd52df784bf5 (patch)
tree8582fc96886d9e472d1dff2da9bdbd9c4fb70916 /drivers/usb/dwc3
parent356363bf6b2fc4785d874ef87ed2fad4b8543490 (diff)
usb: dwc3: gadget: add 'force' argument to stop_active_transfer
It's not always we need to force a transfer to be removed from the core's internal cache. This extra argument will help differentiating those two cases. Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/dwc3')
-rw-r--r--drivers/usb/dwc3/gadget.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index df9749eac6ac..f1cb0984046e 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -570,13 +570,13 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
570 return 0; 570 return 0;
571} 571}
572 572
573static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum); 573static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
574static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) 574static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
575{ 575{
576 struct dwc3_request *req; 576 struct dwc3_request *req;
577 577
578 if (!list_empty(&dep->req_queued)) { 578 if (!list_empty(&dep->req_queued)) {
579 dwc3_stop_active_transfer(dwc, dep->number); 579 dwc3_stop_active_transfer(dwc, dep->number, true);
580 580
581 /* - giveback all requests to gadget driver */ 581 /* - giveback all requests to gadget driver */
582 while (!list_empty(&dep->req_queued)) { 582 while (!list_empty(&dep->req_queued)) {
@@ -1099,7 +1099,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
1099 */ 1099 */
1100 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { 1100 if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
1101 if (list_empty(&dep->req_queued)) { 1101 if (list_empty(&dep->req_queued)) {
1102 dwc3_stop_active_transfer(dwc, dep->number); 1102 dwc3_stop_active_transfer(dwc, dep->number, true);
1103 dep->flags = DWC3_EP_ENABLED; 1103 dep->flags = DWC3_EP_ENABLED;
1104 } 1104 }
1105 return 0; 1105 return 0;
@@ -1185,7 +1185,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
1185 } 1185 }
1186 if (r == req) { 1186 if (r == req) {
1187 /* wait until it is processed */ 1187 /* wait until it is processed */
1188 dwc3_stop_active_transfer(dwc, dep->number); 1188 dwc3_stop_active_transfer(dwc, dep->number, true);
1189 goto out1; 1189 goto out1;
1190 } 1190 }
1191 dev_err(dwc->dev, "request %p was not queued to %s\n", 1191 dev_err(dwc->dev, "request %p was not queued to %s\n",
@@ -1881,7 +1881,7 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
1881 */ 1881 */
1882 dep->flags = DWC3_EP_PENDING_REQUEST; 1882 dep->flags = DWC3_EP_PENDING_REQUEST;
1883 } else { 1883 } else {
1884 dwc3_stop_active_transfer(dwc, dep->number); 1884 dwc3_stop_active_transfer(dwc, dep->number, true);
1885 dep->flags = DWC3_EP_ENABLED; 1885 dep->flags = DWC3_EP_ENABLED;
1886 } 1886 }
1887 return 1; 1887 return 1;
@@ -2028,7 +2028,7 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc)
2028 } 2028 }
2029} 2029}
2030 2030
2031static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum) 2031static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force)
2032{ 2032{
2033 struct dwc3_ep *dep; 2033 struct dwc3_ep *dep;
2034 struct dwc3_gadget_ep_cmd_params params; 2034 struct dwc3_gadget_ep_cmd_params params;
@@ -2060,7 +2060,8 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
2060 */ 2060 */
2061 2061
2062 cmd = DWC3_DEPCMD_ENDTRANSFER; 2062 cmd = DWC3_DEPCMD_ENDTRANSFER;
2063 cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC; 2063 cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
2064 cmd |= DWC3_DEPCMD_CMDIOC;
2064 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); 2065 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
2065 memset(&params, 0, sizeof(params)); 2066 memset(&params, 0, sizeof(params));
2066 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params); 2067 ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);