Commit 87d76b5f authored by Michael Grzeschik's avatar Michael Grzeschik Committed by Greg Kroah-Hartman
Browse files

usb: gadget: uvc: calculate the number of request depending on framesize



The current limitation of possible number of requests being handled is
dependent on the gadget speed. It makes more sense to depend on the
typical frame size when calculating the number of requests. This patch
is changing this and is using the previous limits as boundaries for
reasonable minimum and maximum number of requests.

For a 1080p jpeg encoded video stream with a maximum imagesize of
e.g. 800kB with a maxburst of 8 and an multiplier of 1 the resulting
number of requests is calculated to 49.

        800768         1
nreqs = ------ * -------------- ~= 49
          2      (1024 * 8 * 1)

Tested-by: default avatarDan Vacura <w36195@motorola.com>
Signed-off-by: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20220529223848.105914-2-m.grzeschik@pengutronix.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e84e3e99
Loading
Loading
Loading
Loading
+12 −5
Original line number Original line Diff line number Diff line
@@ -44,7 +44,8 @@ static int uvc_queue_setup(struct vb2_queue *vq,
{
{
	struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
	struct uvc_video_queue *queue = vb2_get_drv_priv(vq);
	struct uvc_video *video = container_of(queue, struct uvc_video, queue);
	struct uvc_video *video = container_of(queue, struct uvc_video, queue);
	struct usb_composite_dev *cdev = video->uvc->func.config->cdev;
	unsigned int req_size;
	unsigned int nreq;


	if (*nbuffers > UVC_MAX_VIDEO_BUFFERS)
	if (*nbuffers > UVC_MAX_VIDEO_BUFFERS)
		*nbuffers = UVC_MAX_VIDEO_BUFFERS;
		*nbuffers = UVC_MAX_VIDEO_BUFFERS;
@@ -53,10 +54,16 @@ static int uvc_queue_setup(struct vb2_queue *vq,


	sizes[0] = video->imagesize;
	sizes[0] = video->imagesize;


	if (cdev->gadget->speed < USB_SPEED_SUPER)
	req_size = video->ep->maxpacket
		video->uvc_num_requests = 4;
		 * max_t(unsigned int, video->ep->maxburst, 1)
	else
		 * (video->ep->mult);
		video->uvc_num_requests = 64;

	/* We divide by two, to increase the chance to run
	 * into fewer requests for smaller framesizes.
	 */
	nreq = DIV_ROUND_UP(DIV_ROUND_UP(sizes[0], 2), req_size);
	nreq = clamp(nreq, 4U, 64U);
	video->uvc_num_requests = nreq;


	return 0;
	return 0;
}
}