PCI: portdrv: enable device before irq initialization
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Wed, 25 Nov 2009 12:04:30 +0000 (21:04 +0900)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 4 Dec 2009 23:55:59 +0000 (15:55 -0800)
Call pci_enable_device() before initializing service irqs, because
legacy interrupt is initialized in pci_enable_device() on some
architectures.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/pcie/portdrv_core.c

index d208dc2d62fdb4381c12b7f9264fd7e1ca26a09e..a2ac618a95beac820fbcd5af2339e5ba9a373151 100644 (file)
@@ -302,6 +302,12 @@ int pcie_port_device_register(struct pci_dev *dev)
        port_data->port_type = dev->pcie_type;
        pci_set_drvdata(dev, port_data);
 
+       /* Enable PCI Express port device */
+       status = pci_enable_device(dev);
+       if (status)
+               goto error_kfree;
+       pci_set_master(dev);
+
        /*
         * Initialize service irqs. Don't use service devices that
         * require interrupts if there is no way to generate them.
@@ -310,14 +316,9 @@ int pcie_port_device_register(struct pci_dev *dev)
        if (status) {
                capabilities &= PCIE_PORT_SERVICE_VC;
                if (!capabilities)
-                       goto Error;
+                       goto error_disable;
        }
 
-       status = pci_enable_device(dev);
-       if (status)
-               goto Error;
-       pci_set_master(dev);
-
        /* Allocate child services if any */
        for (i = 0, nr_serv = 0; i < PCIE_PORT_DEVICE_MAXSERVICES; i++) {
                int service = 1 << i;
@@ -330,14 +331,14 @@ int pcie_port_device_register(struct pci_dev *dev)
                        nr_serv++;
        }
        if (!nr_serv) {
-               pci_disable_device(dev);
                status = -ENODEV;
-               goto Error;
+               goto error_disable;
        }
-
        return 0;
 
- Error:
+error_disable:
+       pci_disable_device(dev);
+error_kfree:
        kfree(port_data);
        return status;
 }