MSI: Remove dev->first_msi_irq

Now that we keep a list of msi descriptors, we don't need first_msi_irq
in the pci dev.

If we somehow have zero MSIs configured list_entry() will give us weird
oopes or nice memory corruption bugs. So be paranoid. Add BUG_ONs and also
a check in pci_msi_check_device() to make sure nvec > 0.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 434c718..7a44ba4 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -269,7 +269,8 @@
 		msi_set_mask_bit(entry->irq, entry->msi_attrib.masked);
 	}
 
-	entry = get_irq_msi(dev->first_msi_irq);
+	BUG_ON(list_empty(&dev->msi_list));
+	entry = list_entry(dev->msi_list.next, struct msi_desc, list);
 	pos = entry->msi_attrib.pos;
 	pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control);
 	control &= ~PCI_MSIX_FLAGS_MASKALL;
@@ -341,7 +342,6 @@
 	}
 	entry->irq = irq;
 	list_add(&entry->list, &dev->msi_list);
-	dev->first_msi_irq = irq;
 	set_irq_msi(irq, entry);
 
 	/* Set MSI enabled bits	 */
@@ -433,7 +433,6 @@
 			avail = -EBUSY;
 		return avail;
 	}
-	dev->first_msi_irq = entries[0].vector;
 	/* Set MSI-X enabled bits */
 	pci_intx(dev, 0);		/* disable intx */
 	msix_set_enable(dev, 1);
@@ -461,6 +460,14 @@
 	if (!pci_msi_enable || !dev || dev->no_msi)
 		return -EINVAL;
 
+	/*
+	 * You can't ask to have 0 or less MSIs configured.
+	 *  a) it's stupid ..
+	 *  b) the list manipulation code assumes nvec >= 1.
+	 */
+	if (nvec < 1)
+		return -ERANGE;
+
 	/* Any bridge which does NOT route MSI transactions from it's
 	 * secondary bus to it's primary bus must set NO_MSI flag on
 	 * the secondary pci_bus.
@@ -525,18 +532,17 @@
 	pci_intx(dev, 1);		/* enable intx */
 	dev->msi_enabled = 0;
 
-	entry = get_irq_msi(dev->first_msi_irq);
-	if (!entry || !entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI) {
+	BUG_ON(list_empty(&dev->msi_list));
+	entry = list_entry(dev->msi_list.next, struct msi_desc, list);
+	if (!entry->dev || entry->msi_attrib.type != PCI_CAP_ID_MSI) {
 		return;
 	}
 
 	default_irq = entry->msi_attrib.default_irq;
-	msi_free_irq(dev, dev->first_msi_irq);
+	msi_free_irq(dev, entry->irq);
 
 	/* Restore dev->irq to its default pin-assertion irq */
 	dev->irq = default_irq;
-
-	dev->first_msi_irq = 0;
 }
 EXPORT_SYMBOL(pci_disable_msi);
 
@@ -634,7 +640,6 @@
 
 	list_for_each_entry(entry, &dev->msi_list, list)
 		msi_free_irq(dev, entry->irq);
-	dev->first_msi_irq = 0;
 }
 
 void pci_disable_msix(struct pci_dev* dev)
@@ -664,8 +669,12 @@
 	if (!pci_msi_enable || !dev)
  		return;
 
-	if (dev->msi_enabled)
-		msi_free_irq(dev, dev->first_msi_irq);
+	if (dev->msi_enabled) {
+		struct msi_desc *entry;
+		BUG_ON(list_empty(&dev->msi_list));
+		entry = list_entry(dev->msi_list.next, struct msi_desc, list);
+		msi_free_irq(dev, entry->irq);
+	}
 
 	if (dev->msix_enabled)
 		msix_free_all_irqs(dev);