@@ -614,7 +614,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(bm, 1) == 0)
goto eot;
#ifdef DEBUG_AIO
printf("aio_read: sector_num=%" PRId64 " n=%d\n", sector_num, n);
@@ -756,7 +756,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(bm, 0) == 0)
goto eot;
#ifdef DEBUG_AIO
printf("aio_write: sector_num=%" PRId64 " n=%d\n", sector_num, n);
@@ -1064,7 +1064,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(bm, 1) == 0)
goto eot;
}
@@ -2716,6 +2716,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;
@@ -2741,6 +2742,8 @@ static IDEBusOps pata_bus_ops = {
.transfer_start = pata_transfer_start,
.set_irq = pata_set_irq,
.dma_start = pata_dma_start,
+ .dma_prepare = dma_buf_prepare,
+ .dma_rw = dma_buf_rw,
};
void ide_init2(IDEBus *bus, qemu_irq irq)
@@ -375,6 +375,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 {
@@ -458,6 +460,8 @@ struct IDEBusOps {
TransferStartFunc *transfer_start;
IRQSetFunc *set_irq;
DMAStartFunc *dma_start;
+ DMAPrepareFunc *dma_prepare;
+ DMARWFunc *dma_rw;
};
struct IDEBus {