From: Leon Romanovsky <leon@kernel.org>
To: Selvin Xavier <selvin.xavier@broadcom.com>
Cc: jgg@ziepe.ca, linux-rdma@vger.kernel.org,
andrew.gospodarek@broadcom.com,
kalesh-anakkur.purayil@broadcom.com,
Michael Chan <michael.chan@broadcom.com>
Subject: Re: [PATCH for-next 1/4] RDMA/bnxt_re: Add FW async event support in driver
Date: Thu, 5 Sep 2024 13:25:43 +0300 [thread overview]
Message-ID: <20240905102543.GS4026@unreal> (raw)
In-Reply-To: <1725363051-19268-2-git-send-email-selvin.xavier@broadcom.com>
On Tue, Sep 03, 2024 at 04:30:48AM -0700, Selvin Xavier wrote:
> From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
>
> Using the option provided by L2 driver, register for FW Async
> event. Provide the ulp hook 'ulp_async_notifier' for receiving
> the events for L2 driver.
>
> Async events will be handled in follow on patches.
>
> CC: Michael Chan <michael.chan@broadcom.com>
> Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> ---
> drivers/infiniband/hw/bnxt_re/bnxt_re.h | 1 +
> drivers/infiniband/hw/bnxt_re/main.c | 47 +++++++++++++++++++++++++++
> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 +
> drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 31 ++++++++++++++++++
> drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 1 +
> 5 files changed, 81 insertions(+)
>
> diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> index 2be9a62..b2ed557 100644
> --- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> +++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
> @@ -198,6 +198,7 @@ struct bnxt_re_dev {
> struct delayed_work dbq_pacing_work;
> DECLARE_HASHTABLE(cq_hash, MAX_CQ_HASH_BITS);
> DECLARE_HASHTABLE(srq_hash, MAX_SRQ_HASH_BITS);
> + unsigned long event_bitmap;
> };
>
> #define to_bnxt_re_dev(ptr, member) \
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index 16a84ca..0f86a34 100644
> --- a/drivers/infiniband/hw/bnxt_re/main.c
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -300,6 +300,20 @@ static void bnxt_re_shutdown(struct auxiliary_device *adev)
> bnxt_re_dev_uninit(rdev);
> }
>
> +static void bnxt_re_async_notifier(void *handle, struct hwrm_async_event_cmpl *cmpl)
> +{
> + struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle;
> + u32 data1, data2;
> + u16 event_id;
> +
> + event_id = le16_to_cpu(cmpl->event_id);
> + data1 = le32_to_cpu(cmpl->event_data1);
> + data2 = le32_to_cpu(cmpl->event_data2);
> +
> + ibdev_dbg(&rdev->ibdev, "Async event_id = %d data1 = %d data2 = %d",
> + event_id, data1, data2);
> +}
> +
> static void bnxt_re_stop_irq(void *handle)
> {
> struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle;
> @@ -358,6 +372,7 @@ static void bnxt_re_start_irq(void *handle, struct bnxt_msix_entry *ent)
> }
>
> static struct bnxt_ulp_ops bnxt_re_ulp_ops = {
> + .ulp_async_notifier = bnxt_re_async_notifier,
> .ulp_irq_stop = bnxt_re_stop_irq,
> .ulp_irq_restart = bnxt_re_start_irq
> };
> @@ -1518,6 +1533,34 @@ static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev)
> return 0;
> }
>
> +static void bnxt_re_net_unregister_async_event(struct bnxt_re_dev *rdev)
> +{
> + int rc;
> +
> + if (rdev->is_virtfn)
> + return;
> +
> + memset(&rdev->event_bitmap, 0, sizeof(rdev->event_bitmap));
> + rc = bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
> + ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
> + if (rc)
> + ibdev_err(&rdev->ibdev, "Failed to unregister async event");
> +}
> +
> +static void bnxt_re_net_register_async_event(struct bnxt_re_dev *rdev)
> +{
> + int rc;
> +
> + if (rdev->is_virtfn)
> + return;
> +
> + rdev->event_bitmap |= (1 << ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
> + rc = bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
> + ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
> + if (rc)
> + ibdev_err(&rdev->ibdev, "Failed to unregister async event");
> +}
> +
> static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
> {
> struct bnxt_en_dev *en_dev = rdev->en_dev;
> @@ -1580,6 +1623,8 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev)
> u8 type;
> int rc;
>
> + bnxt_re_net_unregister_async_event(rdev);
> +
> if (test_and_clear_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags))
> cancel_delayed_work_sync(&rdev->worker);
>
> @@ -1776,6 +1821,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev)
> if (rdev->chip_ctx->modes.toggle_bits & BNXT_QPLIB_SRQ_TOGGLE_BIT)
> hash_init(rdev->srq_hash);
>
> + bnxt_re_net_register_async_event(rdev);
> +
> return 0;
> free_sctx:
> bnxt_re_net_stats_ctx_free(rdev, rdev->qplib_ctx.stats.fw_id);
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> index 04a623b3..2c82a2e 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
> @@ -2787,6 +2787,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;
> }
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> index b9e7d3e..9a55b06 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> @@ -339,6 +339,37 @@ 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 (edev->flags & BNXT_EN_FLAG_ULP_STOPPED)
> + goto exit_unlock_rcu;
Isn't this racy with bnxt_ulp_stop()?
> +
> + if (test_bit(event_id, ulp->async_events_bmap))
> + ops->ulp_async_notifier(ulp->handle, cmpl);
> +exit_unlock_rcu:
> + rcu_read_unlock();
> +}
> +EXPORT_SYMBOL(bnxt_ulp_async_events);
> +
> int bnxt_register_async_events(struct bnxt_en_dev *edev,
> unsigned long *events_bmap,
> u16 max_id)
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> index 4eafe6e..5bba0d7 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> @@ -28,6 +28,7 @@ struct bnxt_msix_entry {
> };
>
> struct bnxt_ulp_ops {
> + void (*ulp_async_notifier)(void *, struct hwrm_async_event_cmpl *);
> void (*ulp_irq_stop)(void *);
> void (*ulp_irq_restart)(void *, struct bnxt_msix_entry *);
> };
> --
> 2.5.5
>
next prev parent reply other threads:[~2024-09-05 10:25 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-03 11:30 [PATCH for-next 0/4] RDMA/bnxt_re: Driver update for updating congestion configs Selvin Xavier
2024-09-03 11:30 ` [PATCH for-next 1/4] RDMA/bnxt_re: Add FW async event support in driver Selvin Xavier
2024-09-05 10:25 ` Leon Romanovsky [this message]
2024-09-06 4:03 ` Selvin Xavier
2024-09-03 11:30 ` [PATCH for-next 2/4] RDMA/bnxt_re: Query firmware defaults of CC params during probe Selvin Xavier
2024-09-03 11:30 ` [PATCH for-next 3/4] RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event Selvin Xavier
2024-09-05 10:29 ` Leon Romanovsky
2024-09-06 4:05 ` Selvin Xavier
2024-09-03 11:30 ` [PATCH for-next 4/4] RDMA/bnxt_re: Enable ECN marking by default Selvin Xavier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240905102543.GS4026@unreal \
--to=leon@kernel.org \
--cc=andrew.gospodarek@broadcom.com \
--cc=jgg@ziepe.ca \
--cc=kalesh-anakkur.purayil@broadcom.com \
--cc=linux-rdma@vger.kernel.org \
--cc=michael.chan@broadcom.com \
--cc=selvin.xavier@broadcom.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.