]> www.infradead.org Git - users/hch/misc.git/commitdiff
RDMA/bnxt_re: Fix error recovery sequence
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Tue, 31 Dec 2024 02:50:08 +0000 (08:20 +0530)
committerLeon Romanovsky <leon@kernel.org>
Tue, 31 Dec 2024 13:28:36 +0000 (08:28 -0500)
Fixed to return ENXIO from __send_message_basic_sanity()
to indicate that device is in error state. In the case of
ERR_DEVICE_DETACHED state, the driver should not post the
commands to the firmware as it will time out eventually.

Removed bnxt_re_modify_qp() call from bnxt_re_dev_stop()
as it is a no-op.

Fixes: cc5b9b48d447 ("RDMA/bnxt_re: Recover the device when FW error is detected")
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Link: https://patch.msgid.link/20241231025008.2267162-1-kalesh-anakkur.purayil@broadcom.com
Reviewed-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/main.c
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c

index b7af0d5ff3b642fb57e214459c6fdc38d6a20205..c143f273b75967da986e91750c8c52c6814eb178 100644 (file)
@@ -1715,11 +1715,8 @@ static bool bnxt_re_is_qp1_or_shadow_qp(struct bnxt_re_dev *rdev,
 
 static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev)
 {
-       int mask = IB_QP_STATE;
-       struct ib_qp_attr qp_attr;
        struct bnxt_re_qp *qp;
 
-       qp_attr.qp_state = IB_QPS_ERR;
        mutex_lock(&rdev->qp_lock);
        list_for_each_entry(qp, &rdev->qp_list, list) {
                /* Modify the state of all QPs except QP1/Shadow QP */
@@ -1727,12 +1724,9 @@ static void bnxt_re_dev_stop(struct bnxt_re_dev *rdev)
                        if (qp->qplib_qp.state !=
                            CMDQ_MODIFY_QP_NEW_STATE_RESET &&
                            qp->qplib_qp.state !=
-                           CMDQ_MODIFY_QP_NEW_STATE_ERR) {
+                           CMDQ_MODIFY_QP_NEW_STATE_ERR)
                                bnxt_re_dispatch_event(&rdev->ibdev, &qp->ib_qp,
                                                       1, IB_EVENT_QP_FATAL);
-                               bnxt_re_modify_qp(&qp->ib_qp, &qp_attr, mask,
-                                                 NULL);
-                       }
                }
        }
        mutex_unlock(&rdev->qp_lock);
index 5e90ea232de8022d865b886bbcd434086c6b80d7..17e62f22683b14a3571188e25fe0df3cbf1d8360 100644 (file)
@@ -424,7 +424,8 @@ static int __send_message_basic_sanity(struct bnxt_qplib_rcfw *rcfw,
 
        /* Prevent posting if f/w is not in a state to process */
        if (test_bit(ERR_DEVICE_DETACHED, &rcfw->cmdq.flags))
-               return bnxt_qplib_map_rc(opcode);
+               return -ENXIO;
+
        if (test_bit(FIRMWARE_STALL_DETECTED, &cmdq->flags))
                return -ETIMEDOUT;
 
@@ -493,7 +494,7 @@ static int __bnxt_qplib_rcfw_send_message(struct bnxt_qplib_rcfw *rcfw,
 
        rc = __send_message_basic_sanity(rcfw, msg, opcode);
        if (rc)
-               return rc;
+               return rc == -ENXIO ? bnxt_qplib_map_rc(opcode) : rc;
 
        rc = __send_message(rcfw, msg, opcode);
        if (rc)