net/mlx5e: Create single netdev per SD group
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_main.c
index c8e8f512803efb7aea48e90259e852a55882403c..2c47c9076aa6d9dfc69b97475daec6fb87d4bcf2 100644 (file)
@@ -70,6 +70,7 @@
 #include "qos.h"
 #include "en/trap.h"
 #include "lib/devcom.h"
+#include "lib/sd.h"
 
 bool mlx5e_check_fragmented_striding_rq_cap(struct mlx5_core_dev *mdev, u8 page_shift,
                                            enum mlx5e_mpwrq_umr_mode umr_mode)
@@ -5980,7 +5981,7 @@ void mlx5e_destroy_netdev(struct mlx5e_priv *priv)
        free_netdev(netdev);
 }
 
-static int mlx5e_resume(struct auxiliary_device *adev)
+static int _mlx5e_resume(struct auxiliary_device *adev)
 {
        struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
        struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
@@ -6005,6 +6006,23 @@ static int mlx5e_resume(struct auxiliary_device *adev)
        return 0;
 }
 
+static int mlx5e_resume(struct auxiliary_device *adev)
+{
+       struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
+       struct mlx5_core_dev *mdev = edev->mdev;
+       struct auxiliary_device *actual_adev;
+       int err;
+
+       err = mlx5_sd_init(mdev);
+       if (err)
+               return err;
+
+       actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
+       if (actual_adev)
+               return _mlx5e_resume(actual_adev);
+       return 0;
+}
+
 static int _mlx5e_suspend(struct auxiliary_device *adev)
 {
        struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
@@ -6025,7 +6043,17 @@ static int _mlx5e_suspend(struct auxiliary_device *adev)
 
 static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state)
 {
-       return _mlx5e_suspend(adev);
+       struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
+       struct mlx5_core_dev *mdev = edev->mdev;
+       struct auxiliary_device *actual_adev;
+       int err = 0;
+
+       actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
+       if (actual_adev)
+               err = _mlx5e_suspend(actual_adev);
+
+       mlx5_sd_cleanup(mdev);
+       return err;
 }
 
 static int _mlx5e_probe(struct auxiliary_device *adev)
@@ -6071,9 +6099,9 @@ static int _mlx5e_probe(struct auxiliary_device *adev)
                goto err_destroy_netdev;
        }
 
-       err = mlx5e_resume(adev);
+       err = _mlx5e_resume(adev);
        if (err) {
-               mlx5_core_err(mdev, "mlx5e_resume failed, %d\n", err);
+               mlx5_core_err(mdev, "_mlx5e_resume failed, %d\n", err);
                goto err_profile_cleanup;
        }
 
@@ -6104,15 +6132,29 @@ err_devlink_unregister:
 static int mlx5e_probe(struct auxiliary_device *adev,
                       const struct auxiliary_device_id *id)
 {
-       return _mlx5e_probe(adev);
+       struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
+       struct mlx5_core_dev *mdev = edev->mdev;
+       struct auxiliary_device *actual_adev;
+       int err;
+
+       err = mlx5_sd_init(mdev);
+       if (err)
+               return err;
+
+       actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
+       if (actual_adev)
+               return _mlx5e_probe(actual_adev);
+       return 0;
 }
 
-static void mlx5e_remove(struct auxiliary_device *adev)
+static void _mlx5e_remove(struct auxiliary_device *adev)
 {
+       struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
        struct mlx5e_dev *mlx5e_dev = auxiliary_get_drvdata(adev);
        struct mlx5e_priv *priv = mlx5e_dev->priv;
+       struct mlx5_core_dev *mdev = edev->mdev;
 
-       mlx5_core_uplink_netdev_set(priv->mdev, NULL);
+       mlx5_core_uplink_netdev_set(mdev, NULL);
        mlx5e_dcbnl_delete_app(priv);
        unregister_netdev(priv->netdev);
        _mlx5e_suspend(adev);
@@ -6122,6 +6164,19 @@ static void mlx5e_remove(struct auxiliary_device *adev)
        mlx5e_destroy_devlink(mlx5e_dev);
 }
 
+static void mlx5e_remove(struct auxiliary_device *adev)
+{
+       struct mlx5_adev *edev = container_of(adev, struct mlx5_adev, adev);
+       struct mlx5_core_dev *mdev = edev->mdev;
+       struct auxiliary_device *actual_adev;
+
+       actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
+       if (actual_adev)
+               _mlx5e_remove(actual_adev);
+
+       mlx5_sd_cleanup(mdev);
+}
+
 static const struct auxiliary_device_id mlx5e_id_table[] = {
        { .name = MLX5_ADEV_NAME ".eth", },
        {},