summaryrefslogtreecommitdiff
path: root/patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch')
-rw-r--r--patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch203
1 files changed, 203 insertions, 0 deletions
diff --git a/patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch b/patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch
new file mode 100644
index 00000000000..5ad237794bb
--- /dev/null
+++ b/patches.tizen/1143-usb-gadget-multi-convert-to-new-interface-of-f_rndis.patch
@@ -0,0 +1,203 @@
+From 79aecf18905e9a86347c1540ebd23aa8cc157024 Mon Sep 17 00:00:00 2001
+From: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
+Date: Wed, 9 Oct 2013 10:08:26 +0200
+Subject: [PATCH 1143/1302] usb: gadget: multi: convert to new interface of
+ f_rndis
+
+Convert the legacy multi gadget to the new interface of f_rndis,
+so that later the compatibility layer in f_rndis can be removed.
+
+Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
+Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
+Signed-off-by: Felipe Balbi <balbi@ti.com>
+Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
+---
+ drivers/usb/gadget/Kconfig | 3 +-
+ drivers/usb/gadget/multi.c | 73 +++++++++++++++++++++++++++++++---------------
+ 2 files changed, 52 insertions(+), 24 deletions(-)
+
+diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
+index 33ba3ec..9a67faf 100644
+--- a/drivers/usb/gadget/Kconfig
++++ b/drivers/usb/gadget/Kconfig
+@@ -1060,7 +1060,6 @@ config USB_G_MULTI
+ select USB_LIBCOMPOSITE
+ select USB_U_SERIAL
+ select USB_U_ETHER
+- select USB_U_RNDIS
+ select USB_F_ACM
+ select USB_U_MS
+ help
+@@ -1081,6 +1080,8 @@ config USB_G_MULTI
+ config USB_G_MULTI_RNDIS
+ bool "RNDIS + CDC Serial + Storage configuration"
+ depends on USB_G_MULTI
++ select USB_U_RNDIS
++ select USB_F_RNDIS
+ default y
+ help
+ This option enables a configuration with RNDIS, CDC Serial and
+diff --git a/drivers/usb/gadget/multi.c b/drivers/usb/gadget/multi.c
+index 7dd5544..fceef0f 100644
+--- a/drivers/usb/gadget/multi.c
++++ b/drivers/usb/gadget/multi.c
+@@ -47,8 +47,7 @@ MODULE_LICENSE("GPL");
+
+ #include "u_ecm.h"
+ #ifdef USB_ETH_RNDIS
+-# define USB_FRNDIS_INCLUDED
+-# include "f_rndis.c"
++# include "u_rndis.h"
+ # include "rndis.h"
+ #endif
+ #include "u_ether.h"
+@@ -152,14 +151,13 @@ FSG_MODULE_PARAMETERS(/* no prefix */, fsg_mod_data);
+ static struct fsg_common fsg_common;
+
+ static struct usb_function_instance *fi_acm;
+-static struct eth_dev *the_dev;
+
+ /********** RNDIS **********/
+
+ #ifdef USB_ETH_RNDIS
+-static u8 host_mac[ETH_ALEN];
+-
++static struct usb_function_instance *fi_rndis;
+ static struct usb_function *f_acm_rndis;
++static struct usb_function *f_rndis;
+
+ static __init int rndis_do_config(struct usb_configuration *c)
+ {
+@@ -170,13 +168,19 @@ static __init int rndis_do_config(struct usb_configuration *c)
+ c->bmAttributes |= USB_CONFIG_ATT_WAKEUP;
+ }
+
+- ret = rndis_bind_config(c, host_mac, the_dev);
++ f_rndis = usb_get_function(fi_rndis);
++ if (IS_ERR(f_rndis))
++ return PTR_ERR(f_rndis);
++
++ ret = usb_add_function(c, f_rndis);
+ if (ret < 0)
+- return ret;
++ goto err_func_rndis;
+
+ f_acm_rndis = usb_get_function(fi_acm);
+- if (IS_ERR(f_acm_rndis))
+- return PTR_ERR(f_acm_rndis);
++ if (IS_ERR(f_acm_rndis)) {
++ ret = PTR_ERR(f_acm_rndis);
++ goto err_func_acm;
++ }
+
+ ret = usb_add_function(c, f_acm_rndis);
+ if (ret)
+@@ -191,6 +195,10 @@ err_fsg:
+ usb_remove_function(c, f_acm_rndis);
+ err_conf:
+ usb_put_function(f_acm_rndis);
++err_func_acm:
++ usb_remove_function(c, f_rndis);
++err_func_rndis:
++ usb_put_function(f_rndis);
+ return ret;
+ }
+
+@@ -300,11 +308,14 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
+ #ifdef CONFIG_USB_G_MULTI_CDC
+ struct f_ecm_opts *ecm_opts;
+ #endif
++#ifdef USB_ETH_RNDIS
++ struct f_rndis_opts *rndis_opts;
++#endif
+ int status;
+
+ if (!can_support_ecm(cdev->gadget)) {
+ dev_err(&gadget->dev, "controller '%s' not usable\n",
+- gadget->name);
++ gadget->name);
+ return -EINVAL;
+ }
+
+@@ -320,26 +331,38 @@ static int __ref multi_bind(struct usb_composite_dev *cdev)
+ pr_info("using host ethernet address: %s", host_addr);
+ if (!gether_set_dev_addr(ecm_opts->net, dev_addr))
+ pr_info("using self ethernet address: %s", dev_addr);
++#endif
+
+- the_dev = netdev_priv(ecm_opts->net);
++#ifdef USB_ETH_RNDIS
++ fi_rndis = usb_get_function_instance("rndis");
++ if (IS_ERR(fi_rndis)) {
++ status = PTR_ERR(fi_rndis);
++ goto fail;
++ }
+
+-#elif defined USB_ETH_RNDIS
++ rndis_opts = container_of(fi_rndis, struct f_rndis_opts, func_inst);
+
+- /* set up network link layer */
+- the_dev = gether_setup(cdev->gadget, dev_addr, host_addr, host_mac,
+- qmult);
+- if (IS_ERR(the_dev))
+- return PTR_ERR(the_dev);
++ gether_set_qmult(rndis_opts->net, qmult);
++ if (!gether_set_host_addr(rndis_opts->net, host_addr))
++ pr_info("using host ethernet address: %s", host_addr);
++ if (!gether_set_dev_addr(rndis_opts->net, dev_addr))
++ pr_info("using self ethernet address: %s", dev_addr);
+ #endif
+
+ #if (defined CONFIG_USB_G_MULTI_CDC && defined USB_ETH_RNDIS)
++ /*
++ * If both ecm and rndis are selected then:
++ * 1) rndis borrows the net interface from ecm
++ * 2) since the interface is shared it must not be bound
++ * twice - in ecm's _and_ rndis' binds, so do it here.
++ */
+ gether_set_gadget(ecm_opts->net, cdev->gadget);
+ status = gether_register_netdev(ecm_opts->net);
+ if (status)
+ goto fail0;
+- ecm_opts->bound = true;
+
+- gether_get_host_addr_u8(ecm_opts->net, host_mac);
++ rndis_borrow_net(fi_rndis, ecm_opts->net);
++ ecm_opts->bound = true;
+ #endif
+
+ /* set up serial link layer */
+@@ -388,10 +411,12 @@ fail2:
+ fail1:
+ usb_put_function_instance(fi_acm);
+ fail0:
++#ifdef USB_ETH_RNDIS
++ usb_put_function_instance(fi_rndis);
++fail:
++#endif
+ #ifdef CONFIG_USB_G_MULTI_CDC
+ usb_put_function_instance(fi_ecm);
+-#else
+- gether_cleanup(the_dev);
+ #endif
+ return status;
+ }
+@@ -405,11 +430,13 @@ static int __exit multi_unbind(struct usb_composite_dev *cdev)
+ usb_put_function(f_acm_rndis);
+ #endif
+ usb_put_function_instance(fi_acm);
++#ifdef USB_ETH_RNDIS
++ usb_put_function(f_rndis);
++ usb_put_function_instance(fi_rndis);
++#endif
+ #ifdef CONFIG_USB_G_MULTI_CDC
+ usb_put_function(f_ecm);
+ usb_put_function_instance(fi_ecm);
+-#else
+- gether_cleanup(the_dev);
+ #endif
+ return 0;
+ }
+--
+1.8.3.2
+