]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: dwc3: gadget: offset Start Transfer latency for bulk EPs
authorFelipe Balbi <felipe.balbi@linux.intel.com>
Thu, 29 Sep 2016 13:28:56 +0000 (16:28 +0300)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Thu, 3 Nov 2016 08:38:29 +0000 (10:38 +0200)
We can offset the latency of a full Start Transfer
command - where we _must_ poll for its completion -
to usb_ep_enable() time. This means that once
requests start showing up from the gadget driver, we
can rely on No Response Update Transfer command -
where we don't need to poll for completion.

This patch, starts implementing this method for Bulk
endpoints, even though, technically, we could extend
it to all other endpoints in future commits.

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

index 4d191c8acb599bd408572ae558a2d9710ad74081..c692aafa739715ab8aea7560d90553c6b1414467 100644 (file)
@@ -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(&params, 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, &params);
+               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;
 }