No subject


Mon Jun 26 04:21:23 CEST 2006


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 waits for the controller to raise the DMA interrupt after
initiating a DMA request.



Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c	2006-07-28 21:44:07 UTC (rev 72)
+++ openbios-devel/drivers/esp.c	2006-08-12 09:52:34 UTC (rev 73)
@@ -113,6 +113,8 @@
     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. Can this fail?
+    while ((esp->espdma.regs->cond_reg & DMA_HNDL_INTR) == 0) /* no-op */;
     // Check status
     status = esp->ll->regs[ESP_STATUS];
 
@@ -129,6 +131,8 @@
     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];
 




More information about the OpenBIOS mailing list