mlxsw: spectrum: Distinguish between unsplittable and split port
authorJiri Pirko <jiri@mellanox.com>
Thu, 31 Oct 2019 09:42:10 +0000 (11:42 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 31 Oct 2019 17:54:47 +0000 (10:54 -0700)
Currently when user does split, he is not able to distinguish if the
port cannot be split because it is already split, or because it cannot
be split at all. Add another check for split flag to distinguish this.
Also add check forbidding split when maximal width is 1.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Reviewed-by: Shalom Toledo <shalomt@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c

index e0111e0a1a35180e7f47ab711a6e22f26fad36c8..3644fca096acc770768414d4ca0894bfafb63543 100644 (file)
@@ -4118,6 +4118,13 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port,
                return -EINVAL;
        }
 
+       /* Split ports cannot be split. */
+       if (mlxsw_sp_port->split) {
+               netdev_err(mlxsw_sp_port->dev, "Port cannot be split further\n");
+               NL_SET_ERR_MSG_MOD(extack, "Port cannot be split further");
+               return -EINVAL;
+       }
+
        module = mlxsw_sp_port->mapping.module;
 
        max_width = mlxsw_core_module_max_width(mlxsw_core,
@@ -4128,10 +4135,10 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port,
                return max_width;
        }
 
-       /* Split port with non-max module width cannot be split. */
-       if (mlxsw_sp_port->mapping.width != max_width) {
-               netdev_err(mlxsw_sp_port->dev, "Port cannot be split further\n");
-               NL_SET_ERR_MSG_MOD(extack, "Port cannot be split further");
+       /* Split port with non-max and 1 module width cannot be split. */
+       if (mlxsw_sp_port->mapping.width != max_width || max_width == 1) {
+               netdev_err(mlxsw_sp_port->dev, "Port cannot be split\n");
+               NL_SET_ERR_MSG_MOD(extack, "Port cannot be split");
                return -EINVAL;
        }