* [PATCH rdma-next v2 RESEND 0/4] RDMA/bnxt_re: Support for FW async event handling
@ 2025-01-07 2:45 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
` (5 more replies)
0 siblings, 6 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
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(+)
--
2.43.5
^ permalink raw reply [flat|nested] 10+ messages in thread
* [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
* [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 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
* 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-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
* 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
end of thread, other threads:[~2025-01-15 4:01 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 15:24 ` Leon Romanovsky
2025-01-08 2:27 ` Kalesh Anakkur Purayil
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 ` [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 ` [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
2025-01-14 9:08 ` Leon Romanovsky
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).