as it turns out, we don't need the extra 'start_new'
argument as that can be inferred from DWC3_EP_BUSY
flag.

Because of that, we can simplify
__dwc3_gadget_kick_transfer() by quite a bit, even
allowing us to prepare more TRBs unconditionally.

Signed-off-by: Felipe Balbi <felipe.ba...@linux.intel.com>
---
 drivers/usb/dwc3/gadget.c | 48 ++++++++++++++---------------------------------
 1 file changed, 14 insertions(+), 34 deletions(-)

diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index fa38ab3086e7..3640808e326d 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -962,38 +962,19 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep)
        }
 }
 
-static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param,
-               int start_new)
+static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep, u16 cmd_param)
 {
        struct dwc3_gadget_ep_cmd_params params;
        struct dwc3_request             *req;
        struct dwc3                     *dwc = dep->dwc;
+       int                             starting;
        int                             ret;
        u32                             cmd;
 
-       if (start_new && (dep->flags & DWC3_EP_BUSY)) {
-               dwc3_trace(trace_dwc3_gadget, "%s: endpoint busy", dep->name);
-               return -EBUSY;
-       }
-
-       /*
-        * If we are getting here after a short-out-packet we don't enqueue any
-        * new requests as we try to set the IOC bit only on the last request.
-        */
-       if (start_new) {
-               if (list_empty(&dep->started_list))
-                       dwc3_prepare_trbs(dep);
+       starting = !(dep->flags & DWC3_EP_BUSY);
 
-               /* req points to the first request which will be sent */
-               req = next_request(&dep->started_list);
-       } else {
-               dwc3_prepare_trbs(dep);
-
-               /*
-                * req points to the first request where HWO changed from 0 to 1
-                */
-               req = next_request(&dep->started_list);
-       }
+       dwc3_prepare_trbs(dep);
+       req = next_request(&dep->started_list);
        if (!req) {
                dep->flags |= DWC3_EP_PENDING_REQUEST;
                return 0;
@@ -1001,7 +982,7 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep 
*dep, u16 cmd_param,
 
        memset(&params, 0, sizeof(params));
 
-       if (start_new) {
+       if (starting) {
                params.param0 = upper_32_bits(req->trb_dma);
                params.param1 = lower_32_bits(req->trb_dma);
                cmd = DWC3_DEPCMD_STARTTRANSFER;
@@ -1025,7 +1006,7 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep 
*dep, u16 cmd_param,
 
        dep->flags |= DWC3_EP_BUSY;
 
-       if (start_new) {
+       if (starting) {
                dep->resource_index = dwc3_gadget_ep_get_transfer_index(dwc,
                                dep->number);
                WARN_ON_ONCE(!dep->resource_index);
@@ -1050,7 +1031,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
        /* 4 micro frames in the future */
        uf = cur_uf + dep->interval * 4;
 
-       __dwc3_gadget_kick_transfer(dep, uf, 1);
+       __dwc3_gadget_kick_transfer(dep, uf);
 }
 
 static void dwc3_gadget_start_isoc(struct dwc3 *dwc,
@@ -1119,7 +1100,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
        if (!usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
                        !usb_endpoint_xfer_int(dep->endpoint.desc) &&
                        !(dep->flags & DWC3_EP_BUSY)) {
-               ret = __dwc3_gadget_kick_transfer(dep, 0, true);
+               ret = __dwc3_gadget_kick_transfer(dep, 0);
                goto out;
        }
 
@@ -1149,7 +1130,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
                        return 0;
                }
 
-               ret = __dwc3_gadget_kick_transfer(dep, 0, true);
+               ret = __dwc3_gadget_kick_transfer(dep, 0);
                if (!ret)
                        dep->flags &= ~DWC3_EP_PENDING_REQUEST;
 
@@ -1165,8 +1146,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
                        (dep->flags & DWC3_EP_BUSY) &&
                        !(dep->flags & DWC3_EP_MISSED_ISOC)) {
                WARN_ON_ONCE(!dep->resource_index);
-               ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index,
-                               false);
+               ret = __dwc3_gadget_kick_transfer(dep, dep->resource_index);
                goto out;
        }
 
@@ -1176,7 +1156,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, 
struct dwc3_request *req)
         * handled.
         */
        if (dep->stream_capable)
-               ret = __dwc3_gadget_kick_transfer(dep, 0, true);
+               ret = __dwc3_gadget_kick_transfer(dep, 0);
 
 out:
        if (ret && ret != -EBUSY)
@@ -2066,7 +2046,7 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 
*dwc,
        if (!usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
                int ret;
 
-               ret = __dwc3_gadget_kick_transfer(dep, 0, is_xfer_complete);
+               ret = __dwc3_gadget_kick_transfer(dep, 0);
                if (!ret || ret == -EBUSY)
                        return;
        }
@@ -2117,7 +2097,7 @@ static void dwc3_endpoint_interrupt(struct dwc3 *dwc,
                                        dep->name, active ? "Transfer Active"
                                        : "Transfer Not Active");
 
-                       ret = __dwc3_gadget_kick_transfer(dep, 0, !active);
+                       ret = __dwc3_gadget_kick_transfer(dep, 0);
                        if (!ret || ret == -EBUSY)
                                return;
 
-- 
2.8.2

---------------------------------------------------------------------
Intel Finland Oy
Registered Address: PL 281, 00181 Helsinki 
Business Identity Code: 0357606 - 4 
Domiciled in Helsinki 

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

--
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