|
@@ -230,10 +230,6 @@ static void default_enable(unsigned int irq)
|
|
*/
|
|
*/
|
|
static void default_disable(unsigned int irq)
|
|
static void default_disable(unsigned int irq)
|
|
{
|
|
{
|
|
- struct irq_desc *desc = irq_desc + irq;
|
|
|
|
-
|
|
|
|
- if (!(desc->status & IRQ_DELAYED_DISABLE))
|
|
|
|
- desc->chip->mask(irq);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -298,13 +294,18 @@ handle_simple_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
|
if (unlikely(desc->status & IRQ_INPROGRESS))
|
|
if (unlikely(desc->status & IRQ_INPROGRESS))
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
- desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
|
|
|
|
kstat_cpu(cpu).irqs[irq]++;
|
|
kstat_cpu(cpu).irqs[irq]++;
|
|
|
|
|
|
action = desc->action;
|
|
action = desc->action;
|
|
- if (unlikely(!action || (desc->status & IRQ_DISABLED)))
|
|
|
|
|
|
+ if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
|
|
|
|
+ if (desc->chip->mask)
|
|
|
|
+ desc->chip->mask(irq);
|
|
|
|
+ desc->status &= ~(IRQ_REPLAY | IRQ_WAITING);
|
|
|
|
+ desc->status |= IRQ_PENDING;
|
|
goto out_unlock;
|
|
goto out_unlock;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ desc->status &= ~(IRQ_REPLAY | IRQ_WAITING | IRQ_PENDING);
|
|
desc->status |= IRQ_INPROGRESS;
|
|
desc->status |= IRQ_INPROGRESS;
|
|
spin_unlock(&desc->lock);
|
|
spin_unlock(&desc->lock);
|
|
|
|
|
|
@@ -396,11 +397,13 @@ handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc)
|
|
|
|
|
|
/*
|
|
/*
|
|
* If its disabled or no action available
|
|
* If its disabled or no action available
|
|
- * keep it masked and get out of here
|
|
|
|
|
|
+ * then mask it and get out of here:
|
|
*/
|
|
*/
|
|
action = desc->action;
|
|
action = desc->action;
|
|
if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
|
|
if (unlikely(!action || (desc->status & IRQ_DISABLED))) {
|
|
desc->status |= IRQ_PENDING;
|
|
desc->status |= IRQ_PENDING;
|
|
|
|
+ if (desc->chip->mask)
|
|
|
|
+ desc->chip->mask(irq);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|