net/mlx5: Implement SRIOV attach/detach flows
Needed for lightweight and modular internal/pci error handling. Implement sriov attach function which enables pre-saved number of vfs on the device side. Implement sriov detach function which disable the current vfs on the device side. Init/cleanup function only handles sriov software context allocation and destruction. Signed-off-by: Mohamad Haj Yahia <mohamad@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
59211bd3b6
commit
acab721b5d
|
@ -91,6 +91,8 @@ void mlx5_enter_error_state(struct mlx5_core_dev *dev);
|
|||
void mlx5_disable_device(struct mlx5_core_dev *dev);
|
||||
int mlx5_sriov_init(struct mlx5_core_dev *dev);
|
||||
void mlx5_sriov_cleanup(struct mlx5_core_dev *dev);
|
||||
int mlx5_sriov_attach(struct mlx5_core_dev *dev);
|
||||
void mlx5_sriov_detach(struct mlx5_core_dev *dev);
|
||||
int mlx5_core_sriov_configure(struct pci_dev *dev, int num_vfs);
|
||||
bool mlx5_sriov_is_enabled(struct mlx5_core_dev *dev);
|
||||
int mlx5_core_enable_hca(struct mlx5_core_dev *dev, u16 func_id);
|
||||
|
|
|
@ -188,6 +188,25 @@ int mlx5_core_sriov_configure(struct pci_dev *pdev, int num_vfs)
|
|||
return err ? err : num_vfs;
|
||||
}
|
||||
|
||||
int mlx5_sriov_attach(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_core_sriov *sriov = &dev->priv.sriov;
|
||||
|
||||
if (!mlx5_core_is_pf(dev) || !sriov->num_vfs)
|
||||
return 0;
|
||||
|
||||
/* If sriov VFs exist in PCI level, enable them in device level */
|
||||
return mlx5_device_enable_sriov(dev, sriov->num_vfs);
|
||||
}
|
||||
|
||||
void mlx5_sriov_detach(struct mlx5_core_dev *dev)
|
||||
{
|
||||
if (!mlx5_core_is_pf(dev))
|
||||
return;
|
||||
|
||||
mlx5_device_disable_sriov(dev);
|
||||
}
|
||||
|
||||
int mlx5_sriov_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_core_sriov *sriov = &dev->priv.sriov;
|
||||
|
@ -203,12 +222,7 @@ int mlx5_sriov_init(struct mlx5_core_dev *dev)
|
|||
if (!sriov->vfs_ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
/* If sriov VFs exist in PCI level, enable them in device level */
|
||||
if (!sriov->num_vfs)
|
||||
return 0;
|
||||
|
||||
mlx5_device_enable_sriov(dev, sriov->num_vfs);
|
||||
return 0;
|
||||
return mlx5_sriov_attach(dev);
|
||||
}
|
||||
|
||||
void mlx5_sriov_cleanup(struct mlx5_core_dev *dev)
|
||||
|
@ -217,7 +231,6 @@ void mlx5_sriov_cleanup(struct mlx5_core_dev *dev)
|
|||
|
||||
if (!mlx5_core_is_pf(dev))
|
||||
return;
|
||||
|
||||
mlx5_device_disable_sriov(dev);
|
||||
mlx5_sriov_detach(dev);
|
||||
kfree(sriov->vfs_ctx);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue