[PATCH net v4 5/7] net: stmmac: dwmac4: Use the correct bufzise when the len is exactly 8K
Nicolai Buchwitz
nb at tipi-net.de
Fri Sep 18 05:25:16 PDT 2026
Hi Maxime
On 17.9.2026 23:53, Maxime Chevallier wrote:
> DMA bufsize selection isn't made on the MTU but the actual frame
> length,
> so including the L2 header. On DWMAC4, if the len is exactly
> BUF_SIZE_8KiB,
> the next larger size is incorrectly selected.
>
> Lets fix the comparison and while at it, rename the parameter from len
> to mtu.
Isn't it "[...] from mtu to len"?
>
> Fixes: c3efed5ad1b0 ("net: stmmac: Enable dwmac4 jumbo frame more than
> 8KiB").
> Signed-off-by: Maxime Chevallier <maxime.chevallier at bootlin.com>
> ---
> drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c | 4 ++--
> drivers/net/ethernet/stmicro/stmmac/hwif.h | 2 +-
> drivers/net/ethernet/stmicro/stmmac/ring_mode.c | 4 ++--
> 3 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
> b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
> index 2994df41ec2c..c6a8f8d73501 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
> @@ -474,11 +474,11 @@ static void dwmac4_set_sarc(struct dma_desc *p,
> u32 sarc_type)
> sarc_type));
> }
>
> -static int set_16kib_bfsize(int mtu)
> +static int set_16kib_bfsize(int len)
> {
> int ret = 0;
>
> - if (unlikely(mtu >= BUF_SIZE_8KiB))
> + if (unlikely(len > BUF_SIZE_8KiB))
Should we drop set_16kib_bfsize() instead?
After 6/7 it looks to me like the same test as the first branch of
stmmac_set_bfsize(). The caller ends up there anyway when it returns 0
and chain_mode_ops doesn't have it at all.
> ret = BUF_SIZE_16KiB;
> return ret;
> }
> diff --git a/drivers/net/ethernet/stmicro/stmmac/hwif.h
> b/drivers/net/ethernet/stmicro/stmmac/hwif.h
> index 04dafec021b4..de7aa6d28148 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/hwif.h
> +++ b/drivers/net/ethernet/stmicro/stmmac/hwif.h
> @@ -540,7 +540,7 @@ struct stmmac_mode_ops {
> bool (*is_jumbo_frm)(unsigned int len, bool enh_desc);
> int (*jumbo_frm)(struct stmmac_tx_queue *tx_q, struct sk_buff *skb,
> int csum);
> - int (*set_16kib_bfsize)(int mtu);
> + int (*set_16kib_bfsize)(int len);
> void (*init_desc3)(struct dma_desc *p);
> void (*refill_desc3)(struct stmmac_rx_queue *rx_q, struct dma_desc
> *p);
> void (*clean_desc3)(struct stmmac_tx_queue *tx_q, struct dma_desc
> *p);
> diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> index f7949419eb9f..d2f0c321661d 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> @@ -124,10 +124,10 @@ static void clean_desc3(struct stmmac_tx_queue
> *tx_q, struct dma_desc *p)
> p->des3 = 0;
> }
>
> -static int set_16kib_bfsize(int mtu)
> +static int set_16kib_bfsize(int len)
> {
> int ret = 0;
> - if (unlikely(mtu > BUF_SIZE_8KiB))
> + if (unlikely(len > BUF_SIZE_8KiB))
> ret = BUF_SIZE_16KiB;
> return ret;
> }
regards
Nicolai
More information about the linux-arm-kernel
mailing list