[PATCH][WATCHDOG] v2.6.25-rc7: it8712f_wdt.c contains an error -was Re: [WATCHDOG] v2.5.25-rc patches

From: Oliver Schuster
Date: Tue Apr 01 2008 - 11:32:46 EST


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@xxxxxxxxxxx> 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@xxxxxxx>

===

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