From: Lucas Stach <l.st...@pengutronix.de> Sent: Thursday, December 07, 2017 
1:25 AM
>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

The patch seems fine, and patch#1 is better to cache imask as David's comment.  
Thanks.

Acked-by: Fugang Duan <fugang.d...@nxp.com>

Reply via email to