[PATCH net-next 3/4] eth: mpnic: set Rx buffer minimums using page size and mtu

From: Daniel Zahka

Date: Thu Oct 01 2026 - 13:29:59 EST


Set buffer based drop thresholds in the Rx path based on page size and
the max MTU supported. The device will drop packets if it does not have
at least the minimum number of completely unused buffer descriptors
available.

These thresholds are currently set to 17 BDs for both HPQ and PPQ. These
are overly conservative. With our current max MTU of 9742B, the settings
we should target are:

4KiB page size: 1 HPQ, 3 PPQ
64KiB page size: 1 HPQ, 1 PPQ

The HPQ and PPQ rings are always given PAGE_SIZE sized buffers.

The RDE_CTL register encodes the thresholds as one less than the number
of BDs needed.

Signed-off-by: Daniel Zahka <daniel.zahka@xxxxxxxxx>
---
drivers/net/ethernet/meta/mpnic/mpnic_init.c | 13 +++++++++----
drivers/net/ethernet/meta/mpnic/mpnic_txrx.h | 6 ++++++
2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_init.c b/drivers/net/ethernet/meta/mpnic/mpnic_init.c
index 2daed458f5fc..ace4124158fb 100644
--- a/drivers/net/ethernet/meta/mpnic/mpnic_init.c
+++ b/drivers/net/ethernet/meta/mpnic/mpnic_init.c
@@ -10,6 +10,7 @@
#include <linux/sizes.h>

#include "mpnic.h"
+#include "mpnic_txrx.h"

#define MPNIC_MEM_INIT_POLL_US 500
#define MPNIC_MEM_INIT_TO_US 5000
@@ -272,10 +273,14 @@ static void mpnic_rxglb_init(struct mpnic_dev *mpd)
* the per-queue prefetch FIFO.
*/
mpnic_wr64(mpd, MPNIC_RDE_CTL,
- FIELD_PREP(MPNIC_RDE_CTL_HPQ_DROP_THRESHOLD, 16) |
- FIELD_PREP(MPNIC_RDE_CTL_PPQ_DROP_THRESHOLD, 16) |
- FIELD_PREP(MPNIC_RDE_CTL_HPQ_LOCAL_DROP_THRESHOLD, 16) |
- FIELD_PREP(MPNIC_RDE_CTL_PPQ_LOCAL_DROP_THRESHOLD, 16));
+ FIELD_PREP(MPNIC_RDE_CTL_HPQ_DROP_THRESHOLD,
+ MPNIC_RX_HPQ_DROP_THRS - 1) |
+ FIELD_PREP(MPNIC_RDE_CTL_PPQ_DROP_THRESHOLD,
+ MPNIC_RX_PPQ_DROP_THRS - 1) |
+ FIELD_PREP(MPNIC_RDE_CTL_HPQ_LOCAL_DROP_THRESHOLD,
+ MPNIC_RX_HPQ_DROP_THRS - 1) |
+ FIELD_PREP(MPNIC_RDE_CTL_PPQ_LOCAL_DROP_THRESHOLD,
+ MPNIC_RX_PPQ_DROP_THRS - 1));

/* Receive side coalescing is not supported yet */
mpnic_wr64(mpd, MPNIC_RSC_GLOBAL_CONF,
diff --git a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
index 834eb9bfffd1..9397010557eb 100644
--- a/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
+++ b/drivers/net/ethernet/meta/mpnic/mpnic_txrx.h
@@ -58,6 +58,12 @@ struct mpnic_net;

#define MPNIC_MAX_JUMBO_FRAME_SIZE 9742

+#define MPNIC_RX_HPQ_DROP_THRS \
+ DIV_ROUND_UP(MPNIC_RX_HROOM + MPNIC_RX_MAX_HDR + MPNIC_RX_TROOM, \
+ PAGE_SIZE)
+#define MPNIC_RX_PPQ_DROP_THRS \
+ DIV_ROUND_UP(MPNIC_MAX_JUMBO_FRAME_SIZE, PAGE_SIZE)
+
/* The page a buffer descriptor queue is currently handing out. Records
* how many of the references taken on it are still unused.
*/

--
2.52.0