diff options
-rw-r--r-- | hw/smc91c111.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/hw/smc91c111.c b/hw/smc91c111.c index d58821a3ae..b7398c9295 100644 --- a/hw/smc91c111.c +++ b/hw/smc91c111.c @@ -19,6 +19,7 @@ typedef struct { SysBusDevice busdev; VLANClientState *vc; + NICConf conf; uint16_t tcr; uint16_t rcr; uint16_t cr; @@ -42,7 +43,6 @@ typedef struct { uint8_t data[NUM_PACKETS][2048]; uint8_t int_level; uint8_t int_mask; - uint8_t macaddr[6]; int mmio_index; } smc91c111_state; @@ -474,7 +474,7 @@ static uint32_t smc91c111_readb(void *opaque, target_phys_addr_t offset) /* Not implemented. */ return 0; case 4: case 5: case 6: case 7: case 8: case 9: /* IA */ - return s->macaddr[offset - 4]; + return s->conf.macaddr.a[offset - 4]; case 10: /* General Purpose */ return s->gpr & 0xff; case 11: @@ -696,8 +696,7 @@ static void smc91c111_cleanup(VLANClientState *vc) { smc91c111_state *s = vc->opaque; - cpu_unregister_io_memory(s->mmio_index); - qemu_free(s); + s->vc = NULL; } static int smc91c111_init1(SysBusDevice *dev) @@ -708,21 +707,33 @@ static int smc91c111_init1(SysBusDevice *dev) smc91c111_writefn, s); sysbus_init_mmio(dev, 16, s->mmio_index); sysbus_init_irq(dev, &s->irq); - qdev_get_macaddr(&dev->qdev, s->macaddr); + qemu_macaddr_default_if_unset(&s->conf.macaddr); smc91c111_reset(s); - s->vc = qdev_get_vlan_client(&dev->qdev, + s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, + s->conf.vlan, s->conf.peer, + dev->qdev.info->name, dev->qdev.id, smc91c111_can_receive, smc91c111_receive, NULL, - smc91c111_cleanup, s); - qemu_format_nic_info_str(s->vc, s->macaddr); + NULL, smc91c111_cleanup, s); + qemu_format_nic_info_str(s->vc, s->conf.macaddr.a); /* ??? Save/restore. */ return 0; } +static SysBusDeviceInfo smc91c111_info = { + .init = smc91c111_init1, + .qdev.name = "smc91c111", + .qdev.size = sizeof(smc91c111_state), + .qdev.props = (Property[]) { + DEFINE_NIC_PROPERTIES(smc91c111_state, conf), + DEFINE_PROP_END_OF_LIST(), + } +}; + static void smc91c111_register_devices(void) { - sysbus_register_dev("smc91c111", sizeof(smc91c111_state), smc91c111_init1); + sysbus_register_withprop(&smc91c111_info); } /* Legacy helper function. Should go away when machine config files are @@ -734,7 +745,7 @@ void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq) qemu_check_nic_model(nd, "smc91c111"); dev = qdev_create(NULL, "smc91c111"); - dev->nd = nd; + qdev_set_nic_properties(dev, nd); qdev_init_nofail(dev); s = sysbus_from_qdev(dev); sysbus_mmio_map(s, 0, base); |