Hi, yfw <nh26223@xxxxxxxxx> writes: > On 2016/9/26 16:12, Felipe Balbi wrote: >> In case of High-Speed, High-Bandwidth endpoints, we >> need to tell DWC3 that we have more than one packet >> per interval. We do that by setting PCM1 field of >> Isochronous-First TRB. >> >> Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> >> --- >> drivers/usb/dwc3/gadget.c | 14 ++++++++++++-- >> 1 file changed, 12 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c >> index 997e82dcc55e..5f7e39407892 100644 >> --- a/drivers/usb/dwc3/gadget.c >> +++ b/drivers/usb/dwc3/gadget.c >> @@ -793,6 +793,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, >> unsigned length, unsigned chain, unsigned node) >> { >> struct dwc3_trb *trb; >> + struct dwc3 *dwc = dep->dwc; >> + struct usb_gadget *gadget = &dwc->gadget; >> + enum usb_device_speed speed = gadget->speed; >> >> dwc3_trace(trace_dwc3_gadget, "%s: req %p dma %08llx length %d%s", >> dep->name, req, (unsigned long long) dma, >> @@ -819,10 +822,17 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, >> break; >> >> case USB_ENDPOINT_XFER_ISOC: >> - if (!node) >> + if (!node) { >> trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; >> - else >> + >> + if (speed == USB_SPEED_HIGH) { >> + struct usb_ep *ep = &dep->endpoint; >> + u8 pkts = usb_endpoint_isoc_maxp_mult(ep->desc); >> + trb->size |= DWC3_TRB_SIZE_PCM1(pkts - 1); >> + } >> + } else { >> trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS; >> + } >> >> /* always enable Interrupt on Missed ISOC */ >> trb->ctrl |= DWC3_TRB_CTRL_ISP_IMI; >> > > Looks good to me. You could add > Reviewed-by: Fengwei Yin <nh26223@xxxxxxxxx> looking at the wrong thread, please have a look at this one: https://marc.info/?l=linux-usb&m=147506797611366&w=2 -- balbi
Attachment:
signature.asc
Description: PGP signature