From 79d3db74473cc831201a6ea1ce59399d0ea8dbf8 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 5 Sep 2025 18:18:54 +0200 Subject: [PATCH] Revert "kernel: improve mtk_eth_soc performance" This reverts commit 3e6d5be3d938383507631a9f20905747fe9d728a, until stability issues have been figured out. Signed-off-by: Felix Fietkau --- ..._eth_soc-add-hw-dump-for-forced-rese.patch | 12 +- ..._eth_soc-add-hw-dump-for-forced-rese.patch | 12 +- ...rnet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch | 21 + ..._eth_soc-optimize-dma-ring-address-i.patch | 542 ------------------ ...mtk_eth_soc-shrink-struct-mtk_tx_buf.patch | 124 ---- ..._eth_soc-add-support-for-sending-fra.patch | 509 ---------------- ...ernet-mtk_eth_soc-use-napi_build_skb.patch | 4 +- ...-mediatek-enlarge-DMA-reserve-buffer.patch | 4 +- ..._eth_soc-add-paths-and-SerDes-modes-.patch | 72 +-- ...th_soc-reduce-rx-ring-size-for-older.patch | 26 +- ..._eth_soc-do-not-enable-page-pool-sta.patch | 4 +- ..._eth_soc-fix-tx-vlan-tag-for-llc-pac.patch | 4 +- ...rnet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch | 21 + ..._eth_soc-optimize-dma-ring-address-i.patch | 542 ------------------ ...mtk_eth_soc-shrink-struct-mtk_tx_buf.patch | 124 ---- ..._eth_soc-add-support-for-sending-fra.patch | 303 ---------- ...ernet-mtk_eth_soc-use-napi_build_skb.patch | 4 +- ...-mediatek-enlarge-DMA-reserve-buffer.patch | 4 +- ..._eth_soc-add-paths-and-SerDes-modes-.patch | 76 +-- ...th_soc-reduce-rx-ring-size-for-older.patch | 26 +- ..._eth_soc-do-not-enable-page-pool-sta.patch | 4 +- ..._eth_soc-fix-tx-vlan-tag-for-llc-pac.patch | 4 +- 22 files changed, 170 insertions(+), 2272 deletions(-) create mode 100644 target/linux/generic/pending-6.12/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch delete mode 100644 target/linux/generic/pending-6.12/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch delete mode 100644 target/linux/generic/pending-6.12/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch delete mode 100644 target/linux/generic/pending-6.12/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch create mode 100644 target/linux/generic/pending-6.6/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch delete mode 100644 target/linux/generic/pending-6.6/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch delete mode 100644 target/linux/generic/pending-6.6/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch delete mode 100644 target/linux/generic/pending-6.6/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch diff --git a/target/linux/generic/hack-6.12/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch b/target/linux/generic/hack-6.12/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch index 62a600caf3e..ffc21ee2ff7 100644 --- a/target/linux/generic/hack-6.12/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch +++ b/target/linux/generic/hack-6.12/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch @@ -13,7 +13,7 @@ Signed-off-by: Bo-Cun Chen --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -74,6 +74,7 @@ static const struct mtk_reg_map mtk_reg_ +@@ -66,6 +66,7 @@ static const struct mtk_reg_map mtk_reg_ .rx_ptr = 0x1900, .rx_cnt_cfg = 0x1904, .qcrx_ptr = 0x1908, @@ -21,7 +21,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x1a04, .rst_idx = 0x1a08, .delay_irq = 0x1a0c, -@@ -140,6 +141,7 @@ static const struct mtk_reg_map mt7986_r +@@ -132,6 +133,7 @@ static const struct mtk_reg_map mt7986_r .rx_ptr = 0x4500, .rx_cnt_cfg = 0x4504, .qcrx_ptr = 0x4508, @@ -29,7 +29,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x4604, .rst_idx = 0x4608, .delay_irq = 0x460c, -@@ -191,6 +193,7 @@ static const struct mtk_reg_map mt7988_r +@@ -183,6 +185,7 @@ static const struct mtk_reg_map mt7988_r .rx_ptr = 0x4500, .rx_cnt_cfg = 0x4504, .qcrx_ptr = 0x4508, @@ -37,7 +37,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x4604, .rst_idx = 0x4608, .delay_irq = 0x460c, -@@ -4061,6 +4064,56 @@ static void mtk_set_mcr_max_rx(struct mt +@@ -3909,6 +3912,56 @@ static void mtk_set_mcr_max_rx(struct mt mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); } @@ -94,7 +94,7 @@ Signed-off-by: Bo-Cun Chen static void mtk_hw_reset(struct mtk_eth *eth) { u32 val; -@@ -4540,6 +4593,8 @@ static void mtk_pending_work(struct work +@@ -4388,6 +4441,8 @@ static void mtk_pending_work(struct work rtnl_lock(); set_bit(MTK_RESETTING, ð->state); @@ -105,7 +105,7 @@ Signed-off-by: Bo-Cun Chen /* Run again reset preliminary configuration in order to avoid any --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -1185,6 +1185,7 @@ struct mtk_reg_map { +@@ -1191,6 +1191,7 @@ struct mtk_reg_map { u32 rx_ptr; /* rx base pointer */ u32 rx_cnt_cfg; /* rx max count configuration */ u32 qcrx_ptr; /* rx cpu pointer */ diff --git a/target/linux/generic/hack-6.6/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch b/target/linux/generic/hack-6.6/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch index 4d8a770bad7..25d824bce67 100644 --- a/target/linux/generic/hack-6.6/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch +++ b/target/linux/generic/hack-6.6/730-net-ethernet-mtk_eth_soc-add-hw-dump-for-forced-rese.patch @@ -13,7 +13,7 @@ Signed-off-by: Bo-Cun Chen --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -71,6 +71,7 @@ static const struct mtk_reg_map mtk_reg_ +@@ -66,6 +66,7 @@ static const struct mtk_reg_map mtk_reg_ .rx_ptr = 0x1900, .rx_cnt_cfg = 0x1904, .qcrx_ptr = 0x1908, @@ -21,7 +21,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x1a04, .rst_idx = 0x1a08, .delay_irq = 0x1a0c, -@@ -137,6 +138,7 @@ static const struct mtk_reg_map mt7986_r +@@ -132,6 +133,7 @@ static const struct mtk_reg_map mt7986_r .rx_ptr = 0x4500, .rx_cnt_cfg = 0x4504, .qcrx_ptr = 0x4508, @@ -29,7 +29,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x4604, .rst_idx = 0x4608, .delay_irq = 0x460c, -@@ -188,6 +190,7 @@ static const struct mtk_reg_map mt7988_r +@@ -183,6 +185,7 @@ static const struct mtk_reg_map mt7988_r .rx_ptr = 0x4500, .rx_cnt_cfg = 0x4504, .qcrx_ptr = 0x4508, @@ -37,7 +37,7 @@ Signed-off-by: Bo-Cun Chen .glo_cfg = 0x4604, .rst_idx = 0x4608, .delay_irq = 0x460c, -@@ -3946,6 +3949,56 @@ static void mtk_set_mcr_max_rx(struct mt +@@ -3907,6 +3910,56 @@ static void mtk_set_mcr_max_rx(struct mt mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); } @@ -94,7 +94,7 @@ Signed-off-by: Bo-Cun Chen static void mtk_hw_reset(struct mtk_eth *eth) { u32 val; -@@ -4421,6 +4474,8 @@ static void mtk_pending_work(struct work +@@ -4382,6 +4435,8 @@ static void mtk_pending_work(struct work rtnl_lock(); set_bit(MTK_RESETTING, ð->state); @@ -105,7 +105,7 @@ Signed-off-by: Bo-Cun Chen /* Run again reset preliminary configuration in order to avoid any --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -1185,6 +1185,7 @@ struct mtk_reg_map { +@@ -1191,6 +1191,7 @@ struct mtk_reg_map { u32 rx_ptr; /* rx base pointer */ u32 rx_cnt_cfg; /* rx max count configuration */ u32 qcrx_ptr; /* rx cpu pointer */ diff --git a/target/linux/generic/pending-6.12/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch b/target/linux/generic/pending-6.12/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch new file mode 100644 index 00000000000..bd7a1b96f2a --- /dev/null +++ b/target/linux/generic/pending-6.12/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch @@ -0,0 +1,21 @@ +From: Felix Fietkau +Date: Fri, 28 Oct 2022 12:54:48 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: set NETIF_F_ALL_TSO + +Significantly improves performance by avoiding unnecessary segmentation + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -49,8 +49,7 @@ + #define MTK_HW_FEATURES (NETIF_F_IP_CSUM | \ + NETIF_F_RXCSUM | \ + NETIF_F_HW_VLAN_CTAG_TX | \ +- NETIF_F_SG | NETIF_F_TSO | \ +- NETIF_F_TSO6 | \ ++ NETIF_F_SG | NETIF_F_ALL_TSO | \ + NETIF_F_IPV6_CSUM |\ + NETIF_F_HW_TC) + #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) diff --git a/target/linux/generic/pending-6.12/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch b/target/linux/generic/pending-6.12/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch deleted file mode 100644 index a5b2266dcf1..00000000000 --- a/target/linux/generic/pending-6.12/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch +++ /dev/null @@ -1,542 +0,0 @@ -From: Felix Fietkau -Date: Tue, 15 Oct 2024 12:52:56 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: optimize dma ring address/index - calculation - -Since DMA descriptor sizes are all power of 2, we can avoid costly integer -division in favor or simple shifts. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -43,6 +43,11 @@ MODULE_PARM_DESC(msg_level, "Message lev - offsetof(struct mtk_hw_stats, xdp_stats.x) / \ - sizeof(u64) } - -+#define RX_DESC_OFS(eth, i) \ -+ ((i) << (eth)->soc->rx.desc_shift) -+#define TX_DESC_OFS(eth, i) \ -+ ((i) << (eth)->soc->tx.desc_shift) -+ - static const struct mtk_reg_map mtk_reg_map = { - .tx_irq_mask = 0x1a1c, - .tx_irq_status = 0x1a18, -@@ -1151,23 +1156,28 @@ static void *mtk_max_lro_buf_alloc(gfp_t - static int mtk_init_fq_dma(struct mtk_eth *eth) - { - const struct mtk_soc_data *soc = eth->soc; -- dma_addr_t phy_ring_tail; -+ dma_addr_t phy_ring_tail, phy_ring_addr; - int cnt = soc->tx.fq_dma_size; - dma_addr_t dma_addr; -+ void *ring_addr; -+ u32 desc_size; - int i, j, len; - - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) - eth->scratch_ring = eth->sram_base; - else - eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, -- cnt * soc->tx.desc_size, -+ TX_DESC_OFS(eth, cnt), - ð->phy_scratch_ring, - GFP_KERNEL); - - if (unlikely(!eth->scratch_ring)) - return -ENOMEM; - -- phy_ring_tail = eth->phy_scratch_ring + soc->tx.desc_size * (cnt - 1); -+ phy_ring_tail = eth->phy_scratch_ring + TX_DESC_OFS(eth, cnt - 1); -+ ring_addr = eth->scratch_ring; -+ phy_ring_addr = eth->phy_scratch_ring; -+ desc_size = TX_DESC_OFS(eth, 1); - - for (j = 0; j < DIV_ROUND_UP(soc->tx.fq_dma_size, MTK_FQ_DMA_LENGTH); j++) { - len = min_t(int, cnt - j * MTK_FQ_DMA_LENGTH, MTK_FQ_DMA_LENGTH); -@@ -1186,11 +1196,12 @@ static int mtk_init_fq_dma(struct mtk_et - for (i = 0; i < len; i++) { - struct mtk_tx_dma_v2 *txd; - -- txd = eth->scratch_ring + (j * MTK_FQ_DMA_LENGTH + i) * soc->tx.desc_size; -+ txd = ring_addr; -+ ring_addr += desc_size; -+ phy_ring_addr += desc_size; - txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; - if (j * MTK_FQ_DMA_LENGTH + i < cnt) -- txd->txd2 = eth->phy_scratch_ring + -- (j * MTK_FQ_DMA_LENGTH + i + 1) * soc->tx.desc_size; -+ txd->txd2 = eth->phy_scratch_ring + phy_ring_addr; - - txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); - if (MTK_HAS_CAPS(soc->caps, MTK_36BIT_DMA)) -@@ -1220,9 +1231,9 @@ static void *mtk_qdma_phys_to_virt(struc - } - - static struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring, -- void *txd, u32 txd_size) -+ void *txd, u32 txd_shift) - { -- int idx = (txd - ring->dma) / txd_size; -+ int idx = (txd - ring->dma) >> txd_shift; - - return &ring->buf[idx]; - } -@@ -1233,9 +1244,9 @@ static struct mtk_tx_dma *qdma_to_pdma(s - return ring->dma_pdma - (struct mtk_tx_dma *)ring->dma + dma; - } - --static int txd_to_idx(struct mtk_tx_ring *ring, void *dma, u32 txd_size) -+static int txd_to_idx(struct mtk_tx_ring *ring, void *dma, u32 txd_shift) - { -- return (dma - ring->dma) / txd_size; -+ return (dma - ring->dma) >> txd_shift; - } - - static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, -@@ -1443,7 +1454,7 @@ static int mtk_tx_map(struct sk_buff *sk - if (itxd == ring->last_free) - return -ENOMEM; - -- itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_size); -+ itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - memset(itx_buf, 0, sizeof(*itx_buf)); - - txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, -@@ -1497,7 +1508,7 @@ static int mtk_tx_map(struct sk_buff *sk - mtk_tx_set_dma_desc(dev, txd, &txd_info); - - tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_size); -+ soc->tx.desc_shift); - if (new_desc) - memset(tx_buf, 0, sizeof(*tx_buf)); - tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -@@ -1540,7 +1551,7 @@ static int mtk_tx_map(struct sk_buff *sk - } else { - int next_idx; - -- next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_size), -+ next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_shift), - ring->dma_size); - mtk_w32(eth, next_idx, MT7628_TX_CTX_IDX0); - } -@@ -1549,7 +1560,7 @@ static int mtk_tx_map(struct sk_buff *sk - - err_dma: - do { -- tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - - /* unmap dma */ - mtk_tx_unmap(eth, tx_buf, NULL, false); -@@ -1715,7 +1726,7 @@ static struct mtk_rx_ring *mtk_get_rx_ri - - ring = ð->rx_ring[i]; - idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); -- rxd = ring->dma + idx * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, idx); - if (rxd->rxd2 & RX_DMA_DONE) { - ring->calc_idx_update = true; - return ring; -@@ -1883,7 +1894,7 @@ static int mtk_xdp_submit_frame(struct m - } - htxd = txd; - -- tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->tx.desc_shift); - memset(tx_buf, 0, sizeof(*tx_buf)); - htx_buf = tx_buf; - -@@ -1902,7 +1913,7 @@ static int mtk_xdp_submit_frame(struct m - goto unmap; - - tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_size); -+ soc->tx.desc_shift); - memset(tx_buf, 0, sizeof(*tx_buf)); - n_desc++; - } -@@ -1940,7 +1951,7 @@ static int mtk_xdp_submit_frame(struct m - } else { - int idx; - -- idx = txd_to_idx(ring, txd, soc->tx.desc_size); -+ idx = txd_to_idx(ring, txd, soc->tx.desc_shift); - mtk_w32(eth, NEXT_DESP_IDX(idx, ring->dma_size), - MT7628_TX_CTX_IDX0); - } -@@ -1951,7 +1962,7 @@ static int mtk_xdp_submit_frame(struct m - - unmap: - while (htxd != txd) { -- tx_buf = mtk_desc_to_tx_buf(ring, htxd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, htxd, soc->tx.desc_shift); - mtk_tx_unmap(eth, tx_buf, NULL, false); - - htxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; -@@ -2083,7 +2094,7 @@ static int mtk_poll_rx(struct napi_struc - goto rx_done; - - idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); -- rxd = ring->dma + idx * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, idx); - data = ring->data[idx]; - - if (!mtk_rx_get_desc(eth, &trxd, rxd)) -@@ -2347,7 +2358,7 @@ static int mtk_poll_tx_qdma(struct mtk_e - break; - - tx_buf = mtk_desc_to_tx_buf(ring, desc, -- eth->soc->tx.desc_size); -+ eth->soc->tx.desc_shift); - if (!tx_buf->data) - break; - -@@ -2398,7 +2409,7 @@ static int mtk_poll_tx_pdma(struct mtk_e - } - mtk_tx_unmap(eth, tx_buf, &bq, true); - -- desc = ring->dma + cpu * eth->soc->tx.desc_size; -+ desc = ring->dma + TX_DESC_OFS(eth, cpu); - ring->last_free = desc; - atomic_inc(&ring->free_count); - -@@ -2516,10 +2527,13 @@ static int mtk_tx_alloc(struct mtk_eth * - { - const struct mtk_soc_data *soc = eth->soc; - struct mtk_tx_ring *ring = ð->tx_ring; -- int i, sz = soc->tx.desc_size; - struct mtk_tx_dma_v2 *txd; -+ dma_addr_t desc_phys; -+ void *desc_addr; -+ u32 desc_size; - int ring_size; - u32 ofs, val; -+ int i; - - if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) - ring_size = MTK_QDMA_RING_SIZE; -@@ -2532,22 +2546,24 @@ static int mtk_tx_alloc(struct mtk_eth * - goto no_tx_mem; - - if (MTK_HAS_CAPS(soc->caps, MTK_SRAM)) { -- ring->dma = eth->sram_base + soc->tx.fq_dma_size * sz; -- ring->phys = eth->phy_scratch_ring + soc->tx.fq_dma_size * (dma_addr_t)sz; -+ ring->dma = eth->sram_base + TX_DESC_OFS(eth, soc->tx.fq_dma_size); -+ ring->phys = eth->phy_scratch_ring + TX_DESC_OFS(eth, soc->tx.fq_dma_size); - } else { -- ring->dma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, -+ ring->dma = dma_alloc_coherent(eth->dma_dev, TX_DESC_OFS(eth, ring_size), - &ring->phys, GFP_KERNEL); - } - - if (!ring->dma) - goto no_tx_mem; - -+ desc_addr = ring->dma; -+ desc_phys = ring->phys; -+ desc_size = TX_DESC_OFS(eth, 1); - for (i = 0; i < ring_size; i++) { -- int next = (i + 1) % ring_size; -- u32 next_ptr = ring->phys + next * sz; -- -- txd = ring->dma + i * sz; -- txd->txd2 = next_ptr; -+ txd = desc_addr; -+ desc_addr += desc_size; -+ desc_phys += desc_size; -+ txd->txd2 = desc_phys; - txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - txd->txd4 = 0; - if (mtk_is_netsys_v2_or_greater(eth)) { -@@ -2563,7 +2579,7 @@ static int mtk_tx_alloc(struct mtk_eth * - * descriptors in ring->dma_pdma. - */ - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { -- ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, -+ ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, TX_DESC_OFS(eth, ring_size), - &ring->phys_pdma, GFP_KERNEL); - if (!ring->dma_pdma) - goto no_tx_mem; -@@ -2578,7 +2594,7 @@ static int mtk_tx_alloc(struct mtk_eth * - atomic_set(&ring->free_count, ring_size - 2); - ring->next_free = ring->dma; - ring->last_free = (void *)txd; -- ring->last_free_ptr = (u32)(ring->phys + ((ring_size - 1) * sz)); -+ ring->last_free_ptr = (u32)(ring->phys + TX_DESC_OFS(eth, ring_size - 1)); - ring->thresh = MAX_SKB_FRAGS; - - /* make sure that all changes to the dma ring are flushed before we -@@ -2590,7 +2606,7 @@ static int mtk_tx_alloc(struct mtk_eth * - mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr); - mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr); - mtk_w32(eth, -- ring->phys + ((ring_size - 1) * sz), -+ ring->phys + TX_DESC_OFS(eth, ring_size - 1), - soc->reg_map->qdma.crx_ptr); - mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); - -@@ -2639,14 +2655,14 @@ static void mtk_tx_clean(struct mtk_eth - } - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && ring->dma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * soc->tx.desc_size, -+ TX_DESC_OFS(eth, ring->dma_size), - ring->dma, ring->phys); - ring->dma = NULL; - } - - if (ring->dma_pdma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * soc->tx.desc_size, -+ TX_DESC_OFS(eth, ring->dma_size), - ring->dma_pdma, ring->phys_pdma); - ring->dma_pdma = NULL; - } -@@ -2702,15 +2718,13 @@ static int mtk_rx_alloc(struct mtk_eth * - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM) || - rx_flag != MTK_RX_FLAGS_NORMAL) { - ring->dma = dma_alloc_coherent(eth->dma_dev, -- rx_dma_size * eth->soc->rx.desc_size, -+ RX_DESC_OFS(eth, rx_dma_size), - &ring->phys, GFP_KERNEL); - } else { - struct mtk_tx_ring *tx_ring = ð->tx_ring; - -- ring->dma = tx_ring->dma + tx_ring_size * -- eth->soc->tx.desc_size * (ring_no + 1); -- ring->phys = tx_ring->phys + tx_ring_size * -- eth->soc->tx.desc_size * (ring_no + 1); -+ ring->dma = tx_ring->dma + TX_DESC_OFS(eth, tx_ring_size * (ring_no + 1)); -+ ring->phys = tx_ring->phys + TX_DESC_OFS(eth, tx_ring_size * (ring_no + 1)); - } - - if (!ring->dma) -@@ -2721,7 +2735,7 @@ static int mtk_rx_alloc(struct mtk_eth * - dma_addr_t dma_addr; - void *data; - -- rxd = ring->dma + i * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, i); - if (ring->page_pool) { - data = mtk_page_pool_get_buff(ring->page_pool, - &dma_addr, GFP_KERNEL); -@@ -2812,7 +2826,7 @@ static void mtk_rx_clean(struct mtk_eth - if (!ring->data[i]) - continue; - -- rxd = ring->dma + i * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, i); - if (!rxd->rxd1) - continue; - -@@ -2829,7 +2843,7 @@ static void mtk_rx_clean(struct mtk_eth - - if (!in_sram && ring->dma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * eth->soc->rx.desc_size, -+ RX_DESC_OFS(eth, ring->dma_size), - ring->dma, ring->phys); - ring->dma = NULL; - } -@@ -3200,7 +3214,7 @@ static void mtk_dma_free(struct mtk_eth - - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { - dma_free_coherent(eth->dma_dev, -- MTK_QDMA_RING_SIZE * soc->tx.desc_size, -+ TX_DESC_OFS(eth, MTK_QDMA_RING_SIZE), - eth->scratch_ring, eth->phy_scratch_ring); - eth->scratch_ring = NULL; - eth->phy_scratch_ring = 0; -@@ -5228,6 +5242,9 @@ static void mtk_remove(struct platform_d - mtk_mdio_cleanup(eth); - } - -+#define DESC_SIZE(struct_name) \ -+ .desc_shift = const_ilog2(sizeof(struct_name)) -+ - static const struct mtk_soc_data mt2701_data = { - .reg_map = &mtk_reg_map, - .caps = MT7623_CAPS | MTK_HWLRO, -@@ -5236,14 +5253,14 @@ static const struct mtk_soc_data mt2701_ - .required_pctl = true, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5264,14 +5281,14 @@ static const struct mtk_soc_data mt7621_ - .hash_offset = 2, - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5294,14 +5311,14 @@ static const struct mtk_soc_data mt7622_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5323,14 +5340,14 @@ static const struct mtk_soc_data mt7623_ - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .disable_pll_modes = true, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5349,14 +5366,14 @@ static const struct mtk_soc_data mt7629_ - .has_accounting = true, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5379,14 +5396,14 @@ static const struct mtk_soc_data mt7981_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN, -@@ -5409,14 +5426,14 @@ static const struct mtk_soc_data mt7986_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN, -@@ -5439,14 +5456,14 @@ static const struct mtk_soc_data mt7988_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(4K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma_v2), -+ DESC_SIZE(struct mtk_rx_dma_v2), - .irq_done_mask = MTK_RX_DONE_INT_V2, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, -@@ -5463,13 +5480,13 @@ static const struct mtk_soc_data rt5350_ - .required_pctl = false, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_PDMA, - .dma_max_len = MTK_TX_DMA_BUF_LEN, ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -1160,7 +1160,7 @@ struct mtk_reg_map { - * @foe_entry_size Foe table entry size. - * @has_accounting Bool indicating support for accounting of - * offloaded flows. -- * @desc_size Tx/Rx DMA descriptor size. -+ * @desc_shift Tx/Rx DMA descriptor size (in power-of-2). - * @irq_done_mask Rx irq done register mask. - * @dma_l4_valid Rx DMA valid register mask. - * @dma_max_len Max DMA tx/rx buffer length. -@@ -1181,14 +1181,14 @@ struct mtk_soc_data { - bool has_accounting; - bool disable_pll_modes; - struct { -- u32 desc_size; -+ u32 desc_shift; - u32 dma_max_len; - u32 dma_len_offset; - u32 dma_size; - u32 fq_dma_size; - } tx; - struct { -- u32 desc_size; -+ u32 desc_shift; - u32 irq_done_mask; - u32 dma_l4_valid; - u32 dma_max_len; diff --git a/target/linux/generic/pending-6.12/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch b/target/linux/generic/pending-6.12/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch deleted file mode 100644 index 3ee70bbd053..00000000000 --- a/target/linux/generic/pending-6.12/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch +++ /dev/null @@ -1,124 +0,0 @@ -From: Felix Fietkau -Date: Mon, 14 Jul 2025 10:52:59 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: shrink struct mtk_tx_buf - -There is no need to track the difference between dma_map_page -and dma_map_single, since they're unmapped in exactly the same way. -Also reorder fields in order to avoid padding. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1252,32 +1252,19 @@ static int txd_to_idx(struct mtk_tx_ring - static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, - struct xdp_frame_bulk *bq, bool napi) - { -- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { -- if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) { -- dma_unmap_single(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } else if (tx_buf->flags & MTK_TX_FLAGS_PAGE0) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } -- } else { -- if (dma_unmap_len(tx_buf, dma_len0)) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } -+ if (dma_unmap_len(tx_buf, dma_len0)) { -+ dma_unmap_page(eth->dma_dev, -+ dma_unmap_addr(tx_buf, dma_addr0), -+ dma_unmap_len(tx_buf, dma_len0), -+ DMA_TO_DEVICE); -+ } - -- if (dma_unmap_len(tx_buf, dma_len1)) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr1), -- dma_unmap_len(tx_buf, dma_len1), -- DMA_TO_DEVICE); -- } -+ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA) && -+ dma_unmap_len(tx_buf, dma_len1)) { -+ dma_unmap_page(eth->dma_dev, -+ dma_unmap_addr(tx_buf, dma_addr1), -+ dma_unmap_len(tx_buf, dma_len1), -+ DMA_TO_DEVICE); - } - - if (tx_buf->data && tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { -@@ -1299,7 +1286,6 @@ static void mtk_tx_unmap(struct mtk_eth - xdp_return_frame(xdpf); - } - } -- tx_buf->flags = 0; - tx_buf->data = NULL; - } - -@@ -1464,7 +1450,6 @@ static int mtk_tx_map(struct sk_buff *sk - - mtk_tx_set_dma_desc(dev, itxd, &txd_info); - -- itx_buf->flags |= MTK_TX_FLAGS_SINGLE0; - itx_buf->mac_id = mac->id; - setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, - k++); -@@ -1512,7 +1497,6 @@ static int mtk_tx_map(struct sk_buff *sk - if (new_desc) - memset(tx_buf, 0, sizeof(*tx_buf)); - tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -- tx_buf->flags |= MTK_TX_FLAGS_PAGE0; - tx_buf->mac_id = mac->id; - - setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, -@@ -1837,8 +1821,6 @@ static int mtk_xdp_frame_map(struct mtk_ - txd_info->size, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(eth->dma_dev, txd_info->addr))) - return -ENOMEM; -- -- tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; - } else { - struct page *page = virt_to_head_page(data); - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -701,14 +701,6 @@ struct mtk_hw_stats { - struct u64_stats_sync syncp; - }; - --enum mtk_tx_flags { -- /* PDMA descriptor can point at 1-2 segments. This enum allows us to -- * track how memory was allocated so that it can be freed properly. -- */ -- MTK_TX_FLAGS_SINGLE0 = 0x01, -- MTK_TX_FLAGS_PAGE0 = 0x02, --}; -- - /* This enum allows us to identify how the clock is defined on the array of the - * clock in the order - */ -@@ -881,13 +873,12 @@ enum mtk_tx_buf_type { - */ - struct mtk_tx_buf { - enum mtk_tx_buf_type type; -+ u16 mac_id; - void *data; - -- u16 mac_id; -- u16 flags; - DEFINE_DMA_UNMAP_ADDR(dma_addr0); -- DEFINE_DMA_UNMAP_LEN(dma_len0); - DEFINE_DMA_UNMAP_ADDR(dma_addr1); -+ DEFINE_DMA_UNMAP_LEN(dma_len0); - DEFINE_DMA_UNMAP_LEN(dma_len1); - }; - diff --git a/target/linux/generic/pending-6.12/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch b/target/linux/generic/pending-6.12/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch deleted file mode 100644 index e598655e370..00000000000 --- a/target/linux/generic/pending-6.12/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch +++ /dev/null @@ -1,509 +0,0 @@ -From: Felix Fietkau -Date: Mon, 14 Jul 2025 10:41:27 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for sending - fraglist GSO packets - -When primarily forwarding traffic, TCP fraglist GRO can be noticeably more -efficient than regular TCP GRO. In order to avoid the overhead of -unnecessary segmentation on ethernet tx, add support for sending fraglist -GRO packets. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -18,6 +18,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include -@@ -27,6 +29,7 @@ - #include - #include - #include -+#include - #include - - #include "mtk_eth_soc.h" -@@ -1410,119 +1413,244 @@ static void mtk_tx_set_dma_desc(struct n - mtk_tx_set_dma_desc_v1(dev, txd, info); - } - -+struct mtk_tx_map_state { -+ struct mtk_tx_dma *txd, *txd_pdma; -+ struct mtk_tx_buf *tx_buf; -+ int nbuf; -+ int ndesc; -+}; -+ -+static void -+mtk_tx_map_set_txd(struct mtk_tx_map_state *state, struct mtk_tx_ring *ring, -+ const struct mtk_soc_data *soc, struct mtk_tx_dma *txd) -+{ -+ state->txd = txd; -+ state->txd_pdma = qdma_to_pdma(ring, txd); -+ state->tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->tx.desc_shift); -+ memset(state->tx_buf, 0, sizeof(*state->tx_buf)); -+} -+ -+static int -+mtk_tx_map_info(struct mtk_eth *eth, struct mtk_tx_ring *ring, -+ struct net_device *dev, struct mtk_tx_map_state *state, -+ struct mtk_tx_dma_desc_info *txd_info) -+{ -+ const struct mtk_soc_data *soc = eth->soc; -+ struct mtk_tx_buf *tx_buf = state->tx_buf; -+ struct mtk_tx_dma *txd = state->txd; -+ struct mtk_mac *mac = netdev_priv(dev); -+ -+ if (state->nbuf && -+ (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || (state->nbuf & 1) == 0)) { -+ txd = mtk_qdma_phys_to_virt(ring, txd->txd2); -+ if (txd == ring->last_free) -+ return -1; -+ -+ mtk_tx_map_set_txd(state, ring, soc, txd); -+ state->ndesc++; -+ } -+ -+ mtk_tx_set_dma_desc(dev, txd, txd_info); -+ tx_buf = state->tx_buf; -+ tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -+ tx_buf->mac_id = mac->id; -+ -+ setup_tx_buf(eth, tx_buf, state->txd_pdma, txd_info->addr, -+ txd_info->size, state->nbuf++); -+ return 0; -+} -+ -+static void -+mtk_tx_update_ipaddr(struct sk_buff *skb, -+ struct iphdr *iph, struct tcphdr *th, -+ __be32 *old_ip, __be32 new_ip) -+{ -+ if (*old_ip == new_ip) -+ return; -+ -+ inet_proto_csum_replace4(&th->check, skb, *old_ip, new_ip, true); -+ csum_replace4(&iph->check, *old_ip, new_ip); -+ *old_ip = new_ip; -+} -+ -+static void -+mtk_tx_update_ip6addr(struct sk_buff *skb, struct ipv6hdr *iph, -+ struct tcphdr *th, struct in6_addr *old_ip, -+ const struct in6_addr *new_ip) -+{ -+ if (ipv6_addr_equal(old_ip, new_ip)) -+ return; -+ -+ inet_proto_csum_replace16(&th->check, skb, old_ip->s6_addr32, -+ new_ip->s6_addr32, true); -+ *old_ip = *new_ip; -+} -+ -+static void -+mtk_tx_update_port(struct sk_buff *skb, struct tcphdr *th, -+ __be16 *old_port, __be16 new_port) -+{ -+ if (*old_port == new_port) -+ return; -+ -+ inet_proto_csum_replace2(&th->check, skb, *old_port, new_port, false); -+ *old_port = new_port; -+} -+ - static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, -- int tx_num, struct mtk_tx_ring *ring, bool gso) -+ int tx_num, struct mtk_tx_ring *ring, bool gso, -+ unsigned int header_len) - { -- struct mtk_tx_dma_desc_info txd_info = { -- .size = skb_headlen(skb), -- .gso = gso, -- .csum = skb->ip_summed == CHECKSUM_PARTIAL, -- .vlan = skb_vlan_tag_present(skb), -- .qid = skb_get_queue_mapping(skb), -- .vlan_tci = skb_vlan_tag_get(skb), -- .first = true, -- .last = !skb_is_nonlinear(skb), -+ struct mtk_tx_dma_desc_info txd_info; -+ struct mtk_tx_map_state state = { -+ .ndesc = 1, - }; - struct netdev_queue *txq; - struct mtk_mac *mac = netdev_priv(dev); - struct mtk_eth *eth = mac->hw; - const struct mtk_soc_data *soc = eth->soc; -- struct mtk_tx_dma *itxd, *txd; -- struct mtk_tx_dma *itxd_pdma, *txd_pdma; -- struct mtk_tx_buf *itx_buf, *tx_buf; -- int i, n_desc = 1; -+ struct mtk_tx_dma *itxd; -+ struct sk_buff *cur_skb, *next_skb; - int queue = skb_get_queue_mapping(skb); -- int k = 0; -+ int offset = 0; -+ int i, frag_size; -+ bool gso_v4; - - txq = netdev_get_tx_queue(dev, queue); - itxd = ring->next_free; -- itxd_pdma = qdma_to_pdma(ring, itxd); - if (itxd == ring->last_free) - return -ENOMEM; - -- itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); -- memset(itx_buf, 0, sizeof(*itx_buf)); -+ cur_skb = skb; -+ next_skb = skb_shinfo(skb)->frag_list; -+ mtk_tx_map_set_txd(&state, ring, soc, itxd); -+ gso_v4 = skb_shinfo(skb)->gso_type & SKB_GSO_TCPV4; - -- txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, -- DMA_TO_DEVICE); -- if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) -- return -ENOMEM; -+next: -+ txd_info = (struct mtk_tx_dma_desc_info){ -+ .gso = gso, -+ .qid = queue, -+ .csum = cur_skb->ip_summed == CHECKSUM_PARTIAL || gso, -+ .vlan = skb_vlan_tag_present(skb), -+ .vlan_tci = skb_vlan_tag_get(skb), -+ .first = true, -+ }; -+ -+ offset = 0; -+ frag_size = skb_headlen(cur_skb); -+ if (cur_skb != skb) { -+ struct tcphdr *th, *th2; -+ -+ if (skb_cow_head(cur_skb, header_len)) -+ goto err_dma; -+ -+ memcpy(cur_skb->data - header_len, skb->data, -+ skb_network_offset(skb)); -+ -+ th = tcp_hdr(cur_skb); -+ th2 = tcp_hdr(skb); -+ if (gso_v4) { -+ struct iphdr *iph = ip_hdr(cur_skb); -+ struct iphdr *iph2 = ip_hdr(skb); -+ -+ mtk_tx_update_ipaddr(skb, iph, th, &iph->saddr, -+ iph2->saddr); -+ mtk_tx_update_ipaddr(skb, iph, th, &iph->daddr, -+ iph2->daddr); -+ } else { -+ struct ipv6hdr *iph = ipv6_hdr(cur_skb); -+ struct ipv6hdr *iph2 = ipv6_hdr(skb); - -- mtk_tx_set_dma_desc(dev, itxd, &txd_info); -+ mtk_tx_update_ip6addr(skb, iph, th, &iph->saddr, -+ &iph2->saddr); -+ mtk_tx_update_ip6addr(skb, iph, th, &iph->daddr, -+ &iph2->daddr); -+ } - -- itx_buf->mac_id = mac->id; -- setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, -- k++); -- -- /* TX SG offload */ -- txd = itxd; -- txd_pdma = qdma_to_pdma(ring, txd); -- -- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -- skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; -- unsigned int offset = 0; -- int frag_size = skb_frag_size(frag); -+ mtk_tx_update_port(skb, th, &th->source, th2->source); -+ mtk_tx_update_port(skb, th, &th->dest, th2->dest); - -- while (frag_size) { -- bool new_desc = true; -+ offset = -header_len; -+ frag_size += header_len; -+ } else if (next_skb) { -+ unsigned int ip_len = skb_pagelen(skb) - skb_network_offset(skb); -+ if (gso_v4) { -+ struct iphdr *iph = ip_hdr(cur_skb); -+ __be16 ip_len_val = cpu_to_be16(ip_len); - -- if (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || -- (i & 0x1)) { -- txd = mtk_qdma_phys_to_virt(ring, txd->txd2); -- txd_pdma = qdma_to_pdma(ring, txd); -- if (txd == ring->last_free) -- goto err_dma; -+ csum_replace2(&iph->check, iph->tot_len, ip_len_val); -+ iph->tot_len = ip_len_val; -+ } else { -+ struct ipv6hdr *iph = ipv6_hdr(cur_skb); -+ __be16 ip_len_val = cpu_to_be16(ip_len - sizeof(*iph)); - -- n_desc++; -- } else { -- new_desc = false; -- } -+ iph->payload_len = ip_len_val; -+ } -+ } - -- memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); -+ while (frag_size) { -+ txd_info.size = min_t(unsigned int, frag_size, -+ soc->tx.dma_max_len); -+ txd_info.addr = dma_map_single(eth->dma_dev, cur_skb->data + offset, -+ txd_info.size, DMA_TO_DEVICE); -+ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) -+ goto err_dma; -+ -+ frag_size -= txd_info.size; -+ offset += txd_info.size; -+ txd_info.last = !frag_size && !skb_shinfo(cur_skb)->nr_frags; -+ if (mtk_tx_map_info(eth, ring, dev, &state, &txd_info) < 0) -+ goto err_dma; -+ } -+ -+ for (i = 0; i < skb_shinfo(cur_skb)->nr_frags; i++) { -+ skb_frag_t *frag = &skb_shinfo(cur_skb)->frags[i]; -+ -+ frag_size = skb_frag_size(frag); -+ memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); -+ txd_info.qid = queue; -+ offset = 0; -+ while (frag_size) { - txd_info.size = min_t(unsigned int, frag_size, - soc->tx.dma_max_len); -- txd_info.qid = queue; -- txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && -- !(frag_size - txd_info.size); -- txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, -- offset, txd_info.size, -- DMA_TO_DEVICE); -+ txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, offset, -+ txd_info.size, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) - goto err_dma; - -- mtk_tx_set_dma_desc(dev, txd, &txd_info); -- -- tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_shift); -- if (new_desc) -- memset(tx_buf, 0, sizeof(*tx_buf)); -- tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -- tx_buf->mac_id = mac->id; -- -- setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, -- txd_info.size, k++); -- - frag_size -= txd_info.size; - offset += txd_info.size; -+ txd_info.last = i == skb_shinfo(cur_skb)->nr_frags - 1 && -+ !frag_size; -+ if (mtk_tx_map_info(eth, ring, dev, &state, &txd_info) < 0) -+ goto err_dma; - } - } - -- /* store skb to cleanup */ -- itx_buf->type = MTK_TYPE_SKB; -- itx_buf->data = skb; -- - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { -- if (k & 0x1) -- txd_pdma->txd2 |= TX_DMA_LS0; -- else -- txd_pdma->txd2 |= TX_DMA_LS1; -+ if (state.nbuf & 0x1) { -+ state.txd_pdma->txd2 |= TX_DMA_LS0; -+ state.nbuf++; -+ } else { -+ state.txd_pdma->txd2 |= TX_DMA_LS1; -+ } - } - -+ if (next_skb) { -+ cur_skb = next_skb; -+ next_skb = cur_skb->next; -+ goto next; -+ } -+ -+ /* store skb to cleanup */ -+ state.tx_buf->type = MTK_TYPE_SKB; -+ state.tx_buf->data = skb; -+ - netdev_tx_sent_queue(txq, skb->len); - skb_tx_timestamp(skb); - -- ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); -- atomic_sub(n_desc, &ring->free_count); -+ ring->next_free = mtk_qdma_phys_to_virt(ring, state.txd->txd2); -+ atomic_sub(state.ndesc, &ring->free_count); - - /* make sure that all changes to the dma ring are flushed before we - * continue -@@ -1531,11 +1659,11 @@ static int mtk_tx_map(struct sk_buff *sk - - if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { - if (netif_xmit_stopped(txq) || !netdev_xmit_more()) -- mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); -+ mtk_w32(eth, state.txd->txd2, soc->reg_map->qdma.ctx_ptr); - } else { - int next_idx; - -- next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_shift), -+ next_idx = NEXT_DESP_IDX(txd_to_idx(ring, state.txd, soc->tx.desc_shift), - ring->dma_size); - mtk_w32(eth, next_idx, MT7628_TX_CTX_IDX0); - } -@@ -1544,18 +1672,20 @@ static int mtk_tx_map(struct sk_buff *sk - - err_dma: - do { -- tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); -+ struct mtk_tx_dma *itxd_pdma = qdma_to_pdma(ring, itxd); -+ struct mtk_tx_buf *itx_buf; -+ -+ itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - - /* unmap dma */ -- mtk_tx_unmap(eth, tx_buf, NULL, false); -+ mtk_tx_unmap(eth, itx_buf, NULL, false); - - itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) - itxd_pdma->txd2 = TX_DMA_DESP2_DEF; - - itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2); -- itxd_pdma = qdma_to_pdma(ring, itxd); -- } while (itxd != txd); -+ } while (itxd != state.txd); - - return -ENOMEM; - } -@@ -1575,6 +1705,9 @@ static int mtk_cal_txd_req(struct mtk_et - nfrags += skb_shinfo(skb)->nr_frags; - } - -+ for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) -+ nfrags += mtk_cal_txd_req(eth, skb) + 1; -+ - return nfrags; - } - -@@ -1615,9 +1748,26 @@ static bool mtk_skb_has_small_frag(struc - if (skb_frag_size(&skb_shinfo(skb)->frags[i]) < min_size) - return true; - -+ for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) -+ if (mtk_skb_has_small_frag(skb)) -+ return true; -+ - return false; - } - -+static bool mtk_skb_valid_gso(struct mtk_eth *eth, struct sk_buff *skb, -+ unsigned int header_len) -+{ -+ if (mtk_is_netsys_v1(eth) && mtk_skb_has_small_frag(skb)) -+ return false; -+ -+ if (!(skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST)) -+ return true; -+ -+ return skb_pagelen(skb) - header_len == skb_shinfo(skb)->gso_size && -+ skb_headlen(skb) > header_len; -+} -+ - static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) - { - struct mtk_mac *mac = netdev_priv(dev); -@@ -1625,6 +1775,7 @@ static netdev_tx_t mtk_start_xmit(struct - struct mtk_tx_ring *ring = ð->tx_ring; - struct net_device_stats *stats = &dev->stats; - struct sk_buff *segs, *next; -+ unsigned int header_len = 0; - bool gso = false; - int tx_num; - -@@ -1646,37 +1797,42 @@ static netdev_tx_t mtk_start_xmit(struct - return NETDEV_TX_BUSY; - } - -- if (mtk_is_netsys_v1(eth) && -- skb_is_gso(skb) && mtk_skb_has_small_frag(skb)) { -- segs = skb_gso_segment(skb, dev->features & ~NETIF_F_ALL_TSO); -- if (IS_ERR(segs)) -- goto drop; -- -- if (segs) { -- consume_skb(skb); -- skb = segs; -- } -- } -- -- /* TSO: fill MSS info in tcp checksum field */ - if (skb_is_gso(skb)) { -- if (skb_cow_head(skb, 0)) { -- netif_warn(eth, tx_err, dev, -- "GSO expand head fail.\n"); -- goto drop; -+ header_len = skb_tcp_all_headers(skb); -+ if (!mtk_skb_valid_gso(eth, skb, header_len)) { -+ segs = skb_gso_segment(skb, dev->features & ~NETIF_F_ALL_TSO); -+ if (IS_ERR(segs)) -+ goto drop; -+ -+ if (segs) { -+ consume_skb(skb); -+ skb = segs; -+ } -+ goto send; - } - -+ if ((skb_shinfo(skb)->gso_type & SKB_GSO_FRAGLIST)) -+ goto send; -+ - if (skb_shinfo(skb)->gso_type & - (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { -+ /* TSO: fill MSS info in tcp checksum field */ - gso = true; -+ if (skb_cow_head(skb, 0)) { -+ netif_warn(eth, tx_err, dev, -+ "GSO expand head fail.\n"); -+ goto drop; -+ } -+ - tcp_hdr(skb)->check = htons(skb_shinfo(skb)->gso_size); - } - } - -+send: - skb_list_walk_safe(skb, skb, next) { - if ((mtk_is_netsys_v1(eth) && - mtk_skb_has_small_frag(skb) && skb_linearize(skb)) || -- mtk_tx_map(skb, dev, tx_num, ring, gso) < 0) { -+ mtk_tx_map(skb, dev, tx_num, ring, gso, header_len) < 0) { - stats->tx_dropped++; - dev_kfree_skb_any(skb); - } ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -51,6 +51,8 @@ - NETIF_F_HW_VLAN_CTAG_TX | \ - NETIF_F_SG | NETIF_F_TSO | \ - NETIF_F_TSO6 | \ -+ NETIF_F_FRAGLIST | \ -+ NETIF_F_GSO_FRAGLIST | \ - NETIF_F_IPV6_CSUM |\ - NETIF_F_HW_TC) - #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) diff --git a/target/linux/generic/pending-6.12/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch b/target/linux/generic/pending-6.12/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch index fcfbc1fa96c..36c1d499d33 100644 --- a/target/linux/generic/pending-6.12/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch +++ b/target/linux/generic/pending-6.12/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2300,7 +2300,7 @@ static int mtk_poll_rx(struct napi_struc +@@ -2151,7 +2151,7 @@ static int mtk_poll_rx(struct napi_struc if (ret != XDP_PASS) goto skip_rx; @@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau if (unlikely(!skb)) { page_pool_put_full_page(ring->page_pool, page, true); -@@ -2338,7 +2338,7 @@ static int mtk_poll_rx(struct napi_struc +@@ -2189,7 +2189,7 @@ static int mtk_poll_rx(struct napi_struc dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64), ring->buf_size, DMA_FROM_DEVICE); diff --git a/target/linux/generic/pending-6.12/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch b/target/linux/generic/pending-6.12/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch index 6783ad8b00d..d9e28732627 100644 --- a/target/linux/generic/pending-6.12/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch +++ b/target/linux/generic/pending-6.12/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch @@ -15,7 +15,7 @@ Signed-off-by: Chad Monroe --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -282,6 +282,7 @@ +@@ -279,6 +279,7 @@ #define MTK_WCOMP_EN BIT(24) #define MTK_RESV_BUF (0x80 << 16) #define MTK_MUTLI_CNT (0x4 << 12) @@ -25,7 +25,7 @@ Signed-off-by: Chad Monroe /* QDMA Flow Control Register */ --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -3476,12 +3476,14 @@ static int mtk_start_dma(struct mtk_eth +@@ -3324,12 +3324,14 @@ static int mtk_start_dma(struct mtk_eth MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | MTK_RX_2B_OFFSET | MTK_TX_WB_DDONE; diff --git a/target/linux/generic/pending-6.12/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch b/target/linux/generic/pending-6.12/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch index 165eb1e45c4..b03b72b33d5 100644 --- a/target/linux/generic/pending-6.12/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch +++ b/target/linux/generic/pending-6.12/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch @@ -205,7 +205,7 @@ Signed-off-by: Daniel Golle return mtk_eth_mux_setup(eth, path); --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -24,6 +24,8 @@ +@@ -22,6 +22,8 @@ #include #include #include @@ -214,7 +214,7 @@ Signed-off-by: Daniel Golle #include #include #include -@@ -522,6 +524,30 @@ static void mtk_setup_bridge_switch(stru +@@ -514,6 +516,30 @@ static void mtk_setup_bridge_switch(stru MTK_GSW_CFG); } @@ -245,7 +245,7 @@ Signed-off-by: Daniel Golle static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, phy_interface_t interface) { -@@ -530,6 +556,21 @@ static struct phylink_pcs *mtk_mac_selec +@@ -522,6 +548,21 @@ static struct phylink_pcs *mtk_mac_selec struct mtk_eth *eth = mac->hw; unsigned int sid; @@ -267,7 +267,7 @@ Signed-off-by: Daniel Golle if (interface == PHY_INTERFACE_MODE_SGMII || phy_interface_mode_is_8023z(interface)) { sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? -@@ -581,7 +622,22 @@ static void mtk_mac_config(struct phylin +@@ -573,7 +614,22 @@ static void mtk_mac_config(struct phylin goto init_err; } break; @@ -290,7 +290,7 @@ Signed-off-by: Daniel Golle break; default: goto err_phy; -@@ -628,8 +684,6 @@ static void mtk_mac_config(struct phylin +@@ -620,8 +676,6 @@ static void mtk_mac_config(struct phylin val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id); val |= SYSCFG0_GE_MODE(ge_mode, mac->id); regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); @@ -299,7 +299,7 @@ Signed-off-by: Daniel Golle } /* SGMII */ -@@ -646,21 +700,40 @@ static void mtk_mac_config(struct phylin +@@ -638,21 +692,40 @@ static void mtk_mac_config(struct phylin /* Save the syscfg0 value for mac_finish */ mac->syscfg0 = val; @@ -347,7 +347,7 @@ Signed-off-by: Daniel Golle return; err_phy: -@@ -673,6 +746,18 @@ init_err: +@@ -665,6 +738,18 @@ init_err: mac->id, phy_modes(state->interface), err); } @@ -366,7 +366,7 @@ Signed-off-by: Daniel Golle static int mtk_mac_finish(struct phylink_config *config, unsigned int mode, phy_interface_t interface) { -@@ -681,6 +766,10 @@ static int mtk_mac_finish(struct phylink +@@ -673,6 +758,10 @@ static int mtk_mac_finish(struct phylink struct mtk_eth *eth = mac->hw; u32 mcr_cur, mcr_new; @@ -377,7 +377,7 @@ Signed-off-by: Daniel Golle /* Enable SGMII */ if (interface == PHY_INTERFACE_MODE_SGMII || phy_interface_mode_is_8023z(interface)) -@@ -705,10 +794,14 @@ static void mtk_mac_link_down(struct phy +@@ -697,10 +786,14 @@ static void mtk_mac_link_down(struct phy { struct mtk_mac *mac = container_of(config, struct mtk_mac, phylink_config); @@ -395,7 +395,7 @@ Signed-off-by: Daniel Golle } static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx, -@@ -780,13 +873,11 @@ static void mtk_set_queue_speed(struct m +@@ -772,13 +865,11 @@ static void mtk_set_queue_speed(struct m mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); } @@ -413,7 +413,7 @@ Signed-off-by: Daniel Golle u32 mcr; mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); -@@ -830,9 +921,63 @@ static void mtk_mac_link_up(struct phyli +@@ -822,9 +913,63 @@ static void mtk_mac_link_up(struct phyli mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); } @@ -477,7 +477,7 @@ Signed-off-by: Daniel Golle .mac_finish = mtk_mac_finish, .mac_link_down = mtk_mac_link_down, .mac_link_up = mtk_mac_link_up, -@@ -3584,6 +3729,9 @@ static int mtk_open(struct net_device *d +@@ -3432,6 +3577,9 @@ static int mtk_open(struct net_device *d ppe_num = eth->soc->ppe_num; @@ -487,7 +487,7 @@ Signed-off-by: Daniel Golle err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); if (err) { netdev_err(dev, "%s: could not attach PHY: %d\n", __func__, -@@ -3731,6 +3879,9 @@ static int mtk_stop(struct net_device *d +@@ -3579,6 +3727,9 @@ static int mtk_stop(struct net_device *d for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) mtk_ppe_stop(eth->ppe[i]); @@ -497,7 +497,7 @@ Signed-off-by: Daniel Golle return 0; } -@@ -4821,6 +4972,7 @@ static const struct net_device_ops mtk_n +@@ -4669,6 +4820,7 @@ static const struct net_device_ops mtk_n static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) { const __be32 *_id = of_get_property(np, "reg", NULL); @@ -505,7 +505,7 @@ Signed-off-by: Daniel Golle phy_interface_t phy_mode; struct phylink *phylink; struct mtk_mac *mac; -@@ -4859,16 +5011,41 @@ static int mtk_add_mac(struct mtk_eth *e +@@ -4707,16 +4859,41 @@ static int mtk_add_mac(struct mtk_eth *e mac->id = id; mac->hw = eth; mac->of_node = np; @@ -555,7 +555,7 @@ Signed-off-by: Daniel Golle } memset(mac->hwlro_ip, 0, sizeof(mac->hwlro_ip)); -@@ -4951,8 +5128,21 @@ static int mtk_add_mac(struct mtk_eth *e +@@ -4799,8 +4976,21 @@ static int mtk_add_mac(struct mtk_eth *e phy_interface_zero(mac->phylink_config.supported_interfaces); __set_bit(PHY_INTERFACE_MODE_INTERNAL, mac->phylink_config.supported_interfaces); @@ -577,7 +577,7 @@ Signed-off-by: Daniel Golle phylink = phylink_create(&mac->phylink_config, of_fwnode_handle(mac->of_node), phy_mode, &mtk_phylink_ops); -@@ -5003,6 +5193,26 @@ free_netdev: +@@ -4851,6 +5041,26 @@ free_netdev: return err; } @@ -604,7 +604,7 @@ Signed-off-by: Daniel Golle void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev) { struct net_device *dev, *tmp; -@@ -5149,7 +5359,8 @@ static int mtk_probe(struct platform_dev +@@ -4997,7 +5207,8 @@ static int mtk_probe(struct platform_dev regmap_write(cci, 0, 3); } @@ -614,7 +614,7 @@ Signed-off-by: Daniel Golle err = mtk_sgmii_init(eth); if (err) -@@ -5260,6 +5471,24 @@ static int mtk_probe(struct platform_dev +@@ -5108,6 +5319,24 @@ static int mtk_probe(struct platform_dev } } @@ -639,7 +639,7 @@ Signed-off-by: Daniel Golle if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) { err = devm_request_irq(eth->dev, eth->irq[0], mtk_handle_irq, 0, -@@ -5370,6 +5599,11 @@ static void mtk_remove(struct platform_d +@@ -5218,6 +5447,11 @@ static void mtk_remove(struct platform_d mtk_stop(eth->netdev[i]); mac = netdev_priv(eth->netdev[i]); phylink_disconnect_phy(mac->phylink); @@ -661,7 +661,7 @@ Signed-off-by: Daniel Golle #include #include #include -@@ -527,6 +528,21 @@ +@@ -524,6 +525,21 @@ #define INTF_MODE_RGMII_1000 (TRGMII_MODE | TRGMII_CENTRAL_ALIGNED) #define INTF_MODE_RGMII_10_100 0 @@ -683,7 +683,7 @@ Signed-off-by: Daniel Golle /* GPIO port control registers for GMAC 2*/ #define GPIO_OD33_CTRL8 0x4c0 #define GPIO_BIAS_CTRL 0xed0 -@@ -552,6 +568,7 @@ +@@ -549,6 +565,7 @@ #define SYSCFG0_SGMII_GMAC2 ((3 << 8) & SYSCFG0_SGMII_MASK) #define SYSCFG0_SGMII_GMAC1_V2 BIT(9) #define SYSCFG0_SGMII_GMAC2_V2 BIT(8) @@ -691,7 +691,7 @@ Signed-off-by: Daniel Golle /* ethernet subsystem clock register */ -@@ -590,6 +607,11 @@ +@@ -587,6 +604,11 @@ #define GEPHY_MAC_SEL BIT(1) /* Top misc registers */ @@ -703,7 +703,7 @@ Signed-off-by: Daniel Golle #define USB_PHY_SWITCH_REG 0x218 #define QPHY_SEL_MASK GENMASK(1, 0) #define SGMII_QPHY_SEL 0x2 -@@ -614,6 +636,8 @@ +@@ -611,6 +633,8 @@ #define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) #define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) @@ -712,7 +712,7 @@ Signed-off-by: Daniel Golle #define MTK_FE_CDM1_FSM 0x220 #define MTK_FE_CDM2_FSM 0x224 #define MTK_FE_CDM3_FSM 0x238 -@@ -622,6 +646,11 @@ +@@ -619,6 +643,11 @@ #define MTK_FE_CDM6_FSM 0x328 #define MTK_FE_GDM1_FSM 0x228 #define MTK_FE_GDM2_FSM 0x22C @@ -724,7 +724,7 @@ Signed-off-by: Daniel Golle #define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100)) -@@ -945,6 +974,8 @@ enum mkt_eth_capabilities { +@@ -951,6 +980,8 @@ enum mkt_eth_capabilities { MTK_RGMII_BIT = 0, MTK_TRGMII_BIT, MTK_SGMII_BIT, @@ -733,7 +733,7 @@ Signed-off-by: Daniel Golle MTK_ESW_BIT, MTK_GEPHY_BIT, MTK_MUX_BIT, -@@ -965,8 +996,11 @@ enum mkt_eth_capabilities { +@@ -971,8 +1002,11 @@ enum mkt_eth_capabilities { MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT, MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT, @@ -745,7 +745,7 @@ Signed-off-by: Daniel Golle /* PATH BITS */ MTK_ETH_PATH_GMAC1_RGMII_BIT, -@@ -974,14 +1008,21 @@ enum mkt_eth_capabilities { +@@ -980,14 +1014,21 @@ enum mkt_eth_capabilities { MTK_ETH_PATH_GMAC1_SGMII_BIT, MTK_ETH_PATH_GMAC2_RGMII_BIT, MTK_ETH_PATH_GMAC2_SGMII_BIT, @@ -767,7 +767,7 @@ Signed-off-by: Daniel Golle #define MTK_ESW BIT_ULL(MTK_ESW_BIT) #define MTK_GEPHY BIT_ULL(MTK_GEPHY_BIT) #define MTK_MUX BIT_ULL(MTK_MUX_BIT) -@@ -1004,10 +1045,16 @@ enum mkt_eth_capabilities { +@@ -1010,10 +1051,16 @@ enum mkt_eth_capabilities { BIT_ULL(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT) #define MTK_ETH_MUX_U3_GMAC2_TO_QPHY \ BIT_ULL(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT) @@ -784,7 +784,7 @@ Signed-off-by: Daniel Golle /* Supported path present on SoCs */ #define MTK_ETH_PATH_GMAC1_RGMII BIT_ULL(MTK_ETH_PATH_GMAC1_RGMII_BIT) -@@ -1015,8 +1062,13 @@ enum mkt_eth_capabilities { +@@ -1021,8 +1068,13 @@ enum mkt_eth_capabilities { #define MTK_ETH_PATH_GMAC1_SGMII BIT_ULL(MTK_ETH_PATH_GMAC1_SGMII_BIT) #define MTK_ETH_PATH_GMAC2_RGMII BIT_ULL(MTK_ETH_PATH_GMAC2_RGMII_BIT) #define MTK_ETH_PATH_GMAC2_SGMII BIT_ULL(MTK_ETH_PATH_GMAC2_SGMII_BIT) @@ -798,7 +798,7 @@ Signed-off-by: Daniel Golle #define MTK_GMAC1_RGMII (MTK_ETH_PATH_GMAC1_RGMII | MTK_RGMII) #define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII) -@@ -1024,7 +1076,12 @@ enum mkt_eth_capabilities { +@@ -1030,7 +1082,12 @@ enum mkt_eth_capabilities { #define MTK_GMAC2_RGMII (MTK_ETH_PATH_GMAC2_RGMII | MTK_RGMII) #define MTK_GMAC2_SGMII (MTK_ETH_PATH_GMAC2_SGMII | MTK_SGMII) #define MTK_GMAC2_GEPHY (MTK_ETH_PATH_GMAC2_GEPHY | MTK_GEPHY) @@ -811,7 +811,7 @@ Signed-off-by: Daniel Golle /* MUXes present on SoCs */ /* 0: GDM1 -> GMAC1, 1: GDM1 -> ESW */ -@@ -1043,10 +1100,20 @@ enum mkt_eth_capabilities { +@@ -1049,10 +1106,20 @@ enum mkt_eth_capabilities { (MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII | MTK_MUX | \ MTK_SHARED_SGMII) @@ -832,7 +832,7 @@ Signed-off-by: Daniel Golle #define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x)) #define MT7621_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_TRGMII | \ -@@ -1078,8 +1145,12 @@ enum mkt_eth_capabilities { +@@ -1084,8 +1151,12 @@ enum mkt_eth_capabilities { MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ MTK_RSTCTRL_PPE1 | MTK_SRAM) @@ -847,7 +847,7 @@ Signed-off-by: Daniel Golle struct mtk_tx_dma_desc_info { dma_addr_t addr; -@@ -1327,6 +1398,9 @@ struct mtk_mac { +@@ -1333,6 +1404,9 @@ struct mtk_mac { struct device_node *of_node; struct phylink *phylink; struct phylink_config phylink_config; @@ -857,7 +857,7 @@ Signed-off-by: Daniel Golle struct mtk_eth *hw; struct mtk_hw_stats *hw_stats; __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; -@@ -1450,6 +1524,19 @@ static inline u32 mtk_get_ib2_multicast_ +@@ -1456,6 +1530,19 @@ static inline u32 mtk_get_ib2_multicast_ return MTK_FOE_IB2_MULTICAST; } @@ -877,7 +877,7 @@ Signed-off-by: Daniel Golle /* read the hardware status register */ void mtk_stats_update_mac(struct mtk_mac *mac); -@@ -1458,8 +1545,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne +@@ -1464,8 +1551,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg); int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); diff --git a/target/linux/generic/pending-6.12/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch b/target/linux/generic/pending-6.12/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch index 5c8c24ddeb6..7ec342a20f4 100644 --- a/target/linux/generic/pending-6.12/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch +++ b/target/linux/generic/pending-6.12/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch @@ -30,8 +30,8 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -5637,7 +5637,7 @@ static const struct mtk_soc_data mt2701_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5482,7 +5482,7 @@ static const struct mtk_soc_data mt2701_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -39,8 +39,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5665,7 +5665,7 @@ static const struct mtk_soc_data mt7621_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5510,7 +5510,7 @@ static const struct mtk_soc_data mt7621_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -48,8 +48,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5695,7 +5695,7 @@ static const struct mtk_soc_data mt7622_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5540,7 +5540,7 @@ static const struct mtk_soc_data mt7622_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -57,8 +57,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5724,7 +5724,7 @@ static const struct mtk_soc_data mt7623_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5569,7 +5569,7 @@ static const struct mtk_soc_data mt7623_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -66,8 +66,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5750,7 +5750,7 @@ static const struct mtk_soc_data mt7629_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5595,7 +5595,7 @@ static const struct mtk_soc_data mt7629_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5782,7 +5782,7 @@ static const struct mtk_soc_data mt7981_ +@@ -5627,7 +5627,7 @@ static const struct mtk_soc_data mt7981_ .dma_l4_valid = RX_DMA_L4_VALID_V2, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, @@ -84,7 +84,7 @@ Signed-off-by: Felix Fietkau }, }; -@@ -5812,7 +5812,7 @@ static const struct mtk_soc_data mt7986_ +@@ -5657,7 +5657,7 @@ static const struct mtk_soc_data mt7986_ .dma_l4_valid = RX_DMA_L4_VALID_V2, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, @@ -93,7 +93,7 @@ Signed-off-by: Felix Fietkau }, }; -@@ -5865,7 +5865,7 @@ static const struct mtk_soc_data rt5350_ +@@ -5710,7 +5710,7 @@ static const struct mtk_soc_data rt5350_ .dma_l4_valid = RX_DMA_L4_VALID_PDMA, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, diff --git a/target/linux/generic/pending-6.12/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch b/target/linux/generic/pending-6.12/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch index f2e7fe88b40..26706de6ad8 100644 --- a/target/linux/generic/pending-6.12/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch +++ b/target/linux/generic/pending-6.12/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch @@ -25,7 +25,7 @@ Signed-off-by: Felix Fietkau help --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -4740,6 +4740,7 @@ static int mtk_get_sset_count(struct net +@@ -4588,6 +4588,7 @@ static int mtk_get_sset_count(struct net static void mtk_ethtool_pp_stats(struct mtk_eth *eth, u64 *data) { @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau struct page_pool_stats stats = {}; int i; -@@ -4752,6 +4753,7 @@ static void mtk_ethtool_pp_stats(struct +@@ -4600,6 +4601,7 @@ static void mtk_ethtool_pp_stats(struct page_pool_get_stats(ring->page_pool, &stats); } page_pool_ethtool_stats_get(data, &stats); diff --git a/target/linux/generic/pending-6.12/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch b/target/linux/generic/pending-6.12/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch index fce00c9e5f7..20a6a294497 100644 --- a/target/linux/generic/pending-6.12/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch +++ b/target/linux/generic/pending-6.12/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch @@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1924,6 +1924,13 @@ static netdev_tx_t mtk_start_xmit(struct +@@ -1778,6 +1778,13 @@ static netdev_tx_t mtk_start_xmit(struct bool gso = false; int tx_num; @@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau /* normally we can rely on the stack not calling this more than once, * however we have 2 queues running on the same ring so we need to lock * the ring access -@@ -1992,8 +1999,9 @@ send: +@@ -1841,8 +1848,9 @@ static netdev_tx_t mtk_start_xmit(struct drop: spin_unlock(ð->page_lock); diff --git a/target/linux/generic/pending-6.6/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch b/target/linux/generic/pending-6.6/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch new file mode 100644 index 00000000000..bd7a1b96f2a --- /dev/null +++ b/target/linux/generic/pending-6.6/732-02-net-ethernet-mtk_eth_soc-set-NETIF_F_ALL_TSO.patch @@ -0,0 +1,21 @@ +From: Felix Fietkau +Date: Fri, 28 Oct 2022 12:54:48 +0200 +Subject: [PATCH] net: ethernet: mtk_eth_soc: set NETIF_F_ALL_TSO + +Significantly improves performance by avoiding unnecessary segmentation + +Signed-off-by: Felix Fietkau +--- + +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -49,8 +49,7 @@ + #define MTK_HW_FEATURES (NETIF_F_IP_CSUM | \ + NETIF_F_RXCSUM | \ + NETIF_F_HW_VLAN_CTAG_TX | \ +- NETIF_F_SG | NETIF_F_TSO | \ +- NETIF_F_TSO6 | \ ++ NETIF_F_SG | NETIF_F_ALL_TSO | \ + NETIF_F_IPV6_CSUM |\ + NETIF_F_HW_TC) + #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) diff --git a/target/linux/generic/pending-6.6/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch b/target/linux/generic/pending-6.6/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch deleted file mode 100644 index 7004774b39a..00000000000 --- a/target/linux/generic/pending-6.6/732-03-net-ethernet-mtk_eth_soc-optimize-dma-ring-address-i.patch +++ /dev/null @@ -1,542 +0,0 @@ -From: Felix Fietkau -Date: Tue, 15 Oct 2024 12:52:56 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: optimize dma ring address/index - calculation - -Since DMA descriptor sizes are all power of 2, we can avoid costly integer -division in favor or simple shifts. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -43,6 +43,11 @@ MODULE_PARM_DESC(msg_level, "Message lev - offsetof(struct mtk_hw_stats, xdp_stats.x) / \ - sizeof(u64) } - -+#define RX_DESC_OFS(eth, i) \ -+ ((i) << (eth)->soc->rx.desc_shift) -+#define TX_DESC_OFS(eth, i) \ -+ ((i) << (eth)->soc->tx.desc_shift) -+ - static const struct mtk_reg_map mtk_reg_map = { - .tx_irq_mask = 0x1a1c, - .tx_irq_status = 0x1a18, -@@ -1150,23 +1155,28 @@ static void *mtk_max_lro_buf_alloc(gfp_t - static int mtk_init_fq_dma(struct mtk_eth *eth) - { - const struct mtk_soc_data *soc = eth->soc; -- dma_addr_t phy_ring_tail; -+ dma_addr_t phy_ring_tail, phy_ring_addr; - int cnt = soc->tx.fq_dma_size; - dma_addr_t dma_addr; -+ void *ring_addr; -+ u32 desc_size; - int i, j, len; - - if (MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM)) - eth->scratch_ring = eth->sram_base; - else - eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, -- cnt * soc->tx.desc_size, -+ TX_DESC_OFS(eth, cnt), - ð->phy_scratch_ring, - GFP_KERNEL); - - if (unlikely(!eth->scratch_ring)) - return -ENOMEM; - -- phy_ring_tail = eth->phy_scratch_ring + soc->tx.desc_size * (cnt - 1); -+ phy_ring_tail = eth->phy_scratch_ring + TX_DESC_OFS(eth, cnt - 1); -+ ring_addr = eth->scratch_ring; -+ phy_ring_addr = eth->phy_scratch_ring; -+ desc_size = TX_DESC_OFS(eth, 1); - - for (j = 0; j < DIV_ROUND_UP(soc->tx.fq_dma_size, MTK_FQ_DMA_LENGTH); j++) { - len = min_t(int, cnt - j * MTK_FQ_DMA_LENGTH, MTK_FQ_DMA_LENGTH); -@@ -1185,11 +1195,12 @@ static int mtk_init_fq_dma(struct mtk_et - for (i = 0; i < len; i++) { - struct mtk_tx_dma_v2 *txd; - -- txd = eth->scratch_ring + (j * MTK_FQ_DMA_LENGTH + i) * soc->tx.desc_size; -+ txd = ring_addr; -+ ring_addr += desc_size; -+ phy_ring_addr += desc_size; - txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; - if (j * MTK_FQ_DMA_LENGTH + i < cnt) -- txd->txd2 = eth->phy_scratch_ring + -- (j * MTK_FQ_DMA_LENGTH + i + 1) * soc->tx.desc_size; -+ txd->txd2 = eth->phy_scratch_ring + phy_ring_addr; - - txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); - if (MTK_HAS_CAPS(soc->caps, MTK_36BIT_DMA)) -@@ -1219,9 +1230,9 @@ static void *mtk_qdma_phys_to_virt(struc - } - - static struct mtk_tx_buf *mtk_desc_to_tx_buf(struct mtk_tx_ring *ring, -- void *txd, u32 txd_size) -+ void *txd, u32 txd_shift) - { -- int idx = (txd - ring->dma) / txd_size; -+ int idx = (txd - ring->dma) >> txd_shift; - - return &ring->buf[idx]; - } -@@ -1232,9 +1243,9 @@ static struct mtk_tx_dma *qdma_to_pdma(s - return ring->dma_pdma - (struct mtk_tx_dma *)ring->dma + dma; - } - --static int txd_to_idx(struct mtk_tx_ring *ring, void *dma, u32 txd_size) -+static int txd_to_idx(struct mtk_tx_ring *ring, void *dma, u32 txd_shift) - { -- return (dma - ring->dma) / txd_size; -+ return (dma - ring->dma) >> txd_shift; - } - - static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, -@@ -1442,7 +1453,7 @@ static int mtk_tx_map(struct sk_buff *sk - if (itxd == ring->last_free) - return -ENOMEM; - -- itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_size); -+ itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - memset(itx_buf, 0, sizeof(*itx_buf)); - - txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, -@@ -1496,7 +1507,7 @@ static int mtk_tx_map(struct sk_buff *sk - mtk_tx_set_dma_desc(dev, txd, &txd_info); - - tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_size); -+ soc->tx.desc_shift); - if (new_desc) - memset(tx_buf, 0, sizeof(*tx_buf)); - tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -@@ -1539,7 +1550,7 @@ static int mtk_tx_map(struct sk_buff *sk - } else { - int next_idx; - -- next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_size), -+ next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_shift), - ring->dma_size); - mtk_w32(eth, next_idx, MT7628_TX_CTX_IDX0); - } -@@ -1548,7 +1559,7 @@ static int mtk_tx_map(struct sk_buff *sk - - err_dma: - do { -- tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - - /* unmap dma */ - mtk_tx_unmap(eth, tx_buf, NULL, false); -@@ -1714,7 +1725,7 @@ static struct mtk_rx_ring *mtk_get_rx_ri - - ring = ð->rx_ring[i]; - idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); -- rxd = ring->dma + idx * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, idx); - if (rxd->rxd2 & RX_DMA_DONE) { - ring->calc_idx_update = true; - return ring; -@@ -1882,7 +1893,7 @@ static int mtk_xdp_submit_frame(struct m - } - htxd = txd; - -- tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, txd, soc->tx.desc_shift); - memset(tx_buf, 0, sizeof(*tx_buf)); - htx_buf = tx_buf; - -@@ -1901,7 +1912,7 @@ static int mtk_xdp_submit_frame(struct m - goto unmap; - - tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_size); -+ soc->tx.desc_shift); - memset(tx_buf, 0, sizeof(*tx_buf)); - n_desc++; - } -@@ -1939,7 +1950,7 @@ static int mtk_xdp_submit_frame(struct m - } else { - int idx; - -- idx = txd_to_idx(ring, txd, soc->tx.desc_size); -+ idx = txd_to_idx(ring, txd, soc->tx.desc_shift); - mtk_w32(eth, NEXT_DESP_IDX(idx, ring->dma_size), - MT7628_TX_CTX_IDX0); - } -@@ -1950,7 +1961,7 @@ static int mtk_xdp_submit_frame(struct m - - unmap: - while (htxd != txd) { -- tx_buf = mtk_desc_to_tx_buf(ring, htxd, soc->tx.desc_size); -+ tx_buf = mtk_desc_to_tx_buf(ring, htxd, soc->tx.desc_shift); - mtk_tx_unmap(eth, tx_buf, NULL, false); - - htxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; -@@ -2082,7 +2093,7 @@ static int mtk_poll_rx(struct napi_struc - goto rx_done; - - idx = NEXT_DESP_IDX(ring->calc_idx, ring->dma_size); -- rxd = ring->dma + idx * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, idx); - data = ring->data[idx]; - - if (!mtk_rx_get_desc(eth, &trxd, rxd)) -@@ -2346,7 +2357,7 @@ static int mtk_poll_tx_qdma(struct mtk_e - break; - - tx_buf = mtk_desc_to_tx_buf(ring, desc, -- eth->soc->tx.desc_size); -+ eth->soc->tx.desc_shift); - if (!tx_buf->data) - break; - -@@ -2397,7 +2408,7 @@ static int mtk_poll_tx_pdma(struct mtk_e - } - mtk_tx_unmap(eth, tx_buf, &bq, true); - -- desc = ring->dma + cpu * eth->soc->tx.desc_size; -+ desc = ring->dma + TX_DESC_OFS(eth, cpu); - ring->last_free = desc; - atomic_inc(&ring->free_count); - -@@ -2515,10 +2526,13 @@ static int mtk_tx_alloc(struct mtk_eth * - { - const struct mtk_soc_data *soc = eth->soc; - struct mtk_tx_ring *ring = ð->tx_ring; -- int i, sz = soc->tx.desc_size; - struct mtk_tx_dma_v2 *txd; -+ dma_addr_t desc_phys; -+ void *desc_addr; -+ u32 desc_size; - int ring_size; - u32 ofs, val; -+ int i; - - if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) - ring_size = MTK_QDMA_RING_SIZE; -@@ -2531,22 +2545,24 @@ static int mtk_tx_alloc(struct mtk_eth * - goto no_tx_mem; - - if (MTK_HAS_CAPS(soc->caps, MTK_SRAM)) { -- ring->dma = eth->sram_base + soc->tx.fq_dma_size * sz; -- ring->phys = eth->phy_scratch_ring + soc->tx.fq_dma_size * (dma_addr_t)sz; -+ ring->dma = eth->sram_base + TX_DESC_OFS(eth, soc->tx.fq_dma_size); -+ ring->phys = eth->phy_scratch_ring + TX_DESC_OFS(eth, soc->tx.fq_dma_size); - } else { -- ring->dma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, -+ ring->dma = dma_alloc_coherent(eth->dma_dev, TX_DESC_OFS(eth, ring_size), - &ring->phys, GFP_KERNEL); - } - - if (!ring->dma) - goto no_tx_mem; - -+ desc_addr = ring->dma; -+ desc_phys = ring->phys; -+ desc_size = TX_DESC_OFS(eth, 1); - for (i = 0; i < ring_size; i++) { -- int next = (i + 1) % ring_size; -- u32 next_ptr = ring->phys + next * sz; -- -- txd = ring->dma + i * sz; -- txd->txd2 = next_ptr; -+ txd = desc_addr; -+ desc_addr += desc_size; -+ desc_phys += desc_size; -+ txd->txd2 = desc_phys; - txd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - txd->txd4 = 0; - if (mtk_is_netsys_v2_or_greater(eth)) { -@@ -2562,7 +2578,7 @@ static int mtk_tx_alloc(struct mtk_eth * - * descriptors in ring->dma_pdma. - */ - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { -- ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, ring_size * sz, -+ ring->dma_pdma = dma_alloc_coherent(eth->dma_dev, TX_DESC_OFS(eth, ring_size), - &ring->phys_pdma, GFP_KERNEL); - if (!ring->dma_pdma) - goto no_tx_mem; -@@ -2577,7 +2593,7 @@ static int mtk_tx_alloc(struct mtk_eth * - atomic_set(&ring->free_count, ring_size - 2); - ring->next_free = ring->dma; - ring->last_free = (void *)txd; -- ring->last_free_ptr = (u32)(ring->phys + ((ring_size - 1) * sz)); -+ ring->last_free_ptr = (u32)(ring->phys + TX_DESC_OFS(eth, ring_size - 1)); - ring->thresh = MAX_SKB_FRAGS; - - /* make sure that all changes to the dma ring are flushed before we -@@ -2589,7 +2605,7 @@ static int mtk_tx_alloc(struct mtk_eth * - mtk_w32(eth, ring->phys, soc->reg_map->qdma.ctx_ptr); - mtk_w32(eth, ring->phys, soc->reg_map->qdma.dtx_ptr); - mtk_w32(eth, -- ring->phys + ((ring_size - 1) * sz), -+ ring->phys + TX_DESC_OFS(eth, ring_size - 1), - soc->reg_map->qdma.crx_ptr); - mtk_w32(eth, ring->last_free_ptr, soc->reg_map->qdma.drx_ptr); - -@@ -2638,14 +2654,14 @@ static void mtk_tx_clean(struct mtk_eth - } - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && ring->dma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * soc->tx.desc_size, -+ TX_DESC_OFS(eth, ring->dma_size), - ring->dma, ring->phys); - ring->dma = NULL; - } - - if (ring->dma_pdma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * soc->tx.desc_size, -+ TX_DESC_OFS(eth, ring->dma_size), - ring->dma_pdma, ring->phys_pdma); - ring->dma_pdma = NULL; - } -@@ -2701,15 +2717,13 @@ static int mtk_rx_alloc(struct mtk_eth * - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SRAM) || - rx_flag != MTK_RX_FLAGS_NORMAL) { - ring->dma = dma_alloc_coherent(eth->dma_dev, -- rx_dma_size * eth->soc->rx.desc_size, -+ RX_DESC_OFS(eth, rx_dma_size), - &ring->phys, GFP_KERNEL); - } else { - struct mtk_tx_ring *tx_ring = ð->tx_ring; - -- ring->dma = tx_ring->dma + tx_ring_size * -- eth->soc->tx.desc_size * (ring_no + 1); -- ring->phys = tx_ring->phys + tx_ring_size * -- eth->soc->tx.desc_size * (ring_no + 1); -+ ring->dma = tx_ring->dma + TX_DESC_OFS(eth, tx_ring_size * (ring_no + 1)); -+ ring->phys = tx_ring->phys + TX_DESC_OFS(eth, tx_ring_size * (ring_no + 1)); - } - - if (!ring->dma) -@@ -2720,7 +2734,7 @@ static int mtk_rx_alloc(struct mtk_eth * - dma_addr_t dma_addr; - void *data; - -- rxd = ring->dma + i * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, i); - if (ring->page_pool) { - data = mtk_page_pool_get_buff(ring->page_pool, - &dma_addr, GFP_KERNEL); -@@ -2811,7 +2825,7 @@ static void mtk_rx_clean(struct mtk_eth - if (!ring->data[i]) - continue; - -- rxd = ring->dma + i * eth->soc->rx.desc_size; -+ rxd = ring->dma + RX_DESC_OFS(eth, i); - if (!rxd->rxd1) - continue; - -@@ -2828,7 +2842,7 @@ static void mtk_rx_clean(struct mtk_eth - - if (!in_sram && ring->dma) { - dma_free_coherent(eth->dma_dev, -- ring->dma_size * eth->soc->rx.desc_size, -+ RX_DESC_OFS(eth, ring->dma_size), - ring->dma, ring->phys); - ring->dma = NULL; - } -@@ -3199,7 +3213,7 @@ static void mtk_dma_free(struct mtk_eth - - if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { - dma_free_coherent(eth->dma_dev, -- MTK_QDMA_RING_SIZE * soc->tx.desc_size, -+ TX_DESC_OFS(eth, MTK_QDMA_RING_SIZE), - eth->scratch_ring, eth->phy_scratch_ring); - eth->scratch_ring = NULL; - eth->phy_scratch_ring = 0; -@@ -5220,6 +5234,9 @@ static int mtk_remove(struct platform_de - return 0; - } - -+#define DESC_SIZE(struct_name) \ -+ .desc_shift = const_ilog2(sizeof(struct_name)) -+ - static const struct mtk_soc_data mt2701_data = { - .reg_map = &mtk_reg_map, - .caps = MT7623_CAPS | MTK_HWLRO, -@@ -5228,14 +5245,14 @@ static const struct mtk_soc_data mt2701_ - .required_pctl = true, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5256,14 +5273,14 @@ static const struct mtk_soc_data mt7621_ - .hash_offset = 2, - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5286,14 +5303,14 @@ static const struct mtk_soc_data mt7622_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5315,14 +5332,14 @@ static const struct mtk_soc_data mt7623_ - .foe_entry_size = MTK_FOE_ENTRY_V1_SIZE, - .disable_pll_modes = true, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5341,14 +5358,14 @@ static const struct mtk_soc_data mt7629_ - .has_accounting = true, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), -@@ -5371,14 +5388,14 @@ static const struct mtk_soc_data mt7981_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN, -@@ -5401,14 +5418,14 @@ static const struct mtk_soc_data mt7986_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V2_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN, -@@ -5431,14 +5448,14 @@ static const struct mtk_soc_data mt7988_ - .has_accounting = true, - .foe_entry_size = MTK_FOE_ENTRY_V3_SIZE, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma_v2), -+ DESC_SIZE(struct mtk_tx_dma_v2), - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, - .dma_len_offset = 8, - .dma_size = MTK_DMA_SIZE(2K), - .fq_dma_size = MTK_DMA_SIZE(4K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma_v2), -+ DESC_SIZE(struct mtk_rx_dma_v2), - .irq_done_mask = MTK_RX_DONE_INT_V2, - .dma_l4_valid = RX_DMA_L4_VALID_V2, - .dma_max_len = MTK_TX_DMA_BUF_LEN_V2, -@@ -5455,13 +5472,13 @@ static const struct mtk_soc_data rt5350_ - .required_pctl = false, - .version = 1, - .tx = { -- .desc_size = sizeof(struct mtk_tx_dma), -+ DESC_SIZE(struct mtk_tx_dma), - .dma_max_len = MTK_TX_DMA_BUF_LEN, - .dma_len_offset = 16, - .dma_size = MTK_DMA_SIZE(2K), - }, - .rx = { -- .desc_size = sizeof(struct mtk_rx_dma), -+ DESC_SIZE(struct mtk_rx_dma), - .irq_done_mask = MTK_RX_DONE_INT, - .dma_l4_valid = RX_DMA_L4_VALID_PDMA, - .dma_max_len = MTK_TX_DMA_BUF_LEN, ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -1174,7 +1174,7 @@ struct mtk_reg_map { - * @foe_entry_size Foe table entry size. - * @has_accounting Bool indicating support for accounting of - * offloaded flows. -- * @desc_size Tx/Rx DMA descriptor size. -+ * @desc_shift Tx/Rx DMA descriptor size (in power-of-2). - * @irq_done_mask Rx irq done register mask. - * @dma_l4_valid Rx DMA valid register mask. - * @dma_max_len Max DMA tx/rx buffer length. -@@ -1195,14 +1195,14 @@ struct mtk_soc_data { - bool has_accounting; - bool disable_pll_modes; - struct { -- u32 desc_size; -+ u32 desc_shift; - u32 dma_max_len; - u32 dma_len_offset; - u32 dma_size; - u32 fq_dma_size; - } tx; - struct { -- u32 desc_size; -+ u32 desc_shift; - u32 irq_done_mask; - u32 dma_l4_valid; - u32 dma_max_len; diff --git a/target/linux/generic/pending-6.6/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch b/target/linux/generic/pending-6.6/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch deleted file mode 100644 index eb71f954ad2..00000000000 --- a/target/linux/generic/pending-6.6/732-04-net-ethernet-mtk_eth_soc-shrink-struct-mtk_tx_buf.patch +++ /dev/null @@ -1,124 +0,0 @@ -From: Felix Fietkau -Date: Mon, 14 Jul 2025 10:52:59 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: shrink struct mtk_tx_buf - -There is no need to track the difference between dma_map_page -and dma_map_single, since they're unmapped in exactly the same way. -Also reorder fields in order to avoid padding. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1251,32 +1251,19 @@ static int txd_to_idx(struct mtk_tx_ring - static void mtk_tx_unmap(struct mtk_eth *eth, struct mtk_tx_buf *tx_buf, - struct xdp_frame_bulk *bq, bool napi) - { -- if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) { -- if (tx_buf->flags & MTK_TX_FLAGS_SINGLE0) { -- dma_unmap_single(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } else if (tx_buf->flags & MTK_TX_FLAGS_PAGE0) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } -- } else { -- if (dma_unmap_len(tx_buf, dma_len0)) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr0), -- dma_unmap_len(tx_buf, dma_len0), -- DMA_TO_DEVICE); -- } -+ if (dma_unmap_len(tx_buf, dma_len0)) { -+ dma_unmap_page(eth->dma_dev, -+ dma_unmap_addr(tx_buf, dma_addr0), -+ dma_unmap_len(tx_buf, dma_len0), -+ DMA_TO_DEVICE); -+ } - -- if (dma_unmap_len(tx_buf, dma_len1)) { -- dma_unmap_page(eth->dma_dev, -- dma_unmap_addr(tx_buf, dma_addr1), -- dma_unmap_len(tx_buf, dma_len1), -- DMA_TO_DEVICE); -- } -+ if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA) && -+ dma_unmap_len(tx_buf, dma_len1)) { -+ dma_unmap_page(eth->dma_dev, -+ dma_unmap_addr(tx_buf, dma_addr1), -+ dma_unmap_len(tx_buf, dma_len1), -+ DMA_TO_DEVICE); - } - - if (tx_buf->data && tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) { -@@ -1298,7 +1285,6 @@ static void mtk_tx_unmap(struct mtk_eth - xdp_return_frame(xdpf); - } - } -- tx_buf->flags = 0; - tx_buf->data = NULL; - } - -@@ -1463,7 +1449,6 @@ static int mtk_tx_map(struct sk_buff *sk - - mtk_tx_set_dma_desc(dev, itxd, &txd_info); - -- itx_buf->flags |= MTK_TX_FLAGS_SINGLE0; - itx_buf->mac_id = mac->id; - setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, - k++); -@@ -1511,7 +1496,6 @@ static int mtk_tx_map(struct sk_buff *sk - if (new_desc) - memset(tx_buf, 0, sizeof(*tx_buf)); - tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -- tx_buf->flags |= MTK_TX_FLAGS_PAGE0; - tx_buf->mac_id = mac->id; - - setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, -@@ -1836,8 +1820,6 @@ static int mtk_xdp_frame_map(struct mtk_ - txd_info->size, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(eth->dma_dev, txd_info->addr))) - return -ENOMEM; -- -- tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; - } else { - struct page *page = virt_to_head_page(data); - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -701,14 +701,6 @@ struct mtk_hw_stats { - struct u64_stats_sync syncp; - }; - --enum mtk_tx_flags { -- /* PDMA descriptor can point at 1-2 segments. This enum allows us to -- * track how memory was allocated so that it can be freed properly. -- */ -- MTK_TX_FLAGS_SINGLE0 = 0x01, -- MTK_TX_FLAGS_PAGE0 = 0x02, --}; -- - /* This enum allows us to identify how the clock is defined on the array of the - * clock in the order - */ -@@ -895,13 +887,12 @@ enum mtk_tx_buf_type { - */ - struct mtk_tx_buf { - enum mtk_tx_buf_type type; -+ u16 mac_id; - void *data; - -- u16 mac_id; -- u16 flags; - DEFINE_DMA_UNMAP_ADDR(dma_addr0); -- DEFINE_DMA_UNMAP_LEN(dma_len0); - DEFINE_DMA_UNMAP_ADDR(dma_addr1); -+ DEFINE_DMA_UNMAP_LEN(dma_len0); - DEFINE_DMA_UNMAP_LEN(dma_len1); - }; - diff --git a/target/linux/generic/pending-6.6/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch b/target/linux/generic/pending-6.6/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch deleted file mode 100644 index 9a9055ad242..00000000000 --- a/target/linux/generic/pending-6.6/732-05-net-ethernet-mtk_eth_soc-add-support-for-sending-fra.patch +++ /dev/null @@ -1,303 +0,0 @@ -From: Felix Fietkau -Date: Mon, 14 Jul 2025 10:41:27 +0200 -Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for sending - fraglist GSO packets - -When primarily forwarding traffic, TCP fraglist GRO can be noticeably more -efficient than regular TCP GRO. In order to avoid the overhead of -unnecessary segmentation on ethernet tx, add support for sending fraglist -GRO packets. - -Signed-off-by: Felix Fietkau ---- - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1409,29 +1409,70 @@ static void mtk_tx_set_dma_desc(struct n - mtk_tx_set_dma_desc_v1(dev, txd, info); - } - -+struct mtk_tx_map_state { -+ struct mtk_tx_dma *txd, *txd_pdma; -+ struct mtk_tx_buf *tx_buf; -+ int nbuf; -+ int ndesc; -+}; -+ -+static int -+mtk_tx_map_info(struct mtk_eth *eth, struct mtk_tx_ring *ring, -+ struct net_device *dev, struct mtk_tx_map_state *state, -+ struct mtk_tx_dma_desc_info *txd_info) -+{ -+ const struct mtk_soc_data *soc = eth->soc; -+ struct mtk_tx_dma *txd_pdma = state->txd_pdma; -+ struct mtk_tx_buf *tx_buf = state->tx_buf; -+ struct mtk_tx_dma *txd = state->txd; -+ struct mtk_mac *mac = netdev_priv(dev); -+ -+ if (state->nbuf && -+ (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || (state->nbuf & 1) == 0)) { -+ txd = state->txd = mtk_qdma_phys_to_virt(ring, txd->txd2); -+ txd_pdma = state->txd_pdma = qdma_to_pdma(ring, txd); -+ if (state->txd == ring->last_free) -+ return -1; -+ -+ tx_buf = mtk_desc_to_tx_buf(ring, state->txd, -+ soc->tx.desc_shift); -+ state->tx_buf = tx_buf; -+ memset(tx_buf, 0, sizeof(*tx_buf)); -+ state->ndesc++; -+ } -+ -+ mtk_tx_set_dma_desc(dev, txd, txd_info); -+ tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -+ tx_buf->mac_id = mac->id; -+ -+ setup_tx_buf(eth, tx_buf, txd_pdma, txd_info->addr, -+ txd_info->size, state->nbuf++); -+ return 0; -+} -+ - static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, - int tx_num, struct mtk_tx_ring *ring, bool gso) - { - struct mtk_tx_dma_desc_info txd_info = { -- .size = skb_headlen(skb), - .gso = gso, -- .csum = skb->ip_summed == CHECKSUM_PARTIAL, -+ .csum = skb->ip_summed == CHECKSUM_PARTIAL || gso, - .vlan = skb_vlan_tag_present(skb), -- .qid = skb_get_queue_mapping(skb), - .vlan_tci = skb_vlan_tag_get(skb), - .first = true, -- .last = !skb_is_nonlinear(skb), -+ }; -+ struct mtk_tx_map_state state = { -+ .ndesc = 1, - }; - struct netdev_queue *txq; - struct mtk_mac *mac = netdev_priv(dev); - struct mtk_eth *eth = mac->hw; - const struct mtk_soc_data *soc = eth->soc; -- struct mtk_tx_dma *itxd, *txd; -- struct mtk_tx_dma *itxd_pdma, *txd_pdma; -- struct mtk_tx_buf *itx_buf, *tx_buf; -- int i, n_desc = 1; -+ struct mtk_tx_dma *itxd, *itxd_pdma; -+ struct mtk_tx_buf *itx_buf; -+ struct sk_buff *cur_skb, *next_skb; - int queue = skb_get_queue_mapping(skb); -- int k = 0; -+ unsigned int offset = 0; -+ int i, frag_size; - - txq = netdev_get_tx_queue(dev, queue); - itxd = ring->next_free; -@@ -1442,86 +1483,81 @@ static int mtk_tx_map(struct sk_buff *sk - itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - memset(itx_buf, 0, sizeof(*itx_buf)); - -- txd_info.addr = dma_map_single(eth->dma_dev, skb->data, txd_info.size, -- DMA_TO_DEVICE); -- if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) -- return -ENOMEM; -- -- mtk_tx_set_dma_desc(dev, itxd, &txd_info); -- -- itx_buf->mac_id = mac->id; -- setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size, -- k++); -- -- /* TX SG offload */ -- txd = itxd; -- txd_pdma = qdma_to_pdma(ring, txd); -- -- for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { -- skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; -- unsigned int offset = 0; -- int frag_size = skb_frag_size(frag); -- -+ cur_skb = skb; -+ next_skb = skb_shinfo(skb)->frag_list; -+ state.txd = itxd; -+ state.txd_pdma = itxd_pdma; -+ state.tx_buf = itx_buf; -+ -+next: -+ txd_info.qid = queue; -+ frag_size = skb_headlen(cur_skb); -+ -+ while (frag_size) { -+ txd_info.size = min_t(unsigned int, frag_size, -+ soc->tx.dma_max_len); -+ txd_info.addr = dma_map_single(eth->dma_dev, cur_skb->data + offset, -+ txd_info.size, DMA_TO_DEVICE); -+ if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) -+ goto err_dma; -+ -+ frag_size -= txd_info.size; -+ offset += txd_info.size; -+ txd_info.last = !skb_is_nonlinear(cur_skb) && !next_skb && -+ !frag_size; -+ if (mtk_tx_map_info(eth, ring, dev, &state, &txd_info) < 0) -+ goto err_dma; -+ -+ txd_info.first = false; -+ } -+ -+ for (i = 0; i < skb_shinfo(cur_skb)->nr_frags; i++) { -+ skb_frag_t *frag = &skb_shinfo(cur_skb)->frags[i]; -+ -+ frag_size = skb_frag_size(frag); -+ memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); -+ txd_info.qid = queue; -+ offset = 0; - while (frag_size) { -- bool new_desc = true; -- -- if (MTK_HAS_CAPS(soc->caps, MTK_QDMA) || -- (i & 0x1)) { -- txd = mtk_qdma_phys_to_virt(ring, txd->txd2); -- txd_pdma = qdma_to_pdma(ring, txd); -- if (txd == ring->last_free) -- goto err_dma; -- -- n_desc++; -- } else { -- new_desc = false; -- } -- -- memset(&txd_info, 0, sizeof(struct mtk_tx_dma_desc_info)); - txd_info.size = min_t(unsigned int, frag_size, - soc->tx.dma_max_len); -- txd_info.qid = queue; -- txd_info.last = i == skb_shinfo(skb)->nr_frags - 1 && -- !(frag_size - txd_info.size); -- txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, -- offset, txd_info.size, -- DMA_TO_DEVICE); -+ txd_info.addr = skb_frag_dma_map(eth->dma_dev, frag, offset, -+ txd_info.size, DMA_TO_DEVICE); - if (unlikely(dma_mapping_error(eth->dma_dev, txd_info.addr))) - goto err_dma; - -- mtk_tx_set_dma_desc(dev, txd, &txd_info); -- -- tx_buf = mtk_desc_to_tx_buf(ring, txd, -- soc->tx.desc_shift); -- if (new_desc) -- memset(tx_buf, 0, sizeof(*tx_buf)); -- tx_buf->data = (void *)MTK_DMA_DUMMY_DESC; -- tx_buf->mac_id = mac->id; -- -- setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr, -- txd_info.size, k++); -- - frag_size -= txd_info.size; - offset += txd_info.size; -+ txd_info.last = i == skb_shinfo(cur_skb)->nr_frags - 1 && -+ !frag_size && !next_skb; -+ if (mtk_tx_map_info(eth, ring, dev, &state, &txd_info) < 0) -+ goto err_dma; - } - } - -+ if (next_skb) { -+ cur_skb = next_skb; -+ next_skb = cur_skb->next; -+ memset(&txd_info, 0, sizeof(txd_info)); -+ goto next; -+ } -+ - /* store skb to cleanup */ - itx_buf->type = MTK_TYPE_SKB; - itx_buf->data = skb; - - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { -- if (k & 0x1) -- txd_pdma->txd2 |= TX_DMA_LS0; -+ if (state.nbuf & 0x1) -+ state.txd_pdma->txd2 |= TX_DMA_LS0; - else -- txd_pdma->txd2 |= TX_DMA_LS1; -+ state.txd_pdma->txd2 |= TX_DMA_LS1; - } - - netdev_tx_sent_queue(txq, skb->len); - skb_tx_timestamp(skb); - -- ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); -- atomic_sub(n_desc, &ring->free_count); -+ ring->next_free = mtk_qdma_phys_to_virt(ring, state.txd->txd2); -+ atomic_sub(state.ndesc, &ring->free_count); - - /* make sure that all changes to the dma ring are flushed before we - * continue -@@ -1530,11 +1566,11 @@ static int mtk_tx_map(struct sk_buff *sk - - if (MTK_HAS_CAPS(soc->caps, MTK_QDMA)) { - if (netif_xmit_stopped(txq) || !netdev_xmit_more()) -- mtk_w32(eth, txd->txd2, soc->reg_map->qdma.ctx_ptr); -+ mtk_w32(eth, state.txd->txd2, soc->reg_map->qdma.ctx_ptr); - } else { - int next_idx; - -- next_idx = NEXT_DESP_IDX(txd_to_idx(ring, txd, soc->tx.desc_shift), -+ next_idx = NEXT_DESP_IDX(txd_to_idx(ring, state.txd, soc->tx.desc_shift), - ring->dma_size); - mtk_w32(eth, next_idx, MT7628_TX_CTX_IDX0); - } -@@ -1543,10 +1579,10 @@ static int mtk_tx_map(struct sk_buff *sk - - err_dma: - do { -- tx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); -+ itx_buf = mtk_desc_to_tx_buf(ring, itxd, soc->tx.desc_shift); - - /* unmap dma */ -- mtk_tx_unmap(eth, tx_buf, NULL, false); -+ mtk_tx_unmap(eth, itx_buf, NULL, false); - - itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU; - if (!MTK_HAS_CAPS(soc->caps, MTK_QDMA)) -@@ -1554,7 +1590,7 @@ err_dma: - - itxd = mtk_qdma_phys_to_virt(ring, itxd->txd2); - itxd_pdma = qdma_to_pdma(ring, itxd); -- } while (itxd != txd); -+ } while (itxd != state.txd); - - return -ENOMEM; - } -@@ -1574,6 +1610,9 @@ static int mtk_cal_txd_req(struct mtk_et - nfrags += skb_shinfo(skb)->nr_frags; - } - -+ for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) -+ nfrags += mtk_cal_txd_req(eth, skb); -+ - return nfrags; - } - -@@ -1614,6 +1653,10 @@ static bool mtk_skb_has_small_frag(struc - if (skb_frag_size(&skb_shinfo(skb)->frags[i]) < min_size) - return true; - -+ for (skb = skb_shinfo(skb)->frag_list; skb; skb = skb->next) -+ if (mtk_skb_has_small_frag(skb)) -+ return true; -+ - return false; - } - ---- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h -+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -51,6 +51,8 @@ - NETIF_F_HW_VLAN_CTAG_TX | \ - NETIF_F_SG | NETIF_F_TSO | \ - NETIF_F_TSO6 | \ -+ NETIF_F_FRAGLIST | \ -+ NETIF_F_GSO_FRAGLIST | \ - NETIF_F_IPV6_CSUM |\ - NETIF_F_HW_TC) - #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) diff --git a/target/linux/generic/pending-6.6/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch b/target/linux/generic/pending-6.6/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch index 9629fa61285..a2a10d14170 100644 --- a/target/linux/generic/pending-6.6/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch +++ b/target/linux/generic/pending-6.6/733-01-net-ethernet-mtk_eth_soc-use-napi_build_skb.patch @@ -10,7 +10,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -2186,7 +2186,7 @@ static int mtk_poll_rx(struct napi_struc +@@ -2150,7 +2150,7 @@ static int mtk_poll_rx(struct napi_struc if (ret != XDP_PASS) goto skip_rx; @@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau if (unlikely(!skb)) { page_pool_put_full_page(ring->page_pool, page, true); -@@ -2224,7 +2224,7 @@ static int mtk_poll_rx(struct napi_struc +@@ -2188,7 +2188,7 @@ static int mtk_poll_rx(struct napi_struc dma_unmap_single(eth->dma_dev, ((u64)trxd.rxd1 | addr64), ring->buf_size, DMA_FROM_DEVICE); diff --git a/target/linux/generic/pending-6.6/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch b/target/linux/generic/pending-6.6/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch index eeb0620eb0e..7274c4a817d 100644 --- a/target/linux/generic/pending-6.6/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch +++ b/target/linux/generic/pending-6.6/734-net-ethernet-mediatek-enlarge-DMA-reserve-buffer.patch @@ -15,7 +15,7 @@ Signed-off-by: Chad Monroe --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -@@ -282,6 +282,7 @@ +@@ -279,6 +279,7 @@ #define MTK_WCOMP_EN BIT(24) #define MTK_RESV_BUF (0x80 << 16) #define MTK_MUTLI_CNT (0x4 << 12) @@ -25,7 +25,7 @@ Signed-off-by: Chad Monroe /* QDMA Flow Control Register */ --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -3362,12 +3362,14 @@ static int mtk_start_dma(struct mtk_eth +@@ -3323,12 +3323,14 @@ static int mtk_start_dma(struct mtk_eth MTK_TX_BT_32DWORDS | MTK_NDP_CO_PRO | MTK_RX_2B_OFFSET | MTK_TX_WB_DDONE; diff --git a/target/linux/generic/pending-6.6/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch b/target/linux/generic/pending-6.6/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch index 412fc4fcded..392e94dc8a9 100644 --- a/target/linux/generic/pending-6.6/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch +++ b/target/linux/generic/pending-6.6/737-net-ethernet-mtk_eth_soc-add-paths-and-SerDes-modes-.patch @@ -214,7 +214,7 @@ Signed-off-by: Daniel Golle #include #include #include -@@ -275,12 +277,8 @@ static const char * const mtk_clks_sourc +@@ -270,12 +272,8 @@ static const char * const mtk_clks_sourc "ethwarp_wocpu2", "ethwarp_wocpu1", "ethwarp_wocpu0", @@ -227,7 +227,7 @@ Signed-off-by: Daniel Golle "top_eth_gmii_sel", "top_eth_refck_50m_sel", "top_eth_sys_200m_sel", -@@ -523,6 +521,30 @@ static void mtk_setup_bridge_switch(stru +@@ -518,6 +516,30 @@ static void mtk_setup_bridge_switch(stru MTK_GSW_CFG); } @@ -258,7 +258,7 @@ Signed-off-by: Daniel Golle static struct phylink_pcs *mtk_mac_select_pcs(struct phylink_config *config, phy_interface_t interface) { -@@ -531,6 +553,21 @@ static struct phylink_pcs *mtk_mac_selec +@@ -526,6 +548,21 @@ static struct phylink_pcs *mtk_mac_selec struct mtk_eth *eth = mac->hw; unsigned int sid; @@ -280,7 +280,7 @@ Signed-off-by: Daniel Golle if (interface == PHY_INTERFACE_MODE_SGMII || phy_interface_mode_is_8023z(interface)) { sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ? -@@ -582,7 +619,22 @@ static void mtk_mac_config(struct phylin +@@ -577,7 +614,22 @@ static void mtk_mac_config(struct phylin goto init_err; } break; @@ -303,7 +303,7 @@ Signed-off-by: Daniel Golle break; default: goto err_phy; -@@ -629,8 +681,6 @@ static void mtk_mac_config(struct phylin +@@ -624,8 +676,6 @@ static void mtk_mac_config(struct phylin val &= ~SYSCFG0_GE_MODE(SYSCFG0_GE_MASK, mac->id); val |= SYSCFG0_GE_MODE(ge_mode, mac->id); regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val); @@ -312,7 +312,7 @@ Signed-off-by: Daniel Golle } /* SGMII */ -@@ -647,21 +697,40 @@ static void mtk_mac_config(struct phylin +@@ -642,21 +692,40 @@ static void mtk_mac_config(struct phylin /* Save the syscfg0 value for mac_finish */ mac->syscfg0 = val; @@ -360,7 +360,7 @@ Signed-off-by: Daniel Golle return; err_phy: -@@ -674,6 +743,18 @@ init_err: +@@ -669,6 +738,18 @@ init_err: mac->id, phy_modes(state->interface), err); } @@ -379,7 +379,7 @@ Signed-off-by: Daniel Golle static int mtk_mac_finish(struct phylink_config *config, unsigned int mode, phy_interface_t interface) { -@@ -682,6 +763,10 @@ static int mtk_mac_finish(struct phylink +@@ -677,6 +758,10 @@ static int mtk_mac_finish(struct phylink struct mtk_eth *eth = mac->hw; u32 mcr_cur, mcr_new; @@ -390,7 +390,7 @@ Signed-off-by: Daniel Golle /* Enable SGMII */ if (interface == PHY_INTERFACE_MODE_SGMII || phy_interface_mode_is_8023z(interface)) -@@ -706,10 +791,14 @@ static void mtk_mac_link_down(struct phy +@@ -701,10 +786,14 @@ static void mtk_mac_link_down(struct phy { struct mtk_mac *mac = container_of(config, struct mtk_mac, phylink_config); @@ -408,7 +408,7 @@ Signed-off-by: Daniel Golle } static void mtk_set_queue_speed(struct mtk_eth *eth, unsigned int idx, -@@ -781,13 +870,11 @@ static void mtk_set_queue_speed(struct m +@@ -776,13 +865,11 @@ static void mtk_set_queue_speed(struct m mtk_w32(eth, val, soc->reg_map->qdma.qtx_sch + ofs); } @@ -426,7 +426,7 @@ Signed-off-by: Daniel Golle u32 mcr; mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id)); -@@ -831,9 +918,63 @@ static void mtk_mac_link_up(struct phyli +@@ -826,9 +913,63 @@ static void mtk_mac_link_up(struct phyli mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id)); } @@ -490,7 +490,7 @@ Signed-off-by: Daniel Golle .mac_finish = mtk_mac_finish, .mac_link_down = mtk_mac_link_down, .mac_link_up = mtk_mac_link_up, -@@ -3470,6 +3611,9 @@ static int mtk_open(struct net_device *d +@@ -3431,6 +3572,9 @@ static int mtk_open(struct net_device *d ppe_num = eth->soc->ppe_num; @@ -500,7 +500,7 @@ Signed-off-by: Daniel Golle err = phylink_of_phy_connect(mac->phylink, mac->of_node, 0); if (err) { netdev_err(dev, "%s: could not attach PHY: %d\n", __func__, -@@ -3620,6 +3764,9 @@ static int mtk_stop(struct net_device *d +@@ -3581,6 +3725,9 @@ static int mtk_stop(struct net_device *d for (i = 0; i < ARRAY_SIZE(eth->ppe); i++) mtk_ppe_stop(eth->ppe[i]); @@ -510,7 +510,7 @@ Signed-off-by: Daniel Golle return 0; } -@@ -4706,6 +4853,7 @@ static const struct net_device_ops mtk_n +@@ -4667,6 +4814,7 @@ static const struct net_device_ops mtk_n static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np) { const __be32 *_id = of_get_property(np, "reg", NULL); @@ -518,7 +518,7 @@ Signed-off-by: Daniel Golle phy_interface_t phy_mode; struct phylink *phylink; struct mtk_mac *mac; -@@ -4744,16 +4892,41 @@ static int mtk_add_mac(struct mtk_eth *e +@@ -4705,16 +4853,41 @@ static int mtk_add_mac(struct mtk_eth *e mac->id = id; mac->hw = eth; mac->of_node = np; @@ -568,7 +568,7 @@ Signed-off-by: Daniel Golle } memset(mac->hwlro_ip, 0, sizeof(mac->hwlro_ip)); -@@ -4836,8 +5009,21 @@ static int mtk_add_mac(struct mtk_eth *e +@@ -4797,8 +4970,21 @@ static int mtk_add_mac(struct mtk_eth *e phy_interface_zero(mac->phylink_config.supported_interfaces); __set_bit(PHY_INTERFACE_MODE_INTERNAL, mac->phylink_config.supported_interfaces); @@ -590,7 +590,7 @@ Signed-off-by: Daniel Golle phylink = phylink_create(&mac->phylink_config, of_fwnode_handle(mac->of_node), phy_mode, &mtk_phylink_ops); -@@ -4888,6 +5074,26 @@ free_netdev: +@@ -4849,6 +5035,26 @@ free_netdev: return err; } @@ -617,7 +617,7 @@ Signed-off-by: Daniel Golle void mtk_eth_set_dma_device(struct mtk_eth *eth, struct device *dma_dev) { struct net_device *dev, *tmp; -@@ -5034,7 +5240,8 @@ static int mtk_probe(struct platform_dev +@@ -4995,7 +5201,8 @@ static int mtk_probe(struct platform_dev regmap_write(cci, 0, 3); } @@ -627,7 +627,7 @@ Signed-off-by: Daniel Golle err = mtk_sgmii_init(eth); if (err) -@@ -5145,6 +5352,24 @@ static int mtk_probe(struct platform_dev +@@ -5106,6 +5313,24 @@ static int mtk_probe(struct platform_dev } } @@ -652,7 +652,7 @@ Signed-off-by: Daniel Golle if (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_INT)) { err = devm_request_irq(eth->dev, eth->irq[0], mtk_handle_irq, 0, -@@ -5248,6 +5473,11 @@ static int mtk_remove(struct platform_de +@@ -5209,6 +5434,11 @@ static int mtk_remove(struct platform_de mtk_stop(eth->netdev[i]); mac = netdev_priv(eth->netdev[i]); phylink_disconnect_phy(mac->phylink); @@ -674,7 +674,7 @@ Signed-off-by: Daniel Golle #include #include #include -@@ -527,6 +528,21 @@ +@@ -524,6 +525,21 @@ #define INTF_MODE_RGMII_1000 (TRGMII_MODE | TRGMII_CENTRAL_ALIGNED) #define INTF_MODE_RGMII_10_100 0 @@ -696,7 +696,7 @@ Signed-off-by: Daniel Golle /* GPIO port control registers for GMAC 2*/ #define GPIO_OD33_CTRL8 0x4c0 #define GPIO_BIAS_CTRL 0xed0 -@@ -552,6 +568,7 @@ +@@ -549,6 +565,7 @@ #define SYSCFG0_SGMII_GMAC2 ((3 << 8) & SYSCFG0_SGMII_MASK) #define SYSCFG0_SGMII_GMAC1_V2 BIT(9) #define SYSCFG0_SGMII_GMAC2_V2 BIT(8) @@ -704,7 +704,7 @@ Signed-off-by: Daniel Golle /* ethernet subsystem clock register */ -@@ -590,6 +607,11 @@ +@@ -587,6 +604,11 @@ #define GEPHY_MAC_SEL BIT(1) /* Top misc registers */ @@ -716,7 +716,7 @@ Signed-off-by: Daniel Golle #define USB_PHY_SWITCH_REG 0x218 #define QPHY_SEL_MASK GENMASK(1, 0) #define SGMII_QPHY_SEL 0x2 -@@ -614,6 +636,8 @@ +@@ -611,6 +633,8 @@ #define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) #define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) @@ -725,7 +725,7 @@ Signed-off-by: Daniel Golle #define MTK_FE_CDM1_FSM 0x220 #define MTK_FE_CDM2_FSM 0x224 #define MTK_FE_CDM3_FSM 0x238 -@@ -622,6 +646,11 @@ +@@ -619,6 +643,11 @@ #define MTK_FE_CDM6_FSM 0x328 #define MTK_FE_GDM1_FSM 0x228 #define MTK_FE_GDM2_FSM 0x22C @@ -737,7 +737,7 @@ Signed-off-by: Daniel Golle #define MTK_MAC_FSM(x) (0x1010C + ((x) * 0x100)) -@@ -738,12 +767,8 @@ enum mtk_clks_map { +@@ -743,12 +772,8 @@ enum mtk_clks_map { MTK_CLK_ETHWARP_WOCPU2, MTK_CLK_ETHWARP_WOCPU1, MTK_CLK_ETHWARP_WOCPU0, @@ -750,7 +750,7 @@ Signed-off-by: Daniel Golle MTK_CLK_TOP_ETH_GMII_SEL, MTK_CLK_TOP_ETH_REFCK_50M_SEL, MTK_CLK_TOP_ETH_SYS_200M_SEL, -@@ -814,19 +839,9 @@ enum mtk_clks_map { +@@ -819,19 +844,9 @@ enum mtk_clks_map { BIT_ULL(MTK_CLK_GP3) | BIT_ULL(MTK_CLK_XGP1) | \ BIT_ULL(MTK_CLK_XGP2) | BIT_ULL(MTK_CLK_XGP3) | \ BIT_ULL(MTK_CLK_CRYPTO) | \ @@ -770,7 +770,7 @@ Signed-off-by: Daniel Golle BIT_ULL(MTK_CLK_TOP_ETH_GMII_SEL) | \ BIT_ULL(MTK_CLK_TOP_ETH_REFCK_50M_SEL) | \ BIT_ULL(MTK_CLK_TOP_ETH_SYS_200M_SEL) | \ -@@ -959,6 +974,8 @@ enum mkt_eth_capabilities { +@@ -965,6 +980,8 @@ enum mkt_eth_capabilities { MTK_RGMII_BIT = 0, MTK_TRGMII_BIT, MTK_SGMII_BIT, @@ -779,7 +779,7 @@ Signed-off-by: Daniel Golle MTK_ESW_BIT, MTK_GEPHY_BIT, MTK_MUX_BIT, -@@ -979,8 +996,11 @@ enum mkt_eth_capabilities { +@@ -985,8 +1002,11 @@ enum mkt_eth_capabilities { MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT, MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT, MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT, @@ -791,7 +791,7 @@ Signed-off-by: Daniel Golle /* PATH BITS */ MTK_ETH_PATH_GMAC1_RGMII_BIT, -@@ -988,14 +1008,21 @@ enum mkt_eth_capabilities { +@@ -994,14 +1014,21 @@ enum mkt_eth_capabilities { MTK_ETH_PATH_GMAC1_SGMII_BIT, MTK_ETH_PATH_GMAC2_RGMII_BIT, MTK_ETH_PATH_GMAC2_SGMII_BIT, @@ -813,7 +813,7 @@ Signed-off-by: Daniel Golle #define MTK_ESW BIT_ULL(MTK_ESW_BIT) #define MTK_GEPHY BIT_ULL(MTK_GEPHY_BIT) #define MTK_MUX BIT_ULL(MTK_MUX_BIT) -@@ -1018,10 +1045,16 @@ enum mkt_eth_capabilities { +@@ -1024,10 +1051,16 @@ enum mkt_eth_capabilities { BIT_ULL(MTK_ETH_MUX_GMAC2_GMAC0_TO_GEPHY_BIT) #define MTK_ETH_MUX_U3_GMAC2_TO_QPHY \ BIT_ULL(MTK_ETH_MUX_U3_GMAC2_TO_QPHY_BIT) @@ -830,7 +830,7 @@ Signed-off-by: Daniel Golle /* Supported path present on SoCs */ #define MTK_ETH_PATH_GMAC1_RGMII BIT_ULL(MTK_ETH_PATH_GMAC1_RGMII_BIT) -@@ -1029,8 +1062,13 @@ enum mkt_eth_capabilities { +@@ -1035,8 +1068,13 @@ enum mkt_eth_capabilities { #define MTK_ETH_PATH_GMAC1_SGMII BIT_ULL(MTK_ETH_PATH_GMAC1_SGMII_BIT) #define MTK_ETH_PATH_GMAC2_RGMII BIT_ULL(MTK_ETH_PATH_GMAC2_RGMII_BIT) #define MTK_ETH_PATH_GMAC2_SGMII BIT_ULL(MTK_ETH_PATH_GMAC2_SGMII_BIT) @@ -844,7 +844,7 @@ Signed-off-by: Daniel Golle #define MTK_GMAC1_RGMII (MTK_ETH_PATH_GMAC1_RGMII | MTK_RGMII) #define MTK_GMAC1_TRGMII (MTK_ETH_PATH_GMAC1_TRGMII | MTK_TRGMII) -@@ -1038,7 +1076,12 @@ enum mkt_eth_capabilities { +@@ -1044,7 +1082,12 @@ enum mkt_eth_capabilities { #define MTK_GMAC2_RGMII (MTK_ETH_PATH_GMAC2_RGMII | MTK_RGMII) #define MTK_GMAC2_SGMII (MTK_ETH_PATH_GMAC2_SGMII | MTK_SGMII) #define MTK_GMAC2_GEPHY (MTK_ETH_PATH_GMAC2_GEPHY | MTK_GEPHY) @@ -857,7 +857,7 @@ Signed-off-by: Daniel Golle /* MUXes present on SoCs */ /* 0: GDM1 -> GMAC1, 1: GDM1 -> ESW */ -@@ -1057,10 +1100,20 @@ enum mkt_eth_capabilities { +@@ -1063,10 +1106,20 @@ enum mkt_eth_capabilities { (MTK_ETH_MUX_GMAC1_GMAC2_TO_SGMII_RGMII | MTK_MUX | \ MTK_SHARED_SGMII) @@ -878,7 +878,7 @@ Signed-off-by: Daniel Golle #define MTK_HAS_CAPS(caps, _x) (((caps) & (_x)) == (_x)) #define MT7621_CAPS (MTK_GMAC1_RGMII | MTK_GMAC1_TRGMII | \ -@@ -1092,8 +1145,12 @@ enum mkt_eth_capabilities { +@@ -1098,8 +1151,12 @@ enum mkt_eth_capabilities { MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \ MTK_RSTCTRL_PPE1 | MTK_SRAM) @@ -893,7 +893,7 @@ Signed-off-by: Daniel Golle struct mtk_tx_dma_desc_info { dma_addr_t addr; -@@ -1340,6 +1397,9 @@ struct mtk_mac { +@@ -1346,6 +1403,9 @@ struct mtk_mac { struct device_node *of_node; struct phylink *phylink; struct phylink_config phylink_config; @@ -903,7 +903,7 @@ Signed-off-by: Daniel Golle struct mtk_eth *hw; struct mtk_hw_stats *hw_stats; __be32 hwlro_ip[MTK_MAX_LRO_IP_CNT]; -@@ -1463,6 +1523,19 @@ static inline u32 mtk_get_ib2_multicast_ +@@ -1469,6 +1529,19 @@ static inline u32 mtk_get_ib2_multicast_ return MTK_FOE_IB2_MULTICAST; } @@ -923,7 +923,7 @@ Signed-off-by: Daniel Golle /* read the hardware status register */ void mtk_stats_update_mac(struct mtk_mac *mac); -@@ -1471,8 +1544,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne +@@ -1477,8 +1550,10 @@ u32 mtk_r32(struct mtk_eth *eth, unsigne u32 mtk_m32(struct mtk_eth *eth, u32 mask, u32 set, unsigned int reg); int mtk_gmac_sgmii_path_setup(struct mtk_eth *eth, int mac_id); diff --git a/target/linux/generic/pending-6.6/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch b/target/linux/generic/pending-6.6/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch index 88ba6257efb..f8b3bb84595 100644 --- a/target/linux/generic/pending-6.6/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch +++ b/target/linux/generic/pending-6.6/738-01-net-ethernet-mtk_eth_soc-reduce-rx-ring-size-for-older.patch @@ -30,8 +30,8 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -5512,7 +5512,7 @@ static const struct mtk_soc_data mt2701_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5470,7 +5470,7 @@ static const struct mtk_soc_data mt2701_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -39,8 +39,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5540,7 +5540,7 @@ static const struct mtk_soc_data mt7621_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5498,7 +5498,7 @@ static const struct mtk_soc_data mt7621_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -48,8 +48,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5570,7 +5570,7 @@ static const struct mtk_soc_data mt7622_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5528,7 +5528,7 @@ static const struct mtk_soc_data mt7622_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -57,8 +57,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5599,7 +5599,7 @@ static const struct mtk_soc_data mt7623_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5557,7 +5557,7 @@ static const struct mtk_soc_data mt7623_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -66,8 +66,8 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5625,7 +5625,7 @@ static const struct mtk_soc_data mt7629_ - DESC_SIZE(struct mtk_rx_dma), +@@ -5583,7 +5583,7 @@ static const struct mtk_soc_data mt7629_ + .desc_size = sizeof(struct mtk_rx_dma), .irq_done_mask = MTK_RX_DONE_INT, .dma_l4_valid = RX_DMA_L4_VALID, - .dma_size = MTK_DMA_SIZE(2K), @@ -75,7 +75,7 @@ Signed-off-by: Felix Fietkau .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, }, -@@ -5657,7 +5657,7 @@ static const struct mtk_soc_data mt7981_ +@@ -5615,7 +5615,7 @@ static const struct mtk_soc_data mt7981_ .dma_l4_valid = RX_DMA_L4_VALID_V2, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, @@ -84,7 +84,7 @@ Signed-off-by: Felix Fietkau }, }; -@@ -5687,7 +5687,7 @@ static const struct mtk_soc_data mt7986_ +@@ -5645,7 +5645,7 @@ static const struct mtk_soc_data mt7986_ .dma_l4_valid = RX_DMA_L4_VALID_V2, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, @@ -93,7 +93,7 @@ Signed-off-by: Felix Fietkau }, }; -@@ -5740,7 +5740,7 @@ static const struct mtk_soc_data rt5350_ +@@ -5698,7 +5698,7 @@ static const struct mtk_soc_data rt5350_ .dma_l4_valid = RX_DMA_L4_VALID_PDMA, .dma_max_len = MTK_TX_DMA_BUF_LEN, .dma_len_offset = 16, diff --git a/target/linux/generic/pending-6.6/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch b/target/linux/generic/pending-6.6/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch index fc61ddd3978..349af33524e 100644 --- a/target/linux/generic/pending-6.6/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch +++ b/target/linux/generic/pending-6.6/738-02-net-ethernet-mtk_eth_soc-do-not-enable-page-pool-sta.patch @@ -25,7 +25,7 @@ Signed-off-by: Felix Fietkau help --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -4621,6 +4621,7 @@ static int mtk_get_sset_count(struct net +@@ -4582,6 +4582,7 @@ static int mtk_get_sset_count(struct net static void mtk_ethtool_pp_stats(struct mtk_eth *eth, u64 *data) { @@ -33,7 +33,7 @@ Signed-off-by: Felix Fietkau struct page_pool_stats stats = {}; int i; -@@ -4633,6 +4634,7 @@ static void mtk_ethtool_pp_stats(struct +@@ -4594,6 +4595,7 @@ static void mtk_ethtool_pp_stats(struct page_pool_get_stats(ring->page_pool, &stats); } page_pool_ethtool_stats_get(data, &stats); diff --git a/target/linux/generic/pending-6.6/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch b/target/linux/generic/pending-6.6/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch index bc9266fdf17..7e90a79e5bf 100644 --- a/target/linux/generic/pending-6.6/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch +++ b/target/linux/generic/pending-6.6/742-net-ethernet-mtk_eth_soc-fix-tx-vlan-tag-for-llc-pac.patch @@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -@@ -1811,6 +1811,13 @@ static netdev_tx_t mtk_start_xmit(struct +@@ -1773,6 +1773,13 @@ static netdev_tx_t mtk_start_xmit(struct bool gso = false; int tx_num; @@ -26,7 +26,7 @@ Signed-off-by: Felix Fietkau /* normally we can rely on the stack not calling this more than once, * however we have 2 queues running on the same ring so we need to lock * the ring access -@@ -1874,8 +1881,9 @@ static netdev_tx_t mtk_start_xmit(struct +@@ -1836,8 +1843,9 @@ static netdev_tx_t mtk_start_xmit(struct drop: spin_unlock(ð->page_lock); -- 2.47.3