@@ -607,7 +607,7 @@ static void ide_read_dma_cb(void *opaque, int ret)
n = s->nsector;
s->io_buffer_index = 0;
s->io_buffer_size = n * 512;
- if (dma_buf_prepare(bm, 1) == 0)
+ if (s->bus->ops->dma_prepare_fn(bm, 1) == 0)
goto eot;
#ifdef DEBUG_AIO
printf("aio_read: sector_num=%" PRId64 " n=%d\n", sector_num, n);
@@ -752,7 +752,7 @@ static void ide_write_dma_cb(void *opaque, int ret)
n = s->nsector;
s->io_buffer_size = n * 512;
/* launch next transfer */
- if (dma_buf_prepare(bm, 0) == 0)
+ if (s->bus->ops->dma_prepare_fn(bm, 0) == 0)
goto eot;
#ifdef DEBUG_AIO
printf("aio_write: sector_num=%" PRId64 " n=%d\n", sector_num, n);
@@ -1060,7 +1060,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
s->lba += n;
}
s->packet_transfer_size -= s->io_buffer_size;
- if (dma_buf_rw(bm, 1) == 0)
+ if (s->bus->ops->dma_rw_fn(bm, 1) == 0)
goto eot;
}
@@ -2715,6 +2715,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs,
} else {
pstrcpy(s->version, sizeof(s->version), QEMU_VERSION);
}
+
ide_reset(s);
bdrv_set_removable(bs, s->drive_kind == IDE_CD);
return 0;
@@ -2740,6 +2741,8 @@ static IDEBusOps ide_bus_ops = {
.transfer_start_fn = pata_transfer_start,
.irq_set_fn = pata_set_irq,
.dma_start_fn = pata_dma_start,
+ .dma_prepare_fn = dma_buf_prepare,
+ .dma_rw_fn = dma_buf_rw,
};
void ide_init2(IDEBus *bus, qemu_irq irq)
@@ -374,6 +374,8 @@ typedef void TransferStartFunc(IDEState *,
EndTransferFunc *);
typedef void IRQSetFunc(IDEBus *);
typedef void DMAStartFunc(IDEState *, BlockDriverCompletionFunc *);
+typedef int DMAPrepareFunc(BMDMAState *, int);
+typedef int DMARWFunc(BMDMAState *, int);
/* NOTE: IDEState represents in fact one drive */
struct IDEState {
@@ -457,6 +459,8 @@ struct IDEBusOps {
TransferStartFunc *transfer_start_fn;
IRQSetFunc *irq_set_fn;
DMAStartFunc *dma_start_fn;
+ DMAPrepareFunc *dma_prepare_fn;
+ DMARWFunc *dma_rw_fn;
};
struct IDEBus {