usb: gadget: android: Update android gadget driver
* Functions and the device descriptor are configured from user space:
echo 0 > /sys/class/android_usb/android0/enable
echo adb,acm > /sys/class/android_usb/android0/functions
echo 2 > /sys/class/android_usb/android0/f_acm/instances
echo 1 > /sys/class/android_usb/android0/enable
* Driver does not require platform data anymore
* Moved function initialization to android.c instead of each
function file
* Replaced switches by uevents
Signed-off-by: Benoit Goby <benoit@android.com>
Signed-off-by: Mike Lockwood <lockwood@android.com>
Change-Id: If5ad9267c111ad0a442f0d87a0d31082dc5381b6
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
index 761a789..d03b11b 100644
--- a/drivers/usb/gadget/f_rndis.c
+++ b/drivers/usb/gadget/f_rndis.c
@@ -28,7 +28,6 @@
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/etherdevice.h>
-#include <linux/usb/android_composite.h>
#include <asm/atomic.h>
@@ -87,8 +86,11 @@
struct gether port;
u8 ctrl_id, data_id;
u8 ethaddr[ETH_ALEN];
+ u32 vendorID;
+ const char *manufacturer;
int config;
+
struct rndis_ep_descs fs;
struct rndis_ep_descs hs;
@@ -130,16 +132,9 @@
/* .bInterfaceNumber = DYNAMIC */
/* status endpoint is optional; this could be patched later */
.bNumEndpoints = 1,
-#ifdef CONFIG_USB_ANDROID_RNDIS_WCEIS
- /* "Wireless" RNDIS; auto-detected by Windows */
- .bInterfaceClass = USB_CLASS_WIRELESS_CONTROLLER,
- .bInterfaceSubClass = 0x01,
- .bInterfaceProtocol = 0x03,
-#else
.bInterfaceClass = USB_CLASS_COMM,
.bInterfaceSubClass = USB_CDC_SUBCLASS_ACM,
.bInterfaceProtocol = USB_CDC_ACM_PROTO_VENDOR,
-#endif
/* .iInterface = DYNAMIC */
};
@@ -195,19 +190,11 @@
rndis_iad_descriptor = {
.bLength = sizeof rndis_iad_descriptor,
.bDescriptorType = USB_DT_INTERFACE_ASSOCIATION,
-
.bFirstInterface = 0, /* XXX, hardcoded */
.bInterfaceCount = 2, // control + data
-#ifdef CONFIG_USB_ANDROID_RNDIS_WCEIS
- /* "Wireless" RNDIS; auto-detected by Windows */
- .bFunctionClass = USB_CLASS_WIRELESS_CONTROLLER,
- .bFunctionSubClass = 0x01,
- .bFunctionProtocol = 0x03,
-#else
.bFunctionClass = USB_CLASS_COMM,
.bFunctionSubClass = USB_CDC_SUBCLASS_ETHERNET,
.bFunctionProtocol = USB_CDC_ACM_PROTO_VENDOR,
-#endif
/* .iFunction = DYNAMIC */
};
@@ -319,10 +306,6 @@
NULL,
};
-#ifdef CONFIG_USB_ANDROID_RNDIS
-static struct usb_ether_platform_data *rndis_pdata;
-#endif
-
/*-------------------------------------------------------------------------*/
static struct sk_buff *rndis_add_header(struct gether *port,
@@ -725,13 +708,9 @@
rndis_set_param_medium(rndis->config, NDIS_MEDIUM_802_3, 0);
rndis_set_host_mac(rndis->config, rndis->ethaddr);
-#ifdef CONFIG_USB_ANDROID_RNDIS
- if (rndis_pdata) {
- if (rndis_set_param_vendor(rndis->config, rndis_pdata->vendorID,
- rndis_pdata->vendorDescr))
+ if (rndis_set_param_vendor(rndis->config, rndis->vendorID,
+ rndis->manufacturer))
goto fail;
- }
-#endif
/* NOTE: all that is done without knowing or caring about
* the network link ... which is unavailable to this code
@@ -808,7 +787,8 @@
* for calling @gether_cleanup() before module unload.
*/
int
-rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
+rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+ u32 vendorID, const char *manufacturer)
{
struct f_rndis *rndis;
int status;
@@ -853,6 +833,8 @@
goto fail;
memcpy(rndis->ethaddr, ethaddr, ETH_ALEN);
+ rndis->vendorID = vendorID;
+ rndis->manufacturer = manufacturer;
/* RNDIS activates when the host changes this filter */
rndis->port.cdc_filter = 0;
@@ -871,11 +853,6 @@
rndis->port.func.setup = rndis_setup;
rndis->port.func.disable = rndis_disable;
-#ifdef CONFIG_USB_ANDROID_RNDIS
- /* start disabled */
- rndis->port.func.disabled = 1;
-#endif
-
status = usb_add_function(c, &rndis->port.func);
if (status) {
kfree(rndis);
@@ -884,54 +861,3 @@
}
return status;
}
-
-#ifdef CONFIG_USB_ANDROID_RNDIS
-#include "rndis.c"
-
-static int rndis_probe(struct platform_device *pdev)
-{
- rndis_pdata = pdev->dev.platform_data;
- return 0;
-}
-
-static struct platform_driver rndis_platform_driver = {
- .driver = { .name = "rndis", },
- .probe = rndis_probe,
-};
-
-int rndis_function_bind_config(struct usb_configuration *c)
-{
- int ret;
-
- if (!rndis_pdata) {
- printk(KERN_ERR "rndis_pdata null in rndis_function_bind_config\n");
- return -1;
- }
-
- printk(KERN_INFO
- "rndis_function_bind_config MAC: %02X:%02X:%02X:%02X:%02X:%02X\n",
- rndis_pdata->ethaddr[0], rndis_pdata->ethaddr[1],
- rndis_pdata->ethaddr[2], rndis_pdata->ethaddr[3],
- rndis_pdata->ethaddr[4], rndis_pdata->ethaddr[5]);
-
- ret = gether_setup(c->cdev->gadget, rndis_pdata->ethaddr);
- if (ret == 0)
- ret = rndis_bind_config(c, rndis_pdata->ethaddr);
- return ret;
-}
-
-static struct android_usb_function rndis_function = {
- .name = "rndis",
- .bind_config = rndis_function_bind_config,
-};
-
-static int __init init(void)
-{
- printk(KERN_INFO "f_rndis init\n");
- platform_driver_register(&rndis_platform_driver);
- android_register_function(&rndis_function);
- return 0;
-}
-module_init(init);
-
-#endif /* CONFIG_USB_ANDROID_RNDIS */