diff options
| -rw-r--r-- | drivers/infiniband/hw/mlx4/main.c | 3 | ||||
| -rw-r--r-- | drivers/infiniband/hw/mlx4/srq.c | 13 | ||||
| -rw-r--r-- | drivers/net/mlx4/srq.c | 20 | ||||
| -rw-r--r-- | include/linux/mlx4/device.h | 4 |
4 files changed, 24 insertions, 16 deletions
diff --git a/drivers/infiniband/hw/mlx4/main.c b/drivers/infiniband/hw/mlx4/main.c index 23e45df9ae36..42a538e5df36 100644 --- a/drivers/infiniband/hw/mlx4/main.c +++ b/drivers/infiniband/hw/mlx4/main.c | |||
| @@ -1095,7 +1095,8 @@ static void *mlx4_ib_add(struct mlx4_dev *dev) | |||
| 1095 | (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | | 1095 | (1ull << IB_USER_VERBS_CMD_CREATE_SRQ) | |
| 1096 | (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | | 1096 | (1ull << IB_USER_VERBS_CMD_MODIFY_SRQ) | |
| 1097 | (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | | 1097 | (1ull << IB_USER_VERBS_CMD_QUERY_SRQ) | |
| 1098 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ); | 1098 | (1ull << IB_USER_VERBS_CMD_DESTROY_SRQ) | |
| 1099 | (1ull << IB_USER_VERBS_CMD_CREATE_XSRQ); | ||
| 1099 | 1100 | ||
| 1100 | ibdev->ib_dev.query_device = mlx4_ib_query_device; | 1101 | ibdev->ib_dev.query_device = mlx4_ib_query_device; |
| 1101 | ibdev->ib_dev.query_port = mlx4_ib_query_port; | 1102 | ibdev->ib_dev.query_port = mlx4_ib_query_port; |
diff --git a/drivers/infiniband/hw/mlx4/srq.c b/drivers/infiniband/hw/mlx4/srq.c index 4f7f7600d27c..39542f3703b8 100644 --- a/drivers/infiniband/hw/mlx4/srq.c +++ b/drivers/infiniband/hw/mlx4/srq.c | |||
| @@ -76,14 +76,13 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd, | |||
| 76 | struct mlx4_ib_srq *srq; | 76 | struct mlx4_ib_srq *srq; |
| 77 | struct mlx4_wqe_srq_next_seg *next; | 77 | struct mlx4_wqe_srq_next_seg *next; |
| 78 | struct mlx4_wqe_data_seg *scatter; | 78 | struct mlx4_wqe_data_seg *scatter; |
| 79 | u32 cqn; | ||
| 80 | u16 xrcdn; | ||
| 79 | int desc_size; | 81 | int desc_size; |
| 80 | int buf_size; | 82 | int buf_size; |
| 81 | int err; | 83 | int err; |
| 82 | int i; | 84 | int i; |
| 83 | 85 | ||
| 84 | if (init_attr->srq_type != IB_SRQT_BASIC) | ||
| 85 | return ERR_PTR(-ENOSYS); | ||
| 86 | |||
| 87 | /* Sanity check SRQ size before proceeding */ | 86 | /* Sanity check SRQ size before proceeding */ |
| 88 | if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes || | 87 | if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes || |
| 89 | init_attr->attr.max_sge > dev->dev->caps.max_srq_sge) | 88 | init_attr->attr.max_sge > dev->dev->caps.max_srq_sge) |
| @@ -177,12 +176,18 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd, | |||
| 177 | } | 176 | } |
| 178 | } | 177 | } |
| 179 | 178 | ||
| 180 | err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, &srq->mtt, | 179 | cqn = (init_attr->srq_type == IB_SRQT_XRC) ? |
| 180 | to_mcq(init_attr->ext.xrc.cq)->mcq.cqn : 0; | ||
| 181 | xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ? | ||
| 182 | to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn : | ||
| 183 | (u16) dev->dev->caps.reserved_xrcds; | ||
| 184 | err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, cqn, xrcdn, &srq->mtt, | ||
| 181 | srq->db.dma, &srq->msrq); | 185 | srq->db.dma, &srq->msrq); |
| 182 | if (err) | 186 | if (err) |
| 183 | goto err_wrid; | 187 | goto err_wrid; |
| 184 | 188 | ||
| 185 | srq->msrq.event = mlx4_ib_srq_event; | 189 | srq->msrq.event = mlx4_ib_srq_event; |
| 190 | srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn; | ||
| 186 | 191 | ||
| 187 | if (pd->uobject) | 192 | if (pd->uobject) |
| 188 | if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) { | 193 | if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) { |
diff --git a/drivers/net/mlx4/srq.c b/drivers/net/mlx4/srq.c index 3b07b80a0456..a20b141dbb5c 100644 --- a/drivers/net/mlx4/srq.c +++ b/drivers/net/mlx4/srq.c | |||
| @@ -40,20 +40,20 @@ | |||
| 40 | struct mlx4_srq_context { | 40 | struct mlx4_srq_context { |
| 41 | __be32 state_logsize_srqn; | 41 | __be32 state_logsize_srqn; |
| 42 | u8 logstride; | 42 | u8 logstride; |
| 43 | u8 reserved1[3]; | 43 | u8 reserved1; |
| 44 | u8 pg_offset; | 44 | __be16 xrcd; |
| 45 | u8 reserved2[3]; | 45 | __be32 pg_offset_cqn; |
| 46 | u32 reserved3; | 46 | u32 reserved2; |
| 47 | u8 log_page_size; | 47 | u8 log_page_size; |
| 48 | u8 reserved4[2]; | 48 | u8 reserved3[2]; |
| 49 | u8 mtt_base_addr_h; | 49 | u8 mtt_base_addr_h; |
| 50 | __be32 mtt_base_addr_l; | 50 | __be32 mtt_base_addr_l; |
| 51 | __be32 pd; | 51 | __be32 pd; |
| 52 | __be16 limit_watermark; | 52 | __be16 limit_watermark; |
| 53 | __be16 wqe_cnt; | 53 | __be16 wqe_cnt; |
| 54 | u16 reserved5; | 54 | u16 reserved4; |
| 55 | __be16 wqe_counter; | 55 | __be16 wqe_counter; |
| 56 | u32 reserved6; | 56 | u32 reserved5; |
| 57 | __be64 db_rec_addr; | 57 | __be64 db_rec_addr; |
| 58 | }; | 58 | }; |
| 59 | 59 | ||
| @@ -109,8 +109,8 @@ static int mlx4_QUERY_SRQ(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox | |||
| 109 | MLX4_CMD_TIME_CLASS_A); | 109 | MLX4_CMD_TIME_CLASS_A); |
| 110 | } | 110 | } |
| 111 | 111 | ||
| 112 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, | 112 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcd, |
| 113 | u64 db_rec, struct mlx4_srq *srq) | 113 | struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq) |
| 114 | { | 114 | { |
| 115 | struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table; | 115 | struct mlx4_srq_table *srq_table = &mlx4_priv(dev)->srq_table; |
| 116 | struct mlx4_cmd_mailbox *mailbox; | 116 | struct mlx4_cmd_mailbox *mailbox; |
| @@ -148,6 +148,8 @@ int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, | |||
| 148 | srq_context->state_logsize_srqn = cpu_to_be32((ilog2(srq->max) << 24) | | 148 | srq_context->state_logsize_srqn = cpu_to_be32((ilog2(srq->max) << 24) | |
| 149 | srq->srqn); | 149 | srq->srqn); |
| 150 | srq_context->logstride = srq->wqe_shift - 4; | 150 | srq_context->logstride = srq->wqe_shift - 4; |
| 151 | srq_context->xrcd = cpu_to_be16(xrcd); | ||
| 152 | srq_context->pg_offset_cqn = cpu_to_be32(cqn & 0xffffff); | ||
| 151 | srq_context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; | 153 | srq_context->log_page_size = mtt->page_shift - MLX4_ICM_PAGE_SHIFT; |
| 152 | 154 | ||
| 153 | mtt_addr = mlx4_mtt_addr(dev, mtt); | 155 | mtt_addr = mlx4_mtt_addr(dev, mtt); |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 6a3478d0b330..9ab0f6a80d60 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -543,8 +543,8 @@ void mlx4_qp_release_range(struct mlx4_dev *dev, int base_qpn, int cnt); | |||
| 543 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); | 543 | int mlx4_qp_alloc(struct mlx4_dev *dev, int qpn, struct mlx4_qp *qp); |
| 544 | void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); | 544 | void mlx4_qp_free(struct mlx4_dev *dev, struct mlx4_qp *qp); |
| 545 | 545 | ||
| 546 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, struct mlx4_mtt *mtt, | 546 | int mlx4_srq_alloc(struct mlx4_dev *dev, u32 pdn, u32 cqn, u16 xrcdn, |
| 547 | u64 db_rec, struct mlx4_srq *srq); | 547 | struct mlx4_mtt *mtt, u64 db_rec, struct mlx4_srq *srq); |
| 548 | void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq); | 548 | void mlx4_srq_free(struct mlx4_dev *dev, struct mlx4_srq *srq); |
| 549 | int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark); | 549 | int mlx4_srq_arm(struct mlx4_dev *dev, struct mlx4_srq *srq, int limit_watermark); |
| 550 | int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); | 550 | int mlx4_srq_query(struct mlx4_dev *dev, struct mlx4_srq *srq, int *limit_watermark); |
