net/mlx4_core: Remove counters table allocation from VF flow
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / main.c
index 2bf5468..8b27bfc 100644 (file)
@@ -2198,6 +2198,9 @@ static int mlx4_init_counters_table(struct mlx4_dev *dev)
        if (!(dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS))
                return -ENOENT;
 
+       if (!dev->caps.max_counters)
+               return -ENOSPC;
+
        nent_pow2 = roundup_pow_of_two(dev->caps.max_counters);
        /* reserve last counter index for sink counter */
        return mlx4_bitmap_init(&priv->counters_bitmap, nent_pow2,
@@ -2210,6 +2213,9 @@ static void mlx4_cleanup_counters_table(struct mlx4_dev *dev)
        if (!(dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS))
                return;
 
+       if (!dev->caps.max_counters)
+               return;
+
        mlx4_bitmap_cleanup(&mlx4_priv(dev)->counters_bitmap);
 }
 
@@ -2425,10 +2431,12 @@ static int mlx4_setup_hca(struct mlx4_dev *dev)
                goto err_srq_table_free;
        }
 
-       err = mlx4_init_counters_table(dev);
-       if (err && err != -ENOENT) {
-               mlx4_err(dev, "Failed to initialize counters table, aborting\n");
-               goto err_qp_table_free;
+       if (!mlx4_is_slave(dev)) {
+               err = mlx4_init_counters_table(dev);
+               if (err && err != -ENOENT) {
+                       mlx4_err(dev, "Failed to initialize counters table, aborting\n");
+                       goto err_qp_table_free;
+               }
        }
 
        if (!mlx4_is_slave(dev)) {
@@ -2470,7 +2478,8 @@ static int mlx4_setup_hca(struct mlx4_dev *dev)
        return 0;
 
 err_counters_table_free:
-       mlx4_cleanup_counters_table(dev);
+       if (!mlx4_is_slave(dev))
+               mlx4_cleanup_counters_table(dev);
 
 err_qp_table_free:
        mlx4_cleanup_qp_table(dev);
@@ -3203,7 +3212,8 @@ err_port:
        for (--port; port >= 1; --port)
                mlx4_cleanup_port_info(&priv->port[port]);
 
-       mlx4_cleanup_counters_table(dev);
+       if (!mlx4_is_slave(dev))
+               mlx4_cleanup_counters_table(dev);
        mlx4_cleanup_qp_table(dev);
        mlx4_cleanup_srq_table(dev);
        mlx4_cleanup_cq_table(dev);
@@ -3501,7 +3511,8 @@ static void mlx4_unload_one(struct pci_dev *pdev)
                mlx4_free_resource_tracker(dev,
                                           RES_TR_FREE_SLAVES_ONLY);
 
-       mlx4_cleanup_counters_table(dev);
+       if (!mlx4_is_slave(dev))
+               mlx4_cleanup_counters_table(dev);
        mlx4_cleanup_qp_table(dev);
        mlx4_cleanup_srq_table(dev);
        mlx4_cleanup_cq_table(dev);