|
@@ -563,27 +563,7 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep)
|
|
|
if (!list_empty(&dep->req_queued)) {
|
|
|
dwc3_stop_active_transfer(dwc, dep->number);
|
|
|
|
|
|
- /*
|
|
|
- * NOTICE: We are violating what the Databook says about the
|
|
|
- * EndTransfer command. Ideally we would _always_ wait for the
|
|
|
- * EndTransfer Command Completion IRQ, but that's causing too
|
|
|
- * much trouble synchronizing between us and gadget driver.
|
|
|
- *
|
|
|
- * We have discussed this with the IP Provider and it was
|
|
|
- * suggested to giveback all requests here, but give HW some
|
|
|
- * extra time to synchronize with the interconnect. We're using
|
|
|
- * an arbitraty 100us delay for that.
|
|
|
- *
|
|
|
- * Note also that a similar handling was tested by Synopsys
|
|
|
- * (thanks a lot Paul) and nothing bad has come out of it.
|
|
|
- * In short, what we're doing is:
|
|
|
- *
|
|
|
- * - Issue EndTransfer WITH CMDIOC bit set
|
|
|
- * - Wait 100us
|
|
|
- * - giveback all requests to gadget driver
|
|
|
- */
|
|
|
- udelay(100);
|
|
|
-
|
|
|
+ /* - giveback all requests to gadget driver */
|
|
|
while (!list_empty(&dep->req_queued)) {
|
|
|
req = next_request(&dep->req_queued);
|
|
|
|
|
@@ -1875,6 +1855,25 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
|
|
|
if (!dep->resource_index)
|
|
|
return;
|
|
|
|
|
|
+ /*
|
|
|
+ * NOTICE: We are violating what the Databook says about the
|
|
|
+ * EndTransfer command. Ideally we would _always_ wait for the
|
|
|
+ * EndTransfer Command Completion IRQ, but that's causing too
|
|
|
+ * much trouble synchronizing between us and gadget driver.
|
|
|
+ *
|
|
|
+ * We have discussed this with the IP Provider and it was
|
|
|
+ * suggested to giveback all requests here, but give HW some
|
|
|
+ * extra time to synchronize with the interconnect. We're using
|
|
|
+ * an arbitraty 100us delay for that.
|
|
|
+ *
|
|
|
+ * Note also that a similar handling was tested by Synopsys
|
|
|
+ * (thanks a lot Paul) and nothing bad has come out of it.
|
|
|
+ * In short, what we're doing is:
|
|
|
+ *
|
|
|
+ * - Issue EndTransfer WITH CMDIOC bit set
|
|
|
+ * - Wait 100us
|
|
|
+ */
|
|
|
+
|
|
|
cmd = DWC3_DEPCMD_ENDTRANSFER;
|
|
|
cmd |= DWC3_DEPCMD_HIPRI_FORCERM | DWC3_DEPCMD_CMDIOC;
|
|
|
cmd |= DWC3_DEPCMD_PARAM(dep->resource_index);
|
|
@@ -1882,6 +1881,8 @@ static void dwc3_stop_active_transfer(struct dwc3 *dwc, u32 epnum)
|
|
|
ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms);
|
|
|
WARN_ON_ONCE(ret);
|
|
|
dep->resource_index = 0;
|
|
|
+
|
|
|
+ udelay(100);
|
|
|
}
|
|
|
|
|
|
static void dwc3_stop_active_transfers(struct dwc3 *dwc)
|