Loading drivers/watchdog/machzwd.c +40 −68 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> #include <linux/io.h> #include <linux/uaccess.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/system.h> /* ports */ Loading Loading @@ -95,7 +95,9 @@ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); static int nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); #define PFX "machzwd" Loading @@ -114,7 +116,7 @@ static struct watchdog_info zf_info = { * 3 = GEN_SCI * defaults to GEN_RESET (0) */ static int action = 0; static int action; module_param(action, int, 0); MODULE_PARM_DESC(action, "after watchdog resets, generate: 0 = RESET(*) 1 = SMI 2 = NMI 3 = SCI"); Loading @@ -123,10 +125,9 @@ static void zf_ping(unsigned long data); static int zf_action = GEN_RESET; static unsigned long zf_is_open; static char zf_expect_close; static DEFINE_SPINLOCK(zf_lock); static DEFINE_SPINLOCK(zf_port_lock); static DEFINE_TIMER(zf_timer, zf_ping, 0, 0); static unsigned long next_heartbeat = 0; static unsigned long next_heartbeat; /* timeout for user land heart beat (10 seconds) */ Loading Loading @@ -242,9 +243,7 @@ static void zf_ping(unsigned long data) 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... Loading @@ -261,24 +260,21 @@ static void zf_ping(unsigned long data) spin_unlock_irqrestore(&zf_port_lock, flags); mod_timer(&zf_timer, jiffies + ZF_HW_TIMEO); }else{ } else printk(KERN_CRIT PFX ": I will reset your machine\n"); } } static ssize_t zf_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { /* See if we got the magic character */ if (count) { /* * no need to check for close confirmation * no way to disable watchdog ;) */ if (!nowayout) { size_t ofs; /* * note: just in case someone wrote the magic character * five months ago... Loading @@ -303,14 +299,11 @@ static ssize_t zf_write(struct file *file, const char __user *buf, size_t count, */ next_heartbeat = jiffies + ZF_USER_TIMEO; dprintk("user ping at %ld\n", jiffies); } return count; } static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) static long zf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; Loading @@ -319,55 +312,38 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, if (copy_to_user(argp, &zf_info, sizeof(zf_info))) return -EFAULT; break; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, p); case WDIOC_KEEPALIVE: zf_ping(0); break; default: return -ENOTTY; } return 0; } static int zf_open(struct inode *inode, struct file *file) { spin_lock(&zf_lock); if(test_and_set_bit(0, &zf_is_open)) { spin_unlock(&zf_lock); if (test_and_set_bit(0, &zf_is_open)) return -EBUSY; } if (nowayout) __module_get(THIS_MODULE); spin_unlock(&zf_lock); zf_timer_on(); return nonseekable_open(inode, file); } static int zf_close(struct inode *inode, struct file *file) { if(zf_expect_close == 42){ if (zf_expect_close == 42) zf_timer_off(); } else { else { del_timer(&zf_timer); printk(KERN_ERR PFX ": device file closed unexpectedly. Will not stop the WDT!\n"); } spin_lock(&zf_lock); clear_bit(0, &zf_is_open); spin_unlock(&zf_lock); zf_expect_close = 0; return 0; } Loading @@ -378,21 +354,16 @@ static int zf_close(struct inode *inode, struct file *file) static int zf_notify_sys(struct notifier_block *this, unsigned long code, void *unused) { if(code == SYS_DOWN || code == SYS_HALT){ if (code == SYS_DOWN || code == SYS_HALT) zf_timer_off(); } return NOTIFY_DONE; } static const struct file_operations zf_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = zf_write, .ioctl = zf_ioctl, .unlocked_ioctl = zf_ioctl, .open = zf_open, .release = zf_close, }; Loading Loading @@ -423,17 +394,18 @@ static int __init zf_init(void) { int ret; printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); ret = zf_get_ZFL_version(); if ((!ret) || (ret == 0xffff)) { if (!ret || ret == 0xffff) { printk(KERN_WARNING PFX ": no ZF-Logic found\n"); return -ENODEV; } if((action <= 3) && (action >= 0)){ if (action <= 3 && action >= 0) zf_action = zf_action >> action; } else else action = 0; zf_show_action(action); Loading Loading
drivers/watchdog/machzwd.c +40 −68 Original line number Diff line number Diff line Loading @@ -40,9 +40,9 @@ #include <linux/notifier.h> #include <linux/reboot.h> #include <linux/init.h> #include <linux/io.h> #include <linux/uaccess.h> #include <asm/io.h> #include <asm/uaccess.h> #include <asm/system.h> /* ports */ Loading Loading @@ -95,7 +95,9 @@ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); static int nowayout = WATCHDOG_NOWAYOUT; module_param(nowayout, int, 0); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=" __MODULE_STRING(WATCHDOG_NOWAYOUT) ")"); #define PFX "machzwd" Loading @@ -114,7 +116,7 @@ static struct watchdog_info zf_info = { * 3 = GEN_SCI * defaults to GEN_RESET (0) */ static int action = 0; static int action; module_param(action, int, 0); MODULE_PARM_DESC(action, "after watchdog resets, generate: 0 = RESET(*) 1 = SMI 2 = NMI 3 = SCI"); Loading @@ -123,10 +125,9 @@ static void zf_ping(unsigned long data); static int zf_action = GEN_RESET; static unsigned long zf_is_open; static char zf_expect_close; static DEFINE_SPINLOCK(zf_lock); static DEFINE_SPINLOCK(zf_port_lock); static DEFINE_TIMER(zf_timer, zf_ping, 0, 0); static unsigned long next_heartbeat = 0; static unsigned long next_heartbeat; /* timeout for user land heart beat (10 seconds) */ Loading Loading @@ -242,9 +243,7 @@ static void zf_ping(unsigned long data) 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... Loading @@ -261,24 +260,21 @@ static void zf_ping(unsigned long data) spin_unlock_irqrestore(&zf_port_lock, flags); mod_timer(&zf_timer, jiffies + ZF_HW_TIMEO); }else{ } else printk(KERN_CRIT PFX ": I will reset your machine\n"); } } static ssize_t zf_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { /* See if we got the magic character */ if (count) { /* * no need to check for close confirmation * no way to disable watchdog ;) */ if (!nowayout) { size_t ofs; /* * note: just in case someone wrote the magic character * five months ago... Loading @@ -303,14 +299,11 @@ static ssize_t zf_write(struct file *file, const char __user *buf, size_t count, */ next_heartbeat = jiffies + ZF_USER_TIMEO; dprintk("user ping at %ld\n", jiffies); } return count; } static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) static long zf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { void __user *argp = (void __user *)arg; int __user *p = argp; Loading @@ -319,55 +312,38 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, if (copy_to_user(argp, &zf_info, sizeof(zf_info))) return -EFAULT; break; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, p); case WDIOC_KEEPALIVE: zf_ping(0); break; default: return -ENOTTY; } return 0; } static int zf_open(struct inode *inode, struct file *file) { spin_lock(&zf_lock); if(test_and_set_bit(0, &zf_is_open)) { spin_unlock(&zf_lock); if (test_and_set_bit(0, &zf_is_open)) return -EBUSY; } if (nowayout) __module_get(THIS_MODULE); spin_unlock(&zf_lock); zf_timer_on(); return nonseekable_open(inode, file); } static int zf_close(struct inode *inode, struct file *file) { if(zf_expect_close == 42){ if (zf_expect_close == 42) zf_timer_off(); } else { else { del_timer(&zf_timer); printk(KERN_ERR PFX ": device file closed unexpectedly. Will not stop the WDT!\n"); } spin_lock(&zf_lock); clear_bit(0, &zf_is_open); spin_unlock(&zf_lock); zf_expect_close = 0; return 0; } Loading @@ -378,21 +354,16 @@ static int zf_close(struct inode *inode, struct file *file) static int zf_notify_sys(struct notifier_block *this, unsigned long code, void *unused) { if(code == SYS_DOWN || code == SYS_HALT){ if (code == SYS_DOWN || code == SYS_HALT) zf_timer_off(); } return NOTIFY_DONE; } static const struct file_operations zf_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = zf_write, .ioctl = zf_ioctl, .unlocked_ioctl = zf_ioctl, .open = zf_open, .release = zf_close, }; Loading Loading @@ -423,17 +394,18 @@ static int __init zf_init(void) { int ret; printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); printk(KERN_INFO PFX ": MachZ ZF-Logic Watchdog driver initializing.\n"); ret = zf_get_ZFL_version(); if ((!ret) || (ret == 0xffff)) { if (!ret || ret == 0xffff) { printk(KERN_WARNING PFX ": no ZF-Logic found\n"); return -ENODEV; } if((action <= 3) && (action >= 0)){ if (action <= 3 && action >= 0) zf_action = zf_action >> action; } else else action = 0; zf_show_action(action); Loading