On Sat May 10 14:18:03 2025 +0800, chenchangcheng wrote:
> Some broken device return wrong dwMaxPayloadTransferSize fields as
> follows:
> 
> [  218.632537] uvcvideo: Device requested 2752512 B/frame bandwidth.
> [  218.632598] uvcvideo: No fast enough alt setting for requested bandwidth.
> 
> When dwMaxPayloadTransferSize is greater than maxpsize, it will prevent
> the camera from starting. So use the bandwidth of maxpsize.
> 
> Signed-off-by: chenchangcheng <chenchangch...@kylinos.cn>
> Reviewed-by: Ricardo Ribalda <riba...@chromium.org>
> Reviewed-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Link: https://lore.kernel.org/r/20250510061803.811433-1-ccc194...@163.com
> Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> Signed-off-by: Hans Verkuil <hverk...@xs4all.nl>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/usb/uvc/uvc_video.c | 9 +++++++++
 1 file changed, 9 insertions(+)

---

diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
index e3567aeb0007..11769a1832d2 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -262,6 +262,15 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming 
*stream,
 
                ctrl->dwMaxPayloadTransferSize = bandwidth;
        }
+
+       if (stream->intf->num_altsetting > 1 &&
+           ctrl->dwMaxPayloadTransferSize > stream->maxpsize) {
+               dev_warn_ratelimited(&stream->intf->dev,
+                                    "UVC non compliance: the max payload 
transmission size (%u) exceeds the size of the ep max packet (%u). Using the 
max size.\n",
+                                    ctrl->dwMaxPayloadTransferSize,
+                                    stream->maxpsize);
+               ctrl->dwMaxPayloadTransferSize = stream->maxpsize;
+       }
 }
 
 static size_t uvc_video_ctrl_size(struct uvc_streaming *stream)

Reply via email to