Skip to contentSkip to conversation

i8257: fix Terminal Count status

PATCH Applied Hervé Poussineau 3 participants 3 messages Feb 25, 2016 – Feb 29, 2016

lore
Share & tools
lore
#0 lore raw

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
index 5a52707..6078893 100644
@@ -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
Reviewed-by on v1 1/1
#1 lore raw
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 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 +0 -0
index 5a52707..6078893 100644

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.)

#2 lore raw
In reply to Hervé Poussineau
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 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 +0 -0
index 5a52707..6078893 100644

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