diff options
author | Juan Quintela <quintela@redhat.com> | 2009-10-07 16:56:27 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-12 09:42:30 -0500 |
commit | 61f58e593452b3b3395e0c24ad4f7e79429e6c2f (patch) | |
tree | 60cec37fa1c4461aef89d59c632757ae12fac7f4 /hw/ide/cmd646.c | |
parent | 7e078316fdf09db229ba4bf63ef3233fef1ffad5 (diff) | |
download | qemu-61f58e593452b3b3395e0c24ad4f7e79429e6c2f.zip qemu-61f58e593452b3b3395e0c24ad4f7e79429e6c2f.tar.gz qemu-61f58e593452b3b3395e0c24ad4f7e79429e6c2f.tar.bz2 |
ide: cmd646 we can get the pci device with container_of
Patchworks-ID: 35305
Signed-off-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/ide/cmd646.c')
-rw-r--r-- | hw/ide/cmd646.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/hw/ide/cmd646.c b/hw/ide/cmd646.c index 2107209..eb5a2e9 100644 --- a/hw/ide/cmd646.c +++ b/hw/ide/cmd646.c @@ -68,10 +68,19 @@ static void ide_map(PCIDevice *pci_dev, int region_num, } } +static PCIIDEState *pci_from_bm(BMDMAState *bm) +{ + if (bm->unit == 0) { + return container_of(bm, PCIIDEState, bmdma[0]); + } else { + return container_of(bm, PCIIDEState, bmdma[1]); + } +} + static uint32_t bmdma_readb(void *opaque, uint32_t addr) { BMDMAState *bm = opaque; - PCIIDEState *pci_dev; + PCIIDEState *pci_dev = pci_from_bm(bm); uint32_t val; switch(addr & 3) { @@ -79,14 +88,12 @@ static uint32_t bmdma_readb(void *opaque, uint32_t addr) val = bm->cmd; break; case 1: - pci_dev = bm->pci_dev; val = pci_dev->dev.config[MRDMODE]; break; case 2: val = bm->status; break; case 3: - pci_dev = bm->pci_dev; if (bm == &pci_dev->bmdma[0]) { val = pci_dev->dev.config[UDIDETCR0]; } else { @@ -106,13 +113,12 @@ static uint32_t bmdma_readb(void *opaque, uint32_t addr) static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val) { BMDMAState *bm = opaque; - PCIIDEState *pci_dev; + PCIIDEState *pci_dev = pci_from_bm(bm); #ifdef DEBUG_IDE printf("bmdma: writeb 0x%02x : 0x%02x\n", addr, val); #endif switch(addr & 3) { case 1: - pci_dev = bm->pci_dev; pci_dev->dev.config[MRDMODE] = (pci_dev->dev.config[MRDMODE] & ~0x30) | (val & 0x30); cmd646_update_irq(pci_dev); @@ -121,7 +127,6 @@ static void bmdma_writeb(void *opaque, uint32_t addr, uint32_t val) bm->status = (val & 0x60) | (bm->status & 1) | (bm->status & ~val & 0x06); break; case 3: - pci_dev = bm->pci_dev; if (bm == &pci_dev->bmdma[0]) pci_dev->dev.config[UDIDETCR0] = val; else |