Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
edac
edac_module.c
Go to the documentation of this file.
1
/*
2
* edac_module.c
3
*
4
* (C) 2007 www.softwarebitmaker.com
5
*
6
* This file is licensed under the terms of the GNU General Public
7
* License version 2. This program is licensed "as is" without any
8
* warranty of any kind, whether express or implied.
9
*
10
* Author: Doug Thompson <
[email protected]
>
11
*
12
*/
13
#include <
linux/edac.h
>
14
15
#include "
edac_core.h
"
16
#include "
edac_module.h
"
17
18
#define EDAC_VERSION "Ver: 3.0.0"
19
20
#ifdef CONFIG_EDAC_DEBUG
21
/* Values of 0 to 4 will generate output */
22
int
edac_debug_level = 2;
23
EXPORT_SYMBOL_GPL
(edac_debug_level);
24
#endif
25
26
/* scope is to module level only */
27
struct
workqueue_struct
*
edac_workqueue
;
28
29
/*
30
* edac_op_state_to_string()
31
*/
32
char
*
edac_op_state_to_string
(
int
opstate)
33
{
34
if
(opstate ==
OP_RUNNING_POLL
)
35
return
"POLLED"
;
36
else
if
(opstate ==
OP_RUNNING_INTERRUPT
)
37
return
"INTERRUPT"
;
38
else
if
(opstate ==
OP_RUNNING_POLL_INTR
)
39
return
"POLL-INTR"
;
40
else
if
(opstate ==
OP_ALLOC
)
41
return
"ALLOC"
;
42
else
if
(opstate ==
OP_OFFLINE
)
43
return
"OFFLINE"
;
44
45
return
"UNKNOWN"
;
46
}
47
48
/*
49
* edac_workqueue_setup
50
* initialize the edac work queue for polling operations
51
*/
52
static
int
edac_workqueue_setup(
void
)
53
{
54
edac_workqueue =
create_singlethread_workqueue
(
"edac-poller"
);
55
if
(edac_workqueue ==
NULL
)
56
return
-
ENODEV
;
57
else
58
return
0;
59
}
60
61
/*
62
* edac_workqueue_teardown
63
* teardown the edac workqueue
64
*/
65
static
void
edac_workqueue_teardown(
void
)
66
{
67
if
(edac_workqueue) {
68
flush_workqueue
(edac_workqueue);
69
destroy_workqueue
(edac_workqueue);
70
edac_workqueue =
NULL
;
71
}
72
}
73
74
/*
75
* edac_init
76
* module initialization entry point
77
*/
78
static
int
__init
edac_init(
void
)
79
{
80
int
err
= 0;
81
82
edac_printk
(
KERN_INFO
,
EDAC_MC
,
EDAC_VERSION
"\n"
);
83
84
/*
85
* Harvest and clear any boot/initialization PCI parity errors
86
*
87
* FIXME: This only clears errors logged by devices present at time of
88
* module initialization. We should also do an initial clear
89
* of each newly hotplugged device.
90
*/
91
edac_pci_clear_parity_errors
();
92
93
err =
edac_mc_sysfs_init
();
94
if
(err)
95
goto
error
;
96
97
edac_debugfs_init();
98
99
/* Setup/Initialize the workq for this core */
100
err = edac_workqueue_setup();
101
if
(err) {
102
edac_printk
(
KERN_ERR
,
EDAC_MC
,
"init WorkQueue failure\n"
);
103
goto
error
;
104
}
105
106
return
0;
107
108
error
:
109
return
err
;
110
}
111
112
/*
113
* edac_exit()
114
* module exit/termination function
115
*/
116
static
void
__exit
edac_exit(
void
)
117
{
118
edac_dbg
(0,
"\n"
);
119
120
/* tear down the various subsystems */
121
edac_workqueue_teardown();
122
edac_mc_sysfs_exit
();
123
edac_debugfs_exit();
124
}
125
126
/*
127
* Inform the kernel of our entry and exit points
128
*/
129
module_init
(edac_init);
130
module_exit
(edac_exit);
131
132
MODULE_LICENSE
(
"GPL"
);
133
MODULE_AUTHOR
(
"Doug Thompson www.softwarebitmaker.com, et al"
);
134
MODULE_DESCRIPTION
(
"Core library routines for EDAC reporting"
);
135
136
/* refer to *_sysfs.c files for parameters that are exported via sysfs */
137
138
#ifdef CONFIG_EDAC_DEBUG
139
module_param
(edac_debug_level,
int
, 0644);
140
MODULE_PARM_DESC
(edac_debug_level,
"Debug level"
);
141
#endif
Generated on Thu Jan 10 2013 13:29:57 for Linux Kernel by
1.8.2