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

[Xen-changelog] [xen-unstable] x86/i8259: Clean up _mask_and_ack_8259A_irq().


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-unstable <patchbot@xxxxxxx>
  • Date: Fri, 31 Aug 2012 01:22:09 +0000
  • Delivery-date: Fri, 31 Aug 2012 01:22:18 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Keir Fraser <keir@xxxxxxx>
# Date 1346347040 -3600
# Node ID 9e5665f9f430a25e3447431047f1cea59320667f
# Parent  4f3fc4aadcc1efc544b850a98141dc0d0dcc73e2
x86/i8259: Clean up _mask_and_ack_8259A_irq().

Signed-off-by: Keir Fraser <keir@xxxxxxx>
---


diff -r 4f3fc4aadcc1 -r 9e5665f9f430 xen/arch/x86/i8259.c
--- a/xen/arch/x86/i8259.c      Thu Aug 30 18:06:39 2012 +0100
+++ b/xen/arch/x86/i8259.c      Thu Aug 30 18:17:20 2012 +0100
@@ -123,6 +123,8 @@ static struct hw_interrupt_type __read_m
  * 8259A PIC functions to handle ISA devices:
  */
 
+#define aeoi_mode (i8259A_irq_type.ack == disable_8259A_irq)
+
 /*
  * This contains the irq mask for both 8259A irq controllers,
  */
@@ -248,10 +250,10 @@ static bool_t _mask_and_ack_8259A_irq(un
 {
     unsigned int irqmask = 1 << irq;
     unsigned long flags;
-    bool_t real_irq = 1; /* Assume real unless spurious */
-    bool_t need_eoi = i8259A_irq_type.ack != disable_8259A_irq;
+    bool_t is_real_irq = 1; /* Assume real unless spurious */
 
     spin_lock_irqsave(&i8259A_lock, flags);
+
     /*
      * Lightweight spurious IRQ detection. We do not want
      * to overdo spurious IRQ handling - it's usually a sign
@@ -267,46 +269,10 @@ static bool_t _mask_and_ack_8259A_irq(un
      * but should be enough to warn the user that there
      * is something bad going on ...
      */
-    if (cached_irq_mask & irqmask)
-        goto spurious_8259A_irq;
-    cached_irq_mask |= irqmask;
-
- handle_real_irq:
-    if (irq & 8) {
-        inb(0xA1);              /* DUMMY - (do we need this?) */
-        outb(cached_A1,0xA1);
-        if ( need_eoi )
-        {
-            outb(0x60 + (irq & 7), 0xA0);/* 'Specific EOI' to slave */
-            outb(0x62,0x20);        /* 'Specific EOI' to master-IRQ2 */
-        }
-    } else {
-        inb(0x21);              /* DUMMY - (do we need this?) */
-        outb(cached_21,0x21);
-        if ( need_eoi )
-            outb(0x60 + irq, 0x20);/* 'Specific EOI' to master */
-    }
-    spin_unlock_irqrestore(&i8259A_lock, flags);
-    return real_irq;
-
- spurious_8259A_irq:
-    /*
-     * this is the slow path - should happen rarely.
-     */
-    if (i8259A_irq_real(irq))
-        /*
-         * oops, the IRQ _is_ in service according to the
-         * 8259A - not spurious, go handle it.
-         */
-        goto handle_real_irq;
-
-    {
+    if ((cached_irq_mask & irqmask) && !i8259A_irq_real(irq)) {
         static int spurious_irq_mask;
-        real_irq = 0;
-        /*
-         * At this point we can be sure the IRQ is spurious,
-         * lets ACK and report it. [once per IRQ]
-         */
+        is_real_irq = 0;
+        /* Report spurious IRQ, once per IRQ line. */
         if (!(spurious_irq_mask & irqmask)) {
             printk("spurious 8259A interrupt: IRQ%d.\n", irq);
             spurious_irq_mask |= irqmask;
@@ -316,8 +282,27 @@ static bool_t _mask_and_ack_8259A_irq(un
          * but in Linux this does not cause problems and is
          * simpler for us.
          */
-        goto handle_real_irq;
     }
+
+    cached_irq_mask |= irqmask;
+
+    if (irq & 8) {
+        inb(0xA1);              /* DUMMY - (do we need this?) */
+        outb(cached_A1,0xA1);
+        if (!aeoi_mode) {
+            outb(0x60 + (irq & 7), 0xA0);/* 'Specific EOI' to slave */
+            outb(0x62,0x20);        /* 'Specific EOI' to master-IRQ2 */
+        }
+    } else {
+        inb(0x21);              /* DUMMY - (do we need this?) */
+        outb(cached_21,0x21);
+        if (!aeoi_mode)
+            outb(0x60 + irq, 0x20);/* 'Specific EOI' to master */
+    }
+
+    spin_unlock_irqrestore(&i8259A_lock, flags);
+
+    return is_real_irq;
 }
 
 static char irq_trigger[2];
@@ -339,7 +324,7 @@ static void save_ELCR(char *trigger)
 
 int i8259A_resume(void)
 {
-    init_8259A(i8259A_irq_type.ack == disable_8259A_irq);
+    init_8259A(aeoi_mode);
     restore_ELCR(irq_trigger);
     return 0;
 }

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.