1
linux/drivers/net/e1000
David S. Miller 49d85c502e [NET]: Fix interrupt semaphore corruption in Intel drivers.
Several of the Intel ethernet drivers keep an atomic counter used to
manage when to actually hit the hardware with a disable or an enable.

The way the net_rx_work() breakout logic works during a pending
napi_disable() is that it simply unschedules the poll even if it
still has work.

This can potentially leave interrupts disabled, but that is OK
because all of the drivers are about to disable interrupts
anyways in all such code paths that do a napi_disable().

Unfortunately, this trips up the semaphore used here in the Intel
drivers.  If you hit this case, when you try to bring the interface
back up it won't enable interrupts.  A reload of the driver module
fixes it of course.

So what we do is make sure all the sequences now go:

	napi_disable();
	atomic_set(&adapter->irq_sem, 0);
	*_irq_disable();

which makes sure the counter is always in the correct state.

Reported by Robert Olsson.

Signed-off-by: David S. Miller <davem@davemloft.net>
2008-01-20 20:31:39 -08:00
..
e1000_ethtool.c e1000: fix memcpy in e1000_get_strings 2007-12-07 15:01:43 -05:00
e1000_hw.c e1000: sparse warnings fixes 2007-10-30 14:32:17 -04:00
e1000_hw.h PCI-X/PCI-Express read control interfaces: use them in e1000 2007-10-10 16:53:50 -07:00
e1000_main.c [NET]: Fix interrupt semaphore corruption in Intel drivers. 2008-01-20 20:31:39 -08:00
e1000_osdep.h e1000: clean up debug output defines 2007-02-05 16:58:41 -05:00
e1000_param.c e1000: sparse warnings fixes 2007-10-30 14:32:17 -04:00
e1000.h e1000: sparse warnings fixes 2007-10-30 14:32:17 -04:00
Makefile