RE: [PATCH V3 2/5] usb: gadget/uvc: Make video streaming buffer size compliant to USB3.0 SS specs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Laurent,

> Hi Bhupesh,
> 
> On Tuesday 12 February 2013 16:48:08 Bhupesh SHARMA wrote:
> > > On Monday 11 February 2013 21:27:50 Bhupesh SHARMA wrote:
> > > > On Friday, February 08, 2013 4:22 AM Laurent Pinchart wrote:
> > > > > On Thursday 17 January 2013 16:23:50 Bhupesh Sharma wrote:
> 
> [snip]
> 
> > > > > > diff --git a/drivers/usb/gadget/uvc_video.c
> > > > > > b/drivers/usb/gadget/uvc_video.c index b0e53a8..f7d1913 100644
> > > > > > --- a/drivers/usb/gadget/uvc_video.c
> > > > > > +++ b/drivers/usb/gadget/uvc_video.c
> > > > > > @@ -235,7 +235,10 @@ uvc_video_alloc_requests(struct uvc_video
> > > > > > *video)
> > > > > >  	BUG_ON(video->req_size);
> > > > > >
> > > > > >  	for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
> > > > > >
> > > > > > -		video->req_buffer[i] = kmalloc(video->ep-
> >maxpacket,
> > > > > > GFP_KERNEL);
> > > > > > +		video->req_buffer[i] = kmalloc(video->ep-
> >maxpacket *
> > > > > > +						video->ep->maxburst
> *
> > > > >
> > > > > If I'm not mistaken maxburst is 0 for FS and HS endpoints (from
> > > > > config_ep_by_speed in drivers/usb/gadget/composite.c). The
> > > > > buffer size will then be pretty small :-)
> > > >
> > > > Actually my initial patch had this approach:
> > > > video->req_buffer[i] = kmalloc(video->ep->maxpacket *
> > > > 						(video->ep->maxburst + 1) *
> > > > 						(video->ep->mult + 1))
> > > >
> > > > but due to a patch from Felipe:
> > > >
> > > > usb: gadget: composite: fix ep->maxburst initialization
> > > >
> > > > bMaxBurst field on endpoint companion descriptor  is supposed to
> > > > contain the number of burst minus  1. When passing that to
> > > > controller drivers, we  should be passing the real number instead
> > > > (by incrementing 1).
> > > >
> > > > While doing that, also fix the assumption on
> > > >
> > > >  dwc3 that value comes decremented by one.
> > > >
> > > > Signed-off-by: Felipe Balbi <balbi@xxxxxx>
> > > >
> > > > as we have now:
> > > > _ep->maxburst = comp_desc->bMaxBurst + 1;
> > > >
> > > > So, even if comp_desc->bMaxBurst is 0, _ep->maxburst will be 1.
> > > > So, this patch seems correct to me.
> > >
> > > For SS, sure, but if you connect the gadget to a USB 2.0 host
> > > maxburst will be set to 0, so buffer allocation will break.
> > >
> > > Please make sure you test all your patches with both USB 2.0 and USB
> > > 3.0 hosts.
> >
> > Ok. So will something like this suffice:
> > 	video->req_buffer[i] = kmalloc(video->ep->maxpacket *
> > 					(video->ep->comp_desc ?
> > 						video->ep->maxburst : 1) *
> > 					(video->ep->mult + 1),
> > 					GFP_KERNEL);
> >
> > As ep->comp_desc will be NULL for HS and FS devices..
> 
> What about the following patch ?
> 
> diff --git a/drivers/usb/gadget/uvc_video.c
> b/drivers/usb/gadget/uvc_video.c index cd067a6..f5193cc 100644
> --- a/drivers/usb/gadget/uvc_video.c
> +++ b/drivers/usb/gadget/uvc_video.c
> @@ -229,13 +229,18 @@ uvc_video_free_requests(struct uvc_video *video)
> static int  uvc_video_alloc_requests(struct uvc_video *video)  {
> +	unsigned int req_size;
>  	unsigned int i;
>  	int ret = -ENOMEM;
> 
>  	BUG_ON(video->req_size);
> 
> +	req_size = video->ep->maxpacket
> +		 * max_t(unsigned int, video->ep->maxburst, 1)
> +		 * (video->ep->mult + 1);
> +
>  	for (i = 0; i < UVC_NUM_REQUESTS; ++i) {
> -		video->req_buffer[i] = kmalloc(video->ep->maxpacket,
> GFP_KERNEL);
> +		video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL);
>  		if (video->req_buffer[i] == NULL)
>  			goto error;
> 

Yes, this also seems fine. But I think the companion descriptor can be easily associated as been absent for HS/FS devices.
But even this will do. Better to add a one line comment on top of this calculation though for better readibility.

I will do the same for V4 then..

Regards,
Bhupesh
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux