Introduce PCI PF and VF port flavour and port attributes such as PF number and VF number.
$ devlink port show pci/0000:05:00.0/0: type eth netdev eth0 flavour pcipf pfnum 0 pci/0000:05:00.0/1: type eth netdev eth1 flavour pcivf pfnum 0 vfnum 0 pci/0000:05:00.0/2: type eth netdev eth2 flavour pcivf pfnum 0 vfnum 1 Signed-off-by: Parav Pandit <pa...@mellanox.com> --- Changelog: v1->v2: - Instead of if-else using switch-case. - Split patch to two patches to have kernel header update in dedicated patch. --- devlink/devlink.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/devlink/devlink.c b/devlink/devlink.c index ac8c0fb1..d8197ea3 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -2794,11 +2794,29 @@ static const char *port_flavour_name(uint16_t flavour) return "cpu"; case DEVLINK_PORT_FLAVOUR_DSA: return "dsa"; + case DEVLINK_PORT_FLAVOUR_PCI_PF: + return "pcipf"; + case DEVLINK_PORT_FLAVOUR_PCI_VF: + return "pcivf"; default: return "<unknown flavour>"; } } +static void pr_out_port_pfvf_num(struct dl *dl, struct nlattr **tb) +{ + uint16_t fn_num; + + if (tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]) { + fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_PF_NUMBER]); + pr_out_uint(dl, "pfnum", fn_num); + } + if (tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]) { + fn_num = mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_PCI_VF_NUMBER]); + pr_out_uint(dl, "vfnum", fn_num); + } +} + static void pr_out_port(struct dl *dl, struct nlattr **tb) { struct nlattr *pt_attr = tb[DEVLINK_ATTR_PORT_TYPE]; @@ -2828,6 +2846,15 @@ static void pr_out_port(struct dl *dl, struct nlattr **tb) mnl_attr_get_u16(tb[DEVLINK_ATTR_PORT_FLAVOUR]); pr_out_str(dl, "flavour", port_flavour_name(port_flavour)); + + switch (port_flavour) { + case DEVLINK_PORT_FLAVOUR_PCI_PF: + case DEVLINK_PORT_FLAVOUR_PCI_VF: + pr_out_port_pfvf_num(dl, tb); + break; + default: + break; + } } if (tb[DEVLINK_ATTR_PORT_NUMBER]) { uint32_t port_number; -- 2.19.2