--- linux-2.4.18/arch/i386/kernel/irq.c.org Thu Oct 25 15:53:46 2001 +++ linux-2.4.18/arch/i386/kernel/irq.c Tue Jun 11 19:09:14 2002 @@ -387,7 +387,7 @@ int retval; int local_enabled; unsigned long flags; - int cpu = smp_processor_id(); + int cpu ; /* don't initialize cpu here, it changes the flags - MSZ */ __save_flags(flags); local_enabled = (flags >> EFLAGS_IF_SHIFT) & 1; @@ -395,6 +395,7 @@ retval = 2 + local_enabled; /* check for global flags if we're not in an interrupt */ + cpu = smp_processor_id(); if (!local_irq_count(cpu)) { if (local_enabled) retval = 1; @@ -507,9 +508,12 @@ void disable_irq(unsigned int irq) { + int cpu_id ; + disable_irq_nosync(irq); + cpu_id = smp_processor_id() ; - if (!local_irq_count(smp_processor_id())) { + if (!local_irq_count(cpu_id)) { do { barrier(); cpu_relax(); @@ -806,6 +810,7 @@ irq_desc_t *desc; unsigned long val; unsigned long delay; + unsigned long flags; /* Don't presume interrupt state - MSZ */ down(&probe_sem); /* @@ -815,10 +820,12 @@ for (i = NR_IRQS-1; i > 0; i--) { desc = irq_desc + i; - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock,flags); +/* MSZ spin_lock_irq(&desc->lock); */ if (!irq_desc[i].action) irq_desc[i].handler->startup(i); - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock,flags); +/* MSZ spin_unlock_irq(&desc->lock); */ } /* Wait for longstanding interrupts to trigger. */ @@ -833,13 +840,15 @@ for (i = NR_IRQS-1; i > 0; i--) { desc = irq_desc + i; - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock,flags); +/* MSZ spin_lock_irq(&desc->lock); */ if (!desc->action) { desc->status |= IRQ_AUTODETECT | IRQ_WAITING; if (desc->handler->startup(i)) desc->status |= IRQ_PENDING; } - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock,flags); +/* MSZ spin_unlock_irq(&desc->lock); */ } /* @@ -856,7 +865,8 @@ irq_desc_t *desc = irq_desc + i; unsigned int status; - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock,flags); +/* MSZ spin_lock_irq(&desc->lock); */ status = desc->status; if (status & IRQ_AUTODETECT) { @@ -868,7 +878,8 @@ if (i < 32) val |= 1 << i; } - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock,flags); +/* MSZ spin_unlock_irq(&desc->lock); */ } return val; @@ -895,13 +906,15 @@ { int i; unsigned int mask; + unsigned int flags; /* don't presume interrupt state - MSZ */ mask = 0; for (i = 0; i < NR_IRQS; i++) { irq_desc_t *desc = irq_desc + i; unsigned int status; - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock,flags); +/* MSZ spin_lock_irq(&desc->lock); */ status = desc->status; if (status & IRQ_AUTODETECT) { @@ -911,7 +924,8 @@ desc->status = status & ~IRQ_AUTODETECT; desc->handler->shutdown(i); } - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock,flags); +/* MSZ spin_unlock_irq(&desc->lock); */ } up(&probe_sem); @@ -950,8 +964,10 @@ for (i = 0; i < NR_IRQS; i++) { irq_desc_t *desc = irq_desc + i; unsigned int status; + unsigned long flags; /* Don't presume interrupt state - MSZ */ - spin_lock_irq(&desc->lock); + spin_lock_irqsave(&desc->lock,flags); +/* MSZ spin_lock_irq(&desc->lock); */ status = desc->status; if (status & IRQ_AUTODETECT) { @@ -963,7 +979,8 @@ desc->status = status & ~IRQ_AUTODETECT; desc->handler->shutdown(i); } - spin_unlock_irq(&desc->lock); + spin_unlock_irqrestore(&desc->lock,flags); +/* MSZ spin_unlock_irq(&desc->lock); */ } up(&probe_sem);