diff options
author | Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com> | 2021-04-23 17:19:22 -0700 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2021-04-30 23:48:37 +0200 |
commit | 0d6f20723047c02bd624f0384df9dc74ee075bc7 (patch) | |
tree | f8ecc404999fafdf99475653201802143f1c60f2 /target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch | |
parent | 4b14b42abfe263ea9f67ff4e29e563e1160005fc (diff) | |
download | upstream-0d6f20723047c02bd624f0384df9dc74ee075bc7.tar.gz upstream-0d6f20723047c02bd624f0384df9dc74ee075bc7.tar.bz2 upstream-0d6f20723047c02bd624f0384df9dc74ee075bc7.zip |
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 <nbd@nbd.name>
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
Diffstat (limited to 'target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch')
-rw-r--r-- | target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch b/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch new file mode 100644 index 0000000000..db21878e92 --- /dev/null +++ b/target/linux/generic/backport-5.10/610-v5.13-46-net-ethernet-mtk_eth_soc-cache-HW-pointer-of-last-fr.patch @@ -0,0 +1,73 @@ +From 4e6bf609569c59b6bd6acf4a607c096cbd820d79 Mon Sep 17 00:00:00 2001 +From: Felix Fietkau <nbd@nbd.name> +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. + +Signed-off-by: Felix Fietkau <nbd@nbd.name> +Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com> +Signed-off-by: David S. Miller <davem@davemloft.net> +--- + 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 ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -1364,7 +1364,7 @@ static int mtk_poll_tx_qdma(struct mtk_e + struct mtk_tx_buf *tx_buf; + u32 cpu, dma; + +- cpu = mtk_r32(eth, MTK_QTX_CRX_PTR); ++ cpu = ring->last_free_ptr; + dma = mtk_r32(eth, MTK_QTX_DRX_PTR); + + desc = mtk_qdma_phys_to_virt(ring, cpu); +@@ -1398,6 +1398,7 @@ static int mtk_poll_tx_qdma(struct mtk_e + cpu = next_cpu; + } + ++ ring->last_free_ptr = cpu; + mtk_w32(eth, cpu, MTK_QTX_CRX_PTR); + + return budget; +@@ -1598,6 +1599,7 @@ static int mtk_tx_alloc(struct mtk_eth * + atomic_set(&ring->free_count, MTK_DMA_SIZE - 2); + ring->next_free = &ring->dma[0]; + ring->last_free = &ring->dma[MTK_DMA_SIZE - 1]; ++ ring->last_free_ptr = (u32)(ring->phys + ((MTK_DMA_SIZE - 1) * sz)); + ring->thresh = MAX_SKB_FRAGS; + + /* make sure that all changes to the dma ring are flushed before we +@@ -1611,9 +1613,7 @@ static int mtk_tx_alloc(struct mtk_eth * + mtk_w32(eth, + ring->phys + ((MTK_DMA_SIZE - 1) * sz), + MTK_QTX_CRX_PTR); +- mtk_w32(eth, +- ring->phys + ((MTK_DMA_SIZE - 1) * sz), +- MTK_QTX_DRX_PTR); ++ mtk_w32(eth, ring->last_free_ptr, MTK_QTX_DRX_PTR); + mtk_w32(eth, (QDMA_RES_THRES << 8) | QDMA_RES_THRES, + MTK_QTX_CFG(0)); + } else { +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -636,6 +636,7 @@ struct mtk_tx_buf { + * @phys: The physical addr of tx_buf + * @next_free: Pointer to the next free descriptor + * @last_free: Pointer to the last free descriptor ++ * @last_free_ptr: Hardware pointer value of the last free descriptor + * @thresh: The threshold of minimum amount of free descriptors + * @free_count: QDMA uses a linked list. Track how many free descriptors + * are present +@@ -646,6 +647,7 @@ struct mtk_tx_ring { + dma_addr_t phys; + struct mtk_tx_dma *next_free; + struct mtk_tx_dma *last_free; ++ u32 last_free_ptr; + u16 thresh; + atomic_t free_count; + int dma_size; |