Subject: Re: [PATCH 2.6] natsemi.c NAPI

From: "David S. Miller" <[email-masked]>
Date: Mon, 20 Sep 2004 11:57:46 -0700

On Mon, 20 Sep 2004 16:10:30 +0200
Harald Welte <[email-masked]> wrote:

> +static inline void natsemi_irq_enable(struct netdev_private *np)
> +{
> +	/* Enable interrupts by setting the interrupt mask. */
> +	writel(DEFAULT_INTR, np->base_addr + IntrMask);
> +	writel(1, np->base_addr + IntrEnable);
> +	mb();
> +}
> +
> +static inline void natsemi_irq_disable(struct netdev_private *np)
> +{
> +	writel(0, np->base_addr + IntrEnable);
> +	mb();
> +}

Kill the mb(), try using:

	readl(np->base_addr + IntrEnable);

in it's place.

This driver (before the NAPI patch) is a bit buggy, it does
no RX processing SMP locking.  So if one one cpu you're doing
RX interrupt processing, and on another cpu tx_timeout() runs
we're totally screwed.

This is not caused by Harald's patch, but there are implications
for his NAPI patch once it is fixed.