diff mbox series

usb: gadget: uvc: Add missing initialization of ssp config descriptor

Message ID 14ceb63f-1769-4025-ad90-c38112dfec79@google.com (mailing list archive)
State Superseded
Headers show
Series usb: gadget: uvc: Add missing initialization of ssp config descriptor | expand

Commit Message

Shuzhen Wang Oct. 26, 2023, 7:29 p.m. UTC
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@google.com>
---
  drivers/usb/gadget/function/f_uvc.c | 14 ++++++++++++--
  1 file changed, 12 insertions(+), 2 deletions(-)

--

Comments

Laurent Pinchart Oct. 27, 2023, 8:03 a.m. UTC | #1
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@google.com>

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
>   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);
Greg Kroah-Hartman Oct. 27, 2023, 10:57 a.m. UTC | #2
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@google.com>
> ---
>  drivers/usb/gadget/function/f_uvc.c | 14 ++++++++++++--
>  1 file changed, 12 insertions(+), 2 deletions(-)


Hi,

This is the friendly patch-bot of Greg Kroah-Hartman.  You have sent him
a patch that has triggered this response.  He used to manually respond
to these common problems, but in order to save his sanity (he kept
writing the same thing over and over, yet to different people), I was
created.  Hopefully you will not take offence and will fix the problem
in your patch and resubmit it so that it can be accepted into the Linux
kernel tree.

You are receiving this message because of the following common error(s)
as indicated below:

- Your patch did not apply to any known trees that Greg is in control
  of.  Possibly this is because you made it against Linus's tree, not
  the linux-next tree, which is where all of the development for the
  next version of the kernel is at.  Please refresh your patch against
  the linux-next tree, or even better yet, the development tree
  specified in the MAINTAINERS file for the subsystem you are submitting
  a patch for, and resend it.

If you wish to discuss this problem further, or you have questions about
how to resolve this issue, please feel free to respond to this email and
Greg will reply once he has dug out from the pending patches received
from other developers.

thanks,

greg k-h's patch email bot
diff mbox series

Patch

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);