|
@@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
|
|
|
return_ACPI_STATUS(status);
|
|
|
}
|
|
|
|
|
|
- /* Set the vector */
|
|
|
+ /*
|
|
|
+ * According to the ACPI specification 2.0c and later, the 64-bit
|
|
|
+ * waking vector should be cleared and the 32-bit waking vector should
|
|
|
+ * be used, unless we want the wake-up code to be called by the BIOS in
|
|
|
+ * Protected Mode. Some systems (for example HP dv5-1004nr) are known
|
|
|
+ * to fail to resume if the 64-bit vector is used.
|
|
|
+ */
|
|
|
+ if (facs->version >= 1)
|
|
|
+ facs->xfirmware_waking_vector = 0;
|
|
|
|
|
|
- if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
|
|
|
- /*
|
|
|
- * ACPI 1.0 FACS or short table or optional X_ field is zero
|
|
|
- */
|
|
|
- facs->firmware_waking_vector = (u32) physical_address;
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * ACPI 2.0 FACS with valid X_ field
|
|
|
- */
|
|
|
- facs->xfirmware_waking_vector = physical_address;
|
|
|
- }
|
|
|
+ facs->firmware_waking_vector = (u32)physical_address;
|
|
|
|
|
|
return_ACPI_STATUS(AE_OK);
|
|
|
}
|
|
@@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
|
|
|
}
|
|
|
|
|
|
/* Get the vector */
|
|
|
-
|
|
|
- if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
|
|
|
- /*
|
|
|
- * ACPI 1.0 FACS or short table or optional X_ field is zero
|
|
|
- */
|
|
|
- *physical_address =
|
|
|
- (acpi_physical_address) facs->firmware_waking_vector;
|
|
|
- } else {
|
|
|
- /*
|
|
|
- * ACPI 2.0 FACS with valid X_ field
|
|
|
- */
|
|
|
- *physical_address =
|
|
|
- (acpi_physical_address) facs->xfirmware_waking_vector;
|
|
|
- }
|
|
|
+ *physical_address = (acpi_physical_address)facs->firmware_waking_vector;
|
|
|
|
|
|
return_ACPI_STATUS(AE_OK);
|
|
|
}
|