Browse Source

kernel: backport mtk_soc_eth fixes from v5.13

Fixes logic that leads to this error when booting mt7621 and other
devices that use the mediatek ethernet driver:
  [   23.144378] mtk_soc_eth 1e100000.ethernet: PPE table busy

The rest are mostly moved from pending-5.10 to backport-5.10 with a
couple of cleanups and improvements from upstream.

Refresh patches.

Links:
    https://git.kernel.org/netdev/net-next/c/c5d66587b890
    https://git.kernel.org/netdev/net-next/c/3f57d8c40fea
    https://git.kernel.org/netdev/net-next/c/5196c4178549
    https://git.kernel.org/netdev/net-next/c/787082ab9f7b
    https://git.kernel.org/netdev/net-next/c/c30c4a827390
    https://git.kernel.org/netdev/net-next/c/3630d519d7c3
    https://git.kernel.org/netdev/net-next/c/16ef670789b2
    https://git.kernel.org/netdev/net-next/c/59555a8d0dd3
    https://git.kernel.org/netdev/net-next/c/6b4423b258b9
    https://git.kernel.org/netdev/net-next/c/e9229ffd550b
    https://git.kernel.org/netdev/net-next/c/4e6bf609569c
    https://git.kernel.org/netdev/net-next/c/816ac3e6e67b
    https://git.kernel.org/netdev/net-next/c/16769a8923fa
    https://git.kernel.org/netdev/net-next/c/db2c7b353db3
    https://git.kernel.org/netdev/net-next/c/fa817272c37e
    https://git.kernel.org/netdev/net-next/c/3bc8e0aff23b

Fixes: f07fe36f22fc ("kernel: update flow offload patches to upstream version")
Cc: Felix Fietkau <[email protected]>
Signed-off-by: Ilya Lipnitskiy <[email protected]>
Ilya Lipnitskiy 4 years ago
parent
commit
0d6f207230
17 changed files with 375 additions and 79 deletions
  1. 12 5
      target/linux/generic/backport-5.10/610-v5.13-37-net-ethernet-mtk_eth_soc-fix-RX-VLAN-offload.patch
  2. 10 16
      target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch
  3. 38 0
      target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch
  4. 9 4
      target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch
  5. 7 3
      target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch
  6. 10 6
      target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch
  7. 9 4
      target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch
  8. 8 3
      target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch
  9. 45 13
      target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch
  10. 15 9
      target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch
  11. 8 3
      target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch
  12. 8 4
      target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch
  13. 110 0
      target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch
  14. 11 5
      target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch
  15. 71 0
      target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch
  16. 2 2
      target/linux/mediatek/patches-5.10/700-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch
  17. 2 2
      target/linux/ramips/patches-5.10/700-net-ethernet-mediatek-support-net-labels.patch

+ 12 - 5
target/linux/generic/pending-5.10/770-02-net-ethernet-mtk_eth_soc-fix-rx-vlan-offload.patch → target/linux/generic/backport-5.10/610-v5.13-37-net-ethernet-mtk_eth_soc-fix-RX-VLAN-offload.patch

@@ -1,16 +1,23 @@
+From 3f57d8c40fea9b20543cab4da12f4680d2ef182c Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Wed, 26 Aug 2020 16:52:12 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: fix rx vlan offload
+Date: Thu, 22 Apr 2021 22:20:54 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: fix RX VLAN offload
 
 
-The VLAN ID in the rx descriptor is only valid if the RX_DMA_VID bit is set
-Fixes frames wrongly marked with VLAN tags
+The VLAN ID in the rx descriptor is only valid if the RX_DMA_VTAG bit is
+set. Fixes frames wrongly marked with VLAN tags.
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+[Ilya: fix commit message]
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1324,7 +1324,7 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1319,7 +1319,7 @@ static int mtk_poll_rx(struct napi_struc
  		skb->protocol = eth_type_trans(skb, netdev);
  		skb->protocol = eth_type_trans(skb, netdev);
  
  
  		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
  		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&

+ 10 - 16
target/linux/generic/pending-5.10/770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch → target/linux/generic/backport-5.10/610-v5.13-38-net-ethernet-mtk_eth_soc-unmap-RX-data-before-callin.patch

@@ -1,17 +1,23 @@
+From 5196c417854942e218a59ec87bf7d414b3bd581e Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Thu, 27 Aug 2020 09:44:43 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: unmap rx data before calling
+Date: Thu, 22 Apr 2021 22:20:55 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: unmap RX data before calling
  build_skb
  build_skb
 
 
 Since build_skb accesses the data area (for initializing shinfo), dma unmap
 Since build_skb accesses the data area (for initializing shinfo), dma unmap
 needs to happen before that call
 needs to happen before that call
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+[Ilya: split build_skb cleanup fix into a separate commit]
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1297,17 +1297,18 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1298,6 +1298,9 @@ static int mtk_poll_rx(struct napi_struc
  			goto release_desc;
  			goto release_desc;
  		}
  		}
  
  
@@ -21,11 +27,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		/* receive data */
  		/* receive data */
  		skb = build_skb(data, ring->frag_size);
  		skb = build_skb(data, ring->frag_size);
  		if (unlikely(!skb)) {
  		if (unlikely(!skb)) {
--			skb_free_frag(new_data);
-+			skb_free_frag(data);
- 			netdev->stats.rx_dropped++;
--			goto release_desc;
-+			goto skip_rx;
+@@ -1307,8 +1310,6 @@ static int mtk_poll_rx(struct napi_struc
  		}
  		}
  		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
  		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
  
  
@@ -34,11 +36,3 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		pktlen = RX_DMA_GET_PLEN0(trxd.rxd2);
  		pktlen = RX_DMA_GET_PLEN0(trxd.rxd2);
  		skb->dev = netdev;
  		skb->dev = netdev;
  		skb_put(skb, pktlen);
  		skb_put(skb, pktlen);
-@@ -1325,6 +1326,7 @@ static int mtk_poll_rx(struct napi_struc
- 		skb_record_rx_queue(skb, 0);
- 		napi_gro_receive(napi, skb);
- 
-+skip_rx:
- 		ring->data[idx] = new_data;
- 		rxd->rxd1 = (unsigned int)dma_addr;
- 

+ 38 - 0
target/linux/generic/backport-5.10/610-v5.13-39-net-ethernet-mtk_eth_soc-fix-build_skb-cleanup.patch

@@ -0,0 +1,38 @@
+From 787082ab9f7be4711e52f67c388535eda74a1269 Mon Sep 17 00:00:00 2001
+From: Ilya Lipnitskiy <[email protected]>
+Date: Thu, 22 Apr 2021 22:20:56 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: fix build_skb cleanup
+
+In case build_skb fails, call skb_free_frag on the correct pointer. Also
+update the DMA structures with the new mapping before exiting, because
+the mapping was successful
+
+Suggested-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -1304,9 +1304,9 @@ static int mtk_poll_rx(struct napi_struc
+ 		/* receive data */
+ 		skb = build_skb(data, ring->frag_size);
+ 		if (unlikely(!skb)) {
+-			skb_free_frag(new_data);
++			skb_free_frag(data);
+ 			netdev->stats.rx_dropped++;
+-			goto release_desc;
++			goto skip_rx;
+ 		}
+ 		skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
+ 
+@@ -1326,6 +1326,7 @@ static int mtk_poll_rx(struct napi_struc
+ 		skb_record_rx_queue(skb, 0);
+ 		napi_gro_receive(napi, skb);
+ 
++skip_rx:
+ 		ring->data[idx] = new_data;
+ 		rxd->rxd1 = (unsigned int)dma_addr;
+ 

+ 9 - 4
target/linux/generic/pending-5.10/770-00-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch → target/linux/generic/backport-5.10/610-v5.13-40-net-ethernet-mtk_eth_soc-use-napi_consume_skb.patch

@@ -1,11 +1,16 @@
+From c30c4a82739090a2de4a4e3f245355ea4fb3ec14 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Mon, 8 Jun 2020 17:01:12 +0200
+Date: Thu, 22 Apr 2021 22:20:57 -0700
 Subject: [PATCH] net: ethernet: mtk_eth_soc: use napi_consume_skb
 Subject: [PATCH] net: ethernet: mtk_eth_soc: use napi_consume_skb
 
 
 Should improve performance, since it can use bulk free
 Should improve performance, since it can use bulk free
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 19 ++++++++++++-------
+ 1 file changed, 12 insertions(+), 7 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -43,7 +48,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  		itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU;
  		itxd->txd3 = TX_DMA_LS0 | TX_DMA_OWNER_CPU;
  		if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
  		if (!MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
-@@ -1386,7 +1391,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
+@@ -1388,7 +1393,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
  			done[mac]++;
  			done[mac]++;
  			budget--;
  			budget--;
  		}
  		}
@@ -52,7 +57,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  		ring->last_free = desc;
  		ring->last_free = desc;
  		atomic_inc(&ring->free_count);
  		atomic_inc(&ring->free_count);
-@@ -1423,7 +1428,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
+@@ -1425,7 +1430,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
  			budget--;
  			budget--;
  		}
  		}
  
  
@@ -61,7 +66,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  		desc = &ring->dma[cpu];
  		desc = &ring->dma[cpu];
  		ring->last_free = desc;
  		ring->last_free = desc;
-@@ -1625,7 +1630,7 @@ static void mtk_tx_clean(struct mtk_eth
+@@ -1627,7 +1632,7 @@ static void mtk_tx_clean(struct mtk_eth
  
  
  	if (ring->buf) {
  	if (ring->buf) {
  		for (i = 0; i < MTK_DMA_SIZE; i++)
  		for (i = 0; i < MTK_DMA_SIZE; i++)

+ 7 - 3
target/linux/generic/pending-5.10/770-01-net-ethernet-mtk_eth_soc-significantly-reduce-mdio-b.patch → target/linux/generic/backport-5.10/610-v5.13-41-net-ethernet-mtk_eth_soc-reduce-MDIO-bus-access-late.patch

@@ -1,7 +1,7 @@
+From 3630d519d7c3eab92567658690e44ffe0517d109 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Mon, 8 Jun 2020 17:02:39 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: significantly reduce mdio bus
- access latency
+Date: Thu, 22 Apr 2021 22:20:58 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: reduce MDIO bus access latency
 
 
 usleep_range often ends up sleeping much longer than the 10-20us provided
 usleep_range often ends up sleeping much longer than the 10-20us provided
 as a range here. This causes significant latency in mdio bus acceses,
 as a range here. This causes significant latency in mdio bus acceses,
@@ -11,7 +11,11 @@ Use cond_resched instead of usleep_range, since the MDIO access does not
 take much time
 take much time
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c

+ 10 - 6
target/linux/generic/pending-5.10/770-03-net-ethernet-mtk_eth_soc-fix-unnecessary-tx-queue-st.patch → target/linux/generic/backport-5.10/610-v5.13-42-net-ethernet-mtk_eth_soc-remove-unnecessary-TX-queue.patch

@@ -1,14 +1,18 @@
+From 16ef670789b252b221700adc413497ed2f941d8a Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Wed, 26 Aug 2020 16:55:54 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: fix unnecessary tx queue
- stops
+Date: Thu, 22 Apr 2021 22:20:59 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: remove unnecessary TX queue stops
 
 
-When running short on descriptors, only stop the queue for the netdev that tx
-was attempted for. By the time the something tries to send on the other netdev,
-the ring might have some more room already
+When running short on descriptors, only stop the queue for the netdev that
+tx was attempted for. By the time something tries to send on the other
+netdev, the ring might have some more room already.
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 15 ++-------------
+ 1 file changed, 2 insertions(+), 13 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c

+ 9 - 4
target/linux/generic/pending-5.10/770-04-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-q.patch → target/linux/generic/backport-5.10/610-v5.13-43-net-ethernet-mtk_eth_soc-use-larger-burst-size-for-Q.patch

@@ -1,16 +1,21 @@
+From 59555a8d0dd39bf60b7ca1ba5e7393d293f7398d Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Wed, 26 Aug 2020 16:58:55 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: use larger burst size for
- qdma tx
+Date: Thu, 22 Apr 2021 22:21:00 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: use larger burst size for QDMA TX
 
 
 Improves tx performance
 Improves tx performance
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 2 +-
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2191,7 +2191,7 @@ static int mtk_start_dma(struct mtk_eth
+@@ -2193,7 +2193,7 @@ static int mtk_start_dma(struct mtk_eth
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
  		mtk_w32(eth,
  		mtk_w32(eth,
  			MTK_TX_WB_DDONE | MTK_TX_DMA_EN |
  			MTK_TX_WB_DDONE | MTK_TX_DMA_EN |

+ 8 - 3
target/linux/generic/pending-5.10/770-05-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch → target/linux/generic/backport-5.10/610-v5.13-44-net-ethernet-mtk_eth_soc-increase-DMA-ring-sizes.patch

@@ -1,12 +1,17 @@
+From 6b4423b258b91032c50a5efca15d3d9bb194ea1d Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Wed, 26 Aug 2020 16:59:41 +0200
+Date: Thu, 22 Apr 2021 22:21:01 -0700
 Subject: [PATCH] net: ethernet: mtk_eth_soc: increase DMA ring sizes
 Subject: [PATCH] net: ethernet: mtk_eth_soc: increase DMA ring sizes
 
 
-256 descriptors is not enough for multi-gigabit traffic under load on MT7622.
-Bump it to 512 to improve performance
+256 descriptors is not enough for multi-gigabit traffic under load on
+MT7622. Bump it to 512 to improve performance.
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h

+ 45 - 13
target/linux/generic/pending-5.10/770-06-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch → target/linux/generic/backport-5.10/610-v5.13-45-net-ethernet-mtk_eth_soc-implement-dynamic-interrupt.patch

@@ -1,12 +1,20 @@
+From e9229ffd550b2d8c4997c67a501dbc3919fd4e26 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Wed, 26 Aug 2020 17:02:30 +0200
+Date: Thu, 22 Apr 2021 22:21:02 -0700
 Subject: [PATCH] net: ethernet: mtk_eth_soc: implement dynamic interrupt
 Subject: [PATCH] net: ethernet: mtk_eth_soc: implement dynamic interrupt
  moderation
  moderation
 
 
 Reduces the number of interrupts under load
 Reduces the number of interrupts under load
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+[Ilya: add documentation for new struct fields]
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/Kconfig       |  1 +
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 96 +++++++++++++++++++--
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 41 +++++++--
+ 3 files changed, 124 insertions(+), 14 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/Kconfig
 --- a/drivers/net/ethernet/mediatek/Kconfig
 +++ b/drivers/net/ethernet/mediatek/Kconfig
 +++ b/drivers/net/ethernet/mediatek/Kconfig
@@ -35,7 +43,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  	while (done < budget) {
  	while (done < budget) {
  		struct net_device *netdev;
  		struct net_device *netdev;
-@@ -1311,6 +1312,7 @@ static int mtk_poll_rx(struct napi_struc
+@@ -1312,6 +1313,7 @@ static int mtk_poll_rx(struct napi_struc
  		else
  		else
  			skb_checksum_none_assert(skb);
  			skb_checksum_none_assert(skb);
  		skb->protocol = eth_type_trans(skb, netdev);
  		skb->protocol = eth_type_trans(skb, netdev);
@@ -43,7 +51,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
  		if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX &&
  		    (trxd.rxd2 & RX_DMA_VTAG))
  		    (trxd.rxd2 & RX_DMA_VTAG))
-@@ -1342,6 +1344,12 @@ rx_done:
+@@ -1344,6 +1346,12 @@ rx_done:
  		mtk_update_rx_cpu_idx(eth);
  		mtk_update_rx_cpu_idx(eth);
  	}
  	}
  
  
@@ -56,7 +64,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	return done;
  	return done;
  }
  }
  
  
-@@ -1434,6 +1442,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
+@@ -1436,6 +1444,7 @@ static int mtk_poll_tx_pdma(struct mtk_e
  static int mtk_poll_tx(struct mtk_eth *eth, int budget)
  static int mtk_poll_tx(struct mtk_eth *eth, int budget)
  {
  {
  	struct mtk_tx_ring *ring = &eth->tx_ring;
  	struct mtk_tx_ring *ring = &eth->tx_ring;
@@ -64,7 +72,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	unsigned int done[MTK_MAX_DEVS];
  	unsigned int done[MTK_MAX_DEVS];
  	unsigned int bytes[MTK_MAX_DEVS];
  	unsigned int bytes[MTK_MAX_DEVS];
  	int total = 0, i;
  	int total = 0, i;
-@@ -1451,8 +1460,14 @@ static int mtk_poll_tx(struct mtk_eth *e
+@@ -1453,8 +1462,14 @@ static int mtk_poll_tx(struct mtk_eth *e
  			continue;
  			continue;
  		netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
  		netdev_completed_queue(eth->netdev[i], done[i], bytes[i]);
  		total += done[i];
  		total += done[i];
@@ -79,7 +87,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	if (mtk_queue_stopped(eth) &&
  	if (mtk_queue_stopped(eth) &&
  	    (atomic_read(&ring->free_count) > ring->thresh))
  	    (atomic_read(&ring->free_count) > ring->thresh))
  		mtk_wake_queue(eth);
  		mtk_wake_queue(eth);
-@@ -2127,6 +2142,7 @@ static irqreturn_t mtk_handle_irq_rx(int
+@@ -2129,6 +2144,7 @@ static irqreturn_t mtk_handle_irq_rx(int
  {
  {
  	struct mtk_eth *eth = _eth;
  	struct mtk_eth *eth = _eth;
  
  
@@ -87,7 +95,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	if (likely(napi_schedule_prep(&eth->rx_napi))) {
  	if (likely(napi_schedule_prep(&eth->rx_napi))) {
  		__napi_schedule(&eth->rx_napi);
  		__napi_schedule(&eth->rx_napi);
  		mtk_rx_irq_disable(eth, MTK_RX_DONE_INT);
  		mtk_rx_irq_disable(eth, MTK_RX_DONE_INT);
-@@ -2139,6 +2155,7 @@ static irqreturn_t mtk_handle_irq_tx(int
+@@ -2141,6 +2157,7 @@ static irqreturn_t mtk_handle_irq_tx(int
  {
  {
  	struct mtk_eth *eth = _eth;
  	struct mtk_eth *eth = _eth;
  
  
@@ -95,7 +103,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	if (likely(napi_schedule_prep(&eth->tx_napi))) {
  	if (likely(napi_schedule_prep(&eth->tx_napi))) {
  		__napi_schedule(&eth->tx_napi);
  		__napi_schedule(&eth->tx_napi);
  		mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
  		mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
-@@ -2323,6 +2340,9 @@ static int mtk_stop(struct net_device *d
+@@ -2325,6 +2342,9 @@ static int mtk_stop(struct net_device *d
  	napi_disable(&eth->tx_napi);
  	napi_disable(&eth->tx_napi);
  	napi_disable(&eth->rx_napi);
  	napi_disable(&eth->rx_napi);
  
  
@@ -105,7 +113,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
  		mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
  		mtk_stop_dma(eth, MTK_QDMA_GLO_CFG);
  	mtk_stop_dma(eth, MTK_PDMA_GLO_CFG);
  	mtk_stop_dma(eth, MTK_PDMA_GLO_CFG);
-@@ -2375,6 +2395,64 @@ err_disable_clks:
+@@ -2377,6 +2397,64 @@ err_disable_clks:
  	return ret;
  	return ret;
  }
  }
  
  
@@ -170,7 +178,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  static int mtk_hw_init(struct mtk_eth *eth)
  static int mtk_hw_init(struct mtk_eth *eth)
  {
  {
  	int i, val, ret;
  	int i, val, ret;
-@@ -2396,9 +2474,6 @@ static int mtk_hw_init(struct mtk_eth *e
+@@ -2398,9 +2476,6 @@ static int mtk_hw_init(struct mtk_eth *e
  			goto err_disable_pm;
  			goto err_disable_pm;
  		}
  		}
  
  
@@ -180,12 +188,13 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		/* disable delay and normal interrupt */
  		/* disable delay and normal interrupt */
  		mtk_tx_irq_disable(eth, ~0);
  		mtk_tx_irq_disable(eth, ~0);
  		mtk_rx_irq_disable(eth, ~0);
  		mtk_rx_irq_disable(eth, ~0);
-@@ -2437,11 +2512,10 @@ static int mtk_hw_init(struct mtk_eth *e
+@@ -2439,11 +2514,11 @@ static int mtk_hw_init(struct mtk_eth *e
  	/* Enable RX VLan Offloading */
  	/* Enable RX VLan Offloading */
  	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
  	mtk_w32(eth, 1, MTK_CDMP_EG_CTRL);
  
  
 -	/* enable interrupt delay for RX */
 -	/* enable interrupt delay for RX */
 -	mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT);
 -	mtk_w32(eth, MTK_PDMA_DELAY_RX_DELAY, MTK_PDMA_DELAY_INT);
++	/* set interrupt delays based on current Net DIM sample */
 +	mtk_dim_rx(&eth->rx_dim.work);
 +	mtk_dim_rx(&eth->rx_dim.work);
 +	mtk_dim_tx(&eth->tx_dim.work);
 +	mtk_dim_tx(&eth->tx_dim.work);
  
  
@@ -194,7 +203,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	mtk_tx_irq_disable(eth, ~0);
  	mtk_tx_irq_disable(eth, ~0);
  	mtk_rx_irq_disable(eth, ~0);
  	mtk_rx_irq_disable(eth, ~0);
  
  
-@@ -2946,6 +3020,13 @@ static int mtk_probe(struct platform_dev
+@@ -2948,6 +3023,13 @@ static int mtk_probe(struct platform_dev
  	spin_lock_init(&eth->page_lock);
  	spin_lock_init(&eth->page_lock);
  	spin_lock_init(&eth->tx_irq_lock);
  	spin_lock_init(&eth->tx_irq_lock);
  	spin_lock_init(&eth->rx_irq_lock);
  	spin_lock_init(&eth->rx_irq_lock);
@@ -260,7 +269,30 @@ Signed-off-by: Felix Fietkau <[email protected]>
  
  
  /* QDMA Interrupt grouping registers */
  /* QDMA Interrupt grouping registers */
  #define MTK_QDMA_INT_GRP1	0x1a20
  #define MTK_QDMA_INT_GRP1	0x1a20
-@@ -905,6 +911,18 @@ struct mtk_eth {
+@@ -843,6 +849,7 @@ struct mtk_sgmii {
+  * @page_lock:		Make sure that register operations are atomic
+  * @tx_irq__lock:	Make sure that IRQ register operations are atomic
+  * @rx_irq__lock:	Make sure that IRQ register operations are atomic
++ * @dim_lock:		Make sure that Net DIM operations are atomic
+  * @dummy_dev:		we run 2 netdevs on 1 physical DMA ring and need a
+  *			dummy for NAPI to work
+  * @netdev:		The netdev instances
+@@ -861,6 +868,14 @@ struct mtk_sgmii {
+  * @rx_ring_qdma:	Pointer to the memory holding info about the QDMA RX ring
+  * @tx_napi:		The TX NAPI struct
+  * @rx_napi:		The RX NAPI struct
++ * @rx_events:		Net DIM RX event counter
++ * @rx_packets:		Net DIM RX packet counter
++ * @rx_bytes:		Net DIM RX byte counter
++ * @rx_dim:		Net DIM RX context
++ * @tx_events:		Net DIM TX event counter
++ * @tx_packets:		Net DIM TX packet counter
++ * @tx_bytes:		Net DIM TX byte counter
++ * @tx_dim:		Net DIM TX context
+  * @scratch_ring:	Newer SoCs need memory for a second HW managed TX ring
+  * @phy_scratch_ring:	physical address of scratch_ring
+  * @scratch_head:	The scratch memory that scratch_ring points to.
+@@ -905,6 +920,18 @@ struct mtk_eth {
  
  
  	const struct mtk_soc_data	*soc;
  	const struct mtk_soc_data	*soc;
  
  

+ 15 - 9
target/linux/generic/pending-5.10/770-08-net-ethernet-mtk_eth_soc-cache-hardware-pointer-of-l.patch → target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch

@@ -1,17 +1,23 @@
+From 4e6bf609569c59b6bd6acf4a607c096cbd820d79 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Thu, 27 Aug 2020 06:32:03 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: cache hardware pointer of last
- freed tx descriptor
+Date: Thu, 22 Apr 2021 22:21:03 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: cache HW pointer of last freed TX
+ descriptor
 
 
-The value is only updated by the CPU, so it is cheaper to access from the ring
-data structure than from a hardware register
+The value is only updated by the CPU, so it is cheaper to access from the
+ring data structure than from a hardware register.
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++++----
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 ++
+ 2 files changed, 6 insertions(+), 4 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -1362,7 +1362,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
+@@ -1364,7 +1364,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
  	struct mtk_tx_buf *tx_buf;
  	struct mtk_tx_buf *tx_buf;
  	u32 cpu, dma;
  	u32 cpu, dma;
  
  
@@ -20,7 +26,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
  	dma = mtk_r32(eth, MTK_QTX_DRX_PTR);
  
  
  	desc = mtk_qdma_phys_to_virt(ring, cpu);
  	desc = mtk_qdma_phys_to_virt(ring, cpu);
-@@ -1396,6 +1396,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
+@@ -1398,6 +1398,7 @@ static int mtk_poll_tx_qdma(struct mtk_e
  		cpu = next_cpu;
  		cpu = next_cpu;
  	}
  	}
  
  
@@ -28,7 +34,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
  	mtk_w32(eth, cpu, MTK_QTX_CRX_PTR);
  
  
  	return budget;
  	return budget;
-@@ -1596,6 +1597,7 @@ static int mtk_tx_alloc(struct mtk_eth *
+@@ -1598,6 +1599,7 @@ static int mtk_tx_alloc(struct mtk_eth *
  	atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
  	atomic_set(&ring->free_count, MTK_DMA_SIZE - 2);
  	ring->next_free = &ring->dma[0];
  	ring->next_free = &ring->dma[0];
  	ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
  	ring->last_free = &ring->dma[MTK_DMA_SIZE - 1];
@@ -36,7 +42,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	ring->thresh = MAX_SKB_FRAGS;
  	ring->thresh = MAX_SKB_FRAGS;
  
  
  	/* make sure that all changes to the dma ring are flushed before we
  	/* make sure that all changes to the dma ring are flushed before we
-@@ -1609,9 +1611,7 @@ static int mtk_tx_alloc(struct mtk_eth *
+@@ -1611,9 +1613,7 @@ static int mtk_tx_alloc(struct mtk_eth *
  		mtk_w32(eth,
  		mtk_w32(eth,
  			ring->phys + ((MTK_DMA_SIZE - 1) * sz),
  			ring->phys + ((MTK_DMA_SIZE - 1) * sz),
  			MTK_QTX_CRX_PTR);
  			MTK_QTX_CRX_PTR);

+ 8 - 3
target/linux/generic/pending-5.10/770-09-net-ethernet-mtk_eth_soc-only-read-the-full-rx-descr.patch → target/linux/generic/backport-5.10/610-v5.13-47-net-ethernet-mtk_eth_soc-only-read-the-full-RX-descr.patch

@@ -1,13 +1,18 @@
+From 816ac3e6e67bdd78d86226c6eb53619780750e92 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Thu, 27 Aug 2020 09:24:25 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full rx
- descriptor if DMA is done
+Date: Thu, 22 Apr 2021 22:21:04 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: only read the full RX descriptor
+ if DMA is done
 
 
 Uncached memory access is expensive, and there is no need to access all
 Uncached memory access is expensive, and there is no need to access all
 descriptor words if we can't process them anyway
 descriptor words if we can't process them anyway
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c

+ 8 - 4
target/linux/generic/pending-5.10/770-11-net-ethernet-mtk_eth_soc-avoid-rearming-interrupt-if.patch → target/linux/generic/backport-5.10/610-v5.13-48-net-ethernet-mtk_eth_soc-reduce-unnecessary-interrup.patch

@@ -1,12 +1,16 @@
+From 16769a8923fad5a5377253bcd76b0e0d64976c73 Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Fri, 4 Sep 2020 18:14:05 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: avoid rearming interrupt if
- napi_complete returns false
+Date: Thu, 22 Apr 2021 22:21:05 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: reduce unnecessary interrupts
 
 
-Reduces unnecessary interrupts
+Avoid rearming interrupt if napi_complete returns false
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c

+ 110 - 0
target/linux/generic/backport-5.10/610-v5.13-49-net-ethernet-mtk_eth_soc-rework-NAPI-callbacks.patch

@@ -0,0 +1,110 @@
+From db2c7b353db3b3f71b55f9ff4627d8a786446fbe Mon Sep 17 00:00:00 2001
+From: Ilya Lipnitskiy <[email protected]>
+Date: Thu, 22 Apr 2021 22:21:06 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: rework NAPI callbacks
+
+Use napi_complete_done to communicate total TX and RX work done to NAPI.
+Count total RX work up instead of remaining work down for clarity.
+Remove unneeded local variables for clarity. Use do {} while instead of
+goto for clarity.
+
+Suggested-by: Jakub Kicinski <[email protected]>
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 54 +++++++++------------
+ 1 file changed, 24 insertions(+), 30 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -1496,7 +1496,6 @@ static void mtk_handle_status_irq(struct
+ static int mtk_napi_tx(struct napi_struct *napi, int budget)
+ {
+ 	struct mtk_eth *eth = container_of(napi, struct mtk_eth, tx_napi);
+-	u32 status, mask;
+ 	int tx_done = 0;
+ 
+ 	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
+@@ -1505,21 +1504,19 @@ static int mtk_napi_tx(struct napi_struc
+ 	tx_done = mtk_poll_tx(eth, budget);
+ 
+ 	if (unlikely(netif_msg_intr(eth))) {
+-		status = mtk_r32(eth, eth->tx_int_status_reg);
+-		mask = mtk_r32(eth, eth->tx_int_mask_reg);
+ 		dev_info(eth->dev,
+-			 "done tx %d, intr 0x%08x/0x%x\n",
+-			 tx_done, status, mask);
++			 "done tx %d, intr 0x%08x/0x%x\n", tx_done,
++			 mtk_r32(eth, eth->tx_int_status_reg),
++			 mtk_r32(eth, eth->tx_int_mask_reg));
+ 	}
+ 
+ 	if (tx_done == budget)
+ 		return budget;
+ 
+-	status = mtk_r32(eth, eth->tx_int_status_reg);
+-	if (status & MTK_TX_DONE_INT)
++	if (mtk_r32(eth, eth->tx_int_status_reg) & MTK_TX_DONE_INT)
+ 		return budget;
+ 
+-	if (napi_complete(napi))
++	if (napi_complete_done(napi, tx_done))
+ 		mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
+ 
+ 	return tx_done;
+@@ -1528,36 +1525,33 @@ static int mtk_napi_tx(struct napi_struc
+ static int mtk_napi_rx(struct napi_struct *napi, int budget)
+ {
+ 	struct mtk_eth *eth = container_of(napi, struct mtk_eth, rx_napi);
+-	u32 status, mask;
+-	int rx_done = 0;
+-	int remain_budget = budget;
++	int rx_done_total = 0;
+ 
+ 	mtk_handle_status_irq(eth);
+ 
+-poll_again:
+-	mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS);
+-	rx_done = mtk_poll_rx(napi, remain_budget, eth);
++	do {
++		int rx_done;
+ 
+-	if (unlikely(netif_msg_intr(eth))) {
+-		status = mtk_r32(eth, MTK_PDMA_INT_STATUS);
+-		mask = mtk_r32(eth, MTK_PDMA_INT_MASK);
+-		dev_info(eth->dev,
+-			 "done rx %d, intr 0x%08x/0x%x\n",
+-			 rx_done, status, mask);
+-	}
+-	if (rx_done == remain_budget)
+-		return budget;
++		mtk_w32(eth, MTK_RX_DONE_INT, MTK_PDMA_INT_STATUS);
++		rx_done = mtk_poll_rx(napi, budget - rx_done_total, eth);
++		rx_done_total += rx_done;
++
++		if (unlikely(netif_msg_intr(eth))) {
++			dev_info(eth->dev,
++				 "done rx %d, intr 0x%08x/0x%x\n", rx_done,
++				 mtk_r32(eth, MTK_PDMA_INT_STATUS),
++				 mtk_r32(eth, MTK_PDMA_INT_MASK));
++		}
+ 
+-	status = mtk_r32(eth, MTK_PDMA_INT_STATUS);
+-	if (status & MTK_RX_DONE_INT) {
+-		remain_budget -= rx_done;
+-		goto poll_again;
+-	}
++		if (rx_done_total == budget)
++			return budget;
++
++	} while (mtk_r32(eth, MTK_PDMA_INT_STATUS) & MTK_RX_DONE_INT);
+ 
+-	if (napi_complete(napi))
++	if (napi_complete_done(napi, rx_done_total))
+ 		mtk_rx_irq_enable(eth, MTK_RX_DONE_INT);
+ 
+-	return rx_done + budget - remain_budget;
++	return rx_done_total;
+ }
+ 
+ static int mtk_tx_alloc(struct mtk_eth *eth)

+ 11 - 5
target/linux/generic/pending-5.10/770-14-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch → target/linux/generic/backport-5.10/610-v5.13-50-net-ethernet-mtk_eth_soc-set-PPE-flow-hash-as-skb-ha.patch

@@ -1,12 +1,18 @@
+From fa817272c37ef78e25dc14e4760ac78a7043a18a Mon Sep 17 00:00:00 2001
 From: Felix Fietkau <[email protected]>
 From: Felix Fietkau <[email protected]>
-Date: Sun, 13 Sep 2020 08:27:24 +0200
-Subject: [PATCH] net: ethernet: mtk_eth_soc: set PPE flow hash as skb hash
- if present
+Date: Thu, 22 Apr 2021 22:21:07 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: set PPE flow hash as skb hash if
+ present
 
 
 This improves GRO performance
 This improves GRO performance
 
 
 Signed-off-by: Felix Fietkau <[email protected]>
 Signed-off-by: Felix Fietkau <[email protected]>
+[Ilya: Use MTK_RXD4_FOE_ENTRY instead of GENMASK(13, 0)]
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
 ---
 ---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -30,8 +36,8 @@ Signed-off-by: Felix Fietkau <[email protected]>
  		skb->protocol = eth_type_trans(skb, netdev);
  		skb->protocol = eth_type_trans(skb, netdev);
  		bytes += pktlen;
  		bytes += pktlen;
  
  
-+		hash = trxd.rxd4 & GENMASK(13, 0);
-+		if (hash != GENMASK(13, 0)) {
++		hash = trxd.rxd4 & MTK_RXD4_FOE_ENTRY;
++		if (hash != MTK_RXD4_FOE_ENTRY) {
 +			hash = jhash_1word(hash, 0);
 +			hash = jhash_1word(hash, 0);
 +			skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
 +			skb_set_hash(skb, hash, PKT_HASH_TYPE_L4);
 +		}
 +		}

+ 71 - 0
target/linux/generic/backport-5.10/610-v5.13-51-net-ethernet-mtk_eth_soc-use-iopoll.h-macro-for-DMA-.patch

@@ -0,0 +1,71 @@
+From 3bc8e0aff23be0526af0dbc7973a8866a08d73f1 Mon Sep 17 00:00:00 2001
+From: Ilya Lipnitskiy <[email protected]>
+Date: Thu, 22 Apr 2021 22:21:08 -0700
+Subject: [PATCH] net: ethernet: mtk_eth_soc: use iopoll.h macro for DMA init
+
+Replace a tight busy-wait loop without a pause with a standard
+readx_poll_timeout_atomic routine with a 5 us poll period.
+
+Tested by booting a MT7621 device to ensure the driver initializes
+properly.
+
+Signed-off-by: Ilya Lipnitskiy <[email protected]>
+Reviewed-by: Andrew Lunn <[email protected]>
+Signed-off-by: David S. Miller <[email protected]>
+---
+ drivers/net/ethernet/mediatek/mtk_eth_soc.c | 29 +++++++++------------
+ drivers/net/ethernet/mediatek/mtk_eth_soc.h |  2 +-
+ 2 files changed, 14 insertions(+), 17 deletions(-)
+
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+@@ -2033,25 +2033,22 @@ static int mtk_set_features(struct net_d
+ /* wait for DMA to finish whatever it is doing before we start using it again */
+ static int mtk_dma_busy_wait(struct mtk_eth *eth)
+ {
+-	unsigned long t_start = jiffies;
++	unsigned int reg;
++	int ret;
++	u32 val;
+ 
+-	while (1) {
+-		if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) {
+-			if (!(mtk_r32(eth, MTK_QDMA_GLO_CFG) &
+-			      (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)))
+-				return 0;
+-		} else {
+-			if (!(mtk_r32(eth, MTK_PDMA_GLO_CFG) &
+-			      (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)))
+-				return 0;
+-		}
++	if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA))
++		reg = MTK_QDMA_GLO_CFG;
++	else
++		reg = MTK_PDMA_GLO_CFG;
+ 
+-		if (time_after(jiffies, t_start + MTK_DMA_BUSY_TIMEOUT))
+-			break;
+-	}
++	ret = readx_poll_timeout_atomic(__raw_readl, eth->base + reg, val,
++					!(val & (MTK_RX_DMA_BUSY | MTK_TX_DMA_BUSY)),
++					5, MTK_DMA_BUSY_TIMEOUT_US);
++	if (ret)
++		dev_err(eth->dev, "DMA init timeout\n");
+ 
+-	dev_err(eth->dev, "DMA init timeout\n");
+-	return -1;
++	return ret;
+ }
+ 
+ static int mtk_dma_init(struct mtk_eth *eth)
+--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
+@@ -213,7 +213,7 @@
+ #define MTK_TX_DMA_BUSY		BIT(1)
+ #define MTK_RX_DMA_EN		BIT(2)
+ #define MTK_TX_DMA_EN		BIT(0)
+-#define MTK_DMA_BUSY_TIMEOUT	HZ
++#define MTK_DMA_BUSY_TIMEOUT_US	1000000
+ 
+ /* QDMA Reset Index Register */
+ #define MTK_QDMA_RST_IDX	0x1A08

+ 2 - 2
target/linux/mediatek/patches-5.10/700-net-ethernet-mtk_eth_soc-add-support-for-coherent-DM.patch

@@ -37,7 +37,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  #include <linux/mfd/syscon.h>
  #include <linux/mfd/syscon.h>
  #include <linux/regmap.h>
  #include <linux/regmap.h>
  #include <linux/clk.h>
  #include <linux/clk.h>
-@@ -2482,6 +2483,13 @@ static int mtk_hw_init(struct mtk_eth *e
+@@ -2473,6 +2474,13 @@ static int mtk_hw_init(struct mtk_eth *e
  	if (ret)
  	if (ret)
  		goto err_disable_pm;
  		goto err_disable_pm;
  
  
@@ -51,7 +51,7 @@ Signed-off-by: Felix Fietkau <[email protected]>
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
  	if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) {
  		ret = device_reset(eth->dev);
  		ret = device_reset(eth->dev);
  		if (ret) {
  		if (ret) {
-@@ -3061,6 +3069,16 @@ static int mtk_probe(struct platform_dev
+@@ -3053,6 +3061,16 @@ static int mtk_probe(struct platform_dev
  		}
  		}
  	}
  	}
  
  

+ 2 - 2
target/linux/ramips/patches-5.10/700-net-ethernet-mediatek-support-net-labels.patch

@@ -14,7 +14,7 @@ Signed-off-by: René van Dorst <[email protected]>
 
 
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
 +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
-@@ -2901,6 +2901,7 @@ static const struct net_device_ops mtk_n
+@@ -2893,6 +2893,7 @@ static const struct net_device_ops mtk_n
  
  
  static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
  static int mtk_add_mac(struct mtk_eth *eth, struct device_node *np)
  {
  {
@@ -22,7 +22,7 @@ Signed-off-by: René van Dorst <[email protected]>
  	const __be32 *_id = of_get_property(np, "reg", NULL);
  	const __be32 *_id = of_get_property(np, "reg", NULL);
  	phy_interface_t phy_mode;
  	phy_interface_t phy_mode;
  	struct phylink *phylink;
  	struct phylink *phylink;
-@@ -2993,6 +2994,9 @@ static int mtk_add_mac(struct mtk_eth *e
+@@ -2985,6 +2986,9 @@ static int mtk_add_mac(struct mtk_eth *e
  
  
  	eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;
  	eth->netdev[id]->max_mtu = MTK_MAX_RX_LENGTH - MTK_RX_ETH_HLEN;