if (irq < 0)
                return irq;
 
-       set_irq_msi(irq, desc);
        ret = msi_compose_msg(dev, irq, &msg);
        if (ret < 0) {
                destroy_irq(irq);
                return ret;
        }
 
+       set_irq_msi(irq, desc);
        write_msi_msg(irq, &msg);
 
        set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq,
                                      "edge");
 
-       return irq;
+       return 0;
 }
 
 void arch_teardown_msi_irq(unsigned int irq)
 
        if (irq < 0)
                return irq;
 
-       set_irq_msi(irq, entry);
        /*
         * Set up the vector plumbing.  Let the prom (via sn_intr_alloc)
         * decide which cpu to direct this msi at by default.
         */
        msg.data = 0x100 + irq;
 
+       set_irq_msi(irq, entry);
        write_msi_msg(irq, &msg);
        set_irq_chip_and_handler(irq, &sn_msi_chip, handle_edge_irq);
 
-       return irq;
+       return 0;
 }
 
 #ifdef CONFIG_SMP
 
                return -EINVAL;
 
        err = p->setup_msi_irq(&virt_irq, pdev, desc);
-       if (err < 0)
+       if (err)
                return err;
 
-       return virt_irq;
+       return 0;
 }
 
 void arch_teardown_msi_irq(unsigned int virt_irq)
 
        if (!devino)
                goto out_err;
 
-       set_irq_msi(*virt_irq_p, entry);
-
        msiqid = ((devino - pbm->msiq_first_devino) +
                  pbm->msiq_first);
 
                msg.address_lo = pbm->msi32_start;
        }
        msg.data = msi_num;
+
+       set_irq_msi(*virt_irq_p, entry);
        write_msi_msg(*virt_irq_p, &msg);
 
        irq_install_pre_handler(*virt_irq_p,
 
        if (irq < 0)
                return irq;
 
-       set_irq_msi(irq, desc);
        ret = msi_compose_msg(dev, irq, &msg);
        if (ret < 0) {
                destroy_irq(irq);
                return ret;
        }
 
+       set_irq_msi(irq, desc);
        write_msi_msg(irq, &msg);
 
        set_irq_chip_and_handler_name(irq, &msi_chip, handle_edge_irq, "edge");
 
-       return irq;
+       return 0;
 }
 
 void arch_teardown_msi_irq(unsigned int irq)
 
 static int msi_capability_init(struct pci_dev *dev)
 {
        struct msi_desc *entry;
-       int pos, irq;
+       int pos, ret;
        u16 control;
 
        msi_set_enable(dev, 0); /* Ensure msi is disabled as I set it up */
                        maskbits);
        }
        /* Configure MSI capability structure */
-       irq = arch_setup_msi_irq(dev, entry);
-       if (irq < 0) {
+       ret = arch_setup_msi_irq(dev, entry);
+       if (ret) {
                kfree(entry);
-               return irq;
+               return ret;
        }
-       entry->irq = irq;
        list_add(&entry->list, &dev->msi_list);
-       set_irq_msi(irq, entry);
 
        /* Set MSI enabled bits  */
        pci_intx(dev, 0);               /* disable intx */
        msi_set_enable(dev, 1);
        dev->msi_enabled = 1;
 
-       dev->irq = irq;
+       dev->irq = entry->irq;
        return 0;
 }
 
                                struct msix_entry *entries, int nvec)
 {
        struct msi_desc *entry;
-       int irq, pos, i, j, nr_entries;
+       int irq, pos, i, j, nr_entries, ret;
        unsigned long phys_addr;
        u32 table_offset;
        u16 control;
                entry->mask_base = base;
 
                /* Configure MSI-X capability structure */
-               irq = arch_setup_msi_irq(dev, entry);
-               if (irq < 0) {
+               ret = arch_setup_msi_irq(dev, entry);
+               if (ret) {
                        kfree(entry);
                        break;
                }
-               entry->irq = irq;
-               entries[i].vector = irq;
+               entries[i].vector = entry->irq;
                list_add(&entry->list, &dev->msi_list);
-
-               set_irq_msi(irq, entry);
        }
        if (i != nvec) {
                int avail = i - 1;
 
  */
 
 #include <linux/irq.h>
+#include <linux/msi.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/kernel_stat.h>
        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;
 }