diff --git a/hw/ide/core.c b/hw/ide/core.c
index 3912c21..1680a38 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -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)
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
index f5d6ba7..1b5e738 100644
--- a/hw/ide/internal.h
+++ b/hw/ide/internal.h
@@ -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 {
