workqueue: fix flush_workqueue() vs CPU_DEAD race
[powerpc.git] / kernel / irq / chip.c
index 76a9106..615ce97 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <linux/irq.h>
+#include <linux/msi.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/kernel_stat.h>
@@ -168,7 +169,7 @@ EXPORT_SYMBOL(set_irq_data);
 /**
  *     set_irq_data - set irq type data for an irq
  *     @irq:   Interrupt number
- *     @data:  Pointer to interrupt specific data
+ *     @entry: Pointer to MSI descriptor data
  *
  *     Set the hardware irq controller data for an irq
  */
@@ -185,6 +186,8 @@ int set_irq_msi(unsigned int irq, struct msi_desc *entry)
        desc = irq_desc + irq;
        spin_lock_irqsave(&desc->lock, flags);
        desc->msi_desc = entry;
+       if (entry)
+               entry->irq = irq;
        spin_unlock_irqrestore(&desc->lock, flags);
        return 0;
 }
@@ -565,10 +568,8 @@ __set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
 
        /* Uninstall? */
        if (handle == handle_bad_irq) {
-               if (desc->chip != &no_irq_chip) {
-                       desc->chip->mask(irq);
-                       desc->chip->ack(irq);
-               }
+               if (desc->chip != &no_irq_chip)
+                       mask_ack_irq(desc, irq);
                desc->status |= IRQ_DISABLED;
                desc->depth = 1;
        }