diff options
Diffstat (limited to 'drivers/pci/hotplug/acpiphp_glue.c')
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 30 | 
1 files changed, 12 insertions, 18 deletions
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index fce1c54a0c8..9ddf69e3bbe 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c @@ -132,6 +132,18 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)  	if (!acpi_pci_check_ejectable(pbus, handle) && !is_dock_device(handle))  		return AE_OK; +	pdev = pbus->self; +	if (pdev && pci_is_pcie(pdev)) { +		tmp = acpi_find_root_bridge_handle(pdev); +		if (tmp) { +			struct acpi_pci_root *root = acpi_pci_find_root(tmp); + +			if (root && (root->osc_control_set & +					OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) +				return AE_OK; +		} +	} +  	acpi_evaluate_integer(handle, "_ADR", NULL, &adr);  	device = (adr >> 16) & 0xffff;  	function = adr & 0xffff; @@ -213,7 +225,6 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)  	pdev = pci_get_slot(pbus, PCI_DEVFN(device, function));  	if (pdev) { -		pdev->current_state = PCI_D0;  		slot->flags |= (SLOT_ENABLED | SLOT_POWEREDON);  		pci_dev_put(pdev);  	} @@ -459,17 +470,8 @@ static int add_bridge(acpi_handle handle)  {  	acpi_status status;  	unsigned long long tmp; -	struct acpi_pci_root *root;  	acpi_handle dummy_handle; -	/* -	 * We shouldn't use this bridge if PCIe native hotplug control has been -	 * granted by the BIOS for it. -	 */ -	root = acpi_pci_find_root(handle); -	if (root && (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL)) -		return -ENODEV; -  	/* if the bridge doesn't have _STA, we assume it is always there */  	status = acpi_get_handle(handle, "_STA", &dummy_handle);  	if (ACPI_SUCCESS(status)) { @@ -1385,19 +1387,11 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,  static acpi_status  find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)  { -	struct acpi_pci_root *root;  	int *count = (int *)context;  	if (!acpi_is_root_bridge(handle))  		return AE_OK; -	root = acpi_pci_find_root(handle); -	if (!root) -		return AE_OK; - -	if (root->osc_control_set & OSC_PCI_EXPRESS_NATIVE_HP_CONTROL) -		return AE_OK; -  	(*count)++;  	acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,  				    handle_hotplug_event_bridge, NULL);  |