Hi Felipe, On Monday, 5 November 2018 14:05:59 EET Felipe Balbi wrote: > Laurent Pinchart writes: > > On Saturday, 3 November 2018 23:07:33 EET Terence Neill wrote: > >> Hi folks, > >> > >> Thanks for the replies, I really appreciate them. I've made some > >> progress on this. I'm new to USB so apologies if the following text is > >> incorrect or is just bizarre!: > >> > >> 1. The problem with streaming_maxpacket set to 2048 seemed to be caused > >> by not enough requests being queued with the dwc3 driver at one time, > >> resulting in request starvation at higher bandwidths. Increasing the > >> value of the UVC_NUM_REQUESTS macro from 4 to 16 (in > >> drivers/usb/gadget/function/uvc.h) seemed to fix this problem. > > > > This clearly needs to be fixed. I wonder if we should try to compute a > > good value at runtime, or go for a large enough fixed value for all cases. > > just go for something large. Computing in runtime would involving > measuring latency in runtime and adapting your queue accordingly. Too > much work for very little benefit. I've received a request some time ago from a UVC gadget user who wanted to bump the UVC_NUM_REQUESTS up to store a full video frame. That's likely too much, we'll have to decide on a proper middle ground. > >> 2. It looks like the problem that was happening with max_packet set to > >> 3072 was caused by the isochronous transfer being queued for a microframe > >> number in the past (the assumption is that there is the code just wasn't > >> getting the first microframe queued in time). To get around this > >> problem, I changed the DWC3_ALIGN_FRAME() macro to add an offset of one > >> video frame (the video is running at 10fps so about 800 microframes). > >> This fixed the startup problem at high bandwidth. At the moment, the > >> objective of the investigation is to prove throughput, so some latency > >> can be accommodated. > > > > Felipe has worked on this recently, but if I recall correctly there were > > still issues that prevented patches from being upstreamed. > > true > > >> From reading some more about USB, it looks like isochronous transfers may > >> have the option sending zero length packets whenever there is no data to > >> send? Is this true? If so, would this be a possible option to move > >> forward with this issue - eliminating the need to handle missed isocs at > >> the f_uvc layer? > > > > We will always have to handle the missed intervals, as something could go > > wrong and result in such a situation, and we don't want to freeze the > > stream in that case. Transmitting 0-length packets could be an option, > > but I wonder how much CPU overhead it would generate (both on the gadget > > and host side). Felipe, do you have any experience with this and/or > > recommendation ? > > I'd expect the UDC to handle that in HW. At least dwc3 does, don't know > about MUSB and the others. But dwc3 still returns missed intervals errors in that case, right ? I think Terence proposal was to explicitly queue ZLP requests in order to avoid missing any interval. > >> I was reading the summary of the dwc3 driver features at > >> https://github.com/torvalds/linux/blob/master/Documentation/driver-api/us > >> b/d wc3.rst and point 7 mentions support for "Superspeed Bulk Streams" > >> but I was unsure if this meant that ONLY bulk streams were supported or > >> whether isochronous streams were also supported? > > > > That's a question for Felipe :-) > > Super speed defines streams for bulk endpoints only. -- Regards, Laurent Pinchart