i8257: fix Terminal Count status
PATCH 1/1 i8257: fix Terminal Count status
When a DMA transfer is done (ie all bytes have been transfered), the corresponding Terminal Count bit must be set in the status register.
This bit is already cleared in i8257_read_cont and i8257_write_cont when required.
This fixes (at least) floppy transfer in IBM 40p firmware, which checks in DMA controller if everything went fine.
--- hw/dma/i8257.c | 4 ++++ 1 file changed, 4 insertions(+)
hw/dma/i8257.c +4 -0
@@ -342,6 +342,10 @@ static void i8257_channel_run(I8257State *d, int ichan) r->now[COUNT], (r->base[COUNT] + 1) << ncont); r->now[COUNT ] = n;ldebug ("dma_pos %d size %d\n" , n, (r->base[COUNT ] +1 ) << ncont); +if (n == (r->base[COUNT ] +1 ) << ncont) { +ldebug ("transfer done\n" ); + d->status |= (1 << ichan); + } }static void i8257_dma_run (void *opaque)
Signature · 1 line
2.1.4
Quoted 18 lines · Hervé Poussineau
When a DMA transfer is done (ie all bytes have been transfered), the corresponding Terminal Count bit must be set in the status register.
This bit is already cleared ini8257_read_contandi8257_write_contwhen required.This fixes (at least) floppy transfer in IBM 40p firmware, which checks in DMA controller if everything went fine.
Signed-off-by Hervé Poussineau <[email protected]>--- hw/dma/i8257.c | 4 ++++ 1 file changed, 4 insertions(+)hw/dma/i8257.c +0
-0
hw/dma/i8257.c static void i8257_channel_run(I8257State *d, int ichan) · line 351
Quoted 10 lines
hw/dma/i8257.c +4
-0@@ -342,6 +342,10 @@ static void i8257_channel_run(I8257State *d, int ichan) r->now[COUNT], (r->base[COUNT] + 1) << ncont); r->now[COUNT ] = n;ldebug ("dma_pos %d size %d\n" , n, (r->base[COUNT ] +1 ) << ncont); +if (n == (r->base[COUNT ] +1 ) << ncont) { +ldebug ("transfer done\n" ); + d->status |= (1 << ichan); + } }static void i8257_dma_run (void *opaque)
As best as I can tell from the i8257 data sheet I found this seems to be correct, assuming the size calculation is correct (looks right, based on that existing ldebug print.)
Paolo Bonzini
AppliedQuoted 18 lines · Hervé Poussineau
When a DMA transfer is done (ie all bytes have been transfered), the corresponding Terminal Count bit must be set in the status register.
This bit is already cleared ini8257_read_contandi8257_write_contwhen required.This fixes (at least) floppy transfer in IBM 40p firmware, which checks in DMA controller if everything went fine.
Signed-off-by Hervé Poussineau <[email protected]>--- hw/dma/i8257.c | 4 ++++ 1 file changed, 4 insertions(+)hw/dma/i8257.c +0
-0
hw/dma/i8257.c static void i8257_channel_run(I8257State *d, int ichan) · line 351
Quoted 10 lines
hw/dma/i8257.c +4
-0@@ -342,6 +342,10 @@ static void i8257_channel_run(I8257State *d, int ichan) r->now[COUNT], (r->base[COUNT] + 1) << ncont); r->now[COUNT ] = n;ldebug ("dma_pos %d size %d\n" , n, (r->base[COUNT ] +1 ) << ncont); +if (n == (r->base[COUNT ] +1 ) << ncont) { +ldebug ("transfer done\n" ); + d->status |= (1 << ichan); + } }static void i8257_dma_run (void *opaque)
Queued, thanks!
Paolo