Skip to content

Commit 8869eb6

Browse files
ribaldamchehab
authored andcommitted
media: uvcvideo: Allow changing noparam on the fly
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 <[email protected]> Reviewed-by: Laurent Pinchart <[email protected]> Reviewed-by: Hans de Goede <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Laurent Pinchart <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 52fbe17 commit 8869eb6

File tree

3 files changed

+4
-8
lines changed

3 files changed

+4
-8
lines changed

drivers/media/usb/uvc/uvc_driver.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2024,7 +2024,7 @@ int uvc_register_video_device(struct uvc_device *dev,
20242024
int ret;
20252025

20262026
/* Initialize the video buffers queue. */
2027-
ret = uvc_queue_init(queue, type, !uvc_no_drop_param);
2027+
ret = uvc_queue_init(queue, type);
20282028
if (ret)
20292029
return ret;
20302030

drivers/media/usb/uvc/uvc_queue.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ static const struct vb2_ops uvc_meta_queue_qops = {
208208
.stop_streaming = uvc_stop_streaming,
209209
};
210210

211-
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
212-
int drop_corrupted)
211+
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type)
213212
{
214213
int ret;
215214

@@ -239,7 +238,6 @@ int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
239238
mutex_init(&queue->mutex);
240239
spin_lock_init(&queue->irqlock);
241240
INIT_LIST_HEAD(&queue->irqqueue);
242-
queue->flags = drop_corrupted ? UVC_QUEUE_DROP_CORRUPTED : 0;
243241

244242
return 0;
245243
}
@@ -472,7 +470,7 @@ static void uvc_queue_buffer_complete(struct kref *ref)
472470
struct vb2_buffer *vb = &buf->buf.vb2_buf;
473471
struct uvc_video_queue *queue = vb2_get_drv_priv(vb->vb2_queue);
474472

475-
if ((queue->flags & UVC_QUEUE_DROP_CORRUPTED) && buf->error) {
473+
if (buf->error && !uvc_no_drop_param) {
476474
uvc_queue_buffer_requeue(queue, buf);
477475
return;
478476
}

drivers/media/usb/uvc/uvcvideo.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,6 @@ struct uvc_buffer {
317317
};
318318

319319
#define UVC_QUEUE_DISCONNECTED (1 << 0)
320-
#define UVC_QUEUE_DROP_CORRUPTED (1 << 1)
321320

322321
struct uvc_video_queue {
323322
struct vb2_queue queue;
@@ -680,8 +679,7 @@ extern struct uvc_driver uvc_driver;
680679
struct uvc_entity *uvc_entity_by_id(struct uvc_device *dev, int id);
681680

682681
/* Video buffers queue management. */
683-
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type,
684-
int drop_corrupted);
682+
int uvc_queue_init(struct uvc_video_queue *queue, enum v4l2_buf_type type);
685683
void uvc_queue_release(struct uvc_video_queue *queue);
686684
int uvc_request_buffers(struct uvc_video_queue *queue,
687685
struct v4l2_requestbuffers *rb);

0 commit comments

Comments
 (0)