aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/ehca/ehca_reqs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_reqs.c')
-rw-r--r--drivers/infiniband/hw/ehca/ehca_reqs.c47
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
416int ehca_post_recv(struct ib_qp *qp, 417static 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
468post_recv_exit0: 475post_recv_exit0:
@@ -472,6 +479,22 @@ post_recv_exit0:
472 return ret; 479 return ret;
473} 480}
474 481
482int 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
490int 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