IB/mthca: Update QP state if query QP succeeds
authorDotan Barak <dotanb@dev.mellanox.co.il>
Thu, 17 Apr 2008 04:09:34 +0000 (21:09 -0700)
committerRoland Dreier <rolandd@cisco.com>
Thu, 17 Apr 2008 04:09:34 +0000 (21:09 -0700)
If the QP was moved to another state (such as SQE) by the hardware,
then after this change the user won't have to set the IBV_QP_CUR_STATE
mask in order to execute modify QP in order to recover from this state.

Signed-off-by: Dotan Barak <dotanb@dev.mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/mthca/mthca_qp.c

index b3fd6b05d79d805597f5bd37bc8552270babb999..09dc3614cf2c1ad774b847ff8f9959f13bf0095a 100644 (file)
@@ -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;
 }