usb: dwc3: gadget: move cmd_endtransfer to extra function
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Sun, 6 Mar 2022 21:12:51 +0000 (22:12 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Mar 2022 17:42:32 +0000 (18:42 +0100)
This patch adds the extra function __dwc3_stop_active_transfer to
consolidate the same codepath.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20220306211251.2281335-3-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/gadget.c

index 4161871..7b3ed35 100644 (file)
@@ -1674,6 +1674,40 @@ static int __dwc3_gadget_get_frame(struct dwc3 *dwc)
 }
 
 /**
+ * __dwc3_stop_active_transfer - stop the current active transfer
+ * @dep: isoc endpoint
+ * @force: set forcerm bit in the command
+ * @interrupt: command complete interrupt after End Transfer command
+ *
+ * When setting force, the ForceRM bit will be set. In that case
+ * the controller won't update the TRB progress on command
+ * completion. It also won't clear the HWO bit in the TRB.
+ * The command will also not complete immediately in that case.
+ */
+static int __dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, bool interrupt)
+{
+       struct dwc3_gadget_ep_cmd_params params;
+       u32 cmd;
+       int ret;
+
+       cmd = DWC3_DEPCMD_ENDTRANSFER;
+       cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
+       cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
+       cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
+       memset(&params, 0, sizeof(params));
+       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
+       WARN_ON_ONCE(ret);
+       dep->resource_index = 0;
+
+       if (!interrupt)
+               dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
+       else if (!ret)
+               dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
+
+       return ret;
+}
+
+/**
  * dwc3_gadget_start_isoc_quirk - workaround invalid frame number
  * @dep: isoc endpoint
  *
@@ -1848,21 +1882,8 @@ static int __dwc3_gadget_start_isoc(struct dwc3_ep *dep)
         * status, issue END_TRANSFER command and retry on the next XferNotReady
         * event.
         */
-       if (ret == -EAGAIN) {
-               struct dwc3_gadget_ep_cmd_params params;
-               u32 cmd;
-
-               cmd = DWC3_DEPCMD_ENDTRANSFER |
-                       DWC3_DEPCMD_CMDIOC |
-                       DWC3_DEPCMD_PARAM(dep->resource_index);
-
-               dep->resource_index = 0;
-               memset(&params, 0, sizeof(params));
-
-               ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
-               if (!ret)
-                       dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
-       }
+       if (ret == -EAGAIN)
+               ret = __dwc3_stop_active_transfer(dep, false, true);
 
        return ret;
 }
@@ -3603,10 +3624,6 @@ static void dwc3_reset_gadget(struct dwc3 *dwc)
 static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
        bool interrupt)
 {
-       struct dwc3_gadget_ep_cmd_params params;
-       u32 cmd;
-       int ret;
-
        if (!(dep->flags & DWC3_EP_TRANSFER_STARTED) ||
            (dep->flags & DWC3_EP_END_TRANSFER_PENDING))
                return;
@@ -3638,19 +3655,7 @@ static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force,
         * This mode is NOT available on the DWC_usb31 IP.
         */
 
-       cmd = DWC3_DEPCMD_ENDTRANSFER;
-       cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0;
-       cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0;
-       cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
-       memset(&params, 0, sizeof(params));
-       ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params);
-       WARN_ON_ONCE(ret);
-       dep->resource_index = 0;
-
-       if (!interrupt)
-               dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
-       else
-               dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
+       __dwc3_stop_active_transfer(dep, force, interrupt);
 }
 
 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc)