net/mlx4_core: Adjustments to SET_PORT for IB SR-IOV
authorJack Morgenstein <jackm@dev.mellanox.co.il>
Fri, 3 Aug 2012 08:40:52 +0000 (08:40 +0000)
committerRoland Dreier <roland@purestorage.com>
Mon, 1 Oct 2012 03:33:40 +0000 (20:33 -0700)
1. Slaves may not set the IS_SM capability for the port.
2. DEV_MGMT may not be set in multifunction mode.

Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/net/ethernet/mellanox/mlx4/port.c
include/linux/mlx4/device.h

index e36dd0f..4c51b05 100644 (file)
@@ -732,6 +732,16 @@ static int mlx4_common_set_port(struct mlx4_dev *dev, int slave, u32 in_mod,
                new_cap_mask = ((__be32 *) inbox->buf)[1];
        }
 
+       /* slave may not set the IS_SM capability for the port */
+       if (slave != mlx4_master_func_num(dev) &&
+           (be32_to_cpu(new_cap_mask) & MLX4_PORT_CAP_IS_SM))
+               return -EINVAL;
+
+       /* No DEV_MGMT in multifunc mode */
+       if (mlx4_is_mfunc(dev) &&
+           (be32_to_cpu(new_cap_mask) & MLX4_PORT_CAP_DEV_MGMT_SUP))
+               return -EINVAL;
+
        agg_cap_mask = 0;
        slave_cap_mask =
                priv->mfunc.master.slave_state[slave].ib_cap_mask[port];
index 380e016..b3f9b45 100644 (file)
@@ -53,6 +53,11 @@ enum {
        MLX4_FLAG_SRIOV         = 1 << 4,
 };
 
+enum {
+       MLX4_PORT_CAP_IS_SM     = 1 << 1,
+       MLX4_PORT_CAP_DEV_MGMT_SUP = 1 << 19,
+};
+
 enum {
        MLX4_MAX_PORTS          = 2,
        MLX4_MAX_PORT_PKEYS     = 128