net/mlx4_core: Add XRC domains and counters to resource tracker
[pandora-kernel.git] / drivers / net / ethernet / mellanox / mlx4 / main.c
index 2e94f76..984ace4 100644 (file)
@@ -1306,7 +1306,7 @@ static void mlx4_cleanup_counters_table(struct mlx4_dev *dev)
        mlx4_bitmap_cleanup(&mlx4_priv(dev)->counters_bitmap);
 }
 
-int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
+int __mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
 {
        struct mlx4_priv *priv = mlx4_priv(dev);
 
@@ -1319,13 +1319,44 @@ int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
 
        return 0;
 }
+
+int mlx4_counter_alloc(struct mlx4_dev *dev, u32 *idx)
+{
+       u64 out_param;
+       int err;
+
+       if (mlx4_is_mfunc(dev)) {
+               err = mlx4_cmd_imm(dev, 0, &out_param, RES_COUNTER,
+                                  RES_OP_RESERVE, MLX4_CMD_ALLOC_RES,
+                                  MLX4_CMD_TIME_CLASS_A, MLX4_CMD_WRAPPED);
+               if (!err)
+                       *idx = get_param_l(&out_param);
+
+               return err;
+       }
+       return __mlx4_counter_alloc(dev, idx);
+}
 EXPORT_SYMBOL_GPL(mlx4_counter_alloc);
 
-void mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
+void __mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
 {
        mlx4_bitmap_free(&mlx4_priv(dev)->counters_bitmap, idx);
        return;
 }
+
+void mlx4_counter_free(struct mlx4_dev *dev, u32 idx)
+{
+       u64 in_param;
+
+       if (mlx4_is_mfunc(dev)) {
+               set_param_l(&in_param, idx);
+               mlx4_cmd(dev, in_param, RES_COUNTER, RES_OP_RESERVE,
+                        MLX4_CMD_FREE_RES, MLX4_CMD_TIME_CLASS_A,
+                        MLX4_CMD_WRAPPED);
+               return;
+       }
+       __mlx4_counter_free(dev, idx);
+}
 EXPORT_SYMBOL_GPL(mlx4_counter_free);
 
 static int mlx4_setup_hca(struct mlx4_dev *dev)