devlink: Move input checks from driver to devlink
Currently, all the input checks are done in driver. After adding the split capability to devlink port, move the checks to devlink. Signed-off-by: Danielle Ratson <danieller@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
a0f49b5486
Коммит
82901ad169
|
@ -2236,13 +2236,6 @@ 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;
|
||||
}
|
||||
|
||||
max_width = mlxsw_core_module_max_width(mlxsw_core,
|
||||
mlxsw_sp_port->mapping.module);
|
||||
if (max_width < 0) {
|
||||
|
@ -2251,19 +2244,13 @@ static int mlxsw_sp_port_split(struct mlxsw_core *mlxsw_core, u8 local_port,
|
|||
return max_width;
|
||||
}
|
||||
|
||||
/* Split port with non-max and 1 module width cannot be split. */
|
||||
if (mlxsw_sp_port->mapping.width != max_width || max_width == 1) {
|
||||
/* Split port with non-max cannot be split. */
|
||||
if (mlxsw_sp_port->mapping.width != max_width) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Port cannot be split\n");
|
||||
NL_SET_ERR_MSG_MOD(extack, "Port cannot be split");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (count == 1 || !is_power_of_2(count) || count > max_width) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Invalid split count\n");
|
||||
NL_SET_ERR_MSG_MOD(extack, "Invalid split count");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
offset = mlxsw_sp_local_ports_offset(mlxsw_core, count, max_width);
|
||||
if (offset < 0) {
|
||||
netdev_err(mlxsw_sp_port->dev, "Cannot obtain local port offset\n");
|
||||
|
|
|
@ -70,9 +70,6 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
|
|||
unsigned int lanes;
|
||||
int ret;
|
||||
|
||||
if (count < 2)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&pf->lock);
|
||||
|
||||
rtnl_lock();
|
||||
|
@ -81,7 +78,7 @@ nfp_devlink_port_split(struct devlink *devlink, unsigned int port_index,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (eth_port.is_split || eth_port.port_lanes % count) {
|
||||
if (eth_port.port_lanes % count) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
|
|
@ -940,6 +940,7 @@ static int devlink_nl_cmd_port_split_doit(struct sk_buff *skb,
|
|||
struct genl_info *info)
|
||||
{
|
||||
struct devlink *devlink = info->user_ptr[0];
|
||||
struct devlink_port *devlink_port;
|
||||
u32 port_index;
|
||||
u32 count;
|
||||
|
||||
|
@ -947,8 +948,27 @@ static int devlink_nl_cmd_port_split_doit(struct sk_buff *skb,
|
|||
!info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT])
|
||||
return -EINVAL;
|
||||
|
||||
devlink_port = devlink_port_get_from_info(devlink, info);
|
||||
port_index = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_INDEX]);
|
||||
count = nla_get_u32(info->attrs[DEVLINK_ATTR_PORT_SPLIT_COUNT]);
|
||||
|
||||
if (IS_ERR(devlink_port))
|
||||
return -EINVAL;
|
||||
|
||||
if (!devlink_port->attrs.splittable) {
|
||||
/* Split ports cannot be split. */
|
||||
if (devlink_port->attrs.split)
|
||||
NL_SET_ERR_MSG_MOD(info->extack, "Port cannot be split further");
|
||||
else
|
||||
NL_SET_ERR_MSG_MOD(info->extack, "Port cannot be split");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (count < 2 || !is_power_of_2(count) || count > devlink_port->attrs.lanes) {
|
||||
NL_SET_ERR_MSG_MOD(info->extack, "Invalid split count");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return devlink_port_split(devlink, port_index, count, info->extack);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче