Re: [PATCH 04/11] watchdog: WatchDog Timer Driver Core - AddWDIOC_SETOPTIONS ioctl
From: Wolfram Sang
Date: Mon Jul 11 2011 - 17:33:10 EST
> @@ -121,6 +171,7 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
> void __user *argp = (void __user *)arg;
> int __user *p = argp;
> unsigned int val;
> + int err;
>
> switch (cmd) {
> case WDIOC_GETSUPPORT:
> @@ -131,6 +182,20 @@ static long watchdog_ioctl(struct file *file, unsigned int cmd,
> return put_user(val, p);
> case WDIOC_GETBOOTSTATUS:
> return put_user(wdd->bootstatus, p);
> + case WDIOC_SETOPTIONS:
> + if (get_user(val, p))
> + return -EFAULT;
> + if (val & WDIOS_DISABLECARD) {
> + err = watchdog_stop(wdd);
> + if (err < 0)
> + return err;
> + }
> + if (val & WDIOS_ENABLECARD) {
> + err = watchdog_start(wdd);
> + if (err < 0)
> + return err;
> + }
> + return 0;
> case WDIOC_KEEPALIVE:
> if (!(wdd->info->options & WDIOF_KEEPALIVEPING))
> return -EOPNOTSUPP;
> @@ -168,7 +233,7 @@ static int watchdog_open(struct inode *inode, struct file *file)
> goto out;
>
> /* start the watchdog */
> - err = wdd->ops->start(wdd);
> + err = watchdog_start(wdd);
I think we still might need open- and close-callbacks here. Some drivers turn
on/off clocks on these operations and we can't simply move them to the
start/stop callbacks, because the clock might be turned off via DISABLECARD
which calls stop. And without the clock, a simple register access via
set_timeout might lock up the machine.
> if (err < 0)
> goto out_mod;
>
> @@ -195,8 +260,8 @@ static int watchdog_release(struct inode *inode, struct file *file)
> int err;
>
> /* stop the watchdog */
> - err = wdd->ops->stop(wdd);
> - if (err != 0) {
> + err = watchdog_stop(wdd);
> + if (err < 0) {
> pr_crit("%s: watchdog did not stop!\n", wdd->info->identity);
> watchdog_ping(wdd);
> }
> diff --git a/include/linux/watchdog.h b/include/linux/watchdog.h
> index a2b639b..853387f 100644
> --- a/include/linux/watchdog.h
> +++ b/include/linux/watchdog.h
> @@ -81,6 +81,7 @@ struct watchdog_device {
> void *priv;
> unsigned long status;
> /* Bit numbers for status flags */
> +#define WDOG_ACTIVE 0 /* Is the watchdog running/active */
> #define WDOG_DEV_OPEN 1 /* Opened via /dev/watchdog ? */
> };
>
> --
> 1.7.6
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-watchdog" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Attachment:
signature.asc
Description: Digital signature