For others that are having this problem, a fix is to remove the
bogus "sti()" from the 8390 interrupt handler (8390.c). Some of the
dis/enable_irq() stuff for SMP may also be avoided -- masking IRQs
on the card should be sufficient (if done in all the right places).
[Note: I am not 100% sure on the SMP stuff as I am still trying to
clarify in my mind just what default exclusion guarantees exist on
SMP between (a) IRQ handlers and (b) themselves and (c) bh handlers.
Regardless, doing a __global_sti on each net IRQ is just plain wrong.]
>From searching the patches, I found the sti() was included in 2.1.49 to
8390.c, along with adding SA_INTERRUPT to the ne2000 interrupt handler,
so I suspect it was an "attempt" to fix SMP behaviour. (Of course
this neglects the fact that 10 or so other drivers also use 8390.c
without SA_INTERRUPT). Then in 2.1.60, the SA_INTERRUPT was tossed
from ne.c when the SA_SHIRQ flag was added, but the sti was left behind.
[Minor gripe: it would have been nice if whoever did these patches had
at least cc'd me as per the MAINTAINERS file and the big fat warning at
the top of 8390.c -- even though I was travelling during a large part of
the 2.1.x development cycle, I was still following e-mail.]
Paul.
--- linux-21105/drivers/net/8390.c Wed Jun 10 13:49:33 1998
+++ linux/drivers/net/8390.c Tue Jun 9 13:42:25 1998
@@ -334,7 +334,6 @@
}
dev->interrupt = 1;
- sti();
/* Change to page 0 and read the intr status reg. */
outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu