|
@@ -157,6 +157,7 @@ static void dump_dev_cap_flags2(struct mlx4_dev *dev, u64 flags)
|
|
|
[29] = "802.1ad offload support",
|
|
|
[31] = "Modifying loopback source checks using UPDATE_QP support",
|
|
|
[32] = "Loopback source checks support",
|
|
|
+ [33] = "RoCEv2 support"
|
|
|
};
|
|
|
int i;
|
|
|
|
|
@@ -626,6 +627,8 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+static void disable_unsupported_roce_caps(void *buf);
|
|
|
+
|
|
|
int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
|
{
|
|
|
struct mlx4_cmd_mailbox *mailbox;
|
|
@@ -738,6 +741,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
|
+ if (mlx4_is_mfunc(dev))
|
|
|
+ disable_unsupported_roce_caps(outbox);
|
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_RSVD_QP_OFFSET);
|
|
|
dev_cap->reserved_qps = 1 << (field & 0xf);
|
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_QP_OFFSET);
|
|
@@ -905,6 +910,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
|
|
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_EQE_STRIDE;
|
|
|
MLX4_GET(dev_cap->bmme_flags, outbox,
|
|
|
QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
|
|
|
+ if (dev_cap->bmme_flags & MLX4_FLAG_ROCE_V1_V2)
|
|
|
+ dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_ROCE_V1_V2;
|
|
|
if (dev_cap->bmme_flags & MLX4_FLAG_PORT_REMAP)
|
|
|
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_PORT_REMAP;
|
|
|
MLX4_GET(field, outbox, QUERY_DEV_CAP_CONFIG_DEV_OFFSET);
|
|
@@ -1160,6 +1167,7 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
if (err)
|
|
|
return err;
|
|
|
|
|
|
+ disable_unsupported_roce_caps(outbox->buf);
|
|
|
/* add port mng change event capability and disable mw type 1
|
|
|
* unconditionally to slaves
|
|
|
*/
|
|
@@ -1257,6 +1265,21 @@ int mlx4_QUERY_DEV_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void disable_unsupported_roce_caps(void *buf)
|
|
|
+{
|
|
|
+ u32 flags;
|
|
|
+
|
|
|
+ MLX4_GET(flags, buf, QUERY_DEV_CAP_EXT_FLAGS_OFFSET);
|
|
|
+ flags &= ~(1UL << 31);
|
|
|
+ MLX4_PUT(buf, flags, QUERY_DEV_CAP_EXT_FLAGS_OFFSET);
|
|
|
+ MLX4_GET(flags, buf, QUERY_DEV_CAP_EXT_2_FLAGS_OFFSET);
|
|
|
+ flags &= ~(1UL << 24);
|
|
|
+ MLX4_PUT(buf, flags, QUERY_DEV_CAP_EXT_2_FLAGS_OFFSET);
|
|
|
+ MLX4_GET(flags, buf, QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
|
|
|
+ flags &= ~(MLX4_FLAG_ROCE_V1_V2);
|
|
|
+ MLX4_PUT(buf, flags, QUERY_DEV_CAP_BMME_FLAGS_OFFSET);
|
|
|
+}
|
|
|
+
|
|
|
int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
struct mlx4_vhcr *vhcr,
|
|
|
struct mlx4_cmd_mailbox *inbox,
|