aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaga Irrinki <Naga.Irrinki@avagotech.com>2015-10-20 04:47:58 -0400
committerDoug Ledford <dledford@redhat.com>2015-10-21 17:28:19 -0400
commitaeb922df2c6fc3fc21fd7ec4b9ae7e845e541450 (patch)
tree05655b6b10d5c22f09a55b47475d612fff164d46
parentfb16d8c49e6fa2791620cf2cd61d6daa123ed51e (diff)
RDMA/ocrdma: Check resource ids received in Async CQE
Some versions of the FW sends wrong QP or CQ IDs in the Async CQE. Adding a check to see whether qp or cq structures associated with the CQE is valid. Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com> Signed-off-by: Selvin Xavier <selvin.xavier@avagotech.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-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