aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/infiniband/hw/ocrdma/ocrdma_hw.c')
-rw-r--r--drivers/infiniband/hw/ocrdma/ocrdma_hw.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
index aab391a15db4..9d9914299866 100644
--- a/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
+++ b/drivers/infiniband/hw/ocrdma/ocrdma_hw.c
@@ -678,11 +678,33 @@ static void ocrdma_dispatch_ibevent(struct ocrdma_dev *dev,
678 int dev_event = 0; 678 int dev_event = 0;
679 int type = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_TYPE_MASK) >> 679 int type = (cqe->valid_ae_event & OCRDMA_AE_MCQE_EVENT_TYPE_MASK) >>
680 OCRDMA_AE_MCQE_EVENT_TYPE_SHIFT; 680 OCRDMA_AE_MCQE_EVENT_TYPE_SHIFT;
681 u16 qpid = cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPID_MASK;
682 u16 cqid = cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQID_MASK;
681 683
682 if (cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPVALID) 684 /*
683 qp = dev->qp_tbl[cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPID_MASK]; 685 * Some FW version returns wrong qp or cq ids in CQEs.
684 if (cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQVALID) 686 * Checking whether the IDs are valid
685 cq = dev->cq_tbl[cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQID_MASK]; 687 */
688
689 if (cqe->qpvalid_qpid & OCRDMA_AE_MCQE_QPVALID) {
690 if (qpid < dev->attr.max_qp)
691 qp = dev->qp_tbl[qpid];
692 if (qp == NULL) {
693 pr_err("ocrdma%d:Async event - qpid %u is not valid\n",
694 dev->id, qpid);
695 return;
696 }
697 }
698
699 if (cqe->cqvalid_cqid & OCRDMA_AE_MCQE_CQVALID) {
700 if (cqid < dev->attr.max_cq)
701 cq = dev->cq_tbl[cqid];
702 if (cq == NULL) {
703 pr_err("ocrdma%d:Async event - cqid %u is not valid\n",
704 dev->id, cqid);
705 return;
706 }
707 }
686 708
687 memset(&ib_evt, 0, sizeof(ib_evt)); 709 memset(&ib_evt, 0, sizeof(ib_evt));
688 710