PCI/MSI: Remove pci_enable_msi_block()
authorAlexander Gordeev <agordeev@redhat.com>
Mon, 14 Apr 2014 13:28:35 +0000 (15:28 +0200)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 30 Apr 2014 22:56:47 +0000 (16:56 -0600)
There are no users of pci_enable_msi_block() function left.  Obsolete it in
favor of pci_enable_msi_range() and pci_enable_msi_exact() functions.

Previously, we called arch_setup_msi_irqs() once, requesting the same
vector count we passed to arch_msi_check_device().  Now we may call it
several times: if it returns failure, we may retry and request fewer
vectors.

We don't keep track of the vector count we initially passed to
arch_msi_check_device().  We only keep track of the number of vectors
successfully set up by arch_setup_msi_irqs(), and this is what we use to
clean things up when disabling MSI.  Therefore, we assume that
arch_msi_check_device() does nothing that will have to be cleaned up later.

[bhelgaas: changelog]
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/msi.c
include/linux/pci.h

index 04130c3..36dd0ca 100644 (file)
@@ -879,50 +879,6 @@ int pci_msi_vec_count(struct pci_dev *dev)
 }
 EXPORT_SYMBOL(pci_msi_vec_count);
 
-/**
- * pci_enable_msi_block - configure device's MSI capability structure
- * @dev: device to configure
- * @nvec: number of interrupts to configure
- *
- * Allocate IRQs for a device with the MSI capability.
- * This function returns a negative errno if an error occurs.  If it
- * is unable to allocate the number of interrupts requested, it returns
- * the number of interrupts it might be able to allocate.  If it successfully
- * allocates at least the number of interrupts requested, it returns 0 and
- * updates the @dev's irq member to the lowest new interrupt number; the
- * other interrupt numbers allocated to this device are consecutive.
- */
-int pci_enable_msi_block(struct pci_dev *dev, int nvec)
-{
-       int status, maxvec;
-
-       if (dev->current_state != PCI_D0)
-               return -EINVAL;
-
-       maxvec = pci_msi_vec_count(dev);
-       if (maxvec < 0)
-               return maxvec;
-       if (nvec > maxvec)
-               return maxvec;
-
-       status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI);
-       if (status)
-               return status;
-
-       WARN_ON(!!dev->msi_enabled);
-
-       /* Check whether driver already requested MSI-X irqs */
-       if (dev->msix_enabled) {
-               dev_info(&dev->dev, "can't enable MSI "
-                        "(MSI-X already enabled)\n");
-               return -EINVAL;
-       }
-
-       status = msi_capability_init(dev, nvec);
-       return status;
-}
-EXPORT_SYMBOL(pci_enable_msi_block);
-
 void pci_msi_shutdown(struct pci_dev *dev)
 {
        struct msi_desc *desc;
@@ -1128,14 +1084,45 @@ void pci_msi_init_pci_dev(struct pci_dev *dev)
  **/
 int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
 {
-       int nvec = maxvec;
+       int nvec;
        int rc;
 
+       if (dev->current_state != PCI_D0)
+               return -EINVAL;
+
+       WARN_ON(!!dev->msi_enabled);
+
+       /* Check whether driver already requested MSI-X irqs */
+       if (dev->msix_enabled) {
+               dev_info(&dev->dev,
+                        "can't enable MSI (MSI-X already enabled)\n");
+               return -EINVAL;
+       }
+
        if (maxvec < minvec)
                return -ERANGE;
 
+       nvec = pci_msi_vec_count(dev);
+       if (nvec < 0)
+               return nvec;
+       else if (nvec < minvec)
+               return -EINVAL;
+       else if (nvec > maxvec)
+               nvec = maxvec;
+
+       do {
+               rc = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI);
+               if (rc < 0) {
+                       return rc;
+               } else if (rc > 0) {
+                       if (rc < minvec)
+                               return -ENOSPC;
+                       nvec = rc;
+               }
+       } while (rc);
+
        do {
-               rc = pci_enable_msi_block(dev, nvec);
+               rc = msi_capability_init(dev, nvec);
                if (rc < 0) {
                        return rc;
                } else if (rc > 0) {
index aab57b4..499755e 100644 (file)
@@ -1158,7 +1158,6 @@ struct msix_entry {
 
 #ifdef CONFIG_PCI_MSI
 int pci_msi_vec_count(struct pci_dev *dev);
-int pci_enable_msi_block(struct pci_dev *dev, int nvec);
 void pci_msi_shutdown(struct pci_dev *dev);
 void pci_disable_msi(struct pci_dev *dev);
 int pci_msix_vec_count(struct pci_dev *dev);
@@ -1188,8 +1187,6 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
 }
 #else
 static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
-static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec)
-{ return -ENOSYS; }
 static inline void pci_msi_shutdown(struct pci_dev *dev) { }
 static inline void pci_disable_msi(struct pci_dev *dev) { }
 static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; }
@@ -1244,7 +1241,7 @@ static inline void pcie_set_ecrc_checking(struct pci_dev *dev) { }
 static inline void pcie_ecrc_get_policy(char *str) { }
 #endif
 
-#define pci_enable_msi(pdev)   pci_enable_msi_block(pdev, 1)
+#define pci_enable_msi(pdev)   pci_enable_msi_exact(pdev, 1)
 
 #ifdef CONFIG_HT_IRQ
 /* The functions a driver should call */