linux/drivers/edac/edac_module.c
<<
>>
Prefs
   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 <dougthompson@xmission.com>
  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 */
  22int edac_debug_level = 2;
  23EXPORT_SYMBOL_GPL(edac_debug_level);
  24#endif
  25
  26/* scope is to module level only */
  27struct workqueue_struct *edac_workqueue;
  28
  29/*
  30 * edac_op_state_to_string()
  31 */
  32char *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 */
  52static 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 */
  65static 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 */
  78static 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
 108error:
 109        return err;
 110}
 111
 112/*
 113 * edac_exit()
 114 *      module exit/termination function
 115 */
 116static 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 */
 129module_init(edac_init);
 130module_exit(edac_exit);
 131
 132MODULE_LICENSE("GPL");
 133MODULE_AUTHOR("Doug Thompson www.softwarebitmaker.com, et al");
 134MODULE_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
 139module_param(edac_debug_level, int, 0644);
 140MODULE_PARM_DESC(edac_debug_level, "Debug level");
 141#endif
 142
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.