From b260447daeda0006be32eb58098a4f821f4de712 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Tue, 3 Mar 2026 17:24:18 +0800 Subject: [PATCH 1/4] net: spacemit: Remove unused buff_addr fields These were never used. Just remove them. Fixes: bfec6d7f2001 ("net: spacemit: Add K1 Ethernet MAC") Signed-off-by: Vivian Wang Signed-off-by: Linux RISC-V bot --- drivers/net/ethernet/spacemit/k1_emac.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/net/ethernet/spacemit/k1_emac.c b/drivers/net/ethernet/spacemit/k1_emac.c index dab0772c5b9d41..6f54dc1a37fd6d 100644 --- a/drivers/net/ethernet/spacemit/k1_emac.c +++ b/drivers/net/ethernet/spacemit/k1_emac.c @@ -57,7 +57,6 @@ struct desc_buf { u64 dma_addr; - void *buff_addr; u16 dma_len; u8 map_as_page; }; @@ -70,7 +69,6 @@ struct emac_tx_desc_buffer { struct emac_rx_desc_buffer { struct sk_buff *skb; u64 dma_addr; - void *buff_addr; u16 dma_len; u8 map_as_page; }; @@ -340,7 +338,6 @@ static void emac_free_tx_buf(struct emac_priv *priv, int i) buf->dma_addr = 0; buf->map_as_page = false; - buf->buff_addr = NULL; } if (tx_buf->skb) { From 1d4937ffa2142821aea3351b7908e12e54e48590 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Tue, 3 Mar 2026 17:24:19 +0800 Subject: [PATCH 2/4] net: spacemit: Fix error handling in emac_alloc_rx_desc_buffers() Even if we get a dma_mapping_error() while mapping an RX buffer, we should still update rx_ring->head to ensure that the buffers we were able to allocate and map are used. Fix this by breaking out to the existing code after the loop, analogous to the existing handling for skb allocation failure. Fixes: bfec6d7f2001 ("net: spacemit: Add K1 Ethernet MAC") Signed-off-by: Vivian Wang Signed-off-by: Linux RISC-V bot --- drivers/net/ethernet/spacemit/k1_emac.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/spacemit/k1_emac.c b/drivers/net/ethernet/spacemit/k1_emac.c index 6f54dc1a37fd6d..4a4d6ffdc08f54 100644 --- a/drivers/net/ethernet/spacemit/k1_emac.c +++ b/drivers/net/ethernet/spacemit/k1_emac.c @@ -564,7 +564,9 @@ static void emac_alloc_rx_desc_buffers(struct emac_priv *priv) DMA_FROM_DEVICE); if (dma_mapping_error(&priv->pdev->dev, rx_buf->dma_addr)) { dev_err_ratelimited(&ndev->dev, "Mapping skb failed\n"); - goto err_free_skb; + dev_kfree_skb_any(skb); + rx_buf->skb = NULL; + break; } rx_desc_addr = &((struct emac_desc *)rx_ring->desc_addr)[i]; @@ -589,10 +591,6 @@ static void emac_alloc_rx_desc_buffers(struct emac_priv *priv) rx_ring->head = i; return; - -err_free_skb: - dev_kfree_skb_any(skb); - rx_buf->skb = NULL; } /* Returns number of packets received */ From 53d61791d71dc5be428d97c97d5f963d3cc344d6 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Tue, 3 Mar 2026 17:24:20 +0800 Subject: [PATCH 3/4] net: spacemit: Fix error handling in emac_tx_mem_map() The DMA mappings were leaked on mapping error. Free them with the existing emac_free_tx_buf() function. Fixes: bfec6d7f2001 ("net: spacemit: Add K1 Ethernet MAC") Signed-off-by: Vivian Wang Signed-off-by: Linux RISC-V bot --- drivers/net/ethernet/spacemit/k1_emac.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/spacemit/k1_emac.c b/drivers/net/ethernet/spacemit/k1_emac.c index 4a4d6ffdc08f54..3413cd7d6a8701 100644 --- a/drivers/net/ethernet/spacemit/k1_emac.c +++ b/drivers/net/ethernet/spacemit/k1_emac.c @@ -732,7 +732,7 @@ static void emac_tx_mem_map(struct emac_priv *priv, struct sk_buff *skb) struct emac_desc tx_desc, *tx_desc_addr; struct device *dev = &priv->pdev->dev; struct emac_tx_desc_buffer *tx_buf; - u32 head, old_head, frag_num, f; + u32 head, old_head, frag_num, f, i; bool buf_idx; frag_num = skb_shinfo(skb)->nr_frags; @@ -800,6 +800,15 @@ static void emac_tx_mem_map(struct emac_priv *priv, struct sk_buff *skb) err_free_skb: dev_dstats_tx_dropped(priv->ndev); + + i = old_head; + while (i != head) { + emac_free_tx_buf(priv, i); + + if (++i == tx_ring->total_cnt) + i = 0; + } + dev_kfree_skb_any(skb); } From fc01e60d60967850bc51b080b1c316b780589ea7 Mon Sep 17 00:00:00 2001 From: Vivian Wang Date: Tue, 3 Mar 2026 17:24:21 +0800 Subject: [PATCH 4/4] net: spacemit: Free rings of memory after unmapping DMA In emac_free_{tx,rx}_resources, call dma_free_coherent() to unmap DMA before calling kfree() to deallocate the memory, instead of the other way around. Fixes: bfec6d7f2001 ("net: spacemit: Add K1 Ethernet MAC") Signed-off-by: Vivian Wang Signed-off-by: Linux RISC-V bot --- drivers/net/ethernet/spacemit/k1_emac.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/spacemit/k1_emac.c b/drivers/net/ethernet/spacemit/k1_emac.c index 3413cd7d6a8701..29efd2eb6ecf66 100644 --- a/drivers/net/ethernet/spacemit/k1_emac.c +++ b/drivers/net/ethernet/spacemit/k1_emac.c @@ -448,12 +448,12 @@ static void emac_free_tx_resources(struct emac_priv *priv) emac_clean_tx_desc_ring(priv); - kfree(tr->tx_desc_buf); - tr->tx_desc_buf = NULL; - dma_free_coherent(dev, tr->total_size, tr->desc_addr, tr->desc_dma_addr); tr->desc_addr = NULL; + + kfree(tr->tx_desc_buf); + tr->tx_desc_buf = NULL; } static void emac_free_rx_resources(struct emac_priv *priv) @@ -463,12 +463,12 @@ static void emac_free_rx_resources(struct emac_priv *priv) emac_clean_rx_desc_ring(priv); - kfree(rr->rx_desc_buf); - rr->rx_desc_buf = NULL; - dma_free_coherent(dev, rr->total_size, rr->desc_addr, rr->desc_dma_addr); rr->desc_addr = NULL; + + kfree(rr->rx_desc_buf); + rr->rx_desc_buf = NULL; } static int emac_tx_clean_desc(struct emac_priv *priv)