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:
parent
235f238402
commit
184fe6f238
3 changed files with 31 additions and 0 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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 *);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue