aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/mediatek/patches-4.9/0060-eth-debug.patch
diff options
context:
space:
mode:
authorJohn Crispin <john@phrozen.org>2017-08-30 09:02:39 +0200
committerJohn Crispin <john@phrozen.org>2017-08-30 17:05:10 +0200
commit97a6ef513f45b40c635159c9b4b88f3eaa1498d2 (patch)
tree2bbb99b5779203deb1251492100452bd5efba02b /target/linux/mediatek/patches-4.9/0060-eth-debug.patch
parent7a9410618d97c628b2b6f3bcf5ea2af4546124a5 (diff)
downloadupstream-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.patch73
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(&eth->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(&eth->rx_napi);
+ mtk_tx_irq_enable(eth, MTK_TX_DONE_INT);
+ mtk_rx_irq_enable(eth, MTK_RX_DONE_INT);
++
++ setup_timer(&eth->napi_timer, napi_timer_handler, (unsigned long) eth);
++ mod_timer(&eth->napi_timer, jiffies + NAPI_TIMER_EXPIRE);
+ }
+ atomic_inc(&eth->dma_refcnt);
+
+@@ -1945,6 +1962,8 @@ static int mtk_stop(struct net_device *d
+ if (!atomic_dec_and_test(&eth->dma_refcnt))
+ return 0;
+
++ del_timer(&eth->napi_timer);
++
+ mtk_tx_irq_disable(eth, MTK_TX_DONE_INT);
+ mtk_rx_irq_disable(eth, MTK_RX_DONE_INT);
+ napi_disable(&eth->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