qedr: post_send/recv according to QP state
authorAmrani, Ram <Ram.Amrani@cavium.com>
Thu, 22 Dec 2016 12:40:38 +0000 (14:40 +0200)
committerDoug Ledford <dledford@redhat.com>
Thu, 22 Dec 2016 16:36:12 +0000 (11:36 -0500)
Enable posting to SQ only in RTS, ERR and SQD QP state.
Enable posting to RQ in ERR QP state.

Signed-off-by: Ram Amrani <Ram.Amrani@cavium.com>
Reviewed-by: Michal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/qedr/verbs.c

index 9af2b4f3b62ff8ba230f8b13a5af0706ebc84d39..e31141be5b047a4e77ad86035f611b2329deea1a 100644 (file)
@@ -2989,8 +2989,9 @@ int qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
 
        spin_lock_irqsave(&qp->q_lock, flags);
 
-       if ((qp->state == QED_ROCE_QP_STATE_RESET) ||
-           (qp->state == QED_ROCE_QP_STATE_ERR)) {
+       if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
+           (qp->state != QED_ROCE_QP_STATE_ERR) &&
+           (qp->state != QED_ROCE_QP_STATE_SQD)) {
                spin_unlock_irqrestore(&qp->q_lock, flags);
                *bad_wr = wr;
                DP_DEBUG(dev, QEDR_MSG_CQ,
@@ -3043,8 +3044,7 @@ int qedr_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
 
        spin_lock_irqsave(&qp->q_lock, flags);
 
-       if ((qp->state == QED_ROCE_QP_STATE_RESET) ||
-           (qp->state == QED_ROCE_QP_STATE_ERR)) {
+       if (qp->state == QED_ROCE_QP_STATE_RESET) {
                spin_unlock_irqrestore(&qp->q_lock, flags);
                *bad_wr = wr;
                return -EINVAL;