|
@@ -178,8 +178,8 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
struct mlx4_cmd_info *cmd)
|
|
|
{
|
|
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
|
|
- u8 field;
|
|
|
- u32 size;
|
|
|
+ u8 field, port;
|
|
|
+ u32 size, proxy_qp, qkey;
|
|
|
int err = 0;
|
|
|
|
|
|
#define QUERY_FUNC_CAP_FLAGS_OFFSET 0x0
|
|
@@ -209,6 +209,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
|
|
|
/* when opcode modifier = 1 */
|
|
|
#define QUERY_FUNC_CAP_PHYS_PORT_OFFSET 0x3
|
|
|
+#define QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET 0x4
|
|
|
#define QUERY_FUNC_CAP_FLAGS0_OFFSET 0x8
|
|
|
#define QUERY_FUNC_CAP_FLAGS1_OFFSET 0xc
|
|
|
|
|
@@ -221,6 +222,7 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
#define QUERY_FUNC_CAP_FLAGS1_FORCE_MAC 0x40
|
|
|
#define QUERY_FUNC_CAP_FLAGS1_FORCE_VLAN 0x80
|
|
|
#define QUERY_FUNC_CAP_FLAGS1_NIC_INFO 0x10
|
|
|
+#define QUERY_FUNC_CAP_VF_ENABLE_QP0 0x08
|
|
|
|
|
|
#define QUERY_FUNC_CAP_FLAGS0_FORCE_PHY_WQE_GID 0x80
|
|
|
|
|
@@ -234,28 +236,35 @@ int mlx4_QUERY_FUNC_CAP_wrapper(struct mlx4_dev *dev, int slave,
|
|
|
return -EINVAL;
|
|
|
|
|
|
vhcr->in_modifier = converted_port;
|
|
|
- /* Set nic_info bit to mark new fields support */
|
|
|
- field = QUERY_FUNC_CAP_FLAGS1_NIC_INFO;
|
|
|
- MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS1_OFFSET);
|
|
|
-
|
|
|
/* phys-port = logical-port */
|
|
|
field = vhcr->in_modifier -
|
|
|
find_first_bit(actv_ports.ports, dev->caps.num_ports);
|
|
|
MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_PHYS_PORT_OFFSET);
|
|
|
|
|
|
- field = vhcr->in_modifier;
|
|
|
+ port = vhcr->in_modifier;
|
|
|
+ proxy_qp = dev->phys_caps.base_proxy_sqpn + 8 * slave + port - 1;
|
|
|
+
|
|
|
+ /* Set nic_info bit to mark new fields support */
|
|
|
+ field = QUERY_FUNC_CAP_FLAGS1_NIC_INFO;
|
|
|
+
|
|
|
+ if (mlx4_vf_smi_enabled(dev, slave, port) &&
|
|
|
+ !mlx4_get_parav_qkey(dev, proxy_qp, &qkey)) {
|
|
|
+ field |= QUERY_FUNC_CAP_VF_ENABLE_QP0;
|
|
|
+ MLX4_PUT(outbox->buf, qkey,
|
|
|
+ QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET);
|
|
|
+ }
|
|
|
+ MLX4_PUT(outbox->buf, field, QUERY_FUNC_CAP_FLAGS1_OFFSET);
|
|
|
+
|
|
|
/* size is now the QP number */
|
|
|
- size = dev->phys_caps.base_tunnel_sqpn + 8 * slave + field - 1;
|
|
|
+ size = dev->phys_caps.base_tunnel_sqpn + 8 * slave + port - 1;
|
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP0_TUNNEL);
|
|
|
|
|
|
size += 2;
|
|
|
MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_TUNNEL);
|
|
|
|
|
|
- size = dev->phys_caps.base_proxy_sqpn + 8 * slave + field - 1;
|
|
|
- MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP0_PROXY);
|
|
|
-
|
|
|
- size += 2;
|
|
|
- MLX4_PUT(outbox->buf, size, QUERY_FUNC_CAP_QP1_PROXY);
|
|
|
+ MLX4_PUT(outbox->buf, proxy_qp, QUERY_FUNC_CAP_QP0_PROXY);
|
|
|
+ proxy_qp += 2;
|
|
|
+ MLX4_PUT(outbox->buf, proxy_qp, QUERY_FUNC_CAP_QP1_PROXY);
|
|
|
|
|
|
MLX4_PUT(outbox->buf, dev->caps.phys_port_id[vhcr->in_modifier],
|
|
|
QUERY_FUNC_CAP_PHYS_PORT_ID);
|
|
@@ -326,7 +335,7 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u32 gen_or_port,
|
|
|
struct mlx4_cmd_mailbox *mailbox;
|
|
|
u32 *outbox;
|
|
|
u8 field, op_modifier;
|
|
|
- u32 size;
|
|
|
+ u32 size, qkey;
|
|
|
int err = 0, quotas = 0;
|
|
|
|
|
|
op_modifier = !!gen_or_port; /* 0 = general, 1 = logical port */
|
|
@@ -442,6 +451,13 @@ int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u32 gen_or_port,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ if (func_cap->flags1 & QUERY_FUNC_CAP_VF_ENABLE_QP0) {
|
|
|
+ MLX4_GET(qkey, outbox, QUERY_FUNC_CAP_PRIV_VF_QKEY_OFFSET);
|
|
|
+ func_cap->qp0_qkey = qkey;
|
|
|
+ } else {
|
|
|
+ func_cap->qp0_qkey = 0;
|
|
|
+ }
|
|
|
+
|
|
|
MLX4_GET(size, outbox, QUERY_FUNC_CAP_QP0_TUNNEL);
|
|
|
func_cap->qp0_tunnel_qpn = size & 0xFFFFFF;
|
|
|
|