First Linux Defect Encountered

I'd been running Redhat 7.1 happily for a week or so, when, in the course of copying a file from my work laptop to chrome (a Windows 95 machine), via samba on crimson, I found that crimson's Ethernet connection had stopped working. The ifconfig command showed an Ethernet MAC address of all zeros. That didn't seem right at all. On checking the console messages (via dmesg) I found the following:

warning: PROM address does not match CSR address

My first thought was that the Ethernet card had blown. However, it worked fine when I booted into Windows. It also worked if I performed a warm boot into Linux after booting Windows first. First, I tried changing the driver to lance, as was used under Redhat 5.2, from the Redhat 7.1 default, pcnet32. That didn't work either. Used Windows to change the IO address to 0x300 from 0x100 - no difference.

I looked around on the Internet (which I should have done first) and found the problem had been reported by a number of people - it seemed to affect the PCNet card used in Compaq machines. A new kernel (2.4.3-x) had been issued which contained the fix. However, it seemed that some patch had caused the problem to occur, so I figured if I could compile an unpatched version of pcnet32, I could solve the problem without a kernel upgrade.

I found the pcnet32.c file in the directory /usr/src/linux-2.4.2-2/drivers/net. I found the offending code that used the CSR address and patched it to use the PROM address instead. Recompiled using defines for a module rebuild, which I think was as follows:

  gcc -c -Wall -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4.2-2/include \
  -c pcnet32.c

Copied the pcnet32.o module into the /lib/modules/2.4.2-2/kernel/drivers/net and rebooted. Solved the problem!.