net/mlx5e: Add CONFIG_MLX5_EN_ARFS for accelerated flow steering support
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
index 615005e6381958c6f8289897993fda27a8693e25..cf3e4a6590524e1c9cdd9fb2da7ab512abbb2efc 100644 (file)
 #include "accel/ipsec.h"
 #include "accel/tls.h"
 #include "lib/clock.h"
+#include "lib/vxlan.h"
+#include "diag/fw_tracer.h"
 
 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
-MODULE_DESCRIPTION("Mellanox Connect-IB, ConnectX-4 core driver");
+MODULE_DESCRIPTION("Mellanox 5th generation network adapters (ConnectX series) core driver");
 MODULE_LICENSE("Dual BSD/GPL");
 MODULE_VERSION(DRIVER_VERSION);
 
@@ -321,7 +323,9 @@ static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev)
 {
        struct mlx5_priv *priv = &dev->priv;
        struct mlx5_eq_table *table = &priv->eq_table;
-       int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq);
+       int num_eqs = MLX5_CAP_GEN(dev, max_num_eqs) ?
+                     MLX5_CAP_GEN(dev, max_num_eqs) :
+                     1 << MLX5_CAP_GEN(dev, log_max_eq);
        int nvec;
        int err;
 
@@ -960,6 +964,8 @@ static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
 
        mlx5_init_clock(dev);
 
+       dev->vxlan = mlx5_vxlan_create(dev);
+
        err = mlx5_init_rl_table(dev);
        if (err) {
                dev_err(&pdev->dev, "Failed to init rate limiting\n");
@@ -990,6 +996,8 @@ static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
                goto err_sriov_cleanup;
        }
 
+       dev->tracer = mlx5_fw_tracer_create(dev);
+
        return 0;
 
 err_sriov_cleanup:
@@ -1001,6 +1009,7 @@ err_mpfs_cleanup:
 err_rl_cleanup:
        mlx5_cleanup_rl_table(dev);
 err_tables_cleanup:
+       mlx5_vxlan_destroy(dev->vxlan);
        mlx5_cleanup_mkey_table(dev);
        mlx5_cleanup_srq_table(dev);
        mlx5_cleanup_qp_table(dev);
@@ -1015,11 +1024,13 @@ out:
 
 static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
 {
+       mlx5_fw_tracer_destroy(dev->tracer);
        mlx5_fpga_cleanup(dev);
        mlx5_sriov_cleanup(dev);
        mlx5_eswitch_cleanup(dev->priv.eswitch);
        mlx5_mpfs_cleanup(dev);
        mlx5_cleanup_rl_table(dev);
+       mlx5_vxlan_destroy(dev->vxlan);
        mlx5_cleanup_clock(dev);
        mlx5_cleanup_reserved_gids(dev);
        mlx5_cleanup_mkey_table(dev);
@@ -1167,10 +1178,16 @@ static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
                goto err_put_uars;
        }
 
+       err = mlx5_fw_tracer_init(dev->tracer);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to init FW tracer\n");
+               goto err_fw_tracer;
+       }
+
        err = alloc_comp_eqs(dev);
        if (err) {
                dev_err(&pdev->dev, "Failed to alloc completion EQs\n");
-               goto err_stop_eqs;
+               goto err_comp_eqs;
        }
 
        err = mlx5_irq_set_affinity_hints(dev);
@@ -1252,7 +1269,10 @@ err_fpga_start:
 err_affinity_hints:
        free_comp_eqs(dev);
 
-err_stop_eqs:
+err_comp_eqs:
+       mlx5_fw_tracer_cleanup(dev->tracer);
+
+err_fw_tracer:
        mlx5_stop_eqs(dev);
 
 err_put_uars:
@@ -1320,6 +1340,7 @@ static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
        mlx5_fpga_device_stop(dev);
        mlx5_irq_clear_affinity_hints(dev);
        free_comp_eqs(dev);
+       mlx5_fw_tracer_cleanup(dev->tracer);
        mlx5_stop_eqs(dev);
        mlx5_put_uars_page(dev, priv->uar);
        mlx5_free_irq_vectors(dev);