can: etas_es58x: add es58x_free_netdevs() to factorize code
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Mon, 28 Jun 2021 15:54:18 +0000 (00:54 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 25 Jul 2021 09:36:28 +0000 (11:36 +0200)
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: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/etas_es58x/es58x_core.c

index d2bb1b5..126e4d5 100644 (file)
@@ -2108,6 +2108,25 @@ static int es58x_init_netdev(struct es58x_device *es58x_dev, int channel_idx)
 }
 
 /**
+ * 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,18 +2259,11 @@ 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;
-       }
-
-       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]);
+               if (ret) {
+                       es58x_free_netdevs(es58x_dev);
+                       return ret;
                }
+       }
 
        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);
 }