Revision 4e3db917 hw/eepro100.c
b/hw/eepro100.c | ||
---|---|---|
195 | 195 |
uint8_t cmd; |
196 | 196 |
uint32_t start; |
197 | 197 |
uint32_t stop; |
198 |
uint8_t boundary; |
|
199 |
uint8_t tsr; |
|
200 |
uint8_t tpsr; |
|
201 |
uint16_t tcnt; |
|
202 |
uint16_t rcnt; |
|
203 |
uint32_t rsar; |
|
204 |
uint8_t rsr; |
|
205 |
uint8_t rxcr; |
|
206 |
uint8_t isr; |
|
207 |
uint8_t dcfg; |
|
208 |
uint8_t imr; |
|
209 |
uint8_t phys[6]; /* mac address */ |
|
210 |
uint8_t curpag; |
|
198 | 211 |
uint8_t mult[8]; /* multicast mask array */ |
199 | 212 |
int mmio_index; |
200 | 213 |
VLANClientState *vc; |
... | ... | |
203 | 216 |
uint8_t int_stat; /* PCI interrupt status */ |
204 | 217 |
uint32_t region[3]; /* PCI region addresses */ |
205 | 218 |
uint8_t macaddr[6]; |
219 |
uint32_t statcounter[19]; |
|
206 | 220 |
uint16_t mdimem[32]; |
207 | 221 |
eeprom_t *eeprom; |
208 | 222 |
uint32_t device; /* device variant */ |
... | ... | |
214 | 228 |
uint32_t ru_base; /* RU base address */ |
215 | 229 |
uint32_t ru_offset; /* RU address offset */ |
216 | 230 |
uint32_t statsaddr; /* pointer to eepro100_stats_t */ |
217 |
/* Statistical counters. Also used for wake-up packet (i82559). */ |
|
218 |
eepro100_stats_t statistics; |
|
231 |
eepro100_stats_t statistics; /* statistical counters */ |
|
219 | 232 |
#if 0 |
220 | 233 |
uint16_t status; |
221 | 234 |
#endif |
... | ... | |
227 | 240 |
uint8_t mem[PCI_MEM_SIZE]; |
228 | 241 |
} EEPRO100State; |
229 | 242 |
|
230 |
/* Parameters for nic_save, nic_load. */ |
|
231 |
static const int eepro100_instance = -1; |
|
232 |
static const int eepro100_version = 20090807; |
|
233 |
|
|
234 | 243 |
/* Default values for MDI (PHY) registers */ |
235 | 244 |
static const uint16_t eepro100_mdi_default[] = { |
236 | 245 |
/* MDI Registers 0 - 6, 7 */ |
... | ... | |
1579 | 1588 |
int i; |
1580 | 1589 |
int ret; |
1581 | 1590 |
|
1582 |
if (version_id != eepro100_version) {
|
|
1591 |
if (version_id > 3)
|
|
1583 | 1592 |
return -EINVAL; |
1593 |
|
|
1594 |
if (version_id >= 3) { |
|
1595 |
ret = pci_device_load(&s->dev, f); |
|
1596 |
if (ret < 0) |
|
1597 |
return ret; |
|
1584 | 1598 |
} |
1585 | 1599 |
|
1586 |
ret = pci_device_load(&s->dev, f); |
|
1587 |
if (ret < 0) { |
|
1588 |
return ret; |
|
1600 |
if (version_id >= 2) { |
|
1601 |
qemu_get_8s(f, &s->rxcr); |
|
1602 |
} else { |
|
1603 |
s->rxcr = 0x0c; |
|
1589 | 1604 |
} |
1590 | 1605 |
|
1591 | 1606 |
qemu_get_8s(f, &s->cmd); |
1592 | 1607 |
qemu_get_be32s(f, &s->start); |
1593 | 1608 |
qemu_get_be32s(f, &s->stop); |
1609 |
qemu_get_8s(f, &s->boundary); |
|
1610 |
qemu_get_8s(f, &s->tsr); |
|
1611 |
qemu_get_8s(f, &s->tpsr); |
|
1612 |
qemu_get_be16s(f, &s->tcnt); |
|
1613 |
qemu_get_be16s(f, &s->rcnt); |
|
1614 |
qemu_get_be32s(f, &s->rsar); |
|
1615 |
qemu_get_8s(f, &s->rsr); |
|
1616 |
qemu_get_8s(f, &s->isr); |
|
1617 |
qemu_get_8s(f, &s->dcfg); |
|
1618 |
qemu_get_8s(f, &s->imr); |
|
1619 |
qemu_get_buffer(f, s->phys, 6); |
|
1620 |
qemu_get_8s(f, &s->curpag); |
|
1594 | 1621 |
qemu_get_buffer(f, s->mult, 8); |
1595 | 1622 |
qemu_get_buffer(f, s->mem, sizeof(s->mem)); |
1596 | 1623 |
|
1597 | 1624 |
/* Restore all members of struct between scv_stat and mem. */ |
1598 | 1625 |
qemu_get_8s(f, &s->scb_stat); |
1599 | 1626 |
qemu_get_8s(f, &s->int_stat); |
1600 |
for (i = 0; i < ARRAY_SIZE(s->region); i++) {
|
|
1627 |
for (i = 0; i < 3; i++) {
|
|
1601 | 1628 |
qemu_get_be32s(f, &s->region[i]); |
1602 | 1629 |
} |
1603 | 1630 |
qemu_get_buffer(f, s->macaddr, 6); |
1604 |
for (i = 0; i < ARRAY_SIZE(s->mdimem); i++) { |
|
1631 |
for (i = 0; i < 19; i++) { |
|
1632 |
qemu_get_be32s(f, &s->statcounter[i]); |
|
1633 |
} |
|
1634 |
for (i = 0; i < 32; i++) { |
|
1605 | 1635 |
qemu_get_be16s(f, &s->mdimem[i]); |
1606 | 1636 |
} |
1607 | 1637 |
/* The eeprom should be saved and restored by its own routines. */ |
... | ... | |
1652 | 1682 |
|
1653 | 1683 |
pci_device_save(&s->dev, f); |
1654 | 1684 |
|
1685 |
qemu_put_8s(f, &s->rxcr); |
|
1686 |
|
|
1655 | 1687 |
qemu_put_8s(f, &s->cmd); |
1656 | 1688 |
qemu_put_be32s(f, &s->start); |
1657 | 1689 |
qemu_put_be32s(f, &s->stop); |
1690 |
qemu_put_8s(f, &s->boundary); |
|
1691 |
qemu_put_8s(f, &s->tsr); |
|
1692 |
qemu_put_8s(f, &s->tpsr); |
|
1693 |
qemu_put_be16s(f, &s->tcnt); |
|
1694 |
qemu_put_be16s(f, &s->rcnt); |
|
1695 |
qemu_put_be32s(f, &s->rsar); |
|
1696 |
qemu_put_8s(f, &s->rsr); |
|
1697 |
qemu_put_8s(f, &s->isr); |
|
1698 |
qemu_put_8s(f, &s->dcfg); |
|
1699 |
qemu_put_8s(f, &s->imr); |
|
1700 |
qemu_put_buffer(f, s->phys, 6); |
|
1701 |
qemu_put_8s(f, &s->curpag); |
|
1658 | 1702 |
qemu_put_buffer(f, s->mult, 8); |
1659 | 1703 |
qemu_put_buffer(f, s->mem, sizeof(s->mem)); |
1660 | 1704 |
|
1661 | 1705 |
/* Save all members of struct between scv_stat and mem. */ |
1662 | 1706 |
qemu_put_8s(f, &s->scb_stat); |
1663 | 1707 |
qemu_put_8s(f, &s->int_stat); |
1664 |
for (i = 0; i < ARRAY_SIZE(s->region); i++) {
|
|
1708 |
for (i = 0; i < 3; i++) {
|
|
1665 | 1709 |
qemu_put_be32s(f, &s->region[i]); |
1666 | 1710 |
} |
1667 | 1711 |
qemu_put_buffer(f, s->macaddr, 6); |
1668 |
for (i = 0; i < ARRAY_SIZE(s->mdimem); i++) { |
|
1712 |
for (i = 0; i < 19; i++) { |
|
1713 |
qemu_put_be32s(f, &s->statcounter[i]); |
|
1714 |
} |
|
1715 |
for (i = 0; i < 32; i++) { |
|
1669 | 1716 |
qemu_put_be16s(f, &s->mdimem[i]); |
1670 | 1717 |
} |
1671 | 1718 |
/* The eeprom should be saved and restored by its own routines. */ |
... | ... | |
1768 | 1815 |
|
1769 | 1816 |
qemu_register_reset(nic_reset, s); |
1770 | 1817 |
|
1771 |
register_savevm(s->vc->model, eepro100_instance, eepro100_version, |
|
1772 |
nic_save, nic_load, s); |
|
1818 |
register_savevm(s->vc->model, -1, 3, nic_save, nic_load, s); |
|
1773 | 1819 |
return 0; |
1774 | 1820 |
} |
1775 | 1821 |
|
Also available in: Unified diff