Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
88d5a7bb
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
88d5a7bb
编写于
2月 13, 2007
作者:
W
Wim Van Sebroeck
浏览文件
操作
浏览文件
下载
差异文件
Merge ../linux-2.6-watchdog-mm
上级
9af9fc45
82eb7c50
变更
35
隐藏空白更改
内联
并排
Showing
35 changed file
with
369 addition
and
294 deletion
+369
-294
drivers/char/watchdog/acquirewdt.c
drivers/char/watchdog/acquirewdt.c
+88
-67
drivers/char/watchdog/advantechwdt.c
drivers/char/watchdog/advantechwdt.c
+88
-54
drivers/char/watchdog/alim1535_wdt.c
drivers/char/watchdog/alim1535_wdt.c
+1
-1
drivers/char/watchdog/alim7101_wdt.c
drivers/char/watchdog/alim7101_wdt.c
+4
-11
drivers/char/watchdog/cpu5wdt.c
drivers/char/watchdog/cpu5wdt.c
+4
-9
drivers/char/watchdog/eurotechwdt.c
drivers/char/watchdog/eurotechwdt.c
+1
-1
drivers/char/watchdog/i6300esb.c
drivers/char/watchdog/i6300esb.c
+1
-1
drivers/char/watchdog/i8xx_tco.c
drivers/char/watchdog/i8xx_tco.c
+1
-1
drivers/char/watchdog/iTCO_wdt.c
drivers/char/watchdog/iTCO_wdt.c
+3
-3
drivers/char/watchdog/ib700wdt.c
drivers/char/watchdog/ib700wdt.c
+127
-65
drivers/char/watchdog/ibmasr.c
drivers/char/watchdog/ibmasr.c
+1
-1
drivers/char/watchdog/indydog.c
drivers/char/watchdog/indydog.c
+1
-1
drivers/char/watchdog/machzwd.c
drivers/char/watchdog/machzwd.c
+6
-12
drivers/char/watchdog/mixcomwd.c
drivers/char/watchdog/mixcomwd.c
+7
-9
drivers/char/watchdog/pc87413_wdt.c
drivers/char/watchdog/pc87413_wdt.c
+1
-1
drivers/char/watchdog/pcwd.c
drivers/char/watchdog/pcwd.c
+3
-5
drivers/char/watchdog/pcwd_pci.c
drivers/char/watchdog/pcwd_pci.c
+2
-2
drivers/char/watchdog/pcwd_usb.c
drivers/char/watchdog/pcwd_usb.c
+2
-2
drivers/char/watchdog/s3c2410_wdt.c
drivers/char/watchdog/s3c2410_wdt.c
+1
-1
drivers/char/watchdog/sbc60xxwdt.c
drivers/char/watchdog/sbc60xxwdt.c
+4
-10
drivers/char/watchdog/sbc8360.c
drivers/char/watchdog/sbc8360.c
+1
-1
drivers/char/watchdog/sbc_epx_c3.c
drivers/char/watchdog/sbc_epx_c3.c
+1
-1
drivers/char/watchdog/sc1200wdt.c
drivers/char/watchdog/sc1200wdt.c
+1
-1
drivers/char/watchdog/sc520_wdt.c
drivers/char/watchdog/sc520_wdt.c
+4
-10
drivers/char/watchdog/shwdt.c
drivers/char/watchdog/shwdt.c
+3
-5
drivers/char/watchdog/smsc37b787_wdt.c
drivers/char/watchdog/smsc37b787_wdt.c
+1
-1
drivers/char/watchdog/softdog.c
drivers/char/watchdog/softdog.c
+1
-1
drivers/char/watchdog/w83627hf_wdt.c
drivers/char/watchdog/w83627hf_wdt.c
+1
-1
drivers/char/watchdog/w83697hf_wdt.c
drivers/char/watchdog/w83697hf_wdt.c
+1
-1
drivers/char/watchdog/w83877f_wdt.c
drivers/char/watchdog/w83877f_wdt.c
+4
-10
drivers/char/watchdog/w83977f_wdt.c
drivers/char/watchdog/w83977f_wdt.c
+1
-1
drivers/char/watchdog/wafer5823wdt.c
drivers/char/watchdog/wafer5823wdt.c
+1
-1
drivers/char/watchdog/wdt.c
drivers/char/watchdog/wdt.c
+1
-1
drivers/char/watchdog/wdt977.c
drivers/char/watchdog/wdt977.c
+1
-1
drivers/char/watchdog/wdt_pci.c
drivers/char/watchdog/wdt_pci.c
+1
-1
未找到文件。
drivers/char/watchdog/acquirewdt.c
浏览文件 @
88d5a7bb
...
...
@@ -48,46 +48,52 @@
* It can be 1, 2, 10, 20, 110 or 220 seconds.
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/types.h>
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/fs.h>
#include <linux/ioport.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
/*
* Includes, defines, variables, module parameters, ...
*/
/* Includes */
#include <linux/module.h>
/* For module specific items */
#include <linux/moduleparam.h>
/* For new moduleparam's */
#include <linux/types.h>
/* For standard types (like size_t) */
#include <linux/errno.h>
/* For the -ENODEV/... values */
#include <linux/kernel.h>
/* For printk/panic/... */
#include <linux/miscdevice.h>
/* For MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR) */
#include <linux/watchdog.h>
/* For the watchdog specific items */
#include <linux/fs.h>
/* For file operations */
#include <linux/ioport.h>
/* For io-port access */
#include <linux/platform_device.h>
/* For platform_driver framework */
#include <linux/init.h>
/* For __init/__exit/... */
#include <asm/uaccess.h>
/* For copy_to_user/put_user/... */
#include <asm/io.h>
/* For inb/outb/... */
/* Module information */
#define DRV_NAME "acquirewdt"
#define PFX DRV_NAME ": "
#define WATCHDOG_NAME "Acquire WDT"
#define PFX WATCHDOG_NAME ": "
#define WATCHDOG_HEARTBEAT 0
/* There is no way to see what the correct time-out period is */
/* internal variables */
static
struct
platform_device
*
acq_platform_device
;
/* the watchdog platform device */
static
unsigned
long
acq_is_open
;
static
char
expect_close
;
/*
* You must set these - there is no sane way to probe for this board.
*/
static
int
wdt_stop
=
0x43
;
/* module parameters */
static
int
wdt_stop
=
0x43
;
/* You must set this - there is no sane way to probe for this board. */
module_param
(
wdt_stop
,
int
,
0
);
MODULE_PARM_DESC
(
wdt_stop
,
"Acquire WDT 'stop' io port (default 0x43)"
);
static
int
wdt_start
=
0x443
;
static
int
wdt_start
=
0x443
;
/* You must set this - there is no sane way to probe for this board. */
module_param
(
wdt_start
,
int
,
0
);
MODULE_PARM_DESC
(
wdt_start
,
"Acquire WDT 'start' io port (default 0x443)"
);
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
*
Kernel methods.
*
Watchdog Operations
*/
static
void
acq_keepalive
(
void
)
...
...
@@ -103,7 +109,7 @@ static void acq_stop(void)
}
/*
* /dev/watchdog handling
.
* /dev/watchdog handling
*/
static
ssize_t
acq_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
)
...
...
@@ -143,7 +149,7 @@ static int acq_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
{
.
options
=
WDIOF_KEEPALIVEPING
|
WDIOF_MAGICCLOSE
,
.
firmware_version
=
1
,
.
identity
=
"Acquire WDT"
,
.
identity
=
WATCHDOG_NAME
,
};
switch
(
cmd
)
...
...
@@ -213,20 +219,6 @@ static int acq_close(struct inode *inode, struct file *file)
return
0
;
}
/*
* Notifier for system down
*/
static
int
acq_notify_sys
(
struct
notifier_block
*
this
,
unsigned
long
code
,
void
*
unused
)
{
if
(
code
==
SYS_DOWN
||
code
==
SYS_HALT
)
{
/* Turn the WDT off */
acq_stop
();
}
return
NOTIFY_DONE
;
}
/*
* Kernel Interfaces
*/
...
...
@@ -240,29 +232,20 @@ static const struct file_operations acq_fops = {
.
release
=
acq_close
,
};
static
struct
miscdevice
acq_miscdev
=
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
acq_fops
,
static
struct
miscdevice
acq_miscdev
=
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
acq_fops
,
};
/*
* The WDT card needs to learn about soft shutdowns in order to
* turn the timebomb registers off.
* Init & exit routines
*/
static
struct
notifier_block
acq_notifier
=
{
.
notifier_call
=
acq_notify_sys
,
};
static
int
__init
acq_init
(
void
)
static
int
__devinit
acq_probe
(
struct
platform_device
*
dev
)
{
int
ret
;
printk
(
KERN_INFO
"WDT driver for Acquire single board computer initialising.
\n
"
);
if
(
wdt_stop
!=
wdt_start
)
{
if
(
!
request_region
(
wdt_stop
,
1
,
WATCHDOG_NAME
))
{
printk
(
KERN_ERR
PFX
"I/O address 0x%04x already in use
\n
"
,
...
...
@@ -279,18 +262,11 @@ 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_re
boot
;
goto
unreg_re
gions
;
}
printk
(
KERN_INFO
PFX
"initialized. (nowayout=%d)
\n
"
,
...
...
@@ -298,8 +274,6 @@ static int __init acq_init(void)
return
0
;
unreg_reboot:
unregister_reboot_notifier
(
&
acq_notifier
);
unreg_regions:
release_region
(
wdt_start
,
1
);
unreg_stop:
...
...
@@ -309,13 +283,60 @@ static int __init acq_init(void)
return
ret
;
}
static
void
__exit
acq_exit
(
void
)
static
int
__devexit
acq_remove
(
struct
platform_device
*
dev
)
{
misc_deregister
(
&
acq_miscdev
);
unregister_reboot_notifier
(
&
acq_notifier
);
release_region
(
wdt_start
,
1
);
if
(
wdt_stop
!=
wdt_start
)
release_region
(
wdt_stop
,
1
);
release_region
(
wdt_start
,
1
);
return
0
;
}
static
void
acq_shutdown
(
struct
platform_device
*
dev
)
{
/* Turn the WDT off if we have a soft shutdown */
acq_stop
();
}
static
struct
platform_driver
acquirewdt_driver
=
{
.
probe
=
acq_probe
,
.
remove
=
__devexit_p
(
acq_remove
),
.
shutdown
=
acq_shutdown
,
.
driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
DRV_NAME
,
},
};
static
int
__init
acq_init
(
void
)
{
int
err
;
printk
(
KERN_INFO
"WDT driver for Acquire single board computer initialising.
\n
"
);
err
=
platform_driver_register
(
&
acquirewdt_driver
);
if
(
err
)
return
err
;
acq_platform_device
=
platform_device_register_simple
(
DRV_NAME
,
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
acq_platform_device
))
{
err
=
PTR_ERR
(
acq_platform_device
);
goto
unreg_platform_driver
;
}
return
0
;
unreg_platform_driver:
platform_driver_unregister
(
&
acquirewdt_driver
);
return
err
;
}
static
void
__exit
acq_exit
(
void
)
{
platform_device_unregister
(
acq_platform_device
);
platform_driver_unregister
(
&
acquirewdt_driver
);
printk
(
KERN_INFO
PFX
"Watchdog Module Unloaded.
\n
"
);
}
module_init
(
acq_init
);
...
...
drivers/char/watchdog/advantechwdt.c
浏览文件 @
88d5a7bb
...
...
@@ -35,18 +35,19 @@
#include <linux/watchdog.h>
#include <linux/fs.h>
#include <linux/ioport.h>
#include <linux/notifier.h>
#include <linux/reboot.h>
#include <linux/platform_device.h>
#include <linux/init.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#define DRV_NAME "advantechwdt"
#define PFX DRV_NAME ": "
#define WATCHDOG_NAME "Advantech WDT"
#define PFX WATCHDOG_NAME ": "
#define WATCHDOG_TIMEOUT 60
/* 60 sec default timeout */
static
struct
platform_device
*
advwdt_platform_device
;
/* the watchdog platform device */
static
unsigned
long
advwdt_is_open
;
static
char
adv_expect_close
;
...
...
@@ -75,10 +76,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, defaul
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
*
Kernel methods.
*
Watchdog Operations
*/
static
void
...
...
@@ -94,6 +95,20 @@ advwdt_disable(void)
inb_p
(
wdt_stop
);
}
static
int
advwdt_set_heartbeat
(
int
t
)
{
if
((
t
<
1
)
||
(
t
>
63
))
return
-
EINVAL
;
timeout
=
t
;
return
0
;
}
/*
* /dev/watchdog handling
*/
static
ssize_t
advwdt_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
...
...
@@ -126,7 +141,7 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
static
struct
watchdog_info
ident
=
{
.
options
=
WDIOF_KEEPALIVEPING
|
WDIOF_SETTIMEOUT
|
WDIOF_MAGICCLOSE
,
.
firmware_version
=
1
,
.
identity
=
"Advantech WDT"
,
.
identity
=
WATCHDOG_NAME
,
};
switch
(
cmd
)
{
...
...
@@ -146,9 +161,8 @@ advwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
case
WDIOC_SETTIMEOUT
:
if
(
get_user
(
new_timeout
,
p
))
return
-
EFAULT
;
if
(
(
new_timeout
<
1
)
||
(
new_timeout
>
63
))
if
(
advwdt_set_heartbeat
(
new_timeout
))
return
-
EINVAL
;
timeout
=
new_timeout
;
advwdt_ping
();
/* Fall */
...
...
@@ -208,21 +222,6 @@ advwdt_close(struct inode *inode, struct file *file)
return
0
;
}
/*
* Notifier for system down
*/
static
int
advwdt_notify_sys
(
struct
notifier_block
*
this
,
unsigned
long
code
,
void
*
unused
)
{
if
(
code
==
SYS_DOWN
||
code
==
SYS_HALT
)
{
/* Turn the WDT off */
advwdt_disable
();
}
return
NOTIFY_DONE
;
}
/*
* Kernel Interfaces
*/
...
...
@@ -237,33 +236,20 @@ static const struct file_operations advwdt_fops = {
};
static
struct
miscdevice
advwdt_miscdev
=
{
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
advwdt_fops
,
.
minor
=
WATCHDOG_MINOR
,
.
name
=
"watchdog"
,
.
fops
=
&
advwdt_fops
,
};
/*
* The WDT needs to learn about soft shutdowns in order to
* turn the timebomb registers off.
* Init & exit routines
*/
static
struct
notifier_block
advwdt_notifier
=
{
.
notifier_call
=
advwdt_notify_sys
,
};
static
int
__init
advwdt_init
(
void
)
static
int
__devinit
advwdt_probe
(
struct
platform_device
*
dev
)
{
int
ret
;
printk
(
KERN_INFO
"WDT driver for Advantech single board computer initialising.
\n
"
);
if
(
timeout
<
1
||
timeout
>
63
)
{
timeout
=
WATCHDOG_TIMEOUT
;
printk
(
KERN_INFO
PFX
"timeout value must be 1<=x<=63, using %d
\n
"
,
timeout
);
}
if
(
wdt_stop
!=
wdt_start
)
{
if
(
!
request_region
(
wdt_stop
,
1
,
WATCHDOG_NAME
))
{
printk
(
KERN_ERR
PFX
"I/O address 0x%04x already in use
\n
"
,
...
...
@@ -280,18 +266,18 @@ advwdt_init(void)
goto
unreg_stop
;
}
ret
=
register_reboot_notifier
(
&
advwdt_notifier
);
if
(
ret
!=
0
)
{
printk
(
KERN_ERR
PFX
"cannot register reboot notifier (err=%d)
\n
"
,
ret
);
goto
unreg_regions
;
/* Check that the heartbeat value is within it's range ; if not reset to the default */
if
(
advwdt_set_heartbeat
(
timeout
)
)
{
advwdt_set_heartbeat
(
WATCHDOG_TIMEOUT
);
printk
(
KERN_INFO
PFX
"timeout value must be 1<=x<=63, using %d
\n
"
,
timeout
)
;
}
ret
=
misc_register
(
&
advwdt_miscdev
);
if
(
ret
!=
0
)
{
printk
(
KERN_ERR
PFX
"cannot register miscdev on minor=%d (err=%d)
\n
"
,
WATCHDOG_MINOR
,
ret
);
goto
unreg_re
boot
;
goto
unreg_re
gions
;
}
printk
(
KERN_INFO
PFX
"initialized. timeout=%d sec (nowayout=%d)
\n
"
,
...
...
@@ -299,8 +285,6 @@ advwdt_init(void)
out:
return
ret
;
unreg_reboot:
unregister_reboot_notifier
(
&
advwdt_notifier
);
unreg_regions:
release_region
(
wdt_start
,
1
);
unreg_stop:
...
...
@@ -309,14 +293,64 @@ advwdt_init(void)
goto
out
;
}
static
void
__
exit
advwdt_
exit
(
void
)
static
int
__dev
exit
advwdt_
remove
(
struct
platform_device
*
dev
)
{
misc_deregister
(
&
advwdt_miscdev
);
unregister_reboot_notifier
(
&
advwdt_notifier
);
release_region
(
wdt_start
,
1
);
if
(
wdt_stop
!=
wdt_start
)
release_region
(
wdt_stop
,
1
);
release_region
(
wdt_start
,
1
);
return
0
;
}
static
void
advwdt_shutdown
(
struct
platform_device
*
dev
)
{
/* Turn the WDT off if we have a soft shutdown */
advwdt_disable
();
}
static
struct
platform_driver
advwdt_driver
=
{
.
probe
=
advwdt_probe
,
.
remove
=
__devexit_p
(
advwdt_remove
),
.
shutdown
=
advwdt_shutdown
,
.
driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
DRV_NAME
,
},
};
static
int
__init
advwdt_init
(
void
)
{
int
err
;
printk
(
KERN_INFO
"WDT driver for Advantech single board computer initialising.
\n
"
);
err
=
platform_driver_register
(
&
advwdt_driver
);
if
(
err
)
return
err
;
advwdt_platform_device
=
platform_device_register_simple
(
DRV_NAME
,
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
advwdt_platform_device
))
{
err
=
PTR_ERR
(
advwdt_platform_device
);
goto
unreg_platform_driver
;
}
return
0
;
unreg_platform_driver:
platform_driver_unregister
(
&
advwdt_driver
);
return
err
;
}
static
void
__exit
advwdt_exit
(
void
)
{
platform_device_unregister
(
advwdt_platform_device
);
platform_driver_unregister
(
&
advwdt_driver
);
printk
(
KERN_INFO
PFX
"Watchdog Module Unloaded.
\n
"
);
}
module_init
(
advwdt_init
);
...
...
drivers/char/watchdog/alim1535_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -40,7 +40,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (0<timeout<18000, defaul
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* ali_start - start watchdog countdown
...
...
drivers/char/watchdog/alim7101_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -69,7 +69,7 @@ module_param(use_gpio, int, 0);
MODULE_PARM_DESC
(
use_gpio
,
"Use the gpio watchdog. (required by old cobalt boards)"
);
static
void
wdt_timer_ping
(
unsigned
long
);
static
struct
timer_list
timer
;
static
DEFINE_TIMER
(
timer
,
wdt_timer_ping
,
0
,
1
)
;
static
unsigned
long
next_heartbeat
;
static
unsigned
long
wdt_is_open
;
static
char
wdt_expect_close
;
...
...
@@ -78,7 +78,7 @@ static struct pci_dev *alim7101_pmu;
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default="
__
stringify
(
CONFIG_
WATCHDOG_NOWAYOUT
)
")"
);
__
MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
")"
);
/*
* Whack the dog
...
...
@@ -108,8 +108,7 @@ static void wdt_timer_ping(unsigned long data)
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
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
}
/*
...
...
@@ -147,9 +146,7 @@ static void wdt_startup(void)
wdt_change
(
WDT_ENABLE
);
/* Start the timer */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
printk
(
KERN_INFO
PFX
"Watchdog timer is now enabled.
\n
"
);
}
...
...
@@ -380,10 +377,6 @@ static int __init alim7101_wdt_init(void)
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
"
,
...
...
drivers/char/watchdog/cpu5wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -80,10 +80,8 @@ static void cpu5wdt_trigger(unsigned long unused)
outb
(
1
,
port
+
CPU5WDT_TRIGGER_REG
);
/* requeue?? */
if
(
cpu5wdt_device
.
queue
&&
ticks
)
{
cpu5wdt_device
.
timer
.
expires
=
jiffies
+
CPU5WDT_INTERVAL
;
add_timer
(
&
cpu5wdt_device
.
timer
);
}
if
(
cpu5wdt_device
.
queue
&&
ticks
)
mod_timer
(
&
cpu5wdt_device
.
timer
,
jiffies
+
CPU5WDT_INTERVAL
);
else
{
/* ticks doesn't matter anyway */
complete
(
&
cpu5wdt_device
.
stop
);
...
...
@@ -109,8 +107,7 @@ static void cpu5wdt_start(void)
outb
(
1
,
port
+
CPU5WDT_MODE_REG
);
outb
(
0
,
port
+
CPU5WDT_RESET_REG
);
outb
(
0
,
port
+
CPU5WDT_ENABLE_REG
);
cpu5wdt_device
.
timer
.
expires
=
jiffies
+
CPU5WDT_INTERVAL
;
add_timer
(
&
cpu5wdt_device
.
timer
);
mod_timer
(
&
cpu5wdt_device
.
timer
,
jiffies
+
CPU5WDT_INTERVAL
);
}
/* if process dies, counter is not decremented */
cpu5wdt_device
.
running
++
;
...
...
@@ -245,9 +242,7 @@ static int __devinit cpu5wdt_init(void)
clear_bit
(
0
,
&
cpu5wdt_device
.
inuse
);
init_timer
(
&
cpu5wdt_device
.
timer
);
cpu5wdt_device
.
timer
.
function
=
cpu5wdt_trigger
;
cpu5wdt_device
.
timer
.
data
=
0
;
setup_timer
(
&
cpu5wdt_device
.
timer
,
cpu5wdt_trigger
,
0
);
cpu5wdt_device
.
default_ticks
=
ticks
;
...
...
drivers/char/watchdog/eurotechwdt.c
浏览文件 @
88d5a7bb
...
...
@@ -73,7 +73,7 @@ static char *ev = "int";
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Some symbolic names
...
...
drivers/char/watchdog/i6300esb.c
浏览文件 @
88d5a7bb
...
...
@@ -91,7 +91,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (1<heartbeat<2046, d
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Some i6300ESB specific functions
...
...
drivers/char/watchdog/i8xx_tco.c
浏览文件 @
88d5a7bb
...
...
@@ -109,7 +109,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<heartbeat<39, def
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Some TCO specific functions
...
...
drivers/char/watchdog/iTCO_wdt.c
浏览文件 @
88d5a7bb
/*
* intel TCO Watchdog Driver (Used in i82801 and i6300ESB chipsets)
*
* (c) Copyright 2006 Wim Van Sebroeck <wim@iguana.be>.
* (c) Copyright 2006
-2007
Wim Van Sebroeck <wim@iguana.be>.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
...
...
@@ -49,7 +49,7 @@
/* Module and version information */
#define DRV_NAME "iTCO_wdt"
#define DRV_VERSION "1.01"
#define DRV_RELDATE "
11-Nov-2006
"
#define DRV_RELDATE "
21-Jan-2007
"
#define PFX DRV_NAME ": "
/* Includes */
...
...
@@ -187,7 +187,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<heartbeat<39 (TCO
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/* iTCO Vendor Specific Support hooks */
#ifdef CONFIG_ITCO_VENDOR_SUPPORT
...
...
drivers/char/watchdog/ib700wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -3,8 +3,8 @@
*
* (c) Copyright 2001 Charles Howes <chowes@vsol.net>
*
*
Based on advantechwdt.c which is based on acquirewdt.c which
*
is based on wdt.c.
*
Based on advantechwdt.c which is based on acquirewdt.c which
*
is based on wdt.c.
*
* (c) Copyright 2000-2001 Marek Michalkiewicz <marekm@linux.org.pl>
*
...
...
@@ -25,9 +25,9 @@
*
* (c) Copyright 1995 Alan Cox <alan@redhat.com>
*
*
14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
*
Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
*
Added timeout module option to override default
*
14-Dec-2001 Matt Domsch <Matt_Domsch@dell.com>
*
Added nowayout module option to override CONFIG_WATCHDOG_NOWAYOUT
*
Added timeout module option to override default
*
*/
...
...
@@ -36,22 +36,24 @@
#include <linux/miscdevice.h>
#include <linux/watchdog.h>
#include <linux/ioport.h>
#include <linux/notifier.h>
#include <linux/fs.h>
#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/moduleparam.h>
#include <linux/platform_device.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/system.h>
static
struct
platform_device
*
ibwdt_platform_device
;
static
unsigned
long
ibwdt_is_open
;
static
spinlock_t
ibwdt_lock
;
static
char
expect_close
;
#define PFX "ib700wdt: "
/* Module information */
#define DRV_NAME "ib700wdt"
#define PFX DRV_NAME ": "
/*
*
...
...
@@ -118,20 +120,51 @@ static int wd_margin = WD_TIMO;
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
*
Kernel methods.
*
Watchdog Operations
*/
static
void
ibwdt_ping
(
void
)
{
spin_lock
(
&
ibwdt_lock
);
/* Write a watchdog value */
outb_p
(
wd_margin
,
WDT_START
);
spin_unlock
(
&
ibwdt_lock
);
}
static
void
ibwdt_disable
(
void
)
{
spin_lock
(
&
ibwdt_lock
);
outb_p
(
0
,
WDT_STOP
);
spin_unlock
(
&
ibwdt_lock
);
}
static
int
ibwdt_set_heartbeat
(
int
t
)
{
int
i
;
if
((
t
<
0
)
||
(
t
>
30
))
return
-
EINVAL
;
for
(
i
=
0x0F
;
i
>
-
1
;
i
--
)
if
(
wd_times
[
i
]
>
t
)
break
;
wd_margin
=
i
;
return
0
;
}
/*
* /dev/watchdog handling
*/
static
ssize_t
ibwdt_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
...
...
@@ -159,7 +192,7 @@ static int
ibwdt_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
int
i
,
new_margin
;
int
new_margin
;
void
__user
*
argp
=
(
void
__user
*
)
arg
;
int
__user
*
p
=
argp
;
...
...
@@ -176,6 +209,7 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
break
;
case
WDIOC_GETSTATUS
:
case
WDIOC_GETBOOTSTATUS
:
return
put_user
(
0
,
p
);
case
WDIOC_KEEPALIVE
:
...
...
@@ -185,18 +219,33 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
case
WDIOC_SETTIMEOUT
:
if
(
get_user
(
new_margin
,
p
))
return
-
EFAULT
;
if
(
(
new_margin
<
0
)
||
(
new_margin
>
30
))
if
(
ibwdt_set_heartbeat
(
new_margin
))
return
-
EINVAL
;
for
(
i
=
0x0F
;
i
>
-
1
;
i
--
)
if
(
wd_times
[
i
]
>
new_margin
)
break
;
wd_margin
=
i
;
ibwdt_ping
();
/* Fall */
case
WDIOC_GETTIMEOUT
:
return
put_user
(
wd_times
[
wd_margin
],
p
);
break
;
case
WDIOC_SETOPTIONS
:
{
int
options
,
retval
=
-
EINVAL
;
if
(
get_user
(
options
,
p
))
return
-
EFAULT
;
if
(
options
&
WDIOS_DISABLECARD
)
{
ibwdt_disable
();
retval
=
0
;
}
if
(
options
&
WDIOS_ENABLECARD
)
{
ibwdt_ping
();
retval
=
0
;
}
return
retval
;
}
default:
return
-
ENOTTY
;
...
...
@@ -207,9 +256,7 @@ ibwdt_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
static
int
ibwdt_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
spin_lock
(
&
ibwdt_lock
);
if
(
test_and_set_bit
(
0
,
&
ibwdt_is_open
))
{
spin_unlock
(
&
ibwdt_lock
);
return
-
EBUSY
;
}
if
(
nowayout
)
...
...
@@ -217,40 +264,23 @@ ibwdt_open(struct inode *inode, struct file *file)
/* Activate */
ibwdt_ping
();
spin_unlock
(
&
ibwdt_lock
);
return
nonseekable_open
(
inode
,
file
);
}
static
int
ibwdt_close
(
struct
inode
*
inode
,
struct
file
*
file
)
{
spin_lock
(
&
ibwdt_lock
);
if
(
expect_close
==
42
)
outb_p
(
0
,
WDT_STOP
);
else
if
(
expect_close
==
42
)
{
ibwdt_disable
();
}
else
{
printk
(
KERN_CRIT
PFX
"WDT device closed unexpectedly. WDT will not stop!
\n
"
);
ibwdt_ping
();
}
clear_bit
(
0
,
&
ibwdt_is_open
);
expect_close
=
0
;
spin_unlock
(
&
ibwdt_lock
);
return
0
;
}
/*
* Notifier for system down
*/
static
int
ibwdt_notify_sys
(
struct
notifier_block
*
this
,
unsigned
long
code
,
void
*
unused
)
{
if
(
code
==
SYS_DOWN
||
code
==
SYS_HALT
)
{
/* Turn the WDT off */
outb_p
(
0
,
WDT_STOP
);
}
return
NOTIFY_DONE
;
}
/*
* Kernel Interfaces
*/
...
...
@@ -271,26 +301,14 @@ static struct miscdevice ibwdt_miscdev = {
};
/*
* The WDT needs to learn about soft shutdowns in order to
* turn the timebomb registers off.
* Init & exit routines
*/
static
struct
notifier_block
ibwdt_notifier
=
{
.
notifier_call
=
ibwdt_notify_sys
,
};
static
int
__init
ibwdt_init
(
void
)
static
int
__devinit
ibwdt_probe
(
struct
platform_device
*
dev
)
{
int
res
;
printk
(
KERN_INFO
PFX
"WDT driver for IB700 single board computer initialising.
\n
"
);
spin_lock_init
(
&
ibwdt_lock
);
res
=
misc_register
(
&
ibwdt_miscdev
);
if
(
res
)
{
printk
(
KERN_ERR
PFX
"failed to register misc device
\n
"
);
goto
out_nomisc
;
}
#if WDT_START != WDT_STOP
if
(
!
request_region
(
WDT_STOP
,
1
,
"IB700 WDT"
))
{
...
...
@@ -305,34 +323,78 @@ static int __init ibwdt_init(void)
res
=
-
EIO
;
goto
out_nostartreg
;
}
res
=
register_reboot_notifier
(
&
ibwdt_notifier
);
res
=
misc_register
(
&
ibwdt_miscdev
);
if
(
res
)
{
printk
(
KERN_ERR
PFX
"
Failed to register reboot notifier.
\n
"
);
goto
out_no
reboot
;
printk
(
KERN_ERR
PFX
"
failed to register misc device
\n
"
);
goto
out_no
misc
;
}
return
0
;
out_no
reboot
:
out_no
misc
:
release_region
(
WDT_START
,
1
);
out_nostartreg:
#if WDT_START != WDT_STOP
release_region
(
WDT_STOP
,
1
);
#endif
out_nostopreg:
misc_deregister
(
&
ibwdt_miscdev
);
out_nomisc:
return
res
;
}
static
void
__exit
ibwdt_exit
(
void
)
static
int
__devexit
ibwdt_remove
(
struct
platform_device
*
dev
)
{
misc_deregister
(
&
ibwdt_miscdev
);
unregister_reboot_notifier
(
&
ibwdt_notifier
);
release_region
(
WDT_START
,
1
);
#if WDT_START != WDT_STOP
release_region
(
WDT_STOP
,
1
);
#endif
release_region
(
WDT_START
,
1
);
return
0
;
}
static
void
ibwdt_shutdown
(
struct
platform_device
*
dev
)
{
/* Turn the WDT off if we have a soft shutdown */
ibwdt_disable
();
}
static
struct
platform_driver
ibwdt_driver
=
{
.
probe
=
ibwdt_probe
,
.
remove
=
__devexit_p
(
ibwdt_remove
),
.
shutdown
=
ibwdt_shutdown
,
.
driver
=
{
.
owner
=
THIS_MODULE
,
.
name
=
DRV_NAME
,
},
};
static
int
__init
ibwdt_init
(
void
)
{
int
err
;
printk
(
KERN_INFO
PFX
"WDT driver for IB700 single board computer initialising.
\n
"
);
err
=
platform_driver_register
(
&
ibwdt_driver
);
if
(
err
)
return
err
;
ibwdt_platform_device
=
platform_device_register_simple
(
DRV_NAME
,
-
1
,
NULL
,
0
);
if
(
IS_ERR
(
ibwdt_platform_device
))
{
err
=
PTR_ERR
(
ibwdt_platform_device
);
goto
unreg_platform_driver
;
}
return
0
;
unreg_platform_driver:
platform_driver_unregister
(
&
ibwdt_driver
);
return
err
;
}
static
void
__exit
ibwdt_exit
(
void
)
{
platform_device_unregister
(
ibwdt_platform_device
);
platform_driver_unregister
(
&
ibwdt_driver
);
printk
(
KERN_INFO
PFX
"Watchdog Module Unloaded.
\n
"
);
}
module_init
(
ibwdt_init
);
...
...
drivers/char/watchdog/ibmasr.c
浏览文件 @
88d5a7bb
...
...
@@ -396,7 +396,7 @@ module_init(ibmasr_init);
module_exit
(
ibmasr_exit
);
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
MODULE_DESCRIPTION
(
"IBM Automatic Server Restart driver"
);
MODULE_AUTHOR
(
"Andrey Panin"
);
...
...
drivers/char/watchdog/indydog.c
浏览文件 @
88d5a7bb
...
...
@@ -32,7 +32,7 @@ static int indydog_alive;
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
static
void
indydog_start
(
void
)
{
...
...
drivers/char/watchdog/machzwd.c
浏览文件 @
88d5a7bb
...
...
@@ -95,7 +95,7 @@ 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=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
#define PFX "machzwd"
...
...
@@ -118,12 +118,14 @@ static int action = 0;
module_param
(
action
,
int
,
0
);
MODULE_PARM_DESC
(
action
,
"after watchdog resets, generate: 0 = RESET(*) 1 = SMI 2 = NMI 3 = SCI"
);
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
spinlock_t
zf_lock
;
static
spinlock_t
zf_port_lock
;
static
struct
timer_list
zf_timer
;
static
DEFINE_TIMER
(
zf_timer
,
zf_ping
,
0
,
0
)
;
static
unsigned
long
next_heartbeat
=
0
;
...
...
@@ -220,9 +222,7 @@ static void zf_timer_on(void)
next_heartbeat
=
jiffies
+
ZF_USER_TIMEO
;
/* start the timer for internal ping */
zf_timer
.
expires
=
jiffies
+
ZF_HW_TIMEO
;
add_timer
(
&
zf_timer
);
mod_timer
(
&
zf_timer
,
jiffies
+
ZF_HW_TIMEO
);
/* start watchdog timer */
ctrl_reg
=
zf_get_control
();
...
...
@@ -260,8 +260,7 @@ static void zf_ping(unsigned long data)
zf_set_control
(
ctrl_reg
);
spin_unlock_irqrestore
(
&
zf_port_lock
,
flags
);
zf_timer
.
expires
=
jiffies
+
ZF_HW_TIMEO
;
add_timer
(
&
zf_timer
);
mod_timer
(
&
zf_timer
,
jiffies
+
ZF_HW_TIMEO
);
}
else
{
printk
(
KERN_CRIT
PFX
": I will reset your machine
\n
"
);
}
...
...
@@ -465,11 +464,6 @@ static int __init zf_init(void)
zf_set_status
(
0
);
zf_set_control
(
0
);
/* this is the timer that will do the hard work */
init_timer
(
&
zf_timer
);
zf_timer
.
function
=
zf_ping
;
zf_timer
.
data
=
0
;
return
0
;
no_reboot:
...
...
drivers/char/watchdog/mixcomwd.c
浏览文件 @
88d5a7bb
...
...
@@ -56,16 +56,18 @@ static int mixcomwd_ioports[] = { 0x180, 0x280, 0x380, 0x000 };
#define FLASHCOM_WATCHDOG_OFFSET 0x4
#define FLASHCOM_ID 0x18
static
void
mixcomwd_timerfun
(
unsigned
long
d
);
static
unsigned
long
mixcomwd_opened
;
/* long req'd for setbit --RR */
static
int
watchdog_port
;
static
int
mixcomwd_timer_alive
;
static
DEFINE_TIMER
(
mixcomwd_timer
,
NULL
,
0
,
0
);
static
DEFINE_TIMER
(
mixcomwd_timer
,
mixcomwd_timerfun
,
0
,
0
);
static
char
expect_close
;
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
static
void
mixcomwd_ping
(
void
)
{
...
...
@@ -77,7 +79,7 @@ static void mixcomwd_timerfun(unsigned long d)
{
mixcomwd_ping
();
mod_timer
(
&
mixcomwd_timer
,
jiffies
+
5
*
HZ
);
mod_timer
(
&
mixcomwd_timer
,
jiffies
+
5
*
HZ
);
}
/*
...
...
@@ -114,12 +116,8 @@ static int mixcomwd_release(struct inode *inode, struct file *file)
printk
(
KERN_ERR
"mixcomwd: release called while internal timer alive"
);
return
-
EBUSY
;
}
init_timer
(
&
mixcomwd_timer
);
mixcomwd_timer
.
expires
=
jiffies
+
5
*
HZ
;
mixcomwd_timer
.
function
=
mixcomwd_timerfun
;
mixcomwd_timer
.
data
=
0
;
mixcomwd_timer_alive
=
1
;
add_timer
(
&
mixcomwd_timer
);
mod_timer
(
&
mixcomwd_timer
,
jiffies
+
5
*
HZ
);
}
else
{
printk
(
KERN_CRIT
"mixcomwd: WDT device closed unexpectedly. WDT will not stop!
\n
"
);
}
...
...
@@ -285,7 +283,7 @@ static void __exit mixcomwd_exit(void)
if
(
mixcomwd_timer_alive
)
{
printk
(
KERN_WARNING
"mixcomwd: I quit now, hardware will"
" probably reboot!
\n
"
);
del_timer
(
&
mixcomwd_timer
);
del_timer
_sync
(
&
mixcomwd_timer
);
mixcomwd_timer_alive
=
0
;
}
}
...
...
drivers/char/watchdog/pc87413_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -631,5 +631,5 @@ module_param(timeout, int, 0);
MODULE_PARM_DESC
(
timeout
,
"Watchdog timeout in minutes (default="
__MODULE_STRING
(
timeout
)
")."
);
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
drivers/char/watchdog/pcwd.c
浏览文件 @
88d5a7bb
...
...
@@ -71,7 +71,7 @@
/* Module and version information */
#define WATCHDOG_VERSION "1.18"
#define WATCHDOG_DATE "
06
Jan 2007"
#define WATCHDOG_DATE "
21
Jan 2007"
#define WATCHDOG_DRIVER_NAME "ISA-PC Watchdog"
#define WATCHDOG_NAME "pcwd"
#define PFX WATCHDOG_NAME ": "
...
...
@@ -186,7 +186,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (2<=heartbeat<=7200
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Internal functions
...
...
@@ -843,9 +843,7 @@ static int __devinit pcwatchdog_init(int base_addr)
/* clear the "card caused reboot" flag */
pcwd_clear_status
();
init_timer
(
&
pcwd_private
.
timer
);
pcwd_private
.
timer
.
function
=
pcwd_timer_ping
;
pcwd_private
.
timer
.
data
=
0
;
setup_timer
(
&
pcwd_private
.
timer
,
pcwd_timer_ping
,
0
);
/* Disable the board */
pcwd_stop
();
...
...
drivers/char/watchdog/pcwd_pci.c
浏览文件 @
88d5a7bb
...
...
@@ -52,7 +52,7 @@
/* Module and version information */
#define WATCHDOG_VERSION "1.03"
#define WATCHDOG_DATE "
06
Jan 2007"
#define WATCHDOG_DATE "
21
Jan 2007"
#define WATCHDOG_DRIVER_NAME "PCI-PC Watchdog"
#define WATCHDOG_NAME "pcwd_pci"
#define PFX WATCHDOG_NAME ": "
...
...
@@ -138,7 +138,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 o
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Internal functions
...
...
drivers/char/watchdog/pcwd_usb.c
浏览文件 @
88d5a7bb
...
...
@@ -57,7 +57,7 @@
/* Module and Version Information */
#define DRIVER_VERSION "1.02"
#define DRIVER_DATE "
06
Jan 2007"
#define DRIVER_DATE "
21
Jan 2007"
#define DRIVER_AUTHOR "Wim Van Sebroeck <wim@iguana.be>"
#define DRIVER_DESC "Berkshire USB-PC Watchdog driver"
#define DRIVER_LICENSE "GPL"
...
...
@@ -81,7 +81,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536 o
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/* The vendor and product id's for the USB-PC Watchdog card */
#define USB_PCWD_VENDOR_ID 0x0c98
...
...
drivers/char/watchdog/s3c2410_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -78,7 +78,7 @@ MODULE_PARM_DESC(tmr_margin, "Watchdog tmr_margin in seconds. default=" __MODULE
MODULE_PARM_DESC
(
tmr_atboot
,
"Watchdog is started at boot time if set to 1, default="
__MODULE_STRING
(
CONFIG_S3C2410_WATCHDOG_ATBOOT
));
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
MODULE_PARM_DESC
(
soft_noboot
,
"Watchdog action, set to 1 to ignore reboots, 0 to reboot (default depends on ONLY_TESTING)"
);
...
...
drivers/char/watchdog/sbc60xxwdt.c
浏览文件 @
88d5a7bb
...
...
@@ -100,10 +100,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
static
void
wdt_timer_ping
(
unsigned
long
);
static
struct
timer_list
timer
;
static
DEFINE_TIMER
(
timer
,
wdt_timer_ping
,
0
,
0
)
;
static
unsigned
long
next_heartbeat
;
static
unsigned
long
wdt_is_open
;
static
char
wdt_expect_close
;
...
...
@@ -122,8 +122,7 @@ static void wdt_timer_ping(unsigned long data)
/* Ping the WDT by reading from wdt_start */
inb_p
(
wdt_start
);
/* Re-set the timer interval */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
}
else
{
printk
(
KERN_WARNING
PFX
"Heartbeat lost! Will not ping the watchdog
\n
"
);
}
...
...
@@ -138,8 +137,7 @@ static void wdt_startup(void)
next_heartbeat
=
jiffies
+
(
timeout
*
HZ
);
/* Start the timer */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
printk
(
KERN_INFO
PFX
"Watchdog timer is now enabled.
\n
"
);
}
...
...
@@ -363,10 +361,6 @@ static int __init sbc60xxwdt_init(void)
}
}
init_timer
(
&
timer
);
timer
.
function
=
wdt_timer_ping
;
timer
.
data
=
0
;
rc
=
misc_register
(
&
wdt_miscdev
);
if
(
rc
)
{
...
...
drivers/char/watchdog/sbc8360.c
浏览文件 @
88d5a7bb
...
...
@@ -204,7 +204,7 @@ module_param(timeout, int, 0);
MODULE_PARM_DESC
(
timeout
,
"Index into timeout table (0-63) (default=27 (60s))"
);
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Kernel methods.
...
...
drivers/char/watchdog/sbc_epx_c3.c
浏览文件 @
88d5a7bb
...
...
@@ -35,7 +35,7 @@ static int epx_c3_alive;
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
#define EPXC3_WATCHDOG_CTL_REG 0x1ee
/* write 1 to enable, 0 to disable */
#define EPXC3_WATCHDOG_PET_REG 0x1ef
/* write anything to pet once enabled */
...
...
drivers/char/watchdog/sc1200wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -92,7 +92,7 @@ MODULE_PARM_DESC(timeout, "range is 0-255 minutes, default is 1");
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
...
...
drivers/char/watchdog/sc520_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -97,7 +97,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* AMD Elan SC520 - Watchdog Timer Registers
...
...
@@ -121,7 +121,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
static
__u16
__iomem
*
wdtmrctl
;
static
void
wdt_timer_ping
(
unsigned
long
);
static
struct
timer_list
timer
;
static
DEFINE_TIMER
(
timer
,
wdt_timer_ping
,
0
,
0
)
;
static
unsigned
long
next_heartbeat
;
static
unsigned
long
wdt_is_open
;
static
char
wdt_expect_close
;
...
...
@@ -145,8 +145,7 @@ static void wdt_timer_ping(unsigned long data)
spin_unlock
(
&
wdt_spinlock
);
/* Re-set the timer interval */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
}
else
{
printk
(
KERN_WARNING
PFX
"Heartbeat lost! Will not ping the watchdog
\n
"
);
}
...
...
@@ -179,8 +178,7 @@ static int wdt_startup(void)
next_heartbeat
=
jiffies
+
(
timeout
*
HZ
);
/* Start the timer */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
/* Start the watchdog */
wdt_config
(
WDT_ENB
|
WDT_WRST_ENB
|
WDT_EXP_SEL_04
);
...
...
@@ -389,10 +387,6 @@ static int __init sc520_wdt_init(void)
spin_lock_init
(
&
wdt_spinlock
);
init_timer
(
&
timer
);
timer
.
function
=
wdt_timer_ping
;
timer
.
data
=
0
;
/* Check that the timeout value is within it's range ; if not reset to the default */
if
(
wdt_set_heartbeat
(
timeout
))
{
wdt_set_heartbeat
(
WATCHDOG_TIMEOUT
);
...
...
drivers/char/watchdog/shwdt.c
浏览文件 @
88d5a7bb
...
...
@@ -65,10 +65,12 @@ static int clock_division_ratio = WTCSR_CKS_4096;
#define next_ping_period(cks) msecs_to_jiffies(cks - 4)
static
void
sh_wdt_ping
(
unsigned
long
data
);
static
unsigned
long
shwdt_is_open
;
static
struct
watchdog_info
sh_wdt_info
;
static
char
shwdt_expect_close
;
static
struct
timer_list
timer
;
static
DEFINE_TIMER
(
timer
,
sh_wdt_ping
,
0
,
0
)
;
static
unsigned
long
next_heartbeat
;
#define WATCHDOG_HEARTBEAT 30
/* 30 sec default heartbeat */
...
...
@@ -433,10 +435,6 @@ static int __init sh_wdt_init(void)
"be 1<=x<=3600, using %d
\n
"
,
heartbeat
);
}
init_timer
(
&
timer
);
timer
.
function
=
sh_wdt_ping
;
timer
.
data
=
0
;
rc
=
register_reboot_notifier
(
&
sh_wdt_notifier
);
if
(
unlikely
(
rc
))
{
printk
(
KERN_ERR
PFX
"Can't register reboot notifier (err=%d)
\n
"
,
...
...
drivers/char/watchdog/smsc37b787_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -624,4 +624,4 @@ module_param(timeout, int, 0);
MODULE_PARM_DESC
(
timeout
,
"range is 1-255 units, default is 60"
);
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
drivers/char/watchdog/softdog.c
浏览文件 @
88d5a7bb
...
...
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(soft_margin, "Watchdog soft_margin in seconds. (0<soft_margin<6
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
#ifdef ONLY_TESTING
static
int
soft_noboot
=
1
;
...
...
drivers/char/watchdog/w83627hf_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -58,7 +58,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=63, defaul
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Kernel methods.
...
...
drivers/char/watchdog/w83697hf_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -60,7 +60,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, defau
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Kernel methods.
...
...
drivers/char/watchdog/w83877f_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -87,10 +87,10 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. (1<=timeout<=3600, defau
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
static
void
wdt_timer_ping
(
unsigned
long
);
static
struct
timer_list
timer
;
static
DEFINE_TIMER
(
timer
,
wdt_timer_ping
,
0
,
0
)
;
static
unsigned
long
next_heartbeat
;
static
unsigned
long
wdt_is_open
;
static
char
wdt_expect_close
;
...
...
@@ -114,8 +114,7 @@ static void wdt_timer_ping(unsigned long data)
inb_p
(
WDT_PING
);
/* Re-set the timer interval */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
spin_unlock
(
&
wdt_spinlock
);
...
...
@@ -155,8 +154,7 @@ static void wdt_startup(void)
next_heartbeat
=
jiffies
+
(
timeout
*
HZ
);
/* Start the timer */
timer
.
expires
=
jiffies
+
WDT_INTERVAL
;
add_timer
(
&
timer
);
mod_timer
(
&
timer
,
jiffies
+
WDT_INTERVAL
);
wdt_change
(
WDT_ENABLE
);
...
...
@@ -377,10 +375,6 @@ static int __init w83877f_wdt_init(void)
goto
err_out_region1
;
}
init_timer
(
&
timer
);
timer
.
function
=
wdt_timer_ping
;
timer
.
data
=
0
;
rc
=
misc_register
(
&
wdt_miscdev
);
if
(
rc
)
{
...
...
drivers/char/watchdog/w83977f_wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -59,7 +59,7 @@ MODULE_PARM_DESC(testmode,"Watchdog testmode (1 = no reboot), default=0");
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Start the watchdog
...
...
drivers/char/watchdog/wafer5823wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -65,7 +65,7 @@ MODULE_PARM_DESC(timeout, "Watchdog timeout in seconds. 1<= timeout <=255, defau
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
static
void
wafwdt_ping
(
void
)
{
...
...
drivers/char/watchdog/wdt.c
浏览文件 @
88d5a7bb
...
...
@@ -64,7 +64,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536,
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/* You must set these - there is no sane way to probe for this board. */
static
int
io
=
0x240
;
...
...
drivers/char/watchdog/wdt977.c
浏览文件 @
88d5a7bb
...
...
@@ -68,7 +68,7 @@ MODULE_PARM_DESC(testmode,"Watchdog testmode (1 = no reboot), default=0");
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
/*
* Start the watchdog
...
...
drivers/char/watchdog/wdt_pci.c
浏览文件 @
88d5a7bb
...
...
@@ -90,7 +90,7 @@ MODULE_PARM_DESC(heartbeat, "Watchdog heartbeat in seconds. (0<heartbeat<65536,
static
int
nowayout
=
WATCHDOG_NOWAYOUT
;
module_param
(
nowayout
,
int
,
0
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
CONFIG_WATCHDOG_NOWAYOUT
)"
);
MODULE_PARM_DESC
(
nowayout
,
"Watchdog cannot be stopped once started (default=
"
__MODULE_STRING
(
WATCHDOG_NOWAYOUT
)
"
)"
);
#ifdef CONFIG_WDT_501_PCI
/* Support for the Fan Tachometer on the PCI-WDT501 */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录