Ver Fonte

[ACPI] PNPACPI parse error

http://bugzilla.kernel.org/show_bug.cgi?id=3912

Written-by: matthieu castet <castet.matthieu@free.fr>
Acked-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Matthieu Castet há 20 anos atrás
pai
commit
b008b8d709
1 ficheiros alterados com 10 adições e 1 exclusões
  1. 10 1
      drivers/pnp/pnpacpi/rsparser.c

+ 10 - 1
drivers/pnp/pnpacpi/rsparser.c

@@ -444,6 +444,7 @@ pnpacpi_parse_fixed_mem32_option(struct pnp_option *option,
 
 
 struct acpipnp_parse_option_s {
 struct acpipnp_parse_option_s {
 	struct pnp_option *option;
 	struct pnp_option *option;
+	struct pnp_option *option_independent;
 	struct pnp_dev *dev;
 	struct pnp_dev *dev;
 };
 };
 
 
@@ -507,7 +508,14 @@ static acpi_status pnpacpi_option_resource(struct acpi_resource *res,
 			parse_data->option = option;	
 			parse_data->option = option;	
 			break;
 			break;
 		case ACPI_RSTYPE_END_DPF:
 		case ACPI_RSTYPE_END_DPF:
-			return AE_CTRL_TERMINATE;
+			/*only one EndDependentFn is allowed*/
+			if (!parse_data->option_independent) {
+				pnp_warn("PnPACPI: more than one EndDependentFn");
+				return AE_ERROR;
+			}
+			parse_data->option = parse_data->option_independent;
+			parse_data->option_independent = NULL;
+			break;
 		default:
 		default:
 			pnp_warn("PnPACPI: unknown resource type %d", res->id);
 			pnp_warn("PnPACPI: unknown resource type %d", res->id);
 			return AE_ERROR;
 			return AE_ERROR;
@@ -525,6 +533,7 @@ acpi_status pnpacpi_parse_resource_option_data(acpi_handle handle,
 	parse_data.option = pnp_register_independent_option(dev);
 	parse_data.option = pnp_register_independent_option(dev);
 	if (!parse_data.option)
 	if (!parse_data.option)
 		return AE_ERROR;
 		return AE_ERROR;
+	parse_data.option_independent = parse_data.option;
 	parse_data.dev = dev;
 	parse_data.dev = dev;
 	status = acpi_walk_resources(handle, METHOD_NAME__PRS, 
 	status = acpi_walk_resources(handle, METHOD_NAME__PRS, 
 		pnpacpi_option_resource, &parse_data);
 		pnpacpi_option_resource, &parse_data);