aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ahern <dsahern@gmail.com>2018-06-05 11:14:11 -0400
committerDavid S. Miller <davem@davemloft.net>2018-06-05 12:32:38 -0400
commit3fcc773be62a9c42dc9a5c1108da298fb9f66cfa (patch)
tree68f577e1164bbf95a81be7bcb7497a0de4e06acd
parent7fa76d777ec53eeece1546b737a3b93b37639575 (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.c14
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/core.h5
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c15
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
785static int mlxsw_devlink_port_unsplit(struct devlink *devlink, 788static 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
798static int 804static 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
3094static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port, 3094static 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
3156static int mlxsw_sp_port_unsplit(struct mlxsw_core *mlxsw_core, u8 local_port) 3162static 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