On Thu, Mar 11, 2021 at 2:17 PM Hans Verkuil <hverkuil-cisco@xxxxxxxxx> wrote: > > On 11/03/2021 14:06, Ricardo Ribalda wrote: > > Hi Hans > > > > Thanks for your review! > > > > > > On Thu, Mar 11, 2021 at 1:57 PM Hans Verkuil <hverkuil-cisco@xxxxxxxxx> wrote: > >> > >> On 10/03/2021 22:24, Ricardo Ribalda wrote: > >>> If there are multiple classes, the ioctl should fail. > >> > >> It shouldn't matter if there are multiple classes or not, it should > >> work. > > > > I believe this is the part of the kernel that is triggering the issue: > > > > https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/v4l2-core/v4l2-ioctl.c#n929 > > > > I can send a patch if that is not the intended behaviour ;) > > > > /* Check that all controls are from the same control class. */ > > for (i = 0; i < c->count; i++) { > > if (V4L2_CTRL_ID2WHICH(c->controls[i].id) != c->which) { > > c->error_idx = i; > > return 0; > > Ah, and this is only called for drivers that do not use the control framework. > > This is a bug, just before that for-loop it says: > > if (!c->which) > return 1; > > This should be: > > if (!c->which || c->which == V4L2_CTRL_WHICH_DEF_VAL) > return 1; > if (c->which == V4L2_CTRL_WHICH_REQUEST_VAL) > return 0; Can I send a patch for that? > > Regards, > > Hans > > > > >> > >> What is the exact error you get with which driver? > > > > I am trying to fix uvc compliance > > > > fail: v4l2-test-controls.cpp(813): doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls) > > test VIDIOC_G/S/TRY_EXT_CTRLS: FAIL > > > > > >> > >> Regards, > > > > Best regards! > > > >> > >> Hans > >> > >>> > >>> Fixes: 0884b19adada ("v4l2-compliance: add test for V4L2_CTRL_WHICH_DEF_VAL") > >>> Signed-off-by: Ricardo Ribalda <ribalda@xxxxxxxxxxxx> > >>> --- > >>> utils/v4l2-compliance/v4l2-test-controls.cpp | 5 ++++- > >>> 1 file changed, 4 insertions(+), 1 deletion(-) > >>> > >>> diff --git a/utils/v4l2-compliance/v4l2-test-controls.cpp b/utils/v4l2-compliance/v4l2-test-controls.cpp > >>> index 9a68b7e847b0..79982bc15054 100644 > >>> --- a/utils/v4l2-compliance/v4l2-test-controls.cpp > >>> +++ b/utils/v4l2-compliance/v4l2-test-controls.cpp > >>> @@ -793,7 +793,10 @@ int testExtendedControls(struct node *node) > >>> ctrls.which = V4L2_CTRL_WHICH_DEF_VAL; > >>> fail_on_test(!doioctl(node, VIDIOC_S_EXT_CTRLS, &ctrls)); > >>> fail_on_test(!doioctl(node, VIDIOC_TRY_EXT_CTRLS, &ctrls)); > >>> - fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)); > >>> + if (multiple_classes) > >>> + fail_on_test(!doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)); > >>> + else > >>> + fail_on_test(doioctl(node, VIDIOC_G_EXT_CTRLS, &ctrls)); > >>> return 0; > >>> } > >>> > >>> > >> > > > > > -- Ricardo Ribalda