ipack/devices/ipoctal: ack IRQ before processing it
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>
Mon, 10 Dec 2012 10:50:04 +0000 (11:50 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 16 Jan 2013 02:24:38 +0000 (18:24 -0800)
Due to the IRQ processing, we can generate another IRQ that can come before we
end the previous one, so we lost it. E.g. when transmitting a character.

To allow the processing in SMP machines, we ack the IRQ at the beginning of the
IRQ handler.

Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/ipack/devices/ipoctal.c

index 09e3a8e..9cd5572 100644 (file)
@@ -223,14 +223,14 @@ static irqreturn_t ipoctal_irq_handler(void *arg)
        unsigned int i;
        struct ipoctal *ipoctal = (struct ipoctal *) arg;
 
-       /* Check all channels */
-       for (i = 0; i < NR_CHANNELS; i++)
-               ipoctal_irq_channel(&ipoctal->channel[i]);
-
        /* Clear the IPack device interrupt */
        readw(ipoctal->int_space + ACK_INT_REQ0);
        readw(ipoctal->int_space + ACK_INT_REQ1);
 
+       /* Check all channels */
+       for (i = 0; i < NR_CHANNELS; i++)
+               ipoctal_irq_channel(&ipoctal->channel[i]);
+
        return IRQ_HANDLED;
 }