diff options
author | Don Wood <donald.e.wood@intel.com> | 2009-09-05 23:36:38 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2009-09-05 23:36:38 -0400 |
commit | 3c28b4457a4cf95e982ca13578a5613a11009394 (patch) | |
tree | 91684f41a0d2740b69f7a070f310e1b93238ef10 /drivers/infiniband | |
parent | 5ee21fe0eaf68fb840f442131ab7addced1a31c3 (diff) |
RDMA/nes: Add CQ error handling
CQ errors are not being handled correctly. Put in the the upcall for
CQ errors.
Signed-off-by: Don Wood <donald.e.wood@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/nes/nes_hw.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 4a84d02ece06..2a0c5a18e139 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -2913,6 +2913,8 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | |||
2913 | u64 aeqe_context = 0; | 2913 | u64 aeqe_context = 0; |
2914 | unsigned long flags; | 2914 | unsigned long flags; |
2915 | struct nes_qp *nesqp; | 2915 | struct nes_qp *nesqp; |
2916 | struct nes_hw_cq *hw_cq; | ||
2917 | struct nes_cq *nescq; | ||
2916 | int resource_allocated; | 2918 | int resource_allocated; |
2917 | /* struct iw_cm_id *cm_id; */ | 2919 | /* struct iw_cm_id *cm_id; */ |
2918 | struct nes_adapter *nesadapter = nesdev->nesadapter; | 2920 | struct nes_adapter *nesadapter = nesdev->nesadapter; |
@@ -3153,6 +3155,16 @@ static void nes_process_iwarp_aeqe(struct nes_device *nesdev, | |||
3153 | if (resource_allocated) { | 3155 | if (resource_allocated) { |
3154 | printk(KERN_ERR PFX "%s: Processing an NES_AEQE_AEID_CQ_OPERATION_ERROR event on CQ%u\n", | 3156 | printk(KERN_ERR PFX "%s: Processing an NES_AEQE_AEID_CQ_OPERATION_ERROR event on CQ%u\n", |
3155 | __func__, le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX])); | 3157 | __func__, le32_to_cpu(aeqe->aeqe_words[NES_AEQE_COMP_QP_CQ_ID_IDX])); |
3158 | hw_cq = (struct nes_hw_cq *)(unsigned long)context; | ||
3159 | if (hw_cq) { | ||
3160 | nescq = container_of(hw_cq, struct nes_cq, hw_cq); | ||
3161 | if (nescq->ibcq.event_handler) { | ||
3162 | ibevent.device = nescq->ibcq.device; | ||
3163 | ibevent.event = IB_EVENT_CQ_ERR; | ||
3164 | ibevent.element.cq = &nescq->ibcq; | ||
3165 | nescq->ibcq.event_handler(&ibevent, nescq->ibcq.cq_context); | ||
3166 | } | ||
3167 | } | ||
3156 | } | 3168 | } |
3157 | break; | 3169 | break; |
3158 | case NES_AEQE_AEID_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER: | 3170 | case NES_AEQE_AEID_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER: |