The ESP SCSI driver currently doesn't check whether a DMA requests has completed before checking its status. On older qemu versions this works ok because DMA happens instantly. On never qemu DMA can take an indeterminate amount of time ooto complete, just like on real hardware.
The patch below waits for the controller to raise the DMA interrupt after initiating a DMA request.
Paul
Index: drivers/esp.c =================================================================== --- drivers/esp.c (revision 61) +++ drivers/esp.c (working copy) @@ -113,6 +113,8 @@ do_command(esp_private_t *esp, sd_privat esp->espdma.regs->cond_reg = 0; // Set ATN, issue command esp->ll->regs[ESP_CMD] = ESP_CMD_SELA | ESP_CMD_DMA; + // Wait for DMA to complete + while ((esp->espdma.regs->cond_reg & DMA_HNDL_INTR) == 0) /* no-op */; // Check status status = esp->ll->regs[ESP_STATUS];
@@ -129,6 +131,8 @@ do_command(esp_private_t *esp, sd_privat esp->espdma.regs->cond_reg = DMA_ST_WRITE; // Transfer esp->ll->regs[ESP_CMD] = ESP_CMD_TI | ESP_CMD_DMA; + // Wait for DMA to complete + while ((esp->espdma.regs->cond_reg & DMA_HNDL_INTR) == 0) /* no-op */; // Check status status = esp->ll->regs[ESP_STATUS];