Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2303700e authored by Ajay Agarwal's avatar Ajay Agarwal Committed by Gerrit - the friendly Code Review server
Browse files

Revert "usb: gadget: f_ncm: allocate/free net device upon driver bind/unbind"



This reverts commit ff25c3b17479ae7101074f8b887e890eaa68a94e.

Move back the allocation of netdevice to alloc_inst(), one-time
registration to bind(), deregistration and free to rm_inst(). The
UI update issue will be taken up with proper stakeholders.

Change-Id: I56448b08f6796a43ec5b0dfe0dd2d42cdc0eec14
Signed-off-by: default avatarAjay Agarwal <ajaya@codeaurora.org>
parent 63eed8e7
Loading
Loading
Loading
Loading
+25 −35
Original line number Diff line number Diff line
@@ -1432,39 +1432,17 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
	 */
	if (!ncm_opts->bound) {
		mutex_lock(&ncm_opts->lock);
		ncm_opts->net = gether_setup_default();
		if (IS_ERR(ncm_opts->net)) {
			status = PTR_ERR(ncm_opts->net);
			mutex_unlock(&ncm_opts->lock);
			goto error;
		}
		gether_set_gadget(ncm_opts->net, cdev->gadget);
		status = gether_register_netdev(ncm_opts->net);
		mutex_unlock(&ncm_opts->lock);
		if (status) {
			free_netdev(ncm_opts->net);
			goto error;
		}
		if (status)
			return status;
		ncm_opts->bound = true;
	}

	/* export host's Ethernet address in CDC format */
	status = gether_get_host_addr_cdc(ncm_opts->net, ncm->ethaddr,
				      sizeof(ncm->ethaddr));
	if (status < 12) { /* strlen("01234567890a") */
		ERROR(cdev, "%s: failed to get host eth addr, err %d\n",
		__func__, status);
		status = -EINVAL;
		goto netdev_cleanup;
	}
	ncm->port.ioport = netdev_priv(ncm_opts->net);

	us = usb_gstrings_attach(cdev, ncm_strings,
				 ARRAY_SIZE(ncm_string_defs));
	if (IS_ERR(us)) {
		status = PTR_ERR(us);
		goto netdev_cleanup;
	}
	if (IS_ERR(us))
		return PTR_ERR(us);
	ncm_control_intf.iInterface = us[STRING_CTRL_IDX].id;
	ncm_data_nop_intf.iInterface = us[STRING_DATA_IDX].id;
	ncm_data_intf.iInterface = us[STRING_DATA_IDX].id;
@@ -1566,10 +1544,7 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f)
		kfree(ncm->notify_req->buf);
		usb_ep_free_request(ncm->notify, ncm->notify_req);
	}
netdev_cleanup:
	gether_cleanup(netdev_priv(ncm_opts->net));

error:
	ERROR(cdev, "%s: can't bind, err %d\n", f->name, status);

	return status;
@@ -1665,6 +1640,8 @@ static void ncm_free_inst(struct usb_function_instance *f)
	opts = container_of(f, struct f_ncm_opts, func_inst);
	if (opts->bound)
		gether_cleanup(netdev_priv(opts->net));
	else
		free_netdev(opts->net);
	kfree(opts);
}

@@ -1677,6 +1654,13 @@ static struct usb_function_instance *ncm_alloc_inst(void)
		return ERR_PTR(-ENOMEM);
	mutex_init(&opts->lock);
	opts->func_inst.free_func_inst = ncm_free_inst;
	opts->net = gether_setup_default();
	if (IS_ERR(opts->net)) {
		struct net_device *net = opts->net;

		kfree(opts);
		return ERR_CAST(net);
	}

	config_group_init_type_name(&opts->func_inst.group, "", &ncm_func_type);

@@ -1707,13 +1691,9 @@ static void ncm_free(struct usb_function *f)
static void ncm_unbind(struct usb_configuration *c, struct usb_function *f)
{
	struct f_ncm *ncm = func_to_ncm(f);
	struct f_ncm_opts *opts = container_of(f->fi, struct f_ncm_opts,
					func_inst);

	DBG(c->cdev, "ncm unbind\n");

	opts->bound = false;

	hrtimer_cancel(&ncm->task_timer);
	tasklet_kill(&ncm->tx_tasklet);

@@ -1727,14 +1707,13 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f)

	kfree(ncm->notify_req->buf);
	usb_ep_free_request(ncm->notify, ncm->notify_req);

	gether_cleanup(netdev_priv(opts->net));
}

static struct usb_function *ncm_alloc(struct usb_function_instance *fi)
{
	struct f_ncm		*ncm;
	struct f_ncm_opts	*opts;
	int status;

	/* allocate and initialize one new instance */
	ncm = kzalloc(sizeof(*ncm), GFP_KERNEL);
@@ -1744,9 +1723,20 @@ static struct usb_function *ncm_alloc(struct usb_function_instance *fi)
	opts = container_of(fi, struct f_ncm_opts, func_inst);
	mutex_lock(&opts->lock);
	opts->refcnt++;

	/* export host's Ethernet address in CDC format */
	status = gether_get_host_addr_cdc(opts->net, ncm->ethaddr,
				      sizeof(ncm->ethaddr));
	if (status < 12) { /* strlen("01234567890a") */
		kfree(ncm);
		mutex_unlock(&opts->lock);
		return ERR_PTR(-EINVAL);
	}
	ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;

	spin_lock_init(&ncm->lock);
	ncm_reset_values(ncm);
	ncm->port.ioport = netdev_priv(opts->net);
	mutex_unlock(&opts->lock);
	ncm->port.is_fixed = true;
	ncm->port.supports_multi_frame = true;