aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/watchdog/ib700wdt.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/drivers/char/watchdog/ib700wdt.c b/drivers/char/watchdog/ib700wdt.c
index 0c3c3a3e719d..5510db21090a 100644
--- a/drivers/char/watchdog/ib700wdt.c
+++ b/drivers/char/watchdog/ib700wdt.c
@@ -122,7 +122,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" _
122 122
123 123
124/* 124/*
125 * Kernel methods. 125 * Watchdog Operations
126 */ 126 */
127 127
128static void 128static void
@@ -132,6 +132,31 @@ ibwdt_ping(void)
132 outb_p(wd_margin, WDT_START); 132 outb_p(wd_margin, WDT_START);
133} 133}
134 134
135static void
136ibwdt_disable(void)
137{
138 outb_p(0, WDT_STOP);
139}
140
141static int
142ibwdt_set_heartbeat(int t)
143{
144 int i;
145
146 if ((t < 0) || (t > 30))
147 return -EINVAL;
148
149 for (i = 0x0F; i > -1; i--)
150 if (wd_times[i] > t)
151 break;
152 wd_margin = i;
153 return 0;
154}
155
156/*
157 * /dev/watchdog handling
158 */
159
135static ssize_t 160static ssize_t
136ibwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 161ibwdt_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
137{ 162{
@@ -159,7 +184,7 @@ static int
159ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, 184ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
160 unsigned long arg) 185 unsigned long arg)
161{ 186{
162 int i, new_margin; 187 int new_margin;
163 void __user *argp = (void __user *)arg; 188 void __user *argp = (void __user *)arg;
164 int __user *p = argp; 189 int __user *p = argp;
165 190
@@ -185,12 +210,8 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
185 case WDIOC_SETTIMEOUT: 210 case WDIOC_SETTIMEOUT:
186 if (get_user(new_margin, p)) 211 if (get_user(new_margin, p))
187 return -EFAULT; 212 return -EFAULT;
188 if ((new_margin < 0) || (new_margin > 30)) 213 if (ibwdt_set_heartbeat(new_margin))
189 return -EINVAL; 214 return -EINVAL;
190 for (i = 0x0F; i > -1; i--)
191 if (wd_times[i] > new_margin)
192 break;
193 wd_margin = i;
194 ibwdt_ping(); 215 ibwdt_ping();
195 /* Fall */ 216 /* Fall */
196 217
@@ -226,7 +247,7 @@ ibwdt_close(struct inode *inode, struct file *file)
226{ 247{
227 spin_lock(&ibwdt_lock); 248 spin_lock(&ibwdt_lock);
228 if (expect_close == 42) 249 if (expect_close == 42)
229 outb_p(0, WDT_STOP); 250 ibwdt_disable();
230 else 251 else
231 printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); 252 printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n");
232 253
@@ -246,7 +267,7 @@ ibwdt_notify_sys(struct notifier_block *this, unsigned long code,
246{ 267{
247 if (code == SYS_DOWN || code == SYS_HALT) { 268 if (code == SYS_DOWN || code == SYS_HALT) {
248 /* Turn the WDT off */ 269 /* Turn the WDT off */
249 outb_p(0, WDT_STOP); 270 ibwdt_disable();
250 } 271 }
251 return NOTIFY_DONE; 272 return NOTIFY_DONE;
252} 273}