The "TOSHIBA Web Camera - 5M" Chicony device (04f2:b50b) seems to
compute the bandwidth on 16 bits and erroneously sign-extend it to
32 bits, resulting in a huge bandwidth value. Detect and fix that
condition by setting the 16 MSBs to 0 when they're all equal to 1.

Reported-by: Hans de Goede <hdego...@redhat.com>
Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
---
 drivers/media/usb/uvc/uvc_video.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
index dd2373f..25ea8cf 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -119,6 +119,14 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming 
*stream,
                ctrl->dwMaxVideoFrameSize =
                        frame->dwMaxVideoFrameBufferSize;
 
+       /* The "TOSHIBA Web Camera - 5M" Chicony device (04f2:b50b) seems to
+        * compute the bandwidth on 16 bits and erroneously sign-extend it to
+        * 32 bits, resulting in a huge bandwidth value. Detect and fix that
+        * condition by setting the 16 MSBs to 0 when they're all equal to 1.
+        */
+       if ((ctrl->dwMaxPayloadTransferSize & 0xffff0000) == 0xffff0000)
+               ctrl->dwMaxPayloadTransferSize &= ~0xffff0000;
+
        if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) &&
            stream->dev->quirks & UVC_QUIRK_FIX_BANDWIDTH &&
            stream->intf->num_altsetting > 1) {
-- 
Regards,

Laurent Pinchart

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

Reply via email to