On Thu, Dec 21, 2023 at 10:14:16PM +0800, yuan linyu wrote: > > On 2023/12/21 00:02, Frank Li wrote: > >>> Some UDC driver use gadget_check_config() and match_ep() to allocate EP > >>> internal fifo memory resource, if only pass download full speed EP. > >> Could you share the detail of problem ? do you mean find another different endpoint compared > > The problem is little bit complex. I try to use simple words. > > > > The background: > > > > Generally, UDC have some EP<0..15> and have some internal memory as FIFO. > > for example 16K. You can simple assign EP<n> to 1K memory, which can hold > > whole package. > > > > But for UVC, some controller required internal FIFO hold whole frame data > > > > (mult+1) * (MaxBurst +1) * wPackageSize. > > > > For most case, not every gadget use all 16 EPs. So you can assgin more > > memory into one EP, so it will reduce bus 'ping' package number and reduce > > NACK to improve transfer speed. > > > > The problem: > > pass fs_stream to udc driver, udc driver's check_config function will see > > mult and maxburst is 0. so only reserve 1K for ISO EP, but when try to > > enable EP, mult is 2, so there are not enough internal memory for it > > because more memory already assign to other EPs. > > > > Ideally, when gadget frame work can call check_config again when know > > usb speed, but it is not easy to fix it. > > > > Simple method use ss_stream_ep here and other function drviers. Super > > speed's package size is bigger than high/full speed. If resource can > > support super speed, it can support high/full speed. > > > I don't find any difference of uvc_ss_streaming_ep, uvc_hs_streaming_ep, uvc_fs_streaming_ep > > descriptors. how difference happen in UDC ? uvc_hs_streaming_ep.wMaxPacketSize = cpu_to_le16(max_packet_size | ((max_packet_mult - 1) << 11)); Hight speed will use bit [12:11] as mult uvc_ss_streaming_comp.bmAttributes = max_packet_mult - 1; uvc_ss_streaming_comp.bMaxBurst = opts->streaming_maxburst; ss will pass down uvc_ss_streaming_comp descriptor, which have bMaxBurst and mult information. Frank > > > > > > > > /** > > * gadget_is_superspeed() - return true if the hardware handles superspeed > > * @g: controller that might support superspeed > > */ > > > > @max_speed: Highest speed the driver handles > > > > And according to gadget_is_superspeed() define, it indicate if udc > > controller support supersped, not link speed. > > > > Orignial code is correct. If UDC support superspeed, then use ss_stream_ep. > > > > becasue superspeed is worse case compared as high and full speed. > > > > So I think original is correct. > > > > Frank. > > > > >