Fri, Jan 15, 2021 at 05:10:48PM CET, ido...@idosch.org wrote: >On Wed, Jan 13, 2021 at 01:12:17PM +0100, Jiri Pirko wrote: >> index ec00cd94c626..cb911b6fdeda 100644 >> --- a/include/net/devlink.h >> +++ b/include/net/devlink.h >> @@ -137,6 +137,7 @@ struct devlink_port { >> struct delayed_work type_warn_dw; >> struct list_head reporter_list; >> struct mutex reporters_lock; /* Protects reporter_list */ >> + struct devlink_linecard *linecard; >> }; >> >> struct devlink_linecard_ops; >> @@ -1438,6 +1439,8 @@ void devlink_port_attrs_pci_pf_set(struct devlink_port >> *devlink_port, u32 contro >> u16 pf, bool external); >> void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 >> controller, >> u16 pf, u16 vf, bool external); >> +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); >> diff --git a/net/core/devlink.c b/net/core/devlink.c >> index 347976b88404..2faa30cc5cce 100644 >> --- a/net/core/devlink.c >> +++ b/net/core/devlink.c >> @@ -855,6 +855,10 @@ static int devlink_nl_port_fill(struct sk_buff *msg, >> struct devlink *devlink, >> 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; >> @@ -8642,6 +8646,21 @@ void devlink_port_attrs_pci_vf_set(struct >> devlink_port *devlink_port, u32 contro >> } >> EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set); >> >> +/** >> + * devlink_port_linecard_set - Link port with a linecard >> + * >> + * @devlink_port: devlink port >> + * @devlink_linecard: devlink linecard >> + */ >> +void devlink_port_linecard_set(struct devlink_port *devlink_port, >> + struct devlink_linecard *linecard) >> +{ >> + if (WARN_ON(devlink_port->registered)) >> + return; >> + devlink_port->linecard = linecard; > >We already have devlink_port_attrs_set() that is called before the port >is registered, why not extend it to also set the linecard information?
I was thinking about that. Looked odd to put the linecard pointer to the attr struct. I like it better this way. But if you insist. > >> +} >> +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) >> { >> @@ -8654,7 +8673,11 @@ static int __devlink_port_phys_port_name_get(struct >> devlink_port *devlink_port, >> switch (attrs->flavour) { >> case DEVLINK_PORT_FLAVOUR_PHYSICAL: >> case DEVLINK_PORT_FLAVOUR_VIRTUAL: >> - n = snprintf(name, len, "p%u", attrs->phys.port_number); >> + if (devlink_port->linecard) >> + n = snprintf(name, len, "l%u", >> + devlink_port->linecard->index); >> + n += snprintf(name + n, len - n, "p%u", >> + attrs->phys.port_number); >> if (attrs->split) >> n += snprintf(name + n, len - n, "s%u", >> attrs->phys.split_subport_number); >> -- >> 2.26.2 >>