Blame view

drivers/watchdog/softdog.c 4.04 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
a5132cafc   Alan Cox   watchdog: softdog...
2
   *	SoftDog:	A Software Watchdog Device
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   *
143a2e54b   Wim Van Sebroeck   [WATCHDOG] More c...
4
5
   *	(c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>,
   *							All Rights Reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   *
   *	This program is free software; you can redistribute it and/or
   *	modify it under the terms of the GNU General Public License
   *	as published by the Free Software Foundation; either version
   *	2 of the License, or (at your option) any later version.
   *
   *	Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
   *	warranty for any of this software. This material is provided
   *	"AS-IS" and at no charge.
   *
   *	(c) Copyright 1995    Alan Cox <alan@lxorguk.ukuu.org.uk>
   *
   *	Software only watchdog driver. Unlike its big brother the WDT501P
   *	driver this won't always recover a failed machine.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
20
   */
27c766aaa   Joe Perches   watchdog: Use pr_...
21
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
e65c5825c   Wolfram Sang   watchdog: softdog...
22
23
24
  #include <linux/init.h>
  #include <linux/jiffies.h>
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
  #include <linux/module.h>
  #include <linux/moduleparam.h>
e65c5825c   Wolfram Sang   watchdog: softdog...
27
  #include <linux/reboot.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  #include <linux/timer.h>
e65c5825c   Wolfram Sang   watchdog: softdog...
29
  #include <linux/types.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
  #include <linux/watchdog.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
32
  #define TIMER_MARGIN	60		/* Default is 60 seconds */
a5132cafc   Alan Cox   watchdog: softdog...
33
34
  static unsigned int soft_margin = TIMER_MARGIN;	/* in seconds */
  module_param(soft_margin, uint, 0);
f92d3749d   Alan Cox   [WATCHDOG 47/57] ...
35
36
37
  MODULE_PARM_DESC(soft_margin,
  	"Watchdog soft_margin in seconds. (0 < soft_margin < 65536, default="
  					__MODULE_STRING(TIMER_MARGIN) ")");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38

86a1e1896   Wim Van Sebroeck   watchdog: nowayou...
39
40
  static bool nowayout = WATCHDOG_NOWAYOUT;
  module_param(nowayout, bool, 0);
f92d3749d   Alan Cox   [WATCHDOG 47/57] ...
41
42
43
  MODULE_PARM_DESC(nowayout,
  		"Watchdog cannot be stopped once started (default="
  				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44

5f5e19093   Jingoo Han   watchdog: fix che...
45
  static int soft_noboot;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
  module_param(soft_noboot, int, 0);
a77dba7e4   Wim Van Sebroeck   [WATCHDOG] Some m...
47
  MODULE_PARM_DESC(soft_noboot,
a5132cafc   Alan Cox   watchdog: softdog...
48
  	"Softdog action, set to 1 to ignore reboots, 0 to reboot (default=0)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49

7fff4beb3   Anithra P Janakiraman   watchdog: softdog...
50
51
52
53
  static int soft_panic;
  module_param(soft_panic, int, 0);
  MODULE_PARM_DESC(soft_panic,
  	"Softdog action, set to 1 to panic, 0 to reboot (default=0)");
0efc70b82   Wolfram Sang   watchdog: softdog...
54
  static void softdog_fire(unsigned long data)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
  {
5889f06bd   Li RongQing   watchdog: refuse ...
56
  	module_put(THIS_MODULE);
4a23e2bf0   Wolfram Sang   watchdog: softdog...
57
  	if (soft_noboot) {
27c766aaa   Joe Perches   watchdog: Use pr_...
58
59
  		pr_crit("Triggered - Reboot ignored
  ");
4a23e2bf0   Wolfram Sang   watchdog: softdog...
60
  	} else if (soft_panic) {
27c766aaa   Joe Perches   watchdog: Use pr_...
61
62
63
  		pr_crit("Initiating panic
  ");
  		panic("Software Watchdog Timer expired");
7fff4beb3   Anithra P Janakiraman   watchdog: softdog...
64
  	} else {
27c766aaa   Joe Perches   watchdog: Use pr_...
65
66
  		pr_crit("Initiating system reboot
  ");
479d0f41e   Andrew Morton   [PATCH] softdog b...
67
  		emergency_restart();
27c766aaa   Joe Perches   watchdog: Use pr_...
68
69
  		pr_crit("Reboot didn't ?????
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
  	}
  }
44ba0f04a   Wolfram Sang   watchdog: softdog...
72
73
  static struct timer_list softdog_ticktock =
  		TIMER_INITIALIZER(softdog_fire, 0, 0);
2accf3207   Wolfram Sang   watchdog: softdog...
74
75
76
77
78
79
80
81
82
  static struct watchdog_device softdog_dev;
  
  static void softdog_pretimeout(unsigned long data)
  {
  	watchdog_notify_pretimeout(&softdog_dev);
  }
  
  static struct timer_list softdog_preticktock =
  		TIMER_INITIALIZER(softdog_pretimeout, 0, 0);
a5132cafc   Alan Cox   watchdog: softdog...
83
  static int softdog_ping(struct watchdog_device *w)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
  {
4a23e2bf0   Wolfram Sang   watchdog: softdog...
85
  	if (!mod_timer(&softdog_ticktock, jiffies + (w->timeout * HZ)))
5889f06bd   Li RongQing   watchdog: refuse ...
86
  		__module_get(THIS_MODULE);
2accf3207   Wolfram Sang   watchdog: softdog...
87
88
89
90
91
92
  
  	if (w->pretimeout)
  		mod_timer(&softdog_preticktock, jiffies +
  			  (w->timeout - w->pretimeout) * HZ);
  	else
  		del_timer(&softdog_preticktock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
  	return 0;
  }
a5132cafc   Alan Cox   watchdog: softdog...
95
  static int softdog_stop(struct watchdog_device *w)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  {
0efc70b82   Wolfram Sang   watchdog: softdog...
97
  	if (del_timer(&softdog_ticktock))
5889f06bd   Li RongQing   watchdog: refuse ...
98
  		module_put(THIS_MODULE);
2accf3207   Wolfram Sang   watchdog: softdog...
99
  	del_timer(&softdog_preticktock);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
  	return 0;
  }
a5132cafc   Alan Cox   watchdog: softdog...
102
103
  static struct watchdog_info softdog_info = {
  	.identity = "Software Watchdog",
2accf3207   Wolfram Sang   watchdog: softdog...
104
105
  	.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE |
  		   WDIOF_PRETIMEOUT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
  };
85f15cfc2   Julia Lawall   watchdog: constif...
107
  static const struct watchdog_ops softdog_ops = {
a5132cafc   Alan Cox   watchdog: softdog...
108
109
110
  	.owner = THIS_MODULE,
  	.start = softdog_ping,
  	.stop = softdog_stop,
a5132cafc   Alan Cox   watchdog: softdog...
111
112
113
114
115
116
  };
  
  static struct watchdog_device softdog_dev = {
  	.info = &softdog_info,
  	.ops = &softdog_ops,
  	.min_timeout = 1,
e8cf96abb   Wolfram Sang   watchdog: softdog...
117
118
  	.max_timeout = 65535,
  	.timeout = TIMER_MARGIN,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  };
0efc70b82   Wolfram Sang   watchdog: softdog...
120
  static int __init softdog_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
  {
  	int ret;
e8cf96abb   Wolfram Sang   watchdog: softdog...
123
  	watchdog_init_timeout(&softdog_dev, soft_margin, NULL);
a5132cafc   Alan Cox   watchdog: softdog...
124
  	watchdog_set_nowayout(&softdog_dev, nowayout);
84ebcc17f   Damien Riegel   watchdog: softdog...
125
  	watchdog_stop_on_reboot(&softdog_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126

a5132cafc   Alan Cox   watchdog: softdog...
127
  	ret = watchdog_register_device(&softdog_dev);
84ebcc17f   Damien Riegel   watchdog: softdog...
128
  	if (ret)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
  		return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130

e8cf96abb   Wolfram Sang   watchdog: softdog...
131
132
133
  	pr_info("initialized. soft_noboot=%d soft_margin=%d sec soft_panic=%d (nowayout=%d)
  ",
  		soft_noboot, softdog_dev.timeout, soft_panic, nowayout);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
  
  	return 0;
  }
0efc70b82   Wolfram Sang   watchdog: softdog...
137
  module_init(softdog_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138

0efc70b82   Wolfram Sang   watchdog: softdog...
139
  static void __exit softdog_exit(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
  {
a5132cafc   Alan Cox   watchdog: softdog...
141
  	watchdog_unregister_device(&softdog_dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  }
0efc70b82   Wolfram Sang   watchdog: softdog...
143
  module_exit(softdog_exit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
144
145
146
147
  
  MODULE_AUTHOR("Alan Cox");
  MODULE_DESCRIPTION("Software Watchdog Device Driver");
  MODULE_LICENSE("GPL");