]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bnxt_en: Add ULP call to notify async events
authorMichael Chan <michael.chan@broadcom.com>
Tue, 7 Jan 2025 02:45:49 +0000 (08:15 +0530)
committerLeon Romanovsky <leon@kernel.org>
Tue, 14 Jan 2025 08:39:46 +0000 (03:39 -0500)
When the driver receives an async event notification from the Firmware,
we make the new ulp_async_notifier() call to inform the RDMA driver that
a firmware async event has been received. RDMA driver can then take
necessary actions based on the event type.

In the next patch, we will implement the ulp_async_notifier() callbacks
in the RDMA driver.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Link: https://patch.msgid.link/20250107024553.2926983-2-kalesh-anakkur.purayil@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h

index 4ec4934a4eddd34c67463ddd06a7bc680adf1230..25850730071bb0a0a3c8f9463ad0a6b258d53bbe 100644 (file)
@@ -2857,6 +2857,7 @@ static int bnxt_async_event_process(struct bnxt *bp,
        }
        __bnxt_queue_sp_work(bp);
 async_event_process_exit:
+       bnxt_ulp_async_events(bp, cmpl);
        return 0;
 }
 
index b771c84cdd8951482021fcadf10e01f9519c774a..59c280634bc5f690385bf30e6be6ef3f6bd4acbf 100644 (file)
@@ -345,6 +345,34 @@ void bnxt_ulp_irq_restart(struct bnxt *bp, int err)
        }
 }
 
+void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl)
+{
+       u16 event_id = le16_to_cpu(cmpl->event_id);
+       struct bnxt_en_dev *edev = bp->edev;
+       struct bnxt_ulp_ops *ops;
+       struct bnxt_ulp *ulp;
+
+       if (!bnxt_ulp_registered(edev))
+               return;
+       ulp = edev->ulp_tbl;
+
+       rcu_read_lock();
+
+       ops = rcu_dereference(ulp->ulp_ops);
+       if (!ops || !ops->ulp_async_notifier)
+               goto exit_unlock_rcu;
+       if (!ulp->async_events_bmap || event_id > ulp->max_async_event_id)
+               goto exit_unlock_rcu;
+
+       /* Read max_async_event_id first before testing the bitmap. */
+       smp_rmb();
+
+       if (test_bit(event_id, ulp->async_events_bmap))
+               ops->ulp_async_notifier(ulp->handle, cmpl);
+exit_unlock_rcu:
+       rcu_read_unlock();
+}
+
 int bnxt_register_async_events(struct bnxt_en_dev *edev,
                               unsigned long *events_bmap,
                               u16 max_id)
index 5d6aac60f2365038d3e2f7f59d3a6bed7d2fc1a5..a21294cf197b840eaeb19c8be89f9963c2ecd5a3 100644 (file)
@@ -30,6 +30,8 @@ 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_restart)(void *, struct bnxt_msix_entry *);
 };