Commit 83210e59 authored by Andrzej Pietrasiewicz's avatar Andrzej Pietrasiewicz Committed by Felipe Balbi

usb: gadget: rndis: use rndis_params instead of configNr

RNDIS function has a limitation on the number of allowed instances.
So far it has been RNDIS_MAX_CONFIGS, which happens to be one.
In order to eliminate this kind of arbitrary limitation we should not
preallocate a predefined (RNDIS_MAX_CONFIGS) array of struct rndis_params
instances but instead allow allocating them on demand.

This patch prepares the elimination of the said limit by converting all the
functions which accept rndis config number to accept a pointer to the
actual struct rndis_params. Consequently, rndis_register() returns
a pointer to a corresponding struct rndis_params instance. The pointer
is then always used by f_rndis.c instead of config number when it talks
to rndis.c API.

A nice side-effect of the changes is that many lines of code in rndis.c
become shorter and fit in 80 columns.

If a function prototype changes in rndis.h a style cleanup is made
at the same time, otherwise checkpatch complains that the patch
has style problems.
Signed-off-by: default avatarAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent d74c23d3
...@@ -76,7 +76,7 @@ struct f_rndis { ...@@ -76,7 +76,7 @@ struct f_rndis {
u8 ethaddr[ETH_ALEN]; u8 ethaddr[ETH_ALEN];
u32 vendorID; u32 vendorID;
const char *manufacturer; const char *manufacturer;
int config; struct rndis_params *params;
struct usb_ep *notify; struct usb_ep *notify;
struct usb_request *notify_req; struct usb_request *notify_req;
...@@ -453,7 +453,7 @@ static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req) ...@@ -453,7 +453,7 @@ static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
/* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
// spin_lock(&dev->lock); // spin_lock(&dev->lock);
status = rndis_msg_parser(rndis->config, (u8 *) req->buf); status = rndis_msg_parser(rndis->params, (u8 *) req->buf);
if (status < 0) if (status < 0)
pr_err("RNDIS command error %d, %d/%d\n", pr_err("RNDIS command error %d, %d/%d\n",
status, req->actual, req->length); status, req->actual, req->length);
...@@ -499,12 +499,12 @@ rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) ...@@ -499,12 +499,12 @@ rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
u32 n; u32 n;
/* return the result */ /* return the result */
buf = rndis_get_next_response(rndis->config, &n); buf = rndis_get_next_response(rndis->params, &n);
if (buf) { if (buf) {
memcpy(req->buf, buf, n); memcpy(req->buf, buf, n);
req->complete = rndis_response_complete; req->complete = rndis_response_complete;
req->context = rndis; req->context = rndis;
rndis_free_response(rndis->config, buf); rndis_free_response(rndis->params, buf);
value = n; value = n;
} }
/* else stalls ... spec says to avoid that */ /* else stalls ... spec says to avoid that */
...@@ -597,7 +597,7 @@ static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt) ...@@ -597,7 +597,7 @@ static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
if (IS_ERR(net)) if (IS_ERR(net))
return PTR_ERR(net); return PTR_ERR(net);
rndis_set_param_dev(rndis->config, net, rndis_set_param_dev(rndis->params, net,
&rndis->port.cdc_filter); &rndis->port.cdc_filter);
} else } else
goto fail; goto fail;
...@@ -617,7 +617,7 @@ static void rndis_disable(struct usb_function *f) ...@@ -617,7 +617,7 @@ static void rndis_disable(struct usb_function *f)
DBG(cdev, "rndis deactivated\n"); DBG(cdev, "rndis deactivated\n");
rndis_uninit(rndis->config); rndis_uninit(rndis->params);
gether_disconnect(&rndis->port); gether_disconnect(&rndis->port);
usb_ep_disable(rndis->notify); usb_ep_disable(rndis->notify);
...@@ -640,9 +640,9 @@ static void rndis_open(struct gether *geth) ...@@ -640,9 +640,9 @@ static void rndis_open(struct gether *geth)
DBG(cdev, "%s\n", __func__); DBG(cdev, "%s\n", __func__);
rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3,
bitrate(cdev->gadget) / 100); bitrate(cdev->gadget) / 100);
rndis_signal_connect(rndis->config); rndis_signal_connect(rndis->params);
} }
static void rndis_close(struct gether *geth) static void rndis_close(struct gether *geth)
...@@ -651,8 +651,8 @@ static void rndis_close(struct gether *geth) ...@@ -651,8 +651,8 @@ static void rndis_close(struct gether *geth)
DBG(geth->func.config->cdev, "%s\n", __func__); DBG(geth->func.config->cdev, "%s\n", __func__);
rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 0); rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
rndis_signal_disconnect(rndis->config); rndis_signal_disconnect(rndis->params);
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -796,11 +796,11 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f) ...@@ -796,11 +796,11 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
rndis->port.open = rndis_open; rndis->port.open = rndis_open;
rndis->port.close = rndis_close; rndis->port.close = rndis_close;
rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 0); rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
rndis_set_host_mac(rndis->config, rndis->ethaddr); rndis_set_host_mac(rndis->params, rndis->ethaddr);
if (rndis->manufacturer && rndis->vendorID && if (rndis->manufacturer && rndis->vendorID &&
rndis_set_param_vendor(rndis->config, rndis->vendorID, rndis_set_param_vendor(rndis->params, rndis->vendorID,
rndis->manufacturer)) { rndis->manufacturer)) {
status = -EINVAL; status = -EINVAL;
goto fail_free_descs; goto fail_free_descs;
...@@ -944,7 +944,7 @@ static void rndis_free(struct usb_function *f) ...@@ -944,7 +944,7 @@ static void rndis_free(struct usb_function *f)
struct f_rndis_opts *opts; struct f_rndis_opts *opts;
rndis = func_to_rndis(f); rndis = func_to_rndis(f);
rndis_deregister(rndis->config); rndis_deregister(rndis->params);
opts = container_of(f->fi, struct f_rndis_opts, func_inst); opts = container_of(f->fi, struct f_rndis_opts, func_inst);
kfree(rndis); kfree(rndis);
mutex_lock(&opts->lock); mutex_lock(&opts->lock);
...@@ -968,7 +968,7 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi) ...@@ -968,7 +968,7 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
{ {
struct f_rndis *rndis; struct f_rndis *rndis;
struct f_rndis_opts *opts; struct f_rndis_opts *opts;
int status; struct rndis_params *params;
/* allocate and initialize one new instance */ /* allocate and initialize one new instance */
rndis = kzalloc(sizeof(*rndis), GFP_KERNEL); rndis = kzalloc(sizeof(*rndis), GFP_KERNEL);
...@@ -1002,12 +1002,12 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi) ...@@ -1002,12 +1002,12 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
rndis->port.func.disable = rndis_disable; rndis->port.func.disable = rndis_disable;
rndis->port.func.free_func = rndis_free; rndis->port.func.free_func = rndis_free;
status = rndis_register(rndis_response_available, rndis); params = rndis_register(rndis_response_available, rndis);
if (status < 0) { if (IS_ERR(params)) {
kfree(rndis); kfree(rndis);
return ERR_PTR(status); return ERR_CAST(params);
} }
rndis->config = status; rndis->params = params;
return &rndis->port.func; return &rndis->port.func;
} }
......
This diff is collapsed.
...@@ -197,24 +197,25 @@ typedef struct rndis_params ...@@ -197,24 +197,25 @@ typedef struct rndis_params
} rndis_params; } rndis_params;
/* RNDIS Message parser and other useless functions */ /* RNDIS Message parser and other useless functions */
int rndis_msg_parser (u8 configNr, u8 *buf); int rndis_msg_parser(struct rndis_params *params, u8 *buf);
int rndis_register(void (*resp_avail)(void *v), void *v); struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
void rndis_deregister (int configNr); void rndis_deregister(struct rndis_params *params);
int rndis_set_param_dev (u8 configNr, struct net_device *dev, int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
u16 *cdc_filter); u16 *cdc_filter);
int rndis_set_param_vendor (u8 configNr, u32 vendorID, int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
const char *vendorDescr); const char *vendorDescr);
int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); int rndis_set_param_medium(struct rndis_params *params, u32 medium,
u32 speed);
void rndis_add_hdr (struct sk_buff *skb); void rndis_add_hdr (struct sk_buff *skb);
int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
struct sk_buff_head *list); struct sk_buff_head *list);
u8 *rndis_get_next_response (int configNr, u32 *length); u8 *rndis_get_next_response(struct rndis_params *params, u32 *length);
void rndis_free_response (int configNr, u8 *buf); void rndis_free_response(struct rndis_params *params, u8 *buf);
void rndis_uninit (int configNr); void rndis_uninit(struct rndis_params *params);
int rndis_signal_connect (int configNr); int rndis_signal_connect(struct rndis_params *params);
int rndis_signal_disconnect (int configNr); int rndis_signal_disconnect(struct rndis_params *params);
int rndis_state (int configNr); int rndis_state(struct rndis_params *params);
extern void rndis_set_host_mac (int configNr, const u8 *addr); extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
#endif /* _LINUX_RNDIS_H */ #endif /* _LINUX_RNDIS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment