[PATCH] IPMI: fix for handling bad ACPI data
authorCorey Minyard <minyard@acm.org>
Sun, 1 May 2005 15:59:10 +0000 (08:59 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Sun, 1 May 2005 15:59:10 +0000 (08:59 -0700)
If the ACPI register bit width is zero (an invalid value) assume it is the
default spacing.  This avoids some coredumps on invalid data and makes some
systems work that have broken ACPI data.

Signed-off-by: Corey Minyard <minyard@acm.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
drivers/char/ipmi/ipmi_si_intf.c

index 3522723eb6b8e11e305be522973a07343c978308..7522bd5f94dacad038f42b0e533947812273901b 100644 (file)
@@ -1526,8 +1526,17 @@ static int try_init_acpi(int intf_num, struct smi_info **new_info)
                info->irq_setup = NULL;
        }
 
-       regspacings[intf_num] = spmi->addr.register_bit_width / 8;
-       info->io.regspacing = spmi->addr.register_bit_width / 8;
+       if (spmi->addr.register_bit_width) {
+               /* A (hopefully) properly formed register bit width. */
+               regspacings[intf_num] = spmi->addr.register_bit_width / 8;
+               info->io.regspacing = spmi->addr.register_bit_width / 8;
+       } else {
+               /* Some broken systems get this wrong and set the value
+                * to zero.  Assume it is the default spacing.  If that
+                * is wrong, too bad, the vendor should fix the tables. */
+               regspacings[intf_num] = DEFAULT_REGSPACING;
+               info->io.regspacing = DEFAULT_REGSPACING;
+       }
        regsizes[intf_num] = regspacings[intf_num];
        info->io.regsize = regsizes[intf_num];
        regshifts[intf_num] = spmi->addr.register_bit_offset;