Statistics
| Branch: | Revision:

root / pc-bios / openbios-esp.diff @ 4d611c9a

History | View | Annotate | Download (1.2 kB)

1
The ESP SCSI driver currently doesn't check whether a DMA requests has 
2
completed before checking its status. On older qemu versions this works ok 
3
because DMA happens instantly. On never qemu DMA can take an indeterminate 
4
amount of time ooto complete, just like on real hardware.
5

    
6
The patch below waits for the controller to raise the DMA interrupt after 
7
initiating a DMA request.
8

    
9
Index: drivers/esp.c
10
===================================================================
11
--- drivers/esp.c        (revision 61)
12
+++ drivers/esp.c        (working copy)
13
@@ -113,6 +113,8 @@ do_command(esp_private_t *esp, sd_privat
14
     esp->espdma.regs->cond_reg = 0;
15
     // Set ATN, issue command
16
     esp->ll->regs[ESP_CMD] = ESP_CMD_SELA | ESP_CMD_DMA;
17
+    // Wait for DMA to complete
18
+    while ((esp->espdma.regs->cond_reg & DMA_HNDL_INTR) == 0) /* no-op */;
19
     // Check status
20
     status = esp->ll->regs[ESP_STATUS];
21
 
22
@@ -129,6 +131,8 @@ do_command(esp_private_t *esp, sd_privat
23
     esp->espdma.regs->cond_reg = DMA_ST_WRITE;
24
     // Transfer
25
     esp->ll->regs[ESP_CMD] = ESP_CMD_TI | ESP_CMD_DMA;
26
+    // Wait for DMA to complete
27
+    while ((esp->espdma.regs->cond_reg & DMA_HNDL_INTR) == 0) /* no-op */;
28
     // Check status
29
     status = esp->ll->regs[ESP_STATUS];
30