|
@@ -1707,6 +1707,7 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
{
|
|
|
struct mthca_dev *dev = to_mdev(ibqp->device);
|
|
|
struct mthca_qp *qp = to_mqp(ibqp);
|
|
|
+ __be32 doorbell[2];
|
|
|
unsigned long flags;
|
|
|
int err = 0;
|
|
|
int nreq;
|
|
@@ -1724,6 +1725,22 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
ind = qp->rq.next_ind;
|
|
|
|
|
|
for (nreq = 0; wr; ++nreq, wr = wr->next) {
|
|
|
+ if (unlikely(nreq == MTHCA_TAVOR_MAX_WQES_PER_RECV_DB)) {
|
|
|
+ nreq = 0;
|
|
|
+
|
|
|
+ doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
|
|
+ doorbell[1] = cpu_to_be32(qp->qpn << 8);
|
|
|
+
|
|
|
+ wmb();
|
|
|
+
|
|
|
+ mthca_write64(doorbell,
|
|
|
+ dev->kar + MTHCA_RECEIVE_DOORBELL,
|
|
|
+ MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
|
|
|
+
|
|
|
+ qp->rq.head += MTHCA_TAVOR_MAX_WQES_PER_RECV_DB;
|
|
|
+ size0 = 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (mthca_wq_overflow(&qp->rq, nreq, qp->ibqp.recv_cq)) {
|
|
|
mthca_err(dev, "RQ %06x full (%u head, %u tail,"
|
|
|
" %d max, %d nreq)\n", qp->qpn,
|
|
@@ -1781,8 +1798,6 @@ int mthca_tavor_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
|
|
|
out:
|
|
|
if (likely(nreq)) {
|
|
|
- __be32 doorbell[2];
|
|
|
-
|
|
|
doorbell[0] = cpu_to_be32((qp->rq.next_ind << qp->rq.wqe_shift) | size0);
|
|
|
doorbell[1] = cpu_to_be32((qp->qpn << 8) | nreq);
|
|
|
|