@@ -42,6 +42,23 @@ static void isa_ne2000_cleanup(VLANClientState *vc)
s->vc = NULL;
}
+static void isa_ne2000_initfn_common(ISADevice *dev,
+ ISANE2000State *isa, NE2000State *s)
+{
+ isa_init_irq(dev, &s->irq, isa->isairq);
+
+ qemu_macaddr_default_if_unset(&s->c.macaddr);
+ ne2000_reset(s);
+
+ s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, s->c.vlan, s->c.peer,
+ dev->qdev.info->name, dev->qdev.id,
+ ne2000_can_receive, ne2000_receive, NULL,
+ NULL, isa_ne2000_cleanup, s);
+ qemu_format_nic_info_str(s->vc, s->c.macaddr.a);
+
+ vmstate_register(-1, &vmstate_ne2000, s);
+}
+
static int isa_ne2000_initfn(ISADevice *dev)
{
ISANE2000State *isa = DO_UPCAST(ISANE2000State, dev, dev);
@@ -58,18 +75,8 @@ static int isa_ne2000_initfn(ISADevice *dev)
register_ioport_write(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_write, s);
register_ioport_read(isa->iobase + 0x1f, 1, 1, ne2000_reset_ioport_read, s);
- isa_init_irq(dev, &s->irq, isa->isairq);
-
- qemu_macaddr_default_if_unset(&s->c.macaddr);
- ne2000_reset(s);
-
- s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_NIC, s->c.vlan, s->c.peer,
- dev->qdev.info->name, dev->qdev.id,
- ne2000_can_receive, ne2000_receive, NULL,
- NULL, isa_ne2000_cleanup, s);
- qemu_format_nic_info_str(s->vc, s->c.macaddr.a);
+ isa_ne2000_initfn_common(dev, isa, s);
- vmstate_register(-1, &vmstate_ne2000, s);
return 0;
}
@@ -98,9 +105,58 @@ static ISADeviceInfo ne2000_isa_info = {
},
};
+/* NEC PC-9821 (MELCO LGY-98) */
+
+static int pc98_ne2000_initfn(ISADevice *dev)
+{
+ ISANE2000State *isa = DO_UPCAST(ISANE2000State, dev, dev);
+ NE2000State *s = &isa->ne2000;
+
+ register_ioport_write(isa->iobase, 16, 1, ne2000_ioport_write, s);
+ register_ioport_read(isa->iobase, 16, 1, ne2000_ioport_read, s);
+
+ register_ioport_write(isa->iobase + 0x200, 1, 1, ne2000_asic_ioport_write, s);
+ register_ioport_read(isa->iobase + 0x200, 1, 1, ne2000_asic_ioport_read, s);
+ register_ioport_write(isa->iobase + 0x200, 2, 2, ne2000_asic_ioport_write, s);
+ register_ioport_read(isa->iobase + 0x200, 2, 2, ne2000_asic_ioport_read, s);
+
+ register_ioport_write(isa->iobase + 0x18, 1, 1, ne2000_reset_ioport_write, s);
+ register_ioport_read(isa->iobase + 0x18, 1, 1, ne2000_reset_ioport_read, s);
+
+ isa_ne2000_initfn_common(dev, isa, s);
+
+ return 0;
+}
+
+void pc98_ne2000_init(int base, int irq, NICInfo *nd)
+{
+ ISADevice *dev;
+
+ qemu_check_nic_model(nd, "ne2k_isa");
+
+ dev = isa_create("pc98_ne2k");
+ qdev_prop_set_uint32(&dev->qdev, "iobase", base);
+ qdev_prop_set_uint32(&dev->qdev, "irq", irq);
+ qdev_set_nic_properties(&dev->qdev, nd);
+ qdev_init_nofail(&dev->qdev);
+}
+
+static ISADeviceInfo pc98_ne2000_info = {
+ .qdev.name = "pc98_ne2k",
+ .qdev.size = sizeof(ISANE2000State),
+ .init = pc98_ne2000_initfn,
+ .qdev.props = (Property[]) {
+ DEFINE_PROP_HEX32("iobase", ISANE2000State, iobase, 0xd0),
+ DEFINE_PROP_UINT32("irq", ISANE2000State, isairq, 3),
+ DEFINE_NIC_PROPERTIES(ISANE2000State, ne2000.c),
+ DEFINE_PROP_END_OF_LIST(),
+ },
+};
+
static void ne2000_isa_register_devices(void)
{
isa_qdev_register(&ne2000_isa_info);
+ isa_qdev_register(&pc98_ne2000_info);
}
device_init(ne2000_isa_register_devices)