patch 'net/octeon_ep: fix device start' has been queued to stable release 23.11.6
Shani Peretz
shperetz at nvidia.com
Sun Dec 21 15:56:31 CET 2025
Hi,
FYI, your patch has been queued to stable release 23.11.6
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 12/26/25. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/shanipr/dpdk-stable
This queued commit can be viewed at:
https://github.com/shanipr/dpdk-stable/commit/6170c4e649b34c6ea40cb3eecd4b3b882084f444
Thanks.
Shani
---
>From 6170c4e649b34c6ea40cb3eecd4b3b882084f444 Mon Sep 17 00:00:00 2001
From: Vamsi Attunuru <vattunuru at marvell.com>
Date: Mon, 14 Jul 2025 11:28:49 +0530
Subject: [PATCH] net/octeon_ep: fix device start
[ upstream commit c892964faa605c7884b454b435c4fb663dff0c9e ]
Currently the device start routine clears the TX doorbell and
updates RX doorbell, which causes the device start operation
to fail after a device stop.
Patch corrects the handling of RX & TX doorbell and ensures
that any pending packets in the RX queue are drained and gets
refilled before starting the device.
Fixes: 2c82554c98bd ("net/octeontx_ep: add device start and stop")
Signed-off-by: Vamsi Attunuru <vattunuru at marvell.com>
---
drivers/net/octeon_ep/cnxk_ep_rx.c | 40 +++++++++++++++++++++++++++
drivers/net/octeon_ep/cnxk_ep_vf.c | 32 ++++++++++-----------
drivers/net/octeon_ep/otx2_ep_vf.c | 30 +++++++++-----------
drivers/net/octeon_ep/otx_ep_common.h | 1 +
drivers/net/octeon_ep/otx_ep_ethdev.c | 6 ++++
drivers/net/octeon_ep/otx_ep_rxtx.h | 3 ++
6 files changed, 77 insertions(+), 35 deletions(-)
diff --git a/drivers/net/octeon_ep/cnxk_ep_rx.c b/drivers/net/octeon_ep/cnxk_ep_rx.c
index 74f0011283..41b369bd6b 100644
--- a/drivers/net/octeon_ep/cnxk_ep_rx.c
+++ b/drivers/net/octeon_ep/cnxk_ep_rx.c
@@ -307,3 +307,43 @@ cn9k_ep_recv_pkts_mseg(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pk
return new_pkts;
}
+
+void
+cnxk_ep_drain_rx_pkts(void *rx_queue)
+{
+ struct otx_ep_droq *droq = (struct otx_ep_droq *)rx_queue;
+ struct rte_mbuf *rx_pkt, *next_seg, *seg;
+ uint16_t i, j, nb_pkts;
+
+ if (droq->read_idx == 0 && droq->pkts_pending == 0 && droq->refill_count)
+ return;
+
+ /* Check for pending packets */
+ nb_pkts = cnxk_ep_rx_pkts_to_process(droq, droq->nb_desc);
+
+ /* Drain the pending packets */
+ for (i = 0; i < nb_pkts; i++) {
+ rx_pkt = NULL;
+ cnxk_ep_process_pkts_scalar_mseg(&rx_pkt, droq, 1);
+ if (rx_pkt) {
+ seg = rx_pkt->next;
+ for (j = 1; j < rx_pkt->nb_segs; j++) {
+ next_seg = seg->next;
+ rte_mempool_put(droq->mpool, seg);
+ seg = next_seg;
+ }
+ rx_pkt->nb_segs = 1;
+ rte_mempool_put(droq->mpool, rx_pkt);
+ }
+ }
+
+ cnxk_ep_rx_refill(droq);
+
+ /* Reset the indexes */
+ droq->read_idx = 0;
+ droq->write_idx = 0;
+ droq->refill_idx = 0;
+ droq->refill_count = 0;
+ droq->last_pkt_count = 0;
+ droq->pkts_pending = 0;
+}
diff --git a/drivers/net/octeon_ep/cnxk_ep_vf.c b/drivers/net/octeon_ep/cnxk_ep_vf.c
index 74b63a161f..6e56cb3a73 100644
--- a/drivers/net/octeon_ep/cnxk_ep_vf.c
+++ b/drivers/net/octeon_ep/cnxk_ep_vf.c
@@ -138,6 +138,18 @@ cnxk_ep_vf_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no)
return -EIO;
}
+ /* Clear the IQ doorbell */
+ loop = OTX_EP_BUSY_LOOP_COUNT;
+ while ((rte_read64(iq->doorbell_reg) != 0ull) && loop--) {
+ rte_write32(OTX_EP_CLEAR_INSTR_DBELL, iq->doorbell_reg);
+ rte_delay_ms(1);
+ }
+
+ if (loop < 0) {
+ otx_ep_err("INSTR DBELL is not zero");
+ return -EIO;
+ }
+
/* IN INTR_THRESHOLD is set to max(FFFFFFFF) which disable the IN INTR
* to raise
*/
@@ -237,8 +249,8 @@ cnxk_ep_vf_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no)
droq->pkts_sent_ism =
(uint32_t *)((uint8_t *)otx_ep->ism_buffer_mz->addr
+ CNXK_EP_OQ_ISM_OFFSET(oq_no));
- otx_ep_err("SDP_R[%d] OQ ISM virt: %p dma: 0x%" PRIX64,
- oq_no, (void *)droq->pkts_sent_ism, ism_addr);
+ otx_ep_err("SDP_R[%d] OQ ISM virt: %p dma: 0x%" PRIX64, oq_no,
+ (void *)(uintptr_t)droq->pkts_sent_ism, ism_addr);
*droq->pkts_sent_ism = 0;
droq->pkts_sent_ism_prev = 0;
@@ -266,24 +278,8 @@ cnxk_ep_vf_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no)
static int
cnxk_ep_vf_enable_iq(struct otx_ep_device *otx_ep, uint32_t q_no)
{
- int loop = OTX_EP_BUSY_LOOP_COUNT;
uint64_t reg_val = 0ull;
- /* Resetting doorbells during IQ enabling also to handle abrupt
- * guest reboot. IQ reset does not clear the doorbells.
- */
- oct_ep_write64(0xFFFFFFFF, otx_ep->hw_addr + CNXK_EP_R_IN_INSTR_DBELL(q_no));
-
- while (((oct_ep_read64(otx_ep->hw_addr +
- CNXK_EP_R_IN_INSTR_DBELL(q_no))) != 0ull) && loop--) {
- rte_delay_ms(1);
- }
-
- if (loop < 0) {
- otx_ep_err("INSTR DBELL not coming back to 0");
- return -EIO;
- }
-
reg_val = oct_ep_read64(otx_ep->hw_addr + CNXK_EP_R_IN_ENABLE(q_no));
reg_val |= 0x1ull;
diff --git a/drivers/net/octeon_ep/otx2_ep_vf.c b/drivers/net/octeon_ep/otx2_ep_vf.c
index fdab542246..203933c7d2 100644
--- a/drivers/net/octeon_ep/otx2_ep_vf.c
+++ b/drivers/net/octeon_ep/otx2_ep_vf.c
@@ -287,6 +287,18 @@ otx2_vf_setup_iq_regs(struct otx_ep_device *otx_ep, uint32_t iq_no)
return -EIO;
}
+ /* Clear the IQ doorbell */
+ loop = OTX_EP_BUSY_LOOP_COUNT;
+ while ((rte_read64(iq->doorbell_reg) != 0ull) && loop--) {
+ rte_write32(OTX_EP_CLEAR_INSTR_DBELL, iq->doorbell_reg);
+ rte_delay_ms(1);
+ }
+
+ if (loop < 0) {
+ otx_ep_err("INSTR DBELL is not zero");
+ return -EIO;
+ }
+
/* IN INTR_THRESHOLD is set to max(FFFFFFFF) which disable the IN INTR
* to raise
*/
@@ -388,7 +400,7 @@ otx2_vf_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no)
droq->pkts_sent_ism =
(uint32_t *)((uint8_t *)otx_ep->ism_buffer_mz->addr
+ OTX2_EP_OQ_ISM_OFFSET(oq_no));
- otx_ep_err("SDP_R[%d] OQ ISM virt: %p, dma: 0x%x", oq_no,
+ otx_ep_dbg("SDP_R[%d] OQ ISM virt: %p, dma: 0x%x", oq_no,
(void *)droq->pkts_sent_ism,
(unsigned int)ism_addr);
*droq->pkts_sent_ism = 0;
@@ -411,24 +423,8 @@ otx2_vf_setup_oq_regs(struct otx_ep_device *otx_ep, uint32_t oq_no)
static int
otx2_vf_enable_iq(struct otx_ep_device *otx_ep, uint32_t q_no)
{
- int loop = SDP_VF_BUSY_LOOP_COUNT;
uint64_t reg_val = 0ull;
- /* Resetting doorbells during IQ enabling also to handle abrupt
- * guest reboot. IQ reset does not clear the doorbells.
- */
- oct_ep_write64(0xFFFFFFFF, otx_ep->hw_addr + SDP_VF_R_IN_INSTR_DBELL(q_no));
-
- while (((oct_ep_read64(otx_ep->hw_addr +
- SDP_VF_R_IN_INSTR_DBELL(q_no))) != 0ull) && loop--) {
- rte_delay_ms(1);
- }
-
- if (loop < 0) {
- otx_ep_err("INSTR DBELL not coming back to 0");
- return -EIO;
- }
-
reg_val = oct_ep_read64(otx_ep->hw_addr + SDP_VF_R_IN_ENABLE(q_no));
reg_val |= 0x1ull;
diff --git a/drivers/net/octeon_ep/otx_ep_common.h b/drivers/net/octeon_ep/otx_ep_common.h
index 938c51b35d..ccd4483058 100644
--- a/drivers/net/octeon_ep/otx_ep_common.h
+++ b/drivers/net/octeon_ep/otx_ep_common.h
@@ -579,6 +579,7 @@ int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no);
#define OTX_EP_CLEAR_ISIZE_BSIZE 0x7FFFFFULL
#define OTX_EP_CLEAR_OUT_INT_LVLS 0x3FFFFFFFFFFFFFULL
#define OTX_EP_CLEAR_IN_INT_LVLS 0xFFFFFFFF
+#define OTX_EP_CLEAR_INSTR_DBELL 0xFFFFFFFF
#define OTX_EP_CLEAR_SDP_IN_INT_LVLS 0x3FFFFFFFFFFFFFUL
#define OTX_EP_DROQ_BUFSZ_MASK 0xFFFF
#define OTX_EP_CLEAR_SLIST_DBELL 0xFFFFFFFF
diff --git a/drivers/net/octeon_ep/otx_ep_ethdev.c b/drivers/net/octeon_ep/otx_ep_ethdev.c
index c0298a56ac..51e3ed6576 100644
--- a/drivers/net/octeon_ep/otx_ep_ethdev.c
+++ b/drivers/net/octeon_ep/otx_ep_ethdev.c
@@ -177,6 +177,12 @@ otx_ep_dev_start(struct rte_eth_dev *eth_dev)
int ret;
otx_epvf = (struct otx_ep_device *)OTX_EP_DEV(eth_dev);
+
+ for (q = 0; q < otx_epvf->nb_rx_queues; q++) {
+ cnxk_ep_drain_rx_pkts(otx_epvf->droq[q]);
+ otx_epvf->fn_list.setup_oq_regs(otx_epvf, q);
+ }
+
/* Enable IQ/OQ for this device */
ret = otx_epvf->fn_list.enable_io_queues(otx_epvf);
if (ret) {
diff --git a/drivers/net/octeon_ep/otx_ep_rxtx.h b/drivers/net/octeon_ep/otx_ep_rxtx.h
index cb68ef3b41..9a63974094 100644
--- a/drivers/net/octeon_ep/otx_ep_rxtx.h
+++ b/drivers/net/octeon_ep/otx_ep_rxtx.h
@@ -30,6 +30,9 @@ otx_ep_incr_index(uint32_t index, uint32_t count, uint32_t max)
return ((index + count) & (max - 1));
}
+void
+cnxk_ep_drain_rx_pkts(void *rx_queue);
+
uint16_t
otx_ep_xmit_pkts(void *tx_queue, struct rte_mbuf **pkts, uint16_t nb_pkts);
--
2.43.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2025-12-21 16:54:19.501857701 +0200
+++ 0043-net-octeon_ep-fix-device-start.patch 2025-12-21 16:54:17.062099000 +0200
@@ -1 +1 @@
-From c892964faa605c7884b454b435c4fb663dff0c9e Mon Sep 17 00:00:00 2001
+From 6170c4e649b34c6ea40cb3eecd4b3b882084f444 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit c892964faa605c7884b454b435c4fb663dff0c9e ]
+
@@ -15 +16,0 @@
-Cc: stable at dpdk.org
@@ -28 +29 @@
-index a10e9c536e..9678cec90b 100644
+index 74f0011283..41b369bd6b 100644
@@ -31 +32 @@
-@@ -151,3 +151,43 @@ cn9k_ep_recv_pkts_mseg(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pk
+@@ -307,3 +307,43 @@ cn9k_ep_recv_pkts_mseg(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pk
@@ -76 +77 @@
-index ca84cac962..a1d9f65f38 100644
+index 74b63a161f..6e56cb3a73 100644
@@ -100 +101 @@
- (uint32_t __rte_atomic *)((uint8_t *)otx_ep->ism_buffer_mz->addr
+ (uint32_t *)((uint8_t *)otx_ep->ism_buffer_mz->addr
@@ -103,3 +104,3 @@
-- oq_no, (void *)(uintptr_t)droq->pkts_sent_ism, ism_addr);
-+ otx_ep_dbg("SDP_R[%d] OQ ISM virt: %p dma: 0x%" PRIX64, oq_no,
-+ (void *)(uintptr_t)droq->pkts_sent_ism, ism_addr);
+- oq_no, (void *)droq->pkts_sent_ism, ism_addr);
++ otx_ep_err("SDP_R[%d] OQ ISM virt: %p dma: 0x%" PRIX64, oq_no,
++ (void *)(uintptr_t)droq->pkts_sent_ism, ism_addr);
@@ -107 +108 @@
- droq->pkts_sent_prev = 0;
+ droq->pkts_sent_ism_prev = 0;
@@ -135 +136 @@
-index a482f4266e..00f723a5a8 100644
+index fdab542246..203933c7d2 100644
@@ -159 +160 @@
- (uint32_t __rte_atomic *)((uint8_t *)otx_ep->ism_buffer_mz->addr
+ (uint32_t *)((uint8_t *)otx_ep->ism_buffer_mz->addr
@@ -163 +164 @@
- (void *)(uintptr_t)droq->pkts_sent_ism,
+ (void *)droq->pkts_sent_ism,
@@ -192 +193 @@
-index 122926cd40..53de8b18d6 100644
+index 938c51b35d..ccd4483058 100644
@@ -195 +196 @@
-@@ -589,6 +589,7 @@ int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no);
+@@ -579,6 +579,7 @@ int otx_ep_delete_oqs(struct otx_ep_device *otx_ep, uint32_t oq_no);
@@ -204 +205 @@
-index 10f2f8a2e0..cd8e4bad3b 100644
+index c0298a56ac..51e3ed6576 100644
@@ -207 +208 @@
-@@ -232,6 +232,12 @@ otx_ep_dev_start(struct rte_eth_dev *eth_dev)
+@@ -177,6 +177,12 @@ otx_ep_dev_start(struct rte_eth_dev *eth_dev)
@@ -221 +222 @@
-index 6b3abe21b1..384e4fb412 100644
+index cb68ef3b41..9a63974094 100644
@@ -224 +225 @@
-@@ -32,6 +32,9 @@ otx_ep_incr_index(uint32_t index, uint32_t count, uint32_t max)
+@@ -30,6 +30,9 @@ otx_ep_incr_index(uint32_t index, uint32_t count, uint32_t max)
More information about the stable
mailing list