* [PATCH rdma-next v2 RESEND 1/4] bnxt_en: Add ULP call to notify async events
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
@ 2025-01-07 2:45 ` Kalesh AP
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support Kalesh AP
` (4 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Kalesh AP @ 2025-01-07 2:45 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, davem, edumazet, kuba, netdev, pabeni, andrew+netdev,
andrew.gospodarek, selvin.xavier, michael.chan, pavan.chebbi,
Kalesh AP
From: Michael Chan <michael.chan@broadcom.com>
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>
---
drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 +
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 28 +++++++++++++++++++
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 2 ++
3 files changed, 31 insertions(+)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 4ec4934a4edd..25850730071b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -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;
}
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index b771c84cdd89..59c280634bc5 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
@@ -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)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
index 5d6aac60f236..a21294cf197b 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
@@ -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 *);
};
--
2.43.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 1/4] bnxt_en: Add ULP call to notify async events Kalesh AP
@ 2025-01-07 2:45 ` Kalesh AP
2025-01-07 15:24 ` Leon Romanovsky
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 3/4] RDMA/bnxt_re: Query firmware defaults of CC params during probe Kalesh AP
` (3 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Kalesh AP @ 2025-01-07 2:45 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, davem, edumazet, kuba, netdev, pabeni, andrew+netdev,
andrew.gospodarek, selvin.xavier, michael.chan, pavan.chebbi,
Kalesh AP
Using the option provided by Ethernet driver, register for FW Async
event. During probe, while registeriung with Ethernet driver, provide
the ulp hook 'ulp_async_notifier' for receiving the firmware events.
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
drivers/infiniband/hw/bnxt_re/bnxt_re.h | 1 +
drivers/infiniband/hw/bnxt_re/main.c | 47 +++++++++++++++++++++++++
2 files changed, 48 insertions(+)
diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index 2975b11b79bf..018386295bcd 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -229,6 +229,7 @@ struct bnxt_re_dev {
DECLARE_HASHTABLE(srq_hash, MAX_SRQ_HASH_BITS);
struct dentry *dbg_root;
struct dentry *qp_debugfs;
+ 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 6d1800e285ef..1dc305689d7b 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -295,6 +295,20 @@ static void bnxt_re_vf_res_config(struct bnxt_re_dev *rdev)
&rdev->qplib_ctx);
}
+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_en_dev_info *en_info = auxiliary_get_drvdata(handle);
@@ -361,6 +375,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
};
@@ -1785,6 +1800,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;
@@ -1864,6 +1907,8 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
bnxt_re_debugfs_rem_pdev(rdev);
+ 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);
@@ -2077,6 +2122,8 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
bnxt_re_debugfs_add_pdev(rdev);
+ bnxt_re_net_register_async_event(rdev);
+
return 0;
free_sctx:
bnxt_re_net_stats_ctx_free(rdev, rdev->qplib_ctx.stats.fw_id);
--
2.43.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support Kalesh AP
@ 2025-01-07 15:24 ` Leon Romanovsky
2025-01-08 2:27 ` Kalesh Anakkur Purayil
0 siblings, 1 reply; 10+ messages in thread
From: Leon Romanovsky @ 2025-01-07 15:24 UTC (permalink / raw)
To: Kalesh AP
Cc: jgg, linux-rdma, davem, edumazet, kuba, netdev, pabeni,
andrew+netdev, andrew.gospodarek, selvin.xavier, michael.chan,
pavan.chebbi
On Tue, Jan 07, 2025 at 08:15:50AM +0530, Kalesh AP wrote:
> Using the option provided by Ethernet driver, register for FW Async
> event. During probe, while registeriung with Ethernet driver, provide
> the ulp hook 'ulp_async_notifier' for receiving the firmware events.
>
> Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> ---
> drivers/infiniband/hw/bnxt_re/bnxt_re.h | 1 +
> drivers/infiniband/hw/bnxt_re/main.c | 47 +++++++++++++++++++++++++
> 2 files changed, 48 insertions(+)
<...>
> +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");
s/Failed to unregister async event/Failed to register async event
If it is the only comment, we will get for this series. You don't need to resend, I'll fix it.
Thanks
> +}
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support
2025-01-07 15:24 ` Leon Romanovsky
@ 2025-01-08 2:27 ` Kalesh Anakkur Purayil
0 siblings, 0 replies; 10+ messages in thread
From: Kalesh Anakkur Purayil @ 2025-01-08 2:27 UTC (permalink / raw)
To: Leon Romanovsky
Cc: jgg, linux-rdma, davem, edumazet, kuba, netdev, pabeni,
andrew+netdev, andrew.gospodarek, selvin.xavier, michael.chan,
pavan.chebbi
[-- Attachment #1: Type: text/plain, Size: 2042 bytes --]
On Tue, Jan 7, 2025 at 8:54 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Tue, Jan 07, 2025 at 08:15:50AM +0530, Kalesh AP wrote:
> > Using the option provided by Ethernet driver, register for FW Async
> > event. During probe, while registeriung with Ethernet driver, provide
> > the ulp hook 'ulp_async_notifier' for receiving the firmware events.
> >
> > Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
> > Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
> > ---
> > drivers/infiniband/hw/bnxt_re/bnxt_re.h | 1 +
> > drivers/infiniband/hw/bnxt_re/main.c | 47 +++++++++++++++++++++++++
> > 2 files changed, 48 insertions(+)
>
> <...>
>
> > +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");
>
> s/Failed to unregister async event/Failed to register async event
Looks like it was a copy-paste error :)
>
> If it is the only comment, we will get for this series. You don't need to resend, I'll fix it.
>
> Thanks
Thank you Leon.
>
> > +}
--
Regards,
Kalesh AP
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4239 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH rdma-next v2 RESEND 3/4] RDMA/bnxt_re: Query firmware defaults of CC params during probe
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 1/4] bnxt_en: Add ULP call to notify async events Kalesh AP
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 2/4] RDMA/bnxt_re: Add Async event handling support Kalesh AP
@ 2025-01-07 2:45 ` Kalesh AP
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 4/4] RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event Kalesh AP
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Kalesh AP @ 2025-01-07 2:45 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, davem, edumazet, kuba, netdev, pabeni, andrew+netdev,
andrew.gospodarek, selvin.xavier, michael.chan, pavan.chebbi,
Kalesh AP
Added function to query firmware default values of CC parameters
during driver init. These values will be stored in driver local
structure and used in subsequent patch.
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
---
drivers/infiniband/hw/bnxt_re/bnxt_re.h | 1 +
drivers/infiniband/hw/bnxt_re/main.c | 5 +
drivers/infiniband/hw/bnxt_re/qplib_sp.c | 113 +++++++++++++++++++++++
drivers/infiniband/hw/bnxt_re/qplib_sp.h | 2 +
4 files changed, 121 insertions(+)
diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index 018386295bcd..f40aca550328 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -230,6 +230,7 @@ struct bnxt_re_dev {
struct dentry *dbg_root;
struct dentry *qp_debugfs;
unsigned long event_bitmap;
+ struct bnxt_qplib_cc_param cc_param;
};
#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 1dc305689d7b..aa08eb5bbb68 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -2104,6 +2104,11 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
set_bit(BNXT_RE_FLAG_RESOURCES_INITIALIZED, &rdev->flags);
if (!rdev->is_virtfn) {
+ /* Query f/w defaults of CC params */
+ rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, &rdev->cc_param);
+ if (rc)
+ ibdev_warn(&rdev->ibdev, "Failed to query CC defaults\n");
+
rc = bnxt_re_setup_qos(rdev);
if (rc)
ibdev_info(&rdev->ibdev,
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c
index 7e20ae3d2c4f..d56cc3330d1b 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c
+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c
@@ -1016,3 +1016,116 @@ int bnxt_qplib_read_context(struct bnxt_qplib_rcfw *rcfw, u8 res_type,
dma_free_coherent(&rcfw->pdev->dev, sbuf.size, sbuf.sb, sbuf.dma_addr);
return rc;
}
+
+static void bnxt_qplib_read_cc_gen1(struct bnxt_qplib_cc_param_ext *cc_ext,
+ struct creq_query_roce_cc_gen1_resp_sb_tlv *sb)
+{
+ cc_ext->inact_th_hi = le16_to_cpu(sb->inactivity_th_hi);
+ cc_ext->min_delta_cnp = le16_to_cpu(sb->min_time_between_cnps);
+ cc_ext->init_cp = le16_to_cpu(sb->init_cp);
+ cc_ext->tr_update_mode = sb->tr_update_mode;
+ cc_ext->tr_update_cyls = sb->tr_update_cycles;
+ cc_ext->fr_rtt = sb->fr_num_rtts;
+ cc_ext->ai_rate_incr = sb->ai_rate_increase;
+ cc_ext->rr_rtt_th = le16_to_cpu(sb->reduction_relax_rtts_th);
+ cc_ext->ar_cr_th = le16_to_cpu(sb->additional_relax_cr_th);
+ cc_ext->cr_min_th = le16_to_cpu(sb->cr_min_th);
+ cc_ext->bw_avg_weight = sb->bw_avg_weight;
+ cc_ext->cr_factor = sb->actual_cr_factor;
+ cc_ext->cr_th_max_cp = le16_to_cpu(sb->max_cp_cr_th);
+ cc_ext->cp_bias_en = sb->cp_bias_en;
+ cc_ext->cp_bias = sb->cp_bias;
+ cc_ext->cnp_ecn = sb->cnp_ecn;
+ cc_ext->rtt_jitter_en = sb->rtt_jitter_en;
+ cc_ext->bytes_per_usec = le16_to_cpu(sb->link_bytes_per_usec);
+ cc_ext->cc_cr_reset_th = le16_to_cpu(sb->reset_cc_cr_th);
+ cc_ext->cr_width = sb->cr_width;
+ cc_ext->min_quota = sb->quota_period_min;
+ cc_ext->max_quota = sb->quota_period_max;
+ cc_ext->abs_max_quota = sb->quota_period_abs_max;
+ cc_ext->tr_lb = le16_to_cpu(sb->tr_lower_bound);
+ cc_ext->cr_prob_fac = sb->cr_prob_factor;
+ cc_ext->tr_prob_fac = sb->tr_prob_factor;
+ cc_ext->fair_cr_th = le16_to_cpu(sb->fairness_cr_th);
+ cc_ext->red_div = sb->red_div;
+ cc_ext->cnp_ratio_th = sb->cnp_ratio_th;
+ cc_ext->ai_ext_rtt = le16_to_cpu(sb->exp_ai_rtts);
+ cc_ext->exp_crcp_ratio = sb->exp_ai_cr_cp_ratio;
+ cc_ext->low_rate_en = sb->use_rate_table;
+ cc_ext->cpcr_update_th = le16_to_cpu(sb->cp_exp_update_th);
+ cc_ext->ai_rtt_th1 = le16_to_cpu(sb->high_exp_ai_rtts_th1);
+ cc_ext->ai_rtt_th2 = le16_to_cpu(sb->high_exp_ai_rtts_th2);
+ cc_ext->cf_rtt_th = le16_to_cpu(sb->actual_cr_cong_free_rtts_th);
+ cc_ext->sc_cr_th1 = le16_to_cpu(sb->severe_cong_cr_th1);
+ cc_ext->sc_cr_th2 = le16_to_cpu(sb->severe_cong_cr_th2);
+ cc_ext->l64B_per_rtt = le32_to_cpu(sb->link64B_per_rtt);
+ cc_ext->cc_ack_bytes = sb->cc_ack_bytes;
+ cc_ext->reduce_cf_rtt_th = le16_to_cpu(sb->reduce_init_cong_free_rtts_th);
+}
+
+int bnxt_qplib_query_cc_param(struct bnxt_qplib_res *res,
+ struct bnxt_qplib_cc_param *cc_param)
+{
+ struct bnxt_qplib_tlv_query_rcc_sb *ext_sb;
+ struct bnxt_qplib_rcfw *rcfw = res->rcfw;
+ struct creq_query_roce_cc_resp resp = {};
+ struct creq_query_roce_cc_resp_sb *sb;
+ struct bnxt_qplib_cmdqmsg msg = {};
+ struct cmdq_query_roce_cc req = {};
+ struct bnxt_qplib_rcfw_sbuf sbuf;
+ size_t resp_size;
+ int rc;
+
+ /* Query the parameters from chip */
+ bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, CMDQ_BASE_OPCODE_QUERY_ROCE_CC,
+ sizeof(req));
+ if (bnxt_qplib_is_chip_gen_p5_p7(res->cctx))
+ resp_size = sizeof(*ext_sb);
+ else
+ resp_size = sizeof(*sb);
+
+ sbuf.size = ALIGN(resp_size, BNXT_QPLIB_CMDQE_UNITS);
+ sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size,
+ &sbuf.dma_addr, GFP_KERNEL);
+ if (!sbuf.sb)
+ return -ENOMEM;
+
+ req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS;
+ bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req),
+ sizeof(resp), 0);
+ rc = bnxt_qplib_rcfw_send_message(res->rcfw, &msg);
+ if (rc)
+ goto out;
+
+ ext_sb = sbuf.sb;
+ sb = bnxt_qplib_is_chip_gen_p5_p7(res->cctx) ? &ext_sb->base_sb :
+ (struct creq_query_roce_cc_resp_sb *)ext_sb;
+
+ cc_param->enable = sb->enable_cc & CREQ_QUERY_ROCE_CC_RESP_SB_ENABLE_CC;
+ cc_param->tos_ecn = (sb->tos_dscp_tos_ecn &
+ CREQ_QUERY_ROCE_CC_RESP_SB_TOS_ECN_MASK) >>
+ CREQ_QUERY_ROCE_CC_RESP_SB_TOS_ECN_SFT;
+ cc_param->tos_dscp = (sb->tos_dscp_tos_ecn &
+ CREQ_QUERY_ROCE_CC_RESP_SB_TOS_DSCP_MASK) >>
+ CREQ_QUERY_ROCE_CC_RESP_SB_TOS_DSCP_SFT;
+ cc_param->alt_tos_dscp = sb->alt_tos_dscp;
+ cc_param->alt_vlan_pcp = sb->alt_vlan_pcp;
+
+ cc_param->g = sb->g;
+ cc_param->nph_per_state = sb->num_phases_per_state;
+ cc_param->init_cr = le16_to_cpu(sb->init_cr);
+ cc_param->init_tr = le16_to_cpu(sb->init_tr);
+ cc_param->cc_mode = sb->cc_mode;
+ cc_param->inact_th = le16_to_cpu(sb->inactivity_th);
+ cc_param->rtt = le16_to_cpu(sb->rtt);
+ cc_param->tcp_cp = le16_to_cpu(sb->tcp_cp);
+ cc_param->time_pph = sb->time_per_phase;
+ cc_param->pkts_pph = sb->pkts_per_phase;
+ if (bnxt_qplib_is_chip_gen_p5_p7(res->cctx)) {
+ bnxt_qplib_read_cc_gen1(&cc_param->cc_ext, &ext_sb->gen1_sb);
+ cc_param->inact_th |= (cc_param->cc_ext.inact_th_hi & 0x3F) << 16;
+ }
+out:
+ dma_free_coherent(&rcfw->pdev->dev, sbuf.size, sbuf.sb, sbuf.dma_addr);
+ return rc;
+}
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
index e6beeb514b7d..debb26080143 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
@@ -355,6 +355,8 @@ int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res,
struct bnxt_qplib_cc_param *cc_param);
int bnxt_qplib_read_context(struct bnxt_qplib_rcfw *rcfw, u8 type, u32 xid,
u32 resp_size, void *resp_va);
+int bnxt_qplib_query_cc_param(struct bnxt_qplib_res *res,
+ struct bnxt_qplib_cc_param *cc_param);
#define BNXT_VAR_MAX_WQE 4352
#define BNXT_VAR_MAX_SLOT_ALIGN 256
--
2.43.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH rdma-next v2 RESEND 4/4] RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
` (2 preceding siblings ...)
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 3/4] RDMA/bnxt_re: Query firmware defaults of CC params during probe Kalesh AP
@ 2025-01-07 2:45 ` Kalesh AP
2025-01-14 9:05 ` [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Leon Romanovsky
2025-01-14 9:08 ` Leon Romanovsky
5 siblings, 0 replies; 10+ messages in thread
From: Kalesh AP @ 2025-01-07 2:45 UTC (permalink / raw)
To: leon, jgg
Cc: linux-rdma, davem, edumazet, kuba, netdev, pabeni, andrew+netdev,
andrew.gospodarek, selvin.xavier, michael.chan, pavan.chebbi,
Kalesh AP
QP1 context in HW needs to be updated when there is a
change in the default DSCP values used for RoCE traffic.
Handle the event from FW and modify the dscp value used
by QP1.
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 | 104 +++++++++++++++++++++++
drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 +
drivers/infiniband/hw/bnxt_re/qplib_sp.h | 1 +
4 files changed, 107 insertions(+)
diff --git a/drivers/infiniband/hw/bnxt_re/bnxt_re.h b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
index f40aca550328..dc2b193af7e8 100644
--- a/drivers/infiniband/hw/bnxt_re/bnxt_re.h
+++ b/drivers/infiniband/hw/bnxt_re/bnxt_re.h
@@ -231,6 +231,7 @@ struct bnxt_re_dev {
struct dentry *qp_debugfs;
unsigned long event_bitmap;
struct bnxt_qplib_cc_param cc_param;
+ struct workqueue_struct *dcb_wq;
};
#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 aa08eb5bbb68..1988bf884445 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -295,9 +295,96 @@ static void bnxt_re_vf_res_config(struct bnxt_re_dev *rdev)
&rdev->qplib_ctx);
}
+struct bnxt_re_dcb_work {
+ struct work_struct work;
+ struct bnxt_re_dev *rdev;
+ struct hwrm_async_event_cmpl cmpl;
+};
+
+static bool bnxt_re_is_qp1_qp(struct bnxt_re_qp *qp)
+{
+ return qp->ib_qp.qp_type == IB_QPT_GSI;
+}
+
+static struct bnxt_re_qp *bnxt_re_get_qp1_qp(struct bnxt_re_dev *rdev)
+{
+ struct bnxt_re_qp *qp;
+
+ mutex_lock(&rdev->qp_lock);
+ list_for_each_entry(qp, &rdev->qp_list, list) {
+ if (bnxt_re_is_qp1_qp(qp)) {
+ mutex_unlock(&rdev->qp_lock);
+ return qp;
+ }
+ }
+ mutex_unlock(&rdev->qp_lock);
+ return NULL;
+}
+
+static int bnxt_re_update_qp1_tos_dscp(struct bnxt_re_dev *rdev)
+{
+ struct bnxt_re_qp *qp;
+
+ if (!bnxt_qplib_is_chip_gen_p5_p7(rdev->chip_ctx))
+ return 0;
+
+ qp = bnxt_re_get_qp1_qp(rdev);
+ if (!qp)
+ return 0;
+
+ qp->qplib_qp.modify_flags = CMDQ_MODIFY_QP_MODIFY_MASK_TOS_DSCP;
+ qp->qplib_qp.tos_dscp = rdev->cc_param.qp1_tos_dscp;
+
+ return bnxt_qplib_modify_qp(&rdev->qplib_res, &qp->qplib_qp);
+}
+
+static void bnxt_re_init_dcb_wq(struct bnxt_re_dev *rdev)
+{
+ rdev->dcb_wq = create_singlethread_workqueue("bnxt_re_dcb_wq");
+}
+
+static void bnxt_re_uninit_dcb_wq(struct bnxt_re_dev *rdev)
+{
+ if (!rdev->dcb_wq)
+ return;
+ destroy_workqueue(rdev->dcb_wq);
+}
+
+static void bnxt_re_dcb_wq_task(struct work_struct *work)
+{
+ struct bnxt_re_dcb_work *dcb_work =
+ container_of(work, struct bnxt_re_dcb_work, work);
+ struct bnxt_re_dev *rdev = dcb_work->rdev;
+ struct bnxt_qplib_cc_param *cc_param;
+ int rc;
+
+ if (!rdev)
+ goto free_dcb;
+
+ cc_param = &rdev->cc_param;
+ rc = bnxt_qplib_query_cc_param(&rdev->qplib_res, cc_param);
+ if (rc) {
+ ibdev_dbg(&rdev->ibdev, "Failed to query ccparam rc:%d", rc);
+ goto free_dcb;
+ }
+ if (cc_param->qp1_tos_dscp != cc_param->tos_dscp) {
+ cc_param->qp1_tos_dscp = cc_param->tos_dscp;
+ rc = bnxt_re_update_qp1_tos_dscp(rdev);
+ if (rc) {
+ ibdev_dbg(&rdev->ibdev, "%s: Failed to modify QP1 rc:%d",
+ __func__, rc);
+ goto free_dcb;
+ }
+ }
+
+free_dcb:
+ kfree(dcb_work);
+}
+
static void bnxt_re_async_notifier(void *handle, struct hwrm_async_event_cmpl *cmpl)
{
struct bnxt_re_dev *rdev = (struct bnxt_re_dev *)handle;
+ struct bnxt_re_dcb_work *dcb_work;
u32 data1, data2;
u16 event_id;
@@ -307,6 +394,21 @@ static void bnxt_re_async_notifier(void *handle, struct hwrm_async_event_cmpl *c
ibdev_dbg(&rdev->ibdev, "Async event_id = %d data1 = %d data2 = %d",
event_id, data1, data2);
+
+ switch (event_id) {
+ case ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE:
+ dcb_work = kzalloc(sizeof(*dcb_work), GFP_ATOMIC);
+ if (!dcb_work)
+ break;
+
+ dcb_work->rdev = rdev;
+ memcpy(&dcb_work->cmpl, cmpl, sizeof(*cmpl));
+ INIT_WORK(&dcb_work->work, bnxt_re_dcb_wq_task);
+ queue_work(rdev->dcb_wq, &dcb_work->work);
+ break;
+ default:
+ break;
+ }
}
static void bnxt_re_stop_irq(void *handle)
@@ -1908,6 +2010,7 @@ static void bnxt_re_dev_uninit(struct bnxt_re_dev *rdev, u8 op_type)
bnxt_re_debugfs_rem_pdev(rdev);
bnxt_re_net_unregister_async_event(rdev);
+ bnxt_re_uninit_dcb_wq(rdev);
if (test_and_clear_bit(BNXT_RE_FLAG_QOS_WORK_REG, &rdev->flags))
cancel_delayed_work_sync(&rdev->worker);
@@ -2127,6 +2230,7 @@ static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 op_type)
bnxt_re_debugfs_add_pdev(rdev);
+ bnxt_re_init_dcb_wq(rdev);
bnxt_re_net_register_async_event(rdev);
return 0;
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
index ef3424c81345..264cf0c2c1ac 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
@@ -343,6 +343,7 @@ struct bnxt_qplib_qp {
u32 msn;
u32 msn_tbl_sz;
bool is_host_msn_tbl;
+ u8 tos_dscp;
};
#define BNXT_QPLIB_MAX_CQE_ENTRY_SIZE sizeof(struct cq_base)
diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
index debb26080143..eafa0c1bc732 100644
--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h
+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h
@@ -296,6 +296,7 @@ struct bnxt_qplib_cc_param_ext {
struct bnxt_qplib_cc_param {
u8 alt_vlan_pcp;
+ u8 qp1_tos_dscp;
u16 alt_tos_dscp;
u8 cc_mode;
u8 enable;
--
2.43.5
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
` (3 preceding siblings ...)
2025-01-07 2:45 ` [PATCH rdma-next v2 RESEND 4/4] RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event Kalesh AP
@ 2025-01-14 9:05 ` Leon Romanovsky
2025-01-15 4:01 ` Kalesh Anakkur Purayil
2025-01-14 9:08 ` Leon Romanovsky
5 siblings, 1 reply; 10+ messages in thread
From: Leon Romanovsky @ 2025-01-14 9:05 UTC (permalink / raw)
To: Kalesh AP
Cc: jgg, linux-rdma, davem, edumazet, kuba, netdev, pabeni,
andrew+netdev, andrew.gospodarek, selvin.xavier, michael.chan,
pavan.chebbi
On Tue, Jan 07, 2025 at 08:15:48AM +0530, Kalesh AP wrote:
> This patch series adds support for FW async event handling
> in the bnxt_re driver.
>
> V1->V2:
> 1. Rebased on top of the latest "for-next" tree.
> 2. Split Patch#1 into 2 - one for Ethernet driver changes and
> another one for RDMA driver changes.
> 3. Addressed Leon's comments on Patch#1 and Patch #3.
> V1: https://lore.kernel.org/linux-rdma/1725363051-19268-1-git-send-email-selvin.xavier@broadcom.com/T/#t
>
> Patch #1:
> 1. Removed BNXT_EN_FLAG_ULP_STOPPED state check from bnxt_ulp_async_events().
> The ulp_ops are protected by RCU. This means that during bnxt_unregister_dev(),
> Ethernet driver set the ulp_ops pointer to NULL and do RCU sync before return
> to the RDMA driver.
> So ulp_ops and the pointers in ulp_ops are always valid or NULL when the
> Ethernet driver references ulp_ops. ULP_STOPPED is a state and should be
> unrelated to async events. It should not affect whether async events should
> or should not be passed to the RDMA driver.
> 2. Changed Author of Ethernet driver changes to Michael Chan.
> 3. Removed unnecessary export of function bnxt_ulp_async_events.
>
> Patch #3:
> 1. Removed unnecessary flush_workqueue() before destroy_workqueue()
> 2. Removed unnecessary NULL assignment after free.
> 3. Changed to use "ibdev_xxx" and reduce level of couple of logs to debug.
>
> Please review and apply.
>
> Regards,
> Kalesh
>
>
> Kalesh AP (3):
> RDMA/bnxt_re: Add Async event handling support
> RDMA/bnxt_re: Query firmware defaults of CC params during probe
> RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event
>
> Michael Chan (1):
> bnxt_en: Add ULP call to notify async events
>
> drivers/infiniband/hw/bnxt_re/bnxt_re.h | 3 +
> drivers/infiniband/hw/bnxt_re/main.c | 156 ++++++++++++++++++
> drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 +
> drivers/infiniband/hw/bnxt_re/qplib_sp.c | 113 +++++++++++++
> drivers/infiniband/hw/bnxt_re/qplib_sp.h | 3 +
> drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 +
> drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 28 ++++
> drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 2 +
> 8 files changed, 307 insertions(+)
Applied with the following fix
diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
index 1dc305689d7bb..54dee0f5dd3f5 100644
--- a/drivers/infiniband/hw/bnxt_re/main.c
+++ b/drivers/infiniband/hw/bnxt_re/main.c
@@ -1802,30 +1802,22 @@ static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev)
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");
+ bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
+ ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
}
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");
+ bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
+ ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
}
static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
index 59c280634bc5f..3e17db0a453e0 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
@@ -373,9 +373,8 @@ void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl)
rcu_read_unlock();
}
-int bnxt_register_async_events(struct bnxt_en_dev *edev,
- unsigned long *events_bmap,
- u16 max_id)
+void bnxt_register_async_events(struct bnxt_en_dev *edev,
+ unsigned long *events_bmap, u16 max_id)
{
struct net_device *dev = edev->net;
struct bnxt *bp = netdev_priv(dev);
@@ -387,7 +386,6 @@ int bnxt_register_async_events(struct bnxt_en_dev *edev,
smp_wmb();
ulp->max_async_event_id = max_id;
bnxt_hwrm_func_drv_rgtr(bp, events_bmap, max_id + 1, true);
- return 0;
}
EXPORT_SYMBOL(bnxt_register_async_events);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
index a21294cf197b8..ee6a5b8562c3e 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
@@ -126,6 +126,6 @@ int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,
void *handle);
void bnxt_unregister_dev(struct bnxt_en_dev *edev);
int bnxt_send_msg(struct bnxt_en_dev *edev, struct bnxt_fw_msg *fw_msg);
-int bnxt_register_async_events(struct bnxt_en_dev *edev,
- unsigned long *events_bmap, u16 max_id);
+void bnxt_register_async_events(struct bnxt_en_dev *edev,
+ unsigned long *events_bmap, u16 max_id);
#endif
>
> --
> 2.43.5
>
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling
2025-01-14 9:05 ` [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Leon Romanovsky
@ 2025-01-15 4:01 ` Kalesh Anakkur Purayil
0 siblings, 0 replies; 10+ messages in thread
From: Kalesh Anakkur Purayil @ 2025-01-15 4:01 UTC (permalink / raw)
To: Leon Romanovsky
Cc: jgg, linux-rdma, davem, edumazet, kuba, netdev, pabeni,
andrew+netdev, andrew.gospodarek, selvin.xavier, michael.chan,
pavan.chebbi
[-- Attachment #1: Type: text/plain, Size: 6304 bytes --]
On Tue, Jan 14, 2025 at 2:35 PM Leon Romanovsky <leon@kernel.org> wrote:
>
> On Tue, Jan 07, 2025 at 08:15:48AM +0530, Kalesh AP wrote:
> > This patch series adds support for FW async event handling
> > in the bnxt_re driver.
> >
> > V1->V2:
> > 1. Rebased on top of the latest "for-next" tree.
> > 2. Split Patch#1 into 2 - one for Ethernet driver changes and
> > another one for RDMA driver changes.
> > 3. Addressed Leon's comments on Patch#1 and Patch #3.
> > V1: https://lore.kernel.org/linux-rdma/1725363051-19268-1-git-send-email-selvin.xavier@broadcom.com/T/#t
> >
> > Patch #1:
> > 1. Removed BNXT_EN_FLAG_ULP_STOPPED state check from bnxt_ulp_async_events().
> > The ulp_ops are protected by RCU. This means that during bnxt_unregister_dev(),
> > Ethernet driver set the ulp_ops pointer to NULL and do RCU sync before return
> > to the RDMA driver.
> > So ulp_ops and the pointers in ulp_ops are always valid or NULL when the
> > Ethernet driver references ulp_ops. ULP_STOPPED is a state and should be
> > unrelated to async events. It should not affect whether async events should
> > or should not be passed to the RDMA driver.
> > 2. Changed Author of Ethernet driver changes to Michael Chan.
> > 3. Removed unnecessary export of function bnxt_ulp_async_events.
> >
> > Patch #3:
> > 1. Removed unnecessary flush_workqueue() before destroy_workqueue()
> > 2. Removed unnecessary NULL assignment after free.
> > 3. Changed to use "ibdev_xxx" and reduce level of couple of logs to debug.
> >
> > Please review and apply.
> >
> > Regards,
> > Kalesh
> >
> >
> > Kalesh AP (3):
> > RDMA/bnxt_re: Add Async event handling support
> > RDMA/bnxt_re: Query firmware defaults of CC params during probe
> > RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event
> >
> > Michael Chan (1):
> > bnxt_en: Add ULP call to notify async events
> >
> > drivers/infiniband/hw/bnxt_re/bnxt_re.h | 3 +
> > drivers/infiniband/hw/bnxt_re/main.c | 156 ++++++++++++++++++
> > drivers/infiniband/hw/bnxt_re/qplib_fp.h | 1 +
> > drivers/infiniband/hw/bnxt_re/qplib_sp.c | 113 +++++++++++++
> > drivers/infiniband/hw/bnxt_re/qplib_sp.h | 3 +
> > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 1 +
> > drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c | 28 ++++
> > drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h | 2 +
> > 8 files changed, 307 insertions(+)
>
> Applied with the following fix
>
> diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c
> index 1dc305689d7bb..54dee0f5dd3f5 100644
> --- a/drivers/infiniband/hw/bnxt_re/main.c
> +++ b/drivers/infiniband/hw/bnxt_re/main.c
> @@ -1802,30 +1802,22 @@ static int bnxt_re_setup_qos(struct bnxt_re_dev *rdev)
>
> 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");
> + bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
> + ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
> }
>
> 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");
> + bnxt_register_async_events(rdev->en_dev, &rdev->event_bitmap,
> + ASYNC_EVENT_CMPL_EVENT_ID_DCB_CONFIG_CHANGE);
> }
>
> static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev)
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> index 59c280634bc5f..3e17db0a453e0 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
> @@ -373,9 +373,8 @@ void bnxt_ulp_async_events(struct bnxt *bp, struct hwrm_async_event_cmpl *cmpl)
> rcu_read_unlock();
> }
>
> -int bnxt_register_async_events(struct bnxt_en_dev *edev,
> - unsigned long *events_bmap,
> - u16 max_id)
> +void bnxt_register_async_events(struct bnxt_en_dev *edev,
> + unsigned long *events_bmap, u16 max_id)
> {
> struct net_device *dev = edev->net;
> struct bnxt *bp = netdev_priv(dev);
> @@ -387,7 +386,6 @@ int bnxt_register_async_events(struct bnxt_en_dev *edev,
> smp_wmb();
> ulp->max_async_event_id = max_id;
> bnxt_hwrm_func_drv_rgtr(bp, events_bmap, max_id + 1, true);
> - return 0;
> }
> EXPORT_SYMBOL(bnxt_register_async_events);
>
> diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> index a21294cf197b8..ee6a5b8562c3e 100644
> --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
> @@ -126,6 +126,6 @@ int bnxt_register_dev(struct bnxt_en_dev *edev, struct bnxt_ulp_ops *ulp_ops,
> void *handle);
> void bnxt_unregister_dev(struct bnxt_en_dev *edev);
> int bnxt_send_msg(struct bnxt_en_dev *edev, struct bnxt_fw_msg *fw_msg);
> -int bnxt_register_async_events(struct bnxt_en_dev *edev,
> - unsigned long *events_bmap, u16 max_id);
> +void bnxt_register_async_events(struct bnxt_en_dev *edev,
> + unsigned long *events_bmap, u16 max_id);
> #endif
Makes sense and LGTM, thank you Leon!
>
> >
> > --
> > 2.43.5
> >
--
Regards,
Kalesh AP
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4239 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling
2025-01-07 2:45 [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Kalesh AP
` (4 preceding siblings ...)
2025-01-14 9:05 ` [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling Leon Romanovsky
@ 2025-01-14 9:08 ` Leon Romanovsky
5 siblings, 0 replies; 10+ messages in thread
From: Leon Romanovsky @ 2025-01-14 9:08 UTC (permalink / raw)
To: jgg, Kalesh AP
Cc: linux-rdma, davem, edumazet, kuba, netdev, pabeni, andrew+netdev,
andrew.gospodarek, selvin.xavier, michael.chan, pavan.chebbi
On Tue, 07 Jan 2025 08:15:48 +0530, Kalesh AP wrote:
> This patch series adds support for FW async event handling
> in the bnxt_re driver.
>
> V1->V2:
> 1. Rebased on top of the latest "for-next" tree.
> 2. Split Patch#1 into 2 - one for Ethernet driver changes and
> another one for RDMA driver changes.
> 3. Addressed Leon's comments on Patch#1 and Patch #3.
> V1: https://lore.kernel.org/linux-rdma/1725363051-19268-1-git-send-email-selvin.xavier@broadcom.com/T/#t
>
> [...]
Applied, thanks!
[1/4] bnxt_en: Add ULP call to notify async events
https://git.kernel.org/rdma/rdma/c/184fe6f2382bab
[2/4] RDMA/bnxt_re: Add Async event handling support
https://git.kernel.org/rdma/rdma/c/7fea327840683e
[3/4] RDMA/bnxt_re: Query firmware defaults of CC params during probe
https://git.kernel.org/rdma/rdma/c/c0ad30eddc2858
[4/4] RDMA/bnxt_re: Add support to handle DCB_CONFIG_CHANGE event
https://git.kernel.org/rdma/rdma/c/51dc5312dcd929
Best regards,
--
Leon Romanovsky <leon@kernel.org>
^ permalink raw reply [flat|nested] 10+ messages in thread