All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricardo Ribalda <ribalda@chromium.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	Hans Verkuil <hverkuil-cisco@xs4all.nl>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>,
	linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	tfiga@chromium.org
Cc: Ricardo Ribalda <ribalda@chromium.org>
Subject: [PATCH v9 16/22] media: uvcvideo: Return -EACCES to inactive controls
Date: Fri, 26 Mar 2021 10:58:34 +0100	[thread overview]
Message-ID: <20210326095840.364424-17-ribalda@chromium.org> (raw)
In-Reply-To: <20210326095840.364424-1-ribalda@chromium.org>

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.

Suggested-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
 drivers/media/usb/uvc/uvc_ctrl.c | 71 +++++++++++++++++++++-----------
 1 file changed, 48 insertions(+), 23 deletions(-)

diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
index bcebf9d1a46f..d9d4add1e813 100644
--- a/drivers/media/usb/uvc/uvc_ctrl.c
+++ b/drivers/media/usb/uvc/uvc_ctrl.c
@@ -1082,13 +1082,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;
 
@@ -1104,18 +1127,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);
@@ -1638,25 +1651,37 @@ static int uvc_ctrl_commit_entity(struct uvc_device *dev,
 	return 0;
 }
 
-static int uvc_ctrl_find_ctrlidx(struct uvc_entity *entity,
+static int uvc_ctrl_commit_error(struct uvc_video_chain *chain,
+				 struct uvc_entity *entity,
 				 struct v4l2_ext_controls *ctrls,
-				 struct uvc_control *uvc_control)
+				 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;
 
-	return ctrls->count;
+	if (uvc_ctrl_is_inactive(chain, err_control, mapping))
+		return -EACCES;
+
+	return ret;
 }
 
 int __uvc_ctrl_commit(struct uvc_fh *handle, int rollback,
@@ -1679,8 +1704,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_ctrlidx(entity, ctrls,
-							 err_ctrl);
+		ret = uvc_ctrl_commit_error(chain, entity, ctrls, err_ctrl,
+					    ret);
 	mutex_unlock(&chain->ctrl_mutex);
 	return ret;
 }
-- 
2.31.0.291.g576ba9dcdaf-goog


  parent reply	other threads:[~2021-03-26 10:00 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-26  9:58 [PATCH v9 00/22] uvcvideo: Fix v4l2-compliance errors Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 01/22] media: v4l2-ioctl: Fix check_ext_ctrls Ricardo Ribalda
2021-06-10 16:19   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 02/22] media: pvrusb2: Do not check for V4L2_CTRL_WHICH_DEF_VAL Ricardo Ribalda
2021-06-10 17:29   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 03/22] media: uvcvideo: " Ricardo Ribalda
2021-06-10 16:21   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 04/22] media: v4l2-ioctl: S_CTRL output the right value Ricardo Ribalda
2021-06-10 16:23   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 05/22] media: uvcvideo: Remove s_ctrl and g_ctrl Ricardo Ribalda
2021-06-10 16:24   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 06/22] media: uvcvideo: Set capability in s_param Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 07/22] media: uvcvideo: Return -EIO for control errors Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 08/22] media: uvcvideo: refactor __uvc_ctrl_add_mapping Ricardo Ribalda
2021-03-26  9:58 ` [PATCH v9 09/22] media: uvcvideo: Add support for V4L2_CTRL_TYPE_CTRL_CLASS Ricardo Ribalda
2021-06-10 16:42   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 10/22] media: uvcvideo: Use dev->name for querycap() Ricardo Ribalda
2021-06-10 16:44   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 11/22] media: uvcvideo: Set unique vdev name based in type Ricardo Ribalda
2021-06-10 16:45   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 12/22] media: uvcvideo: Increase the size of UVC_METADATA_BUF_SIZE Ricardo Ribalda
2021-06-10 16:48   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 13/22] media: uvcvideo: Use control names from framework Ricardo Ribalda
2021-06-10 16:50   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 14/22] media: uvcvideo: Check controls flags before accessing them Ricardo Ribalda
2021-06-10 16:55   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 15/22] media: uvcvideo: Set error_idx during ctrl_commit errors Ricardo Ribalda
2021-06-10 17:05   ` Laurent Pinchart
2021-03-26  9:58 ` Ricardo Ribalda [this message]
2021-03-27 11:23   ` [PATCH v9 16/22] media: uvcvideo: Return -EACCES to inactive controls Hans Verkuil
2021-06-10 17:28   ` Laurent Pinchart
2021-06-10 18:40     ` Ricardo Ribalda
2021-06-10 19:47       ` Ricardo Ribalda Delgado
2021-03-26  9:58 ` [PATCH v9 17/22] media: docs: Document the behaviour of uvcdriver Ricardo Ribalda
2021-03-27 11:19   ` Hans Verkuil
2021-03-27 12:01     ` Ricardo Ribalda
2021-03-27 12:03       ` Hans Verkuil
2021-06-10 17:08       ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 18/22] media: uvcvideo: Downgrade control error messages Ricardo Ribalda
2021-03-27 11:19   ` Hans Verkuil
2021-06-10 16:59   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 19/22] uvcvideo: uvc_ctrl_is_accessible: check for INACTIVE Ricardo Ribalda
2021-03-27 12:26   ` Ricardo Ribalda Delgado
2021-03-26  9:58 ` [PATCH v9 20/22] uvcvideo: improve error handling in uvc_query_ctrl() Ricardo Ribalda
2021-06-10 17:14   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 21/22] uvcvideo: don't spam the log in uvc_ctrl_restore_values() Ricardo Ribalda
2021-06-10 16:57   ` Laurent Pinchart
2021-03-26  9:58 ` [PATCH v9 22/22] uvc: use vb2 ioctl and fop helpers Ricardo Ribalda
2021-04-02  2:50   ` Tomasz Figa
2021-05-25  8:06 ` [PATCH v9 00/22] uvcvideo: Fix v4l2-compliance errors Tomasz Figa

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=20210326095840.364424-17-ribalda@chromium.org \
    --to=ribalda@chromium.org \
    --cc=hverkuil-cisco@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.