diff options
author | David Ahern <dsahern@gmail.com> | 2018-06-05 11:14:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-06-05 12:32:38 -0400 |
commit | 3fcc773be62a9c42dc9a5c1108da298fb9f66cfa (patch) | |
tree | 68f577e1164bbf95a81be7bcb7497a0de4e06acd | |
parent | 7fa76d777ec53eeece1546b737a3b93b37639575 (diff) |
mlxsw: Add extack messages for port_{un, }split failures
Return messages in extack for port split/unsplit errors. e.g.,
$ devlink port split swp1s1 count 4
Error: mlxsw_spectrum: Port cannot be split further.
devlink answers: Invalid argument
$ devlink port unsplit swp4
Error: mlxsw_spectrum: Port was not split.
devlink answers: Invalid argument
Signed-off-by: David Ahern <dsahern@gmail.com>
Reviewed-by: Ido Schimmel <idosch@mellanox.com>
Acked-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.c | 14 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/core.h | 5 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 15 |
3 files changed, 25 insertions, 9 deletions
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 7ed38d80bc08..f9c724752a32 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
@@ -775,11 +775,14 @@ static int mlxsw_devlink_port_split(struct devlink *devlink, | |||
775 | { | 775 | { |
776 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); | 776 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); |
777 | 777 | ||
778 | if (port_index >= mlxsw_core->max_ports) | 778 | if (port_index >= mlxsw_core->max_ports) { |
779 | NL_SET_ERR_MSG_MOD(extack, "Port index exceeds maximum number of ports"); | ||
779 | return -EINVAL; | 780 | return -EINVAL; |
781 | } | ||
780 | if (!mlxsw_core->driver->port_split) | 782 | if (!mlxsw_core->driver->port_split) |
781 | return -EOPNOTSUPP; | 783 | return -EOPNOTSUPP; |
782 | return mlxsw_core->driver->port_split(mlxsw_core, port_index, count); | 784 | return mlxsw_core->driver->port_split(mlxsw_core, port_index, count, |
785 | extack); | ||
783 | } | 786 | } |
784 | 787 | ||
785 | static int mlxsw_devlink_port_unsplit(struct devlink *devlink, | 788 | static int mlxsw_devlink_port_unsplit(struct devlink *devlink, |
@@ -788,11 +791,14 @@ static int mlxsw_devlink_port_unsplit(struct devlink *devlink, | |||
788 | { | 791 | { |
789 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); | 792 | struct mlxsw_core *mlxsw_core = devlink_priv(devlink); |
790 | 793 | ||
791 | if (port_index >= mlxsw_core->max_ports) | 794 | if (port_index >= mlxsw_core->max_ports) { |
795 | NL_SET_ERR_MSG_MOD(extack, "Port index exceeds maximum number of ports"); | ||
792 | return -EINVAL; | 796 | return -EINVAL; |
797 | } | ||
793 | if (!mlxsw_core->driver->port_unsplit) | 798 | if (!mlxsw_core->driver->port_unsplit) |
794 | return -EOPNOTSUPP; | 799 | return -EOPNOTSUPP; |
795 | return mlxsw_core->driver->port_unsplit(mlxsw_core, port_index); | 800 | return mlxsw_core->driver->port_unsplit(mlxsw_core, port_index, |
801 | extack); | ||
796 | } | 802 | } |
797 | 803 | ||
798 | static int | 804 | static int |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h b/drivers/net/ethernet/mellanox/mlxsw/core.h index 4a8d4c7f89d9..552cfa29c2f7 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.h +++ b/drivers/net/ethernet/mellanox/mlxsw/core.h | |||
@@ -274,8 +274,9 @@ struct mlxsw_driver { | |||
274 | int (*port_type_set)(struct mlxsw_core *mlxsw_core, u8 local_port, | 274 | int (*port_type_set)(struct mlxsw_core *mlxsw_core, u8 local_port, |
275 | enum devlink_port_type new_type); | 275 | enum devlink_port_type new_type); |
276 | int (*port_split)(struct mlxsw_core *mlxsw_core, u8 local_port, | 276 | int (*port_split)(struct mlxsw_core *mlxsw_core, u8 local_port, |
277 | unsigned int count); | 277 | unsigned int count, struct netlink_ext_ack *extack); |
278 | int (*port_unsplit)(struct mlxsw_core *mlxsw_core, u8 local_port); | 278 | int (*port_unsplit)(struct mlxsw_core *mlxsw_core, u8 local_port, |
279 | struct netlink_ext_ack *extack); | ||
279 | int (*sb_pool_get)(struct mlxsw_core *mlxsw_core, | 280 | int (*sb_pool_get)(struct mlxsw_core *mlxsw_core, |
280 | unsigned int sb_index, u16 pool_index, | 281 | unsigned int sb_index, u16 pool_index, |
281 | struct devlink_sb_pool_info *pool_info); | 282 | struct devlink_sb_pool_info *pool_info); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index fc39f22e5c70..968b88af2ef5 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c | |||
@@ -3092,7 +3092,8 @@ static void mlxsw_sp_port_unsplit_create(struct mlxsw_sp *mlxsw_sp, | |||
3092 | } | 3092 | } |
3093 | 3093 | ||
3094 | static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, | 3094 | static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, |
3095 | unsigned int count) | 3095 | unsigned int count, |
3096 | struct netlink_ext_ack *extack) | ||
3096 | { | 3097 | { |
3097 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); | 3098 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); |
3098 | struct mlxsw_sp_port *mlxsw_sp_port; | 3099 | struct mlxsw_sp_port *mlxsw_sp_port; |
@@ -3104,6 +3105,7 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
3104 | if (!mlxsw_sp_port) { | 3105 | if (!mlxsw_sp_port) { |
3105 | dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n", | 3106 | dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n", |
3106 | local_port); | 3107 | local_port); |
3108 | NL_SET_ERR_MSG_MOD(extack, "Port number does not exist"); | ||
3107 | return -EINVAL; | 3109 | return -EINVAL; |
3108 | } | 3110 | } |
3109 | 3111 | ||
@@ -3112,11 +3114,13 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
3112 | 3114 | ||
3113 | if (count != 2 && count != 4) { | 3115 | if (count != 2 && count != 4) { |
3114 | netdev_err(mlxsw_sp_port->dev, "Port can only be split into 2 or 4 ports\n"); | 3116 | netdev_err(mlxsw_sp_port->dev, "Port can only be split into 2 or 4 ports\n"); |
3117 | NL_SET_ERR_MSG_MOD(extack, "Port can only be split into 2 or 4 ports"); | ||
3115 | return -EINVAL; | 3118 | return -EINVAL; |
3116 | } | 3119 | } |
3117 | 3120 | ||
3118 | if (cur_width != MLXSW_PORT_MODULE_MAX_WIDTH) { | 3121 | if (cur_width != MLXSW_PORT_MODULE_MAX_WIDTH) { |
3119 | netdev_err(mlxsw_sp_port->dev, "Port cannot be split further\n"); | 3122 | netdev_err(mlxsw_sp_port->dev, "Port cannot be split further\n"); |
3123 | NL_SET_ERR_MSG_MOD(extack, "Port cannot be split further"); | ||
3120 | return -EINVAL; | 3124 | return -EINVAL; |
3121 | } | 3125 | } |
3122 | 3126 | ||
@@ -3125,6 +3129,7 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
3125 | base_port = local_port; | 3129 | base_port = local_port; |
3126 | if (mlxsw_sp->ports[base_port + 1]) { | 3130 | if (mlxsw_sp->ports[base_port + 1]) { |
3127 | netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); | 3131 | netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); |
3132 | NL_SET_ERR_MSG_MOD(extack, "Invalid split configuration"); | ||
3128 | return -EINVAL; | 3133 | return -EINVAL; |
3129 | } | 3134 | } |
3130 | } else { | 3135 | } else { |
@@ -3132,6 +3137,7 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, | |||
3132 | if (mlxsw_sp->ports[base_port + 1] || | 3137 | if (mlxsw_sp->ports[base_port + 1] || |
3133 | mlxsw_sp->ports[base_port + 3]) { | 3138 | mlxsw_sp->ports[base_port + 3]) { |
3134 | netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); | 3139 | netdev_err(mlxsw_sp_port->dev, "Invalid split configuration\n"); |
3140 | NL_SET_ERR_MSG_MOD(extack, "Invalid split configuration"); | ||
3135 | return -EINVAL; | 3141 | return -EINVAL; |
3136 | } | 3142 | } |
3137 | } | 3143 | } |
@@ -3153,7 +3159,8 @@ err_port_split_create: | |||
3153 | return err; | 3159 | return err; |
3154 | } | 3160 | } |
3155 | 3161 | ||
3156 | static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u8 local_port) | 3162 | static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u8 local_port, |
3163 | struct netlink_ext_ack *extack) | ||
3157 | { | 3164 | { |
3158 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); | 3165 | struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core); |
3159 | struct mlxsw_sp_port *mlxsw_sp_port; | 3166 | struct mlxsw_sp_port *mlxsw_sp_port; |
@@ -3165,11 +3172,13 @@ static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u8 local_port) | |||
3165 | if (!mlxsw_sp_port) { | 3172 | if (!mlxsw_sp_port) { |
3166 | dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n", | 3173 | dev_err(mlxsw_sp->bus_info->dev, "Port number \"%d\" does not exist\n", |
3167 | local_port); | 3174 | local_port); |
3175 | NL_SET_ERR_MSG_MOD(extack, "Port number does not exist"); | ||
3168 | return -EINVAL; | 3176 | return -EINVAL; |
3169 | } | 3177 | } |
3170 | 3178 | ||
3171 | if (!mlxsw_sp_port->split) { | 3179 | if (!mlxsw_sp_port->split) { |
3172 | netdev_err(mlxsw_sp_port->dev, "Port wasn't split\n"); | 3180 | netdev_err(mlxsw_sp_port->dev, "Port was not split\n"); |
3181 | NL_SET_ERR_MSG_MOD(extack, "Port was not split"); | ||
3173 | return -EINVAL; | 3182 | return -EINVAL; |
3174 | } | 3183 | } |
3175 | 3184 | ||