WDIOC_SETTIMEOUT
PATCH 1/1 WDIOC_SETTIMEOUT
Marcelo,
Here is the WDIOC_SETTIMEOUT patch again. I have not heard any
more comments from driver authors. Please consider for inclusion in 2.4.18. It patches clean against 2.4.17, let me know if you need anything else.
Thanks
Joel
Signature · 5 lines
"I don't even butter my bread; I consider that cooking."
- Katherine Cebrian
http://www.jlbec.org/
[email protected]drivers/char/advantechwdt.c +17 -2
@@ -64,6 +64,7 @@#define WDT_START 0x443#define WD_TIMO 60/* 1 minute */ +static int wd_margin =WD_TIMO ;/* * Kernel methods.
@@ -73,7 +74,7 @@advwdt_ping (void) {/* Write a watchdog value */ -outb_p (WD_TIMO ,WDT_START ); +outb_p (wd_margin,WDT_START ); } static ssize_t
@@ -100,8 +101,9 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { + int new_margin;static struct watchdog_info ident = { -WDIOF_KEEPALIVEPING ,1 ,"Advantech WDT" +WDIOF_KEEPALIVEPING |WDIOF_SETTIMEOUT ,1 ,"Advantech WDT" };switch (cmd) {
@@ -117,6 +119,19 @@case WDIOC_KEEPALIVE :advwdt_ping (); +break ; + +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, (int *)arg)) +return -EFAULT ; +if ((new_margin <1 ) || (new_margin >63 )) +return -EINVAL ; + wd_margin = new_margin; +advwdt_ping (); +/* Fall */ + +case WDIOC_GETTIMEOUT : +return put_user (wd_margin, (int *)arg);break ;default :
drivers/char/eurotechwdt.c +5 -2
@@ -233,7 +233,7 @@ unsigned int cmd, unsigned long arg) {static struct watchdog_info ident = { - options :WDIOF_CARDRESET , + options :WDIOF_CARDRESET |WDIOF_SETTIMEOUT , firmware_version :1 , identity :"WDT Eurotech CPU-1220/1410" };
@@ -265,7 +265,10 @@ eurwdt_timeout = time;eurwdt_set_timeout (time); -return 0 ; +/* Fall */ + +case WDIOC_GETTIMEOUT : +return put_user (eurwdt_timeout, (int *)arg); } }
drivers/char/i810-tco.c +17 -2
@@ -181,7 +181,7 @@/* * Shut off the timer. */ -#ifdef CONFIG_WATCHDOG_NOWAYOUT +#ifndef CONFIG_WATCHDOG_NOWAYOUT tco_timer_stop (); timer_alive =0 ;#endif
@@ -208,8 +208,10 @@static int i810tco_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { +int new_margin, u_margin; +static struct watchdog_info ident = { -0 , +WDIOF_SETTIMEOUT |WDIOF_KEEPALIVEPING ,0 ,"i810 TCO timer" };
@@ -229,6 +231,19 @@case WDIOC_KEEPALIVE :tco_timer_reload ();return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (u_margin, (int *) arg)) +return -EFAULT ; + new_margin = (u_margin *10 +5 ) /6 ; +if ((new_margin <3 ) || (new_margin >63 )) +return -EINVAL ; +if (tco_timer_settimer ((unsigned char )new_margin)) +return -EINVAL ; + i810_margin = new_margin; +tco_timer_reload (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user ((int )(i810_margin *6 /10 ), (int *) arg); } }
drivers/char/ib700wdt.c +45 -4
91 lines not on this page · raw message
drivers/char/softdog.c +33 -8
74 lines not on this page · raw message
drivers/char/wdt.c +21 -3
@@ -27,6 +27,7 @@* Tim Hockin : Added insmod parameters, comment cleanup * Parameterized timeout * Tigran Aivazian : Restructured wdt_init() to handle failures +* Joel Becker : Added WDIOC_GET/SETTIMEOUT */ #include <linux/config.h>
@@ -60,8 +61,11 @@static int io=0x240 ;static int irq=11 ; +/* Default margin */ #define WD_TIMO (100*60)/* 1 minute */ +static int wd_margin =WD_TIMO ; +#ifndef MODULE /**
@@ -216,7 +220,7 @@/* Write a watchdog value */ inb_p (WDT_DC );wdt_ctr_mode (1 ,2 ); -wdt_ctr_load (1 ,WD_TIMO );/* Timeout */ +wdt_ctr_load (1 ,wd_margin);/* Timeout */ outb_p (0 ,WDT_DC ); }
@@ -294,10 +298,13 @@static int wdt_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { +int new_margin; +static struct watchdog_info ident= {WDIOF_OVERHEAT |WDIOF_POWERUNDER |WDIOF_POWEROVER - |WDIOF_EXTERN1 |WDIOF_EXTERN2 |WDIOF_FANFAULT , + |WDIOF_EXTERN1 |WDIOF_EXTERN2 |WDIOF_FANFAULT + |WDIOF_SETTIMEOUT ,1 ,"WDT500/501" };
@@ -317,6 +324,17 @@case WDIOC_KEEPALIVE :wdt_ping ();return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, (int *)arg)) +return -EFAULT ; +/* Arbitrary, can't find the card's limits */ +if ((new_margin <0 ) || (new_margin >60 )) +return -EINVAL ; + wd_margin = new_margin *100 ; +wdt_ping (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (wd_margin /100 , (int *)arg); } }
@@ -349,7 +367,7 @@wdt_ctr_mode (1 ,2 );wdt_ctr_mode (2 ,0 );wdt_ctr_load (0 ,8948 );/* count at 100Hz */ -wdt_ctr_load (1 ,WD_TIMO );/* Timeout 120 seconds */ +wdt_ctr_load (1 ,wd_margin);/* Timeout 120 seconds */ wdt_ctr_load (2 ,65535 );outb_p (0 ,WDT_DC );/* Enable */ return 0 ;
drivers/char/wdt285.c +13 -2
@@ -126,10 +126,10 @@static int watchdog_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { -int i; +int i, new_margin;static struct watchdog_info ident= { -0 , +WDIOF_SETTIMEOUT ,0 ,"Footbridge Watchdog" };
@@ -149,6 +149,17 @@case WDIOC_KEEPALIVE :watchdog_ping ();return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, (int *)arg)) +return -EFAULT ; +/* Arbitrary, can't find the card's limits */ +if ((new_marg <0 ) || (new_margin >60 )) +return -EINVAL ; + soft_margin = new_margin; +watchdog_ping (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (soft_margin, (int *)arg); } }
drivers/char/wdt_pci.c +20 -3
@@ -30,6 +30,7 @@* Alan Cox : Split ISA and PCI cards into two drivers * Jeff Garzik : PCI cleanups * Tigran Aivazian : Restructured wdtpci_init_one() to handle failures +* Joel Becker : Added WDIOC_GET/SETTIMEOUT */ #include <linux/config.h>
@@ -81,8 +82,11 @@static int io=0x240 ;static int irq=11 ; +/* Default timeout */ #define WD_TIMO (100*60)/* 1 minute */ +static int wd_margin =WD_TIMO ; +#ifndef MODULE /**
@@ -232,7 +236,7 @@/* Write a watchdog value */ inb_p (WDT_DC );wdtpci_ctr_mode (1 ,2 ); -wdtpci_ctr_load (1 ,WD_TIMO );/* Timeout */ +wdtpci_ctr_load (1 ,wd_margin);/* Timeout */ outb_p (0 ,WDT_DC ); }
@@ -310,10 +314,12 @@static int wdtpci_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { +int new_margin;static struct watchdog_info ident= {WDIOF_OVERHEAT |WDIOF_POWERUNDER |WDIOF_POWEROVER - |WDIOF_EXTERN1 |WDIOF_EXTERN2 |WDIOF_FANFAULT , + |WDIOF_EXTERN1 |WDIOF_EXTERN2 |WDIOF_FANFAULT + |WDIOF_SETTIMEOUT ,1 ,"WDT500/501PCI" };
@@ -333,6 +339,17 @@case WDIOC_KEEPALIVE :wdtpci_ping ();return 0 ; +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, (int *)arg)) +return -EFAULT ; +/* Arbitrary, can't find the card's limits */ +if ((new_margin <0 ) || (new_margin >60 )) +return -EINVAL ; + wd_margin = new_margin *100 ; +wdtpci_ping (); +/* Fall */ +case WDIOC_GETTIMEOUT : +return put_user (wd_margin, (int *)arg); } }
@@ -385,7 +402,7 @@wdtpci_ctr_mode (1 ,2 );wdtpci_ctr_mode (2 ,1 );wdtpci_ctr_load (0 ,20833 );/* count at 100Hz */ -wdtpci_ctr_load (1 ,WD_TIMO );/* Timeout 60 seconds */ +wdtpci_ctr_load (1 ,wd_margin);/* Timeout 60 seconds */ /* DO NOT LOAD CTR2 on PCI card! -- JPN */ outb_p (0 ,WDT_DC );/* Enable */ return 0 ;
drivers/sbus/char/riowatchdog.c +15 -1
@@ -127,7 +127,9 @@static int riowd_ioctl (struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg) { -static struct watchdog_info info = {0 ,0 ,"Natl. Semiconductor PC97317" }; +static struct watchdog_info info = { +WDIOF_SETTIMEOUT ,0 ,"Natl. Semiconductor PC97317" + };unsigned int options;switch (cmd) {
@@ -158,6 +160,18 @@return -EINVAL ;break ; + +case WDIOC_SETTIMEOUT : +if (get_user (new_margin, (int *)arg)) +return -EFAULT ; +if ((new_margin <60 ) || (new_margin > (255 *60 ))) +return -EINVAL ; + riowd_timeout = (new_margin +59 ) /60 ; +riowd_pingtimer (); +/* Fall */ + +case WDIOC_GETTIMEOUT : +return put_user (riowd_timeout *60 , (int *)arg);default :return -EINVAL ;
include/linux/watchdog.h +3 -1
@@ -25,7 +25,8 @@#define WDIOC_GETTEMP _IOR(WATCHDOG_IOCTL_BASE, 3, int)#define WDIOC_SETOPTIONS _IOR(WATCHDOG_IOCTL_BASE, 4, int)#define WDIOC_KEEPALIVE _IOR(WATCHDOG_IOCTL_BASE, 5, int) -#define WDIOC_SETTIMEOUT _IOW(WATCHDOG_IOCTL_BASE, 6, int) +#define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) +#define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int)#define WDIOF_UNKNOWN -1/* Unknown flag error */ #define WDIOS_UNKNOWN -1/* Unknown status error */
@@ -37,6 +38,7 @@#define WDIOF_POWERUNDER 0x0010/* Power bad/power fault */ #define WDIOF_CARDRESET 0x0020/* Card previously reset the CPU */ #define WDIOF_POWEROVER 0x0040/* Power over voltage */ +#define WDIOF_SETTIMEOUT 0x0080/* Set timeout (in seconds) */ #define WDIOF_KEEPALIVEPING 0x8000/* Keep alive ping reply */ #define WDIOS_DISABLECARD 0x0001/* Turn off the watchdog timer */