diff options
| author | Markus Stockhausen | 2025-09-12 11:14:25 +0000 |
|---|---|---|
| committer | Robert Marko | 2025-09-17 17:22:37 +0000 |
| commit | 60bdae3ab3f82c4968445a88275e53e3e6991bc2 (patch) | |
| tree | 0bbec374045e684de9c0dd1a6cdfa83156a3040e | |
| parent | 532c51c15a3277b8375321a7588f12da06689d52 (diff) | |
| download | openwrt-60bdae3ab3f82c4968445a88275e53e3e6991bc2.tar.gz | |
realtek: ethernet: drop open coding
There is some open coding in the ethernet driver. Drop
that and use kernel helpers instead.
- Use napi_gro_receive() instead of local skb list
- Use skb_put_data() instead of skb_put() plus memcpy()
- Use netdev_alloc_skb_ip_align() instead of manual alignment
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/20030
Signed-off-by: Robert Marko <robimarko@gmail.com>
| -rw-r--r-- | target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c b/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c index eb7bdcfc95..4b9ea3be68 100644 --- a/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c +++ b/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c @@ -1159,7 +1159,6 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) { struct rtl838x_eth_priv *priv = netdev_priv(dev); struct ring_b *ring = priv->membase; - LIST_HEAD(rx_list); unsigned long flags; int work_done = 0; u32 *last; @@ -1173,7 +1172,6 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) struct sk_buff *skb; struct dsa_tag tag; struct p_hdr *h; - u8 *skb_data; u8 *data; int len; @@ -1197,9 +1195,7 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) if (dsa) len += 4; - skb = netdev_alloc_skb(dev, len + 4); - skb_reserve(skb, NET_IP_ALIGN); - + skb = netdev_alloc_skb_ip_align(dev, len); if (likely(skb)) { /* BUG: Prevent bug on RTL838x SoCs */ if (priv->family_id == RTL8380_FAMILY_ID) { @@ -1213,10 +1209,9 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) } } - skb_data = skb_put(skb, len); /* Make sure data is visible */ mb(); - memcpy(skb->data, (u8 *)KSEG1ADDR(data), len); + skb_put_data(skb, (u8 *)KSEG1ADDR(data), len); /* Overwrite CRC with cpu_tag */ if (dsa) { priv->r->decode_tag(h, &tag); @@ -1242,7 +1237,7 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) dev->stats.rx_packets++; dev->stats.rx_bytes += len; - list_add_tail(&skb->list, &rx_list); + napi_gro_receive(&priv->rx_qs[r].napi, skb); } else { if (net_ratelimit()) dev_warn(&dev->dev, "low on memory - packet dropped\n"); @@ -1261,8 +1256,6 @@ static int rtl838x_hw_receive(struct net_device *dev, int r, int budget) last = (u32 *)KSEG1ADDR(sw_r32(priv->r->dma_if_rx_cur + r * 4)); } while (&ring->rx_r[r][ring->c_rx[r]] != last && work_done < budget); - netif_receive_skb_list(&rx_list); - /* Update counters */ priv->r->update_cntr(r, work_done); |