While working on the Tulip driver i tried to write some Teledisk images to a floppy image which didn't work. Turned out that Teledisk checks the written data by issuing a READ command to the FDC but running the DMA controller in VERIFY mode. As we ignored the DMA request in that case, the DMA transfer never finished, and Teledisk reported an error.
Signed-off-by: Sven Schnelle <sv...@stackframe.org> --- hw/block/fdc.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/hw/block/fdc.c b/hw/block/fdc.c index ac5d31e8c1..8a1228df78 100644 --- a/hw/block/fdc.c +++ b/hw/block/fdc.c @@ -1733,7 +1733,8 @@ static void fdctrl_start_transfer(FDCtrl *fdctrl, int direction) dma_mode_ok = (dma_mode == ISADMA_TRANSFER_WRITE); break; case FD_DIR_READ: - dma_mode_ok = (dma_mode == ISADMA_TRANSFER_READ); + dma_mode_ok = (dma_mode == ISADMA_TRANSFER_READ) || + (dma_mode == ISADMA_TRANSFER_VERIFY); break; case FD_DIR_VERIFY: dma_mode_ok = true; @@ -1835,8 +1836,11 @@ static int fdctrl_transfer_handler (void *opaque, int nchan, switch (fdctrl->data_dir) { case FD_DIR_READ: /* READ commands */ - k->write_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos, - fdctrl->data_pos, len); + if (k->get_transfer_mode(fdctrl->dma, fdctrl->dma_chann) != + ISADMA_TRANSFER_VERIFY) { + k->write_memory(fdctrl->dma, nchan, fdctrl->fifo + rel_pos, + fdctrl->data_pos, len); + } break; case FD_DIR_WRITE: /* WRITE commands */ -- 2.23.0