From: Vladimir Oltean <vladimir.olt...@nxp.com>

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.olt...@nxp.com>
Reviewed-by: Alexandre Belloni <alexandre.bell...@bootlin.com>

---
Changes in v2:
Addressed Alex's feedback:
> This changes the return value in case of error, I'm not sure how
> important this is.
by keeping the return code of notifier_from_errno(-EINVAL)

 drivers/net/ethernet/mscc/ocelot_net.c | 68 +++++++++++++++++---------
 1 file changed, 45 insertions(+), 23 deletions(-)

diff --git a/drivers/net/ethernet/mscc/ocelot_net.c 
b/drivers/net/ethernet/mscc/ocelot_net.c
index f15f38f45249..b80a5bb95163 100644
--- a/drivers/net/ethernet/mscc/ocelot_net.c
+++ b/drivers/net/ethernet/mscc/ocelot_net.c
@@ -1136,49 +1136,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 = {
-- 
2.25.1

Reply via email to