RDMA/bnxt_re: Pass the context for ulp_irq_stop
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>pull/1134/head
parent
51dc5312dc
commit
57e6464c22
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 *);
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue