Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=c9953a73e92df11edd812d863ff741877ea9e58c
Commit:     c9953a73e92df11edd812d863ff741877ea9e58c
Parent:     17bbc12acdb23ffb9613e12ca974fafd31bfcb56
Author:     Michael Ellerman <[EMAIL PROTECTED]>
AuthorDate: Thu Apr 5 17:19:08 2007 +1000
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Wed May 2 19:02:37 2007 -0700

    MSI: Add an arch_msi_check_device()
    
    Add an arch_check_device(), which gives archs a chance to check the input
    to pci_enable_msi/x. The arch might be interested in the value of nvec so
    pass it in. Propagate the error value returned from the arch routine out
    to the caller.
    
    Signed-off-by: Michael Ellerman <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/pci/msi.c   |   29 +++++++++++++++++++++++++----
 include/linux/msi.h |    1 +
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 34087af..5902c00 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -459,15 +459,17 @@ static int msix_capability_init(struct pci_dev *dev,
 /**
  * pci_msi_check_device - check whether MSI may be enabled on a device
  * @dev: pointer to the pci_dev data structure of MSI device function
+ * @nvec: how many MSIs have been requested ?
  * @type: are we checking for MSI or MSI-X ?
  *
  * Look at global flags, the device itself, and its parent busses
  * to determine if MSI/-X are supported for the device. If MSI/-X is
  * supported return 0, else return an error code.
  **/
-static int pci_msi_check_device(struct pci_dev * dev, int type)
+static int pci_msi_check_device(struct pci_dev* dev, int nvec, int type)
 {
        struct pci_bus *bus;
+       int ret;
 
        /* MSI must be globally enabled and supported by the device */
        if (!pci_msi_enable || !dev || dev->no_msi)
@@ -483,6 +485,10 @@ static int pci_msi_check_device(struct pci_dev * dev, int 
type)
                if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
                        return -EINVAL;
 
+       ret = arch_msi_check_device(dev, nvec, type);
+       if (ret)
+               return ret;
+
        if (!pci_find_capability(dev, type))
                return -EINVAL;
 
@@ -503,8 +509,9 @@ int pci_enable_msi(struct pci_dev* dev)
 {
        int status;
 
-       if (pci_msi_check_device(dev, PCI_CAP_ID_MSI))
-               return -EINVAL;
+       status = pci_msi_check_device(dev, 1, PCI_CAP_ID_MSI);
+       if (status)
+               return status;
 
        WARN_ON(!!dev->msi_enabled);
 
@@ -601,9 +608,13 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry 
*entries, int nvec)
        int i, j;
        u16 control;
 
-       if (!entries || pci_msi_check_device(dev, PCI_CAP_ID_MSIX))
+       if (!entries)
                return -EINVAL;
 
+       status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSIX);
+       if (status)
+               return status;
+
        pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
        pci_read_config_word(dev, msi_control_reg(pos), &control);
        nr_entries = multi_msix_capable(control);
@@ -687,3 +698,13 @@ void pci_no_msi(void)
 {
        pci_msi_enable = 0;
 }
+
+
+/* Arch hooks */
+
+int __attribute__ ((weak))
+arch_msi_check_device(struct pci_dev* dev, int nvec, int type)
+{
+       return 0;
+}
+
diff --git a/include/linux/msi.h b/include/linux/msi.h
index e38fe68..d2a2000 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -41,6 +41,7 @@ struct msi_desc {
  */
 int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc);
 void arch_teardown_msi_irq(unsigned int irq);
+extern int arch_msi_check_device(struct pci_dev* dev, int nvec, int type);
 
 
 #endif /* LINUX_MSI_H */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to