fep->work_rx and fep->work_tx are both non-zero, as long as the NAPI
softirq hasn't finished its work. So if the current IRQ does not
signal any RX or TX completion, but some unrelated event, the path to
schedule the NAPI context is still entered.

The handler works correctly as in this case napi_schedule_prep() will
reject the scheduling attempt, but the flow can still be optimized by
not trying to schedule if the IRQ doesn't signal RX or TX completion.

Signed-off-by: Lucas Stach <l.st...@pengutronix.de>
---
 drivers/net/ethernet/freescale/fec_main.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c 
b/drivers/net/ethernet/freescale/fec_main.c
index 0b70c07eb703..2043e140e9bd 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1587,14 +1587,14 @@ fec_enet_interrupt(int irq, void *dev_id)
        int_events = readl_relaxed(fep->hwp + FEC_IEVENT) &
                     readl_relaxed(fep->hwp + FEC_IMASK);
        writel(int_events, fep->hwp + FEC_IEVENT);
-       fec_enet_collect_events(fep, int_events);
 
-       if ((fep->work_tx || fep->work_rx) && fep->link) {
+       if ((int_events & (FEC_ENET_RXF | FEC_ENET_TXF)) && fep->link) {
                ret = IRQ_HANDLED;
 
                if (napi_schedule_prep(&fep->napi)) {
                        /* Disable the NAPI interrupts */
                        writel(FEC_NAPI_IMASK, fep->hwp + FEC_IMASK);
+                       fec_enet_collect_events(fep, int_events);
                        __napi_schedule(&fep->napi);
                }
        }
-- 
2.11.0

Reply via email to