OSDN Git Service

devlink: Extend SF port attributes to have external attribute
authorParav Pandit <parav@nvidia.com>
Wed, 10 Mar 2021 13:35:03 +0000 (15:35 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Sat, 24 Apr 2021 07:58:53 +0000 (00:58 -0700)
Extended SF port attributes to have optional external flag similar to
PCI PF and VF port attributes.

External atttibute is required to generate unique phys_port_name when PF number
and SF number are overlapping between two controllers similar to SR-IOV
VFs.

When a SF is for external controller an example view of external SF
port and config sequence.

On eswitch system:
$ devlink dev eswitch set pci/0033:01:00.0 mode switchdev

$ devlink port show
pci/0033:01:00.0/196607: type eth netdev enP51p1s0f0np0 flavour physical port 0 splittable false
pci/0033:01:00.0/131072: type eth netdev eth0 flavour pcipf controller 1 pfnum 0 external true splittable false
  function:
    hw_addr 00:00:00:00:00:00

$ devlink port add pci/0033:01:00.0 flavour pcisf pfnum 0 sfnum 77 controller 1
pci/0033:01:00.0/163840: type eth netdev eth1 flavour pcisf controller 1 pfnum 0 sfnum 77 splittable false
  function:
    hw_addr 00:00:00:00:00:00 state inactive opstate detached

phys_port_name construction:
$ cat /sys/class/net/eth1/phys_port_name
c1pf0sf77

Signed-off-by: Parav Pandit <parav@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Vu Pham <vuhuong@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
include/net/devlink.h
net/core/devlink.c

index 8e825ef..183f782 100644 (file)
@@ -141,7 +141,7 @@ int mlx5_esw_devlink_sf_port_register(struct mlx5_eswitch *esw, struct devlink_p
        mlx5_esw_get_port_parent_id(dev, &ppid);
        memcpy(dl_port->attrs.switch_id.id, &ppid.id[0], ppid.id_len);
        dl_port->attrs.switch_id.id_len = ppid.id_len;
-       devlink_port_attrs_pci_sf_set(dl_port, 0, pfnum, sfnum);
+       devlink_port_attrs_pci_sf_set(dl_port, 0, pfnum, sfnum, false);
        devlink = priv_to_devlink(dev);
        dl_port_index = mlx5_esw_vport_to_devlink_port_index(dev, vport_num);
        err = devlink_port_register(devlink, dl_port, dl_port_index);
index 853420d..7c984ca 100644 (file)
@@ -98,11 +98,13 @@ struct devlink_port_pci_vf_attrs {
  * @controller: Associated controller number
  * @sf: Associated PCI SF for of the PCI PF for this port.
  * @pf: Associated PCI PF number for this port.
+ * @external: when set, indicates if a port is for an external controller
  */
 struct devlink_port_pci_sf_attrs {
        u32 controller;
        u32 sf;
        u16 pf;
+       u8 external:1;
 };
 
 /**
@@ -1508,7 +1510,8 @@ void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 contro
 void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
                                   u16 pf, u16 vf, bool external);
 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
-                                  u32 controller, u16 pf, u32 sf);
+                                  u32 controller, u16 pf, u32 sf,
+                                  bool external);
 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,
index 737b61c..4eb9695 100644 (file)
@@ -8599,9 +8599,10 @@ EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_vf_set);
  *     @controller: associated controller number for the devlink port instance
  *     @pf: associated PF for the devlink port instance
  *     @sf: associated SF of a PF for the devlink port instance
+ *     @external: indicates if the port is for an external controller
  */
 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 controller,
-                                  u16 pf, u32 sf)
+                                  u16 pf, u32 sf, bool external)
 {
        struct devlink_port_attrs *attrs = &devlink_port->attrs;
        int ret;
@@ -8615,6 +8616,7 @@ void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, u32 contro
        attrs->pci_sf.controller = controller;
        attrs->pci_sf.pf = pf;
        attrs->pci_sf.sf = sf;
+       attrs->pci_sf.external = external;
 }
 EXPORT_SYMBOL_GPL(devlink_port_attrs_pci_sf_set);
 
@@ -8667,6 +8669,13 @@ static int __devlink_port_phys_port_name_get(struct devlink_port *devlink_port,
                             attrs->pci_vf.pf, attrs->pci_vf.vf);
                break;
        case DEVLINK_PORT_FLAVOUR_PCI_SF:
+               if (attrs->pci_sf.external) {
+                       n = snprintf(name, len, "c%u", attrs->pci_sf.controller);
+                       if (n >= len)
+                               return -EINVAL;
+                       len -= n;
+                       name += n;
+               }
                n = snprintf(name, len, "pf%usf%u", attrs->pci_sf.pf,
                             attrs->pci_sf.sf);
                break;