diff options
author | Naga Irrinki <Naga.Irrinki@avagotech.com> | 2015-10-20 04:47:58 -0400 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2015-10-21 17:28:19 -0400 |
commit | aeb922df2c6fc3fc21fd7ec4b9ae7e845e541450 (patch) | |
tree | 05655b6b10d5c22f09a55b47475d612fff164d46 | |
parent | fb16d8c49e6fa2791620cf2cd61d6daa123ed51e (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.c | 30 |
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 | ||