|
@@ -76,14 +76,13 @@ struct ib_srq *mlx4_ib_create_srq(struct ib_pd *pd,
|
|
|
struct mlx4_ib_srq *srq;
|
|
|
struct mlx4_wqe_srq_next_seg *next;
|
|
|
struct mlx4_wqe_data_seg *scatter;
|
|
|
+ u32 cqn;
|
|
|
+ u16 xrcdn;
|
|
|
int desc_size;
|
|
|
int buf_size;
|
|
|
int err;
|
|
|
int i;
|
|
|
|
|
|
- if (init_attr->srq_type != IB_SRQT_BASIC)
|
|
|
- return ERR_PTR(-ENOSYS);
|
|
|
-
|
|
|
/* Sanity check SRQ size before proceeding */
|
|
|
if (init_attr->attr.max_wr >= dev->dev->caps.max_srq_wqes ||
|
|
|
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,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, &srq->mtt,
|
|
|
+ cqn = (init_attr->srq_type == IB_SRQT_XRC) ?
|
|
|
+ to_mcq(init_attr->ext.xrc.cq)->mcq.cqn : 0;
|
|
|
+ xrcdn = (init_attr->srq_type == IB_SRQT_XRC) ?
|
|
|
+ to_mxrcd(init_attr->ext.xrc.xrcd)->xrcdn :
|
|
|
+ (u16) dev->dev->caps.reserved_xrcds;
|
|
|
+ err = mlx4_srq_alloc(dev->dev, to_mpd(pd)->pdn, cqn, xrcdn, &srq->mtt,
|
|
|
srq->db.dma, &srq->msrq);
|
|
|
if (err)
|
|
|
goto err_wrid;
|
|
|
|
|
|
srq->msrq.event = mlx4_ib_srq_event;
|
|
|
+ srq->ibsrq.ext.xrc.srq_num = srq->msrq.srqn;
|
|
|
|
|
|
if (pd->uobject)
|
|
|
if (ib_copy_to_udata(udata, &srq->msrq.srqn, sizeof (__u32))) {
|