Implement 21040 checksum algorithm
This commit is contained in:
@@ -717,7 +717,7 @@ tulip_read(uint32_t addr, void *opaque)
|
|||||||
data = s->csr[addr >> 3];
|
data = s->csr[addr >> 3];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pclog("[%04X:%08X]: CSR9 read %02x, data = %08x.\n", CS, cpu_state.pc, addr, data);
|
//pclog("[%04X:%08X]: CSR9 read %02x, data = %08x.\n", CS, cpu_state.pc, addr, data);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -906,7 +906,7 @@ tulip_write(uint32_t addr, uint32_t data, void *opaque)
|
|||||||
TULIPState *s = opaque;
|
TULIPState *s = opaque;
|
||||||
addr &= 127;
|
addr &= 127;
|
||||||
|
|
||||||
pclog("[%04X:%08X]: Tulip Write >> 3: %02x, val=%08x.\n", CS, cpu_state.pc, addr >> 3, data);
|
//pclog("[%04X:%08X]: Tulip Write >> 3: %02x, val=%08x.\n", CS, cpu_state.pc, addr >> 3, data);
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case CSR(0):
|
case CSR(0):
|
||||||
s->csr[0] = data;
|
s->csr[0] = data;
|
||||||
@@ -1266,7 +1266,7 @@ tulip_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv)
|
|||||||
{
|
{
|
||||||
TULIPState *s = (TULIPState *) priv;
|
TULIPState *s = (TULIPState *) priv;
|
||||||
|
|
||||||
pclog("PCI write=%02x, ret=%02x.\n", addr, val);
|
//pclog("PCI write=%02x, ret=%02x.\n", addr, val);
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x04:
|
case 0x04:
|
||||||
s->pci_conf[0x04] = val & 0x07;
|
s->pci_conf[0x04] = val & 0x07;
|
||||||
@@ -1508,6 +1508,7 @@ nic_init(const device_t *info)
|
|||||||
s->eeprom_data[126] = tulip_srom_crc(s->eeprom_data) & 0xff;
|
s->eeprom_data[126] = tulip_srom_crc(s->eeprom_data) & 0xff;
|
||||||
s->eeprom_data[127] = tulip_srom_crc(s->eeprom_data) >> 8;
|
s->eeprom_data[127] = tulip_srom_crc(s->eeprom_data) >> 8;
|
||||||
} else {
|
} else {
|
||||||
|
uint32_t checksum = 0;
|
||||||
/* 21040 is supposed to only have MAC address in its serial ROM if Linux is correct. */
|
/* 21040 is supposed to only have MAC address in its serial ROM if Linux is correct. */
|
||||||
memset(s->eeprom_data, 0, sizeof(s->eeprom_data));
|
memset(s->eeprom_data, 0, sizeof(s->eeprom_data));
|
||||||
/* See if we have a local MAC address configured. */
|
/* See if we have a local MAC address configured. */
|
||||||
@@ -1530,6 +1531,31 @@ nic_init(const device_t *info)
|
|||||||
s->eeprom_data[4] = (mac >> 8) & 0xff;
|
s->eeprom_data[4] = (mac >> 8) & 0xff;
|
||||||
s->eeprom_data[5] = (mac & 0xff);
|
s->eeprom_data[5] = (mac & 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Generate checksum. */
|
||||||
|
checksum = (s->eeprom_data[0] * 256) | s->eeprom_data[1];
|
||||||
|
checksum *= 2;
|
||||||
|
if (checksum > 65535)
|
||||||
|
checksum = checksum % 65535;
|
||||||
|
|
||||||
|
/* 2nd pair. */
|
||||||
|
checksum += (s->eeprom_data[2] * 256) | s->eeprom_data[3];
|
||||||
|
if (checksum > 65535)
|
||||||
|
checksum = checksum % 65535;
|
||||||
|
checksum *= 2;
|
||||||
|
if (checksum > 65535)
|
||||||
|
checksum = checksum % 65535;
|
||||||
|
|
||||||
|
/* 3rd pair. */
|
||||||
|
checksum += (s->eeprom_data[4] * 256) | s->eeprom_data[5];
|
||||||
|
if (checksum > 65535)
|
||||||
|
checksum = checksum % 65535;
|
||||||
|
|
||||||
|
if (checksum >= 65535)
|
||||||
|
checksum = 0;
|
||||||
|
|
||||||
|
s->eeprom_data[6] = (checksum >> 8) & 0xFF;
|
||||||
|
s->eeprom_data[7] = checksum & 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->local != 3) {
|
if (info->local != 3) {
|
||||||
|
Reference in New Issue
Block a user