Blame view
drivers/watchdog/softdog.c
4.04 KB
1da177e4c Linux-2.6.12-rc2 |
1 |
/* |
a5132cafc watchdog: softdog... |
2 |
* SoftDog: A Software Watchdog Device |
1da177e4c Linux-2.6.12-rc2 |
3 |
* |
143a2e54b [WATCHDOG] More c... |
4 5 |
* (c) Copyright 1996 Alan Cox <alan@lxorguk.ukuu.org.uk>, * All Rights Reserved. |
1da177e4c 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 Linux-2.6.12-rc2 |
20 |
*/ |
27c766aaa watchdog: Use pr_... |
21 |
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
e65c5825c watchdog: softdog... |
22 23 24 |
#include <linux/init.h> #include <linux/jiffies.h> #include <linux/kernel.h> |
1da177e4c Linux-2.6.12-rc2 |
25 26 |
#include <linux/module.h> #include <linux/moduleparam.h> |
e65c5825c watchdog: softdog... |
27 |
#include <linux/reboot.h> |
1da177e4c Linux-2.6.12-rc2 |
28 |
#include <linux/timer.h> |
e65c5825c watchdog: softdog... |
29 |
#include <linux/types.h> |
1da177e4c Linux-2.6.12-rc2 |
30 |
#include <linux/watchdog.h> |
1da177e4c Linux-2.6.12-rc2 |
31 |
|
1da177e4c Linux-2.6.12-rc2 |
32 |
#define TIMER_MARGIN 60 /* Default is 60 seconds */ |
a5132cafc watchdog: softdog... |
33 34 |
static unsigned int soft_margin = TIMER_MARGIN; /* in seconds */ module_param(soft_margin, uint, 0); |
f92d3749d [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 Linux-2.6.12-rc2 |
38 |
|
86a1e1896 watchdog: nowayou... |
39 40 |
static bool nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, bool, 0); |
f92d3749d [WATCHDOG 47/57] ... |
41 42 43 |
MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); |
1da177e4c Linux-2.6.12-rc2 |
44 |
|
5f5e19093 watchdog: fix che... |
45 |
static int soft_noboot; |
1da177e4c Linux-2.6.12-rc2 |
46 |
module_param(soft_noboot, int, 0); |
a77dba7e4 [WATCHDOG] Some m... |
47 |
MODULE_PARM_DESC(soft_noboot, |
a5132cafc watchdog: softdog... |
48 |
"Softdog action, set to 1 to ignore reboots, 0 to reboot (default=0)"); |
1da177e4c Linux-2.6.12-rc2 |
49 |
|
7fff4beb3 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 watchdog: softdog... |
54 |
static void softdog_fire(unsigned long data) |
1da177e4c Linux-2.6.12-rc2 |
55 |
{ |
5889f06bd watchdog: refuse ... |
56 |
module_put(THIS_MODULE); |
4a23e2bf0 watchdog: softdog... |
57 |
if (soft_noboot) { |
27c766aaa watchdog: Use pr_... |
58 59 |
pr_crit("Triggered - Reboot ignored "); |
4a23e2bf0 watchdog: softdog... |
60 |
} else if (soft_panic) { |
27c766aaa watchdog: Use pr_... |
61 62 63 |
pr_crit("Initiating panic "); panic("Software Watchdog Timer expired"); |
7fff4beb3 watchdog: softdog... |
64 |
} else { |
27c766aaa watchdog: Use pr_... |
65 66 |
pr_crit("Initiating system reboot "); |
479d0f41e [PATCH] softdog b... |
67 |
emergency_restart(); |
27c766aaa watchdog: Use pr_... |
68 69 |
pr_crit("Reboot didn't ????? "); |
1da177e4c Linux-2.6.12-rc2 |
70 71 |
} } |
44ba0f04a watchdog: softdog... |
72 73 |
static struct timer_list softdog_ticktock = TIMER_INITIALIZER(softdog_fire, 0, 0); |
2accf3207 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 watchdog: softdog... |
83 |
static int softdog_ping(struct watchdog_device *w) |
1da177e4c Linux-2.6.12-rc2 |
84 |
{ |
4a23e2bf0 watchdog: softdog... |
85 |
if (!mod_timer(&softdog_ticktock, jiffies + (w->timeout * HZ))) |
5889f06bd watchdog: refuse ... |
86 |
__module_get(THIS_MODULE); |
2accf3207 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 Linux-2.6.12-rc2 |
93 94 |
return 0; } |
a5132cafc watchdog: softdog... |
95 |
static int softdog_stop(struct watchdog_device *w) |
1da177e4c Linux-2.6.12-rc2 |
96 |
{ |
0efc70b82 watchdog: softdog... |
97 |
if (del_timer(&softdog_ticktock)) |
5889f06bd watchdog: refuse ... |
98 |
module_put(THIS_MODULE); |
2accf3207 watchdog: softdog... |
99 |
del_timer(&softdog_preticktock); |
1da177e4c Linux-2.6.12-rc2 |
100 101 |
return 0; } |
a5132cafc watchdog: softdog... |
102 103 |
static struct watchdog_info softdog_info = { .identity = "Software Watchdog", |
2accf3207 watchdog: softdog... |
104 105 |
.options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE | WDIOF_PRETIMEOUT, |
1da177e4c Linux-2.6.12-rc2 |
106 |
}; |
85f15cfc2 watchdog: constif... |
107 |
static const struct watchdog_ops softdog_ops = { |
a5132cafc watchdog: softdog... |
108 109 110 |
.owner = THIS_MODULE, .start = softdog_ping, .stop = softdog_stop, |
a5132cafc watchdog: softdog... |
111 112 113 114 115 116 |
}; static struct watchdog_device softdog_dev = { .info = &softdog_info, .ops = &softdog_ops, .min_timeout = 1, |
e8cf96abb watchdog: softdog... |
117 118 |
.max_timeout = 65535, .timeout = TIMER_MARGIN, |
1da177e4c Linux-2.6.12-rc2 |
119 |
}; |
0efc70b82 watchdog: softdog... |
120 |
static int __init softdog_init(void) |
1da177e4c Linux-2.6.12-rc2 |
121 122 |
{ int ret; |
e8cf96abb watchdog: softdog... |
123 |
watchdog_init_timeout(&softdog_dev, soft_margin, NULL); |
a5132cafc watchdog: softdog... |
124 |
watchdog_set_nowayout(&softdog_dev, nowayout); |
84ebcc17f watchdog: softdog... |
125 |
watchdog_stop_on_reboot(&softdog_dev); |
1da177e4c Linux-2.6.12-rc2 |
126 |
|
a5132cafc watchdog: softdog... |
127 |
ret = watchdog_register_device(&softdog_dev); |
84ebcc17f watchdog: softdog... |
128 |
if (ret) |
1da177e4c Linux-2.6.12-rc2 |
129 |
return ret; |
1da177e4c Linux-2.6.12-rc2 |
130 |
|
e8cf96abb 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 Linux-2.6.12-rc2 |
134 135 136 |
return 0; } |
0efc70b82 watchdog: softdog... |
137 |
module_init(softdog_init); |
1da177e4c Linux-2.6.12-rc2 |
138 |
|
0efc70b82 watchdog: softdog... |
139 |
static void __exit softdog_exit(void) |
1da177e4c Linux-2.6.12-rc2 |
140 |
{ |
a5132cafc watchdog: softdog... |
141 |
watchdog_unregister_device(&softdog_dev); |
1da177e4c Linux-2.6.12-rc2 |
142 |
} |
0efc70b82 watchdog: softdog... |
143 |
module_exit(softdog_exit); |
1da177e4c Linux-2.6.12-rc2 |
144 145 146 147 |
MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("Software Watchdog Device Driver"); MODULE_LICENSE("GPL"); |