devlink: introduce devlink_port_attrs_set
authorJiri Pirko <jiri@mellanox.com>
Fri, 18 May 2018 07:29:00 +0000 (09:29 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 May 2018 20:30:39 +0000 (16:30 -0400)
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 <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/switchx2.c
drivers/net/ethernet/netronome/nfp/nfp_devlink.c
include/net/devlink.h
include/uapi/linux/devlink.h
net/core/devlink.c

index e13ac3b..9587696 100644 (file)
@@ -1714,15 +1714,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);
index 092d393..e65287c 100644 (file)
@@ -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,
index 94132f6..96f6d8a 100644 (file)
@@ -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;
 
index a655c58..551e050 100644 (file)
@@ -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;
 
index eb0fc61..d7a768f 100644 (file)
@@ -175,8 +175,8 @@ int nfp_devlink_port_register(struct nfp_app *app, struct nfp_port *port)
                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_port_attrs_set(&port->dl_port, eth_port.label_port,
+                              eth_port.is_split, eth_port.label_subport);
 
        devlink = priv_to_devlink(app->pf);
 
index 2e4f71e..d6ca922 100644 (file)
@@ -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 {
@@ -367,8 +373,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,
@@ -466,8 +473,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)
 {
 }
 
index 1df65a4..15b031a 100644 (file)
@@ -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,
index ad13173..8fde7d2 100644 (file)
@@ -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);
@@ -2971,19 +2988,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,