Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 325ea4d3 authored by Alan Cox's avatar Alan Cox Committed by Wim Van Sebroeck
Browse files

[WATCHDOG 24/57] machzwd: clean up, coding style, unlocked_ioctl



Review and switch to unlocked_ioctl

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarWim Van Sebroeck <wim@iguana.be>
parent f4fabce1
Loading
Loading
Loading
Loading
+40 −68
Original line number Diff line number Diff line
@@ -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 */
@@ -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"

@@ -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");

@@ -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) */
@@ -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...
@@ -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...
@@ -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;
@@ -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;
}

@@ -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,
};
@@ -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);