[PATCH 1/2] net: fec: don't ack masked interrupt events

Lucas Stach l.stach at pengutronix.de
Fri Aug 26 15:53:38 UTC 2016


Sorry, please ignore the FEC patches. Those are test patches still
residing in my to-send folder. Sorry for the noise.

Am Freitag, den 26.08.2016, 17:49 +0200 schrieb Lucas Stach:
> The FEC doesn't have a real interrupt status register, that takes
> into account the mask status of the IRQ. The driver reads the raw
> interrupt event register, which also reports events for masked
> IRQs.
> 
> The driver needs to apply the current mask itself, to avoid acking
> IRQs that are currently masked, as NAPI relies on the masking to
> hide the IRQs. The current behavior of just acking all interrupts
> regardless of their mask status opens the driver up the "rotting
> packet" race-window, as described in the original NAPI-HOWTO, which
> has been observed in the wild.
> 
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> ---
>  drivers/net/ethernet/freescale/fec_main.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
> index 01f7e811739b..498264969e89 100644
> --- a/drivers/net/ethernet/freescale/fec_main.c
> +++ b/drivers/net/ethernet/freescale/fec_main.c
> @@ -1572,7 +1572,8 @@ fec_enet_interrupt(int irq, void *dev_id)
>  	uint int_events;
>  	irqreturn_t ret = IRQ_NONE;
>  
> -	int_events = readl(fep->hwp + FEC_IEVENT);
> +	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);
>  




More information about the dri-devel mailing list