static void mlx5_device_disable_sriov(struct mlx5_core_dev *dev) { struct mlx5_core_sriov *sriov = &dev->priv.sriov; int err; int vf; if (!sriov->enabled_vfs) #ifdef CONFIG_MLX5_CORE_EN goto disable_sriov_resources; #else return; #endif for (vf = 0; vf < sriov->num_vfs; vf++) { if (!sriov->vfs_ctx[vf].enabled) continue; err = mlx5_core_disable_hca(dev, vf + 1); if (err) { mlx5_core_warn(dev, "failed to disable VF %d\n", vf); continue; } sriov->vfs_ctx[vf].enabled = 0; sriov->enabled_vfs--; } #ifdef CONFIG_MLX5_CORE_EN disable_sriov_resources: mlx5_eswitch_disable_sriov(dev->priv.eswitch); #endif if (mlx5_wait_for_vf_pages(dev)) mlx5_core_warn(dev, "timeout reclaiming VFs pages\n"); }
static void mlx5_device_disable_sriov(struct mlx5_core_dev *dev) { struct mlx5_core_sriov *sriov = &dev->priv.sriov; int err; int vf; if (!sriov->enabled_vfs) goto out; for (vf = 0; vf < sriov->num_vfs; vf++) { if (!sriov->vfs_ctx[vf].enabled) continue; err = mlx5_core_disable_hca(dev, vf + 1); if (err) { mlx5_core_warn(dev, "failed to disable VF %d\n", vf); continue; } sriov->vfs_ctx[vf].enabled = 0; sriov->enabled_vfs--; } out: if (MLX5_ESWITCH_MANAGER(dev)) mlx5_eswitch_disable_sriov(dev->priv.eswitch); if (mlx5_wait_for_vf_pages(dev)) mlx5_core_warn(dev, "timeout reclaiming VFs pages\n"); }
int mlx5_core_sriov_configure(struct pci_dev *pdev, int num_vfs) { struct mlx5_core_dev *dev = pci_get_drvdata(pdev); struct mlx5_core_sriov *sriov = &dev->priv.sriov; int err; mlx5_core_dbg(dev, "requested num_vfs %d\n", num_vfs); if (!mlx5_core_is_pf(dev)) return -EPERM; mlx5_core_cleanup_vfs(dev); if (!num_vfs) { #ifdef CONFIG_MLX5_CORE_EN mlx5_eswitch_disable_sriov(dev->priv.eswitch); #endif kfree(sriov->vfs_ctx); sriov->vfs_ctx = NULL; if (!pci_vfs_assigned(pdev)) pci_disable_sriov(pdev); else pr_info("unloading PF driver while leaving orphan VFs\n"); return 0; } err = mlx5_core_sriov_enable(pdev, num_vfs); if (err) { dev_warn(&pdev->dev, "mlx5_core_sriov_enable failed %d\n", err); return err; } mlx5_core_init_vfs(dev, num_vfs); #ifdef CONFIG_MLX5_CORE_EN mlx5_eswitch_enable_sriov(dev->priv.eswitch, num_vfs, SRIOV_LEGACY); #endif return num_vfs; }