Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
8ec11413
Commit
8ec11413
authored
Jan 10, 2003
by
Dave Jones
Committed by
Dave Jones
Jan 10, 2003
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[WATCHDOG] eurotech indentation fixes
parent
6b82f019
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
249 additions
and
251 deletions
+249
-251
drivers/char/watchdog/eurotechwdt.c
drivers/char/watchdog/eurotechwdt.c
+249
-251
No files found.
drivers/char/watchdog/eurotechwdt.c
View file @
8ec11413
...
...
@@ -7,23 +7,23 @@
* Based on wdt.c.
* Original copyright messages:
*
*
(c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved.
*
http://www.redhat.com
*
(c) Copyright 1996-1997 Alan Cox <alan@redhat.com>, All Rights Reserved.
*
http://www.redhat.com
*
*
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.
*
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.
*
*
Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
*
warranty for any of this software. This material is provided
*
"AS-IS" and at no charge.
*
Neither Alan Cox nor CymruNet Ltd. admit liability nor provide
*
warranty for any of this software. This material is provided
*
"AS-IS" and at no charge.
*
*
(c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk>*
*
(c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk>
*
*
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
*/
#include <linux/config.h>
...
...
@@ -51,15 +51,15 @@ static int eurwdt_is_open;
static
spinlock_t
eurwdt_lock
;
/*
*
You must set these - there is no sane way to probe for this board.
*
You can use wdt=x,y to set these now.
* You must set these - there is no sane way to probe for this board.
* You can use wdt=x,y to set these now.
*/
static
int
io
=
0x3f0
;
static
int
irq
=
10
;
static
char
*
ev
=
"int"
;
#define WDT_TIMEOUT 60
/* 1 minute */
#define WDT_TIMEOUT 60
/* 1 minute */
static
int
timeout
=
WDT_TIMEOUT
;
MODULE_PARM
(
timeout
,
"i"
);
...
...
@@ -80,10 +80,10 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
#define WDT_CTRL_REG 0x30
#define WDT_OUTPIN_CFG 0xe2
#define WDT_EVENT_INT
0x00
#define WDT_EVENT_REBOOT
0x08
#define WDT_EVENT_INT
0x00
#define WDT_EVENT_REBOOT
0x08
#define WDT_UNIT_SEL 0xf1
#define WDT_UNIT_SECS
0x80
#define WDT_UNIT_SECS
0x80
#define WDT_TIMEOUT_VAL 0xf2
#define WDT_TIMER_CFG 0xf3
...
...
@@ -91,27 +91,27 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
#ifndef MODULE
/**
*
eurwdt_setup:
*
@str: command line string
* eurwdt_setup:
* @str: command line string
*
*
Setup options. The board isn't really probe-able so we have to
*
get the user to tell us the configuration. Sane people build it
*
modular but the others come here.
* Setup options. The board isn't really probe-able so we have to
* get the user to tell us the configuration. Sane people build it
* modular but the others come here.
*/
static
int
__init
eurwdt_setup
(
char
*
str
)
{
int
ints
[
4
];
int
ints
[
4
];
str
=
get_options
(
str
,
ARRAY_SIZE
(
ints
),
ints
);
str
=
get_options
(
str
,
ARRAY_SIZE
(
ints
),
ints
);
if
(
ints
[
0
]
>
0
)
{
io
=
ints
[
1
];
if
(
ints
[
0
]
>
1
)
irq
=
ints
[
2
];
}
if
(
ints
[
0
]
>
0
)
{
io
=
ints
[
1
];
if
(
ints
[
0
]
>
1
)
irq
=
ints
[
2
];
}
return
1
;
return
1
;
}
__setup
(
"wdt="
,
eurwdt_setup
);
...
...
@@ -127,7 +127,7 @@ MODULE_PARM_DESC(ev, "Eurotech WDT event type (default is `reboot')");
/*
*
Programming support
* Programming support
*/
static
void
__init
eurwdt_validate_timeout
(
void
)
...
...
@@ -135,265 +135,263 @@ static void __init eurwdt_validate_timeout(void)
if
(
timeout
<
0
||
timeout
>
255
)
{
timeout
=
WDT_TIMEOUT
;
printk
(
KERN_INFO
"eurwdt: timeout must be 0 < x < 255, using %d
\n
"
,
timeout
);
timeout
);
}
}
static
inline
void
eurwdt_write_reg
(
u8
index
,
u8
data
)
{
outb
(
index
,
io
);
outb
(
data
,
io
+
1
);
outb
(
index
,
io
);
outb
(
data
,
io
+
1
);
}
static
inline
void
eurwdt_lock_chip
(
void
)
{
outb
(
0xaa
,
io
);
outb
(
0xaa
,
io
);
}
static
inline
void
eurwdt_unlock_chip
(
void
)
{
outb
(
0x55
,
io
);
eurwdt_write_reg
(
0x07
,
0x08
);
/* set the logical device */
outb
(
0x55
,
io
);
eurwdt_write_reg
(
0x07
,
0x08
);
/* set the logical device */
}
static
inline
void
eurwdt_set_timeout
(
int
timeout
)
{
eurwdt_write_reg
(
WDT_TIMEOUT_VAL
,
(
u8
)
timeout
);
eurwdt_write_reg
(
WDT_TIMEOUT_VAL
,
(
u8
)
timeout
);
}
static
inline
void
eurwdt_disable_timer
(
void
)
{
eurwdt_set_timeout
(
0
);
eurwdt_set_timeout
(
0
);
}
static
void
eurwdt_activate_timer
(
void
)
{
eurwdt_disable_timer
();
eurwdt_write_reg
(
WDT_CTRL_REG
,
0x01
);
/* activate the WDT */
eurwdt_write_reg
(
WDT_OUTPIN_CFG
,
!
strcmp
(
"int"
,
ev
)
?
WDT_EVENT_INT
:
WDT_EVENT_REBOOT
);
/* Setting interrupt line */
if
(
irq
==
2
||
irq
>
15
||
irq
<
0
)
{
printk
(
KERN_ERR
": invalid irq number
\n
"
);
irq
=
0
;
/* if invalid we disable interrupt */
}
if
(
irq
==
0
)
printk
(
KERN_INFO
": interrupt disabled
\n
"
);
eurwdt_write_reg
(
WDT_TIMER_CFG
,
irq
<<
4
);
eurwdt_write_reg
(
WDT_UNIT_SEL
,
WDT_UNIT_SECS
);
/* we use seconds */
eurwdt_set_timeout
(
0
);
/* the default timeout */
eurwdt_disable_timer
();
eurwdt_write_reg
(
WDT_CTRL_REG
,
0x01
);
/* activate the WDT */
eurwdt_write_reg
(
WDT_OUTPIN_CFG
,
!
strcmp
(
"int"
,
ev
)
?
WDT_EVENT_INT
:
WDT_EVENT_REBOOT
);
/* Setting interrupt line */
if
(
irq
==
2
||
irq
>
15
||
irq
<
0
)
{
printk
(
KERN_ERR
": invalid irq number
\n
"
);
irq
=
0
;
/* if invalid we disable interrupt */
}
if
(
irq
==
0
)
printk
(
KERN_INFO
": interrupt disabled
\n
"
);
eurwdt_write_reg
(
WDT_TIMER_CFG
,
irq
<<
4
);
eurwdt_write_reg
(
WDT_UNIT_SEL
,
WDT_UNIT_SECS
);
/* we use seconds */
eurwdt_set_timeout
(
0
);
/* the default timeout */
}
/*
*
Kernel methods.
* Kernel methods.
*/
void
eurwdt_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
printk
(
KERN_CRIT
"timeout WDT timeout
\n
"
);
printk
(
KERN_CRIT
"timeout WDT timeout
\n
"
);
#ifdef ONLY_TESTING
printk
(
KERN_CRIT
"Would Reboot.
\n
"
);
printk
(
KERN_CRIT
"Would Reboot.
\n
"
);
#else
printk
(
KERN_CRIT
"Initiating system reboot.
\n
"
);
machine_restart
(
NULL
);
printk
(
KERN_CRIT
"Initiating system reboot.
\n
"
);
machine_restart
(
NULL
);
#endif
}
/**
*
eurwdt_ping:
* eurwdt_ping:
*
*
Reload counter one with the watchdog timeout.
* Reload counter one with the watchdog timeout.
*/
static
void
eurwdt_ping
(
void
)
{
/* Write the watchdog default value */
eurwdt_set_timeout
(
timeout
);
/* Write the watchdog default value */
eurwdt_set_timeout
(
timeout
);
}
/**
*
eurwdt_write:
*
@file: file handle to the watchdog
*
@buf: buffer to write (unused as data does not matter here
*
@count: count of bytes
*
@ppos: pointer to the position to write. No seeks allowed
* eurwdt_write:
* @file: file handle to the watchdog
* @buf: buffer to write (unused as data does not matter here
* @count: count of bytes
* @ppos: pointer to the position to write. No seeks allowed
*
*
A write to a watchdog device is defined as a keepalive signal. Any
*
write of data will do, as we we don't define content meaning.
* A write to a watchdog device is defined as a keepalive signal. Any
* write of data will do, as we we don't define content meaning.
*/
static
ssize_t
eurwdt_write
(
struct
file
*
file
,
const
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
/* Can't seek (pwrite) on this device */
if
(
ppos
!=
&
file
->
f_pos
)
return
-
ESPIPE
;
/* Can't seek (pwrite) on this device */
if
(
ppos
!=
&
file
->
f_pos
)
return
-
ESPIPE
;
if
(
count
)
{
eurwdt_ping
();
/* the default timeout */
return
1
;
}
if
(
count
)
{
eurwdt_ping
();
/* the default timeout */
return
1
;
}
return
0
;
return
0
;
}
/**
*
eurwdt_ioctl:
*
@inode: inode of the device
*
@file: file handle to the device
*
@cmd: watchdog command
*
@arg: argument pointer
* eurwdt_ioctl:
* @inode: inode of the device
* @file: file handle to the device
* @cmd: watchdog command
* @arg: argument pointer
*
*
The watchdog API defines a common set of functions for all watchdogs
*
according to their available features.
* The watchdog API defines a common set of functions for all watchdogs
* according to their available features.
*/
static
int
eurwdt_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
unsigned
int
cmd
,
unsigned
long
arg
)
{
static
struct
watchdog_info
ident
=
{
.
options
=
WDIOF_CARDRESET
,
.
firmware_version
=
1
,
.
identity
=
"WDT Eurotech CPU-1220/1410"
,
};
static
struct
watchdog_info
ident
=
{
.
options
=
WDIOF_CARDRESET
,
.
firmware_version
=
1
,
.
identity
=
"WDT Eurotech CPU-1220/1410"
,
};
int
time
;
int
time
;
switch
(
cmd
)
{
default:
return
-
ENOTTY
;
switch
(
cmd
)
{
default:
return
-
ENOTTY
;
case
WDIOC_GETSUPPORT
:
return
copy_to_user
((
struct
watchdog_info
*
)
arg
,
&
ident
,
sizeof
(
ident
))
?
-
EFAULT
:
0
;
case
WDIOC_GETSUPPORT
:
return
copy_to_user
((
struct
watchdog_info
*
)
arg
,
&
ident
,
sizeof
(
ident
))
?
-
EFAULT
:
0
;
case
WDIOC_GETBOOTSTATUS
:
return
put_user
(
0
,
(
int
*
)
arg
);
case
WDIOC_GETBOOTSTATUS
:
return
put_user
(
0
,
(
int
*
)
arg
);
case
WDIOC_KEEPALIVE
:
eurwdt_ping
();
return
0
;
case
WDIOC_KEEPALIVE
:
eurwdt_ping
();
return
0
;
case
WDIOC_SETTIMEOUT
:
if
(
copy_from_user
(
&
time
,
(
int
*
)
arg
,
sizeof
(
int
)))
return
-
EFAULT
;
case
WDIOC_SETTIMEOUT
:
if
(
copy_from_user
(
&
time
,
(
int
*
)
arg
,
sizeof
(
int
)))
return
-
EFAULT
;
/* Sanity check */
if
(
time
<
0
||
time
>
255
)
return
-
EINVAL
;
/* Sanity check */
if
(
time
<
0
||
time
>
255
)
return
-
EINVAL
;
timeout
=
time
;
eurwdt_set_timeout
(
time
);
return
0
;
}
timeout
=
time
;
eurwdt_set_timeout
(
time
);
return
0
;
}
}
/**
*
eurwdt_open:
*
@inode: inode of device
*
@file: file handle to device
* eurwdt_open:
* @inode: inode of device
* @file: file handle to device
*
*
The misc device has been opened. The watchdog device is single
*
open and on opening we load the counter.
* The misc device has been opened. The watchdog device is single
* open and on opening we load the counter.
*/
static
int
eurwdt_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
switch
(
minor
(
inode
->
i_rdev
))
{
case
WATCHDOG_MINOR
:
spin_lock
(
&
eurwdt_lock
);
if
(
eurwdt_is_open
)
{
spin_unlock
(
&
eurwdt_lock
);
return
-
EBUSY
;
}
if
(
nowayout
)
{
MOD_INC_USE_COUNT
;
}
eurwdt_is_open
=
1
;
/* Activate the WDT */
eurwdt_activate_timer
();
spin_unlock
(
&
eurwdt_lock
);
MOD_INC_USE_COUNT
;
return
0
;
case
TEMP_MINOR
:
return
0
;
default:
return
-
ENODEV
;
}
switch
(
minor
(
inode
->
i_rdev
))
{
case
WATCHDOG_MINOR
:
spin_lock
(
&
eurwdt_lock
);
if
(
eurwdt_is_open
)
{
spin_unlock
(
&
eurwdt_lock
);
return
-
EBUSY
;
}
if
(
nowayout
)
MOD_INC_USE_COUNT
;
eurwdt_is_open
=
1
;
/* Activate the WDT */
eurwdt_activate_timer
();
spin_unlock
(
&
eurwdt_lock
);
MOD_INC_USE_COUNT
;
return
0
;
case
TEMP_MINOR
:
return
0
;
default:
return
-
ENODEV
;
}
}
/**
*
eurwdt_release:
*
@inode: inode to board
*
@file: file handle to board
* eurwdt_release:
* @inode: inode to board
* @file: file handle to board
*
*
The watchdog has a configurable API. There is a religious dispute
*
between people who want their watchdog to be able to shut down and
*
those who want to be sure if the watchdog manager dies the machine
*
reboots. In the former case we disable the counters, in the latter
*
case you have to open it again very soon.
* The watchdog has a configurable API. There is a religious dispute
* between people who want their watchdog to be able to shut down and
* those who want to be sure if the watchdog manager dies the machine
* reboots. In the former case we disable the counters, in the latter
* case you have to open it again very soon.
*/
static
int
eurwdt_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
if
(
minor
(
inode
->
i_rdev
)
==
WATCHDOG_MINOR
)
{
if
(
!
nowayout
)
{
eurwdt_disable_timer
();
}
eurwdt_is_open
=
0
;
if
(
minor
(
inode
->
i_rdev
)
==
WATCHDOG_MINOR
)
{
if
(
!
nowayout
)
eurwdt_disable_timer
();
MOD_DEC_USE_COUNT
;
}
eurwdt_is_open
=
0
;
MOD_DEC_USE_COUNT
;
}
return
0
;
return
0
;
}
/**
*
eurwdt_notify_sys:
*
@this: our notifier block
*
@code: the event being reported
*
@unused: unused
* eurwdt_notify_sys:
* @this: our notifier block
* @code: the event being reported
* @unused: unused
*
*
Our notifier is called on system shutdowns. We want to turn the card
*
off at reboot otherwise the machine will reboot again during memory
*
test or worse yet during the following fsck. This would suck, in fact
*
trust me - if it happens it does suck.
* Our notifier is called on system shutdowns. We want to turn the card
* off at reboot otherwise the machine will reboot again during memory
* test or worse yet during the following fsck. This would suck, in fact
* trust me - if it happens it does suck.
*/
static
int
eurwdt_notify_sys
(
struct
notifier_block
*
this
,
unsigned
long
code
,
void
*
unused
)
void
*
unused
)
{
if
(
code
==
SYS_DOWN
||
code
==
SYS_HALT
)
{
/* Turn the card off */
eurwdt_disable_timer
();
}
if
(
code
==
SYS_DOWN
||
code
==
SYS_HALT
)
{
/* Turn the card off */
eurwdt_disable_timer
();
}
return
NOTIFY_DONE
;
return
NOTIFY_DONE
;
}
/*
*
Kernel Interfaces
* Kernel Interfaces
*/
static
struct
file_operations
eurwdt_fops
=
{
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
write
=
eurwdt_write
,
.
ioctl
=
eurwdt_ioctl
,
.
open
=
eurwdt_open
,
.
release
=
eurwdt_release
,
.
owner
=
THIS_MODULE
,
.
llseek
=
no_llseek
,
.
write
=
eurwdt_write
,
.
ioctl
=
eurwdt_ioctl
,
.
open
=
eurwdt_open
,
.
release
=
eurwdt_release
,
};
static
struct
miscdevice
eurwdt_miscdev
=
{
...
...
@@ -403,8 +401,8 @@ static struct miscdevice eurwdt_miscdev = {
};
/*
*
The WDT card needs to learn about soft shutdowns in order to
*
turn the timebomb registers off.
* The WDT card needs to learn about soft shutdowns in order to
* turn the timebomb registers off.
*/
static
struct
notifier_block
eurwdt_notifier
=
{
...
...
@@ -412,85 +410,85 @@ static struct notifier_block eurwdt_notifier = {
};
/**
*
cleanup_module:
* cleanup_module:
*
*
Unload the watchdog. You cannot do this with any file handles open.
*
If your watchdog is set to continue ticking on close and you unload
*
it, well it keeps ticking. We won't get the interrupt but the board
*
will not touch PC memory so all is fine. You just have to load a new
*
module in 60 seconds or reboot.
* Unload the watchdog. You cannot do this with any file handles open.
* If your watchdog is set to continue ticking on close and you unload
* it, well it keeps ticking. We won't get the interrupt but the board
* will not touch PC memory so all is fine. You just have to load a new
* module in 60 seconds or reboot.
*/
static
void
__exit
eurwdt_exit
(
void
)
{
eurwdt_lock_chip
();
eurwdt_lock_chip
();
misc_deregister
(
&
eurwdt_miscdev
);
misc_deregister
(
&
eurwdt_miscdev
);
unregister_reboot_notifier
(
&
eurwdt_notifier
);
release_region
(
io
,
2
);
free_irq
(
irq
,
NULL
);
unregister_reboot_notifier
(
&
eurwdt_notifier
);
release_region
(
io
,
2
);
free_irq
(
irq
,
NULL
);
}
/**
*
eurwdt_init:
* eurwdt_init:
*
*
Set up the WDT watchdog board. After grabbing the resources
*
we require we need also to unlock the device.
*
The open() function will actually kick the board off.
* Set up the WDT watchdog board. After grabbing the resources
* we require we need also to unlock the device.
* The open() function will actually kick the board off.
*/
static
int
__init
eurwdt_init
(
void
)
{
int
ret
;
eurwdt_validate_timeout
();
ret
=
misc_register
(
&
eurwdt_miscdev
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: can't misc_register on minor=%d
\n
"
,
WATCHDOG_MINOR
);
goto
out
;
}
ret
=
request_irq
(
irq
,
eurwdt_interrupt
,
SA_INTERRUPT
,
"eurwdt"
,
NULL
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: IRQ %d is not free.
\n
"
,
irq
);
goto
outmisc
;
}
if
(
!
request_region
(
io
,
2
,
"eurwdt"
))
{
printk
(
KERN_ERR
"eurwdt: IO %X is not free.
\n
"
,
io
);
ret
=
-
EBUSY
;
goto
outirq
;
}
ret
=
register_reboot_notifier
(
&
eurwdt_notifier
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: can't register reboot notifier (err=%d)
\n
"
,
ret
);
goto
outreg
;
}
eurwdt_unlock_chip
();
ret
=
0
;
printk
(
KERN_INFO
"Eurotech WDT driver 0.01 at %X (Interrupt %d)"
" - timeout event: %s
\n
"
,
io
,
irq
,
(
!
strcmp
(
"int"
,
ev
)
?
"int"
:
"reboot"
));
spin_lock_init
(
&
eurwdt_lock
);
out:
return
ret
;
outreg:
release_region
(
io
,
2
);
outirq:
free_irq
(
irq
,
NULL
);
outmisc:
misc_deregister
(
&
eurwdt_miscdev
);
goto
out
;
int
ret
;
eurwdt_validate_timeout
();
ret
=
misc_register
(
&
eurwdt_miscdev
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: can't misc_register on minor=%d
\n
"
,
WATCHDOG_MINOR
);
goto
out
;
}
ret
=
request_irq
(
irq
,
eurwdt_interrupt
,
SA_INTERRUPT
,
"eurwdt"
,
NULL
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: IRQ %d is not free.
\n
"
,
irq
);
goto
outmisc
;
}
if
(
!
request_region
(
io
,
2
,
"eurwdt"
))
{
printk
(
KERN_ERR
"eurwdt: IO %X is not free.
\n
"
,
io
);
ret
=
-
EBUSY
;
goto
outirq
;
}
ret
=
register_reboot_notifier
(
&
eurwdt_notifier
);
if
(
ret
)
{
printk
(
KERN_ERR
"eurwdt: can't register reboot notifier (err=%d)
\n
"
,
ret
);
goto
outreg
;
}
eurwdt_unlock_chip
();
ret
=
0
;
printk
(
KERN_INFO
"Eurotech WDT driver 0.01 at %X (Interrupt %d)"
" - timeout event: %s
\n
"
,
io
,
irq
,
(
!
strcmp
(
"int"
,
ev
)
?
"int"
:
"reboot"
));
spin_lock_init
(
&
eurwdt_lock
);
out:
return
ret
;
outreg:
release_region
(
io
,
2
);
outirq:
free_irq
(
irq
,
NULL
);
outmisc:
misc_deregister
(
&
eurwdt_miscdev
);
goto
out
;
}
module_init
(
eurwdt_init
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment