]> Git Repo - J-linux.git/commitdiff
usb: gadget: uvc: Add missing initialization of ssp config descriptor
authorShuzhen Wang <[email protected]>
Fri, 27 Oct 2023 18:34:40 +0000 (11:34 -0700)
committerGreg Kroah-Hartman <[email protected]>
Sat, 28 Oct 2023 10:25:19 +0000 (12:25 +0200)
In case the uvc gadget is super speed plus, the corresponding config
descriptor wasn't initialized. As a result, the host will not recognize
the devices when using super speed plus connection.

This patch initializes them to super speed descriptors.

Reviewed-by: Laurent Pinchart <[email protected]>
Signed-off-by: Shuzhen Wang <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/usb/gadget/function/f_uvc.c

index faa398109431fca37fbd5e5309fe4e58aa75878e..786379f1b7b72457a6bc9e303e47b7f62c6eecae 100644 (file)
@@ -516,6 +516,7 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
        void *mem;
 
        switch (speed) {
+       case USB_SPEED_SUPER_PLUS:
        case USB_SPEED_SUPER:
                uvc_control_desc = uvc->desc.ss_control;
                uvc_streaming_cls = uvc->desc.ss_streaming;
@@ -564,7 +565,8 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
                bytes += uvc_interrupt_ep.bLength + uvc_interrupt_cs_ep.bLength;
                n_desc += 2;
 
-               if (speed == USB_SPEED_SUPER) {
+               if (speed == USB_SPEED_SUPER ||
+                   speed == USB_SPEED_SUPER_PLUS) {
                        bytes += uvc_ss_interrupt_comp.bLength;
                        n_desc += 1;
                }
@@ -619,7 +621,8 @@ uvc_copy_descriptors(struct uvc_device *uvc, enum usb_device_speed speed)
 
        if (uvc->enable_interrupt_ep) {
                UVC_COPY_DESCRIPTOR(mem, dst, &uvc_interrupt_ep);
-               if (speed == USB_SPEED_SUPER)
+               if (speed == USB_SPEED_SUPER ||
+                   speed == USB_SPEED_SUPER_PLUS)
                        UVC_COPY_DESCRIPTOR(mem, dst, &uvc_ss_interrupt_comp);
 
                UVC_COPY_DESCRIPTOR(mem, dst, &uvc_interrupt_cs_ep);
@@ -795,6 +798,13 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f)
                goto error;
        }
 
+       f->ssp_descriptors = uvc_copy_descriptors(uvc, USB_SPEED_SUPER_PLUS);
+       if (IS_ERR(f->ssp_descriptors)) {
+               ret = PTR_ERR(f->ssp_descriptors);
+               f->ssp_descriptors = NULL;
+               goto error;
+       }
+
        /* Preallocate control endpoint request. */
        uvc->control_req = usb_ep_alloc_request(cdev->gadget->ep0, GFP_KERNEL);
        uvc->control_buf = kmalloc(UVC_MAX_REQUEST_SIZE, GFP_KERNEL);
This page took 0.058692 seconds and 4 git commands to generate.