After one week of debugging the driver in Linux-2.4.9 it seems that in my case it was a compiler bug!
BEWARE: I compiled my kernel with gcc-2.95.2, which
is still quite famous. This compiler provably produces
wrong assembler code, when compiling epic100.c (at least
on my computer).
If you experience some of the problems below and you used gcc-2.95.2 to compile epic100.c, try to compile with gcc-2.95.3. (This worked in my case. I also checked the assembler output directly. It's ok.)
At my work I use an "[SMC] 83C170QF" 100Mbit card as ethernet device. I had some problems to make this card work under Linux-2.4.9.
The original driver was written by Donald Becker (as so many other network drivers), and it seems it is still maintained. (Have a look here ). Unfortunately I wasn't able to compile the driver under a linux-2.4.9 kernel.
The driver already included in linux-2.4.9 is an adopted version of the original driver and seems to be maintained by Jeff Garzik.
However somewhere between linux-2.4.2 and linux-2.4.3 or later, the driver stopped working for some people. The symptoms were Messages of the following sort in /var/log/messages:
kernel: eth0: Too much work at interrupt, IntrStatus=0x008d0004
It seems that Heiko Boch managed to get the driver working again by applying some patches from Andreas Steinmetz and made his patched version available over his website at the "Institute for computer Communications and Applications". However his web site vanished, and I wasn't able to get the patched version of the driver there.
I was able to obtain a copy of the patched version from Juergen Wolf. Since then I run this patched version and it seems to be stable. (All "Too much work..." messages are gone.)
I tried to contact Jeff Garzik, so that someone who understands
the driver has a chance to see what the essential differences
are, so that linux-2.4.XX has a working driver again, but it
seems I wasn't successful. (It seems the biggest differences
are some inserted "udelays()" and other kinds of "black magic").
To get more testers I make the patched version of the driver
New info: As it turned out there are no essential differences. The code is more or less the same. It simply doesn't trigger the compiler bug in gcc-2.95.2.
If anyone of the original authors has objections, please contact me under
If you want to check out the (old) modified version, simply replace linux/drivers/net/epic100.c by this version of the file.