All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricardo Ribalda <ribalda@chromium.org>
To: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	linux-media@vger.kernel.org, tfiga@chromium.org,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v10 21/21] media: uvcvideo: Return -EACCES to inactive controls
Date: Wed, 30 Jun 2021 14:51:23 +0200	[thread overview]
Message-ID: <CANiDSCv=FMy6g1aQhVRxH1tADSyLAOAY7csMwPFtXZVMU8N6VA@mail.gmail.com> (raw)
In-Reply-To: <d65ab386-370e-b2e9-dbac-a981993d9da7@xs4all.nl>

Hi Hans


On Wed, 30 Jun 2021 at 11:03, Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
>
> Hi Ricardo,
>
> On 25/06/2021 15:55, Ricardo Ribalda wrote:
> > Hi Hans
> >
> > On Fri, 25 Jun 2021 at 13:07, Hans Verkuil <hverkuil-cisco@xs4all.nl> wrote:
> >>
> >> On 25/06/2021 12:29, Ricardo Ribalda wrote:
> >>> Hi Hans
> >>>
> >>> Did you have some hardware that did not work fine without this patch?
> >>> Am I remembering correctly?
> >>
> >> Yes, that's correct. It's one of my webcams, but I can't remember which one
> >> it is. You probably want me to test this v10?
> >>
> >> Regards,
> >
> > That would be awesome. Thanks!
>
> You can add my:
>
> Tested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>

Thanks a lot for testing it!

Sorry to bother you, but could I ask you to try again, but with this
patch reverted? This is v10 1-20, without 21/21


Thanks!
>
> to this series.
>
> I do get these warnings (depends on the webcam model, though, some do, some don't):
>
> Streaming ioctls:
>         test read/write: OK (Not Supported)
>         test blocking wait: OK
>                 warn: v4l2-test-buffers.cpp(438): got sequence number 1, expected 0
>         test MMAP (no poll): OK
>                 warn: v4l2-test-buffers.cpp(438): got sequence number 1, expected 0
>         test MMAP (select): OK
>                 warn: v4l2-test-buffers.cpp(438): got sequence number 1, expected 0
>         test MMAP (epoll): OK
>                 warn: v4l2-test-buffers.cpp(438): got sequence number 1, expected 0
>         test USERPTR (no poll): OK
>                 warn: v4l2-test-buffers.cpp(438): got sequence number 1, expected 0
>         test USERPTR (select): OK
>         test DMABUF: Cannot test, specify --expbuf-device
>
> It's something to do with the Field ID, but I'm not sure if this is really correctly
> reporting a dropped frame, or if it is a false report and the sequence counter was
> wrongly incremented.
>
> This is a separate issue, though, and doesn't block this series.
>
> Regards,
>
>         Hans
>
> >
> >>
> >>         Hans
> >>
> >>>
> >>> Thanks!
> >>>
> >>> On Fri, 18 Jun 2021 at 14:29, Ricardo Ribalda <ribalda@chromium.org> wrote:
> >>>>
> >>>> If a control is inactive return -EACCES to let the userspace know that
> >>>> the value will not be applied automatically when the control is active
> >>>> again.
> >>>>
> >>>> Also make sure that query_v4l2_ctrl doesn't return an error.
> >>>>
> >>>> Suggested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> >>>> Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
> >>>> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> >>>> ---
> >>>>  drivers/media/usb/uvc/uvc_ctrl.c | 73 +++++++++++++++++++++-----------
> >>>>  1 file changed, 49 insertions(+), 24 deletions(-)
> >>>>
> >>>> diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
> >>>> index da44d5c0b9ad..4f80c06d3c43 100644
> >>>> --- a/drivers/media/usb/uvc/uvc_ctrl.c
> >>>> +++ b/drivers/media/usb/uvc/uvc_ctrl.c
> >>>> @@ -1104,13 +1104,36 @@ static const char *uvc_map_get_name(const struct uvc_control_mapping *map)
> >>>>         return "Unknown Control";
> >>>>  }
> >>>>
> >>>> +static bool uvc_ctrl_is_inactive(struct uvc_video_chain *chain,
> >>>> +                                struct uvc_control *ctrl,
> >>>> +                                struct uvc_control_mapping *mapping)
> >>>> +{
> >>>> +       struct uvc_control_mapping *master_map = NULL;
> >>>> +       struct uvc_control *master_ctrl = NULL;
> >>>> +       s32 val;
> >>>> +       int ret;
> >>>> +
> >>>> +       if (!mapping->master_id)
> >>>> +               return false;
> >>>> +
> >>>> +       __uvc_find_control(ctrl->entity, mapping->master_id, &master_map,
> >>>> +                          &master_ctrl, 0);
> >>>> +
> >>>> +       if (!master_ctrl || !(master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR))
> >>>> +               return false;
> >>>> +
> >>>> +       ret = __uvc_ctrl_get(chain, master_ctrl, master_map, &val);
> >>>> +       if (ret < 0 || val == mapping->master_manual)
> >>>> +               return false;
> >>>> +
> >>>> +       return true;
> >>>> +}
> >>>> +
> >>>>  static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
> >>>>         struct uvc_control *ctrl,
> >>>>         struct uvc_control_mapping *mapping,
> >>>>         struct v4l2_queryctrl *v4l2_ctrl)
> >>>>  {
> >>>> -       struct uvc_control_mapping *master_map = NULL;
> >>>> -       struct uvc_control *master_ctrl = NULL;
> >>>>         const struct uvc_menu_info *menu;
> >>>>         unsigned int i;
> >>>>
> >>>> @@ -1126,18 +1149,8 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain,
> >>>>         if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR))
> >>>>                 v4l2_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
> >>>>
> >>>> -       if (mapping->master_id)
> >>>> -               __uvc_find_control(ctrl->entity, mapping->master_id,
> >>>> -                                  &master_map, &master_ctrl, 0);
> >>>> -       if (master_ctrl && (master_ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR)) {
> >>>> -               s32 val;
> >>>> -               int ret = __uvc_ctrl_get(chain, master_ctrl, master_map, &val);
> >>>> -               if (ret < 0)
> >>>> -                       return ret;
> >>>> -
> >>>> -               if (val != mapping->master_manual)
> >>>> -                               v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
> >>>> -       }
> >>>> +       if (uvc_ctrl_is_inactive(chain, ctrl, mapping))
> >>>> +               v4l2_ctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
> >>>>
> >>>>         if (!ctrl->cached) {
> >>>>                 int ret = uvc_ctrl_populate_cache(chain, ctrl);
> >>>> @@ -1660,25 +1673,37 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,
> >>>>         return 0;
> >>>>  }
> >>>>
> >>>> -static int uvc_ctrl_find_ctrl_idx(struct uvc_entity *entity,
> >>>> -                                 struct v4l2_ext_controls *ctrls,
> >>>> -                                 struct uvc_control *uvc_control)
> >>>> +static int uvc_ctrl_commit_error(struct uvc_video_chain *chain,
> >>>> +                                struct uvc_entity *entity,
> >>>> +                                struct v4l2_ext_controls *ctrls,
> >>>> +                                struct uvc_control *err_control,
> >>>> +                                int ret)
> >>>>  {
> >>>>         struct uvc_control_mapping *mapping;
> >>>>         struct uvc_control *ctrl_found;
> >>>>         unsigned int i;
> >>>>
> >>>> -       if (!entity)
> >>>> -               return ctrls->count;
> >>>> +       if (!entity) {
> >>>> +               ctrls->error_idx = ctrls->count;
> >>>> +               return ret;
> >>>> +       }
> >>>>
> >>>>         for (i = 0; i < ctrls->count; i++) {
> >>>>                 __uvc_find_control(entity, ctrls->controls[i].id, &mapping,
> >>>>                                    &ctrl_found, 0);
> >>>> -               if (uvc_control == ctrl_found)
> >>>> -                       return i;
> >>>> +               if (err_control == ctrl_found)
> >>>> +                       break;
> >>>>         }
> >>>> +       ctrls->error_idx = i;
> >>>> +
> >>>> +       /* We could not find the control that failed. */
> >>>> +       if (i == ctrls->count)
> >>>> +               return ret;
> >>>> +
> >>>> +       if (uvc_ctrl_is_inactive(chain, err_control, mapping))
> >>>> +               return -EACCES;
> >>>>
> >>>> -       return ctrls->count;
> >>>> +       return ret;
> >>>>  }
> >>>>
> >>>>  int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback,
> >>>> @@ -1701,8 +1726,8 @@ int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback,
> >>>>                 uvc_ctrl_send_events(handle, ctrls->controls, ctrls->count);
> >>>>  done:
> >>>>         if (ret < 0 && ctrls)
> >>>> -               ctrls->error_idx = uvc_ctrl_find_ctrl_idx(entity, ctrls,
> >>>> -                                                         err_ctrl);
> >>>> +               ret = uvc_ctrl_commit_error(chain, entity, ctrls, err_ctrl,
> >>>> +                                           ret);
> >>>>         mutex_unlock(&chain->ctrl_mutex);
> >>>>         return ret;
> >>>>  }
> >>>> --
> >>>> 2.32.0.288.g62a8d224e6-goog
> >>>>
> >>>
> >>>
> >>
> >
> >
>


-- 
Ricardo Ribalda

  reply	other threads:[~2021-06-30 12:51 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-18 12:29 [PATCH v10 00/21] Fix v4l2-compliance errors Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 01/21] media: v4l2-ioctl: Fix check_ext_ctrls Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 02/21] media: pvrusb2: Do not check for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 03/21] media: uvcvideo: " Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 04/21] media: v4l2-ioctl: S_CTRL output the right value Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 05/21] media: uvcvideo: Remove s_ctrl and g_ctrl Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 06/21] media: uvcvideo: Set capability in s_param Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 07/21] media: uvcvideo: Return -EIO for control errors Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 08/21] media: uvcvideo: refactor __uvc_ctrl_add_mapping Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 09/21] media: uvcvideo: Add support for V4L2_CTRL_TYPE_CTRL_CLASS Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 10/21] media: uvcvideo: Use dev->name for querycap() Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 11/21] media: uvcvideo: Set unique vdev name based in type Ricardo Ribalda
2021-12-06 19:05   ` [REGRESSION] " Nicolas Dufresne
2021-12-06 19:15     ` Laurent Pinchart
2021-06-18 12:29 ` [PATCH v10 12/21] media: uvcvideo: Increase the size of UVC_METADATA_BUF_SIZE Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 13/21] media: uvcvideo: Use control names from framework Ricardo Ribalda
2021-09-03 10:10   ` Mauro Carvalho Chehab
2021-09-03 10:33     ` Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 14/21] media: uvcvideo: Check controls flags before accessing them Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 15/21] media: uvcvideo: Set error_idx during ctrl_commit errors Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 16/21] media: docs: Document the behaviour of uvcvideo driver Ricardo Ribalda
2021-06-18 12:29 ` [PATCH v10 17/21] uvcvideo: uvc_ctrl_is_accessible: check for INACTIVE Ricardo Ribalda
2021-08-22 23:40   ` Laurent Pinchart
2021-06-18 12:29 ` [PATCH v10 18/21] uvcvideo: improve error handling in uvc_query_ctrl() Ricardo Ribalda
2021-08-22 23:52   ` Laurent Pinchart
2021-06-18 12:29 ` [PATCH v10 19/21] uvcvideo: don't spam the log in uvc_ctrl_restore_values() Ricardo Ribalda
2021-08-22 23:23   ` Laurent Pinchart
2021-08-23  0:17   ` Laurent Pinchart
2021-08-23  7:32     ` Hans Verkuil
2021-06-18 12:29 ` [PATCH v10 20/21] uvc: use vb2 ioctl and fop helpers Ricardo Ribalda
2021-08-23  0:00   ` Laurent Pinchart
2021-06-18 12:29 ` [PATCH v10 21/21] media: uvcvideo: Return -EACCES to inactive controls Ricardo Ribalda
2021-06-25 10:29   ` Ricardo Ribalda
2021-06-25 11:06     ` Hans Verkuil
2021-06-25 13:55       ` Ricardo Ribalda
2021-06-30  9:02         ` Hans Verkuil
2021-06-30 12:51           ` Ricardo Ribalda [this message]
2021-07-06 14:18             ` Hans Verkuil
2021-07-07  9:07               ` Ricardo Ribalda

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CANiDSCv=FMy6g1aQhVRxH1tADSyLAOAY7csMwPFtXZVMU8N6VA@mail.gmail.com' \
    --to=ribalda@chromium.org \
    --cc=hverkuil-cisco@xs4all.nl \
    --cc=hverkuil@xs4all.nl \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=tfiga@chromium.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.