From: Wim Van Sebroeck Hi Linus, Andrew, please do a bk pull http://linux-watchdog.bkbits.net/linux-2.6-watchdog This will update the following files: drivers/char/watchdog/advantechwdt.c | 2 drivers/char/watchdog/alim7101_wdt.c | 2 drivers/char/watchdog/sa1100_wdt.c | 1 drivers/char/watchdog/w83627hf_wdt.c | 2 drivers/char/watchdog/wafer5823wdt.c | 2 through these ChangeSets: (04/01/02 1.1569) [WATCHDOG] 2.6.0-rc1 - iminor(inode).patch get rid of unnecessary iminor(inode) code in watchdog's open and close functions. (04/01/02 1.1570) [WATCHDOG] 2.6.0-rc1 expect_close.patch Made the behaviour and syntax of expect_close the same for all watchdog-drivers (04/01/02 1.1571) [WATCHDOG] 2.6.0-rc1 i810-tco.c.nowayout.patch Fix nowayout handling to the way all other watchdog-drivers do it (04/01/02 1.1572) [WATCHDOG] 2.6.0-rc1 _is_open.patch Make _is_open code consistent for all watchdog-drivers (04/01/02 1.1573) [WATCHDOG] 2.6.0-rc1 cleanup-spaces-tabs.patch Cleanup of trailing spaces, tabs, ... (04/01/02 1.1574) [WATCHDOG] 2.6.0-rc1 -ENOIOCTLCMD.patch Make the default return value for the ioctl commands that don't exist = -ENOIOCTLCMD (04/01/02 1.1575) [WATCHDOG] 2.6.0-rc1 ib700wdt-version-comment.patch remove "for Linux 2.4.x" in the ib700wdt.c driver (04/01/02 1.1576) [WATCHDOG] 2.6.0-rc1 amd7xx_tco.module_param.patch Made nowayout a module_parameter The ChangeSets can also be looked at on: http://linux-watchdog.bkbits.net:8080/linux-2.6-watchdog For completeness, I added the patches below. Greetings, Wim. ================================================================================ 25-akpm/drivers/char/watchdog/acquirewdt.c | 46 ++++---- 25-akpm/drivers/char/watchdog/advantechwdt.c | 2 25-akpm/drivers/char/watchdog/alim7101_wdt.c | 2 25-akpm/drivers/char/watchdog/amd7xx_tco.c | 83 ++++++++------- 25-akpm/drivers/char/watchdog/cpu5wdt.c | 34 ++---- 25-akpm/drivers/char/watchdog/eurotechwdt.c | 94 ++++++++--------- 25-akpm/drivers/char/watchdog/i810-tco.c | 38 +++--- 25-akpm/drivers/char/watchdog/ib700wdt.c | 64 +++++------ 25-akpm/drivers/char/watchdog/indydog.c | 19 +-- 25-akpm/drivers/char/watchdog/machzwd.c | 148 ++++++++++++--------------- 25-akpm/drivers/char/watchdog/mixcomwd.c | 51 ++++----- 25-akpm/drivers/char/watchdog/pcwd.c | 79 +++++++------- 25-akpm/drivers/char/watchdog/sa1100_wdt.c | 1 25-akpm/drivers/char/watchdog/sc1200wdt.c | 18 +-- 25-akpm/drivers/char/watchdog/scx200_wdt.c | 58 +++++----- 25-akpm/drivers/char/watchdog/shwdt.c | 14 +- 25-akpm/drivers/char/watchdog/softdog.c | 29 ++--- 25-akpm/drivers/char/watchdog/w83627hf_wdt.c | 2 25-akpm/drivers/char/watchdog/wafer5823wdt.c | 2 25-akpm/drivers/char/watchdog/wdt.c | 119 ++++++++++----------- 25-akpm/drivers/char/watchdog/wdt285.c | 12 +- 25-akpm/drivers/char/watchdog/wdt977.c | 15 +- 25-akpm/drivers/char/watchdog/wdt_pci.c | 107 +++++++++---------- 23 files changed, 516 insertions(+), 521 deletions(-) diff -puN drivers/char/watchdog/acquirewdt.c~watchdog-updates drivers/char/watchdog/acquirewdt.c --- 25/drivers/char/watchdog/acquirewdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/acquirewdt.c Fri Jan 2 15:37:58 2004 @@ -263,33 +263,33 @@ static int __init acq_init(void) goto unreg_stop; } - ret = register_reboot_notifier(&acq_notifier); - if (ret != 0) { - printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", - ret); - goto unreg_regions; - } - - ret = misc_register(&acq_miscdev); - if (ret != 0) { - printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", - WATCHDOG_MINOR, ret); - goto unreg_reboot; - } - - printk (KERN_INFO PFX "initialized. (nowayout=%d)\n", - nowayout); - + ret = register_reboot_notifier(&acq_notifier); + if (ret != 0) { + printk (KERN_ERR PFX "cannot register reboot notifier (err=%d)\n", + ret); + goto unreg_regions; + } + + ret = misc_register(&acq_miscdev); + if (ret != 0) { + printk (KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n", + WATCHDOG_MINOR, ret); + goto unreg_reboot; + } + + printk (KERN_INFO PFX "initialized. (nowayout=%d)\n", + nowayout); + out: - return ret; + return ret; unreg_reboot: - unregister_reboot_notifier(&acq_notifier); + unregister_reboot_notifier(&acq_notifier); unreg_regions: - release_region(wdt_start, 1); + release_region(wdt_start, 1); unreg_stop: - if (wdt_stop != wdt_start) - release_region(wdt_stop, 1); - goto out; + if (wdt_stop != wdt_start) + release_region(wdt_stop, 1); + goto out; } static void __exit acq_exit(void) diff -puN drivers/char/watchdog/advantechwdt.c~watchdog-updates drivers/char/watchdog/advantechwdt.c --- 25/drivers/char/watchdog/advantechwdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/advantechwdt.c Fri Jan 2 15:37:58 2004 @@ -183,7 +183,7 @@ advwdt_ioctl(struct inode *inode, struct } default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; } diff -puN drivers/char/watchdog/alim7101_wdt.c~watchdog-updates drivers/char/watchdog/alim7101_wdt.c --- 25/drivers/char/watchdog/alim7101_wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/alim7101_wdt.c Fri Jan 2 15:37:58 2004 @@ -374,7 +374,7 @@ static int __init alim7101_wdt_init(void err_out_miscdev: misc_deregister(&wdt_miscdev); err_out: - return rc; + return rc; } module_init(alim7101_wdt_init); diff -puN drivers/char/watchdog/amd7xx_tco.c~watchdog-updates drivers/char/watchdog/amd7xx_tco.c --- 25/drivers/char/watchdog/amd7xx_tco.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/amd7xx_tco.c Fri Jan 2 15:37:58 2004 @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -45,7 +46,7 @@ #define TCO_TIMEOUT_MASK 0x3f #define TCO_STATUS1_REG 0x44 #define TCO_STATUS2_REG 0x46 -#define NDTO_STS2 (1 << 1) /* we're interested in the second timeout */ +#define NDTO_STS2 (1 << 1) /* we're interested in the second timeout */ #define BOOT_STS (1 << 2) /* will be set if NDTO_STS2 was set before reboot */ #define TCO_CTRL1_REG 0x48 #define TCO_HALT (1 << 11) @@ -57,11 +58,20 @@ static u32 pmbase; /* PMxx I/O base */ static struct pci_dev *dev; static struct semaphore open_sem; static spinlock_t amdtco_lock; /* only for device access */ -static int expect_close = 0; +static char expect_close; -MODULE_PARM(timeout, "i"); +module_param(timeout, int, 0); MODULE_PARM_DESC(timeout, "range is 0-38 seconds, default is 38"); +#ifdef CONFIG_WATCHDOG_NOWAYOUT +static int nowayout = 1; +#else +static int nowayout = 0; +#endif + +module_param(nowayout, int, 0); +MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); + static inline u8 seconds_to_ticks(int seconds) { /* the internal timer is stored as ticks which decrement @@ -124,7 +134,7 @@ static inline void amdtco_global_enable( static inline void amdtco_enable(void) { u16 reg; - + spin_lock(&amdtco_lock); reg = inw(pmbase+TCO_CTRL1_REG); reg &= ~TCO_HALT; @@ -152,13 +162,13 @@ static int amdtco_fop_open(struct inode timeout = MAX_TIMEOUT; amdtco_disable(); - amdtco_settimeout(timeout); + amdtco_settimeout(timeout); amdtco_global_enable(); amdtco_enable(); amdtco_ping(); printk(KERN_INFO PFX "Watchdog enabled, timeout = %ds of %ds\n", amdtco_gettimeout(), timeout); - + return 0; } @@ -170,12 +180,12 @@ static int amdtco_fop_ioctl(struct inode static struct watchdog_info ident = { .options = WDIOF_SETTIMEOUT | WDIOF_CARDRESET, - .identity = "AMD 766/768" + .identity = "AMD 766/768", }; switch (cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof ident)) @@ -184,7 +194,7 @@ static int amdtco_fop_ioctl(struct inode case WDIOC_GETSTATUS: return put_user(amdtco_status(), (int *)arg); - + case WDIOC_KEEPALIVE: amdtco_ping(); return 0; @@ -192,10 +202,10 @@ static int amdtco_fop_ioctl(struct inode case WDIOC_SETTIMEOUT: if (get_user(new_timeout, (int *)arg)) return -EFAULT; - + if (new_timeout < 0) return -EINVAL; - + if (new_timeout > MAX_TIMEOUT) new_timeout = MAX_TIMEOUT; @@ -205,17 +215,17 @@ static int amdtco_fop_ioctl(struct inode case WDIOC_GETTIMEOUT: return put_user(amdtco_gettimeout(), (int *)arg); - + case WDIOC_SETOPTIONS: if (copy_from_user(&tmp, (int *)arg, sizeof tmp)) - return -EFAULT; + return -EFAULT; if (tmp & WDIOS_DISABLECARD) amdtco_disable(); if (tmp & WDIOS_ENABLECARD) amdtco_enable(); - + return 0; } } @@ -223,14 +233,15 @@ static int amdtco_fop_ioctl(struct inode static int amdtco_fop_release(struct inode *inode, struct file *file) { - if (expect_close) { - amdtco_disable(); + if (expect_close == 42) { + amdtco_disable(); printk(KERN_INFO PFX "Watchdog disabled\n"); } else { amdtco_ping(); printk(KERN_CRIT PFX "Unexpected close!, timeout in %d seconds\n", timeout); - } - + } + + expect_close = 0; up(&open_sem); return 0; } @@ -240,21 +251,21 @@ static ssize_t amdtco_fop_write(struct f { if (ppos != &file->f_pos) return -ESPIPE; - - if (len) { -#ifndef CONFIG_WATCHDOG_NOWAYOUT - size_t i; - char c; - expect_close = 0; - - for (i = 0; i != len; i++) { - if (get_user(c, data + i)) - return -EFAULT; - if (c == 'V') - expect_close = 1; + if (len) { + if (!nowayout) + size_t i; + char c; + expect_close = 0; + + for (i = 0; i != len; i++) { + if (get_user(c, data + i)) + return -EFAULT; + + if (c == 'V') + expect_close = 42; + } } -#endif amdtco_ping(); } @@ -273,7 +284,7 @@ static int amdtco_notify_sys(struct noti static struct notifier_block amdtco_notifier = { - .notifier_call = amdtco_notify_sys + .notifier_call = amdtco_notify_sys, }; static struct file_operations amdtco_fops = @@ -282,20 +293,20 @@ static struct file_operations amdtco_fop .write = amdtco_fop_write, .ioctl = amdtco_fop_ioctl, .open = amdtco_fop_open, - .release = amdtco_fop_release + .release = amdtco_fop_release, }; static struct miscdevice amdtco_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &amdtco_fops + .fops = &amdtco_fops, }; static struct pci_device_id amdtco_pci_tbl[] = { /* AMD 766 PCI_IDs here */ { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_OPUS_7443, PCI_ANY_ID, PCI_ANY_ID, }, - { 0, } + { 0, }, }; MODULE_DEVICE_TABLE (pci, amdtco_pci_tbl); @@ -316,7 +327,7 @@ static int __init amdtco_init(void) return -ENODEV; found_one: - + if ((ret = register_reboot_notifier(&amdtco_notifier))) { printk(KERN_ERR PFX "Unable to register reboot notifier err = %d\n", ret); goto out_clean; diff -puN drivers/char/watchdog/cpu5wdt.c~watchdog-updates drivers/char/watchdog/cpu5wdt.c --- 25/drivers/char/watchdog/cpu5wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/cpu5wdt.c Fri Jan 2 15:37:58 2004 @@ -105,8 +105,8 @@ static void cpu5wdt_start(void) { if ( !cpu5wdt_device.queue ) { cpu5wdt_device.queue = 1; - outb(0, port + CPU5WDT_TIME_A_REG); - outb(0, port + CPU5WDT_TIME_B_REG); + outb(0, port + CPU5WDT_TIME_A_REG); + outb(0, port + CPU5WDT_TIME_B_REG); outb(1, port + CPU5WDT_MODE_REG); outb(0, port + CPU5WDT_RESET_REG); outb(0, port + CPU5WDT_ENABLE_REG); @@ -134,23 +134,15 @@ static int cpu5wdt_stop(void) static int cpu5wdt_open(struct inode *inode, struct file *file) { - switch(iminor(inode)) { - case WATCHDOG_MINOR: - if ( test_and_set_bit(0, &cpu5wdt_device.inuse) ) - return -EBUSY; - break; - default: - return -ENODEV; - } + if ( test_and_set_bit(0, &cpu5wdt_device.inuse) ) + return -EBUSY; return 0; } static int cpu5wdt_release(struct inode *inode, struct file *file) { - if(iminor(inode)==WATCHDOG_MINOR) { - clear_bit(0, &cpu5wdt_device.inuse); - } + clear_bit(0, &cpu5wdt_device.inuse); return 0; } @@ -160,15 +152,15 @@ static int cpu5wdt_ioctl(struct inode *i static struct watchdog_info ident = { .options = WDIOF_CARDRESET, - .identity = "CPU5 WDT" + .identity = "CPU5 WDT", }; - + switch(cmd) { case WDIOC_KEEPALIVE: cpu5wdt_reset(); break; - case WDIOC_GETSTATUS: - value = inb(port + CPU5WDT_STATUS_REG); + case WDIOC_GETSTATUS: + value = inb(port + CPU5WDT_STATUS_REG); value = (value >> 2) & 1; if ( copy_to_user((int *)arg, (int *)&value, sizeof(int)) ) return -EFAULT; @@ -191,7 +183,7 @@ static int cpu5wdt_ioctl(struct inode *i } break; default: - return -EINVAL; + return -ENOIOCTLCMD; } return 0; } @@ -200,7 +192,7 @@ static ssize_t cpu5wdt_write(struct file { if ( !count ) return -EIO; - + cpu5wdt_reset(); return count; @@ -217,7 +209,7 @@ static struct file_operations cpu5wdt_fo static struct miscdevice cpu5wdt_misc = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &cpu5wdt_fops + .fops = &cpu5wdt_fops, }; /* init/exit function */ @@ -242,7 +234,7 @@ static int __devinit cpu5wdt_init(void) } /* watchdog reboot? */ - val = inb(port + CPU5WDT_STATUS_REG); + val = inb(port + CPU5WDT_STATUS_REG); val = (val >> 2) & 1; if ( !val ) printk(KERN_INFO PFX "sorry, was my fault\n"); diff -puN drivers/char/watchdog/eurotechwdt.c~watchdog-updates drivers/char/watchdog/eurotechwdt.c --- 25/drivers/char/watchdog/eurotechwdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/eurotechwdt.c Fri Jan 2 15:37:58 2004 @@ -1,5 +1,5 @@ /* - * Eurotech CPU-1220/1410 on board WDT driver for Linux 2.4.x + * Eurotech CPU-1220/1410 on board WDT driver * * (c) Copyright 2001 Ascensit * (c) Copyright 2001 Rodolfo Giometti @@ -64,11 +64,11 @@ static char eur_expect_close; * You must set these - there is no sane way to probe for this board. * You can use eurwdt=x,y to set these now. */ - + static int io = 0x3f0; static int irq = 10; static char *ev = "int"; - + #define WDT_TIMEOUT 60 /* 1 minute */ #ifdef CONFIG_WATCHDOG_NOWAYOUT @@ -81,7 +81,7 @@ MODULE_PARM(nowayout,"i"); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)"); /* - * Some symbolic names + * Some symbolic names */ #define WDT_CTRL_REG 0x30 @@ -92,7 +92,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog can #define WDT_UNIT_SECS 0x80 #define WDT_TIMEOUT_VAL 0xf2 #define WDT_TIMER_CFG 0xf3 - + #ifndef MODULE @@ -104,26 +104,26 @@ MODULE_PARM_DESC(nowayout, "Watchdog can * get the user to tell us the configuration. Sane people build it * modular but the others come here. */ - + static int __init eurwdt_setup(char *str) { int ints[4]; - + str = get_options (str, ARRAY_SIZE(ints), ints); - + if (ints[0] > 0) { io = ints[1]; if (ints[0] > 1) irq = ints[2]; } - + return 1; } - + __setup("eurwdt=", eurwdt_setup); #endif /* !MODULE */ - + MODULE_PARM(io, "i"); MODULE_PARM_DESC(io, "Eurotech WDT io port (default=0x3f0)"); MODULE_PARM(irq, "i"); @@ -162,7 +162,7 @@ static inline void eurwdt_disable_timer( { eurwdt_set_timeout(0); } - + static void eurwdt_activate_timer(void) { eurwdt_disable_timer(); @@ -180,18 +180,18 @@ static void eurwdt_activate_timer(void) eurwdt_write_reg(WDT_TIMER_CFG, irq<<4); eurwdt_write_reg(WDT_UNIT_SEL, WDT_UNIT_SECS); /* we use seconds */ - eurwdt_set_timeout(0); /* the default timeout */ + eurwdt_set_timeout(0); /* the default timeout */ } /* * Kernel methods. */ - + static irqreturn_t eurwdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) { printk(KERN_CRIT "timeout WDT timeout\n"); - + #ifdef ONLY_TESTING printk(KERN_CRIT "Would Reboot.\n"); #else @@ -207,13 +207,13 @@ static irqreturn_t eurwdt_interrupt(int * * Reload counter one with the watchdog timeout. */ - + static void eurwdt_ping(void) { /* Write the watchdog default value */ eurwdt_set_timeout(eurwdt_timeout); } - + /** * eurwdt_write: * @file: file handle to the watchdog @@ -224,14 +224,14 @@ static void eurwdt_ping(void) * A write to a watchdog device is defined as a keepalive signal. Any * write of data will do, as we we don't define content meaning. */ - + static ssize_t eurwdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { /* Can't seek (pwrite) on this device */ if (ppos != &file->f_pos) return -ESPIPE; - + if (count) { if (!nowayout) { size_t i; @@ -262,7 +262,7 @@ loff_t *ppos) * The watchdog API defines a common set of functions for all watchdogs * according to their available features. */ - + static int eurwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { @@ -274,15 +274,15 @@ static int eurwdt_ioctl(struct inode *in int time; int options, retval = -EINVAL; - + switch(cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: return copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident)) ? -EFAULT : 0; - + case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, (int *) arg); @@ -299,8 +299,8 @@ static int eurwdt_ioctl(struct inode *in if (time < 0 || time > 255) return -EINVAL; - eurwdt_timeout = time; - eurwdt_set_timeout(time); + eurwdt_timeout = time; + eurwdt_set_timeout(time); /* Fall */ case WDIOC_GETTIMEOUT: @@ -330,7 +330,7 @@ static int eurwdt_ioctl(struct inode *in * The misc device has been opened. The watchdog device is single * open and on opening we load the counter. */ - + static int eurwdt_open(struct inode *inode, struct file *file) { if (test_and_set_bit(0, &eurwdt_is_open)) @@ -340,7 +340,7 @@ static int eurwdt_open(struct inode *ino eurwdt_activate_timer(); return 0; } - + /** * eurwdt_release: * @inode: inode to board @@ -352,7 +352,7 @@ static int eurwdt_open(struct inode *ino * reboots. In the former case we disable the counters, in the latter * case you have to open it again very soon. */ - + static int eurwdt_release(struct inode *inode, struct file *file) { if (eur_expect_close == 42) { @@ -360,12 +360,12 @@ static int eurwdt_release(struct inode * } else { printk(KERN_CRIT "eurwdt: Unexpected close, not stopping watchdog!\n"); eurwdt_ping(); - } + } clear_bit(0, &eurwdt_is_open); eur_expect_close = 0; return 0; } - + /** * eurwdt_notify_sys: * @this: our notifier block @@ -377,7 +377,7 @@ static int eurwdt_release(struct inode * * test or worse yet during the following fsck. This would suck, in fact * trust me - if it happens it does suck. */ - + static int eurwdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused) { @@ -388,12 +388,12 @@ static int eurwdt_notify_sys(struct noti return NOTIFY_DONE; } - + /* * Kernel Interfaces */ - - + + static struct file_operations eurwdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, @@ -406,18 +406,18 @@ static struct file_operations eurwdt_fop static struct miscdevice eurwdt_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &eurwdt_fops + .fops = &eurwdt_fops, }; - + /* * The WDT card needs to learn about soft shutdowns in order to * turn the timebomb registers off. */ - + static struct notifier_block eurwdt_notifier = { .notifier_call = eurwdt_notify_sys, }; - + /** * cleanup_module: * @@ -427,7 +427,7 @@ static struct notifier_block eurwdt_noti * will not touch PC memory so all is fine. You just have to load a new * module in 60 seconds or reboot. */ - + static void __exit eurwdt_exit(void) { eurwdt_lock_chip(); @@ -438,15 +438,15 @@ static void __exit eurwdt_exit(void) release_region(io, 2); free_irq(irq, NULL); } - + /** * eurwdt_init: * - * Set up the WDT watchdog board. After grabbing the resources + * Set up the WDT watchdog board. After grabbing the resources * we require we need also to unlock the device. * The open() function will actually kick the board off. */ - + static int __init eurwdt_init(void) { int ret; @@ -477,15 +477,15 @@ static int __init eurwdt_init(void) } eurwdt_unlock_chip(); - + ret = 0; printk(KERN_INFO "Eurotech WDT driver 0.01 at %X (Interrupt %d)" - " - timeout event: %s\n", + " - timeout event: %s\n", io, irq, (!strcmp("int", ev) ? "int" : "reboot")); out: return ret; - + outreg: release_region(io, 2); @@ -496,10 +496,10 @@ outmisc: misc_deregister(&eurwdt_miscdev); goto out; } - + module_init(eurwdt_init); module_exit(eurwdt_exit); - + MODULE_AUTHOR("Rodolfo Giometti"); MODULE_DESCRIPTION("Driver for Eurotech CPU-1220/1410 on board watchdog"); MODULE_LICENSE("GPL"); diff -puN drivers/char/watchdog/i810-tco.c~watchdog-updates drivers/char/watchdog/i810-tco.c --- 25/drivers/char/watchdog/i810-tco.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/i810-tco.c Fri Jan 2 15:37:58 2004 @@ -8,7 +8,7 @@ * 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 kernel concepts nor Nils Faerber admit liability nor provide * warranty for any of this software. This material is provided * "AS-IS" and at no charge. @@ -112,7 +112,7 @@ static int tco_timer_start (void) outb (val, TCO1_CNT + 1); val = inb (TCO1_CNT + 1); spin_unlock(&tco_lock); - + if (val & 0x08) return -1; return 0; @@ -131,7 +131,7 @@ static int tco_timer_stop (void) outb (val, TCO1_CNT + 1); val = inb (TCO1_CNT + 1); spin_unlock(&tco_lock); - + if ((val & 0x08) == 0) return -1; return 0; @@ -148,7 +148,7 @@ static int tco_timer_settimer (unsigned /* "Values of 0h-3h are ignored and should not be attempted" */ if (tmrval > 0x3f || tmrval < 0x04) return -1; - + spin_lock(&tco_lock); val = inb (TCO1_TMR); val &= 0xc0; @@ -156,7 +156,7 @@ static int tco_timer_settimer (unsigned outb (val, TCO1_TMR); val = inb (TCO1_TMR); spin_unlock(&tco_lock); - + if ((val & 0x3f) != tmrval) return -1; @@ -197,7 +197,7 @@ static int i810tco_release (struct inode /* * Shut off the timer. */ - if (tco_expect_close == 42 && !nowayout) { + if (tco_expect_close == 42) { tco_timer_stop (); } else { tco_timer_reload (); @@ -217,17 +217,21 @@ static ssize_t i810tco_write (struct fil /* See if we got the magic character 'V' and reload the timer */ if (len) { - size_t i; - - tco_expect_close = 0; + if (!nowayout) { + size_t i; - /* scan to see whether or not we got the magic character */ - for (i = 0; i != len; i++) { - u8 c; - if(get_user(c, data+i)) - return -EFAULT; - if (c == 'V') - tco_expect_close = 42; + /* note: just in case someone wrote the magic character + * five months ago... */ + tco_expect_close = 0; + + /* scan to see whether or not we got the magic character */ + for (i = 0; i != len; i++) { + u8 c; + if(get_user(c, data+i)) + return -EFAULT; + if (c == 'V') + tco_expect_close = 42; + } } /* someone wrote to us, we should reload the timer */ @@ -251,7 +255,7 @@ static int i810tco_ioctl (struct inode * }; switch (cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: if (copy_to_user ((struct watchdog_info *) arg, &ident, sizeof (ident))) diff -puN drivers/char/watchdog/ib700wdt.c~watchdog-updates drivers/char/watchdog/ib700wdt.c --- 25/drivers/char/watchdog/ib700wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/ib700wdt.c Fri Jan 2 15:37:58 2004 @@ -1,5 +1,5 @@ /* - * IB700 Single Board Computer WDT driver for Linux 2.4.x + * IB700 Single Board Computer WDT driver * * (c) Copyright 2001 Charles Howes * @@ -28,7 +28,7 @@ * 14-Dec-2001 Matt Domsch * Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT * Added timeout module option to override default - * + * */ #include @@ -48,9 +48,9 @@ #include #include -static int ibwdt_is_open; +static unsigned long ibwdt_is_open; static spinlock_t ibwdt_lock; -static int expect_close = 0; +static char expect_close; #define PFX "ib700wdt: " @@ -157,7 +157,7 @@ ibwdt_write(struct file *file, const cha if (get_user(c, buf + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } ibwdt_ping(); @@ -174,7 +174,7 @@ ibwdt_ioctl(struct inode *inode, struct static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, .firmware_version = 1, - .identity = "IB700 WDT" + .identity = "IB700 WDT", }; switch (cmd) { @@ -184,9 +184,7 @@ ibwdt_ioctl(struct inode *inode, struct break; case WDIOC_GETSTATUS: - if (copy_to_user((int *)arg, &ibwdt_is_open, sizeof(int))) - return -EFAULT; - break; + return put_user(0, (int *) arg); case WDIOC_KEEPALIVE: ibwdt_ping(); @@ -209,7 +207,7 @@ ibwdt_ioctl(struct inode *inode, struct break; default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; } @@ -217,38 +215,32 @@ ibwdt_ioctl(struct inode *inode, struct static int ibwdt_open(struct inode *inode, struct file *file) { - if (iminor(inode) == WATCHDOG_MINOR) { - spin_lock(&ibwdt_lock); - if (ibwdt_is_open) { - spin_unlock(&ibwdt_lock); - return -EBUSY; - } - if (nowayout) - __module_get(THIS_MODULE); - - /* Activate */ - ibwdt_is_open = 1; - ibwdt_ping(); + spin_lock(&ibwdt_lock); + if (test_and_set_bit(0, &ibwdt_is_open)) { spin_unlock(&ibwdt_lock); - return 0; - } else { - return -ENODEV; + return -EBUSY; } + if (nowayout) + __module_get(THIS_MODULE); + + /* Activate */ + ibwdt_ping(); + spin_unlock(&ibwdt_lock); + return 0; } static int ibwdt_close(struct inode *inode, struct file *file) { - if (iminor(inode) == WATCHDOG_MINOR) { - spin_lock(&ibwdt_lock); - if (expect_close) - outb_p(wd_times[wd_margin], WDT_STOP); - else - printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); + spin_lock(&ibwdt_lock); + if (expect_close == 42) + outb_p(wd_times[wd_margin], WDT_STOP); + else + printk(KERN_CRIT PFX "WDT device closed unexpectedly. WDT will not stop!\n"); - ibwdt_is_open = 0; - spin_unlock(&ibwdt_lock); - } + clear_bit(0, &ibwdt_is_open); + expect_close = 0; + spin_unlock(&ibwdt_lock); return 0; } @@ -282,7 +274,7 @@ static struct file_operations ibwdt_fops static struct miscdevice ibwdt_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &ibwdt_fops + .fops = &ibwdt_fops, }; /* @@ -293,7 +285,7 @@ static struct miscdevice ibwdt_miscdev = static struct notifier_block ibwdt_notifier = { .notifier_call = ibwdt_notify_sys, .next = NULL, - .priority = 0 + .priority = 0, }; static int __init ibwdt_init(void) diff -puN drivers/char/watchdog/indydog.c~watchdog-updates drivers/char/watchdog/indydog.c --- 25/drivers/char/watchdog/indydog.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/indydog.c Fri Jan 2 15:37:58 2004 @@ -7,10 +7,10 @@ * 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. - * + * * based on softdog.c by Alan Cox */ - + #include #include #include @@ -25,8 +25,8 @@ #include static unsigned long indydog_alive; -static struct sgimc_misc_ctrl *mcmisc_regs; -static int expect_close = 0; +static struct sgimc_misc_ctrl *mcmisc_regs; +static char expect_close; #ifdef CONFIG_WATCHDOG_NOWAYOUT static int nowayout = 1; @@ -50,7 +50,7 @@ static void indydog_ping() static int indydog_open(struct inode *inode, struct file *file) { u32 mc_ctrl0; - + if( test_and_set_bit(0,&indydog_alive) ) return -EBUSY; @@ -65,7 +65,7 @@ static int indydog_open(struct inode *in mc_ctrl0 = mcmisc_regs->cpuctrl0 | SGIMC_CCTRL0_WDOG; mcmisc_regs->cpuctrl0 = mc_ctrl0; indydog_ping(); - + printk("Started watchdog timer.\n"); return 0; } @@ -77,8 +77,8 @@ static int indydog_release(struct inode * Lock it in if it's a module and we set nowayout */ - if (expect_close) { - u32 mc_ctrl0 = mcmisc_regs->cpuctrl0; + if (expect_close == 42) { + u32 mc_ctrl0 = mcmisc_regs->cpuctrl0; mc_ctrl0 &= ~SGIMC_CCTRL0_WDOG; mcmisc_regs->cpuctrl0 = mc_ctrl0; printk("Stopped watchdog timer.\n"); @@ -86,6 +86,7 @@ static int indydog_release(struct inode printk(KERN_CRIT "WDT device closed unexpectedly. WDT will not stop!\n"); } clear_bit(0,&indydog_alive); + expect_close = 0; return 0; } @@ -109,7 +110,7 @@ static ssize_t indydog_write(struct file if (get_user(c, data + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } indydog_ping(); diff -puN drivers/char/watchdog/machzwd.c~watchdog-updates drivers/char/watchdog/machzwd.c --- 25/drivers/char/watchdog/machzwd.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/machzwd.c Fri Jan 2 15:37:58 2004 @@ -1,7 +1,7 @@ /* * MachZ ZF-Logic Watchdog Timer driver for Linux - * - * + * + * * 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 @@ -14,14 +14,14 @@ * Author: Fernando Fuganti * * Based on sbc60xxwdt.c by Jakob Oestergaard - * * - * We have two timers (wd#1, wd#2) driven by a 32 KHz clock with the + * + * We have two timers (wd#1, wd#2) driven by a 32 KHz clock with the * following periods: * wd#1 - 2 seconds; * wd#2 - 7.2 ms; - * After the expiration of wd#1, it can generate a NMI, SCI, SMI, or - * a system RESET and it starts wd#2 that unconditionaly will RESET + * After the expiration of wd#1, it can generate a NMI, SCI, SMI, or + * a system RESET and it starts wd#2 that unconditionaly will RESET * the system when the counter reaches zero. * * 14-Dec-2001 Matt Domsch @@ -55,7 +55,7 @@ /* indexes */ /* size */ #define ZFL_VERSION 0x02 /* 16 */ -#define CONTROL 0x10 /* 16 */ +#define CONTROL 0x10 /* 16 */ #define STATUS 0x12 /* 8 */ #define COUNTER_1 0x0C /* 16 */ #define COUNTER_2 0x0E /* 8 */ @@ -111,9 +111,9 @@ MODULE_PARM_DESC(nowayout, "Watchdog can #define PFX "machzwd" static struct watchdog_info zf_info = { - .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, - .firmware_version = 1, - .identity = "ZF-Logic watchdog" + .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, + .firmware_version = 1, + .identity = "ZF-Logic watchdog", }; @@ -130,8 +130,8 @@ module_param(action, int, 0); MODULE_PARM_DESC(action, "after watchdog resets, generate: 0 = RESET(*) 1 = SMI 2 = NMI 3 = SCI"); static int zf_action = GEN_RESET; -static int zf_is_open = 0; -static int zf_expect_close = 0; +static unsigned long zf_is_open; +static char zf_expect_close; static spinlock_t zf_lock; static spinlock_t zf_port_lock; static struct timer_list zf_timer; @@ -225,7 +225,7 @@ static void zf_timer_off(void) del_timer_sync(&zf_timer); spin_lock_irqsave(&zf_port_lock, flags); - /* stop watchdog timer */ + /* stop watchdog timer */ ctrl_reg = zf_get_control(); ctrl_reg |= (ENABLE_WD1|ENABLE_WD2); /* disable wd1 and wd2 */ ctrl_reg &= ~(ENABLE_WD1|ENABLE_WD2); @@ -237,13 +237,13 @@ static void zf_timer_off(void) /* - * start hardware timer + * start hardware timer */ static void zf_timer_on(void) { unsigned int ctrl_reg = 0; unsigned long flags; - + spin_lock_irqsave(&zf_port_lock, flags); zf_writeb(PULSE_LEN, 0xff); @@ -272,26 +272,26 @@ static void zf_ping(unsigned long data) { unsigned int ctrl_reg = 0; unsigned long flags; - + zf_writeb(COUNTER_2, 0xff); if(time_before(jiffies, next_heartbeat)){ dprintk("time_before: %ld\n", next_heartbeat - jiffies); - - /* + + /* * reset event is activated by transition from 0 to 1 on * RESET_WD1 bit and we assume that it is already zero... */ spin_lock_irqsave(&zf_port_lock, flags); - ctrl_reg = zf_get_control(); - ctrl_reg |= RESET_WD1; - zf_set_control(ctrl_reg); - + ctrl_reg = zf_get_control(); + ctrl_reg |= RESET_WD1; + zf_set_control(ctrl_reg); + /* ...and nothing changes until here */ ctrl_reg &= ~(RESET_WD1); - zf_set_control(ctrl_reg); + zf_set_control(ctrl_reg); spin_unlock_irqrestore(&zf_port_lock, flags); zf_timer.expires = jiffies + ZF_HW_TIMEO; @@ -301,7 +301,7 @@ static void zf_ping(unsigned long data) } } -static ssize_t zf_write(struct file *file, const char *buf, size_t count, +static ssize_t zf_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { /* Can't seek (pwrite) on this device */ @@ -317,21 +317,21 @@ static ssize_t zf_write(struct file *fil */ if (!nowayout) { size_t ofs; - - /* + + /* * note: just in case someone wrote the magic character * five months ago... */ zf_expect_close = 0; - + /* now scan */ for (ofs = 0; ofs != count; ofs++){ char c; if (get_user(c, buf + ofs)) return -EFAULT; if (c == 'V'){ - zf_expect_close = 1; - dprintk("zf_expect_close 1\n"); + zf_expect_close = 42; + dprintk("zf_expect_close = 42\n"); } } } @@ -342,7 +342,7 @@ static ssize_t zf_write(struct file *fil */ next_heartbeat = jiffies + ZF_USER_TIMEO; dprintk("user ping at %ld\n", jiffies); - + } return count; @@ -353,22 +353,20 @@ static int zf_ioctl(struct inode *inode, { switch(cmd){ case WDIOC_GETSUPPORT: - if (copy_to_user((struct watchdog_info *)arg, + if (copy_to_user((struct watchdog_info *)arg, &zf_info, sizeof(zf_info))) return -EFAULT; break; - + case WDIOC_GETSTATUS: - if (copy_to_user((int *)arg, &zf_is_open, sizeof(int))) - return -EFAULT; - break; + return put_user(0, (int *) arg); case WDIOC_KEEPALIVE: zf_ping(0); break; default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; @@ -376,47 +374,37 @@ static int zf_ioctl(struct inode *inode, static int zf_open(struct inode *inode, struct file *file) { - switch(iminor(inode)){ - case WATCHDOG_MINOR: - spin_lock(&zf_lock); - if(zf_is_open){ - spin_unlock(&zf_lock); - return -EBUSY; - } - - if (nowayout) - __module_get(THIS_MODULE); + spin_lock(&zf_lock); + if(test_and_set_bit(0, &zf_is_open)) { + spin_unlock(&zf_lock); + return -EBUSY; + } - zf_is_open = 1; + if (nowayout) + __module_get(THIS_MODULE); - spin_unlock(&zf_lock); + spin_unlock(&zf_lock); - zf_timer_on(); + zf_timer_on(); - return 0; - default: - return -ENODEV; - } + return 0; } static int zf_close(struct inode *inode, struct file *file) { - if(iminor(inode) == WATCHDOG_MINOR){ + if(zf_expect_close == 42){ + zf_timer_off(); + } else { + del_timer(&zf_timer); + printk(KERN_ERR PFX ": device file closed unexpectedly. Will not stop the WDT!\n"); + } - if(zf_expect_close){ - zf_timer_off(); - } else { - del_timer(&zf_timer); - printk(KERN_ERR PFX ": device file closed unexpectedly. Will not stop the WDT!\n"); - } - - spin_lock(&zf_lock); - zf_is_open = 0; - spin_unlock(&zf_lock); + spin_lock(&zf_lock); + clear_bit(0, &zf_is_open); + spin_unlock(&zf_lock); + + zf_expect_close = 0; - zf_expect_close = 0; - } - return 0; } @@ -428,9 +416,9 @@ static int zf_notify_sys(struct notifier void *unused) { if(code == SYS_DOWN || code == SYS_HALT){ - zf_timer_off(); + zf_timer_off(); } - + return NOTIFY_DONE; } @@ -448,9 +436,9 @@ static struct file_operations zf_fops = static struct miscdevice zf_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &zf_fops + .fops = &zf_fops, }; - + /* * The device needs to learn about soft shutdowns in order to @@ -459,20 +447,20 @@ static struct miscdevice zf_miscdev = { static struct notifier_block zf_notifier = { .notifier_call = zf_notify_sys, .next = NULL, - .priority = 0 + .priority = 0, }; static void __init zf_show_action(int act) { char *str[] = { "RESET", "SMI", "NMI", "SCI" }; - + printk(KERN_INFO PFX ": Watchdog using action = %s\n", str[act]); } static int __init zf_init(void) { int ret; - + printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); ret = zf_get_ZFL_version(); @@ -486,12 +474,12 @@ static int __init zf_init(void) zf_action = zf_action>>action; } else action = 0; - + zf_show_action(action); spin_lock_init(&zf_lock); spin_lock_init(&zf_port_lock); - + ret = misc_register(&zf_miscdev); if (ret){ printk(KERN_ERR "can't misc_register on minor=%d\n", @@ -512,7 +500,7 @@ static int __init zf_init(void) ret); goto no_reboot; } - + zf_set_status(0); zf_set_control(0); @@ -520,7 +508,7 @@ static int __init zf_init(void) init_timer(&zf_timer); zf_timer.function = zf_ping; zf_timer.data = 0; - + return 0; no_reboot: @@ -531,11 +519,11 @@ out: return ret; } - + void __exit zf_exit(void) { zf_timer_off(); - + misc_deregister(&zf_miscdev); unregister_reboot_notifier(&zf_notifier); release_region(ZF_IOBASE, 3); diff -puN drivers/char/watchdog/mixcomwd.c~watchdog-updates drivers/char/watchdog/mixcomwd.c --- 25/drivers/char/watchdog/mixcomwd.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/mixcomwd.c Fri Jan 2 15:37:58 2004 @@ -30,11 +30,11 @@ * * Version 0.5 (2001/12/14) Matt Domsch * - added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT - * + * */ -#define VERSION "0.5" - +#define VERSION "0.5" + #include #include #include @@ -55,12 +55,12 @@ static int mixcomwd_ioports[] = { 0x180, #define FLASHCOM_WATCHDOG_OFFSET 0x4 #define FLASHCOM_ID 0x18 -static long mixcomwd_opened; /* long req'd for setbit --RR */ +static unsigned long mixcomwd_opened; /* long req'd for setbit --RR */ static int watchdog_port; static int mixcomwd_timer_alive; static struct timer_list mixcomwd_timer = TIMER_INITIALIZER(NULL, 0, 0); -static int expect_close = 0; +static char expect_close; #ifdef CONFIG_WATCHDOG_NOWAYOUT static int nowayout = 1; @@ -80,21 +80,21 @@ static void mixcomwd_ping(void) static void mixcomwd_timerfun(unsigned long d) { mixcomwd_ping(); - + mod_timer(&mixcomwd_timer,jiffies+ 5*HZ); } /* * Allow only one person to hold it open */ - + static int mixcomwd_open(struct inode *inode, struct file *file) { if(test_and_set_bit(0,&mixcomwd_opened)) { return -EBUSY; } mixcomwd_ping(); - + if (nowayout) { /* * fops_get() code via open() has already done @@ -113,7 +113,7 @@ static int mixcomwd_open(struct inode *i static int mixcomwd_release(struct inode *inode, struct file *file) { - if (expect_close) { + if (expect_close == 42) { if(mixcomwd_timer_alive) { printk(KERN_ERR "mixcomwd: release called while internal timer alive"); return -EBUSY; @@ -129,6 +129,7 @@ static int mixcomwd_release(struct inode } clear_bit(0,&mixcomwd_opened); + expect_close=0; return 0; } @@ -152,7 +153,7 @@ static ssize_t mixcomwd_write(struct fil if (get_user(c, data + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } mixcomwd_ping(); @@ -167,9 +168,9 @@ static int mixcomwd_ioctl(struct inode * static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_MAGICCLOSE, .firmware_version = 1, - .identity = "MixCOM watchdog" + .identity = "MixCOM watchdog", }; - + switch(cmd) { case WDIOC_GETSTATUS: @@ -182,7 +183,7 @@ static int mixcomwd_ioctl(struct inode * } break; case WDIOC_GETSUPPORT: - if (copy_to_user((struct watchdog_info *)arg, &ident, + if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) { return -EFAULT; } @@ -191,7 +192,7 @@ static int mixcomwd_ioctl(struct inode * mixcomwd_ping(); break; default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; } @@ -207,9 +208,9 @@ static struct file_operations mixcomwd_f static struct miscdevice mixcomwd_miscdev= { - WATCHDOG_MINOR, - "watchdog", - &mixcomwd_fops + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &mixcomwd_fops, }; static int __init mixcomwd_checkcard(int port) @@ -220,7 +221,7 @@ static int __init mixcomwd_checkcard(int if (!request_region(port, 1, "MixCOM watchdog")) { return 0; } - + id=inb_p(port) & 0x3f; if(id!=MIXCOM_ID) { release_region(port, 1); @@ -232,12 +233,12 @@ static int __init mixcomwd_checkcard(int static int __init flashcom_checkcard(int port) { int id; - + port += FLASHCOM_WATCHDOG_OFFSET; if (!request_region(port, 1, "MixCOM watchdog")) { return 0; } - + id=inb_p(port); if(id!=FLASHCOM_ID) { release_region(port, 1); @@ -245,7 +246,7 @@ static int __init flashcom_checkcard(int } return port; } - + static int __init mixcomwd_init(void) { int i; @@ -258,7 +259,7 @@ static int __init mixcomwd_init(void) found = 1; } } - + /* The FlashCOM card can be set up at 0x300 -> 0x378, in 0x8 jumps */ for (i = 0x300; !found && i < 0x380; i+=0x8) { watchdog_port = flashcom_checkcard(i); @@ -266,7 +267,7 @@ static int __init mixcomwd_init(void) found = 1; } } - + if (!found) { printk("mixcomwd: No card detected, or port not available.\n"); return -ENODEV; @@ -278,11 +279,11 @@ static int __init mixcomwd_init(void) release_region(watchdog_port, 1); return ret; } - + printk(KERN_INFO "MixCOM watchdog driver v%s, watchdog port at 0x%3x\n",VERSION,watchdog_port); return 0; -} +} static void __exit mixcomwd_exit(void) { diff -puN drivers/char/watchdog/pcwd.c~watchdog-updates drivers/char/watchdog/pcwd.c --- 25/drivers/char/watchdog/pcwd.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/pcwd.c Fri Jan 2 15:37:58 2004 @@ -34,7 +34,7 @@ * 971222 Changed open/close for temperature handling * Michael Meskes . * 980112 Used minor numbers from include/linux/miscdevice.h - * 990403 Clear reset status after reading control status register in + * 990403 Clear reset status after reading control status register in * pcwd_showprevstate(). [Marc Boucher ] * 990605 Made changes to code to support Firmware 1.22a, added * fairly useless proc entry. @@ -86,10 +86,10 @@ static int pcwd_ioports[] = { 0x270, 0x3 #define WD_TIMEOUT 4 /* 2 seconds for a timeout */ static int timeout_val = WD_TIMEOUT; static int timeout = 2; -static int expect_close = 0; +static char expect_close; module_param(timeout, int, 0); -MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds (default=2)"); +MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds (default=2)"); #ifdef CONFIG_WATCHDOG_NOWAYOUT static int nowayout = 1; @@ -248,14 +248,14 @@ static int pcwd_ioctl(struct inode *inod int cdat, rv; static struct watchdog_info ident= { - WDIOF_OVERHEAT|WDIOF_CARDRESET, - 1, - "PCWD" + .options = WDIOF_OVERHEAT|WDIOF_CARDRESET, + .firmware_version = 1, + .identity = "PCWD", }; switch(cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: if(copy_to_user((void*)arg, &ident, sizeof(ident))) @@ -264,19 +264,19 @@ static int pcwd_ioctl(struct inode *inod case WDIOC_GETSTATUS: spin_lock(&io_lock); - if (revision == PCWD_REVISION_A) + if (revision == PCWD_REVISION_A) cdat = inb(current_readport); else cdat = inb(current_readport + 1 ); spin_unlock(&io_lock); rv = WDIOF_MAGICCLOSE; - if (revision == PCWD_REVISION_A) + if (revision == PCWD_REVISION_A) { if (cdat & WD_WDRST) rv |= WDIOF_CARDRESET; - if (cdat & WD_T110) + if (cdat & WD_T110) { rv |= WDIOF_OVERHEAT; @@ -286,12 +286,12 @@ static int pcwd_ioctl(struct inode *inod } } } - else + else { if (cdat & 0x01) rv |= WDIOF_CARDRESET; - if (cdat & 0x04) + if (cdat & 0x04) { rv |= WDIOF_OVERHEAT; @@ -309,7 +309,7 @@ static int pcwd_ioctl(struct inode *inod case WDIOC_GETBOOTSTATUS: rv = 0; - if (revision == PCWD_REVISION_A) + if (revision == PCWD_REVISION_A) { if (initial_status & WD_WDRST) rv |= WDIOF_CARDRESET; @@ -333,7 +333,7 @@ static int pcwd_ioctl(struct inode *inod case WDIOC_GETTEMP: rv = 0; - if ((supports_temp) && (mode_debug == 0)) + if ((supports_temp) && (mode_debug == 0)) { spin_lock(&io_lock); rv = inb(current_readport); @@ -345,19 +345,19 @@ static int pcwd_ioctl(struct inode *inod return 0; case WDIOC_SETOPTIONS: - if (revision == PCWD_REVISION_C) + if (revision == PCWD_REVISION_C) { if(copy_from_user(&rv, (int*) arg, sizeof(int))) return -EFAULT; - if (rv & WDIOS_DISABLECARD) + if (rv & WDIOS_DISABLECARD) { spin_lock(&io_lock); outb_p(0xA5, current_readport + 3); outb_p(0xA5, current_readport + 3); cdat = inb_p(current_readport + 2); spin_unlock(&io_lock); - if ((cdat & 0x10) == 0) + if ((cdat & 0x10) == 0) { printk(KERN_INFO "pcwd: Could not disable card.\n"); return -EIO; @@ -366,13 +366,13 @@ static int pcwd_ioctl(struct inode *inod return 0; } - if (rv & WDIOS_ENABLECARD) + if (rv & WDIOS_ENABLECARD) { spin_lock(&io_lock); outb_p(0x00, current_readport + 3); cdat = inb_p(current_readport + 2); spin_unlock(&io_lock); - if (cdat & 0x10) + if (cdat & 0x10) { printk(KERN_INFO "pcwd: Could not enable card.\n"); return -EIO; @@ -380,13 +380,13 @@ static int pcwd_ioctl(struct inode *inod return 0; } - if (rv & WDIOS_TEMPPANIC) + if (rv & WDIOS_TEMPPANIC) { temp_panic = 1; } } return -EINVAL; - + case WDIOC_KEEPALIVE: pcwd_send_heartbeat(); return 0; @@ -415,7 +415,7 @@ static ssize_t pcwd_write(struct file *f if (get_user(c, buf + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } pcwd_send_heartbeat(); @@ -456,14 +456,14 @@ static ssize_t pcwd_read(struct file *fi /* Can't seek (pread) on this device */ if (ppos != &file->f_pos) return -ESPIPE; - switch(iminor(file->f_dentry->d_inode)) + switch(iminor(file->f_dentry->d_inode)) { case TEMP_MINOR: /* * Convert metric to Fahrenheit, since this was * the decided 'standard' for this return value. */ - + c = inb(current_readport); cp = (c * 9 / 5) + 32; if(copy_to_user(buf, &cp, 1)) @@ -477,7 +477,7 @@ static ssize_t pcwd_read(struct file *fi static int pcwd_close(struct inode *ino, struct file *filep) { if (iminor(ino)==WATCHDOG_MINOR) { - if (expect_close) { + if (expect_close == 42) { /* Disable the board */ if (revision == PCWD_REVISION_C) { spin_lock(&io_lock); @@ -488,6 +488,7 @@ static int pcwd_close(struct inode *ino, atomic_inc( &open_allowed ); } } + expect_close = 0; return 0; } @@ -500,7 +501,7 @@ static inline void get_support(void) static inline int get_revision(void) { int r = PCWD_REVISION_C; - + spin_lock(&io_lock); if ((inb(current_readport + 2) == 0xFF) || (inb(current_readport + 3) == 0xFF)) @@ -576,29 +577,29 @@ static struct file_operations pcwd_fops }; static struct miscdevice pcwd_miscdev = { - WATCHDOG_MINOR, - "watchdog", - &pcwd_fops + .minor = WATCHDOG_MINOR, + .name = "watchdog", + .fops = &pcwd_fops, }; static struct miscdevice temp_miscdev = { - TEMP_MINOR, - "temperature", - &pcwd_fops + .minor = TEMP_MINOR, + .name = "temperature", + .fops = &pcwd_fops, }; - + static void __init pcwd_validate_timeout(void) { timeout_val = timeout * 2; } - + static int __init pcwatchdog_init(void) { char *firmware; int i, found = 0; pcwd_validate_timeout(); spin_lock_init(&io_lock); - + revision = PCWD_REVISION_A; printk(KERN_INFO "pcwd: v%s Ken Hollis (kenji@bitgate.com)\n", WD_VER); @@ -660,11 +661,11 @@ static int __init pcwatchdog_init(void) if (misc_register(&pcwd_miscdev)) return -ENODEV; - + if (supports_temp) if (misc_register(&temp_miscdev)) { misc_deregister(&pcwd_miscdev); - return -ENODEV; + return -ENODEV; } @@ -673,10 +674,10 @@ static int __init pcwatchdog_init(void) misc_deregister(&pcwd_miscdev); if (supports_temp) misc_deregister(&pcwd_miscdev); - return -EIO; + return -EIO; } } - else + else if (!request_region(current_readport, 4, "PCWD Rev.C (Berkshire)")) { misc_deregister(&pcwd_miscdev); if (supports_temp) diff -puN drivers/char/watchdog/sa1100_wdt.c~watchdog-updates drivers/char/watchdog/sa1100_wdt.c --- 25/drivers/char/watchdog/sa1100_wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/sa1100_wdt.c Fri Jan 2 15:37:58 2004 @@ -77,6 +77,7 @@ static int sa1100dog_release(struct inod } clear_bit(1, &sa1100wdt_users); + expect_close = 0; return 0; } diff -puN drivers/char/watchdog/sc1200wdt.c~watchdog-updates drivers/char/watchdog/sc1200wdt.c --- 25/drivers/char/watchdog/sc1200wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/sc1200wdt.c Fri Jan 2 15:37:58 2004 @@ -175,12 +175,12 @@ static int sc1200wdt_ioctl(struct inode static struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE, .firmware_version = 0, - .identity = "PC87307/PC97307" + .identity = "PC87307/PC97307", }; switch (cmd) { default: - return -ENOTTY; /* Keep Pavel Machek amused ;) */ + return -ENOIOCTLCMD; /* Keep Pavel Machek amused ;) */ case WDIOC_GETSUPPORT: if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof ident)) @@ -256,7 +256,7 @@ static ssize_t sc1200wdt_write(struct fi { if (ppos != &file->f_pos) return -ESPIPE; - + if (len) { if (!nowayout) { size_t i; @@ -292,7 +292,7 @@ static int sc1200wdt_notify_sys(struct n static struct notifier_block sc1200wdt_notifier = { - notifier_call: sc1200wdt_notify_sys + .notifier_call = sc1200wdt_notify_sys, }; static struct file_operations sc1200wdt_fops = @@ -301,7 +301,7 @@ static struct file_operations sc1200wdt_ .write = sc1200wdt_write, .ioctl = sc1200wdt_ioctl, .open = sc1200wdt_open, - .release = sc1200wdt_release + .release = sc1200wdt_release, }; static struct miscdevice sc1200wdt_miscdev = @@ -320,7 +320,7 @@ static int __init sc1200wdt_probe(void) * Nb. This could be done with accuracy by reading the SID registers, but * we don't have access to those io regions. */ - + unsigned char reg; sc1200wdt_read_data(PMC3, ®); @@ -334,7 +334,7 @@ static int __init sc1200wdt_probe(void) struct pnp_device_id scl200wdt_pnp_devices[] = { /* National Semiconductor PC87307/PC97307 watchdog component */ {.id = "NSC0800", .driver_data = 0}, - {.id = ""} + {.id = ""}, }; static int scl200wdt_pnp_probe(struct pnp_dev * dev, const struct pnp_device_id *dev_id) @@ -409,7 +409,7 @@ static int __init sc1200wdt_init(void) ret = -EBUSY; goto out_clean; } - + ret = sc1200wdt_probe(); if (ret) goto out_io; @@ -438,7 +438,7 @@ out_io: release_region(io, io_len); goto out_clean; -} +} static void __exit sc1200wdt_exit(void) diff -puN drivers/char/watchdog/scx200_wdt.c~watchdog-updates drivers/char/watchdog/scx200_wdt.c --- 25/drivers/char/watchdog/scx200_wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/scx200_wdt.c Fri Jan 2 15:37:58 2004 @@ -1,4 +1,4 @@ -/* linux/drivers/char/scx200_wdt.c +/* drivers/char/watchdog/scx200_wdt.c National Semiconductor SCx200 Watchdog support @@ -51,7 +51,7 @@ MODULE_PARM_DESC(nowayout, "Disable watc static u16 wdto_restart; static struct semaphore open_semaphore; -static unsigned expect_close; +static char expect_close; /* Bits of the WDCNFG register */ #define W_ENABLE 0x00fa /* Enable watchdog */ @@ -73,7 +73,7 @@ static void scx200_wdt_update_margin(voi static void scx200_wdt_enable(void) { - printk(KERN_DEBUG NAME ": enabling watchdog timer, wdto_restart = %d\n", + printk(KERN_DEBUG NAME ": enabling watchdog timer, wdto_restart = %d\n", wdto_restart); outw(0, SCx200_CB_BASE + SCx200_WDT_WDTO); @@ -86,7 +86,7 @@ static void scx200_wdt_enable(void) static void scx200_wdt_disable(void) { printk(KERN_DEBUG NAME ": disabling watchdog timer\n"); - + outw(0, SCx200_CB_BASE + SCx200_WDT_WDTO); outb(SCx200_WDT_WDSTS_WDOVF, SCx200_CB_BASE + SCx200_WDT_WDSTS); outw(W_DISABLE, SCx200_CB_BASE + SCx200_WDT_WDCNFG); @@ -94,50 +94,50 @@ static void scx200_wdt_disable(void) static int scx200_wdt_open(struct inode *inode, struct file *file) { - /* only allow one at a time */ - if (down_trylock(&open_semaphore)) - return -EBUSY; + /* only allow one at a time */ + if (down_trylock(&open_semaphore)) + return -EBUSY; scx200_wdt_enable(); - expect_close = 0; return 0; } static int scx200_wdt_release(struct inode *inode, struct file *file) { - if (!expect_close) { + if (expect_close != 42) { printk(KERN_WARNING NAME ": watchdog device closed unexpectedly, will not disable the watchdog timer\n"); } else if (!nowayout) { scx200_wdt_disable(); } - up(&open_semaphore); + expect_close = 0; + up(&open_semaphore); return 0; } -static int scx200_wdt_notify_sys(struct notifier_block *this, +static int scx200_wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused) { - if (code == SYS_HALT || code == SYS_POWER_OFF) + if (code == SYS_HALT || code == SYS_POWER_OFF) if (!nowayout) scx200_wdt_disable(); - return NOTIFY_DONE; + return NOTIFY_DONE; } static struct notifier_block scx200_wdt_notifier = { - .notifier_call = scx200_wdt_notify_sys + .notifier_call = scx200_wdt_notify_sys, }; -static ssize_t scx200_wdt_write(struct file *file, const char *data, +static ssize_t scx200_wdt_write(struct file *file, const char *data, size_t len, loff_t *ppos) { if (ppos != &file->f_pos) return -ESPIPE; /* check for a magic close character */ - if (len) + if (len) { size_t i; @@ -149,7 +149,7 @@ static ssize_t scx200_wdt_write(struct f if (get_user(c, data+i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } return len; @@ -163,16 +163,16 @@ static int scx200_wdt_ioctl(struct inode { static struct watchdog_info ident = { .identity = "NatSemi SCx200 Watchdog", - .firmware_version = 1, + .firmware_version = 1, .options = (WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING), }; int new_margin; - + switch (cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: - if(copy_to_user((struct watchdog_info *)arg, &ident, + if(copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) return -EFAULT; return 0; @@ -220,7 +220,7 @@ static int __init scx200_wdt_init(void) printk(KERN_DEBUG NAME ": NatSemi SCx200 Watchdog Driver\n"); /* First check that this really is a NatSemi SCx200 CPU */ - if ((pci_find_device(PCI_VENDOR_ID_NS, + if ((pci_find_device(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE, NULL)) == NULL) return -ENODEV; @@ -231,8 +231,8 @@ static int __init scx200_wdt_init(void) return -ENODEV; } - if (!request_region(SCx200_CB_BASE + SCx200_WDT_OFFSET, - SCx200_WDT_SIZE, + if (!request_region(SCx200_CB_BASE + SCx200_WDT_OFFSET, + SCx200_WDT_SIZE, "NatSemi SCx200 Watchdog")) { printk(KERN_WARNING NAME ": watchdog I/O region busy\n"); return -EBUSY; @@ -251,20 +251,20 @@ static int __init scx200_wdt_init(void) } r = register_reboot_notifier(&scx200_wdt_notifier); - if (r) { - printk(KERN_ERR NAME ": unable to register reboot notifier"); + if (r) { + printk(KERN_ERR NAME ": unable to register reboot notifier"); misc_deregister(&scx200_wdt_miscdev); release_region(SCx200_CB_BASE + SCx200_WDT_OFFSET, SCx200_WDT_SIZE); - return r; - } + return r; + } return 0; } static void __exit scx200_wdt_cleanup(void) { - unregister_reboot_notifier(&scx200_wdt_notifier); + unregister_reboot_notifier(&scx200_wdt_notifier); misc_deregister(&scx200_wdt_miscdev); release_region(SCx200_CB_BASE + SCx200_WDT_OFFSET, SCx200_WDT_SIZE); diff -puN drivers/char/watchdog/shwdt.c~watchdog-updates drivers/char/watchdog/shwdt.c --- 25/drivers/char/watchdog/shwdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/shwdt.c Fri Jan 2 15:37:58 2004 @@ -36,7 +36,7 @@ /* * Default clock division ratio is 5.25 msecs. For an additional table of * values, consult the asm-sh/watchdog.h. Overload this at module load - * time. + * time. * * In order for this to work reliably we need to have HZ set to 1000 or * something quite higher than 100 (or we need a proper high-res timer @@ -122,7 +122,7 @@ static void sh_wdt_start(void) csr = sh_wdt_read_rstcsr(); csr &= ~RSTCSR_RSTS; sh_wdt_write_rstcsr(csr); -#endif +#endif } /** @@ -202,7 +202,7 @@ static int sh_wdt_close(struct inode *in clear_bit(0, &shwdt_is_open); shwdt_expect_close = 0; - + return 0; } @@ -264,7 +264,7 @@ static int sh_wdt_ioctl(struct inode *in sizeof(sh_wdt_info))) { return -EFAULT; } - + break; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: @@ -299,11 +299,11 @@ static int sh_wdt_ioctl(struct inode *in sh_wdt_start(); retval = 0; } - + return retval; } default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; @@ -311,7 +311,7 @@ static int sh_wdt_ioctl(struct inode *in /** * sh_wdt_notify_sys - Notifier Handler - * + * * @this: notifier block * @code: notifier event * @unused: unused diff -puN drivers/char/watchdog/softdog.c~watchdog-updates drivers/char/watchdog/softdog.c --- 25/drivers/char/watchdog/softdog.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/softdog.c Fri Jan 2 15:37:58 2004 @@ -8,10 +8,10 @@ * 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. + * + * 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 * @@ -28,14 +28,14 @@ * Made SMP safe for 2.3.x * * 20011127 Joel Becker (jlbec@evilplan.org> - * Added soft_noboot; Allows testing the softdog trigger without + * Added soft_noboot; Allows testing the softdog trigger without * requiring a recompile. * Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT. * * 20020530 Joel Becker * Added Matt Domsch's nowayout module option. */ - + #include #include #include @@ -49,7 +49,7 @@ #define TIMER_MARGIN 60 /* (secs) Default is 1 minute */ -static int expect_close = 0; +static char expect_close; static int soft_margin = TIMER_MARGIN; /* in seconds */ #ifdef ONLY_TESTING static int soft_noboot = 1; @@ -73,7 +73,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog can /* * Our timer */ - + static void watchdog_fire(unsigned long); static struct timer_list watchdog_ticktock = @@ -84,7 +84,7 @@ static unsigned long timer_alive; /* * If the timer expires.. */ - + static void watchdog_fire(unsigned long data) { if (soft_noboot) @@ -100,12 +100,12 @@ static void watchdog_fire(unsigned long /* * Allow only one person to hold it open */ - + static int softdog_open(struct inode *inode, struct file *file) { if(test_and_set_bit(0, &timer_alive)) return -EBUSY; - if (nowayout) + if (nowayout) __module_get(THIS_MODULE); /* * Activate timer @@ -120,12 +120,13 @@ static int softdog_release(struct inode * Shut off the timer. * Lock it in if it's a module and we set nowayout */ - if (expect_close) { + if (expect_close == 42) { del_timer(&watchdog_ticktock); } else { printk(KERN_CRIT "SOFTDOG: WDT device closed unexpectedly. WDT will not stop!\n"); } clear_bit(0, &timer_alive); + expect_close = 0; return 0; } @@ -151,7 +152,7 @@ static ssize_t softdog_write(struct file if (get_user(c, data + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } mod_timer(&watchdog_ticktock, jiffies+(soft_margin*HZ)); @@ -169,7 +170,7 @@ static int softdog_ioctl(struct inode *i }; switch (cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: if(copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) return -EFAULT; diff -puN drivers/char/watchdog/w83627hf_wdt.c~watchdog-updates drivers/char/watchdog/w83627hf_wdt.c --- 25/drivers/char/watchdog/w83627hf_wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/w83627hf_wdt.c Fri Jan 2 15:37:58 2004 @@ -184,7 +184,7 @@ wdt_ioctl(struct inode *inode, struct fi } default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; } diff -puN drivers/char/watchdog/wafer5823wdt.c~watchdog-updates drivers/char/watchdog/wafer5823wdt.c --- 25/drivers/char/watchdog/wafer5823wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/wafer5823wdt.c Fri Jan 2 15:37:58 2004 @@ -182,7 +182,7 @@ static int wafwdt_ioctl(struct inode *in } default: - return -ENOTTY; + return -ENOIOCTLCMD; } return 0; } diff -puN drivers/char/watchdog/wdt285.c~watchdog-updates drivers/char/watchdog/wdt285.c --- 25/drivers/char/watchdog/wdt285.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/wdt285.c Fri Jan 2 15:37:58 2004 @@ -12,9 +12,9 @@ * 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. - * + * */ - + #include #include #include @@ -79,7 +79,7 @@ static int watchdog_open(struct inode *i *CSR_TIMER4_CLR = 0; watchdog_ping(); - *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD + *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD | TIMER_CNTL_DIV256; #ifdef ONLY_TESTING @@ -132,7 +132,7 @@ watchdog_write(struct file *file, const static struct watchdog_info ident = { .options = WDIOF_SETTIMEOUT, - .identity = "Footbridge Watchdog" + .identity = "Footbridge Watchdog", }; static int @@ -192,7 +192,7 @@ static struct file_operations watchdog_f static struct miscdevice watchdog_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &watchdog_fops + .fops = &watchdog_fops, }; static int __init footbridge_watchdog_init(void) @@ -206,7 +206,7 @@ static int __init footbridge_watchdog_in if (retval < 0) return retval; - printk("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n", + printk("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n", soft_margin); if (machine_is_cats()) diff -puN drivers/char/watchdog/wdt977.c~watchdog-updates drivers/char/watchdog/wdt977.c --- 25/drivers/char/watchdog/wdt977.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/wdt977.c Fri Jan 2 15:37:58 2004 @@ -43,7 +43,7 @@ static int timeout = DEFAULT_TIMEOUT*60; static int timeoutM = DEFAULT_TIMEOUT; /* timeout in minutes */ static unsigned long timer_alive; static int testmode; -static int expect_close = 0; +static char expect_close; module_param(timeout, int, 0); MODULE_PARM_DESC(timeout,"Watchdog timeout in seconds (60..15300), default=60"); @@ -165,7 +165,7 @@ static int wdt977_release(struct inode * * Shut off the timer. * Lock it in if it's a module and we set nowayout */ - if (!nowayout) + if (expect_close == 42) { /* unlock the SuperIO chip */ outb(0x87,0x370); @@ -202,6 +202,7 @@ static int wdt977_release(struct inode * } else { printk(KERN_CRIT "WDT device closed unexpectedly. WDT will not stop!\n"); } + expect_close = 0; return 0; } @@ -235,7 +236,7 @@ static ssize_t wdt977_write(struct file if (get_user(c, buf + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } @@ -257,18 +258,18 @@ static ssize_t wdt977_write(struct file static struct watchdog_info ident = { .options = WDIOF_SETTIMEOUT, - .identity = "Winbond 83977" + .identity = "Winbond 83977", }; static int wdt977_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) + unsigned int cmd, unsigned long arg) { int temp; switch(cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: return copy_to_user((struct watchdog_info *)arg, &ident, @@ -341,7 +342,7 @@ static struct miscdevice wdt977_miscdev= { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &wdt977_fops + .fops = &wdt977_fops, }; static int __init nwwatchdog_init(void) diff -puN drivers/char/watchdog/wdt.c~watchdog-updates drivers/char/watchdog/wdt.c --- 25/drivers/char/watchdog/wdt.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/wdt.c Fri Jan 2 15:37:58 2004 @@ -8,10 +8,10 @@ * 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. + * + * 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 * @@ -49,13 +49,13 @@ #include "wd501p.h" static unsigned long wdt_is_open; -static int expect_close; +static char expect_close; /* * You must set these - there is no sane way to probe for this board. * You can use wdt=x,y to set these now. */ - + static int io=0x240; static int irq=11; @@ -80,10 +80,10 @@ MODULE_PARM_DESC(nowayout, "Watchdog can * @str: command line string * * Setup options. The board isn't really probe-able so we have to - * get the user to tell us the configuration. Sane people build it + * get the user to tell us the configuration. Sane people build it * modular but the others come here. */ - + static int __init wdt_setup(char *str) { int ints[4]; @@ -108,11 +108,11 @@ MODULE_PARM(io, "i"); MODULE_PARM_DESC(io, "WDT io port (default=0x240)"); MODULE_PARM(irq, "i"); MODULE_PARM_DESC(irq, "WDT irq (default=11)"); - + /* * Programming support */ - + static void wdt_ctr_mode(int ctr, int mode) { ctr<<=6; @@ -130,29 +130,29 @@ static void wdt_ctr_load(int ctr, int va /* * Kernel methods. */ - - + + /** * wdt_status: - * + * * Extract the status information from a WDT watchdog device. There are * several board variants so we have to know which bits are valid. Some * bits default to one and some to zero in order to be maximally painful. * * we then map the bits onto the status ioctl flags. */ - + static int wdt_status(void) { /* * Status register to bit flags */ - + int flag=0; unsigned char status=inb_p(WDT_SR); status|=FEATUREMAP1; - status&=~FEATUREMAP2; - + status&=~FEATUREMAP2; + if(!(status&WDC_SR_TGOOD)) flag|=WDIOF_OVERHEAT; if(!(status&WDC_SR_PSUOVER)) @@ -178,21 +178,21 @@ static int wdt_status(void) * map changes in what the board considers an interesting way. That means * a failure condition occurring. */ - + static irqreturn_t wdt_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* * Read the status register see what is up and - * then printk it. + * then printk it. */ - + unsigned char status=inb_p(WDT_SR); - + status|=FEATUREMAP1; - status&=~FEATUREMAP2; - + status&=~FEATUREMAP2; + printk(KERN_CRIT "WDT status %d\n", status); - + if(!(status&WDC_SR_TGOOD)) printk(KERN_CRIT "Overheat alarm.(%d)\n",inb_p(WDT_RT)); if(!(status&WDC_SR_PSUOVER)) @@ -205,10 +205,10 @@ static irqreturn_t wdt_interrupt(int irq #ifdef SOFTWARE_REBOOT #ifdef ONLY_TESTING printk(KERN_CRIT "Would Reboot.\n"); -#else +#else printk(KERN_CRIT "Initiating system reboot.\n"); machine_restart(NULL); -#endif +#endif #else printk(KERN_CRIT "Reset in 5ms.\n"); #endif @@ -220,9 +220,9 @@ static irqreturn_t wdt_interrupt(int irq * wdt_ping: * * Reload counter one with the watchdog timeout. We don't bother reloading - * the cascade counter. + * the cascade counter. */ - + static void wdt_ping(void) { /* Write a watchdog value */ @@ -235,14 +235,14 @@ static void wdt_ping(void) /** * wdt_write: * @file: file handle to the watchdog - * @buf: buffer to write (unused as data does not matter here + * @buf: buffer to write (unused as data does not matter here * @count: count of bytes * @ppos: pointer to the position to write. No seeks allowed * * A write to a watchdog device is defined as a keepalive signal. Any * write of data will do, as we we don't define content meaning. */ - + static ssize_t wdt_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { /* Can't seek (pwrite) on this device */ @@ -261,7 +261,7 @@ static ssize_t wdt_write(struct file *fi if (get_user(c, buf + i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } wdt_ping(); @@ -279,12 +279,12 @@ static ssize_t wdt_write(struct file *fi * Read reports the temperature in degrees Fahrenheit. The API is in * farenheit. It was designed by an imperial measurement luddite. */ - + static ssize_t wdt_read(struct file *file, char *buf, size_t count, loff_t *ptr) { unsigned short c=inb_p(WDT_RT); unsigned char cp; - + /* Can't seek (pread) on this device */ if (ptr != &file->f_pos) return -ESPIPE; @@ -312,9 +312,9 @@ static ssize_t wdt_read(struct file *fil * * The watchdog API defines a common set of functions for all watchdogs * according to their available features. We only actually usefully support - * querying capabilities and current status. + * querying capabilities and current status. */ - + static int wdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { @@ -326,14 +326,14 @@ static int wdt_ioctl(struct inode *inode |WDIOF_EXTERN1|WDIOF_EXTERN2|WDIOF_FANFAULT |WDIOF_SETTIMEOUT|WDIOF_MAGICCLOSE, .firmware_version = 1, - .identity = "WDT500/501" + .identity = "WDT500/501", }; - + ident.options&=WDT_OPTION_MASK; /* Mask down to the card we have */ switch(cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: return copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))?-EFAULT:0; @@ -364,12 +364,12 @@ static int wdt_ioctl(struct inode *inode * @file: file handle to device * * One of our two misc devices has been opened. The watchdog device is - * single open and on opening we load the counters. Counter zero is a + * single open and on opening we load the counters. Counter zero is a * 100Hz cascade, into counter 1 which downcounts to reboot. When the * counter triggers counter 2 downcounts the length of the reset pulse - * which set set to be as long as possible. + * which set set to be as long as possible. */ - + static int wdt_open(struct inode *inode, struct file *file) { switch(iminor(inode)) @@ -378,9 +378,9 @@ static int wdt_open(struct inode *inode, if(test_and_set_bit(0, &wdt_is_open)) return -EBUSY; /* - * Activate + * Activate */ - + wdt_is_open=1; inb_p(WDT_DC); /* Disable */ wdt_ctr_mode(0,3); @@ -403,24 +403,25 @@ static int wdt_open(struct inode *inode, * @inode: inode to board * @file: file handle to board * - * The watchdog has a configurable API. There is a religious dispute - * between people who want their watchdog to be able to shut down and + * The watchdog has a configurable API. There is a religious dispute + * between people who want their watchdog to be able to shut down and * those who want to be sure if the watchdog manager dies the machine * reboots. In the former case we disable the counters, in the latter * case you have to open it again very soon. */ - + static int wdt_release(struct inode *inode, struct file *file) { if(iminor(inode)==WATCHDOG_MINOR) { - if (expect_close) { + if (expect_close == 42) { inb_p(WDT_DC); /* Disable counters */ wdt_ctr_load(2,0); /* 0 length reset pulses now */ } else { printk(KERN_CRIT "wdt: WDT device closed unexpectedly. WDT will not stop!\n"); } clear_bit(0, &wdt_is_open); + expect_close = 0; } return 0; } @@ -448,12 +449,12 @@ static int wdt_notify_sys(struct notifie } return NOTIFY_DONE; } - + /* * Kernel Interfaces */ - - + + static struct file_operations wdt_fops = { .owner = THIS_MODULE, .llseek = no_llseek, @@ -468,7 +469,7 @@ static struct miscdevice wdt_miscdev= { .minor = WATCHDOG_MINOR, .name = "watchdog", - .fops = &wdt_fops + .fops = &wdt_fops, }; #ifdef CONFIG_WDT_501 @@ -476,20 +477,20 @@ static struct miscdevice temp_miscdev= { .minor = TEMP_MINOR, .name = "temperature", - .fops = &wdt_fops + .fops = &wdt_fops, }; #endif /* * The WDT card needs to learn about soft shutdowns in order to - * turn the timebomb registers off. + * turn the timebomb registers off. */ - + static struct notifier_block wdt_notifier= { .notifier_call = wdt_notify_sys, .next = NULL, - .priority = 0 + .priority = 0, }; /** @@ -501,13 +502,13 @@ static struct notifier_block wdt_notifie * will not touch PC memory so all is fine. You just have to load a new * module in 60 seconds or reboot. */ - + static void __exit wdt_exit(void) { misc_deregister(&wdt_miscdev); -#ifdef CONFIG_WDT_501 +#ifdef CONFIG_WDT_501 misc_deregister(&temp_miscdev); -#endif +#endif unregister_reboot_notifier(&wdt_notifier); release_region(io,8); free_irq(irq, NULL); @@ -520,7 +521,7 @@ static void __exit wdt_exit(void) * resources we require and bitch if anyone beat us to them. * The open() function will actually kick the board off. */ - + static int __init wdt_init(void) { int ret; diff -puN drivers/char/watchdog/wdt_pci.c~watchdog-updates drivers/char/watchdog/wdt_pci.c --- 25/drivers/char/watchdog/wdt_pci.c~watchdog-updates Fri Jan 2 15:37:58 2004 +++ 25-akpm/drivers/char/watchdog/wdt_pci.c Fri Jan 2 15:37:58 2004 @@ -8,10 +8,10 @@ * 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. + * + * 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 * @@ -72,7 +72,7 @@ static struct semaphore open_sem; static spinlock_t wdtpci_lock; -static int expect_close = 0; +static char expect_close; static int io; static int irq; @@ -95,7 +95,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog can /* * Programming support */ - + static void wdtpci_ctr_mode(int ctr, int mode) { ctr<<=6; @@ -113,29 +113,29 @@ static void wdtpci_ctr_load(int ctr, int /* * Kernel methods. */ - - + + /** * wdtpci_status: - * + * * Extract the status information from a WDT watchdog device. There are * several board variants so we have to know which bits are valid. Some * bits default to one and some to zero in order to be maximally painful. * * we then map the bits onto the status ioctl flags. */ - + static int wdtpci_status(void) { /* * Status register to bit flags */ - + int flag=0; unsigned char status=inb_p(WDT_SR); status|=FEATUREMAP1; - status&=~FEATUREMAP2; - + status&=~FEATUREMAP2; + if(!(status&WDC_SR_TGOOD)) flag|=WDIOF_OVERHEAT; if(!(status&WDC_SR_PSUOVER)) @@ -161,21 +161,21 @@ static int wdtpci_status(void) * map changes in what the board considers an interesting way. That means * a failure condition occurring. */ - + static irqreturn_t wdtpci_interrupt(int irq, void *dev_id, struct pt_regs *regs) { /* * Read the status register see what is up and - * then printk it. + * then printk it. */ - + unsigned char status=inb_p(WDT_SR); - + status|=FEATUREMAP1; - status&=~FEATUREMAP2; - + status&=~FEATUREMAP2; + printk(KERN_CRIT "WDT status %d\n", status); - + if(!(status&WDC_SR_TGOOD)) printk(KERN_CRIT "Overheat alarm.(%d)\n",inb_p(WDT_RT)); if(!(status&WDC_SR_PSUOVER)) @@ -188,10 +188,10 @@ static irqreturn_t wdtpci_interrupt(int #ifdef SOFTWARE_REBOOT #ifdef ONLY_TESTING printk(KERN_CRIT "Would Reboot.\n"); -#else +#else printk(KERN_CRIT "Initiating system reboot.\n"); machine_restart(NULL); -#endif +#endif #else printk(KERN_CRIT "Reset in 5ms.\n"); #endif @@ -203,9 +203,9 @@ static irqreturn_t wdtpci_interrupt(int * wdtpci_ping: * * Reload counter one with the watchdog timeout. We don't bother reloading - * the cascade counter. + * the cascade counter. */ - + static void wdtpci_ping(void) { unsigned long flags; @@ -222,14 +222,14 @@ static void wdtpci_ping(void) /** * wdtpci_write: * @file: file handle to the watchdog - * @buf: buffer to write (unused as data does not matter here + * @buf: buffer to write (unused as data does not matter here * @count: count of bytes * @ppos: pointer to the position to write. No seeks allowed * * A write to a watchdog device is defined as a keepalive signal. Any * write of data will do, as we we don't define content meaning. */ - + static ssize_t wdtpci_write(struct file *file, const char *buf, size_t count, loff_t *ppos) { /* Can't seek (pwrite) on this device */ @@ -247,7 +247,7 @@ static ssize_t wdtpci_write(struct file if(get_user(c, buf+i)) return -EFAULT; if (c == 'V') - expect_close = 1; + expect_close = 42; } } wdtpci_ping(); @@ -266,12 +266,12 @@ static ssize_t wdtpci_write(struct file * Read reports the temperature in degrees Fahrenheit. The API is in * fahrenheit. It was designed by an imperial measurement luddite. */ - + static ssize_t wdtpci_read(struct file *file, char *buf, size_t count, loff_t *ptr) { unsigned short c=inb_p(WDT_RT); unsigned char cp; - + /* Can't seek (pread) on this device */ if (ptr != &file->f_pos) return -ESPIPE; @@ -299,9 +299,9 @@ static ssize_t wdtpci_read(struct file * * * The watchdog API defines a common set of functions for all watchdogs * according to their available features. We only actually usefully support - * querying capabilities and current status. + * querying capabilities and current status. */ - + static int wdtpci_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { @@ -314,12 +314,12 @@ static int wdtpci_ioctl(struct inode *in .firmware_version = 1, .identity = "WDT500/501PCI", }; - + ident.options&=WDT_OPTION_MASK; /* Mask down to the card we have */ switch(cmd) { default: - return -ENOTTY; + return -ENOIOCTLCMD; case WDIOC_GETSUPPORT: return copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))?-EFAULT:0; @@ -351,12 +351,12 @@ static int wdtpci_ioctl(struct inode *in * @file: file handle to device * * One of our two misc devices has been opened. The watchdog device is - * single open and on opening we load the counters. Counter zero is a + * single open and on opening we load the counters. Counter zero is a * 100Hz cascade, into counter 1 which downcounts to reboot. When the * counter triggers counter 2 downcounts the length of the reset pulse - * which set set to be as long as possible. + * which set set to be as long as possible. */ - + static int wdtpci_open(struct inode *inode, struct file *file) { unsigned long flags; @@ -371,17 +371,17 @@ static int wdtpci_open(struct inode *ino __module_get(THIS_MODULE); } /* - * Activate + * Activate */ spin_lock_irqsave(&wdtpci_lock, flags); - + inb_p(WDT_DC); /* Disable */ /* * "pet" the watchdog, as Access says. * This resets the clock outputs. */ - + wdtpci_ctr_mode(2,0); outb_p(0, WDT_DC); @@ -413,19 +413,19 @@ static int wdtpci_open(struct inode *ino * @inode: inode to board * @file: file handle to board * - * The watchdog has a configurable API. There is a religious dispute - * between people who want their watchdog to be able to shut down and + * The watchdog has a configurable API. There is a religious dispute + * between people who want their watchdog to be able to shut down and * those who want to be sure if the watchdog manager dies the machine * reboots. In the former case we disable the counters, in the latter * case you have to open it again very soon. */ - + static int wdtpci_release(struct inode *inode, struct file *file) { if (iminor(inode)==WATCHDOG_MINOR) { unsigned long flags; - if (expect_close) { + if (expect_close == 42) { spin_lock_irqsave(&wdtpci_lock, flags); inb_p(WDT_DC); /* Disable counters */ wdtpci_ctr_load(2,0); /* 0 length reset pulses now */ @@ -434,6 +434,7 @@ static int wdtpci_release(struct inode * printk(KERN_CRIT PFX "Unexpected close, not stopping timer!"); wdtpci_ping(); } + expect_close = 0; up(&open_sem); } return 0; @@ -465,12 +466,12 @@ static int wdtpci_notify_sys(struct noti } return NOTIFY_DONE; } - + /* * Kernel Interfaces */ - - + + static struct file_operations wdtpci_fops = { .owner = THIS_MODULE, .llseek = no_llseek, @@ -497,9 +498,9 @@ static struct miscdevice temp_miscdev = /* * The WDT card needs to learn about soft shutdowns in order to - * turn the timebomb registers off. + * turn the timebomb registers off. */ - + static struct notifier_block wdtpci_notifier = { .notifier_call = wdtpci_notify_sys, }; @@ -584,7 +585,7 @@ static void __devexit wdtpci_remove_one unregister_reboot_notifier(&wdtpci_notifier); #ifdef CONFIG_WDT_501_PCI misc_deregister(&temp_miscdev); -#endif +#endif misc_deregister(&wdtpci_miscdev); free_irq(irq, &wdtpci_miscdev); release_region(io, 16); @@ -620,7 +621,7 @@ static struct pci_driver wdtpci_driver = * will not touch PC memory so all is fine. You just have to load a new * module in 60 seconds or reboot. */ - + static void __exit wdtpci_cleanup(void) { pci_unregister_driver (&wdtpci_driver); @@ -634,14 +635,14 @@ static void __exit wdtpci_cleanup(void) * resources we require and bitch if anyone beat us to them. * The open() function will actually kick the board off. */ - + static int __init wdtpci_init(void) { int rc = pci_register_driver (&wdtpci_driver); - + if (rc < 1) return -ENODEV; - + return 0; } _