diff options
author | Mike Lockwood <lockwood@android.com> | 2010-03-10 17:05:03 -0500 |
---|---|---|
committer | Brian Swetland <swetland@google.com> | 2011-03-29 13:57:43 -0700 |
commit | ccff42d1c99d932082ffb972590e1af312c84e5c (patch) | |
tree | 8f8000b6858add752b5686fccf341e1a50066d61 | |
parent | ed0e55ce40a01b7187332923f9bce7923d8578d3 (diff) |
USB: gadget: f_rndis: Add platform data for RNDIS vendor ID and MAC address.
This fixes a kernel panic in rndis.c when receiving the
OID_GEN_VENDOR_DESCRIPTION command.
Signed-off-by: Mike Lockwood <lockwood@android.com>
-rw-r--r-- | drivers/usb/gadget/f_rndis.c | 46 | ||||
-rw-r--r-- | include/linux/usb/android_composite.h | 8 |
2 files changed, 44 insertions, 10 deletions
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 20a25ff1f2ae..d83f79ecae2e 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c @@ -26,7 +26,7 @@ #include <linux/slab.h> #include <linux/kernel.h> -#include <linux/device.h> +#include <linux/platform_device.h> #include <linux/etherdevice.h> #include <linux/usb/android_composite.h> @@ -312,6 +312,10 @@ static struct usb_gadget_strings *rndis_strings[] = { 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, @@ -715,11 +719,12 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) rndis_set_param_medium(rndis->config, NDIS_MEDIUM_802_3, 0); rndis_set_host_mac(rndis->config, rndis->ethaddr); -#if 0 -// FIXME - if (rndis_set_param_vendor(rndis->config, vendorID, - manufacturer)) - goto fail0; +#ifdef CONFIG_USB_ANDROID_RNDIS + if (rndis_pdata) { + if (rndis_set_param_vendor(rndis->config, rndis_pdata->vendorID, + rndis_pdata->vendorDescr)) + goto fail; + } #endif /* NOTE: all that is done without knowing or caring about @@ -875,15 +880,35 @@ fail: #ifdef CONFIG_USB_ANDROID_RNDIS #include "rndis.c" -// FIXME - using bogus MAC address for now +static int __init rndis_probe(struct platform_device *pdev) +{ + rndis_pdata = pdev->dev.platform_data; + return 0; +} -static u8 ethaddr[ETH_ALEN] = { 11, 22, 33, 44, 55, 66 }; +static struct platform_driver rndis_platform_driver = { + .driver = { .name = "rndis", }, + .probe = rndis_probe, +}; int rndis_function_bind_config(struct usb_configuration *c) { - int ret = gether_setup(c->cdev->gadget, ethaddr); + 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, ethaddr); + ret = rndis_bind_config(c, rndis_pdata->ethaddr); return ret; } @@ -895,6 +920,7 @@ static struct android_usb_function rndis_function = { 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; } diff --git a/include/linux/usb/android_composite.h b/include/linux/usb/android_composite.h index 328016813dd5..50889ba138b9 100644 --- a/include/linux/usb/android_composite.h +++ b/include/linux/usb/android_composite.h @@ -18,6 +18,7 @@ #define __LINUX_USB_ANDROID_H #include <linux/usb/composite.h> +#include <linux/if_ether.h> struct android_usb_function { struct list_head list; @@ -80,6 +81,13 @@ struct usb_mass_storage_platform_data { int nluns; }; +/* Platform data for USB ethernet driver. */ +struct usb_ether_platform_data { + u8 ethaddr[ETH_ALEN]; + u32 vendorID; + const char *vendorDescr; +}; + extern void android_usb_set_connected(int on); extern void android_register_function(struct android_usb_function *f); |