Messages in this thread Patch in this message | | | Date | Tue, 01 Apr 2008 17:06:21 +0200 | From | Oliver Schuster <> | Subject | [PATCH][WATCHDOG] v2.6.25-rc7: it8712f_wdt.c contains an error - was Re: [WATCHDOG] v2.5.25-rc patches |
| |
Hi,
i've mailed before to lkml and Andrew Paprocki (2008-03-12) directly. But the original patch wasn't changed. Here's a patch to correct the error.
Description of the error: By introducing the support of 16 Bit timer values for later it8712 an error was made. The value is stored through superio_outw() which cause, that the upper Byte is in the Register called "Watch Dog Timer Time-Out Value (LSB) Register" and the lower in "Watch Dog Timer Time-Out Value (MSB) Register".
A common value is 60: stored this way the watchdog timer runs out in 4h 16mins. In case of a deadlocked server this is a long time to wait, before the service comes back!
Regards, Oliver
Wim Van Sebroeck schrieb: > Hi Oliver, > >> this patch can cause serious problems in the case, that someone use it >> with an it8712 rev. 8 and above. > ... >> Your patch changes it8712f_wdt.c in function t8712f_wdt_update_margin(): >> >>> - superio_outb((margin > 255) ? (margin / 60) : margin, WDT_TIMEOUT); >>> + if (revision >= 0x08) >>> + superio_outw(units, WDT_TIMEOUT); >>> + else >>> + superio_outb(units, WDT_TIMEOUT); >> but here you can't use superio_outw, because the bytes are swapped >> --historical reason. >> >> I suggest to substitute >> superio_outw(units, WDT_TIMEOUT); >> with >> superio_outb(units >> 8, WDT_TIMEOUT + 1); >> superio_outb(units, WDT_TIMEOUT); >> > > Can you keep "Andrew Paprocki" <andrew@ishiboo.com> in the loop? > Can you also create a patch and test it together with Andrew? > We need to make sure that we fix this before 2.6.25 is there. > > Thanks, > Wim
This patch corrects an error in the driver it8712f_wdt
Signed-off-by: Oliver Schuster <olivers137@aol.com>
===
diff -urP linux-2.6.25-rc7/drivers/watchdog/it8712f_wdt.c linux-2.6.25-rc7-aaa/drivers/watchdog/it8712f_wdt.c --- linux-2.6.25-rc7/drivers/watchdog/it8712f_wdt.c 2008-03-26 02:38:14.000000000 +0100 +++ linux-2.6.25-rc7-aaa/drivers/watchdog/it8712f_wdt.c 2008-04-01 16:45:22.396931807 +0200 @@ -111,15 +111,6 @@ return val; } -static void -superio_outw(int val, int reg) -{ - outb(reg++, REG); - outb((val >> 8) & 0xff, VAL); - outb(reg, REG); - outb(val & 0xff, VAL); -} - static inline void superio_select(int ldn) { @@ -170,9 +161,8 @@ superio_outb(config, WDT_CONFIG); if (revision >= 0x08) - superio_outw(units, WDT_TIMEOUT); - else - superio_outb(units, WDT_TIMEOUT); + superio_outb(units >> 8, WDT_TIMEOUT + 1); + superio_outb(units, WDT_TIMEOUT); } static int | |