diff options
Diffstat (limited to 'kernel/irq')
-rw-r--r-- | kernel/irq/chip.c | 5 | ||||
-rw-r--r-- | kernel/irq/manage.c | 2 | ||||
-rw-r--r-- | kernel/irq/resend.c | 12 |
3 files changed, 7 insertions, 12 deletions
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c index 615ce97c6cfd..f1a73f0b54e7 100644 --- a/kernel/irq/chip.c +++ b/kernel/irq/chip.c | |||
@@ -352,13 +352,10 @@ handle_level_irq(unsigned int irq, struct irq_desc *desc) | |||
352 | * keep it masked and get out of here | 352 | * keep it masked and get out of here |
353 | */ | 353 | */ |
354 | action = desc->action; | 354 | action = desc->action; |
355 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) { | 355 | if (unlikely(!action || (desc->status & IRQ_DISABLED))) |
356 | desc->status |= IRQ_PENDING; | ||
357 | goto out_unlock; | 356 | goto out_unlock; |
358 | } | ||
359 | 357 | ||
360 | desc->status |= IRQ_INPROGRESS; | 358 | desc->status |= IRQ_INPROGRESS; |
361 | desc->status &= ~IRQ_PENDING; | ||
362 | spin_unlock(&desc->lock); | 359 | spin_unlock(&desc->lock); |
363 | 360 | ||
364 | action_ret = handle_IRQ_event(irq, action); | 361 | action_ret = handle_IRQ_event(irq, action); |
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index 203a518b6f14..853aefbd184b 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c | |||
@@ -462,7 +462,9 @@ void free_irq(unsigned int irq, void *dev_id) | |||
462 | * We do this after actually deregistering it, to make sure that | 462 | * We do this after actually deregistering it, to make sure that |
463 | * a 'real' IRQ doesn't run in parallel with our fake | 463 | * a 'real' IRQ doesn't run in parallel with our fake |
464 | */ | 464 | */ |
465 | local_irq_save(flags); | ||
465 | handler(irq, dev_id); | 466 | handler(irq, dev_id); |
467 | local_irq_restore(flags); | ||
466 | } | 468 | } |
467 | #endif | 469 | #endif |
468 | } | 470 | } |
diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c index c38272746887..a8046791ba2d 100644 --- a/kernel/irq/resend.c +++ b/kernel/irq/resend.c | |||
@@ -63,15 +63,11 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq) | |||
63 | desc->chip->enable(irq); | 63 | desc->chip->enable(irq); |
64 | 64 | ||
65 | /* | 65 | /* |
66 | * Temporary hack to figure out more about the problem, which | 66 | * We do not resend level type interrupts. Level type |
67 | * is causing the ancient network cards to die. | 67 | * interrupts are resent by hardware when they are still |
68 | * active. | ||
68 | */ | 69 | */ |
69 | if (desc->handle_irq != handle_edge_irq) { | 70 | if ((status & (IRQ_LEVEL | IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { |
70 | WARN_ON_ONCE(1); | ||
71 | return; | ||
72 | } | ||
73 | |||
74 | if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { | ||
75 | desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY; | 71 | desc->status = (status & ~IRQ_PENDING) | IRQ_REPLAY; |
76 | 72 | ||
77 | if (!desc->chip || !desc->chip->retrigger || | 73 | if (!desc->chip || !desc->chip->retrigger || |