|
@@ -333,6 +333,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
|
|
cap->max_inline_data + sizeof (struct mlx4_wqe_inline_seg)) +
|
|
|
send_wqe_overhead(type, qp->flags);
|
|
|
|
|
|
+ if (s > dev->dev->caps.max_sq_desc_sz)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
/*
|
|
|
* Hermon supports shrinking WQEs, such that a single work
|
|
|
* request can include multiple units of 1 << wqe_shift. This
|
|
@@ -372,9 +375,6 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
|
|
qp->sq.wqe_shift = ilog2(roundup_pow_of_two(s));
|
|
|
|
|
|
for (;;) {
|
|
|
- if (1 << qp->sq.wqe_shift > dev->dev->caps.max_sq_desc_sz)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
qp->sq_max_wqes_per_wr = DIV_ROUND_UP(s, 1U << qp->sq.wqe_shift);
|
|
|
|
|
|
/*
|
|
@@ -395,7 +395,8 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
|
|
++qp->sq.wqe_shift;
|
|
|
}
|
|
|
|
|
|
- qp->sq.max_gs = ((qp->sq_max_wqes_per_wr << qp->sq.wqe_shift) -
|
|
|
+ qp->sq.max_gs = (min(dev->dev->caps.max_sq_desc_sz,
|
|
|
+ (qp->sq_max_wqes_per_wr << qp->sq.wqe_shift)) -
|
|
|
send_wqe_overhead(type, qp->flags)) /
|
|
|
sizeof (struct mlx4_wqe_data_seg);
|
|
|
|
|
@@ -411,7 +412,9 @@ static int set_kernel_sq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap,
|
|
|
|
|
|
cap->max_send_wr = qp->sq.max_post =
|
|
|
(qp->sq.wqe_cnt - qp->sq_spare_wqes) / qp->sq_max_wqes_per_wr;
|
|
|
- cap->max_send_sge = qp->sq.max_gs;
|
|
|
+ cap->max_send_sge = min(qp->sq.max_gs,
|
|
|
+ min(dev->dev->caps.max_sq_sg,
|
|
|
+ dev->dev->caps.max_rq_sg));
|
|
|
/* We don't support inline sends for kernel QPs (yet) */
|
|
|
cap->max_inline_data = 0;
|
|
|
|
|
@@ -1457,7 +1460,7 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
unsigned ind;
|
|
|
int uninitialized_var(stamp);
|
|
|
int uninitialized_var(size);
|
|
|
- unsigned seglen;
|
|
|
+ unsigned uninitialized_var(seglen);
|
|
|
int i;
|
|
|
|
|
|
spin_lock_irqsave(&qp->sq.lock, flags);
|