[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 4/9] Have pci_frontend_enable_[msi|msix] save PIRQ values in a int array.



Previously the PIRQ values obtained from do_pci_op would be saved in the
dev->irq (for MSI) or entries[i]->vector (for MSI-X). Unify it to save
those values in an array passed in as an argument.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 arch/x86/include/asm/xen/pci.h |    8 ++++----
 drivers/pci/xen-pcifront.c     |   26 +++++++++++++++-----------
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/xen/pci.h b/arch/x86/include/asm/xen/pci.h
index 4774ae0..8adb33a 100644
--- a/arch/x86/include/asm/xen/pci.h
+++ b/arch/x86/include/asm/xen/pci.h
@@ -35,19 +35,19 @@ static inline int xen_setup_msi_irqs(struct pci_dev *dev, 
int nvec, int type)
 #endif
 #if defined(CONFIG_PCI_MSI) && defined(CONFIG_XEN_PCIDEV_FRONTEND)
 /* Defined in drivers/pci/xen-pcifront.c */
-int pci_frontend_enable_msi(struct pci_dev *dev, int *pirq);
+int pci_frontend_enable_msi(struct pci_dev *dev, int **vectors);
 void pci_frontend_disable_msi(struct pci_dev *dev);
 int pci_frontend_enable_msix(struct pci_dev *dev,
-                            struct msix_entry *entries, int nvec);
+                            int **vectors, int nvec);
 void pci_frontend_disable_msix(struct pci_dev *dev);
 #else
-static inline int pci_frontend_enable_msi(struct pci_dev *dev, int *pirq)
+static inline int pci_frontend_enable_msi(struct pci_dev *dev, int **vectors)
 {
        return -1;
 }
 static inline void pci_frontend_disable_msi(struct pci_dev *dev) { }
 static inline int pci_frontend_enable_msix(struct pci_dev *dev,
-                                          struct msix_entry *entries, int nvec)
+                                          int **vectors, int nvec)
 {
        return -1;
 }
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c
index adef0c3..1120034 100644
--- a/drivers/pci/xen-pcifront.c
+++ b/drivers/pci/xen-pcifront.c
@@ -12,6 +12,8 @@
 #include <xen/page.h>
 #include <linux/spinlock.h>
 #include <linux/pci.h>
+#include <asm/xen/pci.h>
+#include <linux/msi.h>
 #include <xen/xenbus.h>
 #include <xen/interface/io/pciif.h>
 #include <linux/interrupt.h>
@@ -255,8 +257,7 @@ struct pci_ops pcifront_bus_ops = {
 
 #ifdef CONFIG_PCI_MSI
 int pci_frontend_enable_msix(struct pci_dev *dev,
-               struct msix_entry *entries,
-               int nvec)
+               int **vector, int nvec)
 {
        int err;
        int i;
@@ -269,24 +270,28 @@ int pci_frontend_enable_msix(struct pci_dev *dev,
        };
        struct pcifront_sd *sd = dev->bus->sysdata;
        struct pcifront_device *pdev = pcifront_get_pdev(sd);
+       struct msi_desc *entry;
 
        if (nvec > SH_INFO_MAX_VEC) {
                printk(KERN_ERR "too much vector for pci frontend%x\n", nvec);
                return -EINVAL;
        }
 
-       for (i = 0; i < nvec; i++) {
-               op.msix_entries[i].entry = entries[i].entry;
-               op.msix_entries[i].vector = entries[i].vector;
+       i = 0;
+       list_for_each_entry(entry, &dev->msi_list, list) {
+               op.msix_entries[i].entry = entry->msi_attrib.entry_nr;
+               /* Vector is useless at this point. */
+               op.msix_entries[i].vector = -1;
+               i++;
        }
 
        err = do_pci_op(pdev, &op);
 
-       if (!err) {
-               if (!op.value) {
+       if (likely(!err)) {
+               if (likely(!op.value)) {
                        /* we get the result */
                        for (i = 0; i < nvec; i++)
-                               entries[i].vector = op.msix_entries[i].vector;
+                               *vector[i] = op.msix_entries[i].vector;
                        return 0;
                } else {
                        printk(KERN_DEBUG "enable msix get value %x\n",
@@ -320,7 +325,7 @@ void pci_frontend_disable_msix(struct pci_dev *dev)
 }
 EXPORT_SYMBOL_GPL(pci_frontend_disable_msix);
 
-int pci_frontend_enable_msi(struct pci_dev *dev, int *pirq)
+int pci_frontend_enable_msi(struct pci_dev *dev, int **vector)
 {
        int err;
        struct xen_pci_op op = {
@@ -332,10 +337,9 @@ int pci_frontend_enable_msi(struct pci_dev *dev, int *pirq)
        struct pcifront_sd *sd = dev->bus->sysdata;
        struct pcifront_device *pdev = pcifront_get_pdev(sd);
 
-       *pirq = -1;
        err = do_pci_op(pdev, &op);
        if (likely(!err)) {
-               *pirq = op.value;
+               *vector[0] = op.value;
        } else {
                printk(KERN_ERR "pci frontend enable msi failed for dev %x:%x 
\n",
                                op.bus, op.devfn);
-- 
1.6.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.