Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df9af85f authored by Mayank Rana's avatar Mayank Rana Committed by Gerrit - the friendly Code Review server
Browse files

usb: gadget: ncm: Add super speed descriptors for NCM function



This change adds super speed descriptors which is required to
get NCM function to work with SSUSB mode. The burst capability
is not enabled for now.

This change also adds check against super speed descriptors
in usb_free_all_descriptors() API as all function driver may not
necessary to support super speed functionality.

CRs-Fixed: 804486
Change-Id: I6239ad9e64969afb4e9af87d76837b940c3d1348
Signed-off-by: default avatarMayank Rana <mrana@codeaurora.org>
parent c39a75b0
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -227,6 +227,7 @@ void usb_free_all_descriptors(struct usb_function *f)
{
	usb_free_descriptors(f->fs_descriptors);
	usb_free_descriptors(f->hs_descriptors);
	if (f->ss_descriptors)
		usb_free_descriptors(f->ss_descriptors);
}
EXPORT_SYMBOL_GPL(usb_free_all_descriptors);
+81 −1
Original line number Diff line number Diff line
@@ -328,6 +328,77 @@ static struct usb_descriptor_header *ncm_hs_function[] = {
	NULL,
};

/* Super Speed Support */
static struct usb_endpoint_descriptor ncm_ss_notify_desc = {
	.bLength =		USB_DT_ENDPOINT_SIZE,
	.bDescriptorType =	USB_DT_ENDPOINT,
	.bEndpointAddress =	USB_DIR_IN,
	.bmAttributes =		USB_ENDPOINT_XFER_INT,
	.wMaxPacketSize =	cpu_to_le16(NCM_STATUS_BYTECOUNT),
	.bInterval =		USB_MS_TO_HS_INTERVAL(NCM_STATUS_INTERVAL_MS),
};

static struct usb_ss_ep_comp_descriptor ncm_ss_notify_comp_desc = {
	.bLength =		sizeof(ncm_ss_notify_comp_desc),
	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
	/* the following 3 values can be tweaked if necessary */
	/* .bMaxBurst =		0, */
	/* .bmAttributes =	0, */
	.wBytesPerInterval =	cpu_to_le16(NCM_STATUS_BYTECOUNT),
};

static struct usb_endpoint_descriptor ncm_ss_in_desc = {
	.bLength =		USB_DT_ENDPOINT_SIZE,
	.bDescriptorType =	USB_DT_ENDPOINT,
	.bEndpointAddress =	USB_DIR_IN,
	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize =	cpu_to_le16(1024),
};

static struct usb_ss_ep_comp_descriptor ncm_ss_in_comp_desc = {
	.bLength =		sizeof(ncm_ss_in_comp_desc),
	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
	/* the following 2 values can be tweaked if necessary */
	/* .bMaxBurst =		0, */
	/* .bmAttributes =	0, */
};

static struct usb_endpoint_descriptor ncm_ss_out_desc = {
	.bLength =		USB_DT_ENDPOINT_SIZE,
	.bDescriptorType =	USB_DT_ENDPOINT,
	.bEndpointAddress =	USB_DIR_OUT,
	.bmAttributes =		USB_ENDPOINT_XFER_BULK,
	.wMaxPacketSize =	cpu_to_le16(1024),
};

static struct usb_ss_ep_comp_descriptor ncm_ss_out_comp_desc = {
	.bLength =		sizeof(ncm_ss_out_comp_desc),
	.bDescriptorType =	USB_DT_SS_ENDPOINT_COMP,
	/* the following 2 values can be tweaked if necessary */
	/* .bMaxBurst =		0, */
	/* .bmAttributes =	0, */
};

static struct usb_descriptor_header *ncm_ss_function[] = {
	(struct usb_descriptor_header *) &ncm_iad_desc,
	/* CDC NCM control descriptors */
	(struct usb_descriptor_header *) &ncm_control_intf,
	(struct usb_descriptor_header *) &ncm_header_desc,
	(struct usb_descriptor_header *) &ncm_union_desc,
	(struct usb_descriptor_header *) &necm_desc,
	(struct usb_descriptor_header *) &ncm_desc,
	(struct usb_descriptor_header *) &ncm_ss_notify_desc,
	(struct usb_descriptor_header *) &ncm_ss_notify_comp_desc,
	/* data interface, altsettings 0 and 1 */
	(struct usb_descriptor_header *) &ncm_data_nop_intf,
	(struct usb_descriptor_header *) &ncm_data_intf,
	(struct usb_descriptor_header *) &ncm_ss_in_desc,
	(struct usb_descriptor_header *) &ncm_ss_in_comp_desc,
	(struct usb_descriptor_header *) &ncm_ss_out_desc,
	(struct usb_descriptor_header *) &ncm_ss_out_comp_desc,
	NULL,
};

/* string descriptors: */

#define STRING_CTRL_IDX	0
@@ -1238,8 +1309,17 @@ ncm_bind(struct usb_configuration *c, struct usb_function *f)
	hs_ncm_notify_desc.bEndpointAddress =
		fs_ncm_notify_desc.bEndpointAddress;

	if (gadget_is_superspeed(c->cdev->gadget)) {
		ncm_ss_in_desc.bEndpointAddress =
					fs_ncm_in_desc.bEndpointAddress;
		ncm_ss_out_desc.bEndpointAddress =
					fs_ncm_out_desc.bEndpointAddress;
		ncm_ss_notify_desc.bEndpointAddress =
					fs_ncm_notify_desc.bEndpointAddress;
	}

	status = usb_assign_descriptors(f, ncm_fs_function, ncm_hs_function,
			NULL);
					ncm_ss_function);
	/*
	 * NOTE:  all that is done without knowing or caring about
	 * the network link ... which is unavailable to this code