diff options
author | Jiri Pirko <jiri@mellanox.com> | 2019-10-31 11:42:19 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-10-31 10:54:47 -0700 |
commit | c3a64b5173e1416cf3d982b02e1c1b918382f701 (patch) | |
tree | 80099f51d421e84811580c7672a7d1750b076653 /drivers | |
parent | 013da297911830882611c4ae4764117dacf6713f (diff) | |
download | lwn-c3a64b5173e1416cf3d982b02e1c1b918382f701.tar.gz lwn-c3a64b5173e1416cf3d982b02e1c1b918382f701.zip |
mlxsw: spectrum: Fix base port get for split count 4 and 8
The current code considers only split by 2 or 4. Make the base port
getting generic and allow split by 8 to be handled correctly. Generalize
the used port checks as well.
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index db05118adc44..0a5a4a252248 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -4233,19 +4233,21 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, return -EINVAL; } - /* Make sure we have enough slave (even) ports for the split. */ - if (count == 2) { - base_port = local_port; - if (mlxsw_sp->ports[base_port + offset]) { - netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); - NL_SET_ERR_MSG_MOD(extack, "Invalid split configuration"); - return -EINVAL; - } - } else { - base_port = mlxsw_sp_cluster_base_port_get(local_port, - max_width); - if (mlxsw_sp->ports[base_port + 1] || - mlxsw_sp->ports[base_port + 3]) { + /* Only in case max split is being done, the local port and + * base port may differ. + */ + base_port = count == max_width ? + mlxsw_sp_cluster_base_port_get(local_port, max_width) : + local_port; + + for (i = 0; i < count * offset; i++) { + /* Expect base port to exist and also the one in the middle in + * case of maximal split count. + */ + if (i == 0 || (count == max_width && i == count / 2)) + continue; + + if (mlxsw_sp_port_created(mlxsw_sp, base_port + i)) { netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); NL_SET_ERR_MSG_MOD(extack, "Invalid split configuration"); return -EINVAL; |