| From 4136e3567f6904259babbe5ae5c0d0bf06413f57 Mon Sep 17 00:00:00 2001 |
| From: Bo-Cun Chen <bc-bocun.chen@mediatek.com> |
| Date: Wed, 25 Oct 2023 09:21:06 +0800 |
| Subject: [PATCH] 999-2952-net-ethernet-mtk_eth_soc-modify-fq-size-4K |
| |
| --- |
| drivers/net/ethernet/mediatek/mtk_eth_dbg.c | 2 +- |
| drivers/net/ethernet/mediatek/mtk_eth_soc.c | 74 ++++++++++--------- |
| drivers/net/ethernet/mediatek/mtk_eth_soc.h | 5 +- |
| .../ethernet/mediatek/mtk_hnat/hnat_debugfs.c | 2 +- |
| .../ethernet/mediatek/mtk_hnat/hnat_nf_hook.c | 23 ++++++ |
| 5 files changed, 69 insertions(+), 37 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_dbg.c b/drivers/net/ethernet/mediatek/mtk_eth_dbg.c |
| index e50e1ac..7c137e5 100755 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_dbg.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_dbg.c |
| @@ -882,7 +882,7 @@ int hwtx_ring_read(struct seq_file *seq, void *v) |
| struct mtk_tx_dma_v2 *hwtx_ring; |
| int i = 0; |
| |
| - for (i = 0; i < MTK_DMA_SIZE; i++) { |
| + for (i = 0; i < MTK_DMA_FQ_SIZE; i++) { |
| dma_addr_t addr = eth->phy_scratch_ring + |
| i * (dma_addr_t)eth->soc->txrx.txd_size; |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| index 1226dd6..fe9c1de 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
| @@ -1557,10 +1557,10 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) |
| { |
| const struct mtk_soc_data *soc = eth->soc; |
| dma_addr_t phy_ring_tail; |
| - int cnt = MTK_DMA_SIZE; |
| + int cnt = MTK_DMA_FQ_SIZE; |
| dma_addr_t dma_addr; |
| u64 addr64 = 0; |
| - int i; |
| + int i, j, len; |
| |
| if (!eth->soc->has_sram) { |
| eth->scratch_ring = dma_alloc_coherent(eth->dma_dev, |
| @@ -1577,40 +1577,44 @@ static int mtk_init_fq_dma(struct mtk_eth *eth) |
| if (unlikely(!eth->scratch_ring)) |
| return -ENOMEM; |
| |
| - eth->scratch_head = kcalloc(cnt, MTK_QDMA_PAGE_SIZE, GFP_KERNEL); |
| - if (unlikely(!eth->scratch_head)) |
| - return -ENOMEM; |
| - |
| - dma_addr = dma_map_single(eth->dma_dev, |
| - eth->scratch_head, cnt * MTK_QDMA_PAGE_SIZE, |
| - DMA_FROM_DEVICE); |
| - if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) |
| - return -ENOMEM; |
| - |
| phy_ring_tail = eth->phy_scratch_ring + |
| (dma_addr_t)soc->txrx.txd_size * (cnt - 1); |
| |
| - for (i = 0; i < cnt; i++) { |
| - struct mtk_tx_dma_v2 *txd; |
| + for (j = 0; j < DIV_ROUND_UP(MTK_DMA_FQ_SIZE, MTK_DMA_FQ_LENGTH); j++) { |
| + len = min_t(int, cnt - j * MTK_DMA_FQ_LENGTH, MTK_DMA_FQ_LENGTH); |
| |
| - txd = eth->scratch_ring + i * soc->txrx.txd_size; |
| - txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; |
| - if (i < cnt - 1) |
| - txd->txd2 = eth->phy_scratch_ring + |
| - (i + 1) * soc->txrx.txd_size; |
| + eth->scratch_head[j] = kcalloc(len, MTK_QDMA_PAGE_SIZE, GFP_KERNEL); |
| + if (unlikely(!eth->scratch_head[j])) |
| + return -ENOMEM; |
| |
| - addr64 = (MTK_HAS_CAPS(eth->soc->caps, MTK_8GB_ADDRESSING)) ? |
| - TX_DMA_SDP1(dma_addr + i * MTK_QDMA_PAGE_SIZE) : 0; |
| + dma_addr = dma_map_single(eth->dma_dev, |
| + eth->scratch_head[j], len * MTK_QDMA_PAGE_SIZE, |
| + DMA_FROM_DEVICE); |
| + if (unlikely(dma_mapping_error(eth->dma_dev, dma_addr))) |
| + return -ENOMEM; |
| |
| - txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE) | addr64; |
| - txd->txd4 = 0; |
| + for (i = 0; i < len; i++) { |
| + struct mtk_tx_dma_v2 *txd; |
| |
| - if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) || |
| - MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) { |
| - txd->txd5 = 0; |
| - txd->txd6 = 0; |
| - txd->txd7 = 0; |
| - txd->txd8 = 0; |
| + txd = eth->scratch_ring + (j * MTK_DMA_FQ_LENGTH + i) * soc->txrx.txd_size; |
| + txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; |
| + if (j * MTK_DMA_FQ_LENGTH + i < cnt) |
| + txd->txd2 = eth->phy_scratch_ring + |
| + (j * MTK_DMA_FQ_LENGTH + i + 1) * soc->txrx.txd_size; |
| + |
| + addr64 = (MTK_HAS_CAPS(eth->soc->caps, MTK_8GB_ADDRESSING)) ? |
| + TX_DMA_SDP1(dma_addr + i * MTK_QDMA_PAGE_SIZE) : 0; |
| + |
| + txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE) | addr64; |
| + txd->txd4 = 0; |
| + |
| + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) || |
| + MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) { |
| + txd->txd5 = 0; |
| + txd->txd6 = 0; |
| + txd->txd7 = 0; |
| + txd->txd8 = 0; |
| + } |
| } |
| } |
| |
| @@ -2541,9 +2545,9 @@ static int mtk_tx_alloc(struct mtk_eth *eth) |
| ring->dma = dma_alloc_coherent(eth->dma_dev, MTK_DMA_SIZE * sz, |
| &ring->phys, GFP_KERNEL); |
| else { |
| - ring->dma = eth->scratch_ring + MTK_DMA_SIZE * sz; |
| + ring->dma = eth->scratch_ring + MTK_DMA_FQ_SIZE * sz; |
| ring->phys = eth->phy_scratch_ring + |
| - MTK_DMA_SIZE * (dma_addr_t)sz; |
| + MTK_DMA_FQ_SIZE * (dma_addr_t)sz; |
| } |
| |
| if (!ring->dma) |
| @@ -3349,9 +3353,11 @@ static void mtk_dma_free(struct mtk_eth *eth) |
| mtk_rx_clean(eth, ð->rx_ring[MTK_RSS_RING(i)], 1); |
| } |
| |
| - if (eth->scratch_head) { |
| - kfree(eth->scratch_head); |
| - eth->scratch_head = NULL; |
| + for (i = 0; i < DIV_ROUND_UP(MTK_DMA_FQ_SIZE, MTK_DMA_FQ_LENGTH); i++) { |
| + if (eth->scratch_head[i]) { |
| + kfree(eth->scratch_head[i]); |
| + eth->scratch_head[i] = NULL; |
| + } |
| } |
| } |
| |
| diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| index fe8bdee..cd2de23 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
| @@ -20,6 +20,9 @@ |
| #define MTK_MAX_RX_LENGTH 1536 |
| #define MTK_MIN_TX_LENGTH 60 |
| #define MTK_DMA_SIZE 2048 |
| +#define MTK_DMA_FQ_SIZE 4096 |
| +#define MTK_DMA_FQ_HEAD 32 |
| +#define MTK_DMA_FQ_LENGTH 2048 |
| #define MTK_NAPI_WEIGHT 256 |
| |
| #if defined(CONFIG_MEDIATEK_NETSYS_V3) |
| @@ -1837,7 +1840,7 @@ struct mtk_eth { |
| void *scratch_ring; |
| struct mtk_reset_event reset_event; |
| dma_addr_t phy_scratch_ring; |
| - void *scratch_head; |
| + void *scratch_head[MTK_DMA_FQ_HEAD]; |
| struct clk *clks[MTK_CLK_MAX]; |
| |
| struct mii_bus *mii_bus; |
| diff --git a/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c b/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c |
| index fc7d216..b97fd6a 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_hnat/hnat_debugfs.c |
| @@ -2784,7 +2784,7 @@ static ssize_t hnat_qos_toggle_write(struct file *file, const char __user *buffe |
| qos_toggle = 1; |
| } else if (buf[0] == '2') { |
| pr_info("Per-port-per-queue mode is going to be enabled!\n"); |
| - pr_info("PPPQ use qid 0~5 (scheduler 0).\n"); |
| + pr_info("PPPQ use qid 0~11 (scheduler 0).\n"); |
| qos_toggle = 2; |
| qos_dl_toggle = 1; |
| qos_ul_toggle = 1; |
| diff --git a/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c b/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c |
| index 85c38e0..6a373f8 100644 |
| --- a/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c |
| +++ b/drivers/net/ethernet/mediatek/mtk_hnat/hnat_nf_hook.c |
| @@ -1219,6 +1219,7 @@ static unsigned int skb_to_hnat_info(struct sk_buff *skb, |
| int udp = 0; |
| u32 qid = 0; |
| u32 port_id = 0; |
| + u32 payload_len = 0; |
| int mape = 0; |
| |
| ct = nf_ct_get(skb, &ctinfo); |
| @@ -1748,6 +1749,28 @@ static unsigned int skb_to_hnat_info(struct sk_buff *skb, |
| else |
| qid = 0; |
| |
| + if (IS_PPPQ_MODE && IS_PPPQ_PATH(dev, skb)) { |
| + if (ntohs(eth->h_proto) == ETH_P_IP) { |
| + iph = ip_hdr(skb); |
| + if (iph->protocol == IPPROTO_TCP) { |
| + skb_set_transport_header(skb, sizeof(struct iphdr)); |
| + payload_len = be16_to_cpu(iph->tot_len) - skb_transport_offset(skb) - tcp_hdrlen(skb); |
| + /* Dispatch ACK packets to high priority queue */ |
| + if (payload_len == 0) |
| + qid += 6; |
| + } |
| + } else if (ntohs(eth->h_proto) == ETH_P_IPV6) { |
| + ip6h = ipv6_hdr(skb); |
| + if (ip6h->nexthdr == NEXTHDR_TCP) { |
| + skb_set_transport_header(skb, sizeof(struct ipv6hdr)); |
| + payload_len = be16_to_cpu(ip6h->payload_len) - tcp_hdrlen(skb); |
| + /* Dispatch ACK packets to high priority queue */ |
| + if (payload_len == 0) |
| + qid += 6; |
| + } |
| + } |
| + } |
| + |
| if (IS_IPV4_GRP(foe)) { |
| entry.ipv4_hnapt.iblk2.dp = gmac; |
| entry.ipv4_hnapt.iblk2.port_mg = |
| -- |
| 2.18.0 |
| |