If you look in file drivers/net/ethernet/renesas/sh_eth.c, you will find function "sh_eth_interrupt".
The driver should only return "IRQ_NONE" if the driver thinks an interrupt has occurred that was not caused by the hardware.
See lines:
/* Get interrupt status */ intr_status = sh_eth_read(ndev, EESR); /* Mask it with the interrupt mask, forcing ECI interrupt to be always * enabled since it's the one that comes thru regardless of the mask, * and we need to fully handle it in sh_eth_error() in order to quench * it as it doesn't get cleared by just writing 1 to the ECI bit... */ intr_enable = sh_eth_read(ndev, EESIPR); intr_status &= intr_enable | DMAC_M_ECI; if (intr_status & (EESR_RX_CHECK | cd->tx_check | cd->eesr_err_check)) ret = IRQ_HANDLED; else goto other_irq; |
What values do you get when you print registers EESR and EESIPR when this happens?
For example:
intr_enable = sh_eth_read(ndev, EESIPR); intr_status &= intr_enable | DMAC_M_ECI; if (intr_status & (EESR_RX_CHECK | cd->tx_check | cd->eesr_err_check)) ret = IRQ_HANDLED; else { printk("EESR=%04lX, EESIPR=%04lX\n", sh_eth_read(ndev, EESR), sh_eth_read(ndev, EESIPR)); goto other_irq; } |
Side note, in the upstream version, the warning messages "Receive Descriptor Empty" and "Receive FIFO Overflow" were removed:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/drivers/net/ethernet/renesas/sh_eth.c?id=dc1d0e6d55006a48ebc0f40a74485ca430f05046
Also, if you keep running into a lot of buffer under runs, you can try adjusting the buffer settings at the top of the file sh_eth.h