> The purpose of resetting the TX queue is to reset the > byte and packet count as well as to clear the software > flow control XOFF bit. > > MediaTek developers pointed out that netdev_reset_queue would only > resets queue 0 of the network device. > > Queues that are not reset may cause unexpected issues. > > Packets may stop being sent after reset and "transmit timeout" log may > be displayed. > > Import fix from MediaTek's SDK to resolve this issue. > > Link: https://git01.mediatek.com/plugins/gitiles/openwrt/feeds/mtk-openwrt-feeds/+/319c0d9905579a46dc448579f892f364f1f84818 > Fixes: f63959c7eec31 ("net: ethernet: mtk_eth_soc: implement multi-queue support for per-port queues") > Signed-off-by: Daniel Golle > --- > drivers/net/ethernet/mediatek/mtk_eth_soc.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > index 217355d79bbb7..d6d4c2daebab0 100644 > --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c > +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c > @@ -3274,11 +3274,19 @@ static int mtk_dma_init(struct mtk_eth *eth) > static void mtk_dma_free(struct mtk_eth *eth) > { > const struct mtk_soc_data *soc = eth->soc; > - int i; > + int i, j, txqs = 1; > + > + if (MTK_HAS_CAPS(eth->soc->caps, MTK_QDMA)) > + txqs = MTK_QDMA_NUM_QUEUES; > + > + for (i = 0; i < MTK_MAX_DEVS; i++) { > + if (!eth->netdev[i]) > + continue; > + > + for (j = 0; j < txqs; j++) > + netdev_tx_reset_queue(netdev_get_tx_queue(eth->netdev[i], j)); nit: you can use netdev_tx_reset_subqueue() here. Regards, Lorenzo > + } > > - for (i = 0; i < MTK_MAX_DEVS; i++) > - if (eth->netdev[i]) > - netdev_reset_queue(eth->netdev[i]); > if (!MTK_HAS_CAPS(soc->caps, MTK_SRAM) && eth->scratch_ring) { > dma_free_coherent(eth->dma_dev, > MTK_QDMA_RING_SIZE * soc->tx.desc_size, > -- > 2.49.0