Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4761ba2 authored by Bjorn Helgaas's avatar Bjorn Helgaas
Browse files

PCI/ACPI: Add _PRT interrupt routing info before enumerating devices



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: default avatarBjorn Helgaas <bhelgaas@google.com>
Signed-off-by: default avatarTaku Izumi <izumim.taku@jp.fujitsu.com>
parent 79c44122
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -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 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
	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;