Skip to content

Commit 0da14be

Browse files
committed
Implement 21040 checksum algorithm
1 parent 7b38758 commit 0da14be

File tree

1 file changed

+29
-3
lines changed

1 file changed

+29
-3
lines changed

src/network/net_tulip.c

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ tulip_read(uint32_t addr, void *opaque)
717717
data = s->csr[addr >> 3];
718718
break;
719719
}
720-
pclog("[%04X:%08X]: CSR9 read %02x, data = %08x.\n", CS, cpu_state.pc, addr, data);
720+
//pclog("[%04X:%08X]: CSR9 read %02x, data = %08x.\n", CS, cpu_state.pc, addr, data);
721721
return data;
722722
}
723723

@@ -906,7 +906,7 @@ tulip_write(uint32_t addr, uint32_t data, void *opaque)
906906
TULIPState *s = opaque;
907907
addr &= 127;
908908

909-
pclog("[%04X:%08X]: Tulip Write >> 3: %02x, val=%08x.\n", CS, cpu_state.pc, addr >> 3, data);
909+
//pclog("[%04X:%08X]: Tulip Write >> 3: %02x, val=%08x.\n", CS, cpu_state.pc, addr >> 3, data);
910910
switch (addr) {
911911
case CSR(0):
912912
s->csr[0] = data;
@@ -1266,7 +1266,7 @@ tulip_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
12661266
{
12671267
TULIPState *s = (TULIPState *) priv;
12681268

1269-
pclog("PCI write=%02x, ret=%02x.\n", addr, val);
1269+
//pclog("PCI write=%02x, ret=%02x.\n", addr, val);
12701270
switch (addr) {
12711271
case 0x04:
12721272
s->pci_conf[0x04] = val & 0x07;
@@ -1508,6 +1508,7 @@ nic_init(const device_t *info)
15081508
s->eeprom_data[126] = tulip_srom_crc(s->eeprom_data) & 0xff;
15091509
s->eeprom_data[127] = tulip_srom_crc(s->eeprom_data) >> 8;
15101510
} else {
1511+
uint32_t checksum = 0;
15111512
/* 21040 is supposed to only have MAC address in its serial ROM if Linux is correct. */
15121513
memset(s->eeprom_data, 0, sizeof(s->eeprom_data));
15131514
/* See if we have a local MAC address configured. */
@@ -1530,6 +1531,31 @@ nic_init(const device_t *info)
15301531
s->eeprom_data[4] = (mac >> 8) & 0xff;
15311532
s->eeprom_data[5] = (mac & 0xff);
15321533
}
1534+
1535+
/* Generate checksum. */
1536+
checksum = (s->eeprom_data[0] * 256) | s->eeprom_data[1];
1537+
checksum *= 2;
1538+
if (checksum > 65535)
1539+
checksum = checksum % 65535;
1540+
1541+
/* 2nd pair. */
1542+
checksum += (s->eeprom_data[2] * 256) | s->eeprom_data[3];
1543+
if (checksum > 65535)
1544+
checksum = checksum % 65535;
1545+
checksum *= 2;
1546+
if (checksum > 65535)
1547+
checksum = checksum % 65535;
1548+
1549+
/* 3rd pair. */
1550+
checksum += (s->eeprom_data[4] * 256) | s->eeprom_data[5];
1551+
if (checksum > 65535)
1552+
checksum = checksum % 65535;
1553+
1554+
if (checksum >= 65535)
1555+
checksum = 0;
1556+
1557+
s->eeprom_data[6] = (checksum >> 8) & 0xFF;
1558+
s->eeprom_data[7] = checksum & 0xFF;
15331559
}
15341560

15351561
if (info->local != 3) {

0 commit comments

Comments
 (0)