diff options
author | Thinh Nguyen <thinh.nguyen@synopsys.com> | 2018-11-15 19:03:27 -0800 |
---|---|---|
committer | Felipe Balbi <felipe.balbi@linux.intel.com> | 2018-12-05 11:14:15 +0200 |
commit | 6abfa0f5bb7cce98c89e2c28fcea31c17200890e (patch) | |
tree | 790176b78ed31fb51fa11b732678722c7504d9d7 /drivers/usb/dwc3/gadget.c | |
parent | 6b69753fa0078c5222d6b4aeb5017c5503e0dc8e (diff) | |
download | lwn-6abfa0f5bb7cce98c89e2c28fcea31c17200890e.tar.gz lwn-6abfa0f5bb7cce98c89e2c28fcea31c17200890e.zip |
usb: dwc3: gadget: Report isoc transfer frame number
Implement the new frame_number API to report the isochronous interval
frame number. This patch checks and reports the interval in which the
isoc transfer was transmitted or received via the Isoc-First TRB SOF
number field.
Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Diffstat (limited to 'drivers/usb/dwc3/gadget.c')
-rw-r--r-- | drivers/usb/dwc3/gadget.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 38d6df98e9ce..e2caf9eec30a 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2340,6 +2340,19 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep, trb->ctrl &= ~DWC3_TRB_CTRL_HWO; /* + * For isochronous transfers, the first TRB in a service interval must + * have the Isoc-First type. Track and report its interval frame number. + */ + if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && + (trb->ctrl & DWC3_TRBCTL_ISOCHRONOUS_FIRST)) { + unsigned int frame_number; + + frame_number = DWC3_TRB_CTRL_GET_SID_SOFN(trb->ctrl); + frame_number &= ~(dep->interval - 1); + req->request.frame_number = frame_number; + } + + /* * If we're dealing with unaligned size OUT transfer, we will be left * with one TRB pending in the ring. We need to manually clear HWO bit * from that TRB. |