diff options
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 0bcec745a672..f291f7826abc 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -145,6 +145,19 @@ notrace unsigned int __check_irq_replay(void) | |||
145 | 145 | ||
146 | /* Clear bit 0 which we wouldn't clear otherwise */ | 146 | /* Clear bit 0 which we wouldn't clear otherwise */ |
147 | local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS; | 147 | local_paca->irq_happened &= ~PACA_IRQ_HARD_DIS; |
148 | if (happened & PACA_IRQ_HARD_DIS) { | ||
149 | /* | ||
150 | * We may have missed a decrementer interrupt if hard disabled. | ||
151 | * Check the decrementer register in case we had a rollover | ||
152 | * while hard disabled. | ||
153 | */ | ||
154 | if (!(happened & PACA_IRQ_DEC)) { | ||
155 | if (decrementer_check_overflow()) { | ||
156 | local_paca->irq_happened |= PACA_IRQ_DEC; | ||
157 | happened |= PACA_IRQ_DEC; | ||
158 | } | ||
159 | } | ||
160 | } | ||
148 | 161 | ||
149 | /* | 162 | /* |
150 | * Force the delivery of pending soft-disabled interrupts on PS3. | 163 | * Force the delivery of pending soft-disabled interrupts on PS3. |
@@ -170,7 +183,7 @@ notrace unsigned int __check_irq_replay(void) | |||
170 | * in case we also had a rollover while hard disabled | 183 | * in case we also had a rollover while hard disabled |
171 | */ | 184 | */ |
172 | local_paca->irq_happened &= ~PACA_IRQ_DEC; | 185 | local_paca->irq_happened &= ~PACA_IRQ_DEC; |
173 | if ((happened & PACA_IRQ_DEC) || decrementer_check_overflow()) | 186 | if (happened & PACA_IRQ_DEC) |
174 | return 0x900; | 187 | return 0x900; |
175 | 188 | ||
176 | /* Finally check if an external interrupt happened */ | 189 | /* Finally check if an external interrupt happened */ |