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

Commit b326c0d5 authored by Tarun Gupta's avatar Tarun Gupta Committed by Gerrit - the friendly Code Review server
Browse files

usb: android: Fix crash on composition switch from ecm



unbind_config() extracts each member from the functions list and calls
unbind_config() callback of that particular function driver. Also before
calling the unbind() callback it deletes this function from the function
list.
ecm_function_unbind_config() calls usb_remove_function() which again tries
to delete the ecm function from the function list and this leads to a
crash.
Fix this by instantiating the ecm function in ecm_function_bind_config()
and de-instantiating in ecm_function_unbind_config().

Change-Id: Iec315d592ad882087a31bfd394c28373b9b06720
Signed-off-by: default avatarTarun Gupta <tarung@codeaurora.org>
parent e7c95927
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -2430,10 +2430,6 @@ static int ecm_function_init(struct android_usb_function *f,

	f->config = config;

	config->fi = usb_get_function_instance("ecm");
	if (IS_ERR(config->fi))
		return PTR_ERR(config->fi);

	return 0;
}

@@ -2464,6 +2460,10 @@ static int ecm_function_bind_config(struct android_usb_function *f,
		ecm->ethaddr[0], ecm->ethaddr[1], ecm->ethaddr[2],
		ecm->ethaddr[3], ecm->ethaddr[4], ecm->ethaddr[5]);

	ecm->fi = usb_get_function_instance("ecm");
	if (IS_ERR(ecm->fi))
		return PTR_ERR(ecm->fi);

	ecm_opts = container_of(ecm->fi, struct f_ecm_opts, func_inst);
	strlcpy(ecm_opts->net->name, "ecm%d", sizeof(ecm_opts->net->name));
	gether_set_qmult(ecm_opts->net, qmult);
@@ -2495,8 +2495,8 @@ static void ecm_function_unbind_config(struct android_usb_function *f,
						struct usb_configuration *c)
{
	struct ecm_function_config *ecm = f->config;
	if (ecm->func)
		usb_remove_function(c, ecm->func);

	usb_put_function_instance(ecm->fi);
}

static struct android_usb_function ecm_function = {