|
@@ -270,9 +270,7 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
|
|
struct ib_qp_init_attr *init_attr,
|
|
struct ib_qp_init_attr *init_attr,
|
|
struct ib_udata *udata, int sqpn, struct mlx4_ib_qp *qp)
|
|
struct ib_udata *udata, int sqpn, struct mlx4_ib_qp *qp)
|
|
{
|
|
{
|
|
- struct mlx4_wqe_ctrl_seg *ctrl;
|
|
|
|
int err;
|
|
int err;
|
|
- int i;
|
|
|
|
|
|
|
|
mutex_init(&qp->mutex);
|
|
mutex_init(&qp->mutex);
|
|
spin_lock_init(&qp->sq.lock);
|
|
spin_lock_init(&qp->sq.lock);
|
|
@@ -352,11 +350,6 @@ static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd,
|
|
if (err)
|
|
if (err)
|
|
goto err_mtt;
|
|
goto err_mtt;
|
|
|
|
|
|
- for (i = 0; i < qp->sq.max; ++i) {
|
|
|
|
- ctrl = get_send_wqe(qp, i);
|
|
|
|
- ctrl->owner_opcode = cpu_to_be32(1 << 31);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
qp->sq.wrid = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL);
|
|
qp->sq.wrid = kmalloc(qp->sq.max * sizeof (u64), GFP_KERNEL);
|
|
qp->rq.wrid = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL);
|
|
qp->rq.wrid = kmalloc(qp->rq.max * sizeof (u64), GFP_KERNEL);
|
|
|
|
|
|
@@ -878,6 +871,21 @@ static int __mlx4_ib_modify_qp(struct ib_qp *ibqp,
|
|
else
|
|
else
|
|
sqd_event = 0;
|
|
sqd_event = 0;
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Before passing a kernel QP to the HW, make sure that the
|
|
|
|
+ * ownership bits of the send queue are set so that the
|
|
|
|
+ * hardware doesn't start processing stale work requests.
|
|
|
|
+ */
|
|
|
|
+ if (!ibqp->uobject && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
|
|
|
|
+ struct mlx4_wqe_ctrl_seg *ctrl;
|
|
|
|
+ int i;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < qp->sq.max; ++i) {
|
|
|
|
+ ctrl = get_send_wqe(qp, i);
|
|
|
|
+ ctrl->owner_opcode = cpu_to_be32(1 << 31);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
err = mlx4_qp_modify(dev->dev, &qp->mtt, to_mlx4_state(cur_state),
|
|
err = mlx4_qp_modify(dev->dev, &qp->mtt, to_mlx4_state(cur_state),
|
|
to_mlx4_state(new_state), context, optpar,
|
|
to_mlx4_state(new_state), context, optpar,
|
|
sqd_event, &qp->mqp);
|
|
sqd_event, &qp->mqp);
|