| From dbc3e3e6c79e50547b4dfc00248f15bc7669439f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sun, 20 Dec 2020 15:11:13 +0100 |
| Subject: media: uvcvideo: Accept invalid bFormatIndex and bFrameIndex values |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| |
| [ Upstream commit dc9455ffae02d7b7fb51ba1e007fffcb9dc5d890 ] |
| |
| The Renkforce RF AC4K 300 Action Cam 4K reports invalid bFormatIndex and |
| bFrameIndex values when negotiating the video probe and commit controls. |
| The UVC descriptors report a single supported format and frame size, |
| with bFormatIndex and bFrameIndex both equal to 2, but the video probe |
| and commit controls report bFormatIndex and bFrameIndex set to 1. |
| |
| The device otherwise operates correctly, but the driver rejects the |
| values and fails the format try operation. Fix it by ignoring the |
| invalid indices, and assuming that the format and frame requested by the |
| driver are accepted by the device. |
| |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=210767 |
| |
| Fixes: 8a652a17e3c0 ("media: uvcvideo: Ensure all probed info is returned to v4l2") |
| Reported-by: Till Dรถrges <doerges@pre-sense.de> |
| Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/media/usb/uvc/uvc_v4l2.c | 18 +++++++++--------- |
| 1 file changed, 9 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c |
| index fa06bfa174ad3..c7172b8952a96 100644 |
| --- a/drivers/media/usb/uvc/uvc_v4l2.c |
| +++ b/drivers/media/usb/uvc/uvc_v4l2.c |
| @@ -248,7 +248,9 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, |
| goto done; |
| |
| /* After the probe, update fmt with the values returned from |
| - * negotiation with the device. |
| + * negotiation with the device. Some devices return invalid bFormatIndex |
| + * and bFrameIndex values, in which case we can only assume they have |
| + * accepted the requested format as-is. |
| */ |
| for (i = 0; i < stream->nformats; ++i) { |
| if (probe->bFormatIndex == stream->format[i].index) { |
| @@ -257,11 +259,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, |
| } |
| } |
| |
| - if (i == stream->nformats) { |
| - uvc_trace(UVC_TRACE_FORMAT, "Unknown bFormatIndex %u\n", |
| + if (i == stream->nformats) |
| + uvc_trace(UVC_TRACE_FORMAT, |
| + "Unknown bFormatIndex %u, using default\n", |
| probe->bFormatIndex); |
| - return -EINVAL; |
| - } |
| |
| for (i = 0; i < format->nframes; ++i) { |
| if (probe->bFrameIndex == format->frame[i].bFrameIndex) { |
| @@ -270,11 +271,10 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream, |
| } |
| } |
| |
| - if (i == format->nframes) { |
| - uvc_trace(UVC_TRACE_FORMAT, "Unknown bFrameIndex %u\n", |
| + if (i == format->nframes) |
| + uvc_trace(UVC_TRACE_FORMAT, |
| + "Unknown bFrameIndex %u, using default\n", |
| probe->bFrameIndex); |
| - return -EINVAL; |
| - } |
| |
| fmt->fmt.pix.width = frame->wWidth; |
| fmt->fmt.pix.height = frame->wHeight; |
| -- |
| 2.27.0 |
| |