smsc911x: Fix Console Hang when bringing the interface down.
[safe/jmp/linux-2.6] / drivers / parisc / iosapic.c
index 1cdfdea..88e3335 100644 (file)
@@ -702,17 +702,20 @@ static unsigned int iosapic_startup_irq(unsigned int irq)
 }
 
 #ifdef CONFIG_SMP
-static void iosapic_set_affinity_irq(unsigned int irq,
+static int iosapic_set_affinity_irq(unsigned int irq,
                                     const struct cpumask *dest)
 {
        struct vector_info *vi = iosapic_get_vector(irq);
        u32 d0, d1, dummy_d0;
        unsigned long flags;
+       int dest_cpu;
 
-       if (cpu_check_affinity(irq, dest))
-               return;
+       dest_cpu = cpu_check_affinity(irq, dest);
+       if (dest_cpu < 0)
+               return -1;
 
-       vi->txn_addr = txn_affinity_addr(irq, cpumask_first(dest));
+       cpumask_copy(irq_desc[irq].affinity, cpumask_of(dest_cpu));
+       vi->txn_addr = txn_affinity_addr(irq, dest_cpu);
 
        spin_lock_irqsave(&iosapic_lock, flags);
        /* d1 contains the destination CPU, so only want to set that
@@ -721,10 +724,12 @@ static void iosapic_set_affinity_irq(unsigned int irq,
        iosapic_set_irt_data(vi, &dummy_d0, &d1);
        iosapic_wr_irt_entry(vi, d0, d1);
        spin_unlock_irqrestore(&iosapic_lock, flags);
+
+       return 0;
 }
 #endif
 
-static struct hw_interrupt_type iosapic_interrupt_type = {
+static struct irq_chip iosapic_interrupt_type = {
        .typename =     "IO-SAPIC-level",
        .startup =      iosapic_startup_irq,
        .shutdown =     iosapic_disable_irq,