patch-2.4.20 linux-2.4.20/drivers/char/indydog.c
Next file: linux-2.4.20/drivers/char/ip2main.c
Previous file: linux-2.4.20/drivers/char/ib700wdt.c
Back to the patch index
Back to the overall index
- Lines: 86
- Date:
Thu Nov 28 15:53:12 2002
- Orig file:
linux-2.4.19/drivers/char/indydog.c
- Orig date:
Fri Aug 2 17:39:43 2002
diff -urN linux-2.4.19/drivers/char/indydog.c linux-2.4.20/drivers/char/indydog.c
@@ -26,6 +26,16 @@
static unsigned long indydog_alive;
static struct sgimc_misc_ctrl *mcmisc_regs;
+static int expect_close = 0;
+
+#ifdef CONFIG_WATCHDOG_NOWAYOUT
+static int nowayout = 1;
+#else
+static int nowayout = 0;
+#endif
+
+MODULE_PARM(nowayout,"i");
+MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");
static void indydog_ping()
{
@@ -43,9 +53,9 @@
if( test_and_set_bit(0,&indydog_alive) )
return -EBUSY;
-#ifdef CONFIG_WATCHDOG_NOWAYOUT
- MOD_INC_USE_COUNT;
-#endif
+ if (nowayout) {
+ MOD_INC_USE_COUNT;
+ }
/*
* Activate timer
*/
@@ -63,16 +73,19 @@
{
/*
* Shut off the timer.
- * Lock it in if it's a module and we defined ...NOWAYOUT
+ * Lock it in if it's a module and we set nowayout.
*/
-#ifndef CONFIG_WATCHDOG_NOWAYOUT
+ if (expect_close)
{
- u32 mc_ctrl0 = mcmisc_regs->cpuctrl0;
- mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG;
- mcmisc_regs->cpuctrl0 = mc_ctrl0;
- printk("Stopped watchdog timer.\n");
+ u32 mc_ctrl0 = mcmisc_regs->cpuctrl0;
+ mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG;
+ mcmisc_regs->cpuctrl0 = mc_ctrl0;
+ printk("Stopped watchdog timer.\n");
+ }
+ else
+ {
+ printk(KERN_CRIT "WDT device closed unexpectedly. WDT will not stop!\n");
}
-#endif
clear_bit(0,&indydog_alive);
return 0;
}
@@ -87,6 +100,20 @@
* Refresh the timer.
*/
if(len) {
+ if (!nowayout) {
+ size_t i;
+
+ /* In case it was set long ago */
+ expect_close = 0;
+
+ for (i = 0; i != len; i++) {
+ char c;
+ if (get_user(c, data + i))
+ return -EFAULT;
+ if (c == 'V')
+ expect_close = 1;
+ }
+ }
indydog_ping();
return 1;
}
@@ -97,6 +124,7 @@
unsigned int cmd, unsigned long arg)
{
static struct watchdog_info ident = {
+ options: WDIOF_MAGICCLOSE,
identity: "Hardware Watchdog for SGI IP22",
};
switch (cmd) {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)