From fb9a36841c6bda9aca3d552e47ff554517d7aebf Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Wed, 3 Dec 2008 16:20:19 -0800 Subject: [PATCH] iTCO_wdt: fix typo when setting TCO_EN bit The code used '&= 0x00002000' when it tried to set the TCO_EN bit, which obviously didn't set that bit at all, but instead just reset all the other bits in the SMI_EN register. This bug seemingly caused various random behavior, with Frans Pop reporting that X.org just silently hung at startup and Rafael Wysocki reports the fan spinning with full speed. See http://lkml.org/lkml/2008/12/3/178 http://bugzilla.kernel.org/show_bug.cgi?id=12162 The problem seems to have been triggered by "[WATCHDOG] iTCO_wdt : problem with rebooting on new ICH9 based motherboards" (commit d1652322b5515d16bcf1660568f05f2f84697541), but the bogus code existed before that too (in the "supermicro_old_pre_stop()" function), it just apparently never showed up due to different logic. In that commit the broken code got moved around and now gets executed much more. Reported-by: Rafael J. Wysocki Tested-by: Frans Pop Cc: Wim Van Sebroeck Signed-off-by: Linus Torvalds --- drivers/watchdog/iTCO_wdt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/watchdog/iTCO_wdt.c b/drivers/watchdog/iTCO_wdt.c index 26173a270e944..5b395a4ddfdfe 100644 --- a/drivers/watchdog/iTCO_wdt.c +++ b/drivers/watchdog/iTCO_wdt.c @@ -392,7 +392,7 @@ static int iTCO_wdt_stop(void) /* Bit 13: TCO_EN -> 1 = Enables the TCO logic to generate SMI# */ val32 = inl(SMI_EN); - val32 &= 0x00002000; + val32 |= 0x00002000; outl(val32, SMI_EN); /* Set the NO_REBOOT bit to prevent later reboots, just for sure */ -- 2.39.5