diff options
author | Bob Moore <robert.moore@intel.com> | 2009-07-23 23:03:09 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2009-08-28 19:40:38 -0400 |
commit | e5f69d6ef7a6b0dbad8d4c00d83009960be02155 (patch) | |
tree | fac155941c084b22c566b4931c67ab098a1488ee /drivers/acpi/acpica/nspredef.c | |
parent | b2deadd53c3630786e73746fb0ad8450f4e015bf (diff) |
ACPICA: Add repair for predefined methods that return nested packages
Fixes a problem where a predefined method is defined to return
a variable-length Package of sub-packages. If the length is one,
the BIOS code occasionally creates a simple single package with
no sub-packages. This code attempts to fix the problem by wrapping
a new package object around the existing package. ACPICA BZ 790.
http://acpica.org/bugzilla/show_bug.cgi?id=790
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/nspredef.c')
-rw-r--r-- | drivers/acpi/acpica/nspredef.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/acpi/acpica/nspredef.c b/drivers/acpi/acpica/nspredef.c index e3f08dcb5275..0091504df074 100644 --- a/drivers/acpi/acpica/nspredef.c +++ b/drivers/acpi/acpica/nspredef.c | |||
@@ -566,9 +566,35 @@ acpi_ns_check_package(struct acpi_predefined_data *data, | |||
566 | case ACPI_PTYPE2_COUNT: | 566 | case ACPI_PTYPE2_COUNT: |
567 | 567 | ||
568 | /* | 568 | /* |
569 | * These types all return a single package that consists of a | 569 | * These types all return a single Package that consists of a |
570 | * variable number of sub-packages. | 570 | * variable number of sub-Packages. |
571 | * | ||
572 | * First, ensure that the first element is a sub-Package. If not, | ||
573 | * the BIOS may have incorrectly returned the object as a single | ||
574 | * package instead of a Package of Packages (a common error if | ||
575 | * there is only one entry). We may be able to repair this by | ||
576 | * wrapping the returned Package with a new outer Package. | ||
571 | */ | 577 | */ |
578 | if ((*elements)->common.type != ACPI_TYPE_PACKAGE) { | ||
579 | |||
580 | /* Create the new outer package and populate it */ | ||
581 | |||
582 | status = | ||
583 | acpi_ns_repair_package_list(data, | ||
584 | return_object_ptr); | ||
585 | if (ACPI_FAILURE(status)) { | ||
586 | return (status); | ||
587 | } | ||
588 | |||
589 | /* Update locals to point to the new package (of 1 element) */ | ||
590 | |||
591 | return_object = *return_object_ptr; | ||
592 | elements = return_object->package.elements; | ||
593 | count = 1; | ||
594 | } | ||
595 | |||
596 | /* Validate each sub-Package in the parent Package */ | ||
597 | |||
572 | for (i = 0; i < count; i++) { | 598 | for (i = 0; i < count; i++) { |
573 | sub_package = *elements; | 599 | sub_package = *elements; |
574 | sub_elements = sub_package->package.elements; | 600 | sub_elements = sub_package->package.elements; |