]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/bnxt_re: Pass the context for ulp_irq_stop
authorKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Thu, 9 Jan 2025 18:18:12 +0000 (10:18 -0800)
committerLeon Romanovsky <leon@kernel.org>
Tue, 14 Jan 2025 11:22:10 +0000 (06:22 -0500)
ulp_irq_stop() can be invoked from a context where FW is healthy or
when FW is in a reset state. In the latter case, ULP must stop all
interactions with HW/FW and also with application and stack. Added a
new parameter to the ulp_irq_stop() function to achieve that.

Reviewed-by: Vikas Gupta <vikas.gupta@broadcom.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Reviewed-by: Chandramohan Akula <chandramohan.akula@broadcom.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1736446693-6692-2-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/main.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h

index 93c4ba868ec3a3bcfbc999aed35722d78ed3e3e5..bfccf34c08f92b5f426fa65536e7a4e7ad4b7106 100644 (file)
@@ -83,6 +83,8 @@ static int bnxt_re_hwrm_qcaps(struct bnxt_re_dev *rdev);
 
 static int bnxt_re_hwrm_qcfg(struct bnxt_re_dev *rdev, u32 *db_len,
                             u32 *offset);
+static void bnxt_re_dispatch_event(struct ib_device *ibdev, struct ib_qp *qp,
+                                  u8 port_num, enum ib_event_type event);
 static void bnxt_re_set_db_offset(struct bnxt_re_dev *rdev)
 {
        struct bnxt_qplib_chip_ctx *cctx;
@@ -411,7 +413,7 @@ static void bnxt_re_async_notifier(void *handle, struct hwrm_async_event_cmpl *c
        }
 }
 
-static void bnxt_re_stop_irq(void *handle)
+static void bnxt_re_stop_irq(void *handle, bool reset)
 {
        struct bnxt_re_en_dev_info *en_info = auxiliary_get_drvdata(handle);
        struct bnxt_qplib_rcfw *rcfw;
@@ -422,6 +424,14 @@ static void bnxt_re_stop_irq(void *handle)
        rdev = en_info->rdev;
        rcfw = &rdev->rcfw;
 
+       if (reset) {
+               set_bit(ERR_DEVICE_DETACHED, &rdev->rcfw.cmdq.flags);
+               set_bit(BNXT_RE_FLAG_ERR_DEVICE_DETACHED, &rdev->flags);
+               wake_up_all(&rdev->rcfw.cmdq.waitq);
+               bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1,
+                                      IB_EVENT_DEVICE_FATAL);
+       }
+
        for (indx = BNXT_RE_NQ_IDX; indx < rdev->nqr->num_msix; indx++) {
                nq = &rdev->nqr->nq[indx - 1];
                bnxt_qplib_nq_stop_irq(nq, false);
index 3e17db0a453e0ebaba72a61b6e9dc6abe3222b74..a5fa9a254e012b8b083aa85be2a28634a8df18ba 100644 (file)
@@ -297,6 +297,7 @@ void bnxt_ulp_irq_stop(struct bnxt *bp)
 {
        struct bnxt_en_dev *edev = bp->edev;
        struct bnxt_ulp_ops *ops;
+       bool reset = false;
 
        if (!edev || !(edev->flags & BNXT_EN_FLAG_MSIX_REQUESTED))
                return;
@@ -310,7 +311,9 @@ void bnxt_ulp_irq_stop(struct bnxt *bp)
                ops = rtnl_dereference(ulp->ulp_ops);
                if (!ops || !ops->ulp_irq_stop)
                        return;
-               ops->ulp_irq_stop(ulp->handle);
+               if (test_bit(BNXT_STATE_FW_RESET_DET, &bp->state))
+                       reset = true;
+               ops->ulp_irq_stop(ulp->handle, reset);
        }
 }
 
index ee6a5b8562c3e8e842843589e599279010bfbd41..65ea2a54603323072aff3f928be99b3c3eae4276 100644 (file)
@@ -32,7 +32,7 @@ struct bnxt_msix_entry {
 struct bnxt_ulp_ops {
        /* async_notifier() cannot sleep (in BH context) */
        void (*ulp_async_notifier)(void *, struct hwrm_async_event_cmpl *);
-       void (*ulp_irq_stop)(void *);
+       void (*ulp_irq_stop)(void *, bool);
        void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
 };