diff --git a/drivers/network/imx/ethernet.c b/drivers/network/imx/ethernet.c index 90eea3857..a6c77e914 100644 --- a/drivers/network/imx/ethernet.c +++ b/drivers/network/imx/ethernet.c @@ -205,6 +205,7 @@ static void handle_irq(void) while (e & IRQ_MASK) { if (e & NETIRQ_TXF) { tx_return(); + tx_provide(); } if (e & NETIRQ_RXF) { rx_return(); diff --git a/drivers/network/meson/ethernet.c b/drivers/network/meson/ethernet.c index ea745b8fd..fa2f4281a 100644 --- a/drivers/network/meson/ethernet.c +++ b/drivers/network/meson/ethernet.c @@ -210,18 +210,24 @@ static void tx_return(void) static void handle_irq() { uint32_t e = eth_dma->status; - if (e & DMA_INTR_RXF) { - rx_return(); - } - if (e & DMA_INTR_TXF) { - tx_return(); - } - if (e & DMA_INTR_ABNORMAL) { - if (e & DMA_INTR_FBE) { - sddf_dprintf("Ethernet device fatal bus error\n"); + eth_dma->status &= e; + + while (e & DMA_INTR_MASK) { + if (e & DMA_INTR_RXF) { + rx_return(); } + if (e & DMA_INTR_TXF) { + tx_return(); + tx_provide(); + } + if (e & DMA_INTR_ABNORMAL) { + if (e & DMA_INTR_FBE) { + sddf_dprintf("Ethernet device fatal bus error\n"); + } + } + e = eth_dma->status; + eth_dma->status &= e; } - eth_dma->status &= e; } static void eth_setup(void)