diff mbox series

media: uvcvideo: fix the bandwdith quirk on USB 3.x

Message ID 20240414190040.2255a0bc@foxbook (mailing list archive)
State New, archived
Headers show
Series media: uvcvideo: fix the bandwdith quirk on USB 3.x | expand

Commit Message

MichaƂ Pecio April 14, 2024, 5 p.m. UTC
The bandwidth fixup quirk doesn't know that SuperSpeed exists and has
the same 8 service intervals per millisecond as High Speed, hence its
calculations are wrong.

Assume that all speeds from HS up use 8 intervals per millisecond.

No further changes are needed, updated code has been confirmed to work
with all speeds from FS to SS.

Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
---
 drivers/media/usb/uvc/uvc_video.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Ricardo Ribalda April 15, 2024, 7:46 p.m. UTC | #1
Hi Michal

On Sun, 14 Apr 2024 at 19:00, Michal Pecio <michal.pecio@gmail.com> wrote:
>
> The bandwidth fixup quirk doesn't know that SuperSpeed exists and has
> the same 8 service intervals per millisecond as High Speed, hence its
> calculations are wrong.
>
> Assume that all speeds from HS up use 8 intervals per millisecond.
>
> No further changes are needed, updated code has been confirmed to work
> with all speeds from FS to SS.
>
> Signed-off-by: Michal Pecio <michal.pecio@gmail.com>
Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
>  drivers/media/usb/uvc/uvc_video.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
> index 28dde08ec6c5..4b86bef06a52 100644
> --- a/drivers/media/usb/uvc/uvc_video.c
> +++ b/drivers/media/usb/uvc/uvc_video.c
> @@ -214,13 +214,13 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
>                  * Compute a bandwidth estimation by multiplying the frame
>                  * size by the number of video frames per second, divide the
>                  * result by the number of USB frames (or micro-frames for
> -                * high-speed devices) per second and add the UVC header size
> -                * (assumed to be 12 bytes long).
> +                * high- and super-speed devices) per second and add the UVC
> +                * header size (assumed to be 12 bytes long).
>                  */
>                 bandwidth = frame->wWidth * frame->wHeight / 8 * format->bpp;
>                 bandwidth *= 10000000 / interval + 1;
>                 bandwidth /= 1000;
> -               if (stream->dev->udev->speed == USB_SPEED_HIGH)
> +               if (stream->dev->udev->speed >= USB_SPEED_HIGH)
>                         bandwidth /= 8;
>                 bandwidth += 12;
>
> --
> 2.43.0
>
>
Laurent Pinchart June 16, 2024, 11:26 p.m. UTC | #2
Hi Michal,

Thank you for the patch.

On Sun, Apr 14, 2024 at 07:00:40PM +0200, Michal Pecio wrote:
> The bandwidth fixup quirk doesn't know that SuperSpeed exists and has
> the same 8 service intervals per millisecond as High Speed, hence its
> calculations are wrong.
> 
> Assume that all speeds from HS up use 8 intervals per millisecond.
> 
> No further changes are needed, updated code has been confirmed to work
> with all speeds from FS to SS.
> 
> Signed-off-by: Michal Pecio <michal.pecio@gmail.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>  drivers/media/usb/uvc/uvc_video.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
> index 28dde08ec6c5..4b86bef06a52 100644
> --- a/drivers/media/usb/uvc/uvc_video.c
> +++ b/drivers/media/usb/uvc/uvc_video.c
> @@ -214,13 +214,13 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
>  		 * Compute a bandwidth estimation by multiplying the frame
>  		 * size by the number of video frames per second, divide the
>  		 * result by the number of USB frames (or micro-frames for
> -		 * high-speed devices) per second and add the UVC header size
> -		 * (assumed to be 12 bytes long).
> +		 * high- and super-speed devices) per second and add the UVC
> +		 * header size (assumed to be 12 bytes long).
>  		 */
>  		bandwidth = frame->wWidth * frame->wHeight / 8 * format->bpp;
>  		bandwidth *= 10000000 / interval + 1;
>  		bandwidth /= 1000;
> -		if (stream->dev->udev->speed == USB_SPEED_HIGH)
> +		if (stream->dev->udev->speed >= USB_SPEED_HIGH)
>  			bandwidth /= 8;
>  		bandwidth += 12;
>
diff mbox series

Patch

diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index 28dde08ec6c5..4b86bef06a52 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -214,13 +214,13 @@  static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
 		 * Compute a bandwidth estimation by multiplying the frame
 		 * size by the number of video frames per second, divide the
 		 * result by the number of USB frames (or micro-frames for
-		 * high-speed devices) per second and add the UVC header size
-		 * (assumed to be 12 bytes long).
+		 * high- and super-speed devices) per second and add the UVC
+		 * header size (assumed to be 12 bytes long).
 		 */
 		bandwidth = frame->wWidth * frame->wHeight / 8 * format->bpp;
 		bandwidth *= 10000000 / interval + 1;
 		bandwidth /= 1000;
-		if (stream->dev->udev->speed == USB_SPEED_HIGH)
+		if (stream->dev->udev->speed >= USB_SPEED_HIGH)
 			bandwidth /= 8;
 		bandwidth += 12;