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: f07fe36f22
("kernel: update flow offload patches to upstream version")
Cc: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
110 lines
3.4 KiB
Diff
110 lines
3.4 KiB
Diff
From db2c7b353db3b3f71b55f9ff4627d8a786446fbe Mon Sep 17 00:00:00 2001
|
|
From: Ilya Lipnitskiy <ilya.lipnitskiy@gmail.com>
|
|
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 <kuba@kernel.org>
|
|
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 | 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)
|