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>
This commit is contained in:
parent
6b69753fa0
commit
6abfa0f5bb
|
@ -784,6 +784,7 @@ enum dwc3_link_state {
|
|||
#define DWC3_TRB_CTRL_ISP_IMI BIT(10)
|
||||
#define DWC3_TRB_CTRL_IOC BIT(11)
|
||||
#define DWC3_TRB_CTRL_SID_SOFN(n) (((n) & 0xffff) << 14)
|
||||
#define DWC3_TRB_CTRL_GET_SID_SOFN(n) (((n) & (0xffff << 14)) >> 14)
|
||||
|
||||
#define DWC3_TRBCTL_TYPE(n) ((n) & (0x3f << 4))
|
||||
#define DWC3_TRBCTL_NORMAL DWC3_TRB_CTRL_TRBCTL(1)
|
||||
|
|
|
@ -2339,6 +2339,19 @@ static int dwc3_gadget_ep_reclaim_completed_trb(struct dwc3_ep *dep,
|
|||
if (chain && (trb->ctrl & DWC3_TRB_CTRL_HWO))
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue