From: Jiri Pirko <j...@mellanox.com>

Change existing setter for split port information into more generic
attrs setter. Alongside with that, allow to set port number and subport
number for split ports.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlxsw/core.c       |  7 ++--
 drivers/net/ethernet/mellanox/mlxsw/core.h       |  3 +-
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c   |  4 +--
 drivers/net/ethernet/mellanox/mlxsw/switchx2.c   |  2 +-
 drivers/net/ethernet/netronome/nfp/nfp_devlink.c | 39 +++++++++++++++-----
 include/net/devlink.h                            | 20 +++++++----
 include/uapi/linux/devlink.h                     |  3 ++
 net/core/devlink.c                               | 46 ++++++++++++++++++------
 8 files changed, 93 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c 
b/drivers/net/ethernet/mellanox/mlxsw/core.c
index 3529b545675d..dc924d5fb3b7 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
@@ -1713,15 +1713,16 @@ EXPORT_SYMBOL(mlxsw_core_port_fini);
 
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
                             void *port_driver_priv, struct net_device *dev,
-                            bool split, u32 split_group)
+                            u32 port_number, bool split,
+                            u32 split_port_subnumber)
 {
        struct mlxsw_core_port *mlxsw_core_port =
                                        &mlxsw_core->ports[local_port];
        struct devlink_port *devlink_port = &mlxsw_core_port->devlink_port;
 
        mlxsw_core_port->port_driver_priv = port_driver_priv;
-       if (split)
-               devlink_port_split_set(devlink_port, split_group);
+       devlink_port_attrs_set(devlink_port, port_number,
+                              split, split_port_subnumber);
        devlink_port_type_eth_set(devlink_port, dev);
 }
 EXPORT_SYMBOL(mlxsw_core_port_eth_set);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.h 
b/drivers/net/ethernet/mellanox/mlxsw/core.h
index 5ddafd74dc00..10589abae67f 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/core.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.h
@@ -201,7 +201,8 @@ int mlxsw_core_port_init(struct mlxsw_core *mlxsw_core, u8 
local_port);
 void mlxsw_core_port_fini(struct mlxsw_core *mlxsw_core, u8 local_port);
 void mlxsw_core_port_eth_set(struct mlxsw_core *mlxsw_core, u8 local_port,
                             void *port_driver_priv, struct net_device *dev,
-                            bool split, u32 split_group);
+                            u32 port_number, bool split,
+                            u32 split_port_subnumber);
 void mlxsw_core_port_ib_set(struct mlxsw_core *mlxsw_core, u8 local_port,
                            void *port_driver_priv);
 void mlxsw_core_port_clear(struct mlxsw_core *mlxsw_core, u8 local_port,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index a120602bca26..59be0bf14127 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -2927,8 +2927,8 @@ static int mlxsw_sp_port_create(struct mlxsw_sp 
*mlxsw_sp, u8 local_port,
        }
 
        mlxsw_core_port_eth_set(mlxsw_sp->core, mlxsw_sp_port->local_port,
-                               mlxsw_sp_port, dev, mlxsw_sp_port->split,
-                               module);
+                               mlxsw_sp_port, dev, module + 1,
+                               mlxsw_sp_port->split, lane / width);
        mlxsw_core_schedule_dw(&mlxsw_sp_port->periodic_hw_stats.update_dw, 0);
        return 0;
 
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c 
b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index f3c29bbf07e2..eddfcef320f1 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -1149,7 +1149,7 @@ static int __mlxsw_sx_port_eth_create(struct mlxsw_sx 
*mlxsw_sx, u8 local_port,
        }
 
        mlxsw_core_port_eth_set(mlxsw_sx->core, mlxsw_sx_port->local_port,
-                               mlxsw_sx_port, dev, false, 0);
+                               mlxsw_sx_port, dev, module + 1, false, 0);
        mlxsw_sx->ports[local_port] = mlxsw_sx_port;
        return 0;
 
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c 
b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
index eb0fc614673d..3c0f0560f834 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_devlink.c
@@ -162,22 +162,45 @@ const struct devlink_ops nfp_devlink_ops = {
        .eswitch_mode_get       = nfp_devlink_eswitch_mode_get,
 };
 
-int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
+static int nfp_devlink_port_attrs_set(struct nfp_port *port)
 {
        struct nfp_eth_table_port eth_port;
+       int ret;
+
+       switch (port->type) {
+       case NFP_PORT_PHYS_PORT:
+               rtnl_lock();
+               ret = nfp_devlink_fill_eth_port(port, &eth_port);
+               rtnl_unlock();
+               if (ret)
+                       return ret;
+
+               devlink_port_attrs_set(&port->dl_port, eth_port.label_port,
+                                      eth_port.is_split,
+                                      eth_port.label_subport);
+               break;
+       case NFP_PORT_PF_PORT:
+               devlink_port_attrs_set(&port->dl_port, port->pf_id, false, 0);
+               break;
+       case NFP_PORT_VF_PORT:
+               devlink_port_attrs_set(&port->dl_port, port->vf_id, false, 0);
+               break;
+       default:
+               break;
+       }
+       return 0;
+}
+
+int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
+{
        struct devlink *devlink;
        int ret;
 
-       rtnl_lock();
-       ret = nfp_devlink_fill_eth_port(port, &eth_port);
-       rtnl_unlock();
+       devlink_port_type_eth_set(&port->dl_port, port->netdev);
+       ret = nfp_devlink_port_attrs_set(port);
        if (ret)
                return ret;
 
-       devlink_port_type_eth_set(&port->dl_port, port->netdev);
-       if (eth_port.is_split)
-               devlink_port_split_set(&port->dl_port, eth_port.label_port);
-
        devlink = priv_to_devlink(app->pf);
 
        return devlink_port_register(devlink, &port->dl_port, port->eth_id);
diff --git a/include/net/devlink.h b/include/net/devlink.h
index c83125ad20ff..29c3bc260a3e 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -35,6 +35,13 @@ struct devlink {
        char priv[0] __aligned(NETDEV_ALIGN);
 };
 
+struct devlink_port_attrs {
+       bool set;
+       u32 port_number; /* same value as "split group" */
+       bool split;
+       u32 split_subport_number;
+};
+
 struct devlink_port {
        struct list_head list;
        struct devlink *devlink;
@@ -43,8 +50,7 @@ struct devlink_port {
        enum devlink_port_type type;
        enum devlink_port_type desired_type;
        void *type_dev;
-       bool split;
-       u32 split_group;
+       struct devlink_port_attrs attrs;
 };
 
 struct devlink_sb_pool_info {
@@ -373,8 +379,9 @@ void devlink_port_type_eth_set(struct devlink_port 
*devlink_port,
 void devlink_port_type_ib_set(struct devlink_port *devlink_port,
                              struct ib_device *ibdev);
 void devlink_port_type_clear(struct devlink_port *devlink_port);
-void devlink_port_split_set(struct devlink_port *devlink_port,
-                           u32 split_group);
+void devlink_port_attrs_set(struct devlink_port *devlink_port,
+                           u32 port_number, bool split,
+                           u32 split_subport_number);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
                        u16 egress_pools_count, u16 ingress_tc_count,
@@ -468,8 +475,9 @@ static inline void devlink_port_type_clear(struct 
devlink_port *devlink_port)
 {
 }
 
-static inline void devlink_port_split_set(struct devlink_port *devlink_port,
-                                         u32 split_group)
+static inline void devlink_port_attrs_set(struct devlink_port *devlink_port,
+                                         u32 port_number, bool split,
+                                         u32 split_subport_number)
 {
 }
 
diff --git a/include/uapi/linux/devlink.h b/include/uapi/linux/devlink.h
index 1df65a4c2044..15b031a5ee7a 100644
--- a/include/uapi/linux/devlink.h
+++ b/include/uapi/linux/devlink.h
@@ -224,6 +224,9 @@ enum devlink_attr {
        DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_ID,   /* u64 */
        DEVLINK_ATTR_DPIPE_TABLE_RESOURCE_UNITS,/* u64 */
 
+       DEVLINK_ATTR_PORT_NUMBER,               /* u32 */
+       DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER, /* u32 */
+
        /* add new attributes above here, update the policy in devlink.c */
 
        __DEVLINK_ATTR_MAX,
diff --git a/net/core/devlink.c b/net/core/devlink.c
index f23e5ed7c90f..b0fca9644722 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -453,6 +453,25 @@ static void devlink_notify(struct devlink *devlink, enum 
devlink_command cmd)
                                msg, 0, DEVLINK_MCGRP_CONFIG, GFP_KERNEL);
 }
 
+static int devlink_nl_port_attrs_put(struct sk_buff *msg,
+                                    struct devlink_port *devlink_port)
+{
+       struct devlink_port_attrs *attrs = &devlink_port->attrs;
+
+       if (!attrs->set)
+               return 0;
+       if (nla_put_u32(msg, DEVLINK_ATTR_PORT_NUMBER, attrs->port_number))
+               return -EMSGSIZE;
+       if (!attrs->split)
+               return 0;
+       if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP, attrs->port_number))
+               return -EMSGSIZE;
+       if (nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_SUBPORT_NUMBER,
+                       attrs->split_subport_number))
+               return -EMSGSIZE;
+       return 0;
+}
+
 static int devlink_nl_port_fill(struct sk_buff *msg, struct devlink *devlink,
                                struct devlink_port *devlink_port,
                                enum devlink_command cmd, u32 portid,
@@ -492,9 +511,7 @@ static int devlink_nl_port_fill(struct sk_buff *msg, struct 
devlink *devlink,
                                   ibdev->name))
                        goto nla_put_failure;
        }
-       if (devlink_port->split &&
-           nla_put_u32(msg, DEVLINK_ATTR_PORT_SPLIT_GROUP,
-                       devlink_port->split_group))
+       if (devlink_nl_port_attrs_put(msg, devlink_port))
                goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
@@ -2972,19 +2989,28 @@ void devlink_port_type_clear(struct devlink_port 
*devlink_port)
 EXPORT_SYMBOL_GPL(devlink_port_type_clear);
 
 /**
- *     devlink_port_split_set - Set port is split
+ *     devlink_port_attrs_set - Set port attributes
  *
  *     @devlink_port: devlink port
- *     @split_group: split group - identifies group split port is part of
+ *     @port_number: number of the port that is facing user, for example
+ *                   the front panel port number
+ *     @split: indicates if this is split port
+ *     @split_subport_number: if the port is split, this is the number
+ *                            of subport.
  */
-void devlink_port_split_set(struct devlink_port *devlink_port,
-                           u32 split_group)
+void devlink_port_attrs_set(struct devlink_port *devlink_port,
+                           u32 port_number, bool split,
+                           u32 split_subport_number)
 {
-       devlink_port->split = true;
-       devlink_port->split_group = split_group;
+       struct devlink_port_attrs *attrs = &devlink_port->attrs;
+
+       attrs->set = true;
+       attrs->port_number = port_number;
+       attrs->split = split;
+       attrs->split_subport_number = split_subport_number;
        devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
 }
-EXPORT_SYMBOL_GPL(devlink_port_split_set);
+EXPORT_SYMBOL_GPL(devlink_port_attrs_set);
 
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
-- 
2.14.3

Reply via email to