From: Greg Kroah-Hartman Date: Tue, 13 Aug 2024 16:16:43 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v6.1.105~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e3c1c2efdb33406e60bbeffb8946a8ea83b741ef;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: media-uvcvideo-use-entity-get_cur-in-uvc_ctrl_set.patch --- diff --git a/queue-5.4/media-uvcvideo-use-entity-get_cur-in-uvc_ctrl_set.patch b/queue-5.4/media-uvcvideo-use-entity-get_cur-in-uvc_ctrl_set.patch new file mode 100644 index 00000000000..baada606e2b --- /dev/null +++ b/queue-5.4/media-uvcvideo-use-entity-get_cur-in-uvc_ctrl_set.patch @@ -0,0 +1,129 @@ +From 5f36851c36b30f713f588ed2b60aa7b4512e2c76 Mon Sep 17 00:00:00 2001 +From: Yunke Cao +Date: Thu, 7 Jul 2022 10:53:31 +0200 +Subject: media: uvcvideo: Use entity get_cur in uvc_ctrl_set + +From: Yunke Cao + +commit 5f36851c36b30f713f588ed2b60aa7b4512e2c76 upstream. + +Entity controls should get_cur using an entity-defined function +instead of via a query. Fix this in uvc_ctrl_set. + +Fixes: 65900c581d01 ("media: uvcvideo: Allow entity-defined get_info and get_cur") +Signed-off-by: Yunke Cao +Reviewed-by: Ricardo Ribalda +Signed-off-by: Laurent Pinchart +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman +--- + drivers/media/usb/uvc/uvc_ctrl.c | 83 +++++++++++++++++++++------------------ + 1 file changed, 46 insertions(+), 37 deletions(-) + +--- a/drivers/media/usb/uvc/uvc_ctrl.c ++++ b/drivers/media/usb/uvc/uvc_ctrl.c +@@ -992,36 +992,56 @@ static s32 __uvc_ctrl_get_value(struct u + return value; + } + +-static int __uvc_ctrl_get(struct uvc_video_chain *chain, +- struct uvc_control *ctrl, struct uvc_control_mapping *mapping, +- s32 *value) ++static int __uvc_ctrl_load_cur(struct uvc_video_chain *chain, ++ struct uvc_control *ctrl) + { ++ u8 *data; + int ret; + +- if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) +- return -EACCES; ++ if (ctrl->loaded) ++ return 0; + +- if (!ctrl->loaded) { +- if (ctrl->entity->get_cur) { +- ret = ctrl->entity->get_cur(chain->dev, +- ctrl->entity, +- ctrl->info.selector, +- uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), +- ctrl->info.size); +- } else { +- ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, +- ctrl->entity->id, +- chain->dev->intfnum, +- ctrl->info.selector, +- uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), +- ctrl->info.size); +- } +- if (ret < 0) +- return ret; ++ data = uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT); + ++ if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) { ++ memset(data, 0, ctrl->info.size); + ctrl->loaded = 1; ++ ++ return 0; + } + ++ if (ctrl->entity->get_cur) ++ ret = ctrl->entity->get_cur(chain->dev, ctrl->entity, ++ ctrl->info.selector, data, ++ ctrl->info.size); ++ else ++ ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, ++ ctrl->entity->id, chain->dev->intfnum, ++ ctrl->info.selector, data, ++ ctrl->info.size); ++ ++ if (ret < 0) ++ return ret; ++ ++ ctrl->loaded = 1; ++ ++ return ret; ++} ++ ++static int __uvc_ctrl_get(struct uvc_video_chain *chain, ++ struct uvc_control *ctrl, ++ struct uvc_control_mapping *mapping, ++ s32 *value) ++{ ++ int ret; ++ ++ if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) ++ return -EACCES; ++ ++ ret = __uvc_ctrl_load_cur(chain, ctrl); ++ if (ret < 0) ++ return ret; ++ + *value = __uvc_ctrl_get_value(mapping, + uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT)); + +@@ -1675,21 +1695,10 @@ int uvc_ctrl_set(struct uvc_fh *handle, + * needs to be loaded from the device to perform the read-modify-write + * operation. + */ +- if (!ctrl->loaded && (ctrl->info.size * 8) != mapping->size) { +- if ((ctrl->info.flags & UVC_CTRL_FLAG_GET_CUR) == 0) { +- memset(uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), +- 0, ctrl->info.size); +- } else { +- ret = uvc_query_ctrl(chain->dev, UVC_GET_CUR, +- ctrl->entity->id, chain->dev->intfnum, +- ctrl->info.selector, +- uvc_ctrl_data(ctrl, UVC_CTRL_DATA_CURRENT), +- ctrl->info.size); +- if (ret < 0) +- return ret; +- } +- +- ctrl->loaded = 1; ++ if ((ctrl->info.size * 8) != mapping->size) { ++ ret = __uvc_ctrl_load_cur(chain, ctrl); ++ if (ret < 0) ++ return ret; + } + + /* Backup the current value in case we need to rollback later. */ diff --git a/queue-5.4/series b/queue-5.4/series index 4e15b0813bb..a1a20eb6a9d 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -253,3 +253,4 @@ netfilter-nf_tables-use-timestamp-to-check-for-set-element-timeout.patch netfilter-nf_tables-prefer-nft_chain_validate.patch drm-i915-gem-fix-virtual-memory-mapping-boundaries-calculation.patch arm64-cpufeature-fix-the-visibility-of-compat-hwcaps.patch +media-uvcvideo-use-entity-get_cur-in-uvc_ctrl_set.patch