summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>2014-01-23 11:08:57 +0100
committerChanho Park <chanho61.park@samsung.com>2014-03-20 17:43:36 +0900
commit50687ecf9ab2efcc3e818e9feb811043a4a36e1d (patch)
tree0af3b183188df813b7d3278670b221c31b116a08 /drivers/usb
parentff56fa3c66886461295b4eacb97fdbe60ab7a4a3 (diff)
downloadlinux-3.10-50687ecf9ab2efcc3e818e9feb811043a4a36e1d.tar.gz
linux-3.10-50687ecf9ab2efcc3e818e9feb811043a4a36e1d.tar.bz2
linux-3.10-50687ecf9ab2efcc3e818e9feb811043a4a36e1d.zip
usb: gadget: adapt slp to new interface of rndis
f_rndis has a new interface. Use it. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com> Change-Id: I4cd8baf2180cc69fb372c6cce018ecf3a5729a38
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/slp.c54
1 files changed, 35 insertions, 19 deletions
diff --git a/drivers/usb/gadget/slp.c b/drivers/usb/gadget/slp.c
index 06ac80136bd..3ca920255d6 100644
--- a/drivers/usb/gadget/slp.c
+++ b/drivers/usb/gadget/slp.c
@@ -372,14 +372,14 @@ static struct slp_multi_usb_function acm_function = {
.attributes = acm_function_attributes,
};
-#if 0
struct rndis_function_config {
u8 ethaddr[ETH_ALEN];
u32 vendorID;
char manufacturer[256];
bool wceis;
u8 rndis_string_defs0_id;
- struct eth_dev *edev;
+ struct usb_function *f_rndis;
+ struct usb_function_instance *fi_rndis;
};
static char host_addr_string[18];
@@ -393,6 +393,12 @@ static int rndis_function_init(struct slp_multi_usb_function *f,
if (!config)
return -ENOMEM;
+ config->fi_rndis = usb_get_function_instance("rndis");
+ if (IS_ERR(config->fi_rndis)) {
+ status = PTR_ERR(config->fi_rndis);
+ goto rndis_alloc_inst_error;
+ }
+
/* maybe allocate device-global string IDs */
if (rndis_string_defs[0].id == 0) {
@@ -437,13 +443,18 @@ static int rndis_function_init(struct slp_multi_usb_function *f,
return 0;
rndis_init_error:
+ usb_put_function_instance(config->fi_rndis);
+rndis_alloc_inst_error:
kfree(config);
return status;
}
static void rndis_function_cleanup(struct slp_multi_usb_function *f)
{
- kfree(f->config);
+ struct rndis_function_config *rndis = f->config;
+
+ usb_put_function_instance(rndis->fi_rndis);
+ kfree(rndis);
f->config = NULL;
}
@@ -452,19 +463,23 @@ static int rndis_function_bind_config(struct slp_multi_usb_function *f,
{
int ret = -EINVAL;
struct rndis_function_config *rndis = f->config;
+ struct f_rndis_opts *rndis_opts;
+ struct net_device *net;
if (!rndis) {
dev_err(f->dev, "error rndis_pdata is null\n");
return ret;
}
- rndis->edev = gether_setup(c->cdev->gadget, rndis->ethaddr,
- host_addr_string, rndis->ethaddr,
- QMULT_DEFAULT);
- if (IS_ERR(rndis->edev)) {
- dev_err(f->dev, "gether_setup failed\n");
- return ret;
- }
+ rndis_opts =
+ container_of(rndis->fi_rndis, struct f_rndis_opts, func_inst);
+ net = rndis_opts->net;
+
+ gether_set_qmult(net, QMULT_DEFAULT);
+ gether_set_host_addr(net, host_addr_string);
+ gether_set_dev_addr(net, host_addr_string);
+ rndis_opts->vendor_id = rndis->vendorID;
+ rndis_opts->manufacturer = rndis->manufacturer;
if (rndis->wceis) {
/* "Wireless" RNDIS; auto-detected by Windows */
@@ -489,11 +504,13 @@ static int rndis_function_bind_config(struct slp_multi_usb_function *f,
if (rndis_string_defs[0].id == 0)
rndis_string_defs[0].id = rndis->rndis_string_defs0_id;
- ret = rndis_bind_config_vendor(c, rndis->ethaddr, rndis->vendorID,
- rndis->manufacturer, rndis->edev);
- if (ret) {
- rndis_exit();
- gether_cleanup(rndis->edev);
+ rndis->f_rndis = usb_get_function(rndis->fi_rndis);
+ if (IS_ERR(rndis->f_rndis))
+ return PTR_ERR(rndis->f_rndis);
+
+ ret = usb_add_function(c, rndis->f_rndis);
+ if (ret < 0) {
+ usb_put_function(rndis->f_rndis);
dev_err(f->dev, "rndis_bind_config failed(ret:%d)\n", ret);
}
@@ -504,7 +521,8 @@ static void rndis_function_unbind_config(struct slp_multi_usb_function *f,
struct usb_configuration *c)
{
struct rndis_function_config *rndis = f->config;
- gether_cleanup(rndis->edev);
+
+ usb_put_function(rndis->f_rndis);
}
static ssize_t rndis_manufacturer_show(struct device *dev,
@@ -613,16 +631,14 @@ static struct slp_multi_usb_function rndis_function = {
.unbind_config = rndis_function_unbind_config,
.attributes = rndis_function_attributes,
};
-#endif
+
/*-------------------------------------------------------------------------*/
/* Supported functions initialization */
static struct slp_multi_usb_function *supported_functions[] = {
&sdb_function,
&acm_function,
-#if 0
&rndis_function,
-#endif
NULL,
};