net/mlx5: Refactor LAG peer device lookout bus logic to mlx5 devcom
[linux-2.6-block.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
index 307ffe6300f8e96c0ed15367e21b78fc9287d368..a17152c1cbb247efa46b875698cf2eac3738e82a 100644 (file)
@@ -73,6 +73,7 @@
 #include "sf/sf.h"
 #include "mlx5_irq.h"
 #include "hwmon.h"
+#include "lag/lag.h"
 
 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
 MODULE_DESCRIPTION("Mellanox 5th generation network adapters (ConnectX series) core driver");
@@ -952,6 +953,27 @@ static void mlx5_pci_close(struct mlx5_core_dev *dev)
        mlx5_pci_disable_device(dev);
 }
 
+static void mlx5_register_hca_devcom_comp(struct mlx5_core_dev *dev)
+{
+       /* This component is use to sync adding core_dev to lag_dev and to sync
+        * changes of mlx5_adev_devices between LAG layer and other layers.
+        */
+       if (!mlx5_lag_is_supported(dev))
+               return;
+
+       dev->priv.hca_devcom_comp =
+               mlx5_devcom_register_component(dev->priv.devc, MLX5_DEVCOM_HCA_PORTS,
+                                              mlx5_query_nic_system_image_guid(dev),
+                                              NULL, dev);
+       if (IS_ERR_OR_NULL(dev->priv.hca_devcom_comp))
+               mlx5_core_err(dev, "Failed to register devcom HCA component\n");
+}
+
+static void mlx5_unregister_hca_devcom_comp(struct mlx5_core_dev *dev)
+{
+       mlx5_devcom_unregister_component(dev->priv.hca_devcom_comp);
+}
+
 static int mlx5_init_once(struct mlx5_core_dev *dev)
 {
        int err;
@@ -960,6 +982,7 @@ static int mlx5_init_once(struct mlx5_core_dev *dev)
        if (IS_ERR(dev->priv.devc))
                mlx5_core_warn(dev, "failed to register devcom device %ld\n",
                               PTR_ERR(dev->priv.devc));
+       mlx5_register_hca_devcom_comp(dev);
 
        err = mlx5_query_board_id(dev);
        if (err) {
@@ -1094,6 +1117,7 @@ err_eq_cleanup:
 err_irq_cleanup:
        mlx5_irq_table_cleanup(dev);
 err_devcom:
+       mlx5_unregister_hca_devcom_comp(dev);
        mlx5_devcom_unregister_device(dev->priv.devc);
 
        return err;
@@ -1123,6 +1147,7 @@ static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
        mlx5_events_cleanup(dev);
        mlx5_eq_table_cleanup(dev);
        mlx5_irq_table_cleanup(dev);
+       mlx5_unregister_hca_devcom_comp(dev);
        mlx5_devcom_unregister_device(dev->priv.devc);
 }