[OpenBIOS] r666 - trunk/openbios-devel/drivers
svn at openbios.org
svn at openbios.org
Sat Jan 16 11:35:58 CET 2010
Author: blueswirl
Date: 2010-01-16 11:35:58 +0100 (Sat, 16 Jan 2010)
New Revision: 666
Modified:
trunk/openbios-devel/drivers/esp.c
Log:
ESP: fix breakage by r667, status getting erased by interrupt register read
Reading the interrupt status register clears also status register, therefore
the interrupt status must be read only after reading the status.
Signed-off-by: Blue Swirl <blauwirbel at gmail.com>
Modified: trunk/openbios-devel/drivers/esp.c
===================================================================
--- trunk/openbios-devel/drivers/esp.c 2010-01-16 08:47:39 UTC (rev 665)
+++ trunk/openbios-devel/drivers/esp.c 2010-01-16 10:35:58 UTC (rev 666)
@@ -101,12 +101,11 @@
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];
// Clear interrupts to avoid guests seeing spurious interrupts
(void)esp->ll->regs[ESP_INTRPT];
- // Check status
- status = esp->ll->regs[ESP_STATUS];
-
DPRINTF("do_command: id %d, cmd[0] 0x%x, status 0x%x\n", sd->id, esp->buffer[0], status);
// Target didn't want all command data or went to status phase
@@ -127,13 +126,11 @@
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];
// Clear interrupts to avoid guests seeing spurious interrupts
(void)esp->ll->regs[ESP_INTRPT];
- // Check status
- status = esp->ll->regs[ESP_STATUS];
-
DPRINTF("do_command_reply: status 0x%x\n", status);
if ((status & ESP_STAT_TCNT) != ESP_STAT_TCNT)
More information about the OpenBIOS
mailing list