aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ipack/devices
diff options
context:
space:
mode:
authorSamuel Iglesias Gonsalvez <siglesias@igalia.com>2012-12-10 05:50:04 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-15 21:24:38 -0500
commit21d27ed4616c9a7f2886c4159b4c409f73f96e76 (patch)
tree55d3cb66981320b757ced8532c63d5a0ec397b70 /drivers/ipack/devices
parenta3882b7814fb3a5b7ea211e421451b1c4685f8f9 (diff)
ipack/devices/ipoctal: ack IRQ before processing it
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>
Diffstat (limited to 'drivers/ipack/devices')
-rw-r--r--drivers/ipack/devices/ipoctal.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/ipack/devices/ipoctal.c b/drivers/ipack/devices/ipoctal.c
index 09e3a8e63e22..9cd5572457ff 100644
--- a/drivers/ipack/devices/ipoctal.c
+++ b/drivers/ipack/devices/ipoctal.c
@@ -223,14 +223,14 @@ static irqreturn_t ipoctal_irq_handler(void *arg)
223 unsigned int i; 223 unsigned int i;
224 struct ipoctal *ipoctal = (struct ipoctal *) arg; 224 struct ipoctal *ipoctal = (struct ipoctal *) arg;
225 225
226 /* Check all channels */
227 for (i = 0; i < NR_CHANNELS; i++)
228 ipoctal_irq_channel(&ipoctal->channel[i]);
229
230 /* Clear the IPack device interrupt */ 226 /* Clear the IPack device interrupt */
231 readw(ipoctal->int_space + ACK_INT_REQ0); 227 readw(ipoctal->int_space + ACK_INT_REQ0);
232 readw(ipoctal->int_space + ACK_INT_REQ1); 228 readw(ipoctal->int_space + ACK_INT_REQ1);
233 229
230 /* Check all channels */
231 for (i = 0; i < NR_CHANNELS; i++)
232 ipoctal_irq_channel(&ipoctal->channel[i]);
233
234 return IRQ_HANDLED; 234 return IRQ_HANDLED;
235} 235}
236 236