aboutsummaryrefslogtreecommitdiffstats
path: root/hw/ide/via.c
diff options
context:
space:
mode:
authorStefan Hajnoczi <stefanha@linux.vnet.ibm.com>2010-12-16 15:54:06 +0000
committerKevin Wolf <kwolf@redhat.com>2010-12-17 16:11:03 +0100
commit61d9d6b091aa04e5e5bd20951aa689a5bbe65aed (patch)
treefb48df4b8f9d9f01c1bacec8d40c96e908794c36 /hw/ide/via.c
parentad7171394f2fe3f9b5fe02f0c62496291a859a92 (diff)
ide: Register vm change state handler once only
We register the vm change state handler in a PCI BAR map() function. This function can be called multiple times throughout the lifetime of a PCI IDE device. This results in duplicate vm change state handlers being register, none of which are ever unregistered. Instead, register the vm change state handler in the device's init function once and for all. piix tested, cmd646 and via not tested. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'hw/ide/via.c')
-rw-r--r--hw/ide/via.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/hw/ide/via.c b/hw/ide/via.c
index 2603110ce..5b70bd257 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -78,10 +78,6 @@ static void bmdma_map(PCIDevice *pci_dev, int region_num,
for(i = 0;i < 2; i++) {
BMDMAState *bm = &d->bmdma[i];
- bmdma_init(&d->bus[i], bm);
- bm->bus = d->bus+i;
- qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
- &bm->dma);
register_ioport_write(addr, 1, 1, bmdma_cmd_writeb, bm);
@@ -135,6 +131,29 @@ static void via_reset(void *opaque)
pci_set_long(pci_conf + 0xc0, 0x00020001);
}
+static void vt82c686b_init_ports(PCIIDEState *d) {
+ int i;
+ struct {
+ int iobase;
+ int iobase2;
+ int isairq;
+ } port_info[] = {
+ {0x1f0, 0x3f6, 14},
+ {0x170, 0x376, 15},
+ };
+
+ for (i = 0; i < 2; i++) {
+ ide_bus_new(&d->bus[i], &d->dev.qdev, i);
+ ide_init_ioport(&d->bus[i], port_info[i].iobase, port_info[i].iobase2);
+ ide_init2(&d->bus[i], isa_reserve_irq(port_info[i].isairq));
+
+ bmdma_init(&d->bus[i], &d->bmdma[i]);
+ d->bmdma[i].bus = &d->bus[i];
+ qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
+ &d->bmdma[i]->dma);
+ }
+}
+
/* via ide func */
static int vt82c686b_ide_initfn(PCIDevice *dev)
{
@@ -154,12 +173,7 @@ static int vt82c686b_ide_initfn(PCIDevice *dev)
vmstate_register(&dev->qdev, 0, &vmstate_ide_pci, d);
- ide_bus_new(&d->bus[0], &d->dev.qdev, 0);
- ide_bus_new(&d->bus[1], &d->dev.qdev, 1);
- ide_init2(&d->bus[0], isa_reserve_irq(14));
- ide_init2(&d->bus[1], isa_reserve_irq(15));
- ide_init_ioport(&d->bus[0], 0x1f0, 0x3f6);
- ide_init_ioport(&d->bus[1], 0x170, 0x376);
+ vt82c686b_init_ports(d);
return 0;
}