]> git.hungrycats.org Git - linux/commitdiff
[PATCH] resolve ACPI lockup
authorDominik Brodowski <devel@brodo.de>
Thu, 25 Jul 2002 06:57:25 +0000 (23:57 -0700)
committerAndy Grover <agrover@acpi3.(none)>
Thu, 25 Jul 2002 06:57:25 +0000 (23:57 -0700)
A much needed (and widely tested) ACPI bugfix for kernel 2.5.28:
An u8 was casted into an u32, then all 32 bits were zeroed. This can cause
other values, e.g. "unsigned long flags" to be corrupted. When these
flags==0 are "restored", the system locks hard.

drivers/acpi/ec.c

index 3dba2994bd6a7c25c7ff451a385ac0190482871b..1d15dea62180bbfe258dbac346ab8d594d7d1d35 100644 (file)
@@ -134,7 +134,7 @@ static int
 acpi_ec_read (
        struct acpi_ec          *ec,
        u8                      address,
-       u                     *data)
+       u32                     *data)
 {
        acpi_status             status = AE_OK;
        int                     result = 0;
@@ -167,7 +167,7 @@ acpi_ec_read (
                goto end;
 
 
-       acpi_hw_low_level_read(8, (u32*) data, &ec->data_addr, 0);
+       acpi_hw_low_level_read(8, data, &ec->data_addr, 0);
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
                *data, address));
@@ -237,7 +237,7 @@ end:
 static int
 acpi_ec_query (
        struct acpi_ec          *ec,
-       u                     *data)
+       u32                     *data)
 {
        int                     result = 0;
        acpi_status             status = AE_OK;
@@ -269,7 +269,7 @@ acpi_ec_query (
        if (result)
                goto end;
        
-       acpi_hw_low_level_read(8, (u32*) data, &ec->data_addr, 0);
+       acpi_hw_low_level_read(8, data, &ec->data_addr, 0);
        if (!*data)
                result = -ENODATA;
 
@@ -328,7 +328,7 @@ acpi_ec_gpe_handler (
 {
        acpi_status             status = AE_OK;
        struct acpi_ec          *ec = (struct acpi_ec *) data;
-       u                     value = 0;
+       u32                     value = 0;
        unsigned long           flags = 0;
        struct acpi_ec_query_data *query_data = NULL;
 
@@ -336,7 +336,7 @@ acpi_ec_gpe_handler (
                return;
 
        spin_lock_irqsave(&ec->lock, flags);
-       acpi_hw_low_level_read(8, (u32*) &value, &ec->command_addr, 0);
+       acpi_hw_low_level_read(8, &value, &ec->command_addr, 0);
        spin_unlock_irqrestore(&ec->lock, flags);
 
        /* TBD: Implement asynch events!
@@ -398,6 +398,7 @@ acpi_ec_space_handler (
 {
        int                     result = 0;
        struct acpi_ec          *ec = NULL;
+       u32                     tmp = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_space_handler");
 
@@ -408,7 +409,8 @@ acpi_ec_space_handler (
 
        switch (function) {
        case ACPI_READ:
-               result = acpi_ec_read(ec, (u8) address, (u8*) value);
+               result = acpi_ec_read(ec, (u8) address, &tmp);
+               *value = (acpi_integer) tmp;
                break;
        case ACPI_WRITE:
                result = acpi_ec_write(ec, (u8) address, (u8) *value);