Re: [PATCH] net: stmmac: use dma_addr_t for DMA addresses

Maxime Chevallier <[email protected]>
Newsgroups org.kernel.vger.netdev,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
Hi Alex,

On 8/11/26 21:27, Alex Elder wrote:
> In jumbo_frm() (implemented in both "chain_mode.c" and "ring_mode.c"),
> an unsigned integer local variable is used to hold the value returned
> by dma_map_single().  On systems where a dma_addr_t is 64 bits, the
> subsequent dma_mapping_error() check of the returned value operates
> only on the low 32 bits (whose high bit won't be sign-extended).  In
> this case, dma_mapping_error() would return 0 (no error) even if there
> were one.
> 
> Fix this in both spots by using a dma_addr_t for the local variable.

Thanks :)

I was wondering if it would silently hides another address size related
issue a little bit lower, as we now have :

  dma_addr_t des2;

  des2 = dma_map_single(...);

  desc->des2 = cpu_to_le32(des2);

desc->des2 is __le32, so for 64 bit addresses we silently truncate the
address.

However I don't see how jumbo would work on 64-bits anyways as des3 is the next
chunk of the jumbo frame...

I think this is good as-is, so

Reviewed-by: Maxime Chevallier <[email protected]>

Maxime

> 
> Reported-by: Sashiko <[email protected]>
> Link: https://lore.kernel.org/linux-devicetree/[email protected]/
> Signed-off-by: Alex Elder <[email protected]>
> ---
>  drivers/net/ethernet/stmicro/stmmac/chain_mode.c | 3 ++-
>  drivers/net/ethernet/stmicro/stmmac/ring_mode.c  | 3 ++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c
> index fc04a23342cfc..ec25193d287bb 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/chain_mode.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/chain_mode.c
> @@ -20,9 +20,10 @@ static int jumbo_frm(struct stmmac_tx_queue *tx_q, struct sk_buff *skb,
>  	unsigned int nopaged_len = skb_headlen(skb);
>  	struct stmmac_priv *priv = tx_q->priv_data;
>  	unsigned int entry = tx_q->cur_tx;
> -	unsigned int bmax, buf_len, des2;
> +	unsigned int bmax, buf_len;
>  	unsigned int i = 1, len;
>  	struct dma_desc *desc;
> +	dma_addr_t des2;
>  
>  	desc = tx_q->dma_tx + entry;
>  
> diff --git a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> index 78fc6aa5bbe95..664d8cfb58cdc 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/ring_mode.c
> @@ -20,8 +20,9 @@ static int jumbo_frm(struct stmmac_tx_queue *tx_q, struct sk_buff *skb,
>  	unsigned int nopaged_len = skb_headlen(skb);
>  	struct stmmac_priv *priv = tx_q->priv_data;
>  	unsigned int entry = tx_q->cur_tx;
> -	unsigned int bmax, len, des2;
> +	unsigned int bmax, len;
>  	struct dma_desc *desc;
> +	dma_addr_t des2;
>  
>  	if (priv->extend_desc)
>  		desc = (struct dma_desc *)(tx_q->dma_etx + entry);
> 
> base-commit: 31397cf1819210bd63fa3d2c7d8c24f7c8667d99
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.