devlink: add port to line card relationship set
authorJiri Pirko <jiri@nvidia.com>
Mon, 18 Apr 2022 06:42:28 +0000 (09:42 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 18 Apr 2022 10:00:18 +0000 (11:00 +0100)
In order to properly inform user about relationship between port and
line card, introduce a driver API to set line card for a port. Use this
information to extend port devlink netlink message by line card index
and also include the line card index into phys_port_name and by that
into a netdevice name.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/devlink.h
net/core/devlink.c

index d8061a11fee6a182211ee7ea13d040b8bfabc025..2a2a2a0c93f71ebb143656d808c26142b8589de6 100644 (file)
@@ -136,6 +136,7 @@ struct devlink_port {
        struct mutex reporters_lock; /* Protects reporter_list */
 
        struct devlink_rate *devlink_rate;
+       struct devlink_linecard *linecard;
 };
 
 struct devlink_port_new_attrs {
@@ -1571,6 +1572,8 @@ void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
 int devlink_rate_leaf_create(struct devlink_port *port, void *priv);
 void devlink_rate_leaf_destroy(struct devlink_port *devlink_port);
 void devlink_rate_nodes_destroy(struct devlink *devlink);
+void devlink_port_linecard_set(struct devlink_port *devlink_port,
+                              struct devlink_linecard *linecard);
 struct devlink_linecard *
 devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
                        const struct devlink_linecard_ops *ops, void *priv);
index aec0a517282c6a6a3ee1bce6d91d8665daebb93d..5cc88490f18fd24329df0a83a425ed680b7a10fb 100644 (file)
@@ -1243,6 +1243,10 @@ static int devlink_nl_port_fill(struct sk_buff *msg,
                goto nla_put_failure;
        if (devlink_nl_port_function_attrs_put(msg, devlink_port, extack))
                goto nla_put_failure;
+       if (devlink_port->linecard &&
+           nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX,
+                       devlink_port->linecard->index))
+               goto nla_put_failure;
 
        genlmsg_end(msg, hdr);
        return 0;
@@ -10105,6 +10109,21 @@ void devlink_rate_nodes_destroy(struct devlink *devlink)
 }
 EXPORT_SYMBOL_GPL(devlink_rate_nodes_destroy);
 
+/**
+ *     devlink_port_linecard_set - Link port with a linecard
+ *
+ *     @devlink_port: devlink port
+ *     @linecard: devlink linecard
+ */
+void devlink_port_linecard_set(struct devlink_port *devlink_port,
+                              struct devlink_linecard *linecard)
+{
+       if (WARN_ON(devlink_port->devlink))
+               return;
+       devlink_port->linecard = linecard;
+}
+EXPORT_SYMBOL_GPL(devlink_port_linecard_set);
+
 static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
                                             char *name, size_t len)
 {
@@ -10116,7 +10135,12 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
 
        switch (attrs->flavour) {
        case DEVLINK_PORT_FLAVOUR_PHYSICAL:
-               n = snprintf(name, len, "p%u", attrs->phys.port_number);
+               if (devlink_port->linecard)
+                       n = snprintf(name, len, "l%u",
+                                    devlink_port->linecard->index);
+               if (n < len)
+                       n += snprintf(name + n, len - n, "p%u",
+                                     attrs->phys.port_number);
                if (n < len && attrs->split)
                        n += snprintf(name + n, len - n, "s%u",
                                      attrs->phys.split_subport_number);