Commit 41e66fa2 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Jakub Kicinski

net: mscc: ocelot: use a switch-case statement in ocelot_netdevice_event

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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 662981bb
...@@ -1137,49 +1137,71 @@ static int ocelot_netdevice_changeupper(struct net_device *dev, ...@@ -1137,49 +1137,71 @@ static int ocelot_netdevice_changeupper(struct net_device *dev,
info->upper_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, static int ocelot_netdevice_event(struct notifier_block *unused,
unsigned long event, void *ptr) unsigned long event, void *ptr)
{ {
struct netdev_notifier_changeupper_info *info = ptr;
struct net_device *dev = netdev_notifier_info_to_dev(ptr); struct net_device *dev = netdev_notifier_info_to_dev(ptr);
int ret = 0;
if (event == NETDEV_PRECHANGEUPPER && switch (event) {
ocelot_netdevice_dev_check(dev) && case NETDEV_PRECHANGEUPPER: {
netif_is_lag_master(info->upper_dev)) { struct netdev_notifier_changeupper_info *info = ptr;
struct netdev_lag_upper_info *lag_upper_info = info->upper_info; struct netdev_lag_upper_info *lag_upper_info;
struct netlink_ext_ack *extack; 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 && if (lag_upper_info &&
lag_upper_info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { lag_upper_info->tx_type != NETDEV_LAG_TX_TYPE_HASH) {
extack = netdev_notifier_info_to_extack(&info->info); extack = netdev_notifier_info_to_extack(&info->info);
NL_SET_ERR_MSG_MOD(extack, "LAG device using unsupported Tx type"); NL_SET_ERR_MSG_MOD(extack, "LAG device using unsupported Tx type");
ret = -EINVAL; return notifier_from_errno(-EINVAL);
goto notify;
} }
break;
} }
case NETDEV_CHANGEUPPER: {
struct netdev_notifier_changeupper_info *info = ptr;
if (event == NETDEV_CHANGEUPPER) { if (ocelot_netdevice_dev_check(dev))
if (netif_is_lag_master(dev)) { return ocelot_netdevice_changeupper(dev, info);
struct net_device *slave;
struct list_head *iter;
netdev_for_each_lower_dev(dev, slave, iter) { if (netif_is_lag_master(dev))
ret = ocelot_netdevice_changeupper(slave, info); return ocelot_netdevice_lag_changeupper(dev, info);
if (ret)
goto notify; break;
}
} else {
ret = ocelot_netdevice_changeupper(dev, info);
} }
default:
break;
} }
notify: return NOTIFY_DONE;
return notifier_from_errno(ret);
} }
struct notifier_block ocelot_netdevice_nb __read_mostly = { struct notifier_block ocelot_netdevice_nb __read_mostly = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment