]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: eth: move page/pool into driver structure
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Tue, 21 Jul 2026 11:00:41 +0000 (13:00 +0200)
committerMarkus Stockhausen <markus.stockhausen@gmx.de>
Tue, 21 Jul 2026 19:02:00 +0000 (21:02 +0200)
The paged pool handling is only required for the driver and not
for the SOC. Move it into the driver-specific part.

Link: https://github.com/openwrt/openwrt/pull/24346
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
target/linux/realtek/files-6.18/drivers/net/ethernet/rtl838x_eth.c

index e1b5861f9cce79756e0e7f2365a8dc81ede34a93..78b66ec33ce4185dd9bc9130ba0d70fc9898e9ab 100644 (file)
@@ -65,8 +65,6 @@ struct rteth_packet {
        u16                     cpu_tag[10];
        /* software mangement and data part */
        struct sk_buff          *skb;
-       struct page             *page;
-       unsigned int            page_offset;
 } __packed __aligned(1);
 
 /* SOC/driver shared coherent ring descriptors */
@@ -88,6 +86,8 @@ struct rteth_rx_info {
        struct napi_struct      napi;
        struct page_pool        *pool;
        struct sk_buff          *skb; /* unprocessed SKB from last receive loop */
+       struct page             *page[RTETH_RX_RING_SIZE];
+       unsigned int            offset[RTETH_RX_RING_SIZE];
 };
 
 struct rteth_tx_info {
@@ -661,18 +661,18 @@ static void rteth_free_tx_buffers(struct rteth_ctrl *ctrl)
 
 static void rteth_free_rx_buffers(struct rteth_ctrl *ctrl)
 {
-       struct rteth_packet *packet;
+       struct rteth_rx_info *rx_info;
 
        for (int r = 0; r < RTETH_RX_RINGS; r++) {
+               rx_info = &ctrl->rx_info[r];
                for (int i = 0; i < RTETH_RX_RING_SIZE; i++) {
-                       packet = &ctrl->rx_data[r].packet[i];
-                       if (!packet->page)
+                       if (!rx_info->page[i])
                                continue;
 
-                       page_pool_put_full_page(ctrl->rx_info[r].pool, packet->page, true);
-                       packet->page = NULL;
+                       page_pool_put_full_page(rx_info->pool, rx_info->page[i], true);
+                       rx_info->page[i] = NULL;
                }
-               rteth_free_skb(&ctrl->rx_info[r].skb);
+               rteth_free_skb(&rx_info->skb);
        }
 }
 
@@ -710,8 +710,8 @@ static int rteth_setup_ring_buffer(struct rteth_ctrl *ctrl)
                        packet->size = SKB_FRAG_SIZE;
                        packet->dma = page_pool_get_dma_addr(page)
                                    + ctrl->r->skb_headroom + offset;
-                       packet->page = page;
-                       packet->page_offset = offset;
+                       ctrl->rx_info[r].page[i] = page;
+                       ctrl->rx_info[r].offset[i] = offset;
                        ctrl->rx_data[r].ring[i] = ctrl->rx_dma +
                                                   sizeof(struct rteth_rx_data) * r +
                                                   offsetof(struct rteth_rx_data, packet) +
@@ -1130,10 +1130,10 @@ static int rteth_start_xmit(struct sk_buff *skb, struct net_device *dev)
 static struct sk_buff *rteth_create_skb(struct rteth_ctrl *ctrl, int ring, int slot)
 {
        struct rteth_packet *packet = &ctrl->rx_data[ring].packet[slot];
+       unsigned int offset = ctrl->rx_info[ring].offset[slot];
+       struct page *page = ctrl->rx_info[ring].page[slot];
        struct page_pool *pool = ctrl->rx_info[ring].pool;
-       unsigned int offset = packet->page_offset;
        struct net_device *dev = ctrl->dev;
-       struct page *page = packet->page;
        unsigned int len = packet->len;
        struct sk_buff *skb;
        struct dsa_tag tag;
@@ -1170,14 +1170,14 @@ static struct sk_buff *rteth_create_skb(struct rteth_ctrl *ctrl, int ring, int s
 static int rteth_append_skb(struct sk_buff *skb, struct rteth_ctrl *ctrl, int ring, int slot)
 {
        struct rteth_packet *packet = &ctrl->rx_data[ring].packet[slot];
+       unsigned int offset = ctrl->rx_info[ring].offset[slot];
+       struct page *page = ctrl->rx_info[ring].page[slot];
        unsigned int nr_frags = skb_shinfo(skb)->nr_frags;
        struct page_pool *pool = ctrl->rx_info[ring].pool;
-       unsigned int offset = packet->page_offset;
-       struct page *page = packet->page;
        unsigned int len = packet->len;
 
        if (nr_frags >= MAX_SKB_FRAGS) {
-               page_pool_put_full_page(pool, packet->page, true);
+               page_pool_put_full_page(pool, page, true);
                return -ENOMEM;
        }
 
@@ -1265,8 +1265,8 @@ static int rteth_hw_receive(struct net_device *dev, int ring, int budget)
                        }
                }
 
-               packet->page = new_page;
-               packet->page_offset = new_offset;
+               ctrl->rx_info[ring].page[slot] = new_page;
+               ctrl->rx_info[ring].offset[slot] = new_offset;
                packet->dma = page_pool_get_dma_addr(new_page)
                            + new_offset + ctrl->r->skb_headroom;
 recycle: