qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 7/7] ahci: work around bug with level interrupts


From: Alexander Graf
Subject: [Qemu-devel] [PATCH 7/7] ahci: work around bug with level interrupts
Date: Wed, 2 Feb 2011 15:39:27 +0100

When using level based interrupts, the interrupt is treated the same as an
edge triggered one: leaving the line up does not retrigger the interrupt.

In fact, when not lowering the line, we won't ever get a new interrupt inside
the guest. So let's always retrigger an interrupt as soon as the OS ack'ed
something on the device. This way we're sure the guest doesn't starve on
interrupts until someone fixes the actual interrupt path.

Signed-off-by: Alexander Graf <address@hidden>

---

v2 -> v3:

  - add comment about the interrupt hack

v3 -> v4:

  - embed non-workaround version in the code
---
 hw/ide/ahci.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 98bdf70..10377ca 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -152,12 +152,25 @@ static void ahci_check_irq(AHCIState *s)
         }
     }
 
+    /* XXX We always lower the interrupt line here because of a bug with
+           interrupt handling in Qemu. When leaving a line up, the interrupt
+           does not get retriggered automatically currently. Once that bug is
+           fixed, this workaround is not necessary anymore and we only need to
+           lower in the else branch. */
+#if 0
     if (s->control_regs.irqstatus &&
         (s->control_regs.ghc & HOST_CTL_IRQ_EN)) {
             ahci_irq_raise(s, NULL);
     } else {
         ahci_irq_lower(s, NULL);
     }
+#else
+    ahci_irq_lower(s, NULL);
+    if (s->control_regs.irqstatus &&
+        (s->control_regs.ghc & HOST_CTL_IRQ_EN)) {
+            ahci_irq_raise(s, NULL);
+    }
+#endif
 }
 
 static void ahci_trigger_irq(AHCIState *s, AHCIDevice *d,
-- 
1.6.0.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]