#18922: eth1 (ag71xx): transmit queue 0 timed out
------------------------+--------------------------------
  Reporter:  fpv2000@…  |      Owner:  developers
      Type:  defect     |     Status:  reopened
  Priority:  normal     |  Milestone:  Chaos Calmer 15.05
 Component:  kernel     |    Version:  Trunk
Resolution:             |   Keywords:
------------------------+--------------------------------

Comment (by psyke83):

 This patch solves the sirq storm that occurs after recovery from tx
 timeout:

 {{{
 diff --git
 a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
 b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
 index 31b38d7..f02f45e 100644
 ---
 a/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
 +++
 b/target/linux/ar71xx/files/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
 @@ -183,6 +183,8 @@ static void ag71xx_ring_tx_init(struct ag71xx *ag)
         ring->curr = 0;
         ring->dirty = 0;
         netdev_reset_queue(ag->dev);
 +
 +       ag71xx_wr(ag, AG71XX_REG_TX_DESC, ag->tx_ring.descs_dma);
  }

  static void ag71xx_ring_rx_clean(struct ag71xx *ag)
 @@ -272,6 +274,8 @@ static int ag71xx_ring_rx_init(struct ag71xx *ag)
         ring->curr = 0;
         ring->dirty = 0;

 +       ag71xx_wr(ag, AG71XX_REG_RX_DESC, ag->rx_ring.descs_dma);
 +
         return ret;
  }

 @@ -652,9 +656,6 @@ static int ag71xx_open(struct net_device *dev)
         netif_carrier_off(dev);
         ag71xx_phy_start(ag);

 -       ag71xx_wr(ag, AG71XX_REG_TX_DESC, ag->tx_ring.descs_dma);
 -       ag71xx_wr(ag, AG71XX_REG_RX_DESC, ag->rx_ring.descs_dma);
 -
         ag71xx_hw_set_macaddr(ag, dev->dev_addr);

         netif_start_queue(dev);
 @@ -872,6 +873,8 @@ static void ag71xx_restart_work_func(struct
 work_struct *work)

         if (ag71xx_get_pdata(ag)->is_ar724x) {
                 ag->link = 0;
 +               ag71xx_rings_cleanup(ag);
 +               ag71xx_rings_init(ag);
                 ag71xx_link_adjust(ag);
                 return;
         }
 }}}

 I manually triggered a timeout a dozen times, and the interface recovered
 each time without any issues or sirq storms. If someone can suggest a
 better fix, please let me know. For the moment, one small issue is that
 the ag71xx_rings_init return code is not handled, so if that function
 fails for any reason, there could be problems.

--
Ticket URL: <https://dev.openwrt.org/ticket/18922#comment:28>
OpenWrt <http://openwrt.org>
Opensource Wireless Router Technology
_______________________________________________
openwrt-tickets mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-tickets

Reply via email to