diff --git a/hw/fdc.c b/hw/fdc.c index a21e05f0eb..b584b9867c 100644 --- a/hw/fdc.c +++ b/hw/fdc.c @@ -699,9 +699,18 @@ static const VMStateDescription vmstate_fdc = { } }; -static void fdctrl_external_reset(void *opaque) +static void fdctrl_external_reset_sysbus(DeviceState *d) { - fdctrl_t *s = opaque; + fdctrl_sysbus_t *sys = container_of(d, fdctrl_sysbus_t, busdev.qdev); + fdctrl_t *s = &sys->state; + + fdctrl_reset(s, 0); +} + +static void fdctrl_external_reset_isa(DeviceState *d) +{ + fdctrl_isabus_t *isa = container_of(d, fdctrl_isabus_t, busdev.qdev); + fdctrl_t *s = &isa->state; fdctrl_reset(s, 0); } @@ -1923,9 +1932,6 @@ static int fdctrl_init_common(fdctrl_t *fdctrl) DMA_register_channel(fdctrl->dma_chann, &fdctrl_transfer_handler, fdctrl); fdctrl_connect_drives(fdctrl); - fdctrl_external_reset(fdctrl); - vmstate_register(-1, &vmstate_fdc, fdctrl); - qemu_register_reset(fdctrl_external_reset, fdctrl); return 0; } @@ -1936,6 +1942,7 @@ static int isabus_fdc_init1(ISADevice *dev) int iobase = 0x3f0; int isairq = 6; int dma_chann = 2; + int ret; register_ioport_read(iobase + 0x01, 5, 1, &fdctrl_read_port, fdctrl); @@ -1948,13 +1955,18 @@ static int isabus_fdc_init1(ISADevice *dev) isa_init_irq(&isa->busdev, &fdctrl->irq, isairq); fdctrl->dma_chann = dma_chann; - return fdctrl_init_common(fdctrl); + ret = fdctrl_init_common(fdctrl); + fdctrl_external_reset_isa(&isa->busdev.qdev); + + return ret; } static int sysbus_fdc_init1(SysBusDevice *dev) { - fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state); + fdctrl_sysbus_t *sys = DO_UPCAST(fdctrl_sysbus_t, busdev, dev); + fdctrl_t *fdctrl = &sys->state; int io; + int ret; io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, fdctrl); sysbus_init_mmio(dev, 0x08, io); @@ -1962,7 +1974,10 @@ static int sysbus_fdc_init1(SysBusDevice *dev) qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1); fdctrl->dma_chann = -1; - return fdctrl_init_common(fdctrl); + ret = fdctrl_init_common(fdctrl); + fdctrl_external_reset_sysbus(&sys->busdev.qdev); + + return ret; } static int sun4m_fdc_init1(SysBusDevice *dev) @@ -1984,6 +1999,8 @@ static ISADeviceInfo isa_fdc_info = { .init = isabus_fdc_init1, .qdev.name = "isa-fdc", .qdev.size = sizeof(fdctrl_isabus_t), + .qdev.vmsd = &vmstate_fdc, + .qdev.reset = fdctrl_external_reset_isa, .qdev.props = (Property[]) { DEFINE_PROP_DRIVE("driveA", fdctrl_isabus_t, state.drives[0].dinfo), DEFINE_PROP_DRIVE("driveB", fdctrl_isabus_t, state.drives[1].dinfo), @@ -1995,6 +2012,8 @@ static SysBusDeviceInfo sysbus_fdc_info = { .init = sysbus_fdc_init1, .qdev.name = "sysbus-fdc", .qdev.size = sizeof(fdctrl_sysbus_t), + .qdev.vmsd = &vmstate_fdc, + .qdev.reset = fdctrl_external_reset_sysbus, .qdev.props = (Property[]) { DEFINE_PROP_DRIVE("driveA", fdctrl_sysbus_t, state.drives[0].dinfo), DEFINE_PROP_DRIVE("driveB", fdctrl_sysbus_t, state.drives[1].dinfo), @@ -2006,6 +2025,8 @@ static SysBusDeviceInfo sun4m_fdc_info = { .init = sun4m_fdc_init1, .qdev.name = "SUNW,fdtwo", .qdev.size = sizeof(fdctrl_sysbus_t), + .qdev.vmsd = &vmstate_fdc, + .qdev.reset = fdctrl_external_reset_sysbus, .qdev.props = (Property[]) { DEFINE_PROP_DRIVE("drive", fdctrl_sysbus_t, state.drives[0].dinfo), DEFINE_PROP_END_OF_LIST(),