diff options
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_qp.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index b3fd6b05d79d..09dc3614cf2c 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -437,29 +437,34 @@ int mthca_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, int qp_attr_m | |||
437 | int mthca_state; | 437 | int mthca_state; |
438 | u8 status; | 438 | u8 status; |
439 | 439 | ||
440 | mutex_lock(&qp->mutex); | ||
441 | |||
440 | if (qp->state == IB_QPS_RESET) { | 442 | if (qp->state == IB_QPS_RESET) { |
441 | qp_attr->qp_state = IB_QPS_RESET; | 443 | qp_attr->qp_state = IB_QPS_RESET; |
442 | goto done; | 444 | goto done; |
443 | } | 445 | } |
444 | 446 | ||
445 | mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); | 447 | mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL); |
446 | if (IS_ERR(mailbox)) | 448 | if (IS_ERR(mailbox)) { |
447 | return PTR_ERR(mailbox); | 449 | err = PTR_ERR(mailbox); |
450 | goto out; | ||
451 | } | ||
448 | 452 | ||
449 | err = mthca_QUERY_QP(dev, qp->qpn, 0, mailbox, &status); | 453 | err = mthca_QUERY_QP(dev, qp->qpn, 0, mailbox, &status); |
450 | if (err) | 454 | if (err) |
451 | goto out; | 455 | goto out_mailbox; |
452 | if (status) { | 456 | if (status) { |
453 | mthca_warn(dev, "QUERY_QP returned status %02x\n", status); | 457 | mthca_warn(dev, "QUERY_QP returned status %02x\n", status); |
454 | err = -EINVAL; | 458 | err = -EINVAL; |
455 | goto out; | 459 | goto out_mailbox; |
456 | } | 460 | } |
457 | 461 | ||
458 | qp_param = mailbox->buf; | 462 | qp_param = mailbox->buf; |
459 | context = &qp_param->context; | 463 | context = &qp_param->context; |
460 | mthca_state = be32_to_cpu(context->flags) >> 28; | 464 | mthca_state = be32_to_cpu(context->flags) >> 28; |
461 | 465 | ||
462 | qp_attr->qp_state = to_ib_qp_state(mthca_state); | 466 | qp->state = to_ib_qp_state(mthca_state); |
467 | qp_attr->qp_state = qp->state; | ||
463 | qp_attr->path_mtu = context->mtu_msgmax >> 5; | 468 | qp_attr->path_mtu = context->mtu_msgmax >> 5; |
464 | qp_attr->path_mig_state = | 469 | qp_attr->path_mig_state = |
465 | to_ib_mig_state((be32_to_cpu(context->flags) >> 11) & 0x3); | 470 | to_ib_mig_state((be32_to_cpu(context->flags) >> 11) & 0x3); |
@@ -506,8 +511,11 @@ done: | |||
506 | 511 | ||
507 | qp_init_attr->cap = qp_attr->cap; | 512 | qp_init_attr->cap = qp_attr->cap; |
508 | 513 | ||
509 | out: | 514 | out_mailbox: |
510 | mthca_free_mailbox(dev, mailbox); | 515 | mthca_free_mailbox(dev, mailbox); |
516 | |||
517 | out: | ||
518 | mutex_unlock(&qp->mutex); | ||
511 | return err; | 519 | return err; |
512 | } | 520 | } |
513 | 521 | ||