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

Commit d11519ad authored by Praveena Nadahally's avatar Praveena Nadahally Committed by Felipe Balbi
Browse files

usb: gadget: Add Interface Association Descriptor to ECM



Add IAD to bind the two interfaces of ECM so that it works properly
in composite gadget mode.

Signed-off-by: default avatarThirupathi <thirupathi.chippakurthy@stericsson.com>
Signed-off-by: default avatarPraveena Nadahally <praveen.nadahally@stericsson.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent fcc0bb5a
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -97,6 +97,20 @@ static inline unsigned ecm_bitrate(struct usb_gadget *g)

/* interface descriptor: */

static struct usb_interface_assoc_descriptor
ecm_iad_descriptor = {
	.bLength =		sizeof ecm_iad_descriptor,
	.bDescriptorType =	USB_DT_INTERFACE_ASSOCIATION,

	/* .bFirstInterface =	DYNAMIC, */
	.bInterfaceCount =	2,	/* control + data */
	.bFunctionClass =	USB_CLASS_COMM,
	.bFunctionSubClass =	USB_CDC_SUBCLASS_ETHERNET,
	.bFunctionProtocol =	USB_CDC_PROTO_NONE,
	/* .iFunction =		DYNAMIC */
};


static struct usb_interface_descriptor ecm_control_intf = {
	.bLength =		sizeof ecm_control_intf,
	.bDescriptorType =	USB_DT_INTERFACE,
@@ -199,6 +213,7 @@ static struct usb_endpoint_descriptor fs_ecm_out_desc = {

static struct usb_descriptor_header *ecm_fs_function[] = {
	/* CDC ECM control descriptors */
	(struct usb_descriptor_header *) &ecm_iad_descriptor,
	(struct usb_descriptor_header *) &ecm_control_intf,
	(struct usb_descriptor_header *) &ecm_header_desc,
	(struct usb_descriptor_header *) &ecm_union_desc,
@@ -247,6 +262,7 @@ static struct usb_endpoint_descriptor hs_ecm_out_desc = {

static struct usb_descriptor_header *ecm_hs_function[] = {
	/* CDC ECM control descriptors */
	(struct usb_descriptor_header *) &ecm_iad_descriptor,
	(struct usb_descriptor_header *) &ecm_control_intf,
	(struct usb_descriptor_header *) &ecm_header_desc,
	(struct usb_descriptor_header *) &ecm_union_desc,
@@ -339,6 +355,7 @@ static struct usb_string ecm_string_defs[] = {
	[0].s = "CDC Ethernet Control Model (ECM)",
	[1].s = NULL /* DYNAMIC */,
	[2].s = "CDC Ethernet Data",
	[3].s = "CDC ECM",
	{  } /* end of list */
};

@@ -674,6 +691,7 @@ ecm_bind(struct usb_configuration *c, struct usb_function *f)
	if (status < 0)
		goto fail;
	ecm->ctrl_id = status;
	ecm_iad_descriptor.bFirstInterface = status;

	ecm_control_intf.bInterfaceNumber = status;
	ecm_union_desc.bMasterInterface0 = status;
@@ -864,6 +882,13 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
			return status;
		ecm_string_defs[1].id = status;
		ecm_desc.iMACAddress = status;

		/* IAD label */
		status = usb_string_id(c->cdev);
		if (status < 0)
			return status;
		ecm_string_defs[3].id = status;
		ecm_iad_descriptor.iFunction = status;
	}

	/* allocate and initialize one new instance */