|
@@ -651,13 +651,21 @@ static uint8_t floppy_write_prep(struct gw_write_flux *wf)
|
|
|
|
|
|
static void floppy_write_wait_data(void)
|
|
|
{
|
|
|
+ bool_t write_finished;
|
|
|
+
|
|
|
floppy_process_write_packet();
|
|
|
wdata_decode_flux();
|
|
|
|
|
|
- /* Wait for DMA and input buffers to fill, or write stream to end. */
|
|
|
+ /* Wait for DMA and input buffers to fill, or write stream to end. We must
|
|
|
+ * take care because, since we are not yet draining the DMA buffer, the
|
|
|
+ * write stream may end without us noticing and setting rw.write_finished.
|
|
|
+ * Hence we peek for a NUL byte in the input buffer if it's non-empty. */
|
|
|
+ write_finished = ((u_prod == u_cons)
|
|
|
+ ? rw.write_finished
|
|
|
+ : (u_buf[U_MASK(u_prod-1)] == 0));
|
|
|
if (((dma.prod != (ARRAY_SIZE(dma.buf)-1))
|
|
|
|| ((uint32_t)(u_prod - u_cons) < (ARRAY_SIZE(u_buf) - 512)))
|
|
|
- && !rw.write_finished)
|
|
|
+ && !write_finished)
|
|
|
return;
|
|
|
|
|
|
floppy_state = ST_write_flux_wait_index;
|