usb: gadget: move the global the_dev variable to their users
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Sun, 23 Dec 2012 20:10:12 +0000 (21:10 +0100)
committerFelipe Balbi <balbi@ti.com>
Wed, 3 Apr 2013 11:43:31 +0000 (14:43 +0300)
the u_ether.c file has a global variable named the_dev which keeps a
pointer to the network device after it has been created via
gether_setup_name(). It is only used internally by u_ether. This patches
moves the variable to its users and passes it via the port.ioport where
it is saved later anyway.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Felipe Balbi <balbi@ti.com>
13 files changed:
drivers/usb/gadget/cdc2.c
drivers/usb/gadget/ether.c
drivers/usb/gadget/f_ecm.c
drivers/usb/gadget/f_eem.c
drivers/usb/gadget/f_ncm.c
drivers/usb/gadget/f_rndis.c
drivers/usb/gadget/f_subset.c
drivers/usb/gadget/g_ffs.c
drivers/usb/gadget/multi.c
drivers/usb/gadget/ncm.c
drivers/usb/gadget/nokia.c
drivers/usb/gadget/u_ether.c
drivers/usb/gadget/u_ether.h

index a7d6f70..61023aa 100644 (file)
@@ -103,7 +103,7 @@ static struct usb_gadget_strings *dev_strings[] = {
 };
 
 static u8 hostaddr[ETH_ALEN];
-
+static struct eth_dev *the_dev;
 /*-------------------------------------------------------------------------*/
 static struct usb_function *f_acm;
 static struct usb_function_instance *fi_serial;
@@ -122,7 +122,7 @@ static int __init cdc_do_config(struct usb_configuration *c)
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       status = ecm_bind_config(c, hostaddr);
+       status = ecm_bind_config(c, hostaddr, the_dev);
        if (status < 0)
                return status;
 
@@ -169,9 +169,9 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)
        }
 
        /* set up network link layer */
-       status = gether_setup(cdev->gadget, hostaddr);
-       if (status < 0)
-               return status;
+       the_dev = gether_setup(cdev->gadget, hostaddr);
+       if (IS_ERR(the_dev))
+               return PTR_ERR(the_dev);
 
        /* set up serial link layer */
        status = gserial_alloc_line(&tty_line);
@@ -202,7 +202,7 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)
 fail1:
        gserial_free_line(tty_line);
 fail0:
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return status;
 }
 
@@ -211,7 +211,7 @@ static int __exit cdc_unbind(struct usb_composite_dev *cdev)
        usb_put_function(f_acm);
        usb_put_function_instance(fi_serial);
        gserial_free_line(tty_line);
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return 0;
 }
 
index 18c3f42..56c8eca 100644 (file)
@@ -207,7 +207,7 @@ static struct usb_gadget_strings *dev_strings[] = {
 };
 
 static u8 hostaddr[ETH_ALEN];
-
+static struct eth_dev *the_dev;
 /*-------------------------------------------------------------------------*/
 
 /*
@@ -224,7 +224,7 @@ static int __init rndis_do_config(struct usb_configuration *c)
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       return rndis_bind_config(c, hostaddr);
+       return rndis_bind_config(c, hostaddr, the_dev);
 }
 
 static struct usb_configuration rndis_config_driver = {
@@ -257,11 +257,11 @@ static int __init eth_do_config(struct usb_configuration *c)
        }
 
        if (use_eem)
-               return eem_bind_config(c);
+               return eem_bind_config(c, the_dev);
        else if (can_support_ecm(c->cdev->gadget))
-               return ecm_bind_config(c, hostaddr);
+               return ecm_bind_config(c, hostaddr, the_dev);
        else
-               return geth_bind_config(c, hostaddr);
+               return geth_bind_config(c, hostaddr, the_dev);
 }
 
 static struct usb_configuration eth_config_driver = {
@@ -279,9 +279,9 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
        int                     status;
 
        /* set up network link layer */
-       status = gether_setup(cdev->gadget, hostaddr);
-       if (status < 0)
-               return status;
+       the_dev = gether_setup(cdev->gadget, hostaddr);
+       if (IS_ERR(the_dev))
+               return PTR_ERR(the_dev);
 
        /* set up main config label and device descriptor */
        if (use_eem) {
@@ -338,13 +338,13 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
        return 0;
 
 fail:
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return status;
 }
 
 static int __exit eth_unbind(struct usb_composite_dev *cdev)
 {
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return 0;
 }
 
index 83420a3..d893d69 100644 (file)
@@ -824,7 +824,8 @@ ecm_unbind(struct usb_configuration *c, struct usb_function *f)
  * for calling @gether_cleanup() before module unload.
  */
 int
-ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
+ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev)
 {
        struct f_ecm    *ecm;
        int             status;
@@ -852,6 +853,7 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
        snprintf(ecm->ethaddr, sizeof ecm->ethaddr, "%pm", ethaddr);
        ecm_string_defs[1].s = ecm->ethaddr;
 
+       ecm->port.ioport = dev;
        ecm->port.cdc_filter = DEFAULT_FILTER;
 
        ecm->port.func.name = "cdc_ethernet";
index cf0ebee..f4e0bbe 100644 (file)
@@ -528,7 +528,7 @@ error:
  * Caller must have called @gether_setup().  Caller is also responsible
  * for calling @gether_cleanup() before module unload.
  */
-int __init eem_bind_config(struct usb_configuration *c)
+int __init eem_bind_config(struct usb_configuration *c, struct eth_dev *dev)
 {
        struct f_eem    *eem;
        int             status;
@@ -549,6 +549,7 @@ int __init eem_bind_config(struct usb_configuration *c)
        if (!eem)
                return -ENOMEM;
 
+       eem->port.ioport = dev;
        eem->port.cdc_filter = DEFAULT_FILTER;
 
        eem->port.func.name = "cdc_eem";
index 5e7557e..ee19bc8 100644 (file)
@@ -1287,7 +1287,8 @@ ncm_unbind(struct usb_configuration *c, struct usb_function *f)
  * Caller must have called @gether_setup().  Caller is also responsible
  * for calling @gether_cleanup() before module unload.
  */
-int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
+int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev)
 {
        struct f_ncm    *ncm;
        int             status;
@@ -1321,6 +1322,7 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
 
        spin_lock_init(&ncm->lock);
        ncm_reset_values(ncm);
+       ncm->port.ioport = dev;
        ncm->port.is_fixed = true;
 
        ncm->port.func.name = "cdc_network";
index 71beeb8..970c905 100644 (file)
@@ -814,7 +814,7 @@ static inline bool can_support_rndis(struct usb_configuration *c)
 
 int
 rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
-                               u32 vendorID, const char *manufacturer)
+               u32 vendorID, const char *manufacturer, struct eth_dev *dev)
 {
        struct f_rndis  *rndis;
        int             status;
@@ -847,6 +847,7 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
        rndis->vendorID = vendorID;
        rndis->manufacturer = manufacturer;
 
+       rndis->port.ioport = dev;
        /* RNDIS activates when the host changes this filter */
        rndis->port.cdc_filter = 0;
 
index f172bd1..185d6f5 100644 (file)
@@ -380,7 +380,8 @@ geth_unbind(struct usb_configuration *c, struct usb_function *f)
  * Caller must have called @gether_setup().  Caller is also responsible
  * for calling @gether_cleanup() before module unload.
  */
-int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
+int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev)
 {
        struct f_gether *geth;
        int             status;
@@ -406,6 +407,7 @@ int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
        snprintf(geth->ethaddr, sizeof geth->ethaddr, "%pm", ethaddr);
        geth_string_defs[1].s = geth->ethaddr;
 
+       geth->port.ioport = dev;
        geth->port.cdc_filter = DEFAULT_FILTER;
 
        geth->port.func.name = "cdc_subset";
index 3953dd4..a07dd17 100644 (file)
@@ -13,7 +13,6 @@
 #define pr_fmt(fmt) "g_ffs: " fmt
 
 #include <linux/module.h>
-
 /*
  * kbuild is not very cooperative with respect to linking separately
  * compiled library objects into one module.  So for now we won't use
 #  include "u_ether.c"
 
 static u8 gfs_hostaddr[ETH_ALEN];
+static struct eth_dev *the_dev;
 #  ifdef CONFIG_USB_FUNCTIONFS_ETH
-static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
+static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev);
 #  endif
 #else
-#  define gether_cleanup() do { } while (0)
-#  define gether_setup(gadget, hostaddr)   ((int)0)
+#  define the_dev      NULL
+#  define gether_cleanup(dev) do { } while (0)
 #  define gfs_hostaddr NULL
+struct eth_dev;
 #endif
 
 #include "f_fs.c"
@@ -137,7 +139,8 @@ static struct usb_gadget_strings *gfs_dev_strings[] = {
 
 struct gfs_configuration {
        struct usb_configuration c;
-       int (*eth)(struct usb_configuration *c, u8 *ethaddr);
+       int (*eth)(struct usb_configuration *c, u8 *ethaddr,
+                       struct eth_dev *dev);
 } gfs_configurations[] = {
 #ifdef CONFIG_USB_FUNCTIONFS_RNDIS
        {
@@ -346,10 +349,13 @@ static int gfs_bind(struct usb_composite_dev *cdev)
 
        if (missing_funcs)
                return -ENODEV;
-
-       ret = gether_setup(cdev->gadget, gfs_hostaddr);
-       if (unlikely(ret < 0))
+#if defined CONFIG_USB_FUNCTIONFS_ETH || defined CONFIG_USB_FUNCTIONFS_RNDIS
+       the_dev = gether_setup(cdev->gadget, gfs_hostaddr);
+#endif
+       if (IS_ERR(the_dev)) {
+               ret = PTR_ERR(the_dev);
                goto error_quick;
+       }
        gfs_ether_setup = true;
 
        ret = usb_string_ids_tab(cdev, gfs_strings);
@@ -386,7 +392,7 @@ error_unbind:
        for (i = 0; i < func_num; i++)
                functionfs_unbind(ffs_tab[i].ffs_data);
 error:
-       gether_cleanup();
+       gether_cleanup(the_dev);
 error_quick:
        gfs_ether_setup = false;
        return ret;
@@ -410,7 +416,7 @@ static int gfs_unbind(struct usb_composite_dev *cdev)
         * do...?
         */
        if (gfs_ether_setup)
-               gether_cleanup();
+               gether_cleanup(the_dev);
        gfs_ether_setup = false;
 
        for (i = func_num; --i; )
@@ -440,7 +446,7 @@ static int gfs_do_config(struct usb_configuration *c)
        }
 
        if (gc->eth) {
-               ret = gc->eth(c, gfs_hostaddr);
+               ret = gc->eth(c, gfs_hostaddr, the_dev);
                if (unlikely(ret < 0))
                        return ret;
        }
@@ -469,11 +475,12 @@ static int gfs_do_config(struct usb_configuration *c)
 
 #ifdef CONFIG_USB_FUNCTIONFS_ETH
 
-static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
+static int eth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev)
 {
        return can_support_ecm(c->cdev->gadget)
-               ? ecm_bind_config(c, ethaddr)
-               : geth_bind_config(c, ethaddr);
+               ? ecm_bind_config(c, ethaddr, dev)
+               : geth_bind_config(c, ethaddr, dev);
 }
 
 #endif
index 20bbbf9..3442755 100644 (file)
@@ -137,6 +137,7 @@ static u8 hostaddr[ETH_ALEN];
 
 static unsigned char tty_line;
 static struct usb_function_instance *fi_acm;
+static struct eth_dev *the_dev;
 
 /********** RNDIS **********/
 
@@ -152,7 +153,7 @@ static __init int rndis_do_config(struct usb_configuration *c)
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       ret = rndis_bind_config(c, hostaddr);
+       ret = rndis_bind_config(c, hostaddr, the_dev);
        if (ret < 0)
                return ret;
 
@@ -214,7 +215,7 @@ static __init int cdc_do_config(struct usb_configuration *c)
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       ret = ecm_bind_config(c, hostaddr);
+       ret = ecm_bind_config(c, hostaddr, the_dev);
        if (ret < 0)
                return ret;
 
@@ -279,9 +280,9 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
        }
 
        /* set up network link layer */
-       status = gether_setup(cdev->gadget, hostaddr);
-       if (status < 0)
-               return status;
+       the_dev = gether_setup(cdev->gadget, hostaddr);
+       if (IS_ERR(the_dev))
+               return PTR_ERR(the_dev);
 
        /* set up serial link layer */
        status = gserial_alloc_line(&tty_line);
@@ -337,7 +338,7 @@ fail1:
 fail0dot5:
        gserial_free_line(tty_line);
 fail0:
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return status;
 }
 
@@ -351,7 +352,7 @@ static int __exit multi_unbind(struct usb_composite_dev *cdev)
 #endif
        usb_put_function_instance(fi_acm);
        gserial_free_line(tty_line);
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return 0;
 }
 
index a22ad9a..3b02fd4 100644 (file)
@@ -111,6 +111,7 @@ static struct usb_gadget_strings *dev_strings[] = {
        NULL,
 };
 
+struct eth_dev *the_dev;
 static u8 hostaddr[ETH_ALEN];
 
 /*-------------------------------------------------------------------------*/
@@ -124,7 +125,7 @@ static int __init ncm_do_config(struct usb_configuration *c)
                c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
        }
 
-       return ncm_bind_config(c, hostaddr);
+       return ncm_bind_config(c, hostaddr, the_dev);
 }
 
 static struct usb_configuration ncm_config_driver = {
@@ -143,9 +144,9 @@ static int __init gncm_bind(struct usb_composite_dev *cdev)
        int                     status;
 
        /* set up network link layer */
-       status = gether_setup(cdev->gadget, hostaddr);
-       if (status < 0)
-               return status;
+       the_dev = gether_setup(cdev->gadget, hostaddr);
+       if (IS_ERR(the_dev))
+               return PTR_ERR(the_dev);
 
        /* Allocate string descriptor numbers ... note that string
         * contents can be overridden by the composite_dev glue.
@@ -168,13 +169,13 @@ static int __init gncm_bind(struct usb_composite_dev *cdev)
        return 0;
 
 fail:
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return status;
 }
 
 static int __exit gncm_unbind(struct usb_composite_dev *cdev)
 {
-       gether_cleanup();
+       gether_cleanup(the_dev);
        return 0;
 }
 
index c3ad777..0c13ddd 100644 (file)
@@ -99,6 +99,7 @@ MODULE_LICENSE("GPL");
 static struct usb_function *f_acm_cfg1;
 static struct usb_function *f_acm_cfg2;
 static u8 hostaddr[ETH_ALEN];
+static struct eth_dev *the_dev;
 
 enum {
        TTY_PORT_OBEX0,
@@ -152,7 +153,7 @@ static int __init nokia_bind_config(struct usb_configuration *c)
        if (status)
                goto err_conf;
 
-       status = ecm_bind_config(c, hostaddr);
+       status = ecm_bind_config(c, hostaddr, the_dev);
        if (status) {
                pr_debug("could not bind ecm config %d\n", status);
                goto err_ecm;
@@ -187,9 +188,11 @@ static int __init nokia_bind(struct usb_composite_dev *cdev)
                        goto err_ether;
        }
 
-       status = gether_setup(cdev->gadget, hostaddr);
-       if (status < 0)
+       the_dev = gether_setup(cdev->gadget, hostaddr);
+       if (IS_ERR(the_dev)) {
+               status = PTR_ERR(the_dev);
                goto err_ether;
+       }
 
        status = usb_string_ids_tab(cdev, strings_dev);
        if (status < 0)
@@ -230,7 +233,7 @@ err_put_cfg1:
 err_acm_inst:
        usb_put_function_instance(fi_acm);
 err_usb:
-       gether_cleanup();
+       gether_cleanup(the_dev);
 err_ether:
        cur_line--;
        while (cur_line >= 0)
@@ -253,7 +256,7 @@ static int __exit nokia_unbind(struct usb_composite_dev *cdev)
        for (i = 0; i < TTY_PORTS_MAX; i++)
                gserial_free_line(tty_lines[i]);
 
-       gether_cleanup();
+       gether_cleanup(the_dev);
 
        return 0;
 }
index a0aa721..4b76124 100644 (file)
@@ -50,7 +50,6 @@
 
 struct eth_dev {
        /* lock is held while accessing port_usb
-        * or updating its backlink port_usb->ioport
         */
        spinlock_t              lock;
        struct gether           *port_usb;
@@ -729,8 +728,6 @@ static int get_ether_addr(const char *str, u8 *dev_addr)
        return 1;
 }
 
-static struct eth_dev *the_dev;
-
 static const struct net_device_ops eth_netdev_ops = {
        .ndo_open               = eth_open,
        .ndo_stop               = eth_stop,
@@ -758,19 +755,16 @@ static struct device_type gadget_type = {
  *
  * Returns negative errno, or zero on success
  */
-int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
+struct eth_dev *gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
                const char *netname)
 {
        struct eth_dev          *dev;
        struct net_device       *net;
        int                     status;
 
-       if (the_dev)
-               return -EBUSY;
-
        net = alloc_etherdev(sizeof *dev);
        if (!net)
-               return -ENOMEM;
+               return ERR_PTR(-ENOMEM);
 
        dev = netdev_priv(net);
        spin_lock_init(&dev->lock);
@@ -807,12 +801,11 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
        if (status < 0) {
                dev_dbg(&g->dev, "register_netdev failed, %d\n", status);
                free_netdev(net);
+               dev = ERR_PTR(status);
        } else {
                INFO(dev, "MAC %pM\n", net->dev_addr);
                INFO(dev, "HOST MAC %pM\n", dev->host_mac);
 
-               the_dev = dev;
-
                /* two kinds of host-initiated state changes:
                 *  - iff DATA transfer is active, carrier is "on"
                 *  - tx queueing enabled if open *and* carrier is "on"
@@ -820,7 +813,7 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
                netif_carrier_off(net);
        }
 
-       return status;
+       return dev;
 }
 
 /**
@@ -829,19 +822,16 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
  *
  * This is called to free all resources allocated by @gether_setup().
  */
-void gether_cleanup(void)
+void gether_cleanup(struct eth_dev *dev)
 {
-       if (!the_dev)
+       if (!dev)
                return;
 
-       unregister_netdev(the_dev->net);
-       flush_work(&the_dev->work);
-       free_netdev(the_dev->net);
-
-       the_dev = NULL;
+       unregister_netdev(dev->net);
+       flush_work(&dev->work);
+       free_netdev(dev->net);
 }
 
-
 /**
  * gether_connect - notify network layer that USB link is active
  * @link: the USB link, set up with endpoints, descriptors matching
@@ -860,7 +850,7 @@ void gether_cleanup(void)
  */
 struct net_device *gether_connect(struct gether *link)
 {
-       struct eth_dev          *dev = the_dev;
+       struct eth_dev          *dev = link->ioport;
        int                     result = 0;
 
        if (!dev)
@@ -895,7 +885,6 @@ struct net_device *gether_connect(struct gether *link)
 
                spin_lock(&dev->lock);
                dev->port_usb = link;
-               link->ioport = dev;
                if (netif_running(dev->net)) {
                        if (link->open)
                                link->open(link);
@@ -989,6 +978,5 @@ void gether_disconnect(struct gether *link)
 
        spin_lock(&dev->lock);
        dev->port_usb = NULL;
-       link->ioport = NULL;
        spin_unlock(&dev->lock);
 }
index 6f4a162..0252233 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "gadget_chips.h"
 
+struct eth_dev;
 
 /*
  * This represents the USB side of an "ethernet" link, managed by a USB
@@ -70,7 +71,7 @@ struct gether {
                        |USB_CDC_PACKET_TYPE_DIRECTED)
 
 /* variant of gether_setup that allows customizing network device name */
-int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
+struct eth_dev *gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
                const char *netname);
 
 /* netdev setup/teardown as directed by the gadget driver */
@@ -86,12 +87,13 @@ int gether_setup_name(struct usb_gadget *g, u8 ethaddr[ETH_ALEN],
  *
  * Returns negative errno, or zero on success
  */
-static inline int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN])
+static inline struct eth_dev *gether_setup(struct usb_gadget *g,
+               u8 ethaddr[ETH_ALEN])
 {
        return gether_setup_name(g, ethaddr, "usb");
 }
 
-void gether_cleanup(void);
+void gether_cleanup(struct eth_dev *dev);
 
 /* connect/disconnect is handled by individual functions */
 struct net_device *gether_connect(struct gether *);
@@ -111,21 +113,24 @@ static inline bool can_support_ecm(struct usb_gadget *gadget)
 }
 
 /* each configuration may bind one instance of an ethernet link */
-int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
-int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
-int ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]);
-int eem_bind_config(struct usb_configuration *c);
+int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev);
+int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev);
+int ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
+               struct eth_dev *dev);
+int eem_bind_config(struct usb_configuration *c, struct eth_dev *dev);
 
 #ifdef USB_ETH_RNDIS
 
 int rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
-                               u32 vendorID, const char *manufacturer);
+               u32 vendorID, const char *manufacturer, struct eth_dev *dev);
 
 #else
 
 static inline int
 rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
-                               u32 vendorID, const char *manufacturer)
+               u32 vendorID, const char *manufacturer, struct eth_dev *dev)
 {
        return 0;
 }
@@ -145,9 +150,9 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
  * for calling @gether_cleanup() before module unload.
  */
 static inline int rndis_bind_config(struct usb_configuration *c,
-                                   u8 ethaddr[ETH_ALEN])
+               u8 ethaddr[ETH_ALEN], struct eth_dev *dev)
 {
-       return rndis_bind_config_vendor(c, ethaddr, 0, NULL);
+       return rndis_bind_config_vendor(c, ethaddr, 0, NULL, dev);
 }