PCI/ACPI: Add _PRT interrupt routing info before enumerating devices
authorBjorn Helgaas <bhelgaas@google.com>
Tue, 30 Oct 2012 06:24:50 +0000 (15:24 +0900)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 5 Nov 2012 23:10:16 +0000 (16:10 -0700)
We used to add the _PRT after enumerating devices behind a new host
bridge.  This moves the _PRT addition *before* the enumeration, since
it no longer depends on the struct pci_bus existing.  This is one
step towards consolidating the .add/.start methods.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Taku Izumi <izumim.taku@jp.fujitsu.com>
drivers/acpi/pci_root.c

index db31edaab9ce9f6befdb8bca238ff1859ef830ab..66f3ae74d13001c1fca65d7083e2bc83bc3b8b3d 100644 (file)
@@ -501,6 +501,20 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
        strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
        device->driver_data = root;
 
+       printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
+              acpi_device_name(device), acpi_device_bid(device),
+              root->segment, &root->secondary);
+
+       /*
+        * PCI Routing Table
+        * -----------------
+        * Evaluate and parse _PRT, if exists.
+        */
+       status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
+       if (ACPI_SUCCESS(status))
+               result = acpi_pci_irq_add_prt(device->handle, root->segment,
+                                             root->secondary.start);
+
        root->mcfg_addr = acpi_pci_root_get_mcfg_addr(device->handle);
 
        /*
@@ -518,10 +532,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
        list_add_tail(&root->node, &acpi_pci_roots);
        mutex_unlock(&acpi_pci_root_lock);
 
-       printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
-              acpi_device_name(device), acpi_device_bid(device),
-              root->segment, &root->secondary);
-
        /*
         * Scan the Root Bridge
         * --------------------
@@ -547,16 +557,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
        if (result)
                goto out_del_root;
 
-       /*
-        * PCI Routing Table
-        * -----------------
-        * Evaluate and parse _PRT, if exists.
-        */
-       status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
-       if (ACPI_SUCCESS(status))
-               result = acpi_pci_irq_add_prt(device->handle, root->segment,
-                                             root->secondary.start);
-
        /*
         * Scan and bind all _ADR-Based Devices
         */
@@ -635,6 +635,8 @@ out_del_root:
        mutex_lock(&acpi_pci_root_lock);
        list_del(&root->node);
        mutex_unlock(&acpi_pci_root_lock);
+
+       acpi_pci_irq_del_prt(root->segment, root->secondary.start);
 end:
        kfree(root);
        return result;