usb: dwc3: gadget: simplify queueing of isoc transfers
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Thu, 29 Mar 2018 10:23:53 +0000 (13:23 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 21 May 2018 07:00:54 +0000 (10:00 +0300)
After all the previous changes, it's now a lot clearer how isoc
transfers should be managed. We don't need to try to End Transfers
from ep_queue since that's already done by cleanup_requests.

Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/gadget.c

index 452f76e..ffa84e0 100644 (file)
@@ -1322,24 +1322,18 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
         * errors which will force us issue EndTransfer command.
         */
        if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+               if (!(dep->flags & DWC3_EP_PENDING_REQUEST) &&
+                               !(dep->flags & DWC3_EP_TRANSFER_STARTED))
+                       return 0;
+
                if ((dep->flags & DWC3_EP_PENDING_REQUEST)) {
-                       if (dep->flags & DWC3_EP_TRANSFER_STARTED) {
-                               dwc3_stop_active_transfer(dep, true);
-                               dep->flags = DWC3_EP_ENABLED;
-                       } else {
+                       if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) {
                                __dwc3_gadget_start_isoc(dep);
-                               dep->flags &= ~DWC3_EP_PENDING_REQUEST;
+                               return 0;
                        }
-                       return 0;
                }
-
-               if (dep->flags & DWC3_EP_TRANSFER_STARTED)
-                       goto out;
-
-               return 0;
        }
 
-out:
        return __dwc3_gadget_kick_transfer(dep);
 }