diff options
| author | Ido Schimmel <idosch@mellanox.com> | 2017-11-21 03:42:21 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-11-21 06:15:22 -0500 |
| commit | bf4e9f24a8d9e63c9cbd9cbeb84fc8a9a46ff1a3 (patch) | |
| tree | 52d00b9e98b3090f34eaf0022feac4fd98c36f4a | |
| parent | 32a72bbd5da2411eab591bf9bc2e39349106193a (diff) | |
mlxsw: spectrum: Do not try to create non-existing ports during unsplit
On some systems, when we unsplit a port we need to re-create two ports
instead. On other systems, only one needs to be re-created.
Do not try to create a port if during driver initialization it was
assigned a negative module number, which is invalid.
This avoids the following error during unsplit:
[ 941.012478] mlxsw_spectrum 0000:01:00.0: Port 43: Failed to map module
The error is harmless and caused by the fact that a local port is
already mapped to module 0.
Fixes: be94535f9531 ("mlxsw: spectrum: Make split flow match firmware requirements")
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Arkadi Sharshevsky <arkadis@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 8 | ||||
| -rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.h | 2 |
2 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 2d46ec84ebdf..2d0897b7d860 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
| @@ -3142,13 +3142,17 @@ static int mlxsw_sp_ports_create(struct mlxsw_sp *mlxsw_sp) | |||
| 3142 | if (!mlxsw_sp->ports) | 3142 | if (!mlxsw_sp->ports) |
| 3143 | return -ENOMEM; | 3143 | return -ENOMEM; |
| 3144 | 3144 | ||
| 3145 | mlxsw_sp->port_to_module = kcalloc(max_ports, sizeof(u8), GFP_KERNEL); | 3145 | mlxsw_sp->port_to_module = kmalloc_array(max_ports, sizeof(int), |
| 3146 | GFP_KERNEL); | ||
| 3146 | if (!mlxsw_sp->port_to_module) { | 3147 | if (!mlxsw_sp->port_to_module) { |
| 3147 | err = -ENOMEM; | 3148 | err = -ENOMEM; |
| 3148 | goto err_port_to_module_alloc; | 3149 | goto err_port_to_module_alloc; |
| 3149 | } | 3150 | } |
| 3150 | 3151 | ||
| 3151 | for (i = 1; i < max_ports; i++) { | 3152 | for (i = 1; i < max_ports; i++) { |
| 3153 | /* Mark as invalid */ | ||
| 3154 | mlxsw_sp->port_to_module[i] = -1; | ||
| 3155 | |||
| 3152 | err = mlxsw_sp_port_module_info_get(mlxsw_sp, i, &module, | 3156 | err = mlxsw_sp_port_module_info_get(mlxsw_sp, i, &module, |
| 3153 | &width, &lane); | 3157 | &width, &lane); |
| 3154 | if (err) | 3158 | if (err) |
| @@ -3216,6 +3220,8 @@ static void mlxsw_sp_port_unsplit_create(struct mlxsw_sp *mlxsw_sp, | |||
| 3216 | 3220 | ||
| 3217 | for (i = 0; i < count; i++) { | 3221 | for (i = 0; i < count; i++) { |
| 3218 | local_port = base_port + i * 2; | 3222 | local_port = base_port + i * 2; |
| 3223 | if (mlxsw_sp->port_to_module[local_port] < 0) | ||
| 3224 | continue; | ||
| 3219 | module = mlxsw_sp->port_to_module[local_port]; | 3225 | module = mlxsw_sp->port_to_module[local_port]; |
| 3220 | 3226 | ||
| 3221 | mlxsw_sp_port_create(mlxsw_sp, local_port, false, module, | 3227 | mlxsw_sp_port_create(mlxsw_sp, local_port, false, module, |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h index 58cf222fb985..432ab9b12b7f 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | |||
| @@ -152,7 +152,7 @@ struct mlxsw_sp { | |||
| 152 | const struct mlxsw_bus_info *bus_info; | 152 | const struct mlxsw_bus_info *bus_info; |
| 153 | unsigned char base_mac[ETH_ALEN]; | 153 | unsigned char base_mac[ETH_ALEN]; |
| 154 | struct mlxsw_sp_upper *lags; | 154 | struct mlxsw_sp_upper *lags; |
| 155 | u8 *port_to_module; | 155 | int *port_to_module; |
| 156 | struct mlxsw_sp_sb *sb; | 156 | struct mlxsw_sp_sb *sb; |
| 157 | struct mlxsw_sp_bridge *bridge; | 157 | struct mlxsw_sp_bridge *bridge; |
| 158 | struct mlxsw_sp_router *router; | 158 | struct mlxsw_sp_router *router; |
