net: mscc: ocelot: use a switch-case statement in ocelot_netdevice_event
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 5 Feb 2021 22:02:11 +0000 (00:02 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 6 Feb 2021 22:51:50 +0000 (14:51 -0800)
Make ocelot's net device event handler more streamlined by structuring
it in a similar way with others. The inspiration here was
dsa_slave_netdevice_event.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mscc/ocelot_net.c

index c8106124f134e11dab7fc8c86e68d1903c0c2c63..ec68cf644522b102e017cffccbc623e71f18d1b5 100644 (file)
@@ -1137,49 +1137,71 @@ static int ocelot_netdevice_changeupper(struct net_device *dev,
                                              info->upper_dev);
        }
 
-       return err;
+       return notifier_from_errno(err);
+}
+
+static int
+ocelot_netdevice_lag_changeupper(struct net_device *dev,
+                                struct netdev_notifier_changeupper_info *info)
+{
+       struct net_device *lower;
+       struct list_head *iter;
+       int err = NOTIFY_DONE;
+
+       netdev_for_each_lower_dev(dev, lower, iter) {
+               err = ocelot_netdevice_changeupper(lower, info);
+               if (err)
+                       return notifier_from_errno(err);
+       }
+
+       return NOTIFY_DONE;
 }
 
 static int ocelot_netdevice_event(struct notifier_block *unused,
                                  unsigned long event, void *ptr)
 {
-       struct netdev_notifier_changeupper_info *info = ptr;
        struct net_device *dev = netdev_notifier_info_to_dev(ptr);
-       int ret = 0;
 
-       if (event == NETDEV_PRECHANGEUPPER &&
-           ocelot_netdevice_dev_check(dev) &&
-           netif_is_lag_master(info->upper_dev)) {
-               struct netdev_lag_upper_info *lag_upper_info = info->upper_info;
+       switch (event) {
+       case NETDEV_PRECHANGEUPPER: {
+               struct netdev_notifier_changeupper_info *info = ptr;
+               struct netdev_lag_upper_info *lag_upper_info;
                struct netlink_ext_ack *extack;
 
+               if (!ocelot_netdevice_dev_check(dev))
+                       break;
+
+               if (!netif_is_lag_master(info->upper_dev))
+                       break;
+
+               lag_upper_info = info->upper_info;
+
                if (lag_upper_info &&
                    lag_upper_info->tx_type != NETDEV_LAG_TX_TYPE_HASH) {
                        extack = netdev_notifier_info_to_extack(&info->info);
                        NL_SET_ERR_MSG_MOD(extack, "LAG device using unsupported Tx type");
 
-                       ret = -EINVAL;
-                       goto notify;
+                       return notifier_from_errno(-EINVAL);
                }
+
+               break;
        }
+       case NETDEV_CHANGEUPPER: {
+               struct netdev_notifier_changeupper_info *info = ptr;
 
-       if (event == NETDEV_CHANGEUPPER) {
-               if (netif_is_lag_master(dev)) {
-                       struct net_device *slave;
-                       struct list_head *iter;
+               if (ocelot_netdevice_dev_check(dev))
+                       return ocelot_netdevice_changeupper(dev, info);
 
-                       netdev_for_each_lower_dev(dev, slave, iter) {
-                               ret = ocelot_netdevice_changeupper(slave, info);
-                               if (ret)
-                                       goto notify;
-                       }
-               } else {
-                       ret = ocelot_netdevice_changeupper(dev, info);
-               }
+               if (netif_is_lag_master(dev))
+                       return ocelot_netdevice_lag_changeupper(dev, info);
+
+               break;
+       }
+       default:
+               break;
        }
 
-notify:
-       return notifier_from_errno(ret);
+       return NOTIFY_DONE;
 }
 
 struct notifier_block ocelot_netdevice_nb __read_mostly = {