From nobody Sun Feb 8 03:58:33 2026 Received: from mail-qv1-f52.google.com (mail-qv1-f52.google.com [209.85.219.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A1B43204C24 for ; Mon, 24 Feb 2025 09:40:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740390014; cv=none; b=rG2uQcfqwrEp5VIV8w5M4W7zxTLOOjNLGl3IhM5WWotAa5Gsw4WXIOgWf3jYgjNWBEDNgjoL7VOF5Kf6J0kDokwbAmBRCGs97G8lpqdZ9Tqxc68y7fM4X3NeWEK9nZUhJSln9SncYw7qJ2Y04vGAdCby39qGOmY/HFs8/vX4ZJU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740390014; c=relaxed/simple; bh=sA8WO++5rNZBtjx501c9cpcdkpsxzwHOMX4IWV9Rsr8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=Ecw6R0xVxH+v7iS6yhm6gArSINDL3Vov80K6KVWA3qcuo7G3o1ue6Hm1QGEnQg5SV3FnMnQ9KHNMyj2K5EePsgdU4i6fq6+/RCHMsRgo2eJKEW/Wcu5JQVRrwQBzwdYra7cLFftFreIqE/TgbrvYF5Ib0D7f7A/4QMZt4zdIp04= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=UEmmI4ll; arc=none smtp.client-ip=209.85.219.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="UEmmI4ll" Received: by mail-qv1-f52.google.com with SMTP id 6a1803df08f44-6dd01781b56so51968246d6.0 for ; Mon, 24 Feb 2025 01:40:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1740390010; x=1740994810; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=hOH4g4FLbQyk00Mre2FH+qMcOUGd/gLcBgjYmHBMbaU=; b=UEmmI4llct9ULjjtoRcyDhVdz3iK5BiVMvlexADX86aFnHGnToxxIvHD1rGSOJKWJ7 rOhCsmNhH9OQPTs8nYeq8gHYyX7oBM+ZA4gPi5CnifwddBEGwii5WtMG1IGzvcHoQKuy 1iBVGjKz2iKth+qJEStpotXTUV+p9MCqMk+38= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740390010; x=1740994810; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=hOH4g4FLbQyk00Mre2FH+qMcOUGd/gLcBgjYmHBMbaU=; b=HEAvgWMwF8snjwIlFtIInhtgBuLNnfC2wWQI2EeEXVYUUKMKIHN+0opogOUi/cqA73 dGUTuu0s7s9LNCXfNjeOscN6ZwgFSDU/ALbowGt1Er2wKj1K91rrkEZbT18k0jV+ndgE IhlEQtrEevDxjefJ7ExgfEEZJgcc8cfK69QtQtyQzWIeCGaEOQPzaBeYfpL6GR7a9wOT Zo1046xb/gGWDPgl6cyCweqOrrn6ZROZaqoJo3ntPt8fFUDHqEXwl9LxmoJSDh6WvOdQ /n6COP+WfE03B8xXjC+J2FdTwZ0di2/iB0cXS4fkEn9V7XKxqf4fg7c/RYpurAn6h9zv HQXA== X-Forwarded-Encrypted: i=1; AJvYcCVMIJpLjU3/OuJXZMdYch6xeX3pb+rl8jRumUj4TjXnrWvQjIPeIew736x0YU+HmxEaCE2b/QcDpCp98b0=@vger.kernel.org X-Gm-Message-State: AOJu0YxbFHH2jnlQ1To05KgGijtvoQ59JQEhMxoT+jJCLCXh7XLwUHXM xN0adfiXCEyswlSrzD3ywLrjAiCieZ4LyDPIwkJ0xKEm97WlcE+pU9ck7+QQhg== X-Gm-Gg: ASbGncuJb22aJGG7UcP8r/e2zS8Jp6hzcERQhpRF7TYkpAfNdxpJYTOOmwWol1hR8gV jb8hmKBJkLbC8LMrF2CHz/lSKrMXf3AjUa5UD1TynRibxK+AY11EMMXUswNa6VG2PuRmijRWPKH r3OIhGNUST7SIz0EypVBzvKQ2zA9cFgGrO6NRFxE5QmZDfXVHHwPmTQicrgbq3pt0lhU2tuKTuh bo5UNiGudPN4+iFMO8bQO1z/3OApSQANLgBi7wbp9H85JNfGT78cpYumqTCqSYgzeOkYqaCUabc bvTGhkiBESE7hhteJkcbukeKfYsnWj5C7cA1UpJfrFblBacdwU7JjSxtHmiYmOosVLe8QvCV7DN 8q00= X-Google-Smtp-Source: AGHT+IF1JnvNYB15RUgRsLAqAnfBQ/3pKcNCeKY+GATLateLaGQ+wG+j6ppWfzqAdhQJOSiBAgkCYg== X-Received: by 2002:a05:6214:48f:b0:6e4:6ff6:bac2 with SMTP id 6a1803df08f44-6e6ae9a6af6mr162780496d6.40.1740390010484; Mon, 24 Feb 2025 01:40:10 -0800 (PST) Received: from denia.c.googlers.com (15.237.245.35.bc.googleusercontent.com. [35.245.237.15]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-6e6acb6d6b4sm46641146d6.121.2025.02.24.01.40.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 24 Feb 2025 01:40:09 -0800 (PST) From: Ricardo Ribalda Date: Mon, 24 Feb 2025 09:40:06 +0000 Subject: [PATCH v5] media: uvcvideo: Set V4L2_CTRL_FLAG_DISABLED during queryctrl errors Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250224-uvc-eaccess-v5-1-690d73bcef28@chromium.org> X-B4-Tracking: v=1; b=H4sIAHY+vGcC/23OQQ7CIBCF4asY1mIYBqh15T2MizKAZaE1YInG9 O6iiYk1Xb5Jvj/zZNmn6DPbrZ4s+RJzHC516PWKUd9dTp5HVzeTQiqQgHwsxH1H5HPmjdZEwkC HRrAqrsmHeP/UDse6+5hvQ3p84gXe1+VOAQ7cSC+sCkQG1Z76NJzjeN4M6cTeqSJ/eTvnsnIbj JaCtnZr3ALHL9cCRDPnWHnbBkTUTgPiAlc/HGDOVeXUNLq1wYF1/89P0/QCXxP1dmYBAAA= To: Hans Verkuil , Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.1 To implement VIDIOC_QUERYCTRL, we need to know the minimum, maximum, step and flags of the control. For some of the controls, this involves querying the actual hardware. Some non-compliant cameras produce errors when we query them. These error can be triggered every time, sometimes, or when other controls do not have the "right value". Right now, we populate that error to userspace. When an error happens, the v4l2 framework does not copy the v4l2_queryctrl struct to userspace. Also, userspace apps are not ready to handle any other error than -EINVAL. One of the main usecases of VIDIOC_QUERYCTRL is enumerating the controls of a device. This is done using the V4L2_CTRL_FLAG_NEXT_CTRL flag. In that usecase, a non-compliant control will make it almost impossible to enumerate all controls of the device. A control with an invalid max/min/step/flags is better than non being able to enumerate the rest of the controls. This patch: - Retries for an extra attempt to read the control, to avoid spurious errors. More attempts do not seem to produce better results in the tested hardware. - Makes VIDIOC_QUERYCTRL return 0 in all the error cases different than -EINVAL. - Introduces a warning in dmesg so we can have a trace of what has happened and sets the V4L2_CTRL_FLAG_DISABLED. Signed-off-by: Ricardo Ribalda --- Hi 2*Hans and Laurent! I came around a device that was listing just a couple of controls when it should be listing much more. Some debugging latter I found that the device was returning -EIO when all the focal controls were read. Lots of good arguments in favor/against this patch in the v1. Please check! Without this patch: $ v4l2-ctl --list-ctrls auto_exposure 0x009a0901 (menu) : min=3D0 max=3D3 defau= lt=3D3 value=3D3 (Aperture Priority Mode) exposure_time_absolute 0x009a0902 (int) : min=3D50 max=3D10000 = step=3D1 default=3D166 value=3D166 flags=3Dinactive exposure_dynamic_framerate 0x009a0903 (bool) : default=3D0 value=3D0 region_of_interest_auto_control 0x009a1902 (bitmask): max=3D0x00000001 defa= ult=3D0x00000001 value=3D1 With this patch: $ v4l2-ctl --list-ctrls auto_exposure 0x009a0901 (menu) : min=3D0 max=3D3 defau= lt=3D3 value=3D3 (Aperture Priority Mode) exposure_time_absolute 0x009a0902 (int) : min=3D50 max=3D10000 = step=3D1 default=3D166 value=3D166 flags=3Dinactive exposure_dynamic_framerate 0x009a0903 (bool) : default=3D0 value=3D0 error 5 getting ext_ctrl Focus, Absolute error 5 getting ext_ctrl Focus, Automatic Continuous region_of_interest_rectangle 0x009a1901 (unknown): type=3D107 value=3Dun= supported payload type flags=3Dhas-payload region_of_interest_auto_control 0x009a1902 (bitmask): max=3D0x00000001 defa= ult=3D0x00000001 value=3D1 -- --- Changes in v5: - Explain the retry in the commit message (Thanks Laurent). - Link to v4: https://lore.kernel.org/r/20250111-uvc-eaccess-v4-1-c7759bfd1= bd4@chromium.org Changes in v4: - Display control name (Thanks Hans) - Link to v3: https://lore.kernel.org/r/20250107-uvc-eaccess-v3-1-99f3335d5= 133@chromium.org Changes in v3: - Add a retry mechanism during error. - Set V4L2_CTRL_FLAG_DISABLED flag. - Link to v2: https://lore.kernel.org/r/20241219-uvc-eaccess-v2-1-bf6520c8b= 86d@chromium.org Changes in v2: - Never return error, even if we are not enumerating the controls - Improve commit message. - Link to v1: https://lore.kernel.org/r/20241213-uvc-eaccess-v1-1-62e0b4fcc= 634@chromium.org --- drivers/media/usb/uvc/uvc_ctrl.c | 43 ++++++++++++++++++++++++++++++++----= ---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_c= trl.c index 4e58476d305e..9d7812e8572d 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1280,6 +1280,8 @@ static u32 uvc_get_ctrl_bitmap(struct uvc_control *ct= rl, return ~0; } =20 +#define MAX_QUERY_RETRIES 2 + static int __uvc_query_v4l2_ctrl(struct uvc_video_chain *chain, struct uvc_control *ctrl, struct uvc_control_mapping *mapping, @@ -1305,19 +1307,44 @@ static int __uvc_query_v4l2_ctrl(struct uvc_video_c= hain *chain, __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)) { + unsigned int retries; s32 val; - int ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, &val); - if (ret < 0) - return ret; + int ret; =20 - if (val !=3D mapping->master_manual) - v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; + for (retries =3D 0; retries < MAX_QUERY_RETRIES; retries++) { + ret =3D __uvc_ctrl_get(chain, master_ctrl, master_map, + &val); + if (ret >=3D 0) + break; + } + + if (ret < 0) { + dev_warn_ratelimited(&chain->dev->udev->dev, + "UVC non compliance: Error %d querying master control %x (%s)\n", + ret, master_map->id, + uvc_map_get_name(master_map)); + } else if (val !=3D mapping->master_manual) { + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_INACTIVE; + } } =20 if (!ctrl->cached) { - int ret =3D uvc_ctrl_populate_cache(chain, ctrl); - if (ret < 0) - return ret; + unsigned int retries; + int ret; + + for (retries =3D 0; retries < MAX_QUERY_RETRIES; retries++) { + ret =3D uvc_ctrl_populate_cache(chain, ctrl); + if (ret >=3D 0) + break; + } + + if (ret < 0) { + dev_warn_ratelimited(&chain->dev->udev->dev, + "UVC non compliance: Error %d populating cache of control %x (%s= )\n", + ret, mapping->id, + uvc_map_get_name(mapping)); + v4l2_ctrl->flags |=3D V4L2_CTRL_FLAG_DISABLED; + } } =20 if (ctrl->info.flags & UVC_CTRL_FLAG_GET_DEF) { --- base-commit: c2b96a6818159fba8a3bcc38262da9e77f9b3ec7 change-id: 20241213-uvc-eaccess-755cc061a360 Best regards, --=20 Ricardo Ribalda