|
@@ -437,29 +437,34 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m
|
|
|
int mthca_state;
|
|
|
u8 status;
|
|
|
|
|
|
+ mutex_lock(&qp->mutex);
|
|
|
+
|
|
|
if (qp->state == IB_QPS_RESET) {
|
|
|
qp_attr->qp_state = IB_QPS_RESET;
|
|
|
goto done;
|
|
|
}
|
|
|
|
|
|
mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
|
|
|
- if (IS_ERR(mailbox))
|
|
|
- return PTR_ERR(mailbox);
|
|
|
+ if (IS_ERR(mailbox)) {
|
|
|
+ err = PTR_ERR(mailbox);
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
err = mthca_QUERY_QP(dev, qp->qpn, 0, mailbox, &status);
|
|
|
if (err)
|
|
|
- goto out;
|
|
|
+ goto out_mailbox;
|
|
|
if (status) {
|
|
|
mthca_warn(dev, "QUERY_QP returned status %02x\n", status);
|
|
|
err = -EINVAL;
|
|
|
- goto out;
|
|
|
+ goto out_mailbox;
|
|
|
}
|
|
|
|
|
|
qp_param = mailbox->buf;
|
|
|
context = &qp_param->context;
|
|
|
mthca_state = be32_to_cpu(context->flags) >> 28;
|
|
|
|
|
|
- qp_attr->qp_state = to_ib_qp_state(mthca_state);
|
|
|
+ qp->state = to_ib_qp_state(mthca_state);
|
|
|
+ qp_attr->qp_state = qp->state;
|
|
|
qp_attr->path_mtu = context->mtu_msgmax >> 5;
|
|
|
qp_attr->path_mig_state =
|
|
|
to_ib_mig_state((be32_to_cpu(context->flags) >> 11) & 0x3);
|
|
@@ -506,8 +511,11 @@ done:
|
|
|
|
|
|
qp_init_attr->cap = qp_attr->cap;
|
|
|
|
|
|
-out:
|
|
|
+out_mailbox:
|
|
|
mthca_free_mailbox(dev, mailbox);
|
|
|
+
|
|
|
+out:
|
|
|
+ mutex_unlock(&qp->mutex);
|
|
|
return err;
|
|
|
}
|
|
|
|