aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw
diff options
context:
space:
mode:
authorEli Cohen <eli@dev.mellanox.co.il>2014-04-01 17:10:16 -0400
committerRoland Dreier <roland@purestorage.com>2014-04-10 21:43:32 -0400
commitf360d88a2efddf2d2a2d01a8ac76fded34d624b4 (patch)
tree9ca4486f3bbd72018b5876a60ce2a351e5045271 /drivers/infiniband/hw
parent877f075aac900288ce2e6a64075cceff09210a7e (diff)
IB/mlx5: Add block multicast loopback support
Add support for the block multicast loopback QP creation flag along the proper firmware API for that. Signed-off-by: Eli Cohen <eli@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/infiniband/hw')
-rw-r--r--drivers/infiniband/hw/mlx5/main.c2
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c12
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index fa6dc870adae..364d4b6937f5 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -282,6 +282,8 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,
282 props->sig_guard_cap = IB_GUARD_T10DIF_CRC | 282 props->sig_guard_cap = IB_GUARD_T10DIF_CRC |
283 IB_GUARD_T10DIF_CSUM; 283 IB_GUARD_T10DIF_CSUM;
284 } 284 }
285 if (flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST)
286 props->device_cap_flags |= IB_DEVICE_BLOCK_MULTICAST_LOOPBACK;
285 287
286 props->vendor_id = be32_to_cpup((__be32 *)(out_mad->data + 36)) & 288 props->vendor_id = be32_to_cpup((__be32 *)(out_mad->data + 36)) &
287 0xffffff; 289 0xffffff;
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index ae788d27b93f..dc930ed21eca 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -807,6 +807,15 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
807 spin_lock_init(&qp->sq.lock); 807 spin_lock_init(&qp->sq.lock);
808 spin_lock_init(&qp->rq.lock); 808 spin_lock_init(&qp->rq.lock);
809 809
810 if (init_attr->create_flags & IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) {
811 if (!(dev->mdev.caps.flags & MLX5_DEV_CAP_FLAG_BLOCK_MCAST)) {
812 mlx5_ib_dbg(dev, "block multicast loopback isn't supported\n");
813 return -EINVAL;
814 } else {
815 qp->flags |= MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK;
816 }
817 }
818
810 if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) 819 if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR)
811 qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE; 820 qp->sq_signal_bits = MLX5_WQE_CTRL_CQ_UPDATE;
812 821
@@ -878,6 +887,9 @@ static int create_qp_common(struct mlx5_ib_dev *dev, struct ib_pd *pd,
878 if (qp->wq_sig) 887 if (qp->wq_sig)
879 in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_ENABLE_SIG); 888 in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_ENABLE_SIG);
880 889
890 if (qp->flags & MLX5_IB_QP_BLOCK_MULTICAST_LOOPBACK)
891 in->ctx.flags_pd |= cpu_to_be32(MLX5_QP_BLOCK_MCAST);
892
881 if (qp->scat_cqe && is_connected(init_attr->qp_type)) { 893 if (qp->scat_cqe && is_connected(init_attr->qp_type)) {
882 int rcqe_sz; 894 int rcqe_sz;
883 int scqe_sz; 895 int scqe_sz;