cregit-Linux how code gets into the kernel

Release 4.14 drivers/watchdog/indydog.c

Directory: drivers/watchdog
/*
 *      IndyDog 0.3     A Hardware Watchdog Device for SGI IP22
 *
 *      (c) Copyright 2002 Guido Guenther <agx@sigxcpu.org>,
 *                                              All Rights Reserved.
 *
 *      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
 *      2 of the License, or (at your option) any later version.
 *
 *      based on softdog.c by Alan Cox <alan@lxorguk.ukuu.org.uk>
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/uaccess.h>
#include <asm/sgi/mc.h>


static unsigned long indydog_alive;
static DEFINE_SPINLOCK(indydog_lock);


#define WATCHDOG_TIMEOUT 30		
/* 30 sec default timeout */


static bool nowayout = WATCHDOG_NOWAYOUT;
module_param(nowayout, bool, 0);
MODULE_PARM_DESC(nowayout,
		"Watchdog cannot be stopped once started (default="
				__MODULE_STRING(WATCHDOG_NOWAYOUT) ")");


static void indydog_start(void) { spin_lock(&indydog_lock); sgimc->cpuctrl0 |= SGIMC_CCTRL0_WDOG; spin_unlock(&indydog_lock); }

Contributors

PersonTokensPropCommitsCommitProp
Alan Cox1246.15%125.00%
Wim Van Sebroeck1038.46%125.00%
Andrew Morton311.54%125.00%
Alexander Shiyan13.85%125.00%
Total26100.00%4100.00%


static void indydog_stop(void) { spin_lock(&indydog_lock); sgimc->cpuctrl0 &= ~SGIMC_CCTRL0_WDOG; spin_unlock(&indydog_lock); pr_info("Stopped watchdog timer\n"); }

Contributors

PersonTokensPropCommitsCommitProp
Wim Van Sebroeck1650.00%125.00%
Alan Cox1237.50%125.00%
Joe Perches39.38%125.00%
Andrew Morton13.12%125.00%
Total32100.00%4100.00%


static void indydog_ping(void) { sgimc->watchdogt = 0; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones1071.43%133.33%
Wim Van Sebroeck321.43%133.33%
Andrew Morton17.14%133.33%
Total14100.00%3100.00%

/* * Allow only one person to hold it open */
static int indydog_open(struct inode *inode, struct file *file) { if (test_and_set_bit(0, &indydog_alive)) return -EBUSY; if (nowayout) __module_get(THIS_MODULE); /* Activate timer */ indydog_start(); indydog_ping(); pr_info("Started watchdog timer\n"); return nonseekable_open(inode, file); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones3050.85%112.50%
Alan Cox1525.42%337.50%
Linus Torvalds610.17%112.50%
Andrew Morton46.78%112.50%
Joe Perches23.39%112.50%
Wim Van Sebroeck23.39%112.50%
Total59100.00%8100.00%


static int indydog_release(struct inode *inode, struct file *file) { /* Shut off the timer. * Lock it in if it's a module and we defined ...NOWAYOUT */ if (!nowayout) indydog_stop(); /* Turn the WDT off */ clear_bit(0, &indydog_alive); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones2362.16%233.33%
Alan Cox616.22%116.67%
Wim Van Sebroeck513.51%233.33%
Andrew Morton38.11%116.67%
Total37100.00%6100.00%


static ssize_t indydog_write(struct file *file, const char *data, size_t len, loff_t *ppos) { /* Refresh the timer. */ if (len) indydog_ping(); return len; }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones3397.06%266.67%
Andrew Morton12.94%133.33%
Total34100.00%3100.00%


static long indydog_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { int options, retval = -EINVAL; static const struct watchdog_info ident = { .options = WDIOF_KEEPALIVEPING, .firmware_version = 0, .identity = "Hardware Watchdog for SGI IP22", }; switch (cmd) { case WDIOC_GETSUPPORT: if (copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) return -EFAULT; return 0; case WDIOC_GETSTATUS: case WDIOC_GETBOOTSTATUS: return put_user(0, (int *)arg); case WDIOC_SETOPTIONS: { if (get_user(options, (int *)arg)) return -EFAULT; if (options & WDIOS_DISABLECARD) { indydog_stop(); retval = 0; } if (options & WDIOS_ENABLECARD) { indydog_start(); retval = 0; } return retval; } case WDIOC_KEEPALIVE: indydog_ping(); return 0; case WDIOC_GETTIMEOUT: return put_user(WATCHDOG_TIMEOUT, (int *)arg); default: return -ENOTTY; } }

Contributors

PersonTokensPropCommitsCommitProp
Wim Van Sebroeck9349.47%350.00%
Dave Jones8947.34%233.33%
Alan Cox63.19%116.67%
Total188100.00%6100.00%


static int indydog_notify_sys(struct notifier_block *this, unsigned long code, void *unused) { if (code == SYS_DOWN || code == SYS_HALT) indydog_stop(); /* Turn the WDT off */ return NOTIFY_DONE; }

Contributors

PersonTokensPropCommitsCommitProp
Wim Van Sebroeck3597.22%150.00%
Andrew Morton12.78%150.00%
Total36100.00%2100.00%

static const struct file_operations indydog_fops = { .owner = THIS_MODULE, .llseek = no_llseek, .write = indydog_write, .unlocked_ioctl = indydog_ioctl, .open = indydog_open, .release = indydog_release, }; static struct miscdevice indydog_miscdev = { .minor = WATCHDOG_MINOR, .name = "watchdog", .fops = &indydog_fops, }; static struct notifier_block indydog_notifier = { .notifier_call = indydog_notify_sys, };
static int __init watchdog_init(void) { int ret; ret = register_reboot_notifier(&indydog_notifier); if (ret) { pr_err("cannot register reboot notifier (err=%d)\n", ret); return ret; } ret = misc_register(&indydog_miscdev); if (ret) { pr_err("cannot register miscdev on minor=%d (err=%d)\n", WATCHDOG_MINOR, ret); unregister_reboot_notifier(&indydog_notifier); return ret; } pr_info("Hardware Watchdog Timer for SGI IP22: 0.3\n"); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Wim Van Sebroeck3444.74%133.33%
Dave Jones3343.42%133.33%
Joe Perches911.84%133.33%
Total76100.00%3100.00%


static void __exit watchdog_exit(void) { misc_deregister(&indydog_miscdev); unregister_reboot_notifier(&indydog_notifier); }

Contributors

PersonTokensPropCommitsCommitProp
Dave Jones1571.43%150.00%
Wim Van Sebroeck628.57%150.00%
Total21100.00%2100.00%

module_init(watchdog_init); module_exit(watchdog_exit); MODULE_AUTHOR("Guido Guenther <agx@sigxcpu.org>"); MODULE_DESCRIPTION("Hardware Watchdog Device for SGI IP22"); MODULE_LICENSE("GPL");

Overall Contributors

PersonTokensPropCommitsCommitProp
Dave Jones34548.46%28.70%
Wim Van Sebroeck24834.83%834.78%
Alan Cox588.15%417.39%
Andrew Morton233.23%313.04%
Joe Perches212.95%14.35%
Linus Torvalds60.84%14.35%
Andrey Panin50.70%14.35%
Axel Lin40.56%14.35%
Alexander Shiyan10.14%14.35%
Arjan van de Ven10.14%14.35%
Total712100.00%23100.00%
Directory: drivers/watchdog
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.