+static void pcnet_save(QEMUFile *f, void *opaque)
+{
+ PCNetState *s = opaque;
+ unsigned int i;
+
+ if (s->pci_dev)
+ pci_device_save(s->pci_dev, f);
+
+ qemu_put_be32s(f, &s->rap);
+ qemu_put_be32s(f, &s->isr);
+ qemu_put_be32s(f, &s->lnkst);
+ qemu_put_be32s(f, &s->rdra);
+ qemu_put_be32s(f, &s->tdra);
+ qemu_put_buffer(f, s->prom, 16);
+ for (i = 0; i < 128; i++)
+ qemu_put_be16s(f, &s->csr[i]);
+ for (i = 0; i < 32; i++)
+ qemu_put_be16s(f, &s->bcr[i]);
+ qemu_put_be64s(f, &s->timer);
+ qemu_put_be32s(f, &s->xmit_pos);
+ qemu_put_be32s(f, &s->recv_pos);
+ qemu_put_buffer(f, s->buffer, 4096);
+ qemu_put_be32s(f, &s->tx_busy);
+ qemu_put_timer(f, s->poll_timer);
+}
+
+static int pcnet_load(QEMUFile *f, void *opaque, int version_id)
+{
+ PCNetState *s = opaque;
+ int i, ret;
+
+ if (version_id != 2)
+ return -EINVAL;
+
+ if (s->pci_dev) {
+ ret = pci_device_load(s->pci_dev, f);
+ if (ret < 0)
+ return ret;
+ }
+
+ qemu_get_be32s(f, &s->rap);
+ qemu_get_be32s(f, &s->isr);
+ qemu_get_be32s(f, &s->lnkst);
+ qemu_get_be32s(f, &s->rdra);
+ qemu_get_be32s(f, &s->tdra);
+ qemu_get_buffer(f, s->prom, 16);
+ for (i = 0; i < 128; i++)
+ qemu_get_be16s(f, &s->csr[i]);
+ for (i = 0; i < 32; i++)
+ qemu_get_be16s(f, &s->bcr[i]);
+ qemu_get_be64s(f, &s->timer);
+ qemu_get_be32s(f, &s->xmit_pos);
+ qemu_get_be32s(f, &s->recv_pos);
+ qemu_get_buffer(f, s->buffer, 4096);
+ qemu_get_be32s(f, &s->tx_busy);
+ qemu_get_timer(f, s->poll_timer);
+
+ return 0;
+}
+
+static void pcnet_common_init(PCNetState *d, NICInfo *nd, const char *info_str)
+{
+ d->poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, d);
+
+ d->nd = nd;
+
+ if (nd && nd->vlan) {
+ d->vc = qemu_new_vlan_client(nd->vlan, pcnet_receive,
+ pcnet_can_receive, d);
+
+ snprintf(d->vc->info_str, sizeof(d->vc->info_str),
+ "pcnet macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
+ d->nd->macaddr[0],
+ d->nd->macaddr[1],
+ d->nd->macaddr[2],
+ d->nd->macaddr[3],
+ d->nd->macaddr[4],
+ d->nd->macaddr[5]);
+ } else {
+ d->vc = NULL;
+ }
+ pcnet_h_reset(d);
+ register_savevm("pcnet", 0, 2, pcnet_save, pcnet_load, d);
+}
+
+/* PCI interface */
+