usb: dwc3: gadget: add 'force' argument to stop_active_transfer
authorPaul Zimmerman <Paul.Zimmerman@synopsys.com>
Fri, 27 Apr 2012 11:17:35 +0000 (14:17 +0300)
committerFelipe Balbi <balbi@ti.com>
Wed, 5 Mar 2014 20:40:03 +0000 (14:40 -0600)
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>
drivers/usb/dwc3/gadget.c

index df9749eac6ac20ccf511c1c45e552fe484a1bf0d..f1cb0984046ec0be0345e94082e003c75be13a4a 100644 (file)
@@ -570,13 +570,13 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
        return 0;
 }
 
-static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum);
+static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force);
 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
 {
        struct dwc3_request             *req;
 
        if (!list_empty(&dep->req_queued)) {
-               dwc3_stop_active_transfer(dwc, dep->number);
+               dwc3_stop_active_transfer(dwc, dep->number, true);
 
                /* - giveback all requests to gadget driver */
                while (!list_empty(&dep->req_queued)) {
@@ -1099,7 +1099,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
                 */
                if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
                        if (list_empty(&dep->req_queued)) {
-                               dwc3_stop_active_transfer(dwc, dep->number);
+                               dwc3_stop_active_transfer(dwc, dep->number, true);
                                dep->flags = DWC3_EP_ENABLED;
                        }
                        return 0;
@@ -1185,7 +1185,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep,
                }
                if (r == req) {
                        /* wait until it is processed */
-                       dwc3_stop_active_transfer(dwc, dep->number);
+                       dwc3_stop_active_transfer(dwc, dep->number, true);
                        goto out1;
                }
                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,
                         */
                        dep->flags = DWC3_EP_PENDING_REQUEST;
                } else {
-                       dwc3_stop_active_transfer(dwc, dep->number);
+                       dwc3_stop_active_transfer(dwc, dep->number, true);
                        dep->flags = DWC3_EP_ENABLED;
                }
                return 1;
@@ -2028,7 +2028,7 @@ static void dwc3_disconnect_gadget(struct dwc3 *dwc)
        }
 }
 
-static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
+static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum, bool force)
 {
        struct dwc3_ep *dep;
        struct dwc3_gadget_ep_cmd_params params;
@@ -2060,7 +2060,8 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
         */
 
        cmd = DWC3_DEPCMD_ENDTRANSFER;
-       cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC;
+       cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
+       cmd |= DWC3_DEPCMD_CMDIOC;
        cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
        memset(&params, 0, sizeof(params));
        ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, &params);