diff options
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_reqs.c')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_reqs.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c b/drivers/infiniband/hw/ehca/ehca_reqs.c index 56c4527c884f..b5664fa34de3 100644 --- a/drivers/infiniband/hw/ehca/ehca_reqs.c +++ b/drivers/infiniband/hw/ehca/ehca_reqs.c | |||
@@ -3,8 +3,9 @@ | |||
3 | * | 3 | * |
4 | * post_send/recv, poll_cq, req_notify | 4 | * post_send/recv, poll_cq, req_notify |
5 | * | 5 | * |
6 | * Authors: Waleri Fomin <fomin@de.ibm.com> | 6 | * Authors: Hoang-Nam Nguyen <hnguyen@de.ibm.com> |
7 | * Hoang-Nam Nguyen <hnguyen@de.ibm.com> | 7 | * Waleri Fomin <fomin@de.ibm.com> |
8 | * Joachim Fenkes <fenkes@de.ibm.com> | ||
8 | * Reinhard Ernst <rernst@de.ibm.com> | 9 | * Reinhard Ernst <rernst@de.ibm.com> |
9 | * | 10 | * |
10 | * Copyright (c) 2005 IBM Corporation | 11 | * Copyright (c) 2005 IBM Corporation |
@@ -413,17 +414,23 @@ post_send_exit0: | |||
413 | return ret; | 414 | return ret; |
414 | } | 415 | } |
415 | 416 | ||
416 | int ehca_post_recv(struct ib_qp *qp, | 417 | static int internal_post_recv(struct ehca_qp *my_qp, |
417 | struct ib_recv_wr *recv_wr, | 418 | struct ib_device *dev, |
418 | struct ib_recv_wr **bad_recv_wr) | 419 | struct ib_recv_wr *recv_wr, |
420 | struct ib_recv_wr **bad_recv_wr) | ||
419 | { | 421 | { |
420 | struct ehca_qp *my_qp = container_of(qp, struct ehca_qp, ib_qp); | ||
421 | struct ib_recv_wr *cur_recv_wr; | 422 | struct ib_recv_wr *cur_recv_wr; |
422 | struct ehca_wqe *wqe_p; | 423 | struct ehca_wqe *wqe_p; |
423 | int wqe_cnt = 0; | 424 | int wqe_cnt = 0; |
424 | int ret = 0; | 425 | int ret = 0; |
425 | unsigned long spl_flags; | 426 | unsigned long spl_flags; |
426 | 427 | ||
428 | if (unlikely(!HAS_RQ(my_qp))) { | ||
429 | ehca_err(dev, "QP has no RQ ehca_qp=%p qp_num=%x ext_type=%d", | ||
430 | my_qp, my_qp->real_qp_num, my_qp->ext_type); | ||
431 | return -ENODEV; | ||
432 | } | ||
433 | |||
427 | /* LOCK the QUEUE */ | 434 | /* LOCK the QUEUE */ |
428 | spin_lock_irqsave(&my_qp->spinlock_r, spl_flags); | 435 | spin_lock_irqsave(&my_qp->spinlock_r, spl_flags); |
429 | 436 | ||
@@ -439,8 +446,8 @@ int ehca_post_recv(struct ib_qp *qp, | |||
439 | *bad_recv_wr = cur_recv_wr; | 446 | *bad_recv_wr = cur_recv_wr; |
440 | if (wqe_cnt == 0) { | 447 | if (wqe_cnt == 0) { |
441 | ret = -ENOMEM; | 448 | ret = -ENOMEM; |
442 | ehca_err(qp->device, "Too many posted WQEs " | 449 | ehca_err(dev, "Too many posted WQEs " |
443 | "qp_num=%x", qp->qp_num); | 450 | "qp_num=%x", my_qp->real_qp_num); |
444 | } | 451 | } |
445 | goto post_recv_exit0; | 452 | goto post_recv_exit0; |
446 | } | 453 | } |
@@ -455,14 +462,14 @@ int ehca_post_recv(struct ib_qp *qp, | |||
455 | *bad_recv_wr = cur_recv_wr; | 462 | *bad_recv_wr = cur_recv_wr; |
456 | if (wqe_cnt == 0) { | 463 | if (wqe_cnt == 0) { |
457 | ret = -EINVAL; | 464 | ret = -EINVAL; |
458 | ehca_err(qp->device, "Could not write WQE " | 465 | ehca_err(dev, "Could not write WQE " |
459 | "qp_num=%x", qp->qp_num); | 466 | "qp_num=%x", my_qp->real_qp_num); |
460 | } | 467 | } |
461 | goto post_recv_exit0; | 468 | goto post_recv_exit0; |
462 | } | 469 | } |
463 | wqe_cnt++; | 470 | wqe_cnt++; |
464 | ehca_gen_dbg("ehca_qp=%p qp_num=%x wqe_cnt=%d", | 471 | ehca_dbg(dev, "ehca_qp=%p qp_num=%x wqe_cnt=%d", |
465 | my_qp, qp->qp_num, wqe_cnt); | 472 | my_qp, my_qp->real_qp_num, wqe_cnt); |
466 | } /* eof for cur_recv_wr */ | 473 | } /* eof for cur_recv_wr */ |
467 | 474 | ||
468 | post_recv_exit0: | 475 | post_recv_exit0: |
@@ -472,6 +479,22 @@ post_recv_exit0: | |||
472 | return ret; | 479 | return ret; |
473 | } | 480 | } |
474 | 481 | ||
482 | int ehca_post_recv(struct ib_qp *qp, | ||
483 | struct ib_recv_wr *recv_wr, | ||
484 | struct ib_recv_wr **bad_recv_wr) | ||
485 | { | ||
486 | return internal_post_recv(container_of(qp, struct ehca_qp, ib_qp), | ||
487 | qp->device, recv_wr, bad_recv_wr); | ||
488 | } | ||
489 | |||
490 | int ehca_post_srq_recv(struct ib_srq *srq, | ||
491 | struct ib_recv_wr *recv_wr, | ||
492 | struct ib_recv_wr **bad_recv_wr) | ||
493 | { | ||
494 | return internal_post_recv(container_of(srq, struct ehca_qp, ib_srq), | ||
495 | srq->device, recv_wr, bad_recv_wr); | ||
496 | } | ||
497 | |||
475 | /* | 498 | /* |
476 | * ib_wc_opcode table converts ehca wc opcode to ib | 499 | * ib_wc_opcode table converts ehca wc opcode to ib |
477 | * Since we use zero to indicate invalid opcode, the actual ib opcode must | 500 | * Since we use zero to indicate invalid opcode, the actual ib opcode must |