diff options
author | John Crispin <john@phrozen.org> | 2017-08-30 09:02:39 +0200 |
---|---|---|
committer | John Crispin <john@phrozen.org> | 2017-08-30 17:05:10 +0200 |
commit | 97a6ef513f45b40c635159c9b4b88f3eaa1498d2 (patch) | |
tree | 2bbb99b5779203deb1251492100452bd5efba02b /target/linux/mediatek/patches-4.9/0060-eth-debug.patch | |
parent | 7a9410618d97c628b2b6f3bcf5ea2af4546124a5 (diff) | |
download | upstream-97a6ef513f45b40c635159c9b4b88f3eaa1498d2.tar.gz upstream-97a6ef513f45b40c635159c9b4b88f3eaa1498d2.tar.bz2 upstream-97a6ef513f45b40c635159c9b4b88f3eaa1498d2.zip |
mediatek: various additional ethernet fixes
* fixes default affinity
* adds a napi watchdog - we were seeing stalled TX queues
* adds up/down locking
Signed-off-by: John Crispin <john@phrozen.org>
Diffstat (limited to 'target/linux/mediatek/patches-4.9/0060-eth-debug.patch')
-rw-r--r-- | target/linux/mediatek/patches-4.9/0060-eth-debug.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/target/linux/mediatek/patches-4.9/0060-eth-debug.patch b/target/linux/mediatek/patches-4.9/0060-eth-debug.patch new file mode 100644 index 0000000000..fb36ddf380 --- /dev/null +++ b/target/linux/mediatek/patches-4.9/0060-eth-debug.patch @@ -0,0 +1,73 @@ +Index: linux-4.9.44/drivers/net/ethernet/mediatek/mtk_eth_soc.c +=================================================================== +--- linux-4.9.44.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.c ++++ linux-4.9.44/drivers/net/ethernet/mediatek/mtk_eth_soc.c +@@ -851,6 +851,7 @@ static void mtk_stop_queue(struct mtk_et + continue; + netif_stop_queue(eth->netdev[i]); + } ++ mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); + } + + static int mtk_start_xmit(struct sk_buff *skb, struct net_device *dev) +@@ -1885,6 +1886,19 @@ static int mtk_start_dma(struct mtk_eth + return 0; + } + ++#define NAPI_TIMER_EXPIRE HZ ++ ++static void napi_timer_handler(unsigned long priv) ++{ ++ struct mtk_eth *eth = (struct mtk_eth*) priv; ++ ++ mtk_wake_queue(eth); ++ mtk_handle_irq_rx(0, eth); ++ mtk_handle_irq_tx(0, eth); ++ ++ mod_timer(ð->napi_timer, jiffies + NAPI_TIMER_EXPIRE); ++} ++ + static int mtk_open(struct net_device *dev) + { + struct mtk_mac *mac = netdev_priv(dev); +@@ -1901,6 +1915,9 @@ static int mtk_open(struct net_device *d + napi_enable(ð->rx_napi); + mtk_tx_irq_enable(eth, MTK_TX_DONE_INT); + mtk_rx_irq_enable(eth, MTK_RX_DONE_INT); ++ ++ setup_timer(ð->napi_timer, napi_timer_handler, (unsigned long) eth); ++ mod_timer(ð->napi_timer, jiffies + NAPI_TIMER_EXPIRE); + } + atomic_inc(ð->dma_refcnt); + +@@ -1945,6 +1962,8 @@ static int mtk_stop(struct net_device *d + if (!atomic_dec_and_test(ð->dma_refcnt)) + return 0; + ++ del_timer(ð->napi_timer); ++ + mtk_tx_irq_disable(eth, MTK_TX_DONE_INT); + mtk_rx_irq_disable(eth, MTK_RX_DONE_INT); + napi_disable(ð->tx_napi); +@@ -2524,7 +2543,7 @@ static int mtk_add_mac(struct mtk_eth *e + mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET; + + SET_NETDEV_DEV(eth->netdev[id], eth->dev); +- eth->netdev[id]->watchdog_timeo = 15 * HZ; ++ eth->netdev[id]->watchdog_timeo = 30 * HZ; + eth->netdev[id]->netdev_ops = &mtk_netdev_ops; + eth->netdev[id]->base_addr = (unsigned long)eth->base; + +Index: linux-4.9.44/drivers/net/ethernet/mediatek/mtk_eth_soc.h +=================================================================== +--- linux-4.9.44.orig/drivers/net/ethernet/mediatek/mtk_eth_soc.h ++++ linux-4.9.44/drivers/net/ethernet/mediatek/mtk_eth_soc.h +@@ -601,6 +601,8 @@ struct mtk_eth { + struct mii_bus *mii_bus; + struct work_struct pending_work; + unsigned long state; ++ ++ struct timer_list napi_timer; + }; + + /* struct mtk_mac - the structure that holds the info about the MACs of the |