Because some Non-PCI devices don't need to create sysfs object,
so move populate_msi_sysfs() out of generic MSI function
msi/x_capability_init().

Signed-off-by: Yijing Wang <wangyij...@huawei.com>
---
 drivers/pci/msi.c |   31 ++++++++++++++++++-------------
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 116383c..21b16e0 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -646,13 +646,6 @@ static int msi_capability_init(struct pci_dev *dev, int 
nvec)
                return ret;
        }
 
-       ret = populate_msi_sysfs(dev);
-       if (ret) {
-               msi_mask_irq(entry, mask, ~mask);
-               free_msi_irqs(dev);
-               return ret;
-       }
-
        /* Set MSI enabled bits  */
        pci_intx_for_msi(dev, 0);
        msi_set_enable(dev, 1);
@@ -760,10 +753,6 @@ static int msix_capability_init(struct pci_dev *dev, void 
__iomem *base,
 
        msix_program_entries(dev, entries);
 
-       ret = populate_msi_sysfs(dev);
-       if (ret)
-               goto out_free;
-
        /* Set MSI-X enabled bits and unmask the function */
        pci_intx_for_msi(dev, 0);
        dev->msix_enabled = 1;
@@ -789,7 +778,6 @@ out_avail:
                        ret = avail;
        }
 
-out_free:
        free_msi_irqs(dev);
 
        return ret;
@@ -939,7 +927,7 @@ EXPORT_SYMBOL(pci_msix_vec_count);
 int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
 {
        int status, nr_entries;
-       int i, j;
+       int i, j, ret;
        void __iomem *base;
        u16 control;
 
@@ -980,6 +968,14 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry 
*entries, int nvec)
                return -ENOMEM;
 
        status = msix_capability_init(dev, base, entries, nvec);
+       if (!status) {
+               ret = populate_msi_sysfs(dev);
+               if (ret) {
+                       dev->msix_enabled = 0;
+                       pci_intx_for_msi(dev, 1);
+                       free_msi_irqs(dev);
+               }
+       }
        return status;
 }
 EXPORT_SYMBOL(pci_enable_msix);
@@ -1109,6 +1105,15 @@ int pci_enable_msi_range(struct pci_dev *dev, int 
minvec, int maxvec)
                }
        } while (rc);
 
+       rc = populate_msi_sysfs(dev);
+       if (rc) {
+               msi_set_enable(dev, 0);
+               pci_intx_for_msi(dev, 1);
+               dev->msi_enabled = 0;
+               free_msi_irqs(dev);
+               return rc;
+       }
+
        return nvec;
 }
 EXPORT_SYMBOL(pci_enable_msi_range);
-- 
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to