net/mlx4_core: Add sink counter
[linux-2.6-block.git] / drivers / net / ethernet / mellanox / mlx4 / main.c
index 1072dc1054dd0867258e14c9064f5f52d04627ee..2bf54687f9fb03c37ebb7520cd73428422eb0d9f 100644 (file)
@@ -479,7 +479,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
                }
        }
 
-       dev->caps.max_counters = 1 << ilog2(dev_cap->max_counters);
+       dev->caps.max_counters = dev_cap->max_counters;
 
        dev->caps.reserved_qps_cnt[MLX4_QP_REGION_FW] = dev_cap->reserved_qps;
        dev->caps.reserved_qps_cnt[MLX4_QP_REGION_ETH_ADDR] =
@@ -2193,13 +2193,16 @@ err_free_icm:
 static int mlx4_init_counters_table(struct mlx4_dev *dev)
 {
        struct mlx4_priv *priv = mlx4_priv(dev);
-       int nent;
+       int nent_pow2;
 
        if (!(dev->caps.flags & MLX4_DEV_CAP_FLAG_COUNTERS))
                return -ENOENT;
 
-       nent = dev->caps.max_counters;
-       return mlx4_bitmap_init(&priv->counters_bitmap, nent, nent - 1, 0, 0);
+       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,
+                               nent_pow2 - 1, 0,
+                               nent_pow2 - dev->caps.max_counters + 1);
 }
 
 static void mlx4_cleanup_counters_table(struct mlx4_dev *dev)