From: Paul Zimmerman <paul.zimmer...@synopsys.com>

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 <pa...@synopsys.com>
Signed-off-by: Felipe Balbi <ba...@ti.com>
---
 drivers/usb/dwc3/gadget.c | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index d307ad7..edc15cd 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -590,13 +590,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)) {
@@ -1119,7 +1119,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;
@@ -1205,7 +1205,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",
@@ -1920,7 +1920,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;
@@ -2070,7 +2070,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;
@@ -2102,7 +2102,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);
-- 
1.9.0

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to