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