Merge tag 'mt76-for-kvalo-2021-01-29' of https://github.com/nbd168/wireless
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / esw / devlink_port.c
index ffff11b..cb1e181 100644 (file)
@@ -122,3 +122,44 @@ struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u1
        vport = mlx5_eswitch_get_vport(esw, vport_num);
        return vport->dl_port;
 }
+
+int mlx5_esw_devlink_sf_port_register(struct mlx5_eswitch *esw, struct devlink_port *dl_port,
+                                     u16 vport_num, u32 sfnum)
+{
+       struct mlx5_core_dev *dev = esw->dev;
+       struct netdev_phys_item_id ppid = {};
+       unsigned int dl_port_index;
+       struct mlx5_vport *vport;
+       struct devlink *devlink;
+       u16 pfnum;
+       int err;
+
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return PTR_ERR(vport);
+
+       pfnum = PCI_FUNC(dev->pdev->devfn);
+       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 = 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);
+       if (err)
+               return err;
+
+       vport->dl_port = dl_port;
+       return 0;
+}
+
+void mlx5_esw_devlink_sf_port_unregister(struct mlx5_eswitch *esw, u16 vport_num)
+{
+       struct mlx5_vport *vport;
+
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return;
+       devlink_port_unregister(vport->dl_port);
+       vport->dl_port = NULL;
+}