Revision 3031efab hw/eepro100.c
b/hw/eepro100.c | ||
---|---|---|
190 | 190 |
uint8_t cmd; |
191 | 191 |
uint32_t start; |
192 | 192 |
uint32_t stop; |
193 |
uint8_t boundary; |
|
194 |
uint8_t tsr; |
|
195 |
uint8_t tpsr; |
|
196 |
uint16_t tcnt; |
|
197 |
uint16_t rcnt; |
|
198 |
uint32_t rsar; |
|
199 |
uint8_t rsr; |
|
200 |
uint8_t rxcr; |
|
201 |
uint8_t isr; |
|
202 |
uint8_t dcfg; |
|
203 |
uint8_t imr; |
|
204 |
uint8_t phys[6]; /* mac address */ |
|
205 |
uint8_t curpag; |
|
206 | 193 |
uint8_t mult[8]; /* multicast mask array */ |
207 | 194 |
int mmio_index; |
208 | 195 |
VLANClientState *vc; |
... | ... | |
211 | 198 |
uint8_t int_stat; /* PCI interrupt status */ |
212 | 199 |
uint32_t region[3]; /* PCI region addresses */ |
213 | 200 |
uint8_t macaddr[6]; |
214 |
uint32_t statcounter[19]; |
|
215 | 201 |
uint16_t mdimem[32]; |
216 | 202 |
eeprom_t *eeprom; |
217 | 203 |
uint32_t device; /* device variant */ |
... | ... | |
223 | 209 |
uint32_t ru_base; /* RU base address */ |
224 | 210 |
uint32_t ru_offset; /* RU address offset */ |
225 | 211 |
uint32_t statsaddr; /* pointer to eepro100_stats_t */ |
226 |
eepro100_stats_t statistics; /* statistical counters */ |
|
212 |
/* Statistical counters. Also used for wake-up packet (i82559). */ |
|
213 |
eepro100_stats_t statistics; |
|
227 | 214 |
#if 0 |
228 | 215 |
uint16_t status; |
229 | 216 |
#endif |
... | ... | |
235 | 222 |
uint8_t mem[PCI_MEM_SIZE]; |
236 | 223 |
} EEPRO100State; |
237 | 224 |
|
225 |
/* Parameters for nic_save, nic_load. */ |
|
226 |
static const int eepro100_instance = -1; |
|
227 |
static const int eepro100_version = 20090807; |
|
228 |
|
|
238 | 229 |
/* Default values for MDI (PHY) registers */ |
239 | 230 |
static const uint16_t eepro100_mdi_default[] = { |
240 | 231 |
/* MDI Registers 0 - 6, 7 */ |
... | ... | |
1583 | 1574 |
int i; |
1584 | 1575 |
int ret; |
1585 | 1576 |
|
1586 |
if (version_id > 3)
|
|
1577 |
if (version_id != eepro100_version) {
|
|
1587 | 1578 |
return -EINVAL; |
1588 |
|
|
1589 |
if (version_id >= 3) { |
|
1590 |
ret = pci_device_load(&s->dev, f); |
|
1591 |
if (ret < 0) |
|
1592 |
return ret; |
|
1593 | 1579 |
} |
1594 | 1580 |
|
1595 |
if (version_id >= 2) { |
|
1596 |
qemu_get_8s(f, &s->rxcr); |
|
1597 |
} else { |
|
1598 |
s->rxcr = 0x0c; |
|
1581 |
ret = pci_device_load(&s->dev, f); |
|
1582 |
if (ret < 0) { |
|
1583 |
return ret; |
|
1599 | 1584 |
} |
1600 | 1585 |
|
1601 | 1586 |
qemu_get_8s(f, &s->cmd); |
1602 | 1587 |
qemu_get_be32s(f, &s->start); |
1603 | 1588 |
qemu_get_be32s(f, &s->stop); |
1604 |
qemu_get_8s(f, &s->boundary); |
|
1605 |
qemu_get_8s(f, &s->tsr); |
|
1606 |
qemu_get_8s(f, &s->tpsr); |
|
1607 |
qemu_get_be16s(f, &s->tcnt); |
|
1608 |
qemu_get_be16s(f, &s->rcnt); |
|
1609 |
qemu_get_be32s(f, &s->rsar); |
|
1610 |
qemu_get_8s(f, &s->rsr); |
|
1611 |
qemu_get_8s(f, &s->isr); |
|
1612 |
qemu_get_8s(f, &s->dcfg); |
|
1613 |
qemu_get_8s(f, &s->imr); |
|
1614 |
qemu_get_buffer(f, s->phys, 6); |
|
1615 |
qemu_get_8s(f, &s->curpag); |
|
1616 | 1589 |
qemu_get_buffer(f, s->mult, 8); |
1617 | 1590 |
qemu_get_buffer(f, s->mem, sizeof(s->mem)); |
1618 | 1591 |
|
1619 | 1592 |
/* Restore all members of struct between scv_stat and mem. */ |
1620 | 1593 |
qemu_get_8s(f, &s->scb_stat); |
1621 | 1594 |
qemu_get_8s(f, &s->int_stat); |
1622 |
for (i = 0; i < 3; i++) {
|
|
1595 |
for (i = 0; i < ARRAY_SIZE(s->region); i++) {
|
|
1623 | 1596 |
qemu_get_be32s(f, &s->region[i]); |
1624 | 1597 |
} |
1625 | 1598 |
qemu_get_buffer(f, s->macaddr, 6); |
1626 |
for (i = 0; i < 19; i++) { |
|
1627 |
qemu_get_be32s(f, &s->statcounter[i]); |
|
1628 |
} |
|
1629 |
for (i = 0; i < 32; i++) { |
|
1599 |
for (i = 0; i < ARRAY_SIZE(s->mdimem); i++) { |
|
1630 | 1600 |
qemu_get_be16s(f, &s->mdimem[i]); |
1631 | 1601 |
} |
1632 | 1602 |
/* The eeprom should be saved and restored by its own routines. */ |
... | ... | |
1677 | 1647 |
|
1678 | 1648 |
pci_device_save(&s->dev, f); |
1679 | 1649 |
|
1680 |
qemu_put_8s(f, &s->rxcr); |
|
1681 |
|
|
1682 | 1650 |
qemu_put_8s(f, &s->cmd); |
1683 | 1651 |
qemu_put_be32s(f, &s->start); |
1684 | 1652 |
qemu_put_be32s(f, &s->stop); |
1685 |
qemu_put_8s(f, &s->boundary); |
|
1686 |
qemu_put_8s(f, &s->tsr); |
|
1687 |
qemu_put_8s(f, &s->tpsr); |
|
1688 |
qemu_put_be16s(f, &s->tcnt); |
|
1689 |
qemu_put_be16s(f, &s->rcnt); |
|
1690 |
qemu_put_be32s(f, &s->rsar); |
|
1691 |
qemu_put_8s(f, &s->rsr); |
|
1692 |
qemu_put_8s(f, &s->isr); |
|
1693 |
qemu_put_8s(f, &s->dcfg); |
|
1694 |
qemu_put_8s(f, &s->imr); |
|
1695 |
qemu_put_buffer(f, s->phys, 6); |
|
1696 |
qemu_put_8s(f, &s->curpag); |
|
1697 | 1653 |
qemu_put_buffer(f, s->mult, 8); |
1698 | 1654 |
qemu_put_buffer(f, s->mem, sizeof(s->mem)); |
1699 | 1655 |
|
1700 | 1656 |
/* Save all members of struct between scv_stat and mem. */ |
1701 | 1657 |
qemu_put_8s(f, &s->scb_stat); |
1702 | 1658 |
qemu_put_8s(f, &s->int_stat); |
1703 |
for (i = 0; i < 3; i++) {
|
|
1659 |
for (i = 0; i < ARRAY_SIZE(s->region); i++) {
|
|
1704 | 1660 |
qemu_put_be32s(f, &s->region[i]); |
1705 | 1661 |
} |
1706 | 1662 |
qemu_put_buffer(f, s->macaddr, 6); |
1707 |
for (i = 0; i < 19; i++) { |
|
1708 |
qemu_put_be32s(f, &s->statcounter[i]); |
|
1709 |
} |
|
1710 |
for (i = 0; i < 32; i++) { |
|
1663 |
for (i = 0; i < ARRAY_SIZE(s->mdimem); i++) { |
|
1711 | 1664 |
qemu_put_be16s(f, &s->mdimem[i]); |
1712 | 1665 |
} |
1713 | 1666 |
/* The eeprom should be saved and restored by its own routines. */ |
... | ... | |
1810 | 1763 |
|
1811 | 1764 |
qemu_register_reset(nic_reset, s); |
1812 | 1765 |
|
1813 |
register_savevm(s->vc->model, -1, 3, nic_save, nic_load, s); |
|
1766 |
register_savevm(s->vc->model, eepro100_instance, eepro100_version, |
|
1767 |
nic_save, nic_load, s); |
|
1814 | 1768 |
return 0; |
1815 | 1769 |
} |
1816 | 1770 |
|
Also available in: Unified diff