diff options
Diffstat (limited to 'arch/ia64/kernel/iosapic.c')
-rw-r--r-- | arch/ia64/kernel/iosapic.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index 91e6dc1e7baf..cfe4654838f4 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
@@ -142,7 +142,7 @@ struct iosapic_rte_info { | |||
142 | static struct iosapic_intr_info { | 142 | static struct iosapic_intr_info { |
143 | struct list_head rtes; /* RTEs using this vector (empty => | 143 | struct list_head rtes; /* RTEs using this vector (empty => |
144 | * not an IOSAPIC interrupt) */ | 144 | * not an IOSAPIC interrupt) */ |
145 | int count; /* # of RTEs that shares this vector */ | 145 | int count; /* # of registered RTEs */ |
146 | u32 low32; /* current value of low word of | 146 | u32 low32; /* current value of low word of |
147 | * Redirection table entry */ | 147 | * Redirection table entry */ |
148 | unsigned int dest; /* destination CPU physical ID */ | 148 | unsigned int dest; /* destination CPU physical ID */ |
@@ -313,7 +313,7 @@ mask_irq (unsigned int irq) | |||
313 | int rte_index; | 313 | int rte_index; |
314 | struct iosapic_rte_info *rte; | 314 | struct iosapic_rte_info *rte; |
315 | 315 | ||
316 | if (list_empty(&iosapic_intr_info[irq].rtes)) | 316 | if (!iosapic_intr_info[irq].count) |
317 | return; /* not an IOSAPIC interrupt! */ | 317 | return; /* not an IOSAPIC interrupt! */ |
318 | 318 | ||
319 | /* set only the mask bit */ | 319 | /* set only the mask bit */ |
@@ -331,7 +331,7 @@ unmask_irq (unsigned int irq) | |||
331 | int rte_index; | 331 | int rte_index; |
332 | struct iosapic_rte_info *rte; | 332 | struct iosapic_rte_info *rte; |
333 | 333 | ||
334 | if (list_empty(&iosapic_intr_info[irq].rtes)) | 334 | if (!iosapic_intr_info[irq].count) |
335 | return; /* not an IOSAPIC interrupt! */ | 335 | return; /* not an IOSAPIC interrupt! */ |
336 | 336 | ||
337 | low32 = iosapic_intr_info[irq].low32 &= ~IOSAPIC_MASK; | 337 | low32 = iosapic_intr_info[irq].low32 &= ~IOSAPIC_MASK; |
@@ -363,7 +363,7 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask) | |||
363 | 363 | ||
364 | dest = cpu_physical_id(first_cpu(mask)); | 364 | dest = cpu_physical_id(first_cpu(mask)); |
365 | 365 | ||
366 | if (list_empty(&iosapic_intr_info[irq].rtes)) | 366 | if (!iosapic_intr_info[irq].count) |
367 | return; /* not an IOSAPIC interrupt */ | 367 | return; /* not an IOSAPIC interrupt */ |
368 | 368 | ||
369 | set_irq_affinity_info(irq, dest, redir); | 369 | set_irq_affinity_info(irq, dest, redir); |
@@ -542,7 +542,7 @@ iosapic_reassign_vector (int irq) | |||
542 | { | 542 | { |
543 | int new_irq; | 543 | int new_irq; |
544 | 544 | ||
545 | if (!list_empty(&iosapic_intr_info[irq].rtes)) { | 545 | if (iosapic_intr_info[irq].count) { |
546 | new_irq = create_irq(); | 546 | new_irq = create_irq(); |
547 | if (new_irq < 0) | 547 | if (new_irq < 0) |
548 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); | 548 | panic("%s: out of interrupt vectors!\n", __FUNCTION__); |
@@ -560,7 +560,7 @@ iosapic_reassign_vector (int irq) | |||
560 | } | 560 | } |
561 | } | 561 | } |
562 | 562 | ||
563 | static struct iosapic_rte_info *iosapic_alloc_rte (void) | 563 | static struct iosapic_rte_info * __init_refok iosapic_alloc_rte (void) |
564 | { | 564 | { |
565 | int i; | 565 | int i; |
566 | struct iosapic_rte_info *rte; | 566 | struct iosapic_rte_info *rte; |
@@ -677,7 +677,7 @@ get_target_cpu (unsigned int gsi, int irq) | |||
677 | * In case of vector shared by multiple RTEs, all RTEs that | 677 | * In case of vector shared by multiple RTEs, all RTEs that |
678 | * share the vector need to use the same destination CPU. | 678 | * share the vector need to use the same destination CPU. |
679 | */ | 679 | */ |
680 | if (!list_empty(&iosapic_intr_info[irq].rtes)) | 680 | if (iosapic_intr_info[irq].count) |
681 | return iosapic_intr_info[irq].dest; | 681 | return iosapic_intr_info[irq].dest; |
682 | 682 | ||
683 | /* | 683 | /* |
@@ -794,8 +794,9 @@ iosapic_register_intr (unsigned int gsi, | |||
794 | err = register_intr(gsi, irq, IOSAPIC_LOWEST_PRIORITY, | 794 | err = register_intr(gsi, irq, IOSAPIC_LOWEST_PRIORITY, |
795 | polarity, trigger); | 795 | polarity, trigger); |
796 | if (err < 0) { | 796 | if (err < 0) { |
797 | spin_unlock(&irq_desc[irq].lock); | ||
797 | irq = err; | 798 | irq = err; |
798 | goto unlock_all; | 799 | goto unlock_iosapic_lock; |
799 | } | 800 | } |
800 | 801 | ||
801 | /* | 802 | /* |
@@ -811,7 +812,7 @@ iosapic_register_intr (unsigned int gsi, | |||
811 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), | 812 | gsi, (trigger == IOSAPIC_EDGE ? "edge" : "level"), |
812 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), | 813 | (polarity == IOSAPIC_POL_HIGH ? "high" : "low"), |
813 | cpu_logical_id(dest), dest, irq_to_vector(irq)); | 814 | cpu_logical_id(dest), dest, irq_to_vector(irq)); |
814 | unlock_all: | 815 | |
815 | spin_unlock(&irq_desc[irq].lock); | 816 | spin_unlock(&irq_desc[irq].lock); |
816 | unlock_iosapic_lock: | 817 | unlock_iosapic_lock: |
817 | spin_unlock_irqrestore(&iosapic_lock, flags); | 818 | spin_unlock_irqrestore(&iosapic_lock, flags); |