diff options
Diffstat (limited to 'drivers/char/watchdog/pcwd.c')
-rw-r--r-- | drivers/char/watchdog/pcwd.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/drivers/char/watchdog/pcwd.c b/drivers/char/watchdog/pcwd.c index 8e1e6e48e0a7..6e8b5705b5b7 100644 --- a/drivers/char/watchdog/pcwd.c +++ b/drivers/char/watchdog/pcwd.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * PC Watchdog Driver | 2 | * PC Watchdog Driver |
3 | * by Ken Hollis (khollis@bitgate.com) | 3 | * by Ken Hollis (khollis@bitgate.com) |
4 | * | 4 | * |
5 | * Permission granted from Simon Machell (73244.1270@compuserve.com) | 5 | * Permission granted from Simon Machell (smachell@berkprod.com) |
6 | * Written for the Linux Kernel, and GPLed by Ken Hollis | 6 | * Written for the Linux Kernel, and GPLed by Ken Hollis |
7 | * | 7 | * |
8 | * 960107 Added request_region routines, modulized the whole thing. | 8 | * 960107 Added request_region routines, modulized the whole thing. |
@@ -70,8 +70,8 @@ | |||
70 | #include <asm/io.h> /* For inb/outb/... */ | 70 | #include <asm/io.h> /* For inb/outb/... */ |
71 | 71 | ||
72 | /* Module and version information */ | 72 | /* Module and version information */ |
73 | #define WATCHDOG_VERSION "1.17" | 73 | #define WATCHDOG_VERSION "1.18" |
74 | #define WATCHDOG_DATE "12 Feb 2006" | 74 | #define WATCHDOG_DATE "21 Jan 2007" |
75 | #define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog" | 75 | #define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog" |
76 | #define WATCHDOG_NAME "pcwd" | 76 | #define WATCHDOG_NAME "pcwd" |
77 | #define PFX WATCHDOG_NAME ": " | 77 | #define PFX WATCHDOG_NAME ": " |
@@ -132,6 +132,18 @@ | |||
132 | #define CMD_ISA_DELAY_TIME_8SECS 0x0C | 132 | #define CMD_ISA_DELAY_TIME_8SECS 0x0C |
133 | #define CMD_ISA_RESET_RELAYS 0x0D | 133 | #define CMD_ISA_RESET_RELAYS 0x0D |
134 | 134 | ||
135 | /* Watchdog's Dip Switch heartbeat values */ | ||
136 | static const int heartbeat_tbl [] = { | ||
137 | 20, /* OFF-OFF-OFF = 20 Sec */ | ||
138 | 40, /* OFF-OFF-ON = 40 Sec */ | ||
139 | 60, /* OFF-ON-OFF = 1 Min */ | ||
140 | 300, /* OFF-ON-ON = 5 Min */ | ||
141 | 600, /* ON-OFF-OFF = 10 Min */ | ||
142 | 1800, /* ON-OFF-ON = 30 Min */ | ||
143 | 3600, /* ON-ON-OFF = 1 Hour */ | ||
144 | 7200, /* ON-ON-ON = 2 hour */ | ||
145 | }; | ||
146 | |||
135 | /* | 147 | /* |
136 | * We are using an kernel timer to do the pinging of the watchdog | 148 | * We are using an kernel timer to do the pinging of the watchdog |
137 | * every ~500ms. We try to set the internal heartbeat of the | 149 | * every ~500ms. We try to set the internal heartbeat of the |
@@ -167,14 +179,14 @@ static int debug = QUIET; | |||
167 | module_param(debug, int, 0); | 179 | module_param(debug, int, 0); |
168 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); | 180 | MODULE_PARM_DESC(debug, "Debug level: 0=Quiet, 1=Verbose, 2=Debug (default=0)"); |
169 | 181 | ||
170 | #define WATCHDOG_HEARTBEAT 60 /* 60 sec default heartbeat */ | 182 | #define WATCHDOG_HEARTBEAT 0 /* default heartbeat = delay-time from dip-switches */ |
171 | static int heartbeat = WATCHDOG_HEARTBEAT; | 183 | static int heartbeat = WATCHDOG_HEARTBEAT; |
172 | module_param(heartbeat, int, 0); | 184 | module_param(heartbeat, int, 0); |
173 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); | 185 | MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200 or 0=delay-time from dip-switches, default=" __MODULE_STRING(WATCHDOG_HEARTBEAT) ")"); |
174 | 186 | ||
175 | static int nowayout = WATCHDOG_NOWAYOUT; | 187 | static int nowayout = WATCHDOG_NOWAYOUT; |
176 | module_param(nowayout, int, 0); | 188 | module_param(nowayout, int, 0); |
177 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); | 189 | MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); |
178 | 190 | ||
179 | /* | 191 | /* |
180 | * Internal functions | 192 | * Internal functions |
@@ -831,9 +843,7 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
831 | /* clear the "card caused reboot" flag */ | 843 | /* clear the "card caused reboot" flag */ |
832 | pcwd_clear_status(); | 844 | pcwd_clear_status(); |
833 | 845 | ||
834 | init_timer(&pcwd_private.timer); | 846 | setup_timer(&pcwd_private.timer, pcwd_timer_ping, 0); |
835 | pcwd_private.timer.function = pcwd_timer_ping; | ||
836 | pcwd_private.timer.data = 0; | ||
837 | 847 | ||
838 | /* Disable the board */ | 848 | /* Disable the board */ |
839 | pcwd_stop(); | 849 | pcwd_stop(); |
@@ -844,6 +854,10 @@ static int __devinit pcwatchdog_init(int base_addr) | |||
844 | /* Show info about the card itself */ | 854 | /* Show info about the card itself */ |
845 | pcwd_show_card_info(); | 855 | pcwd_show_card_info(); |
846 | 856 | ||
857 | /* If heartbeat = 0 then we use the heartbeat from the dip-switches */ | ||
858 | if (heartbeat == 0) | ||
859 | heartbeat = heartbeat_tbl[(pcwd_get_option_switches() & 0x07)]; | ||
860 | |||
847 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ | 861 | /* Check that the heartbeat value is within it's range ; if not reset to the default */ |
848 | if (pcwd_set_heartbeat(heartbeat)) { | 862 | if (pcwd_set_heartbeat(heartbeat)) { |
849 | pcwd_set_heartbeat(WATCHDOG_HEARTBEAT); | 863 | pcwd_set_heartbeat(WATCHDOG_HEARTBEAT); |