|
@@ -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 */
|