]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/irdma: Align AE id codes to correct flush code and event
authorSindhu-Devale <sindhu.devale@intel.com>
Wed, 7 Sep 2022 19:13:23 +0000 (14:13 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Oct 2022 07:57:54 +0000 (09:57 +0200)
[ Upstream commit 7f51a961f8c6b84752a48e950074a8c4a0808d91 ]

A number of asynchronous event (AE) ids were not aligned to the
correct flush_code and event_type. Fix these up so that the
correct IBV error and event codes are returned to application.

Also, add handling for new AE ids like IRDMA_AE_INVALID_REQUEST to
return the correct WC error code.

Fixes: 44d9e52977a1 ("RDMA/irdma: Implement device initialization definitions")
Signed-off-by: Sindhu-Devale <sindhu.devale@intel.com>
Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Link: https://lore.kernel.org/r/20220907191324.1173-2-shiraz.saleem@intel.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/irdma/defs.h
drivers/infiniband/hw/irdma/hw.c
drivers/infiniband/hw/irdma/type.h
drivers/infiniband/hw/irdma/user.h
drivers/infiniband/hw/irdma/utils.c
drivers/infiniband/hw/irdma/verbs.c

index e03e03082a5fb0aa3c414f7c62fff33c829e1446..c1906cab5c8ad1802f70bd99ab75ca9f9edcecc2 100644 (file)
@@ -314,6 +314,7 @@ enum irdma_cqp_op_type {
 #define IRDMA_AE_IB_REMOTE_ACCESS_ERROR                                        0x020d
 #define IRDMA_AE_IB_REMOTE_OP_ERROR                                    0x020e
 #define IRDMA_AE_WQE_LSMM_TOO_LONG                                     0x0220
+#define IRDMA_AE_INVALID_REQUEST                                       0x0223
 #define IRDMA_AE_DDP_INVALID_MSN_GAP_IN_MSN                            0x0301
 #define IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER     0x0303
 #define IRDMA_AE_DDP_UBE_INVALID_DDP_VERSION                           0x0304
index 6bba1335993a112313150e9b217c76f819ba2161..971cc7a7f3bc0cf4304f6f149c3581b481730c84 100644 (file)
@@ -138,59 +138,68 @@ static void irdma_set_flush_fields(struct irdma_sc_qp *qp,
        qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
 
        switch (info->ae_id) {
-       case IRDMA_AE_AMP_UNALLOCATED_STAG:
        case IRDMA_AE_AMP_BOUNDS_VIOLATION:
        case IRDMA_AE_AMP_INVALID_STAG:
-               qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR;
-               fallthrough;
+       case IRDMA_AE_AMP_RIGHTS_VIOLATION:
+       case IRDMA_AE_AMP_UNALLOCATED_STAG:
        case IRDMA_AE_AMP_BAD_PD:
-       case IRDMA_AE_UDA_XMIT_BAD_PD:
+       case IRDMA_AE_AMP_BAD_QP:
+       case IRDMA_AE_AMP_BAD_STAG_KEY:
+       case IRDMA_AE_AMP_BAD_STAG_INDEX:
+       case IRDMA_AE_AMP_TO_WRAP:
+       case IRDMA_AE_PRIV_OPERATION_DENIED:
                qp->flush_code = FLUSH_PROT_ERR;
+               qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR;
                break;
-       case IRDMA_AE_AMP_BAD_QP:
+       case IRDMA_AE_UDA_XMIT_BAD_PD:
        case IRDMA_AE_WQE_UNEXPECTED_OPCODE:
                qp->flush_code = FLUSH_LOC_QP_OP_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
+               break;
+       case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG:
+       case IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT:
+       case IRDMA_AE_UDA_L4LEN_INVALID:
+       case IRDMA_AE_DDP_UBE_INVALID_MO:
+       case IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER:
+               qp->flush_code = FLUSH_LOC_LEN_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
                break;
-       case IRDMA_AE_AMP_BAD_STAG_KEY:
-       case IRDMA_AE_AMP_BAD_STAG_INDEX:
-       case IRDMA_AE_AMP_TO_WRAP:
-       case IRDMA_AE_AMP_RIGHTS_VIOLATION:
        case IRDMA_AE_AMP_INVALIDATE_NO_REMOTE_ACCESS_RIGHTS:
-       case IRDMA_AE_PRIV_OPERATION_DENIED:
-       case IRDMA_AE_IB_INVALID_REQUEST:
        case IRDMA_AE_IB_REMOTE_ACCESS_ERROR:
                qp->flush_code = FLUSH_REM_ACCESS_ERR;
                qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR;
                break;
        case IRDMA_AE_LLP_SEGMENT_TOO_SMALL:
-       case IRDMA_AE_DDP_UBE_DDP_MESSAGE_TOO_LONG_FOR_AVAILABLE_BUFFER:
-       case IRDMA_AE_UDA_XMIT_DGRAM_TOO_LONG:
-       case IRDMA_AE_UDA_XMIT_DGRAM_TOO_SHORT:
-       case IRDMA_AE_UDA_L4LEN_INVALID:
+       case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR:
        case IRDMA_AE_ROCE_RSP_LENGTH_ERROR:
-               qp->flush_code = FLUSH_LOC_LEN_ERR;
+       case IRDMA_AE_IB_REMOTE_OP_ERROR:
+               qp->flush_code = FLUSH_REM_OP_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
                break;
        case IRDMA_AE_LCE_QP_CATASTROPHIC:
                qp->flush_code = FLUSH_FATAL_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
                break;
-       case IRDMA_AE_DDP_UBE_INVALID_MO:
        case IRDMA_AE_IB_RREQ_AND_Q1_FULL:
-       case IRDMA_AE_LLP_RECEIVED_MPA_CRC_ERROR:
                qp->flush_code = FLUSH_GENERAL_ERR;
                break;
        case IRDMA_AE_LLP_TOO_MANY_RETRIES:
                qp->flush_code = FLUSH_RETRY_EXC_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
                break;
        case IRDMA_AE_AMP_MWBIND_INVALID_RIGHTS:
        case IRDMA_AE_AMP_MWBIND_BIND_DISABLED:
        case IRDMA_AE_AMP_MWBIND_INVALID_BOUNDS:
                qp->flush_code = FLUSH_MW_BIND_ERR;
+               qp->event_type = IRDMA_QP_EVENT_ACCESS_ERR;
                break;
-       case IRDMA_AE_IB_REMOTE_OP_ERROR:
-               qp->flush_code = FLUSH_REM_OP_ERR;
+       case IRDMA_AE_IB_INVALID_REQUEST:
+               qp->flush_code = FLUSH_REM_INV_REQ_ERR;
+               qp->event_type = IRDMA_QP_EVENT_REQ_ERR;
                break;
        default:
-               qp->flush_code = FLUSH_FATAL_ERR;
+               qp->flush_code = FLUSH_GENERAL_ERR;
+               qp->event_type = IRDMA_QP_EVENT_CATASTROPHIC;
                break;
        }
 }
index 9e7b8ecb137ab2b21b3f3758a817bf01c9cf711a..517d41a1c2894c1f1244cc8857ccd67d83835c5b 100644 (file)
@@ -98,6 +98,7 @@ enum irdma_term_mpa_errors {
 enum irdma_qp_event_type {
        IRDMA_QP_EVENT_CATASTROPHIC,
        IRDMA_QP_EVENT_ACCESS_ERR,
+       IRDMA_QP_EVENT_REQ_ERR,
 };
 
 enum irdma_hw_stats_index_32b {
index ddd0ebbdd7d54c568fccaa6eb77e3b9e5de6b926..2ef61923c92685a5164008eceff7fcb246b664df 100644 (file)
@@ -103,6 +103,7 @@ enum irdma_flush_opcode {
        FLUSH_FATAL_ERR,
        FLUSH_RETRY_EXC_ERR,
        FLUSH_MW_BIND_ERR,
+       FLUSH_REM_INV_REQ_ERR,
 };
 
 enum irdma_cmpl_status {
index f4d774451160dc639550794012255f44e7b68650..c9513b9fc42d51553b237bfdc001051dec7a6b52 100644 (file)
@@ -2478,6 +2478,9 @@ void irdma_ib_qp_event(struct irdma_qp *iwqp, enum irdma_qp_event_type event)
        case IRDMA_QP_EVENT_ACCESS_ERR:
                ibevent.event = IB_EVENT_QP_ACCESS_ERR;
                break;
+       case IRDMA_QP_EVENT_REQ_ERR:
+               ibevent.event = IB_EVENT_QP_REQ_ERR;
+               break;
        }
        ibevent.device = iwqp->ibqp.device;
        ibevent.element.qp = &iwqp->ibqp;
index ab73d1715f9918fc109c188d5081689397e87722..7cd50147de1da1b7c1775e8d9ee016eb961c8dfe 100644 (file)
@@ -3307,6 +3307,8 @@ static enum ib_wc_status irdma_flush_err_to_ib_wc_status(enum irdma_flush_opcode
                return IB_WC_RETRY_EXC_ERR;
        case FLUSH_MW_BIND_ERR:
                return IB_WC_MW_BIND_ERR;
+       case FLUSH_REM_INV_REQ_ERR:
+               return IB_WC_REM_INV_REQ_ERR;
        case FLUSH_FATAL_ERR:
        default:
                return IB_WC_FATAL_ERR;