aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx5/main.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 8fd35ebb13e3..4a043cf35b9a 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -995,6 +995,31 @@ static int mlx5_ib_modify_device(struct ib_device *ibdev, int mask,
995 return err; 995 return err;
996} 996}
997 997
998static int set_port_caps_atomic(struct mlx5_ib_dev *dev, u8 port_num, u32 mask,
999 u32 value)
1000{
1001 struct mlx5_hca_vport_context ctx = {};
1002 int err;
1003
1004 err = mlx5_query_hca_vport_context(dev->mdev, 0,
1005 port_num, 0, &ctx);
1006 if (err)
1007 return err;
1008
1009 if (~ctx.cap_mask1_perm & mask) {
1010 mlx5_ib_warn(dev, "trying to change bitmask 0x%X but change supported 0x%X\n",
1011 mask, ctx.cap_mask1_perm);
1012 return -EINVAL;
1013 }
1014
1015 ctx.cap_mask1 = value;
1016 ctx.cap_mask1_perm = mask;
1017 err = mlx5_core_modify_hca_vport_context(dev->mdev, 0,
1018 port_num, 0, &ctx);
1019
1020 return err;
1021}
1022
998static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask, 1023static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
999 struct ib_port_modify *props) 1024 struct ib_port_modify *props)
1000{ 1025{
@@ -1002,6 +1027,16 @@ static int mlx5_ib_modify_port(struct ib_device *ibdev, u8 port, int mask,
1002 struct ib_port_attr attr; 1027 struct ib_port_attr attr;
1003 u32 tmp; 1028 u32 tmp;
1004 int err; 1029 int err;
1030 u32 change_mask;
1031 u32 value;
1032 bool is_ib = (mlx5_ib_port_link_layer(ibdev, port) ==
1033 IB_LINK_LAYER_INFINIBAND);
1034
1035 if (MLX5_CAP_GEN(dev->mdev, ib_virt) && is_ib) {
1036 change_mask = props->clr_port_cap_mask | props->set_port_cap_mask;
1037 value = ~props->clr_port_cap_mask | props->set_port_cap_mask;
1038 return set_port_caps_atomic(dev, port, change_mask, value);
1039 }
1005 1040
1006 mutex_lock(&dev->cap_mask_mutex); 1041 mutex_lock(&dev->cap_mask_mutex);
1007 1042