diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/ia64/kernel/irq_ia64.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/arch/ia64/kernel/irq_ia64.c b/arch/ia64/kernel/irq_ia64.c index c47c8acc96e3..00a4599e5f47 100644 --- a/arch/ia64/kernel/irq_ia64.c +++ b/arch/ia64/kernel/irq_ia64.c | |||
@@ -82,7 +82,7 @@ struct irq_cfg irq_cfg[NR_IRQS] __read_mostly = { | |||
82 | }; | 82 | }; |
83 | 83 | ||
84 | DEFINE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq) = { | 84 | DEFINE_PER_CPU(int[IA64_NUM_VECTORS], vector_irq) = { |
85 | [0 ... IA64_NUM_VECTORS - 1] = IA64_SPURIOUS_INT_VECTOR | 85 | [0 ... IA64_NUM_VECTORS - 1] = -1 |
86 | }; | 86 | }; |
87 | 87 | ||
88 | static cpumask_t vector_table[IA64_NUM_VECTORS] = { | 88 | static cpumask_t vector_table[IA64_NUM_VECTORS] = { |
@@ -179,7 +179,7 @@ static void __clear_irq_vector(int irq) | |||
179 | domain = cfg->domain; | 179 | domain = cfg->domain; |
180 | cpus_and(mask, cfg->domain, cpu_online_map); | 180 | cpus_and(mask, cfg->domain, cpu_online_map); |
181 | for_each_cpu_mask(cpu, mask) | 181 | for_each_cpu_mask(cpu, mask) |
182 | per_cpu(vector_irq, cpu)[vector] = IA64_SPURIOUS_INT_VECTOR; | 182 | per_cpu(vector_irq, cpu)[vector] = -1; |
183 | cfg->vector = IRQ_VECTOR_UNASSIGNED; | 183 | cfg->vector = IRQ_VECTOR_UNASSIGNED; |
184 | cfg->domain = CPU_MASK_NONE; | 184 | cfg->domain = CPU_MASK_NONE; |
185 | irq_status[irq] = IRQ_UNUSED; | 185 | irq_status[irq] = IRQ_UNUSED; |
@@ -249,7 +249,7 @@ void __setup_vector_irq(int cpu) | |||
249 | 249 | ||
250 | /* Clear vector_irq */ | 250 | /* Clear vector_irq */ |
251 | for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) | 251 | for (vector = 0; vector < IA64_NUM_VECTORS; ++vector) |
252 | per_cpu(vector_irq, cpu)[vector] = IA64_SPURIOUS_INT_VECTOR; | 252 | per_cpu(vector_irq, cpu)[vector] = -1; |
253 | /* Mark the inuse vectors */ | 253 | /* Mark the inuse vectors */ |
254 | for (irq = 0; irq < NR_IRQS; ++irq) { | 254 | for (irq = 0; irq < NR_IRQS; ++irq) { |
255 | if (!cpu_isset(cpu, irq_cfg[irq].domain)) | 255 | if (!cpu_isset(cpu, irq_cfg[irq].domain)) |
@@ -432,10 +432,18 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs) | |||
432 | } else if (unlikely(IS_RESCHEDULE(vector))) | 432 | } else if (unlikely(IS_RESCHEDULE(vector))) |
433 | kstat_this_cpu.irqs[vector]++; | 433 | kstat_this_cpu.irqs[vector]++; |
434 | else { | 434 | else { |
435 | int irq = local_vector_to_irq(vector); | ||
436 | |||
435 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 437 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
436 | ia64_srlz_d(); | 438 | ia64_srlz_d(); |
437 | 439 | ||
438 | generic_handle_irq(local_vector_to_irq(vector)); | 440 | if (unlikely(irq < 0)) { |
441 | printk(KERN_ERR "%s: Unexpected interrupt " | ||
442 | "vector %d on CPU %d is not mapped " | ||
443 | "to any IRQ!\n", __FUNCTION__, vector, | ||
444 | smp_processor_id()); | ||
445 | } else | ||
446 | generic_handle_irq(irq); | ||
439 | 447 | ||
440 | /* | 448 | /* |
441 | * Disable interrupts and send EOI: | 449 | * Disable interrupts and send EOI: |
@@ -483,6 +491,7 @@ void ia64_process_pending_intr(void) | |||
483 | kstat_this_cpu.irqs[vector]++; | 491 | kstat_this_cpu.irqs[vector]++; |
484 | else { | 492 | else { |
485 | struct pt_regs *old_regs = set_irq_regs(NULL); | 493 | struct pt_regs *old_regs = set_irq_regs(NULL); |
494 | int irq = local_vector_to_irq(vector); | ||
486 | 495 | ||
487 | ia64_setreg(_IA64_REG_CR_TPR, vector); | 496 | ia64_setreg(_IA64_REG_CR_TPR, vector); |
488 | ia64_srlz_d(); | 497 | ia64_srlz_d(); |
@@ -493,8 +502,15 @@ void ia64_process_pending_intr(void) | |||
493 | * it will work. I hope it works!. | 502 | * it will work. I hope it works!. |
494 | * Probably could shared code. | 503 | * Probably could shared code. |
495 | */ | 504 | */ |
496 | vectors_in_migration[local_vector_to_irq(vector)]=0; | 505 | if (unlikely(irq < 0)) { |
497 | generic_handle_irq(local_vector_to_irq(vector)); | 506 | printk(KERN_ERR "%s: Unexpected interrupt " |
507 | "vector %d on CPU %d not being mapped " | ||
508 | "to any IRQ!!\n", __FUNCTION__, vector, | ||
509 | smp_processor_id()); | ||
510 | } else { | ||
511 | vectors_in_migration[irq]=0; | ||
512 | generic_handle_irq(irq); | ||
513 | } | ||
498 | set_irq_regs(old_regs); | 514 | set_irq_regs(old_regs); |
499 | 515 | ||
500 | /* | 516 | /* |