Fixing the EEPROM content didn't work with the 3C5X9CFG official tool, but someone had written a Linux setup program that would be able to check, read and write the EEPROM content: 3c5x9setup, although only the first 32 bytes of the EEPROM which contain the "non vital" data. As the source code was provided, it was rather easy to change that to write all 128 bytes of the EEPROM. This version got called 3C3.c. The EEPROM dump is completely hardcoded and would, for instance, overwrite MAC address. Let's hope it doesn't come to that.
.
Installing Linux on a PC with ISA bus
One challenge was to get 3C3 compiled and running on Linux on a PC that still had an ISA bus. The best I could find in my collection is a Pentium II 450 MHz with 320 MB of RAM on an ASUS P2B-F board. Quite retro... I know Ubuntu best so I went for the first Ubuntu Server version I could find: Ubuntu 6.06.2 Dapper Drake released in 2006. It actually went quite well and once I had a prompt I could go on:
# mount usb drive and copy file
sudo mkdir /media/usb
sudo mount /dev/sda1 usb
cp /media/usb/3c3.c .
# install C compiler and libs
sudo apt-get install gcc libc6-dev
# compile (copied from instructions in source file)
cc -O -Wall -o 3c3 3c3.c
Checking a known good card
# enable the card
sudo modprobe 3c509
# Get me some info
./3c3 -f -De
3c5x9setup.c:v1.00 6/19/2000 Donald Becker (becker@scyld.com)
http://www.scyld.com/diag/index.html
No interrupt sources are pending.
3c5x9 found at 0x300.
Indication enable is 0000, interrupt enable is 0000.
EEPROM contents:
00a0 2491 b0a0 9450 c09e 0036 5a42 6d50
0090 5000 00a0 2491 b0a0 3f10 0000 89ef
2083 0000 0000 0004 0001 0000 0000 0e05
6d50 9450 b0a0 2491 0aed 1010 1982 3300
6f43 206d 4333 3035 4239 4520 6874 7265
694c 6b6e 4920 4949 5015 506d 0294 411c
80d0 22f7 9ea8 0147 0210 03e0 1010 3879
0000 0000 0000 0000 0000 0000 0000 0000
Model number 3c509 version 4, base I/O 0x300, IRQ 5, 10baseT port.
3Com Node Address 00:A0:24:91:B0:A0 (used as a unique ID only).
OEM Station address 00:A0:24:91:B0:A0 (used as the ethernet address).
Manufacture date (MM/DD/YY) 4/30/96, division 6, product BZ.
Options: half duplex, enable linkbeat.
The computed checksum matches the stored checksum of 89ef.
And now the bad card
The following code is not entirely accurate because I forgot to capture the faulty checksum. However this is how it looked like, typo and all.
sudo modprobe 3c509
./3c3 -f -De
3c5x9setup.c:v1.00 6/19/2000 Donald Becker (becker@scyld.com)
http://www.scyld.com/diag/index.html
No interrupt sources are pending.
3c5x9 found at 0x300.
Indication enable is 0000, interrupt enable is 0000.
EEPROM contents:
0060 0831 4efb 9450 c2eb 0036 544b 6d50
0090 5e00 0060 0831 4efb 7f10 0000 f9a1
2083 0000 0000 fe04 fe01 0000 0000 fe05
6d50 9450 4efb 0831 0a6b 1010 1982 3300
6f43 206d 4333 3035 4239 4520 6874 7265
694c 6b6e 4920 4949 5015 506d 0294 411c
80d0 22f7 9ea8 0147 0210 03e0 1010 3879
0000 0000 0000 0000 0000 0000 0000 0000
Model number 3c509 version 4, base I/O 0x300, IRQ 5, 10baseT port.
3Com Node Address 00:60:08:31:4E:FB (used as a unique ID only).
OEM Station address 00:60:08:31:4E:FB (used as the ethernet address).
Manufacture date (MM/DD/YY) 7/11/97, division 6, product KT.
Options: half duplex, disable linkbeat.
****CHECKSUM ERROR****: Calcuated checksum: 09a1
OK so not so different after all. The tool can actually fix the checksum if we run it with the w flag without changing any value
sudo ./3c3 -f -w
If we wanted to change the port for example, it would look like
sudo ./3c3 -f -P 210 -w
Check EEPROM
3c5x9setup.c:v1.00 6/19/2000 Donald Becker (becker@scyld.com)
http://www.scyld.com/diag/index.html
No interrupt sources are pending.
3c5x9 found at 0x300.
Indication enable is 0000, interrupt enable is 0000.
EEPROM contents:
0060 0831 4efb 9450 c2eb 0036 544b 6d50
0090 5e00 0060 0831 4efb 7f10 0000 f9a1
2083 0000 0000 fe04 fe01 0000 0000 fe05
6d50 9450 4efb 0831 0a6b 1010 1982 3300
6f43 206d 4333 3035 4239 4520 6874 7265
694c 6b6e 4920 4949 5015 506d 0294 411c
80d0 22f7 9ea8 0147 0210 03e0 1010 3879
0000 0000 0000 0000 0000 0000 0000 0000
Model number 3c509 version 4, base I/O 0x300, IRQ 5, 10baseT port.
3Com Node Address 00:60:08:31:4E:FB (used as a unique ID only).
OEM Station address 00:60:08:31:4E:FB (used as the ethernet address).
Manufacture date (MM/DD/YY) 7/11/97, division 6, product KT.
Options: half duplex, disable linkbeat.
The computed checksum matches the stored checksum of f9a1.
The card came back to life under MS-DOS, but it would still fail the Vital Test. As indicated in the Vogons forum, it means another checksum is stored somewhere else. As the card was properly recognized though, I could change the whole setup (PNP, Full Duplex, Modem, BOOT Rom), save the configuration, then save it to the base configuration again. This fixed the Vital Test!
Let's see what the difference is in the EEPROM. Back to Linux:
3c5x9setup.c:v1.00 6/19/2000 Donald Becker (becker@scyld.com)
http://www.scyld.com/diag/index.html
No interrupt sources are pending.
3c5x9 found at 0x300.
Indication enable is 0000, interrupt enable is 0000.
EEPROM contents:
0060 0831 4efb 9450 c2eb 0036 544b 6d50
0090 5e00 0060 0831 4efb 7f10 0000 f9a1
2083 0000 0000 fe04 fe01 0000 0000 a105
6d50 9450 4efb 0831 0a6b 1010 1982 3300
6f43 206d 4333 3035 4239 4520 6874 7265
694c 6b6e 4920 4949 5015 506d 0294 411c
80d0 22f7 9ea8 0147 0210 03e0 1010 3879
0000 0000 0000 0000 0000 0000 0000 0000
Model number 3c509 version 4, base I/O 0x300, IRQ 5, 10baseT port.
3Com Node Address 00:60:08:31:4E:FB (used as a unique ID only).
OEM Station address 00:60:08:31:4E:FB (used as the ethernet address).
Manufacture date (MM/DD/YY) 7/11/97, division 6, product KT.
Options: half duplex, disable linkbeat.
The computed checksum matches the stored checksum of f9a1.
.
So there was another checksum, just one line after! Maybe there are more checksums for all I know, but I do not care at that point :-) Card fixed!
Sources: