From: Danielle Ratson <daniel...@mellanox.com>

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 <daniel...@mellanox.com>
Reviewed-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Ido Schimmel <ido...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c  | 17 ++---------------
 .../net/ethernet/netronome/nfp/nfp_devlink.c    |  5 +----
 net/core/devlink.c                              | 17 +++++++++++++++++
 3 files changed, 20 insertions(+), 19 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 9cd2dc3afb13..eeeafd1d82ce 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -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");
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c 
b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index b6a10565309a..be52510d446b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -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;
        }
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 94c797b74378..1adfbf63331a 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -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,24 @@ 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 (!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);
 }
 
-- 
2.26.2

Reply via email to