Re: mediatek: fix NETDEV WATCHDOG: eth0 (mtk_SOC_eth): Transmit queue 0 timed out
On Sun, Oct 3, 2021 at 5:18 AM Adrian Schmutzler wrote: > > Hi, > > > -Original Message- > > From: openwrt-devel [mailto:openwrt-devel-boun...@lists.openwrt.org] > > On Behalf Of daxiong > > Sent: Sonntag, 3. Oktober 2021 13:35 > > To: openwrt-devel@lists.openwrt.org > > Subject: mediatek: fix NETDEV WATCHDOG: eth0 (mtk_SOC_eth): Transmit > > queue 0 timed out > > > > Use flow control or BQL maybe lead to bug. > > Iperf3 was usedfor 24 hours, Transmit Queue 0 timed out may occur. > > example: > >Server: iperf3 -s > >Client: iperf3 -c 172.16.10.20 > > > > Signed-off-by: daxiong > > Is this your (full) real name? daxiong = big bear. So probably not. > > Best > > Adrian > > > --- > > ...iatek-ethernet-transmit-queue-timeout-bug.patch | 109 > > + > > 1 file changed, 109 insertions(+) > > create mode 100644 target/linux/ramips/patches-5.4/500-mediatek- > > ethernet-transmit-queue-timeout-bug.patch > > > > diff --git a/target/linux/ramips/patches-5.4/500-mediatek-ethernet- > > transmit-queue-timeout-bug.patch b/target/linux/ramips/patches-5.4/500- > > mediatek-ethernet-transmit-queue-timeout-bug.patch > > new file mode 100644 > > index 000..d5da9e4 > > --- /dev/null > > +++ b/target/linux/ramips/patches-5.4/500-mediatek-ethernet-transmit- > > que > > +++ ue-timeout-bug.patch > > @@ -0,0 +1,109 @@ > > +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c2021-10-03 > > 18:46:25.065801660 +0800 > > b/drivers/net/ethernet/mediatek/mtk_eth_soc.c2021-10-03 > > 19:13:24.931017393 +0800 > > +@@ -26,6 +26,11 @@ > > + > > + #include "mtk_eth_soc.h" > > + > > ++//Bug info: NETDEV WATCHDOG: eth0 (mtk_soc_eth): transmit queue 0 > > ++timed out //Bug fixed: BQL and FC maybe QUEUE to be stopped forever > > ++#define DISABLE_MTK_BQL //disable Byte Queue Limit #define > > ++DISABLE_MTK_FC //disable Flow Control > > ++ > > + static int mtk_msg_level = -1; > > + module_param_named(msg_level, mtk_msg_level, int, 0); > > +MODULE_PARM_DESC(msg_level, "Message level > > +(-1=defaults,0=none,...,16=all)"); > > +@@ -380,6 +385,10 @@ static void mtk_mac_config(struct phylin > > + mcr_new |= MAC_MCR_FORCE_RX_FC; > > + } > > + > > ++#ifdef DISABLE_MTK_FC > > ++mcr_new &= ~(MAC_MCR_FORCE_RX_FC | > > MAC_MCR_FORCE_TX_FC); > > ++#endif > > ++ > > + /* Only update control register when needed! */ > > + if (mcr_new != mcr_cur) > > + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); > > @@ -535,8 +544,10 > > +@@ static void mtk_validate(struct phylink_ > > + } > > + } > > + > > ++#ifndef DISABLE_MTK_FC > > + phylink_set(mask, Pause); > > + phylink_set(mask, Asym_Pause); > > ++#endif > > + > > + linkmode_and(supported, supported, mask); > > + linkmode_and(state->advertising, state->advertising, mask); @@ > > +-1071,8 +1082,10 @@ static int mtk_tx_map(struct sk_buff *sk > > + txd_pdma->txd2 |= TX_DMA_LS1; > > + } > > + > > ++#ifndef DISABLE_MTK_BQL > > + netdev_sent_queue(dev, skb->len); > > + skb_tx_timestamp(skb); > > ++#endif > > + > > + ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); > > + atomic_sub(n_desc, >free_count); @@ -1496,7 +1509,9 @@ > > static > > +int mtk_poll_tx(struct mtk_eth *e > > + for (i = 0; i < MTK_MAC_COUNT; i++) { > > + if (!eth->netdev[i] || !done[i]) > > + continue; > > ++#ifndef DISABLE_MTK_BQL > > + netdev_completed_queue(eth->netdev[i], done[i], > > bytes[i]); > > ++#endif > > + total += done[i]; > > + eth->tx_packets += done[i]; > > + eth->tx_bytes += bytes[i]; > > +--- a/drivers/net/dsa/mt7530.c 2021-10-03 18:47:00.077800119 +0800 > > b/drivers/net/dsa/mt7530.c 2021-10-03 19:13:37.807016826 +0800 > > +@@ -22,6 +22,8 @@ > > + > > + #include "mt7530.h" > > + > > ++#define DISABLE_MTK_FC //disable Flow Control > > ++ > > + /* String, offset, and register size in bytes if different from 4 > > +bytes */ static const struct mt7530_mib_desc mt7530_mib[] = { > > + MIB_DESC(1, 0x00, "TxDrop"), > > +@@ -1281,6 +1283,18 @@ mt7530_setup(struct dsa_switch *ds) > > + val |= MHWTRAP_MANUAL; > > + mt7530_write(priv, MT7530_MHWTRAP, val); > > + > > ++#ifdef DISABLE_MTK_FC > > ++usleep_range(10, 20); > > ++ > > ++val = mt7530_read(priv, 0x1FE0); > > ++val &= ~BIT(31); > > ++mt7530_write(priv, 0x1FE0, val); > > ++ > > ++mt7530_write(priv, MT7530_PMCR_P(5), 0x5e30b); > > ++mt7530_write(priv, MT7530_PMCR_P(6), 0x5e30b); > > ++usleep_range(10, 20); > > ++#endif > > ++ > > + priv->p6_interface = PHY_INTERFACE_MODE_NA; > > + > > + /* Enable and reset MIB counters */ > > +@@ -1427,6 +1441,10 @@ static void mt7530_phylink_mac_config(st > > + mcr_new |= PMCR_RX_FC_EN; > > + } > > + > > ++#ifdef DISABLE_MTK_FC > > ++mcr_new &=
RE: mediatek: fix NETDEV WATCHDOG: eth0 (mtk_SOC_eth): Transmit queue 0 timed out
Hi, > -Original Message- > From: openwrt-devel [mailto:openwrt-devel-boun...@lists.openwrt.org] > On Behalf Of daxiong > Sent: Sonntag, 3. Oktober 2021 13:35 > To: openwrt-devel@lists.openwrt.org > Subject: mediatek: fix NETDEV WATCHDOG: eth0 (mtk_SOC_eth): Transmit > queue 0 timed out > > Use flow control or BQL maybe lead to bug. > Iperf3 was usedfor 24 hours, Transmit Queue 0 timed out may occur. > example: >Server: iperf3 -s >Client: iperf3 -c 172.16.10.20 > > Signed-off-by: daxiong Is this your (full) real name? Best Adrian > --- > ...iatek-ethernet-transmit-queue-timeout-bug.patch | 109 > + > 1 file changed, 109 insertions(+) > create mode 100644 target/linux/ramips/patches-5.4/500-mediatek- > ethernet-transmit-queue-timeout-bug.patch > > diff --git a/target/linux/ramips/patches-5.4/500-mediatek-ethernet- > transmit-queue-timeout-bug.patch b/target/linux/ramips/patches-5.4/500- > mediatek-ethernet-transmit-queue-timeout-bug.patch > new file mode 100644 > index 000..d5da9e4 > --- /dev/null > +++ b/target/linux/ramips/patches-5.4/500-mediatek-ethernet-transmit- > que > +++ ue-timeout-bug.patch > @@ -0,0 +1,109 @@ > +--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c2021-10-03 > 18:46:25.065801660 +0800 > b/drivers/net/ethernet/mediatek/mtk_eth_soc.c2021-10-03 > 19:13:24.931017393 +0800 > +@@ -26,6 +26,11 @@ > + > + #include "mtk_eth_soc.h" > + > ++//Bug info: NETDEV WATCHDOG: eth0 (mtk_soc_eth): transmit queue 0 > ++timed out //Bug fixed: BQL and FC maybe QUEUE to be stopped forever > ++#define DISABLE_MTK_BQL //disable Byte Queue Limit #define > ++DISABLE_MTK_FC //disable Flow Control > ++ > + static int mtk_msg_level = -1; > + module_param_named(msg_level, mtk_msg_level, int, 0); > +MODULE_PARM_DESC(msg_level, "Message level > +(-1=defaults,0=none,...,16=all)"); > +@@ -380,6 +385,10 @@ static void mtk_mac_config(struct phylin > + mcr_new |= MAC_MCR_FORCE_RX_FC; > + } > + > ++#ifdef DISABLE_MTK_FC > ++mcr_new &= ~(MAC_MCR_FORCE_RX_FC | > MAC_MCR_FORCE_TX_FC); > ++#endif > ++ > + /* Only update control register when needed! */ > + if (mcr_new != mcr_cur) > + mtk_w32(mac->hw, mcr_new, MTK_MAC_MCR(mac->id)); > @@ -535,8 +544,10 > +@@ static void mtk_validate(struct phylink_ > + } > + } > + > ++#ifndef DISABLE_MTK_FC > + phylink_set(mask, Pause); > + phylink_set(mask, Asym_Pause); > ++#endif > + > + linkmode_and(supported, supported, mask); > + linkmode_and(state->advertising, state->advertising, mask); @@ > +-1071,8 +1082,10 @@ static int mtk_tx_map(struct sk_buff *sk > + txd_pdma->txd2 |= TX_DMA_LS1; > + } > + > ++#ifndef DISABLE_MTK_BQL > + netdev_sent_queue(dev, skb->len); > + skb_tx_timestamp(skb); > ++#endif > + > + ring->next_free = mtk_qdma_phys_to_virt(ring, txd->txd2); > + atomic_sub(n_desc, >free_count); @@ -1496,7 +1509,9 @@ > static > +int mtk_poll_tx(struct mtk_eth *e > + for (i = 0; i < MTK_MAC_COUNT; i++) { > + if (!eth->netdev[i] || !done[i]) > + continue; > ++#ifndef DISABLE_MTK_BQL > + netdev_completed_queue(eth->netdev[i], done[i], > bytes[i]); > ++#endif > + total += done[i]; > + eth->tx_packets += done[i]; > + eth->tx_bytes += bytes[i]; > +--- a/drivers/net/dsa/mt7530.c 2021-10-03 18:47:00.077800119 +0800 > b/drivers/net/dsa/mt7530.c 2021-10-03 19:13:37.807016826 +0800 > +@@ -22,6 +22,8 @@ > + > + #include "mt7530.h" > + > ++#define DISABLE_MTK_FC //disable Flow Control > ++ > + /* String, offset, and register size in bytes if different from 4 > +bytes */ static const struct mt7530_mib_desc mt7530_mib[] = { > + MIB_DESC(1, 0x00, "TxDrop"), > +@@ -1281,6 +1283,18 @@ mt7530_setup(struct dsa_switch *ds) > + val |= MHWTRAP_MANUAL; > + mt7530_write(priv, MT7530_MHWTRAP, val); > + > ++#ifdef DISABLE_MTK_FC > ++usleep_range(10, 20); > ++ > ++val = mt7530_read(priv, 0x1FE0); > ++val &= ~BIT(31); > ++mt7530_write(priv, 0x1FE0, val); > ++ > ++mt7530_write(priv, MT7530_PMCR_P(5), 0x5e30b); > ++mt7530_write(priv, MT7530_PMCR_P(6), 0x5e30b); > ++usleep_range(10, 20); > ++#endif > ++ > + priv->p6_interface = PHY_INTERFACE_MODE_NA; > + > + /* Enable and reset MIB counters */ > +@@ -1427,6 +1441,10 @@ static void mt7530_phylink_mac_config(st > + mcr_new |= PMCR_RX_FC_EN; > + } > + > ++#ifdef DISABLE_MTK_FC > ++mcr_new &= ~(PMCR_TX_FC_EN | PMCR_RX_FC_EN); > ++#endif > ++ > + if (mcr_new != mcr_cur) > + mt7530_write(priv, MT7530_PMCR_P(port), mcr_new); } > @@ -1505,8 > ++1523,10 @@ unsupported: > + } > + } > + > ++#ifndef DISABLE_MTK_FC > + phylink_set(mask, Pause); > + phylink_set(mask, Asym_Pause); > ++#endif > + > +