net/mlx4_core: Prevent VF from changing port configuration
[deliverable/linux.git] / drivers / net / ethernet / mellanox / mlx4 / fw.c
index 72289ef5ebbecc6e10ccb8ad2b5765723a59306d..e7639e31fc8a60e5be50170efa40c4e25dda522d 100644 (file)
@@ -2220,7 +2220,7 @@ static int mlx4_ACCESS_REG(struct mlx4_dev *dev, u16 reg_id,
        memcpy(inbuf->reg_data, reg_data, reg_len);
        err = mlx4_cmd_box(dev, inbox->dma, outbox->dma, 0, 0,
                           MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
-                          MLX4_CMD_NATIVE);
+                          MLX4_CMD_WRAPPED);
        if (err)
                goto out;
 
@@ -2263,3 +2263,31 @@ int mlx4_ACCESS_PTYS_REG(struct mlx4_dev *dev,
                               method, sizeof(*ptys_reg), ptys_reg);
 }
 EXPORT_SYMBOL_GPL(mlx4_ACCESS_PTYS_REG);
+
+int mlx4_ACCESS_REG_wrapper(struct mlx4_dev *dev, int slave,
+                           struct mlx4_vhcr *vhcr,
+                           struct mlx4_cmd_mailbox *inbox,
+                           struct mlx4_cmd_mailbox *outbox,
+                           struct mlx4_cmd_info *cmd)
+{
+       struct mlx4_access_reg *inbuf = inbox->buf;
+       u8 method = inbuf->method & MLX4_ACCESS_REG_METHOD_MASK;
+       u16 reg_id = be16_to_cpu(inbuf->reg_id);
+
+       if (slave != mlx4_master_func_num(dev) &&
+           method == MLX4_ACCESS_REG_WRITE)
+               return -EPERM;
+
+       if (reg_id == MLX4_REG_ID_PTYS) {
+               struct mlx4_ptys_reg *ptys_reg =
+                       (struct mlx4_ptys_reg *)inbuf->reg_data;
+
+               ptys_reg->local_port =
+                       mlx4_slave_convert_port(dev, slave,
+                                               ptys_reg->local_port);
+       }
+
+       return mlx4_cmd_box(dev, inbox->dma, outbox->dma, vhcr->in_modifier,
+                           0, MLX4_CMD_ACCESS_REG, MLX4_CMD_TIME_CLASS_C,
+                           MLX4_CMD_NATIVE);
+}
This page took 0.025426 seconds and 5 git commands to generate.