Skip to content

Commit

Permalink
usb: gadget: uvc: default the ctrl request interface offsets
Browse files Browse the repository at this point in the history
For the userspace it is needed to distinguish between requests for the
control or streaming interface. The userspace would have to parse the
configfs to know which interface index it has to compare the ctrl
requests against. Since the interface numbers are not fixed, e.g. for
composite gadgets, the interface offset depends on the setup.

The kernel has this information when handing over the ctrl request to
the userspace. This patch removes the offset from the interface numbers
and expose the default interface defines in the uapi g_uvc.h.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Link: https://lore.kernel.org/r/20221011075348.1786897-1-m.grzeschik@pengutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Michael Grzeschik authored and Greg Kroah-Hartman committed Oct 22, 2022
1 parent 9b6447e commit d182bf1
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 3 deletions.
15 changes: 12 additions & 3 deletions drivers/usb/gadget/function/f_uvc.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ MODULE_PARM_DESC(trace, "Trace level bitmask");

/* string IDs are assigned dynamically */

#define UVC_STRING_CONTROL_IDX 0
#define UVC_STRING_STREAMING_IDX 1

static struct usb_string uvc_en_us_strings[] = {
/* [UVC_STRING_CONTROL_IDX].s = DYNAMIC, */
[UVC_STRING_STREAMING_IDX].s = "Video Streaming",
Expand Down Expand Up @@ -228,6 +225,8 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
struct uvc_device *uvc = to_uvc(f);
struct v4l2_event v4l2_event;
struct uvc_event *uvc_event = (void *)&v4l2_event.u.data;
unsigned int interface = le16_to_cpu(ctrl->wIndex) & 0xff;
struct usb_ctrlrequest *mctrl;

if ((ctrl->bRequestType & USB_TYPE_MASK) != USB_TYPE_CLASS) {
uvcg_info(f, "invalid request type\n");
Expand All @@ -248,6 +247,16 @@ uvc_function_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
memset(&v4l2_event, 0, sizeof(v4l2_event));
v4l2_event.type = UVC_EVENT_SETUP;
memcpy(&uvc_event->req, ctrl, sizeof(uvc_event->req));

/* check for the interface number, fixup the interface number in
* the ctrl request so the userspace doesn't have to bother with
* offset and configfs parsing
*/
mctrl = &uvc_event->req;
mctrl->wIndex &= ~cpu_to_le16(0xff);
if (interface == uvc->streaming_intf)
mctrl->wIndex = cpu_to_le16(UVC_STRING_STREAMING_IDX);

v4l2_event_queue(&uvc->vdev, &v4l2_event);

return 0;
Expand Down
3 changes: 3 additions & 0 deletions include/uapi/linux/usb/g_uvc.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
#define UVC_EVENT_DATA (V4L2_EVENT_PRIVATE_START + 5)
#define UVC_EVENT_LAST (V4L2_EVENT_PRIVATE_START + 5)

#define UVC_STRING_CONTROL_IDX 0
#define UVC_STRING_STREAMING_IDX 1

struct uvc_request_data {
__s32 length;
__u8 data[60];
Expand Down

0 comments on commit d182bf1

Please sign in to comment.