COMMAND
kernel (actually 3c59x.c)
SYSTEMS AFFECTED
Linux
PROBLEM
Sonny Parlin posted following. Using a home grown client/server
app, Sonny has been able to easily crash Linux. The application
is a simple udp sender/receiver. The udp receiver runs on a Linux
machine with a 3c905b Ethernet card which uses the latest version
of the 3c59x.o module (v0.99L), and the kernel is 2.2.12-20.
By sending the Linux machine a 100MB file as fast as the sender
can send it on a 100Mbps network, the Linux machine responds by
freezing up completely with a console message that states:
eth1: Too much work in interrupt, status e481. Temporarily disabling functions(7b7e).
Unfortunately, temporarily seems to mean "forever"... Here is a
snip from 3c59x.c:
if (--work_done < 0) {
if ((status & (0x7fe - (UpComplete | DownComplete))) == 0) {
/* Just ack these and return. */
outw(AckIntr | UpComplete | DownComplete, ioaddr + EL3_CMD);
} else {
printk(KERN_WARNING "%s: Too much work in interrupt, status "
"%4.4x. Temporarily disabling functions (%4.4x).\n",
dev->name, status, SetStatusEnb | ((~status) & 0x7FE));
/* Disable all pending interrupts. */
outw(SetStatusEnb | ((~status) & 0x7FE), ioaddr + EL3_CMD);
outw(AckIntr | 0x7FF, ioaddr + EL3_CMD);
/* The timer will reenable interrupts. */
break;
}
}
Notice the comment that says "Timer will reenable interrupts"....
That's not happening, my testing has been on two separate machines
with the same kernel/card/driver and neither machine ever comes
back to life. Same occurs on 2.2.13 kernels... so it really is a
nast one... nice one to boot out 100 mbit boxes wich are using
this card a lot.
SOLUTION
Jonathan Poole found this is a problem in the original 3c905 NIC,
and the 3com 905B. He resolved his issues with buying a 3com905C.
However, there's less costing solution. 3COM has new Linux driver
source for 905B and 905C cards on their website. This allows the
cards to run at their full potential and with a great level of
stability.