Commit c70793fb authored by Shuzhen Wang's avatar Shuzhen Wang Committed by Greg Kroah-Hartman
Browse files

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



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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarShuzhen Wang <shuzhenwang@google.com>
Link: https://lore.kernel.org/r/20231027183440.1994315-1-shuzhenwang@google.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 0e3139e6
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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);