Re: [PATCH] fix the interrupt loss problem on powerpc IPIC(2.6.25-2.6.28)

From: dayu
Date: Wed Feb 18 2009 - 00:48:00 EST


renew description in the patch, with this change the 'temp' is still used to make code clear.

___________________________________________

From: Da Yu <dayu@xxxxxxxxxxxxxxx>
Date: Wed, 18 Feb 2009 19:58:20 +0800
Subject: [PATCH] fix the interrupt loss problem on powerpc IPIC (2.6.25-2.6.28)

Description: The interrupt pending register is write 1 clear. If there are more than one external interrupts pending at the same time, acking the first interrupt by reading pending register then OR the corresponding bit and write back to pending register will also clear other interrupt pending bits. That will cause loss of interrupt.

Signed-off-by: Da Yu <dayu@xxxxxxxxxxxxxxx>
---

--- a/arch/powerpc/sysdev/ipic.c 2009-02-18 09:47:04.000000000 +0800
+++ b/arch/powerpc/sysdev/ipic.c 2009-02-18 09:46:34.000000000 +0800
@@ -568,8 +568,7 @@ static void ipic_ack_irq(unsigned int vi

spin_lock_irqsave(&ipic_lock, flags);

- temp = ipic_read(ipic->regs, ipic_info[src].ack);
- temp |= (1 << (31 - ipic_info[src].bit));
+ temp = 1 << (31 - ipic_info[src].bit);
ipic_write(ipic->regs, ipic_info[src].ack, temp);

/* mb() can't guarantee that ack is finished. But it does finish
@@ -592,8 +591,7 @@ static void ipic_mask_irq_and_ack(unsign
temp &= ~(1 << (31 - ipic_info[src].bit));
ipic_write(ipic->regs, ipic_info[src].mask, temp);

- temp = ipic_read(ipic->regs, ipic_info[src].ack);
- temp |= (1 << (31 - ipic_info[src].bit));
+ temp = 1 << (31 - ipic_info[src].bit);
ipic_write(ipic->regs, ipic_info[src].ack, temp);

/* mb() can't guarantee that ack is finished. But it does finish






-----邮件原件-----
发件人: Olof Johansson [mailto:olof@xxxxxxxxx]
发送时间: 2009年2月18日 10:43
收件人: 笪禹
抄送: leoli@xxxxxxxxxxxxx; galak@xxxxxxxxxxxxxxxxxxx; linuxppc-dev@xxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx
主题: Re: [PATCH] fix the interrupt loss problem on powerpc IPIC(2.6.25-2.6.28)

On Wed, Feb 18, 2009 at 10:16:07AM +0800, dayu@xxxxxxxxxxxxxxx wrote:
> From: Da Yu <dayu@xxxxxxxxxxxxxxx>
> Date: Wed, 18 Feb 2009 19:58:20 +0800
> Subject: [PATCH] fix the interrupt loss problem on powerpc IPIC
> (2.6.25-2.6.28)
>
> Signed-off-by: Da Yu <dayu@xxxxxxxxxxxxxxx>

Still no proper explanation in the patch.

Also, with this change, is 'temp' really needed, or can you just pass in the mask by hand?


-Olof

> ---
>
> --- a/arch/powerpc/sysdev/ipic.c 2009-02-18 09:47:04.000000000 +0800
> +++ b/arch/powerpc/sysdev/ipic.c 2009-02-18 09:46:34.000000000 +0800
> @@ -568,8 +568,7 @@ static void ipic_ack_irq(unsigned int vi
>
> spin_lock_irqsave(&ipic_lock, flags);
>
> - temp = ipic_read(ipic->regs, ipic_info[src].ack);
> - temp |= (1 << (31 - ipic_info[src].bit));
> + temp = 1 << (31 - ipic_info[src].bit);
> ipic_write(ipic->regs, ipic_info[src].ack, temp);
>
> /* mb() can't guarantee that ack is finished. But it does finish

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/