Merge tag 'net-next-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev...
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
index d8d3647..2589e39 100644 (file)
@@ -1619,6 +1619,7 @@ static void remove_one(struct pci_dev *pdev)
        struct devlink *devlink = priv_to_devlink(dev);
 
        devlink_unregister(devlink);
+       mlx5_sriov_disable(pdev);
        mlx5_crdump_disable(dev);
        mlx5_drain_health_wq(dev);
        mlx5_uninit_one(dev);
@@ -1881,6 +1882,50 @@ static struct pci_driver mlx5_core_driver = {
        .sriov_set_msix_vec_count = mlx5_core_sriov_set_msix_vec_count,
 };
 
+/**
+ * mlx5_vf_get_core_dev - Get the mlx5 core device from a given VF PCI device if
+ *                     mlx5_core is its driver.
+ * @pdev: The associated PCI device.
+ *
+ * Upon return the interface state lock stay held to let caller uses it safely.
+ * Caller must ensure to use the returned mlx5 device for a narrow window
+ * and put it back with mlx5_vf_put_core_dev() immediately once usage was over.
+ *
+ * Return: Pointer to the associated mlx5_core_dev or NULL.
+ */
+struct mlx5_core_dev *mlx5_vf_get_core_dev(struct pci_dev *pdev)
+                       __acquires(&mdev->intf_state_mutex)
+{
+       struct mlx5_core_dev *mdev;
+
+       mdev = pci_iov_get_pf_drvdata(pdev, &mlx5_core_driver);
+       if (IS_ERR(mdev))
+               return NULL;
+
+       mutex_lock(&mdev->intf_state_mutex);
+       if (!test_bit(MLX5_INTERFACE_STATE_UP, &mdev->intf_state)) {
+               mutex_unlock(&mdev->intf_state_mutex);
+               return NULL;
+       }
+
+       return mdev;
+}
+EXPORT_SYMBOL(mlx5_vf_get_core_dev);
+
+/**
+ * mlx5_vf_put_core_dev - Put the mlx5 core device back.
+ * @mdev: The mlx5 core device.
+ *
+ * Upon return the interface state lock is unlocked and caller should not
+ * access the mdev any more.
+ */
+void mlx5_vf_put_core_dev(struct mlx5_core_dev *mdev)
+                       __releases(&mdev->intf_state_mutex)
+{
+       mutex_unlock(&mdev->intf_state_mutex);
+}
+EXPORT_SYMBOL(mlx5_vf_put_core_dev);
+
 static void mlx5_core_verify_params(void)
 {
        if (prof_sel >= ARRAY_SIZE(profile)) {