|
@@ -691,6 +691,10 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
|
|
|
f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc;
|
|
|
}
|
|
|
|
|
|
+ rndis_iad_descriptor.bFunctionClass = rndis_opts->class;
|
|
|
+ rndis_iad_descriptor.bFunctionSubClass = rndis_opts->subclass;
|
|
|
+ rndis_iad_descriptor.bFunctionProtocol = rndis_opts->protocol;
|
|
|
+
|
|
|
/*
|
|
|
* in drivers/usb/gadget/configfs.c:configfs_composite_bind()
|
|
|
* configurations are bound in sequence with list_for_each_entry,
|
|
@@ -866,11 +870,23 @@ USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(rndis);
|
|
|
/* f_rndis_opts_ifname */
|
|
|
USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(rndis);
|
|
|
|
|
|
+/* f_rndis_opts_class */
|
|
|
+USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, class);
|
|
|
+
|
|
|
+/* f_rndis_opts_subclass */
|
|
|
+USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, subclass);
|
|
|
+
|
|
|
+/* f_rndis_opts_protocol */
|
|
|
+USB_ETHER_CONFIGFS_ITEM_ATTR_U8_RW(rndis, protocol);
|
|
|
+
|
|
|
static struct configfs_attribute *rndis_attrs[] = {
|
|
|
&rndis_opts_attr_dev_addr,
|
|
|
&rndis_opts_attr_host_addr,
|
|
|
&rndis_opts_attr_qmult,
|
|
|
&rndis_opts_attr_ifname,
|
|
|
+ &rndis_opts_attr_class,
|
|
|
+ &rndis_opts_attr_subclass,
|
|
|
+ &rndis_opts_attr_protocol,
|
|
|
NULL,
|
|
|
};
|
|
|
|
|
@@ -916,6 +932,10 @@ static struct usb_function_instance *rndis_alloc_inst(void)
|
|
|
}
|
|
|
INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop);
|
|
|
|
|
|
+ opts->class = rndis_iad_descriptor.bFunctionClass;
|
|
|
+ opts->subclass = rndis_iad_descriptor.bFunctionSubClass;
|
|
|
+ opts->protocol = rndis_iad_descriptor.bFunctionProtocol;
|
|
|
+
|
|
|
descs[0] = &opts->rndis_os_desc;
|
|
|
names[0] = "rndis";
|
|
|
config_group_init_type_name(&opts->func_inst.group, "",
|