Skip to content

Commit

Permalink
net: mscc: ocelot: use a switch-case statement in ocelot_netdevice_event
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Alexandre Belloni <[email protected]>
Signed-off-by: Jakub Kicinski <[email protected]>
  • Loading branch information
vladimiroltean authored and kuba-moo committed Feb 6, 2021
1 parent 662981b commit 41e66fa
Showing 1 changed file with 45 additions and 23 deletions.
68 changes: 45 additions & 23 deletions drivers/net/ethernet/mscc/ocelot_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down

0 comments on commit 41e66fa

Please sign in to comment.