亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? alim7101_wdt.c

?? 優(yōu)龍2410linux2.6.8內核源代碼
?? C
字號:
/* *	ALi M7101 PMU Computer Watchdog Timer driver * *	Based on w83877f_wdt.c by Scott Jennings <linuxdrivers@oro.net> *	and the Cobalt kernel WDT timer driver by Tim Hockin *	                                      <thockin@cobaltnet.com> * *	(c)2002 Steve Hill <steve@navaho.co.uk> * *  This WDT driver is different from most other Linux WDT *  drivers in that the driver will ping the watchdog by itself, *  because this particular WDT has a very short timeout (1.6 *  seconds) and it would be insane to count on any userspace *  daemon always getting scheduled within that time frame. */#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/types.h>#include <linux/timer.h>#include <linux/miscdevice.h>#include <linux/watchdog.h>#include <linux/ioport.h>#include <linux/notifier.h>#include <linux/reboot.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/pci.h>#include <asm/io.h>#include <asm/uaccess.h>#include <asm/system.h>#define OUR_NAME "alim7101_wdt"#define PFX OUR_NAME ": "#define WDT_ENABLE 0x9C#define WDT_DISABLE 0x8C#define ALI_7101_WDT    0x92#define ALI_WDT_ARM     0x01/* * We're going to use a 1 second timeout. * If we reset the watchdog every ~250ms we should be safe.  */#define WDT_INTERVAL (HZ/4+1)/* * We must not require too good response from the userspace daemon. * Here we require the userspace daemon to send us a heartbeat * char to /dev/watchdog every 30 seconds. */#define WATCHDOG_TIMEOUT 30            /* 30 sec default timeout */static int timeout = WATCHDOG_TIMEOUT; /* in seconds, will be multiplied by HZ to get seconds to wait for a ping */module_param(timeout, int, 0);MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, default=" __MODULE_STRING(WATCHDOG_TIMEOUT) ")");static void wdt_timer_ping(unsigned long);static struct timer_list timer;static unsigned long next_heartbeat;static unsigned long wdt_is_open;static char wdt_expect_close;static struct pci_dev *alim7101_pmu;#ifdef CONFIG_WATCHDOG_NOWAYOUTstatic int nowayout = 1;#elsestatic int nowayout = 0;#endifmodule_param(nowayout, int, 0);MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CONFIG_WATCHDOG_NOWAYOUT)");/* *	Whack the dog */static void wdt_timer_ping(unsigned long data){	/* If we got a heartbeat pulse within the WDT_US_INTERVAL	 * we agree to ping the WDT	 */	char	tmp;	if(time_before(jiffies, next_heartbeat))	{		/* Ping the WDT (this is actually a disarm/arm sequence) */		pci_read_config_byte(alim7101_pmu, 0x92, &tmp);		pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));		pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp | ALI_WDT_ARM));	} else {		printk(KERN_WARNING PFX "Heartbeat lost! Will not ping the watchdog\n");	}	/* Re-set the timer interval */	timer.expires = jiffies + WDT_INTERVAL;	add_timer(&timer);}/* * Utility routines */static void wdt_change(int writeval){	char	tmp;	pci_read_config_byte(alim7101_pmu, 0x92, &tmp);	if (writeval == WDT_ENABLE)		pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp | ALI_WDT_ARM));	else		pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, (tmp & ~ALI_WDT_ARM));}static void wdt_startup(void){	next_heartbeat = jiffies + (timeout * HZ);	/* We must enable before we kick off the timer in case the timer	   occurs as we ping it */	wdt_change(WDT_ENABLE);	/* Start the timer */	timer.expires = jiffies + WDT_INTERVAL;	add_timer(&timer);	printk(KERN_INFO PFX "Watchdog timer is now enabled.\n");}static void wdt_turnoff(void){	/* Stop the timer */	del_timer_sync(&timer);	wdt_change(WDT_DISABLE);	printk(KERN_INFO PFX "Watchdog timer is now disabled...\n");}static void wdt_keepalive(void){	/* user land ping */	next_heartbeat = jiffies + (timeout * HZ);}/* * /dev/watchdog handling */static ssize_t fop_write(struct file * file, const char __user * buf, size_t count, loff_t * ppos){	/* See if we got the magic character 'V' and reload the timer */	if(count) {		if (!nowayout) {			size_t ofs;			/* note: just in case someone wrote the magic character			 * five months ago... */			wdt_expect_close = 0;			/* now scan */			for (ofs = 0; ofs != count; ofs++) {				char c;				if (get_user(c, buf+ofs))					return -EFAULT;				if (c == 'V')					wdt_expect_close = 42;			}		}		/* someone wrote to us, we should restart timer */		wdt_keepalive();	}	return count;}static int fop_open(struct inode * inode, struct file * file){	/* Just in case we're already talking to someone... */	if(test_and_set_bit(0, &wdt_is_open))		return -EBUSY;	/* Good, fire up the show */	wdt_startup();	return nonseekable_open(inode, file);}static int fop_close(struct inode * inode, struct file * file){	if(wdt_expect_close == 42)		wdt_turnoff();	else {		/* wim: shouldn't there be a: del_timer(&timer); */		printk(KERN_CRIT PFX "device file closed unexpectedly. Will not stop the WDT!\n");	}	clear_bit(0, &wdt_is_open);	wdt_expect_close = 0;	return 0;}static int fop_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	void __user *argp = (void __user *)arg;	int __user *p = argp;	static struct watchdog_info ident =	{		.options = WDIOF_KEEPALIVEPING | WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE,		.firmware_version = 1,		.identity = "ALiM7101",	};	switch(cmd)	{		case WDIOC_GETSUPPORT:			return copy_to_user(argp, &ident, sizeof(ident))?-EFAULT:0;		case WDIOC_GETSTATUS:		case WDIOC_GETBOOTSTATUS:			return put_user(0, p);		case WDIOC_KEEPALIVE:			wdt_keepalive();			return 0;		case WDIOC_SETOPTIONS:		{			int new_options, retval = -EINVAL;			if(get_user(new_options, p))				return -EFAULT;			if(new_options & WDIOS_DISABLECARD) {				wdt_turnoff();				retval = 0;			}			if(new_options & WDIOS_ENABLECARD) {				wdt_startup();				retval = 0;			}			return retval;		}		case WDIOC_SETTIMEOUT:		{			int new_timeout;			if(get_user(new_timeout, p))				return -EFAULT;			if(new_timeout < 1 || new_timeout > 3600) /* arbitrary upper limit */				return -EINVAL;			timeout = new_timeout;			wdt_keepalive();			/* Fall through */		}		case WDIOC_GETTIMEOUT:			return put_user(timeout, p);		default:			return -ENOIOCTLCMD;	}}static struct file_operations wdt_fops = {	.owner=		THIS_MODULE,	.llseek=	no_llseek,	.write=		fop_write,	.open=		fop_open,	.release=	fop_close,	.ioctl=		fop_ioctl,};static struct miscdevice wdt_miscdev = {	.minor=WATCHDOG_MINOR,	.name="watchdog",	.fops=&wdt_fops,};/* *	Notifier for system down */static int wdt_notify_sys(struct notifier_block *this, unsigned long code, void *unused){	if (code==SYS_DOWN || code==SYS_HALT)		wdt_turnoff();	if (code==SYS_RESTART) {		/*		 * Cobalt devices have no way of rebooting themselves other than		 * getting the watchdog to pull reset, so we restart the watchdog on		 * reboot with no heartbeat		 */		wdt_change(WDT_ENABLE);		printk(KERN_INFO PFX "Watchdog timer is now enabled with no heartbeat - should reboot in ~1 second.\n");	}	return NOTIFY_DONE;}/* *	The WDT needs to learn about soft shutdowns in order to *	turn the timebomb registers off. */static struct notifier_block wdt_notifier={	.notifier_call = wdt_notify_sys,};static void __exit alim7101_wdt_unload(void){	wdt_turnoff();	/* Deregister */	misc_deregister(&wdt_miscdev);	unregister_reboot_notifier(&wdt_notifier);}static int __init alim7101_wdt_init(void){	int rc = -EBUSY;	struct pci_dev *ali1543_south;	char tmp;	printk(KERN_INFO PFX "Steve Hill <steve@navaho.co.uk>.\n");	alim7101_pmu = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101,NULL);	if (!alim7101_pmu) {		printk(KERN_INFO PFX "ALi M7101 PMU not present - WDT not set\n");		return -EBUSY;	}	/* Set the WDT in the PMU to 1 second */	pci_write_config_byte(alim7101_pmu, ALI_7101_WDT, 0x02);	ali1543_south = pci_find_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);	if (!ali1543_south) {		printk(KERN_INFO PFX "ALi 1543 South-Bridge not present - WDT not set\n");		return -EBUSY;	}	pci_read_config_byte(ali1543_south, 0x5e, &tmp);	if ((tmp & 0x1e) != 0x12) {		printk(KERN_INFO PFX "ALi 1543 South-Bridge does not have the correct revision number (???1001?) - WDT not set\n");		return -EBUSY;	}	if(timeout < 1 || timeout > 3600) /* arbitrary upper limit */	{		timeout = WATCHDOG_TIMEOUT;		printk(KERN_INFO PFX "timeout value must be 1<=x<=3600, using %d\n",			timeout);	}	init_timer(&timer);	timer.function = wdt_timer_ping;	timer.data = 1;	rc = misc_register(&wdt_miscdev);	if (rc) {		printk(KERN_ERR PFX "cannot register miscdev on minor=%d (err=%d)\n",			wdt_miscdev.minor, rc);		goto err_out;	}	rc = register_reboot_notifier(&wdt_notifier);	if (rc) {		printk(KERN_ERR PFX "cannot register reboot notifier (err=%d)\n",			rc);		goto err_out_miscdev;	}	printk(KERN_INFO PFX "WDT driver for ALi M7101 initialised. timeout=%d sec (nowayout=%d)\n",		timeout, nowayout);	return 0;err_out_miscdev:	misc_deregister(&wdt_miscdev);err_out:	return rc;}module_init(alim7101_wdt_init);module_exit(alim7101_wdt_unload);MODULE_AUTHOR("Steve Hill");MODULE_DESCRIPTION("ALi M7101 PMU Computer Watchdog Timer driver");MODULE_LICENSE("GPL");MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕av一区二区三区| 亚洲另类在线制服丝袜| 日本一区二区三区免费乱视频| 国产日韩精品一区| 尤物av一区二区| 国产在线国偷精品免费看| 91免费看`日韩一区二区| 欧美一级片在线| 中文字幕一区二区三区蜜月| 午夜电影一区二区三区| 国产成人免费视频网站 | 欧美一个色资源| 国产精品天天摸av网| 三级一区在线视频先锋 | 欧美久久久一区| 国产精品欧美一区二区三区| 免费观看在线色综合| 色综合久久久久久久久| 精品va天堂亚洲国产| 性感美女久久精品| av在线这里只有精品| 欧美精品一区二区三区四区| 亚洲成人午夜电影| 色偷偷成人一区二区三区91| 国产日韩欧美在线一区| 久久精品72免费观看| 欧美视频在线一区| 亚洲视频图片小说| 国产成a人亚洲| 精品少妇一区二区| 天天操天天干天天综合网| 日本高清不卡视频| 中文字幕日韩欧美一区二区三区| 精品一区二区三区的国产在线播放| 欧美色倩网站大全免费| 亚洲视频在线观看三级| 从欧美一区二区三区| 欧美精品一区在线观看| 美女mm1313爽爽久久久蜜臀| 久久美女艺术照精彩视频福利播放 | 亚洲精品一区二区三区福利| 日韩高清不卡一区| 欧美精品在线一区二区三区| 亚洲成a人片在线观看中文| 色噜噜狠狠色综合中国| 亚洲三级电影全部在线观看高清| 国产成人免费在线视频| 久久久www免费人成精品| 老司机午夜精品99久久| 色婷婷久久久亚洲一区二区三区| 久久精品国产久精国产爱| 欧美日韩在线精品一区二区三区激情| 亚洲视频免费在线观看| 色婷婷综合久久久久中文| 亚洲欧洲精品一区二区三区不卡| 成人小视频在线观看| 国产精品视频你懂的| 国产91精品欧美| 国产精品久久影院| 99久久精品一区二区| 亚洲三级在线观看| 欧美日韩精品福利| 丝袜亚洲精品中文字幕一区| 欧美高清dvd| 麻豆精品国产传媒mv男同| 精品久久久网站| 国产成人精品亚洲777人妖| 中文在线一区二区 | 国产精品久久久久久久久久免费看 | 精品动漫一区二区三区在线观看| 日本系列欧美系列| 精品成a人在线观看| 成人免费毛片a| 亚洲精品亚洲人成人网| 欧美一区二区视频免费观看| 久久99精品久久只有精品| 国产日韩综合av| 91黄色小视频| 蜜桃av噜噜一区二区三区小说| 国产视频亚洲色图| 欧美中文字幕一区二区三区亚洲| 久久97超碰国产精品超碰| 中文字幕精品综合| 欧美日韩高清一区| 在线一区二区观看| 国产乱妇无码大片在线观看| 亚洲精品高清在线观看| 精品奇米国产一区二区三区| 91看片淫黄大片一级在线观看| 婷婷中文字幕一区三区| 亚洲国产经典视频| 777午夜精品视频在线播放| 国产成人福利片| 丝袜脚交一区二区| 中文字幕在线不卡国产视频| 91精品国产综合久久精品| 99久久精品免费| 精品午夜一区二区三区在线观看 | 成人午夜碰碰视频| 亚洲国产视频一区二区| 久久综合成人精品亚洲另类欧美 | aa级大片欧美| 激情欧美一区二区三区在线观看| 一区二区三区国产豹纹内裤在线| 久久色中文字幕| 欧美精品tushy高清| 一本一道波多野结衣一区二区| 狠狠色丁香久久婷婷综| 天天av天天翘天天综合网| 亚洲欧洲日韩女同| 国产精品网友自拍| 国产亚洲视频系列| 欧美刺激脚交jootjob| 欧美日韩日日摸| 欧美性色aⅴ视频一区日韩精品| 成人午夜电影网站| 欧美军同video69gay| 成人app在线观看| 国产精品一区二区免费不卡 | 在线成人av网站| 日本久久一区二区三区| eeuss鲁片一区二区三区| 国产高清不卡一区二区| 国内久久精品视频| 韩日精品视频一区| 国内久久精品视频| 国产裸体歌舞团一区二区| 精品一区二区免费在线观看| 麻豆成人久久精品二区三区小说| 日日夜夜免费精品| 奇米影视一区二区三区小说| 日本免费在线视频不卡一不卡二| 天天av天天翘天天综合网| 日本中文在线一区| 老司机精品视频线观看86| 美日韩一区二区三区| 久久不见久久见中文字幕免费| 久久激情综合网| 国产综合色在线视频区| 国产91在线|亚洲| av不卡在线播放| 日本精品一区二区三区高清| 在线免费观看日韩欧美| 欧美日韩一级片网站| 91精品欧美久久久久久动漫| 亚洲一级二级在线| 亚洲成人精品影院| 久久99精品久久久久| 国产在线国偷精品免费看| 不卡电影免费在线播放一区| 色综合久久九月婷婷色综合| 欧美日韩一区二区三区免费看| 91精品国产乱| 日本一区二区三区高清不卡| 18成人在线观看| 天堂午夜影视日韩欧美一区二区| 奇米精品一区二区三区四区| 韩国女主播成人在线观看| 99久久精品免费精品国产| 欧美色综合影院| 欧美成人乱码一区二区三区| 国产欧美日韩精品一区| 一级中文字幕一区二区| 另类中文字幕网| 99视频热这里只有精品免费| 欧美日韩在线播放一区| 久久久蜜桃精品| 一区二区三区国产| 国产乱国产乱300精品| 日本精品一区二区三区四区的功能| 欧美一级免费大片| 国产精品成人一区二区艾草 | 久久人人超碰精品| 亚洲精品第1页| 国产一区视频在线看| 欧美日韩一区久久| 国产精品免费丝袜| 美日韩一区二区三区| 精品国产免费久久| 亚洲精品国产视频| 久久电影网电视剧免费观看| 91麻豆.com| 亚洲国产精品t66y| 另类的小说在线视频另类成人小视频在线 | 91色.com| 国产无一区二区| 日本怡春院一区二区| 色婷婷av一区| 国产日产欧美一区| 免费观看在线综合色| 在线亚洲精品福利网址导航| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美另类高清zo欧美| 最新热久久免费视频| 国产一区二区成人久久免费影院| 欧美日韩精品福利| 亚洲综合视频在线| 91丨porny丨首页| 国产精品国产自产拍高清av王其| 久久精品久久精品|