diff options
Diffstat (limited to 'hw/ide/macio.c')
-rw-r--r-- | hw/ide/macio.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/hw/ide/macio.c b/hw/ide/macio.c index 126549dcdc..2b1e51d49e 100644 --- a/hw/ide/macio.c +++ b/hw/ide/macio.c @@ -64,6 +64,14 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret) goto done; } + if (!m->dma_active) { + MACIO_DPRINTF("waiting for data (%#x - %#x - %x)\n", + s->nsector, io->len, s->status); + /* data not ready yet, wait for the channel to get restarted */ + io->processing = false; + return; + } + MACIO_DPRINTF("io_buffer_size = %#x\n", s->io_buffer_size); if (s->io_buffer_size > 0) { @@ -80,6 +88,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret) if (s->packet_transfer_size <= 0) { MACIO_DPRINTF("end of transfer\n"); ide_atapi_cmd_ok(s); + m->dma_active = false; } if (io->len == 0) { @@ -130,6 +139,14 @@ static void pmac_ide_transfer_cb(void *opaque, int ret) goto done; } + if (!m->dma_active) { + MACIO_DPRINTF("waiting for data (%#x - %#x - %x)\n", + s->nsector, io->len, s->status); + /* data not ready yet, wait for the channel to get restarted */ + io->processing = false; + return; + } + sector_num = ide_get_sector(s); MACIO_DPRINTF("io_buffer_size = %#x\n", s->io_buffer_size); if (s->io_buffer_size > 0) { @@ -145,6 +162,7 @@ static void pmac_ide_transfer_cb(void *opaque, int ret) MACIO_DPRINTF("end of transfer\n"); s->status = READY_STAT | SEEK_STAT; ide_set_irq(s->bus); + m->dma_active = false; } if (io->len == 0) { @@ -379,6 +397,7 @@ static void ide_dbdma_start(IDEDMA *dma, IDEState *s, MACIOIDEState *m = container_of(dma, MACIOIDEState, dma); MACIO_DPRINTF("\n"); + m->dma_active = true; DBDMA_kick(m->dbdma); } |