diff options
Diffstat (limited to 'drivers/acpi/acpi_processor.c')
| -rw-r--r-- | drivers/acpi/acpi_processor.c | 26 | 
1 files changed, 15 insertions, 11 deletions
| diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 3c1d6b0c09a4..c29c2c3ec0ad 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -212,7 +212,7 @@ static int acpi_processor_get_info(struct acpi_device *device)  	union acpi_object object = { 0 };  	struct acpi_buffer buffer = { sizeof(union acpi_object), &object };  	struct acpi_processor *pr = acpi_driver_data(device); -	int cpu_index, device_declaration = 0; +	int apic_id, cpu_index, device_declaration = 0;  	acpi_status status = AE_OK;  	static int cpu0_initialized;  	unsigned long long value; @@ -258,18 +258,21 @@ static int acpi_processor_get_info(struct acpi_device *device)  		device_declaration = 1;  		pr->acpi_id = value;  	} -	pr->apic_id = acpi_get_apicid(pr->handle, device_declaration, -					pr->acpi_id); -	cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); -	/* Handle UP system running SMP kernel, with no LAPIC in MADT */ -	if (!cpu0_initialized && (cpu_index == -1) && -	    (num_online_cpus() == 1)) { -		cpu_index = 0; +	apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id); +	if (apic_id < 0) { +		acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n"); +		return -ENODEV;  	} +	pr->apic_id = apic_id; -	cpu0_initialized = 1; - +	cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); +	if (!cpu0_initialized) { +		cpu0_initialized = 1; +		/* Handle UP system running SMP kernel, with no LAPIC in MADT */ +		if ((cpu_index == -1) && (num_online_cpus() == 1)) +			cpu_index = 0; +	}  	pr->id = cpu_index;  	/* @@ -282,6 +285,7 @@ static int acpi_processor_get_info(struct acpi_device *device)  		if (ret)  			return ret;  	} +  	/*  	 * On some boxes several processors use the same processor bus id.  	 * But they are located in different scope. For example: @@ -395,7 +399,7 @@ static int acpi_processor_add(struct acpi_device *device,  		goto err;  	} -	result = acpi_bind_one(dev, pr->handle); +	result = acpi_bind_one(dev, device);  	if (result)  		goto err; | 
