The acpi parser can set the DISABLED flag on a resource. In
setup_res() we clear all flags except MEM, so we ignore the DISABLED
flag. Add proper checks and preserve the flags.

Signed-off-by: Thomas Gleixner <t...@linutronix.de>
---
 drivers/acpi/ioapic.c |   38 +++++++++++++++++++++-----------------
 1 file changed, 21 insertions(+), 17 deletions(-)

Index: tip/drivers/acpi/ioapic.c
===================================================================
--- tip.orig/drivers/acpi/ioapic.c
+++ tip/drivers/acpi/ioapic.c
@@ -40,29 +40,33 @@ struct acpi_pci_ioapic {
 static LIST_HEAD(ioapic_list);
 static DEFINE_MUTEX(ioapic_list_lock);
 
+static inline bool is_valid_mem_resource(struct resource *res)
+{
+       return !(res->flags & IORESOURCE_DISABLED) &&
+               (res->flags & IORESOURCE_MEM);
+}
+
 static acpi_status setup_res(struct acpi_resource *acpi_res, void *data)
 {
+       struct acpi_resource_address64 addr;
        struct resource *res = data;
 
        memset(res, 0, sizeof(*res));
-       if (acpi_dev_resource_memory(acpi_res, res)) {
-               res->flags &= IORESOURCE_MEM;
-               if (res->flags)
-                       return AE_OK;
-       } else if (acpi_dev_resource_address_space(acpi_res, res)) {
-               struct acpi_resource_address64 addr;
+       if (acpi_dev_resource_memory(acpi_res, res))
+               return AE_OK;
 
-               res->flags &= IORESOURCE_MEM;
-               if (res->flags &&
-                   ACPI_SUCCESS(acpi_resource_to_address64(acpi_res, &addr)) &&
-                   addr.info.mem.caching != ACPI_PREFETCHABLE_MEMORY) {
-                       res->start += addr.translation_offset;
-                       res->end += addr.translation_offset;
-                       return AE_OK;
-               }
+       if (!acpi_dev_resource_address_space(acpi_res, res) ||
+           !is_valid_mem_resource(res))
+               return AE_OK;
+       /*
+        * FIXME: This lacks a proper comment, why the resource
+        * address needs to be translated.
+        */
+       if (ACPI_SUCCESS(acpi_resource_to_address64(acpi_res, &addr)) &&
+           addr.info.mem.caching != ACPI_PREFETCHABLE_MEMORY) {
+               res->start += addr.translation_offset;
+               res->end += addr.translation_offset;
        }
-       res->flags = 0;
-
        return AE_OK;
 }
 
@@ -150,7 +154,7 @@ static acpi_status handle_ioapic_add(acp
 
                res = &ioapic->res;
                acpi_walk_resources(handle, METHOD_NAME__CRS, setup_res, res);
-               if (res->flags == IORESOURCE_UNSET) {
+               if (!is_valid_mem_resource(res)) {
                        acpi_handle_warn(handle, "failed to get resource\n");
                        goto exit_free;
                } else if (request_resource(&iomem_resource, res)) {


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to