|
@@ -617,6 +617,35 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep,
|
|
|
trb_link->ctrl |= DWC3_TRB_CTRL_HWO;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * Issue StartTransfer here with no-op TRB so we can always rely on No
|
|
|
+ * Response Update Transfer command.
|
|
|
+ */
|
|
|
+ if (usb_endpoint_xfer_bulk(desc)) {
|
|
|
+ struct dwc3_gadget_ep_cmd_params params;
|
|
|
+ struct dwc3_trb *trb;
|
|
|
+ dma_addr_t trb_dma;
|
|
|
+ u32 cmd;
|
|
|
+
|
|
|
+ memset(¶ms, 0, sizeof(params));
|
|
|
+ trb = &dep->trb_pool[0];
|
|
|
+ trb_dma = dwc3_trb_dma_offset(dep, trb);
|
|
|
+
|
|
|
+ params.param0 = upper_32_bits(trb_dma);
|
|
|
+ params.param1 = lower_32_bits(trb_dma);
|
|
|
+
|
|
|
+ cmd = DWC3_DEPCMD_STARTTRANSFER;
|
|
|
+
|
|
|
+ ret = dwc3_send_gadget_ep_cmd(dep, cmd, ¶ms);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ dep->flags |= DWC3_EP_BUSY;
|
|
|
+
|
|
|
+ dep->resource_index = dwc3_gadget_ep_get_transfer_index(dep);
|
|
|
+ WARN_ON_ONCE(!dep->resource_index);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|