Commit 004653f0 authored by Vincent Mailhol's avatar Vincent Mailhol Committed by Marc Kleine-Budde
Browse files

can: etas_es58x: add es58x_free_netdevs() to factorize code

Both es58x_probe() and es58x_disconnect() use a similar code snippet
to release the netdev resources. Factorize it in an helper function
named es58x_free_netdevs().

Link: https://lore.kernel.org/r/20210628155420.1176217-5-mailhol.vincent@wanadoo.fr


Signed-off-by: default avatarVincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 6bde4c7f
Loading
Loading
Loading
Loading
+24 −22
Original line number Diff line number Diff line
@@ -2107,6 +2107,25 @@ static int es58x_init_netdev(struct es58x_device *es58x_dev, int channel_idx)
	return ret;
}

/**
 * es58x_free_netdevs() - Release all network resources of the device.
 * @es58x_dev: ES58X device.
 */
static void es58x_free_netdevs(struct es58x_device *es58x_dev)
{
	int i;

	for (i = 0; i < es58x_dev->num_can_ch; i++) {
		struct net_device *netdev = es58x_dev->netdev[i];

		if (!netdev)
			continue;
		unregister_candev(netdev);
		es58x_dev->netdev[i] = NULL;
		free_candev(netdev);
	}
}

/**
 * es58x_get_product_info() - Get the product information and print them.
 * @es58x_dev: ES58X device.
@@ -2240,17 +2259,10 @@ static int es58x_probe(struct usb_interface *intf,

	for (ch_idx = 0; ch_idx < es58x_dev->num_can_ch; ch_idx++) {
		ret = es58x_init_netdev(es58x_dev, ch_idx);
		if (ret)
			goto cleanup_candev;
	}

		if (ret) {
			es58x_free_netdevs(es58x_dev);
			return ret;

 cleanup_candev:
	for (ch_idx = 0; ch_idx < es58x_dev->num_can_ch; ch_idx++)
		if (es58x_dev->netdev[ch_idx]) {
			unregister_candev(es58x_dev->netdev[ch_idx]);
			free_candev(es58x_dev->netdev[ch_idx]);
		}
	}

	return ret;
@@ -2266,21 +2278,11 @@ static int es58x_probe(struct usb_interface *intf,
static void es58x_disconnect(struct usb_interface *intf)
{
	struct es58x_device *es58x_dev = usb_get_intfdata(intf);
	struct net_device *netdev;
	int i;

	dev_info(&intf->dev, "Disconnecting %s %s\n",
		 es58x_dev->udev->manufacturer, es58x_dev->udev->product);

	for (i = 0; i < es58x_dev->num_can_ch; i++) {
		netdev = es58x_dev->netdev[i];
		if (!netdev)
			continue;
		unregister_candev(netdev);
		es58x_dev->netdev[i] = NULL;
		free_candev(netdev);
	}

	es58x_free_netdevs(es58x_dev);
	es58x_free_urbs(es58x_dev);
	usb_set_intfdata(intf, NULL);
}