- 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", -1, 2, pcnet_save, pcnet_load, d);
+ PCIPCNetState *s = opaque;
+
+ pci_device_save(&s->pci_dev, f);
+ pcnet_save(f, &s->state);
+}
+
+static int pci_pcnet_load(QEMUFile *f, void *opaque, int version_id)
+{
+ PCIPCNetState *s = opaque;
+ int ret;
+
+ if (version_id != 2)
+ return -EINVAL;
+
+ ret = pci_device_load(&s->pci_dev, f);
+ if (ret < 0)
+ return ret;
+
+ return pcnet_load(f, &s->state, version_id);
+}
+
+static void pcnet_common_cleanup(PCNetState *d)
+{
+ unregister_savevm("pcnet", d);
+
+ qemu_del_timer(d->poll_timer);
+ qemu_free_timer(d->poll_timer);
+}
+
+static int pcnet_common_init(DeviceState *dev, PCNetState *s,
+ NetCleanup *cleanup)
+{
+ s->poll_timer = qemu_new_timer(vm_clock, pcnet_poll_timer, s);
+
+ qdev_get_macaddr(dev, s->macaddr);
+ s->vc = qdev_get_vlan_client(dev,
+ pcnet_can_receive, pcnet_receive, NULL,
+ cleanup, s);
+ pcnet_h_reset(s);
+ return 0;