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