From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E1AD6C3DA7D for ; Tue, 3 Jan 2023 14:37:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237911AbjACOhL (ORCPT ); Tue, 3 Jan 2023 09:37:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48526 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233410AbjACOgq (ORCPT ); Tue, 3 Jan 2023 09:36:46 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 960D710073 for ; Tue, 3 Jan 2023 06:36:45 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id i9so44030785edj.4 for ; Tue, 03 Jan 2023 06:36:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=o4vpRNrVLZpZlxsGBTMbyBeXBdw1nBEF/02PDPHH1do=; b=l8jI+U5cGLKMQzvUJ7CDE/jILdc2xdTMT5aBtvmitfIQDJn4IZpTAEaBgicAJE0GAf dzwGH3enfaBAG0rMmtn7ncIEvIgS7XFp0iOIeucSiVLP0XnTniVHLic7gNYysZG5ubYG UDp4PMmjFHDxKIBk8967pAPnQC86sO2M/h3qs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o4vpRNrVLZpZlxsGBTMbyBeXBdw1nBEF/02PDPHH1do=; b=rM4aara0WHXsz31NBrG0rhTw6TQFqgWnr2qORhI3ktPPrJUpBXut2qcATi6A5Scuou xKHpye6hJlH3WTyl12006wwp6B5WYooW0GkajYRERvhr0QT60X/qCCvQQGzKoj3lmNJe FTBeyYZD1NjnWpdxQ8vcdVHs7af1tDTJduOXdA6r6yPQzDPYZou/dK/PAIMf7+vwI5UN 2TMyE0hSo11hM8HlFSkWz4gZHH2nPY3V+M1n9nHJngXbvIuOaKblWX39viDIdtkyaK9z gShZBRKAQuhNsxfjYEk3xLpMSLg1rC31n7tQToBt8A00cu+oNoTnGXBylPL/H5oP4cVb 3k2Q== X-Gm-Message-State: AFqh2kqnaxWVfMtdbyRsS5STbkNOQO4+29SqpCZdgcWYqWOY6QlqHC+x X++chNHKiRAg4SWS+WCOH3T4Qg== X-Google-Smtp-Source: AMrXdXvvjCxaCSOHyRikQiiJenmQKNIAU5Ibp/kvbIlWnmtlI/gHhNhdxbOLfoyFzi8IZeFNT0zAQQ== X-Received: by 2002:aa7:ccc2:0:b0:462:2e05:30ce with SMTP id y2-20020aa7ccc2000000b004622e0530cemr36951539edt.42.1672756604172; Tue, 03 Jan 2023 06:36:44 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:43 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:19 +0100 Subject: [PATCH v3 1/8] media: uvcvideo: Check for INACTIVE in uvc_ctrl_is_accessible() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-1-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=5160; i=ribalda@chromium.org; h=from:subject:message-id; bh=23T/fd3YJJF1E+YgFkf8Ajmygtju9PWip1iEAdc/iJ8=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD1rNhhtvAFQKumGKX90/lQE4tOQjtbvjf17JOJ7 YhxxAf6JAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9awAKCRDRN9E+zzrEiH5cEA CaIlgVgUj3T8Q8M89phJlkwOypRrMetwVm+FDAFOiRfZi6ZCvYzAsgEuBuzT5ZxDumi14MCjYl2zNY aJWFYSbXI+eTs+ifDsZvrO0BrTTYbG0/PHokN5wiPoRsdaYkGtvkIc6kHWwWeFCUQVS0dolcEeFmrI 5IUK9rUTh8g/HGKqVrIZElxTlbdsZfkCEG2HCHs2c+XQagq0m40jPUMGNkWHD2g9a1Pg1YxG/kcynv atKV1QBiXuDrwTyez6KWH5QuDti0tVFLozaRbLHeLQDT+QyLPDtyPjKUCkPCG5fWTx2mguASoFC2i4 hpj7qbGXt7pobUBSm7+Qwl5WGXYU/WaCliRxJFj9I6mWCSUEXblLNxJjWS2Tdoah+rr9+2oPL0VlqA 28Zr4xUJYA603tTIyuU4H2oEXjbwfsZ65OS0MpVC8yTJ0IfWnVyPNNCOc0YNFeinPLRYruSQQaAcS4 V/pY9PuAtNXBkzMklvVDU0inT7nc6PDOmmlzRRI9ozZRysJwMmMroSaRwDHk/P4ySpYcONNankGt3B O4UDa3UNdeJ2SOvkPWMckVLjtaXSr1UWnlJ/0LM7PzMbXEtIV72WxZquEEF1YOmp+iV4COhbaxpPt5 64PEc/+nPuSi5HCGnAAA6aipoXBjgJrajsz1qOXxlZvbG9qO98hM8QpW/4OQ== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hans Verkuil Check for inactive controls in uvc_ctrl_is_accessible(). Use the new value for the master_id controls if present, otherwise use the existing value to determine if it is OK to set the control. Doing this here avoids attempting to set an inactive control, which will return an error from the USB device, which returns an invalid errorcode. This fixes: warn: v4l2-test-controls.cpp(483): s_ctrl returned EIO =C2=A0 warn: v4l2-test-controls.cpp(483): s_ctrl returned EIO test VIDIOC_G/S_CTRL: OK =C2=A0 warn: v4l2-test-controls.cpp(739): s_ext_ctrls returned EIO =C2=A0 warn: v4l2-test-controls.cpp(739): s_ext_ctrls returned EIO =C2=A0 warn: v4l2-test-controls.cpp(816): s_ext_ctrls returned EIO test VIDIOC_G/S/TRY_EXT_CTRLS: OK Tested with: v4l2-ctl -c auto_exposure=3D1 OK v4l2-ctl -c exposure_time_absolute=3D251 OK v4l2-ctl -c auto_exposure=3D3 OK v4l2-ctl -c exposure_time_absolute=3D251 VIDIOC_S_EXT_CTRLS: failed: Input/output error exposure_time_absolute: Input/output error ERROR v4l2-ctl -c auto_exposure=3D3,exposure_time_absolute=3D251,auto_exposure=3D1 v4l2-ctl -C auto_exposure,exposure_time_absolute =C2=A0 auto_exposure: 1 exposure_time_absolute: 251 Reviewed-by: Laurent Pinchart Reviewed-by: Ricardo Ribalda Signed-off-by: Hans Verkuil --- drivers/media/usb/uvc/uvc_ctrl.c | 42 ++++++++++++++++++++++++++++++++++++= +++- drivers/media/usb/uvc/uvc_v4l2.c | 3 +-- drivers/media/usb/uvc/uvcvideo.h | 3 ++- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index c95a2229f4fa..6165d6b8e855 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1085,11 +1085,28 @@ static int uvc_query_v4l2_class(struct uvc_video_ch= ain *chain, u32 req_id, return 0; } =20 +/* + * Check if control @v4l2_id can be accessed by the given control @ioctl + * (VIDIOC_G_EXT_CTRLS, VIDIOC_TRY_EXT_CTRLS or VIDIOC_S_EXT_CTRLS). + * + * For set operations on slave controls, check if the master's value is se= t to + * manual, either in the others controls set in the same ioctl call, or fr= om + * the master's current value. This catches VIDIOC_S_EXT_CTRLS calls that + * set both the master and slave control, such as for instance setting + * auto_exposure=3D1, exposure_time_absolute=3D251. + */ int uvc_ctrl_is_accessible(struct uvc_video_chain *chain, u32 v4l2_id, - bool read) + const struct v4l2_ext_controls *ctrls, + unsigned long ioctl) { + struct uvc_control_mapping *master_map =3D NULL; + struct uvc_control *master_ctrl =3D NULL; struct uvc_control_mapping *mapping; struct uvc_control *ctrl; + bool read =3D ioctl =3D=3D VIDIOC_G_EXT_CTRLS; + s32 val; + int ret; + int i; =20 if (__uvc_query_v4l2_class(chain, v4l2_id, 0) >=3D 0) return -EACCES; @@ -1104,6 +1121,29 @@ int uvc_ctrl_is_accessible(struct uvc_video_chain *c= hain, u32 v4l2_id, if (!(ctrl->info.flags & UVC_CTRL_FLAG_SET_CUR) && !read) return -EACCES; =20 + if (ioctl !=3D VIDIOC_S_EXT_CTRLS || !mapping->master_id) + return 0; + + /* + * Iterate backwards in cases where the master control is accessed + * multiple times in the same ioctl. We want the last value. + */ + for (i =3D ctrls->count - 1; i >=3D 0; i--) { + if (ctrls->controls[i].id =3D=3D mapping->master_id) + return ctrls->controls[i].value =3D=3D + mapping->master_manual ? 0 : -EACCES; + } + + __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 0; + + ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); + if (ret >=3D 0 && val !=3D mapping->master_manual) + return -EACCES; + return 0; } =20 diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index f4d4c33b6dfb..3edb54c086b2 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -1020,8 +1020,7 @@ static int uvc_ctrl_check_access(struct uvc_video_cha= in *chain, int ret =3D 0; =20 for (i =3D 0; i < ctrls->count; ++ctrl, ++i) { - ret =3D uvc_ctrl_is_accessible(chain, ctrl->id, - ioctl =3D=3D VIDIOC_G_EXT_CTRLS); + ret =3D uvc_ctrl_is_accessible(chain, ctrl->id, ctrls, ioctl); if (ret) break; } diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index df93db259312..a151f583cd15 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -761,7 +761,8 @@ static inline int uvc_ctrl_rollback(struct uvc_fh *hand= le) int uvc_ctrl_get(struct uvc_video_chain *chain, struct v4l2_ext_control *x= ctrl); int uvc_ctrl_set(struct uvc_fh *handle, struct v4l2_ext_control *xctrl); int uvc_ctrl_is_accessible(struct uvc_video_chain *chain, u32 v4l2_id, - bool read); + const struct v4l2_ext_controls *ctrls, + unsigned long ioctl); =20 int uvc_xu_ctrl_query(struct uvc_video_chain *chain, struct uvc_xu_control_query *xqry); --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 412E3C54EBC for ; Tue, 3 Jan 2023 14:37:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237909AbjACOhH (ORCPT ); Tue, 3 Jan 2023 09:37:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237290AbjACOgr (ORCPT ); Tue, 3 Jan 2023 09:36:47 -0500 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A430210B70 for ; Tue, 3 Jan 2023 06:36:46 -0800 (PST) Received: by mail-ed1-x52b.google.com with SMTP id i15so44100283edf.2 for ; Tue, 03 Jan 2023 06:36:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=rL6vjumDEZ8bp9EfDhAS6U23Sa8DpoR9rvInW/saadw=; b=G2By3BqJTaOu7tcF/DiJTm7we72oLpjph2rOGNoSu+JD8xr2DkYMcjrUUF9vdGMtea MlzYiKHewd3ACEitRrIqPdDGCY7yjVTgnQ9jjkI7pDAq3NsmTuWr1GoKLnKWWwY8BBtw 22kHIAil8+r17B8kM9KP4j4xw82PnctDUJ9pA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=rL6vjumDEZ8bp9EfDhAS6U23Sa8DpoR9rvInW/saadw=; b=GmhiB/DebM4XBTG6eKcs/d2BP1iln2hMl4KNsY00XqOknkjFcURwKzdwQATbZerf0C draL3Ahg00DHi4PF5/4EbdNJ0weU+wV7zEi36ShI7Tdiq4NyPTFVnQgnYDqOWjhDZb6M NGxZSR4nb6CBLQcDUb+BIGTX0061j8wtTbJgFrCIo9+MONeyVzYr7BkpsgGCXSt1RQ9y 3APyCLlXdp4dzUZQGR5R951u3OPG1wy6lw/mC9ve/YRwArGYFAlXvVis3ac9M7bjtmiz n12fbePtrNxhhvpyTc9FVmkKxElFM8Fq6mSlaR/RGUy7CnDMbXq0t55rrWYNRTn8Ibuu q2Ug== X-Gm-Message-State: AFqh2ko32TTEzqyvoY48VjHpmro9iT0SXXoVoU8eO3oGo0mye2JrEAam 8it7x0/3pStfUgzrjG9WeGG8ag== X-Google-Smtp-Source: AMrXdXvjqPPYzbopbrJmWLjzf+kJEn8sIFmgDwOGZIYyPJaThxKy8VZaNxUZ0dVmtzYuIZIoAuzcNA== X-Received: by 2002:a50:cc4c:0:b0:463:e2cd:a8b5 with SMTP id n12-20020a50cc4c000000b00463e2cda8b5mr39293162edi.11.1672756605285; Tue, 03 Jan 2023 06:36:45 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:44 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:20 +0100 Subject: [PATCH v3 2/8] media: uvcvideo: improve error logging in uvc_query_ctrl() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-2-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=1481; i=ribalda@chromium.org; h=from:subject:message-id; bh=xOoehc4vwLA0iipvzwLxfRoUl2KbfEEdDxl6zHy2Huk=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD1uUt2X//JNsQhBiFozEJj3L0qZd4uDB5oeAeJE GHvpzAaJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9bgAKCRDRN9E+zzrEiIvdD/ 9KuCrPeHfK/M/hRHQYcLzHTK8be+wwTwYRSKkanRDWf0KHAK5MM6zVmT5hriYH0w3YqxzeeHKaIIDd j1dQFL4sAMUqRD3GdBx24cAX/8qC+5vp3bS73dMCCbUcMFpS7/M6nBPomAgyCIH1aWr9wSctQJUSf4 9d8evKsYnfknwWBOECRm81z7mFaegh42WjAlWu2jMbNZIcBRUsjSNL0LANTmbhppLhA+ZH9FM07br8 Rc/pK4V0ep5yaH2noRepY/hy1HgGwD/Jtc4I9Frn4jdPlKhoIQSLcHidf++AEBt6jPkQlxyS+FQu3H UJeZVUhbUOReB/JNNyOjATS03KvlfmYvhSBM4FAOVH+70gnYpRXCMpgOu3SNFfH/xPAPAUG05Zo71I 21xh3S9K7J+f1fVvpwcL96kLpgP9V7F3axwK7gGvjHHVIuX45vA4mWkA4Hz8G4p+veRNDLoCZZd+k/ qS5dK7hzhc9djVwq2bGXNpJ4yZ/K9r06KM4p/h9l+S/sNuPlHDexcN3n0Q5ZrAMbHyl22gaNn0OHTP IYfCDOoaoTSmZqlYQyzpButmheKxlcvzHjBou4K5SSFyrq/yeHTMQ9TkZDde4lTLzJLKlGQ6KtS76O RRxFuWoNuaohxgmgUePIsytf8tpmXzESQauylOQA5ibkSt0XMxJrLxOyQ/eQ== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Hans Verkuil Standard use of the driver may result in error messages on the kernel ring buffer. This can hide other more important messages, and alert unnecessarily the user. Let's keep dev_err() for the important occasions. If __uvc_query_ctrl() failed with a non -EPIPE error, then report that with dev_err. If an error code is obtained, then report that with dev_dbg. Reviewed-by: Ricardo Ribalda Signed-off-by: Hans Verkuil Reviewed-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_video.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_= video.c index d2eb9066e4dc..6b20a23bc3cf 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -79,13 +79,14 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8= unit, if (likely(ret =3D=3D size)) return 0; =20 - dev_err(&dev->udev->dev, - "Failed to query (%s) UVC control %u on unit %u: %d (exp. %u).\n", - uvc_query_name(query), cs, unit, ret, size); - - if (ret !=3D -EPIPE) + if (ret !=3D -EPIPE) { + dev_err(&dev->udev->dev, + "Failed to query (%s) UVC control %u on unit %u: %d (exp. %u).\n", + uvc_query_name(query), cs, unit, ret, size); return ret; + } =20 + /* Reuse data[0] to request the error code. */ tmp =3D *(u8 *)data; =20 ret =3D __uvc_query_ctrl(dev, UVC_GET_CUR, 0, intfnum, --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0BCEBC3DA7D for ; Tue, 3 Jan 2023 14:37:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238020AbjACOh0 (ORCPT ); Tue, 3 Jan 2023 09:37:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48566 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237817AbjACOgs (ORCPT ); Tue, 3 Jan 2023 09:36:48 -0500 Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86B7E1146B for ; Tue, 3 Jan 2023 06:36:47 -0800 (PST) Received: by mail-ed1-x52d.google.com with SMTP id i9so44030934edj.4 for ; Tue, 03 Jan 2023 06:36:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qJf+h2f2R0607iPBKTi3aOdsbu1qoQNWuR3plbe+zVU=; b=DORFtksWSOAqwT83xzT791DCgSBLtY4QkVrt8RDWSezJ0Zzr3fxsYJjXA8m5j8JzSx D7fUA+MI4PnroF7PXK2faRne8PvsK8CqZxfi8AKDe6AqMe5FPpK6/8D3I7vMBSZYQpUJ EAT/1RabDaErRpWq/ydEfXK54MtXH/ianXzgc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qJf+h2f2R0607iPBKTi3aOdsbu1qoQNWuR3plbe+zVU=; b=aaBG+9U+MdUGalQdLiG+d5Qwkcd7meUrgY2Oju703XIerzt6MZcUn0L0Z4MqF5rTvj pnio8MhaScZpfe7Td2ps8VHDG/D3cK+GyaF/eScSgw4/3n5eEcE7bJXkNFk7rGREBXm5 NgRIVFJaGIlJ54h1mXy+4NX9l7VIf/dlqMJ5edFkKqdFSTbT+UAUZ8jSeO+Sor7I3kj1 5dI2ehYGA5hXbsKyN0G/nVVYNuUm5ZEGFArKdBQQk0k7EUNloe1TVOA8IyWrW/b2vOOD vVk0dWhU+zGklqixD9MWwoqa+l9DK7su/lIQ0UKka3QEfMn6b2j0mRig+Bjc4izrjnbI RGqQ== X-Gm-Message-State: AFqh2kpqQcyZPzh1mjOTMdcI/vlB2v1sZBNqdw42/KCuKEL+zGvyDUVu dA2dp5fJiKF8dQ0fbOyE7Jc/XA== X-Google-Smtp-Source: AMrXdXv/ERkpbmQUN1jOPgeP5z2kA5nwMnSadpWDuFkONa4pSNM4CEf4WAdUSkPlrEy5oOzet90Jhg== X-Received: by 2002:a05:6402:14d6:b0:479:6bf2:a9bb with SMTP id f22-20020a05640214d600b004796bf2a9bbmr35770781edx.15.1672756606094; Tue, 03 Jan 2023 06:36:46 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:45 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:21 +0100 Subject: [PATCH v3 3/8] media: uvcvideo: Return -EACCES for Wrong state error MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-3-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=1494; i=ribalda@chromium.org; h=from:subject:message-id; bh=sEdvpc4Bk0VAM3TYxG5czBefJfH6Gr4ihACOSTYlAUo=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD1vAXIWeI4gUm0GA0hIn8dST/3ChZRkz+xJCg47 FeLEYjGJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9bwAKCRDRN9E+zzrEiGS0D/ 4hVkfk3RSkYUUFd1IJWWUGPZbi+dKG41xyvSqchdNJcO2eHDgfpa5JXTQDnPIxg+OkW/wV7q4eE5kf xsGSHI7nSs5ZY7aYxgisLTea27DJrhAqCqRKDVX/oXucirOFyOHUwGNijn6YlIjW0v72rxWWfjB00b kJJr0dNLrFmnchDcTIH54rb+1qNTrzrqceCNMezZ0OjNak90RHchQtnizV8oi5OMNHlt274fjwMOhd 4lZwz33wVOFopez5y8qlUE5EukTYzd9vFeuBGWoK8No9P0Y27oKWB6VcmFIc2BAt+31SmA9HmlShwR 4w2QNOR80PzrQbBl4gNoFF6ddEYf6eBXuyQGYjf5TSRkCCRIJGVV+hf1a34/XAVszMUkKu5FZKKRjt eiD7g74cXIHyIvFHd9eOroN5l+WLdS/W5x7ETRUQWwE2hYyo9iyJ91Sj3v3eD/QRC033A8fZGn2qx8 cTDdI/754jIuYXP4Q+FQm0xuwFHUMptUzGB1qwJUFO5X/hHy7JPHJ5QkyXjo9w4Tr2/SYfnl3bXLwG d+T1IqsyQaU4ftJrWDG6I56sfhUGq/H+iUWvA62flRzfXTmdmDt6HiWg1t1jEy8VTXFF7mZ6JMduu9 DVHLBP7lDdEOJ1XcArye038zZkIAsPGZUmkeDdfFgPnl0LBWv3W1X6QWFoPw== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Error 2 is defined by UVC as: Wrong State: The device is in a state that disallows the specific request. The device will remain in this state until a specific action from the host or the user is completed. This is documented as happening when attempting to set the value of a manual control when the device is in auto mode. While V4L2 allows this, the closest error code defined by VIDIOC_S_CTRL is indeed EACCES: EACCES: Attempt to set a read-only control or to get a write-only control. Or if there is an attempt to set an inactive control and the driver is not capable of caching the new value until the control is active again. Replace EILSEQ with EACCES. Reviewed-by: Laurent Pinchart Suggested-by: Hans Verkuil Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_= video.c index 6b20a23bc3cf..e56ccde9bd10 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -108,7 +108,7 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8= unit, case 1: /* Not ready */ return -EBUSY; case 2: /* Wrong state */ - return -EILSEQ; + return -EACCES; case 3: /* Power */ return -EREMOTE; case 4: /* Out of range */ --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 918BCC3DA7D for ; Tue, 3 Jan 2023 14:37:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238030AbjACOhQ (ORCPT ); Tue, 3 Jan 2023 09:37:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48552 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237893AbjACOgt (ORCPT ); Tue, 3 Jan 2023 09:36:49 -0500 Received: from mail-ed1-x532.google.com (mail-ed1-x532.google.com [IPv6:2a00:1450:4864:20::532]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 678A8DF5D for ; Tue, 3 Jan 2023 06:36:48 -0800 (PST) Received: by mail-ed1-x532.google.com with SMTP id r26so38830053edc.5 for ; Tue, 03 Jan 2023 06:36:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=YQ39IOVw3moKdkeR5wnNzBJ9M+k6/kqT58GkeY6kRfU=; b=Oyi/FMO8dPSi+gTq/T0EBXugBrSrsBqfOatsjam/6Lnf16DuB5NfBxE9tnOMaqimBj UK9nffZucqy4W9JpIBLhExMPnyHUM4HSA1dljacVjjyupIHs8I5f3FrrGFlriD2yx8xD m4lWBBtDo0wEVsLe7sRjkl3ZJTHdtUJtvizSM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=YQ39IOVw3moKdkeR5wnNzBJ9M+k6/kqT58GkeY6kRfU=; b=NRKqWU4EHxekAHELs89KUrkJllGx7s9ozHYtI8T+stV0Xv0I7LKGr1MADCU7kASVsJ TcinQRAJcXAtY9W2KQqlBvyxiWSUlJD3kODlD9XFCaCODjVOF5POKOWlYf/TPPnfCZhL GrqzThVOYKwaeQ1RsUzUwti98WXpLaW/96A1DDoWaqz4bErXojxO30XrvoWK182A1AJY /gwUeBh4FPcjDUkN6L+oQ/nJmBx8NtojabIAJH0pY9bRZKcvHTlnz/8lJwmZDulVrxJy PeJpwllp6zWPRp0TqydTiPN4j0DF5hgcUqV40TkRLBVLKbMkpn6XT1Rgk/r7jvQO3kcc tqyQ== X-Gm-Message-State: AFqh2kqXQONZ9Iiet9fLXx9wtSzFsmvR7vvlfrWi1z/k6A0y744KSL1c qbduniB8/Xe2j7QzCdy5oWnkLQ== X-Google-Smtp-Source: AMrXdXt45vQ+iH17GwUFClbUO+rypyCu/MAyaZEfS0HHHkGJYvdbtLLIox3WmqmXbXnSk/9vP8f2rA== X-Received: by 2002:a05:6402:33a:b0:47d:c06a:c272 with SMTP id q26-20020a056402033a00b0047dc06ac272mr38542370edw.31.1672756606939; Tue, 03 Jan 2023 06:36:46 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:46 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:22 +0100 Subject: [PATCH v3 4/8] media: uvcvideo: Do not return positive errors in uvc_query_ctrl() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-4-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=1141; i=ribalda@chromium.org; h=from:subject:message-id; bh=yxgPmvZyTx1x+TY7IUGRFua/vffmv7MJCLBQE3ospZY=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD1xyCcB64eeoZqfpJYhCy/YtzURE6aTnDr3+j5L ZOBCoAyJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9cQAKCRDRN9E+zzrEiMZYD/ 4iuQJXS6BIc4hiZmDS/bNt4SrzIKdPC+Ml0Yr1VjziVZLUtx1b65snPKAYiN0mZcEY7qrRg5vDodY1 E07qSoGd4uTuhgvp+QFOaF0pFqoxQ/uU0+tXy8lVgQOBIZ2Q5/WA/curty4FlrF246K3SSecfhMIiK /n1YWm20+llcbRYIxfEj3oNpsMTHoWkQEDdV6VHGND2otUVSD3oEedRxh6hMgxsO762KyTrdDmc9i6 5Fj0EWWQamFHcXEFKhsPk+G35DxqK79jnFeHw6NML799lUwtIrZrVcKpfwEATKjIVoPwPRxfl1UuWz GiTuaKiQqVGeTzwLG2r+0lMXFNI7HJxoM49E1Y00RU4pBJgZltDgbONttoOkhuts645otbwynyAamu WmqN9JsF8HwEemFYPj9DSrp84ZSUcS1rpO6pCJ6GqudgGCSTyturEoeEcuLllKgYuZgDfSuhy1O8EF safrqQpR3PFAM5rZezwLl/cIWzF3cNRX3mSxOJQqUXtSGFk68m9YpM2ga05TYB4wp8Wf4wN6p4/x6m gfwqIYCQNdfmNGVzS/6C+wkeIfP7Wx+Bjy/w/dgTUOtoXBt+MBl4GXSyQavBs8+q+vnX1v9qoWFgzA s3jKK1OQzjodeq9RHTRmYZ14ggY3FHzgAEG6V1pj57ANN1DoMhRK8yiCri+Q== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If the returned size of the query does not match the expected size or it is zero, return -EPIPE instead of 0 or a positive value. This will avoid confusing the caller (and ultimately userspace) that doesn't expect a positive or zero value. Reviewed-by: Laurent Pinchart Suggested-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda --- drivers/media/usb/uvc/uvc_video.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_= video.c index e56ccde9bd10..feba058fcb06 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -83,7 +83,7 @@ int uvc_query_ctrl(struct uvc_device *dev, u8 query, u8 u= nit, dev_err(&dev->udev->dev, "Failed to query (%s) UVC control %u on unit %u: %d (exp. %u).\n", uvc_query_name(query), cs, unit, ret, size); - return ret; + return ret < 0 ? ret : -EPIPE; } =20 /* Reuse data[0] to request the error code. */ --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8AF60C3DA7D for ; Tue, 3 Jan 2023 14:37:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238033AbjACOhb (ORCPT ); Tue, 3 Jan 2023 09:37:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237918AbjACOgu (ORCPT ); Tue, 3 Jan 2023 09:36:50 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2B16F11829 for ; Tue, 3 Jan 2023 06:36:49 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id r26so38830120edc.5 for ; Tue, 03 Jan 2023 06:36:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=zE/D4J+qsdGyCRspywDzgfmKn2UepOqc9aDMzc7tN+0=; b=mqOPefvzjudmmghdvjicswADD648taX3TwblKDUjsogqygEgIlBO1pB8qwzrSTKC8k 5MIoQvUrlscfl1H3YSU4HLhcxXN+Jjuejy5uaYJcBvetyGoc9qC247W44l/+9A2//1sC 5f3EOUXM1g6DSQaX7sQPGdBnTorjPN1viVoIg= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zE/D4J+qsdGyCRspywDzgfmKn2UepOqc9aDMzc7tN+0=; b=uwu+OcFlURhl8qz9I1Ggd9PdUzIJ2GtFcWe0+SvBKsHvqIBajaQgwx6CRyFMySjxJI k2wHzyPp3GIdBtCLNMGR1ddmIVw3WQ42PfWAuU3douPfDWZIHqXvUwnZHgKTvy/HUrE1 vPqiOVgdV2BhhjD309fIzs1/o7HbFHcnC4byKDVZDnFWHETZreg2F422vbXJeD/4yHnJ /wvr1UWSMMlwCk7vSG8Q02y/JqteHkXTF0q36p2e3McfmQ4BsSqhJf1sTeVs4tfYSPn2 asuA1robRqBRGdcQq1QvcIjhzcMGqiCSDXrPTh8YxjfTZGOhTn227zx70Tano1tzxe/1 mA4Q== X-Gm-Message-State: AFqh2krzPSSM7JHzNTP5hqfNAvJ43nAANbpuP75NAO9pm4G/xtqp3FeJ s9RO3OY9ywnIRc1I2Qlc+cOkCA== X-Google-Smtp-Source: AMrXdXvrG/icB/AxrF+Mtk79mTLUwLtAUf2Jo46vsAJbtKZTNHYOLM2kdgnVdJ7fZtWDh84Nrhq6+A== X-Received: by 2002:a05:6402:3ce:b0:481:f14d:fda5 with SMTP id t14-20020a05640203ce00b00481f14dfda5mr34418013edw.39.1672756607742; Tue, 03 Jan 2023 06:36:47 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:47 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:23 +0100 Subject: [PATCH v3 5/8] media: uvcvideo: Fix handling on Bitmask controls MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-5-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=4018; i=ribalda@chromium.org; h=from:subject:message-id; bh=/UXa7D+904aszgGVJg9MhDXEF8Qvo7g/0S8PptJkuaw=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD1zcL22Ph3au1U3gzHL8SWYDK7mYXfBWKoblEKt vdwEXkyJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9cwAKCRDRN9E+zzrEiLVJD/ 4gkhLghiJBjonvw6CJAfVqI0aasnm/3bx9A5syTAog7bKFD70PgcslI9eWgs30Hg4IXhGjZCqcNFV3 oO96EhhRbfAjeeBFWUzC5ClsT3Ms12e+4JfyrUbEjirRcr691puM9WrJ+27r1w8PRvkJg9q3Ce3fQY m5PDEbsaUvpjB94DFxv63b3mvOD49o/ljPEoEf5p2Oqe8R5rvUvyuSC7y6ZfE051bw1xFqNgD33x9t iMNnjPtv3MJHehd2juFvyVBo+WD59yoTlf83AP8JFV+NAVuwBuWp7uKeEuLJ0DhZtHw5BoWsAU2WpK q/oQbm9pJq5WDZWLMlmNRTD3SeDssmXUpmd7azj13hVvgXrCChNMgKK9POBJY0+O0p/NKvlJLV1grP Nm6JTBmVwi9IzHoZKAGpH84vZDkEseUFIF10WtzoC+GQf4XmfYH2o0D4cdMht87ifWaeolSWRvHfT5 pQdSDuCXOdWhsWlsrrZ4OFr9YOg7m5jND6XtSPkbRmPtap96tXz7TSpXUJ9RxixdPEY9z8e1NeLT3+ fnmNt3Sgo5LyXV8p+FGHqaQ4kLaGAVx0U7WgL7eee6WqOoKuGE6zCP+mU4mMCL564DEflVeRrUd42q xX0YDY0sVrMasnfxsioE78cPvkyZfiJXgsQ4cC6XiNnE0aNGcg/gksf0aIYQ== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Minimum and step values for V4L2_CTRL_TYPE_BITMASK controls should be 0. There is no need to query the camera firmware about this and maybe get invalid results. Also value should be masked to the max value advertised by the hardware. Finally, handle UVC 1.5 mask controls that use MAX instead of RES to describe the valid bits. Fixes v4l2-compliane: Control ioctls (Input 0): fail: v4l2-test-controls.cpp(97): minimum must be 0 for a b= itmask control test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: FAIL Signed-off-by: Ricardo Ribalda Reviewed-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 52 ++++++++++++++++++++++++++++++------= ---- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 6165d6b8e855..7622c5b54b35 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1161,6 +1161,25 @@ static const char *uvc_map_get_name(const struct uvc= _control_mapping *map) return "Unknown Control"; } =20 +static u32 uvc_get_ctrl_bitmap(struct uvc_control *ctrl, + struct uvc_control_mapping *mapping) +{ + /* + * Some controls, like CT_AE_MODE_CONTROL, use GET_RES to represent + * the number of bits supported. Those controls do not list GET_MAX + * as supported. + */ + if (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES) + return mapping->get(mapping, UVC_GET_RES, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); + + if (ctrl->info.flags & UVC_CTRL_FLAG_GET_MAX) + return mapping->get(mapping, UVC_GET_MAX, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_MAX)); + + return ~0; +} + static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, @@ -1235,6 +1254,12 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_ch= ain *chain, v4l2_ctrl->step =3D 0; return 0; =20 + case V4L2_CTRL_TYPE_BITMASK: + v4l2_ctrl->minimum =3D 0; + v4l2_ctrl->maximum =3D uvc_get_ctrl_bitmap(ctrl, mapping); + v4l2_ctrl->step =3D 0; + return 0; + default: break; } @@ -1336,19 +1361,14 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *cha= in, =20 menu_info =3D &mapping->menu_info[query_menu->index]; =20 - if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK && - (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) { - s32 bitmap; - + if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK) { if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) goto done; } =20 - bitmap =3D mapping->get(mapping, UVC_GET_RES, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); - if (!(bitmap & menu_info->value)) { + if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & menu_info->value)) { ret =3D -EINVAL; goto done; } @@ -1831,6 +1851,17 @@ int uvc_ctrl_set(struct uvc_fh *handle, value =3D xctrl->value; break; =20 + case V4L2_CTRL_TYPE_BITMASK: + if (!ctrl->cached) { + ret =3D uvc_ctrl_populate_cache(chain, ctrl); + if (ret < 0) + return ret; + } + + xctrl->value &=3D uvc_get_ctrl_bitmap(ctrl, mapping); + value =3D xctrl->value; + break; + case V4L2_CTRL_TYPE_BOOLEAN: xctrl->value =3D clamp(xctrl->value, 0, 1); value =3D xctrl->value; @@ -1845,17 +1876,14 @@ int uvc_ctrl_set(struct uvc_fh *handle, * Valid menu indices are reported by the GET_RES request for * UVC controls that support it. */ - if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK && - (ctrl->info.flags & UVC_CTRL_FLAG_GET_RES)) { + if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK) { if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) return ret; } =20 - step =3D mapping->get(mapping, UVC_GET_RES, - uvc_ctrl_data(ctrl, UVC_CTRL_DATA_RES)); - if (!(step & value)) + if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & value)) return -EINVAL; } =20 --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A9038C3DA7D for ; Tue, 3 Jan 2023 14:37:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238017AbjACOhk (ORCPT ); Tue, 3 Jan 2023 09:37:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237917AbjACOgu (ORCPT ); Tue, 3 Jan 2023 09:36:50 -0500 Received: from mail-ed1-x52b.google.com (mail-ed1-x52b.google.com [IPv6:2a00:1450:4864:20::52b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E624411819 for ; Tue, 3 Jan 2023 06:36:48 -0800 (PST) Received: by mail-ed1-x52b.google.com with SMTP id i15so44100509edf.2 for ; Tue, 03 Jan 2023 06:36:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uMv0+FOAOO/esYuQ37yIKwt94y4B+tlVWaU4vykTkck=; b=axciJGXp+L8SXhJfkIq9Twg+BjWIAaVmjUFo2VgPpnEDwjUXfLMGXS+Mm7t0ShH3BO h4UPoPC/6hc16VgOnFLif51jIwHd336iVnaOD34CDwuWOAwkQqGaSL/03/n4Vs4FpVmt 3yoyEl5AnMmKov4OR1JYDVFdC6NsNS60KwEqQ= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uMv0+FOAOO/esYuQ37yIKwt94y4B+tlVWaU4vykTkck=; b=MOkvcOFPf9SEMhJa8vdUcWrZUPyC3cJE3GS5SnvBzPywXN63Vnza5r5KnNArRGTReT 6zPGfusJn7nyZnlrS4+dKUrlNUUAPlXurDNu5Eo7lyf2E812F/Ltv5Gm9ujecIcvE4xM NYdBd1uckmOCruyD8xwgvSY355wbT6fP7oU7vPJGCNbGrjzBiTcQx1SNdTcPk0TCXWgL lfDXMn1igtKSs1ztiLba6HYjUVr0B2ozzlKpI611xmLRFntFTE+CJtojfUPXDfXTl9HP 9s6bkZ4vdBUWB9xPDMHU6j9y0K2EGpFPtIbB6QvWOFWqmpMWx0jkQRgGELjbB0Ut6W6U ixhQ== X-Gm-Message-State: AFqh2kri+Dt7ryGqQxVbITLfNY9b8Cvb2nn+DHWKdysYHIyHqr26vUHy BS9FarIxNHX/XkSw32zJp3FdJw== X-Google-Smtp-Source: AMrXdXtb0KbBmffKCMQE10rF9mg7ZpQ9x6DkWuo9IcT6QWXkYzDnWbNV6Y5bNLVqhUd+d/048F/V8w== X-Received: by 2002:a05:6402:7d4:b0:467:f630:7927 with SMTP id u20-20020a05640207d400b00467f6307927mr39620050edy.15.1672756608540; Tue, 03 Jan 2023 06:36:48 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:48 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:24 +0100 Subject: [PATCH v3 6/8] media: uvcvideo: Implement mask for V4L2_CTRL_TYPE_MENU MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-6-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=6230; i=ribalda@chromium.org; h=from:subject:message-id; bh=CzvIh2I8OYn6qQYfnpDNhfSCuom8YJfz/8UwnMOFDWQ=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD111zYzZRZMddOczAz+5+Us8BZbk9PPe9y/ph22 e+LQ58KJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9dQAKCRDRN9E+zzrEiC77D/ 4+HY54d/4XeFnOJgGXJeNlSST+xxOaDQD+xupk1M0qW7jpH9VScQpPdGRwB15LzKmpAg+JsbsAB8f5 Iu/6OaST5qg6G/sKDs9HgPsh7/qdHgAsYC6zLH2U8ockN+jUEf71l2ZDptX5AejO/FIUpD4CaSvVAk FYqt5XcGI9zh9CiDniEL6++RYTd11uwRo92D0DJBFhaLnU4PhIAV9/+9Tffxm1Sfyakyx8zo0jQfpF Z4AvY97/8jdySxykYoDPa9Cgi4zX6zL8UpL1eNfWek8Ba7R1H4zN+FPTHKiCr/sLo0v8zT9dP/b8P+ G4P+a76atGzNDHt1EQRdabLLFPmVQgKubltY/z/KfBsB/95Itqs+45IKU9XdlJSj8u/NHjGAvcjY1x UnDpA5rTjMVhYhB3/QzASWAmU128FQeQ3QnO2dcOc3rjfemLhoBfN0DRQLzlkfLQyfHHf13DrdqzoC QZv2h6cdlnjFFuO9rBjyGVlOEc3zijXZ+SrRYmo+PSINCMDwTAGKpoa/i5FofUirP7WKAtn8n9Z9ft qX7yliMQhi1ybSaa9iq8pSD3B4qRz08G4lB2z3WUpAacMer/sNrlFL6CitGWpypZTPpVNHSjanPFuQ BFF+XcMN1NVipnG+et7krJ7AE/hBqZuzXcHO1+CXBn6BVPBD1TDhCE9R+UVA== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Replace the count with a mask field that lets us choose not only the max value, but also the minimum value and what values are valid in between. Reviewed-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda Suggested-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 30 ++++++++++++++++++++---------- drivers/media/usb/uvc/uvc_driver.c | 3 ++- drivers/media/usb/uvc/uvc_v4l2.c | 3 ++- drivers/media/usb/uvc/uvcvideo.h | 2 +- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 7622c5b54b35..aa7a668f60a7 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -6,6 +6,7 @@ * Laurent Pinchart (laurent.pinchart@ideasonboard.com) */ =20 +#include #include #include #include @@ -525,7 +526,7 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_BITMASK, .menu_info =3D exposure_auto_controls, - .menu_count =3D ARRAY_SIZE(exposure_auto_controls), + .menu_mask =3D BIT_MASK(ARRAY_SIZE(exposure_auto_controls)), .slave_ids =3D { V4L2_CID_EXPOSURE_ABSOLUTE, }, }, { @@ -731,7 +732,7 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc11[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, .menu_info =3D power_line_frequency_controls, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls) - 1, + .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls) - 1), }, }; =20 @@ -745,7 +746,7 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc15[] =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, .menu_info =3D power_line_frequency_controls, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls), + .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls)), }, }; =20 @@ -975,7 +976,9 @@ static s32 __uvc_ctrl_get_value(struct uvc_control_mapp= ing *mapping, const struct uvc_menu_info *menu =3D mapping->menu_info; unsigned int i; =20 - for (i =3D 0; i < mapping->menu_count; ++i, ++menu) { + for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + if (!test_bit(i, &mapping->menu_mask)) + continue; if (menu->value =3D=3D value) { value =3D i; break; @@ -1228,12 +1231,14 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, =20 switch (mapping->v4l2_type) { case V4L2_CTRL_TYPE_MENU: - v4l2_ctrl->minimum =3D 0; - v4l2_ctrl->maximum =3D mapping->menu_count - 1; + v4l2_ctrl->minimum =3D ffs(mapping->menu_mask) - 1; + v4l2_ctrl->maximum =3D fls(mapping->menu_mask) - 1; v4l2_ctrl->step =3D 1; =20 menu =3D mapping->menu_info; - for (i =3D 0; i < mapping->menu_count; ++i, ++menu) { + for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + if (!test_bit(i, &mapping->menu_mask)) + continue; if (menu->value =3D=3D v4l2_ctrl->default_value) { v4l2_ctrl->default_value =3D i; break; @@ -1354,7 +1359,7 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *chain, goto done; } =20 - if (query_menu->index >=3D mapping->menu_count) { + if (!test_bit(query_menu->index, &mapping->menu_mask)) { ret =3D -EINVAL; goto done; } @@ -1868,8 +1873,13 @@ int uvc_ctrl_set(struct uvc_fh *handle, break; =20 case V4L2_CTRL_TYPE_MENU: - if (xctrl->value < 0 || xctrl->value >=3D mapping->menu_count) + if (xctrl->value < (ffs(mapping->menu_mask) - 1) || + xctrl->value > (fls(mapping->menu_mask) - 1)) return -ERANGE; + + if (!test_bit(xctrl->value, &mapping->menu_mask)) + return -EINVAL; + value =3D mapping->menu_info[xctrl->value].value; =20 /* @@ -2305,7 +2315,7 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_ch= ain *chain, =20 INIT_LIST_HEAD(&map->ev_subs); =20 - size =3D sizeof(*mapping->menu_info) * mapping->menu_count; + size =3D sizeof(*mapping->menu_info) * fls(mapping->menu_mask); map->menu_info =3D kmemdup(mapping->menu_info, size, GFP_KERNEL); if (map->menu_info =3D=3D NULL) { kfree(map->name); diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index e4bcb5011360..f9e6208c4636 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -7,6 +7,7 @@ */ =20 #include +#include #include #include #include @@ -2384,7 +2385,7 @@ static const struct uvc_control_mapping uvc_ctrl_powe= r_line_mapping_limited =3D { .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, .menu_info =3D power_line_frequency_controls_limited, - .menu_count =3D ARRAY_SIZE(power_line_frequency_controls_limited), + .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls_limited)= ), }; =20 static const struct uvc_device_info uvc_ctrl_power_line_limited =3D { diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index 3edb54c086b2..ed2525e7e2a5 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -6,6 +6,7 @@ * Laurent Pinchart (laurent.pinchart@ideasonboard.com) */ =20 +#include #include #include #include @@ -80,7 +81,7 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *cha= in, goto free_map; } =20 - map->menu_count =3D xmap->menu_count; + map->menu_mask =3D BIT_MASK(xmap->menu_count); break; =20 default: diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index a151f583cd15..f75e5864bbf7 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -117,7 +117,7 @@ struct uvc_control_mapping { u32 data_type; =20 const struct uvc_menu_info *menu_info; - u32 menu_count; + unsigned long menu_mask; =20 u32 master_id; s32 master_manual; --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E729BC3DA7D for ; Tue, 3 Jan 2023 14:38:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237943AbjACOiA (ORCPT ); Tue, 3 Jan 2023 09:38:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48622 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237942AbjACOgv (ORCPT ); Tue, 3 Jan 2023 09:36:51 -0500 Received: from mail-ed1-x529.google.com (mail-ed1-x529.google.com [IPv6:2a00:1450:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D4C8DFD30 for ; Tue, 3 Jan 2023 06:36:50 -0800 (PST) Received: by mail-ed1-x529.google.com with SMTP id s5so44028468edc.12 for ; Tue, 03 Jan 2023 06:36:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=dAHTPeQigGkzAZXe4x+9ro8RmOt+dmg94cg1cPhP7q8=; b=lCMlC2H7baya2EyugYe/2t2UaN7sn8tQn32AmADW0/1KCdyNmlv2+0Mekp8k41K5yT mvy3hOn4QpdSu3vaAm3MdG3b5/kXSaK26E9zfMW3A8qAxNesfF7NEvvHmxAnkEyxh68t 9zdzZGfngI+UcZNpOb8nUyddtcMJjx9OCEFE8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dAHTPeQigGkzAZXe4x+9ro8RmOt+dmg94cg1cPhP7q8=; b=HytRPvk/OqYMepHMPOBkioHYKJVs5qlGIEvmBS4uaK9ECRFuCQypJeTTcjXdFzQ/F7 aD8xL3BeimaKZPlitO8ZAYtBtT1Et8Hcyvvut2X/njwlUD9exgzD5QPs9slZTLZJyL1S pdWLLPjlymlOi4TW9gjn+8MeJJ+FRVNrSResrh4g01r8eENTxv7y/006Ewr865LcDDr/ F1EmYc3FWKDgPYfwoKw4zA30JjmC3ALsQ/wOfkR/gElRk9iHcGXacadPbB0/d4252/JE Y/tGp88KKCX9DziVB0kB87Xi9dSPWtXOsKRJ3cV9dWGtCd1q4hL3jAtzdohYRU6GC/eq qpPg== X-Gm-Message-State: AFqh2kpZZ+qSWh/PA3pRqvkLB0mUSQeXYTDMYVx1gHBq5MxQAleCTRch soaTCKP2f55br7oREWE2aUfvMg== X-Google-Smtp-Source: AMrXdXtIN8CqG89gterCPYxDiV7mGaPjoYpdJlVvRTWUMCDZhukW4fxIL9Xmzr4HfCa781HO9n+IZQ== X-Received: by 2002:a05:6402:f04:b0:46d:ca42:2e59 with SMTP id i4-20020a0564020f0400b0046dca422e59mr42519239eda.11.1672756609473; Tue, 03 Jan 2023 06:36:49 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:49 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:25 +0100 Subject: [PATCH v3 7/8] media: uvcvideo: Refactor __uvc_ctrl_add_mapping MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-7-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=2015; i=ribalda@chromium.org; h=from:subject:message-id; bh=9TceltHofxTy9VGQ6b063wegxNqLkTD5czVh+mkaViU=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD12Pm+Pt4NYHp6kgsePzovAUC+g8qNSkc2d44eM mgFKrx2JAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9dgAKCRDRN9E+zzrEiNEpEA CLEufUPLQ3HTohZFgOdTqMvgKnnLNzS546HhLprD+bwAmbmQyuwqcepai9q5vjvPtbN9fCCjm01jPN v+iPwpjQvze6uxrrxJFhXjiyJdouV1Pc9vqF1djm082BwEVPpIzF4ICWKHj7xApvPYjRV+6L4mrDGk bcXcKxfyXSmBcWtKdv7g9OoMxRV9/AvwjpUMvMhKu7cIMo1f9pJXkk4CaaJr626OEEvfI42KktXyrs 7ep14IospObdVV09J1ASUr8i3OGswy3mnNypVG5QiejKZyqmR0aEZJo6sIkIr8GYHMW8GzW6IRQDiI VAz6Ewg611KDHSOMz2Sx+WLRHZCg8ZFB/XMumsExn1vH2bJ5T/UZ+HZDeBfZn/bsG72kUCIA94YO0O 3TwQE2vwjtMiircrGpMAzJbgagjKJZKmsGHl90IBbSY35Kbwe5uvgbr5oU4ipu59Cg6mzTbwcbqI0J FFLIITuGx/vAUwY7g5aNxUDZFAJBhrrSKGU6/PkdsXqwZRju6OSXGbkAM/hCrkIQ9ciDcbMT4rH4GS v7HtSDIlvsSwGPvjR2LV0ECLiIONo6Qu4VgmaGepFBIueklxEiE8JMsvtOjvKEPZdz3KYpfQf035eV P4eQX9l0pg5V5O8hAyJ1QaTNz3u5sJlj0JJnaLpuUUVcHkgTtIrU5//wkGuA== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simplify the exit code with a common error tag freeing all the memory. Suggested-by: Laurent Pinchart Signed-off-by: Ricardo Ribalda Reviewed-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index aa7a668f60a7..4830120e6506 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -2296,32 +2296,30 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_= chain *chain, unsigned int i; =20 /* - * Most mappings come from static kernel data and need to be duplicated. + * Most mappings come from static kernel data, and need to be duplicated. * Mappings that come from userspace will be unnecessarily duplicated, * this could be optimized. */ map =3D kmemdup(mapping, sizeof(*mapping), GFP_KERNEL); - if (map =3D=3D NULL) + if (!map) return -ENOMEM; =20 + map->name =3D NULL; + map->menu_info =3D NULL; + /* For UVCIOC_CTRL_MAP custom control */ if (mapping->name) { map->name =3D kstrdup(mapping->name, GFP_KERNEL); - if (!map->name) { - kfree(map); - return -ENOMEM; - } + if (!map->name) + goto nomem; } =20 INIT_LIST_HEAD(&map->ev_subs); =20 size =3D sizeof(*mapping->menu_info) * fls(mapping->menu_mask); map->menu_info =3D kmemdup(mapping->menu_info, size, GFP_KERNEL); - if (map->menu_info =3D=3D NULL) { - kfree(map->name); - kfree(map); - return -ENOMEM; - } + if (!map->menu_info) + goto nomem; =20 if (map->get =3D=3D NULL) map->get =3D uvc_get_le_value; @@ -2342,6 +2340,12 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_c= hain *chain, ctrl->info.selector); =20 return 0; + +nomem: + kfree(map->menu_info); + kfree(map->name); + kfree(map); + return -ENOMEM; } =20 int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae From nobody Sun May 19 17:57:59 2024 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 981EBC3DA7D for ; Tue, 3 Jan 2023 14:37:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237972AbjACOhw (ORCPT ); Tue, 3 Jan 2023 09:37:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48628 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237945AbjACOgw (ORCPT ); Tue, 3 Jan 2023 09:36:52 -0500 Received: from mail-ed1-x534.google.com (mail-ed1-x534.google.com [IPv6:2a00:1450:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B1BE0DF5D for ; Tue, 3 Jan 2023 06:36:50 -0800 (PST) Received: by mail-ed1-x534.google.com with SMTP id j16so11494825edw.11 for ; Tue, 03 Jan 2023 06:36:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=sPT1vsmDpYTaSok4BQktrcsW23gdSBjX1RKoXWH8/0M=; b=oJ9gTHBtVg7979odsYIZ0VWvQFcLgw8XR2HtRPCW+O5N/t9iQ2u8N4WJMtcGbRhDRz D/VIC6mqntGUrqiVnj+hEDz+Q/T0/QSg7O0atE8iFl50U7TZ0RyR1Obx90P8Z8gaaN2i qOzmDUlzq+eJ+q1cLo4iyeovLPSG7i7jYYn3c= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=sPT1vsmDpYTaSok4BQktrcsW23gdSBjX1RKoXWH8/0M=; b=mAShYxBlOCKcomPYDQoueGf7J/A6FOFy8DkB6lWvEifv66FLT+3H6tWDkETRqvWKFg 1fnkwAIpf4WNSqhnsQwh258/IGTGGIv1KkpN/5cgRXe6X7Tw/rcd7jEM6+FIxaNVHUwV Sf9SBSfopEF80ww2AxONcVMi59w+F7pKNawpQeRiONyYnuDfD2fu7zHjwyrzwvPmEsP/ U5F33lAijTuxBRKMgsEqN5BAcIOH1ifkVweu4LdEyOjsFCeDZ5rUk43Hgfi3lL1U38JB k7JebVnPc+KmoAjNm87c9iQkq0HYRWz5nnJrhWSBuS6C3PBJCPNV+/JuvKhIVmd6a/ov EQbg== X-Gm-Message-State: AFqh2kpYbXnm2hejT9hfxnhyRFdq1oOsvulRwrbRqzF/nHIvX1fq2zC4 PAKt3yWvNW41e4XHbiNrclyy6g== X-Google-Smtp-Source: AMrXdXtTdwXyMgkFUJhvTUdoDkY0MJ12WcTC2Y+YFZb/CLUVel3X5u5Mscd307lZz9/tCb4DL5wK+w== X-Received: by 2002:aa7:c948:0:b0:48e:9afd:de66 with SMTP id h8-20020aa7c948000000b0048e9afdde66mr4372196edt.34.1672756610272; Tue, 03 Jan 2023 06:36:50 -0800 (PST) Received: from alco.roam.corp.google.com ([2620:0:1059:10:9789:8e2b:74ac:a9a0]) by smtp.gmail.com with ESMTPSA id p14-20020a05640243ce00b0048ebf8a5736sm877245edc.21.2023.01.03.06.36.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 06:36:49 -0800 (PST) From: Ricardo Ribalda Date: Tue, 03 Jan 2023 15:36:26 +0100 Subject: [PATCH v3 8/8] media: uvcvideo: Use standard names for menus MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20220920-resend-v4l2-compliance-v3-8-598d33a15815@chromium.org> References: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> In-Reply-To: <20220920-resend-v4l2-compliance-v3-0-598d33a15815@chromium.org> To: Mauro Carvalho Chehab , Laurent Pinchart Cc: Hans Verkuil , linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda , Hans Verkuil , Hans Verkuil X-Mailer: b4 0.11.0-dev-696ae X-Developer-Signature: v=1; a=openpgp-sha256; l=14698; i=ribalda@chromium.org; h=from:subject:message-id; bh=wh1JJVQQr5H40YobLYSjous0EuZS24y5dLYMjTH4kYE=; b=owEBbQKS/ZANAwAKAdE30T7POsSIAcsmYgBjtD13VmFJBfH2E8Y0XPa0RY4TURQZGrC9Xur4qsHX MXxh+7eJAjMEAAEKAB0WIQREDzjr+/4oCDLSsx7RN9E+zzrEiAUCY7Q9dwAKCRDRN9E+zzrEiIhFD/ 9V8/clBABXViIniLLFOp2sb5J7sIa52e/cjVR60QI4kuF7/5/OrT8CiX75dbIgPN3oWU3q3eE6zoQC Ayn+8cFXIv8S6p5AMbwEdXMC0BZFYVak8Oh2gdrsQwQNXPPGdgOnevuDv2iBvGAHZOQHQhMEWkEWrc X9G0gHyPFx1mUmvD1pHbp3tmKWvSD1YH5hsG8qH3lISSdgVV6gdh2GiHWVmMogeOhw2U0X4J5+5tDB yEngpZnYw6jfEU1P3AMsA6CqiW4/TgWPcwdbxSfP6aR/0iqQJ+XLasuHAVllBnyMieSJMBUt81w0lD 3qBodKJKM/J0+16T5Jyp8+52quv221TD7aNYdRUqMMbf/yKUOfBVN7Vlw3BWxGbguKJ+loazRpYl4+ JIJv4uC08wAOjtq+w9ImbZ0ZUoTQuk61XzBf7IAHD5NAhXcxvV73bZeq55gccXwADNxNhnEWIlbLUV 8/dLJAc1XJNFtEgBiF3rn9Q5LhoQmQ2JOa6YijZ3S/r3aurUbUXVHRorcwltp5xTpbZEaQK2XBredm 5RLsCUdyV9E5h+8/2SqcJK8YjuQ7UoErCuxNC38YDmFLbPSp8QpYRSkQ2z6vvTDVbVKNvU6SLYN5ue 8UV/AicCbK5FECv+pNVRQ9HgH3p4kk+9e9XCDvLjHcX+ROQ7l6zkxI4Nv7pw== X-Developer-Key: i=ribalda@chromium.org; a=openpgp; fpr=9EC3BB66E2FC129A6F90B39556A0D81F9F782DA9 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Instead of duplicating the menu info, use the one from the core. Also, do not use extra memory for 1:1 mappings. Signed-off-by: Ricardo Ribalda Suggested-by: Laurent Pinchart --- drivers/media/usb/uvc/uvc_ctrl.c | 126 +++++++++++++++++++++++++--------= ---- drivers/media/usb/uvc/uvc_driver.c | 9 +-- drivers/media/usb/uvc/uvc_v4l2.c | 104 ++++++++++++++++++++++-------- drivers/media/usb/uvc/uvcvideo.h | 3 +- include/uapi/linux/uvcvideo.h | 4 +- 5 files changed, 170 insertions(+), 76 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4830120e6506..86d74c9740b0 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -364,19 +364,31 @@ static const u32 uvc_control_classes[] =3D { V4L2_CID_USER_CLASS, }; =20 -static const struct uvc_menu_info power_line_frequency_controls[] =3D { - { 0, "Disabled" }, - { 1, "50 Hz" }, - { 2, "60 Hz" }, - { 3, "Auto" }, -}; +static const int exposure_auto_mapping[] =3D { 2, 1, 4, 8 }; =20 -static const struct uvc_menu_info exposure_auto_controls[] =3D { - { 2, "Auto Mode" }, - { 1, "Manual Mode" }, - { 4, "Shutter Priority Mode" }, - { 8, "Aperture Priority Mode" }, -}; +static int uvc_mapping_get_menu_value(const struct uvc_control_mapping *ma= pping, + u32 idx) +{ + if (!test_bit(idx, &mapping->menu_mask)) + return -EINVAL; + + if (mapping->menu_mapping) + return mapping->menu_mapping[idx]; + + return idx; +} + +static const char * +uvc_mapping_get_menu_name(const struct uvc_control_mapping *mapping, u32 i= dx) +{ + if (!test_bit(idx, &mapping->menu_mask)) + return NULL; + + if (mapping->menu_names) + return mapping->menu_names[idx]; + + return v4l2_ctrl_get_menu(mapping->id)[idx]; +} =20 static s32 uvc_ctrl_get_zoom(struct uvc_control_mapping *mapping, u8 query, const u8 *data) @@ -525,8 +537,8 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_BITMASK, - .menu_info =3D exposure_auto_controls, - .menu_mask =3D BIT_MASK(ARRAY_SIZE(exposure_auto_controls)), + .menu_mapping =3D exposure_auto_mapping, + .menu_mask =3D GENMASK(ARRAY_SIZE(exposure_auto_mapping) - 1, 0), .slave_ids =3D { V4L2_CID_EXPOSURE_ABSOLUTE, }, }, { @@ -731,8 +743,7 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc11[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls, - .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls) - 1), + .menu_mask =3D GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0), }, }; =20 @@ -745,8 +756,7 @@ static const struct uvc_control_mapping uvc_ctrl_mappin= gs_uvc15[] =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls, - .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls)), + .menu_mask =3D GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_AUTO, 0), }, }; =20 @@ -973,13 +983,17 @@ static s32 __uvc_ctrl_get_value(struct uvc_control_ma= pping *mapping, s32 value =3D mapping->get(mapping, UVC_GET_CUR, data); =20 if (mapping->v4l2_type =3D=3D V4L2_CTRL_TYPE_MENU) { - const struct uvc_menu_info *menu =3D mapping->menu_info; unsigned int i; =20 - for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i) { + u32 menu_value; + if (!test_bit(i, &mapping->menu_mask)) continue; - if (menu->value =3D=3D value) { + + menu_value =3D uvc_mapping_get_menu_value(mapping, i); + + if (menu_value =3D=3D value) { value =3D i; break; } @@ -1190,7 +1204,6 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_cha= in *chain, { struct uvc_control_mapping *master_map =3D NULL; struct uvc_control *master_ctrl =3D NULL; - const struct uvc_menu_info *menu; unsigned int i; =20 memset(v4l2_ctrl, 0, sizeof(*v4l2_ctrl)); @@ -1235,11 +1248,15 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, v4l2_ctrl->maximum =3D fls(mapping->menu_mask) - 1; v4l2_ctrl->step =3D 1; =20 - menu =3D mapping->menu_info; - for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i, ++menu) { + for (i =3D 0; BIT(i) <=3D mapping->menu_mask; ++i) { + u32 menu_value; + if (!test_bit(i, &mapping->menu_mask)) continue; - if (menu->value =3D=3D v4l2_ctrl->default_value) { + + menu_value =3D uvc_mapping_get_menu_value(mapping, i); + + if (menu_value =3D=3D v4l2_ctrl->default_value) { v4l2_ctrl->default_value =3D i; break; } @@ -1338,11 +1355,11 @@ int uvc_query_v4l2_ctrl(struct uvc_video_chain *cha= in, int uvc_query_v4l2_menu(struct uvc_video_chain *chain, struct v4l2_querymenu *query_menu) { - const struct uvc_menu_info *menu_info; struct uvc_control_mapping *mapping; struct uvc_control *ctrl; u32 index =3D query_menu->index; u32 id =3D query_menu->id; + const char *name; int ret; =20 memset(query_menu, 0, sizeof(*query_menu)); @@ -1364,22 +1381,34 @@ int uvc_query_v4l2_menu(struct uvc_video_chain *cha= in, goto done; } =20 - menu_info =3D &mapping->menu_info[query_menu->index]; - if (mapping->data_type =3D=3D UVC_CTRL_DATA_TYPE_BITMASK) { + u32 menu_value; + if (!ctrl->cached) { ret =3D uvc_ctrl_populate_cache(chain, ctrl); if (ret < 0) goto done; } =20 - if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & menu_info->value)) { + menu_value =3D uvc_mapping_get_menu_value(mapping, + query_menu->index); + if (menu_value < 0) { + ret =3D menu_value; + goto done; + } + if (!(uvc_get_ctrl_bitmap(ctrl, mapping) & menu_value)) { ret =3D -EINVAL; goto done; } } =20 - strscpy(query_menu->name, menu_info->name, sizeof(query_menu->name)); + name =3D uvc_mapping_get_menu_name(mapping, query_menu->index); + if (!name) { + ret =3D -EINVAL; + goto done; + } + + strscpy(query_menu->name, name, sizeof(query_menu->name)); =20 done: mutex_unlock(&chain->ctrl_mutex); @@ -1880,7 +1909,7 @@ int uvc_ctrl_set(struct uvc_fh *handle, if (!test_bit(xctrl->value, &mapping->menu_mask)) return -EINVAL; =20 - value =3D mapping->menu_info[xctrl->value].value; + value =3D uvc_mapping_get_menu_value(mapping, xctrl->value); =20 /* * Valid menu indices are reported by the GET_RES request for @@ -2305,21 +2334,36 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_= chain *chain, return -ENOMEM; =20 map->name =3D NULL; - map->menu_info =3D NULL; + map->menu_names =3D NULL; + map->menu_mapping =3D NULL; =20 /* For UVCIOC_CTRL_MAP custom control */ if (mapping->name) { map->name =3D kstrdup(mapping->name, GFP_KERNEL); - if (!map->name) - goto nomem; + if (!map->name) { + kfree(map); + return -ENOMEM; + } } =20 INIT_LIST_HEAD(&map->ev_subs); =20 - size =3D sizeof(*mapping->menu_info) * fls(mapping->menu_mask); - map->menu_info =3D kmemdup(mapping->menu_info, size, GFP_KERNEL); - if (!map->menu_info) - goto nomem; + if (mapping->menu_mapping && mapping->menu_mask) { + size =3D sizeof(mapping->menu_mapping[0]) + * fls(mapping->menu_mask); + map->menu_mapping =3D kmemdup(mapping->menu_mapping, size, + GFP_KERNEL); + if (!map->menu_mapping) + goto nomem; + } + if (mapping->menu_names && mapping->menu_mask) { + size =3D sizeof(mapping->menu_names[0]) + * fls(mapping->menu_mask); + map->menu_names =3D kmemdup(mapping->menu_names, size, + GFP_KERNEL); + if (!map->menu_names) + goto nomem; + } =20 if (map->get =3D=3D NULL) map->get =3D uvc_get_le_value; @@ -2342,7 +2386,8 @@ static int __uvc_ctrl_add_mapping(struct uvc_video_ch= ain *chain, return 0; =20 nomem: - kfree(map->menu_info); + kfree(map->menu_names); + kfree(map->menu_mapping); kfree(map->name); kfree(map); return -ENOMEM; @@ -2673,7 +2718,8 @@ static void uvc_ctrl_cleanup_mappings(struct uvc_devi= ce *dev, =20 list_for_each_entry_safe(mapping, nm, &ctrl->info.mappings, list) { list_del(&mapping->list); - kfree(mapping->menu_info); + kfree(mapping->menu_names); + kfree(mapping->menu_mapping); kfree(mapping->name); kfree(mapping); } diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc= _driver.c index f9e6208c4636..ee016b370058 100644 --- a/drivers/media/usb/uvc/uvc_driver.c +++ b/drivers/media/usb/uvc/uvc_driver.c @@ -2371,11 +2371,6 @@ MODULE_PARM_DESC(timeout, "Streaming control request= s timeout"); * Driver initialization and cleanup */ =20 -static const struct uvc_menu_info power_line_frequency_controls_limited[] = =3D { - { 1, "50 Hz" }, - { 2, "60 Hz" }, -}; - static const struct uvc_control_mapping uvc_ctrl_power_line_mapping_limite= d =3D { .id =3D V4L2_CID_POWER_LINE_FREQUENCY, .entity =3D UVC_GUID_UVC_PROCESSING, @@ -2384,8 +2379,8 @@ static const struct uvc_control_mapping uvc_ctrl_powe= r_line_mapping_limited =3D { .offset =3D 0, .v4l2_type =3D V4L2_CTRL_TYPE_MENU, .data_type =3D UVC_CTRL_DATA_TYPE_ENUM, - .menu_info =3D power_line_frequency_controls_limited, - .menu_mask =3D BIT_MASK(ARRAY_SIZE(power_line_frequency_controls_limited)= ), + .menu_mask =3D GENMASK(V4L2_CID_POWER_LINE_FREQUENCY_60HZ, + V4L2_CID_POWER_LINE_FREQUENCY_50HZ), }; =20 static const struct uvc_device_info uvc_ctrl_power_line_limited =3D { diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v= 4l2.c index ed2525e7e2a5..dfa26ed0c7f1 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -26,14 +26,83 @@ =20 #include "uvcvideo.h" =20 +static int uvc_control_add_xu_mapping(struct uvc_video_chain *chain, + struct uvc_control_mapping *map, + const struct uvc_xu_control_mapping *xmap) +{ + unsigned int i; + size_t size; + int ret; + + /* + * Prevent excessive memory consumption, as well as integer + * overflows. + */ + if (xmap->menu_count =3D=3D 0 || + xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) + return -EINVAL; + + map->menu_names =3D NULL; + map->menu_mapping =3D NULL; + + map->menu_mask =3D BIT_MASK(xmap->menu_count); + + size =3D xmap->menu_count * sizeof(*map->menu_mapping); + map->menu_mapping =3D kzalloc(size, GFP_KERNEL); + if (!map->menu_mapping) { + ret =3D -ENOMEM; + goto exit; + } + + for (i =3D 0; i < xmap->menu_count ; i++) { + if (copy_from_user((u32 *)&map->menu_mapping[i], + &xmap->menu_info[i].value, + sizeof(map->menu_mapping[i]))) { + ret =3D -EACCES; + goto exit; + } + } + + /* Always use the standard naming if available. */ + if (v4l2_ctrl_get_menu(map->id)) + goto done_mapping; + + size =3D xmap->menu_count * sizeof(map->menu_names[0]); + map->menu_names =3D kzalloc(size, GFP_KERNEL); + if (!map->menu_names) { + ret =3D -ENOMEM; + goto exit; + } + + for (i =3D 0; i < xmap->menu_count ; i++) { + /* sizeof(names[i]) - 1: to take care of \0 */ + if (copy_from_user((char *)map->menu_names[i], + xmap->menu_info[i].name, + sizeof(map->menu_names[i]) - 1)) { + ret =3D -EACCES; + goto exit; + } + } + +done_mapping: + ret =3D uvc_ctrl_add_mapping(chain, map); + +exit: + kfree(map->menu_names); + map->menu_names =3D NULL; + kfree(map->menu_mapping); + map->menu_mapping =3D NULL; + + return ret; +} + /* ------------------------------------------------------------------------ * UVC ioctls */ -static int uvc_ioctl_ctrl_map(struct uvc_video_chain *chain, - struct uvc_xu_control_mapping *xmap) +static int uvc_ioctl_xu_ctrl_map(struct uvc_video_chain *chain, + struct uvc_xu_control_mapping *xmap) { struct uvc_control_mapping *map; - unsigned int size; int ret; =20 map =3D kzalloc(sizeof(*map), GFP_KERNEL); @@ -61,39 +130,20 @@ static int uvc_ioctl_ctrl_map(struct uvc_video_chain *= chain, case V4L2_CTRL_TYPE_INTEGER: case V4L2_CTRL_TYPE_BOOLEAN: case V4L2_CTRL_TYPE_BUTTON: + ret =3D uvc_ctrl_add_mapping(chain, map); break; =20 case V4L2_CTRL_TYPE_MENU: - /* - * Prevent excessive memory consumption, as well as integer - * overflows. - */ - if (xmap->menu_count =3D=3D 0 || - xmap->menu_count > UVC_MAX_CONTROL_MENU_ENTRIES) { - ret =3D -EINVAL; - goto free_map; - } - - size =3D xmap->menu_count * sizeof(*map->menu_info); - map->menu_info =3D memdup_user(xmap->menu_info, size); - if (IS_ERR(map->menu_info)) { - ret =3D PTR_ERR(map->menu_info); - goto free_map; - } - - map->menu_mask =3D BIT_MASK(xmap->menu_count); + ret =3D uvc_control_add_xu_mapping(chain, map, xmap); break; =20 default: uvc_dbg(chain->dev, CONTROL, "Unsupported V4L2 control type %u\n", xmap->v4l2_type); ret =3D -ENOTTY; - goto free_map; + break; } =20 - ret =3D uvc_ctrl_add_mapping(chain, map); - - kfree(map->menu_info); free_map: kfree(map); =20 @@ -1316,7 +1366,7 @@ static long uvc_ioctl_default(struct file *file, void= *fh, bool valid_prio, switch (cmd) { /* Dynamic controls. */ case UVCIOC_CTRL_MAP: - return uvc_ioctl_ctrl_map(chain, arg); + return uvc_ioctl_xu_ctrl_map(chain, arg); =20 case UVCIOC_CTRL_QUERY: return uvc_xu_ctrl_query(chain, arg); @@ -1429,7 +1479,7 @@ static long uvc_v4l2_compat_ioctl32(struct file *file, ret =3D uvc_v4l2_get_xu_mapping(&karg.xmap, up); if (ret) return ret; - ret =3D uvc_ioctl_ctrl_map(handle->chain, &karg.xmap); + ret =3D uvc_ioctl_xu_ctrl_map(handle->chain, &karg.xmap); if (ret) return ret; ret =3D uvc_v4l2_put_xu_mapping(&karg.xmap, up); diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvi= deo.h index f75e5864bbf7..0e816be556f2 100644 --- a/drivers/media/usb/uvc/uvcvideo.h +++ b/drivers/media/usb/uvc/uvcvideo.h @@ -116,7 +116,8 @@ struct uvc_control_mapping { enum v4l2_ctrl_type v4l2_type; u32 data_type; =20 - const struct uvc_menu_info *menu_info; + const u32 *menu_mapping; + const char (*menu_names)[UVC_MENU_NAME_LEN]; unsigned long menu_mask; =20 u32 master_id; diff --git a/include/uapi/linux/uvcvideo.h b/include/uapi/linux/uvcvideo.h index 8288137387c0..d45d0c2ea252 100644 --- a/include/uapi/linux/uvcvideo.h +++ b/include/uapi/linux/uvcvideo.h @@ -36,9 +36,11 @@ UVC_CTRL_FLAG_GET_MAX | UVC_CTRL_FLAG_GET_RES | \ UVC_CTRL_FLAG_GET_DEF) =20 +#define UVC_MENU_NAME_LEN 32 + struct uvc_menu_info { __u32 value; - __u8 name[32]; + __u8 name[UVC_MENU_NAME_LEN]; }; =20 struct uvc_xu_control_mapping { --=20 2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae