1
0
Fork 0
mirror of synced 2025-03-06 20:59:54 +01:00

bnxt_en: Add ULP call to notify async events

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>
This commit is contained in:
Michael Chan 2025-01-07 08:15:49 +05:30 committed by Leon Romanovsky
parent 235f238402
commit 184fe6f238
3 changed files with 31 additions and 0 deletions

View file

@ -2857,6 +2857,7 @@ static int bnxt_async_event_process(struct bnxt *bp,
} }
__bnxt_queue_sp_work(bp); __bnxt_queue_sp_work(bp);
async_event_process_exit: async_event_process_exit:
bnxt_ulp_async_events(bp, cmpl);
return 0; return 0;
} }

View 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, int bnxt_register_async_events(struct bnxt_en_dev *edev,
unsigned long *events_bmap, unsigned long *events_bmap,
u16 max_id) u16 max_id)

View file

@ -30,6 +30,8 @@ struct bnxt_msix_entry {
}; };
struct bnxt_ulp_ops { 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 *);
void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *); void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
}; };