]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: uvcvideo: Allow changing noparam on the fly
authorRicardo Ribalda <ribalda@chromium.org>
Wed, 18 Dec 2024 21:39:10 +0000 (21:39 +0000)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Thu, 19 Dec 2024 14:44:43 +0000 (14:44 +0000)
Right now the parameter value is read during video_registration and
cannot be changed afterwards, despite its permissions 0644, that makes
the user believe that the value can be written.

The parameter only affects the behaviour of uvc_queue_buffer_complete(),
with only one check per buffer.

We can read the value directly from uvc_queue_buffer_complete() and
therefore allowing changing it with sysfs on the fly.

Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Link: https://lore.kernel.org/r/20241218-uvc-deprecate-v2-3-ab814139e983@chromium.org
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/usb/uvc/uvc_driver.c
drivers/media/usb/uvc/uvc_queue.c
drivers/media/usb/uvc/uvcvideo.h

index 93ad7435fe5f395205e73dfdbc001d8c0208bd17..bbc33c6958a17cb738461a45e74c407269636081 100644 (file)
@@ -2024,7 +2024,7 @@ int uvc_register_video_device(struct uvc_device *dev,
        int ret;
 
        /* Initialize the video buffers queue. */
-       ret = uvc_queue_init(queue, type, !uvc_no_drop_param);
+       ret = uvc_queue_init(queue, type);
        if (ret)
                return ret;
 
index f8464f0aae1b83f909b623784ee31bfb6c4d1845..2ee142621042167c2587b6a6fdd51c1a46d31c11 100644 (file)
@@ -208,8 +208,7 @@ static const struct vb2_ops uvc_meta_queue_qops = {
        .stop_streaming = uvc_stop_streaming,
 };
 
-int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
-                   int drop_corrupted)
+int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
 {
        int ret;
 
@@ -239,7 +238,6 @@ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
        mutex_init(&queue->mutex);
        spin_lock_init(&queue->irqlock);
        INIT_LIST_HEAD(&queue->irqqueue);
-       queue->flags = drop_corrupted ? UVC_QUEUE_DROP_CORRUPTED : 0;
 
        return 0;
 }
@@ -472,7 +470,7 @@ static void uvc_queue_buffer_complete(struct kref *ref)
        struct vb2_buffer *vb = &buf->buf.vb2_buf;
        struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
 
-       if ((queue->flags & UVC_QUEUE_DROP_CORRUPTED) && buf->error) {
+       if (buf->error && !uvc_no_drop_param) {
                uvc_queue_buffer_requeue(queue, buf);
                return;
        }
index 5690cfd61e23a11f28bd6159a511d4cdd8570f70..3d196a696f46d5857c5f99bec62cc0d29b59eb9c 100644 (file)
@@ -317,7 +317,6 @@ struct uvc_buffer {
 };
 
 #define UVC_QUEUE_DISCONNECTED         (1 << 0)
-#define UVC_QUEUE_DROP_CORRUPTED       (1 << 1)
 
 struct uvc_video_queue {
        struct vb2_queue queue;
@@ -680,8 +679,7 @@ extern struct uvc_driver uvc_driver;
 struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id);
 
 /* Video buffers queue management. */
-int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
-                  int drop_corrupted);
+int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type);
 void uvc_queue_release(struct uvc_video_queue *queue);
 int uvc_request_buffers(struct uvc_video_queue *queue,
                        struct v4l2_requestbuffers *rb);