Hi Shuzhen, Thank you for the patch. On Thu, Oct 26, 2023 at 12:29:02PM -0700, Shuzhen Wang wrote: > 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. > > Signed-off-by: Shuzhen Wang <shuzhenwang@xxxxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > drivers/usb/gadget/function/f_uvc.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c > index faa398109431..786379f1b7b7 100644 > --- a/drivers/usb/gadget/function/f_uvc.c > +++ b/drivers/usb/gadget/function/f_uvc.c > @@ -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); -- Regards, Laurent Pinchart