|
@@ -4376,7 +4376,10 @@ static int mlxsw_sp_netdevice_port_upper_event(struct net_device *lower_dev,
|
|
|
}
|
|
|
if (!info->linking)
|
|
|
break;
|
|
|
- if (netdev_has_any_upper_dev(upper_dev)) {
|
|
|
+ if (netdev_has_any_upper_dev(upper_dev) &&
|
|
|
+ (!netif_is_bridge_master(upper_dev) ||
|
|
|
+ !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
|
|
|
+ upper_dev))) {
|
|
|
NL_SET_ERR_MSG(extack,
|
|
|
"spectrum: Enslaving a port to a device that already has an upper device is not supported");
|
|
|
return -EINVAL;
|
|
@@ -4504,6 +4507,7 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
|
|
|
u16 vid)
|
|
|
{
|
|
|
struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
|
|
|
+ struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
|
|
|
struct netdev_notifier_changeupper_info *info = ptr;
|
|
|
struct netlink_ext_ack *extack;
|
|
|
struct net_device *upper_dev;
|
|
@@ -4520,7 +4524,10 @@ static int mlxsw_sp_netdevice_port_vlan_event(struct net_device *vlan_dev,
|
|
|
}
|
|
|
if (!info->linking)
|
|
|
break;
|
|
|
- if (netdev_has_any_upper_dev(upper_dev)) {
|
|
|
+ if (netdev_has_any_upper_dev(upper_dev) &&
|
|
|
+ (!netif_is_bridge_master(upper_dev) ||
|
|
|
+ !mlxsw_sp_bridge_device_is_offloaded(mlxsw_sp,
|
|
|
+ upper_dev))) {
|
|
|
NL_SET_ERR_MSG(extack, "spectrum: Enslaving a port to a device that already has an upper device is not supported");
|
|
|
return -EINVAL;
|
|
|
}
|