nfsd: fix "insecure" export option
[safe/jmp/linux-2.6] / drivers / edac / edac_mc.c
index 8353191..3630308 100644 (file)
@@ -36,7 +36,7 @@
 
 /* lock to memory controller's control array */
 static DEFINE_MUTEX(mem_ctls_mutex);
-static struct list_head mc_devices = LIST_HEAD_INIT(mc_devices);
+static LIST_HEAD(mc_devices);
 
 #ifdef CONFIG_EDAC_DEBUG
 
@@ -76,6 +76,30 @@ static void edac_mc_dump_mci(struct mem_ctl_info *mci)
        debugf3("\tpvt_info = %p\n\n", mci->pvt_info);
 }
 
+/*
+ * keep those in sync with the enum mem_type
+ */
+const char *edac_mem_types[] = {
+       "Empty csrow",
+       "Reserved csrow type",
+       "Unknown csrow type",
+       "Fast page mode RAM",
+       "Extended data out RAM",
+       "Burst Extended data out RAM",
+       "Single data rate SDRAM",
+       "Registered single data rate SDRAM",
+       "Double data rate SDRAM",
+       "Registered Double data rate SDRAM",
+       "Rambus DRAM",
+       "Unbuffered DDR2 RAM",
+       "Fully buffered DDR2",
+       "Registered DDR2 RAM",
+       "Rambus XDR",
+       "Unbuffered DDR3 RAM",
+       "Registered DDR3 RAM",
+};
+EXPORT_SYMBOL_GPL(edac_mem_types);
+
 #endif                         /* CONFIG_EDAC_DEBUG */
 
 /* 'ptr' points to a possibly unaligned item X such that sizeof(X) is 'size'.
@@ -85,7 +109,7 @@ static void edac_mc_dump_mci(struct mem_ctl_info *mci)
  * If 'size' is a constant, the compiler will optimize this whole function
  * down to either a no-op or the addition of a constant to the value of 'ptr'.
  */
-char *edac_align_ptr(void *ptr, unsigned size)
+void *edac_align_ptr(void *ptr, unsigned size)
 {
        unsigned align, r;
 
@@ -109,7 +133,7 @@ char *edac_align_ptr(void *ptr, unsigned size)
        if (r == 0)
                return (char *)ptr;
 
-       return (char *)(((unsigned long)ptr) + align - r);
+       return (void *)(((unsigned long)ptr) + align - r);
 }
 
 /**
@@ -129,7 +153,7 @@ char *edac_align_ptr(void *ptr, unsigned size)
  *     struct mem_ctl_info pointer
  */
 struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
-                                  unsigned nr_chans)
+                               unsigned nr_chans, int edac_index)
 {
        struct mem_ctl_info *mci;
        struct csrow_info *csi, *csrow;
@@ -137,6 +161,7 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
        void *pvt;
        unsigned size;
        int row, chn;
+       int err;
 
        /* Figure out the offsets of the various items from the start of an mc
         * structure.  We want the alignment of each item to be at least as
@@ -144,13 +169,13 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
         * hardcode everything into a single struct.
         */
        mci = (struct mem_ctl_info *)0;
-       csi = (struct csrow_info *)edac_align_ptr(&mci[1], sizeof(*csi));
-       chi = (struct channel_info *)
-           edac_align_ptr(&csi[nr_csrows], sizeof(*chi));
+       csi = edac_align_ptr(&mci[1], sizeof(*csi));
+       chi = edac_align_ptr(&csi[nr_csrows], sizeof(*chi));
        pvt = edac_align_ptr(&chi[nr_chans * nr_csrows], sz_pvt);
        size = ((unsigned long)pvt) + sz_pvt;
 
-       if ((mci = kmalloc(size, GFP_KERNEL)) == NULL)
+       mci = kzalloc(size, GFP_KERNEL);
+       if (mci == NULL)
                return NULL;
 
        /* Adjust pointers so they point within the memory we just allocated
@@ -160,7 +185,8 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
        chi = (struct channel_info *)(((char *)mci) + ((unsigned long)chi));
        pvt = sz_pvt ? (((char *)mci) + ((unsigned long)pvt)) : NULL;
 
-       memset(mci, 0, size);   /* clear all fields */
+       /* setup index and various internal pointers */
+       mci->mc_idx = edac_index;
        mci->csrows = csi;
        mci->pvt_info = pvt;
        mci->nr_csrows = nr_csrows;
@@ -182,22 +208,43 @@ struct mem_ctl_info *edac_mc_alloc(unsigned sz_pvt, unsigned nr_csrows,
 
        mci->op_state = OP_ALLOC;
 
+       /*
+        * Initialize the 'root' kobj for the edac_mc controller
+        */
+       err = edac_mc_register_sysfs_main_kobj(mci);
+       if (err) {
+               kfree(mci);
+               return NULL;
+       }
+
+       /* at this point, the root kobj is valid, and in order to
+        * 'free' the object, then the function:
+        *      edac_mc_unregister_sysfs_main_kobj() must be called
+        * which will perform kobj unregistration and the actual free
+        * will occur during the kobject callback operation
+        */
        return mci;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_alloc);
 
 /**
- * edac_mc_free:  Free a previously allocated 'mci' structure
+ * edac_mc_free
+ *     'Free' a previously allocated 'mci' structure
  * @mci: pointer to a struct mem_ctl_info structure
  */
 void edac_mc_free(struct mem_ctl_info *mci)
 {
-       kfree(mci);
+       edac_mc_unregister_sysfs_main_kobj(mci);
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_free);
 
+
+/*
+ * find_mci_by_dev
+ *
+ *     scan list of controllers looking for the one that manages
+ *     the 'dev' device
+ */
 static struct mem_ctl_info *find_mci_by_dev(struct device *dev)
 {
        struct mem_ctl_info *mci;
@@ -235,88 +282,119 @@ static int edac_mc_assert_error_check_and_clear(void)
  * edac_mc_workq_function
  *     performs the operation scheduled by a workq request
  */
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
 static void edac_mc_workq_function(struct work_struct *work_req)
 {
-       struct delayed_work *d_work = (struct delayed_work *)work_req;
+       struct delayed_work *d_work = to_delayed_work(work_req);
        struct mem_ctl_info *mci = to_edac_mem_ctl_work(d_work);
-#else
-static void edac_mc_workq_function(void *ptr)
-{
-       struct mem_ctl_info *mci = (struct mem_ctl_info *)ptr;
-#endif
 
        mutex_lock(&mem_ctls_mutex);
 
+       /* if this control struct has movd to offline state, we are done */
+       if (mci->op_state == OP_OFFLINE) {
+               mutex_unlock(&mem_ctls_mutex);
+               return;
+       }
+
        /* Only poll controllers that are running polled and have a check */
        if (edac_mc_assert_error_check_and_clear() && (mci->edac_check != NULL))
                mci->edac_check(mci);
 
-       /*
-        * FIXME: temp place holder for PCI checks,
-        * goes away when we break out PCI
-        */
-       edac_pci_do_parity_check();
-
        mutex_unlock(&mem_ctls_mutex);
 
        /* Reschedule */
        queue_delayed_work(edac_workqueue, &mci->work,
-                          msecs_to_jiffies(edac_mc_get_poll_msec()));
+                       msecs_to_jiffies(edac_mc_get_poll_msec()));
 }
 
 /*
  * edac_mc_workq_setup
  *     initialize a workq item for this mci
  *     passing in the new delay period in msec
+ *
+ *     locking model:
+ *
+ *             called with the mem_ctls_mutex held
  */
-void edac_mc_workq_setup(struct mem_ctl_info *mci, unsigned msec)
+static void edac_mc_workq_setup(struct mem_ctl_info *mci, unsigned msec)
 {
        debugf0("%s()\n", __func__);
 
-#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       /* if this instance is not in the POLL state, then simply return */
+       if (mci->op_state != OP_RUNNING_POLL)
+               return;
+
        INIT_DELAYED_WORK(&mci->work, edac_mc_workq_function);
-#else
-       INIT_WORK(&mci->work, edac_mc_workq_function, mci);
-#endif
        queue_delayed_work(edac_workqueue, &mci->work, msecs_to_jiffies(msec));
 }
 
 /*
  * edac_mc_workq_teardown
  *     stop the workq processing on this mci
+ *
+ *     locking model:
+ *
+ *             called WITHOUT lock held
  */
-void edac_mc_workq_teardown(struct mem_ctl_info *mci)
+static void edac_mc_workq_teardown(struct mem_ctl_info *mci)
 {
        int status;
 
        status = cancel_delayed_work(&mci->work);
        if (status == 0) {
+               debugf0("%s() not canceled, flush the queue\n",
+                       __func__);
+
                /* workq instance might be running, wait for it */
                flush_workqueue(edac_workqueue);
        }
 }
 
 /*
- * edac_reset_delay_period
+ * edac_mc_reset_delay_period(unsigned long value)
+ *
+ *     user space has updated our poll period value, need to
+ *     reset our workq delays
  */
-
-void edac_reset_delay_period(struct mem_ctl_info *mci, unsigned long value)
+void edac_mc_reset_delay_period(int value)
 {
+       struct mem_ctl_info *mci;
+       struct list_head *item;
+
        mutex_lock(&mem_ctls_mutex);
 
-       /* cancel the current workq request */
-       edac_mc_workq_teardown(mci);
+       /* scan the list and turn off all workq timers, doing so under lock
+        */
+       list_for_each(item, &mc_devices) {
+               mci = list_entry(item, struct mem_ctl_info, link);
+
+               if (mci->op_state == OP_RUNNING_POLL)
+                       cancel_delayed_work(&mci->work);
+       }
+
+       mutex_unlock(&mem_ctls_mutex);
+
+
+       /* re-walk the list, and reset the poll delay */
+       mutex_lock(&mem_ctls_mutex);
+
+       list_for_each(item, &mc_devices) {
+               mci = list_entry(item, struct mem_ctl_info, link);
 
-       /* restart the workq request, with new delay value */
-       edac_mc_workq_setup(mci, value);
+               edac_mc_workq_setup(mci, (unsigned long) value);
+       }
 
        mutex_unlock(&mem_ctls_mutex);
 }
 
+
+
 /* Return 0 on success, 1 on failure.
  * Before calling this function, caller must
  * assign a unique value to mci->mc_idx.
+ *
+ *     locking model:
+ *
+ *             called with the mem_ctls_mutex lock held
  */
 static int add_mc_to_global_list(struct mem_ctl_info *mci)
 {
@@ -325,7 +403,8 @@ static int add_mc_to_global_list(struct mem_ctl_info *mci)
 
        insert_before = &mc_devices;
 
-       if (unlikely((p = find_mci_by_dev(mci->dev)) != NULL))
+       p = find_mci_by_dev(mci->dev);
+       if (unlikely(p != NULL))
                goto fail0;
 
        list_for_each(item, &mc_devices) {
@@ -344,16 +423,16 @@ static int add_mc_to_global_list(struct mem_ctl_info *mci)
        atomic_inc(&edac_handlers);
        return 0;
 
-      fail0:
+fail0:
        edac_printk(KERN_WARNING, EDAC_MC,
-                   "%s (%s) %s %s already assigned %d\n", p->dev->bus_id,
-                   dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx);
+               "%s (%s) %s %s already assigned %d\n", dev_name(p->dev),
+               edac_dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx);
        return 1;
 
-      fail1:
+fail1:
        edac_printk(KERN_WARNING, EDAC_MC,
-                   "bug in low-level driver: attempt to assign\n"
-                   "    duplicate mc_idx %d in %s()\n", p->mc_idx, __func__);
+               "bug in low-level driver: attempt to assign\n"
+               "    duplicate mc_idx %d in %s()\n", p->mc_idx, __func__);
        return 1;
 }
 
@@ -363,16 +442,14 @@ static void complete_mc_list_del(struct rcu_head *head)
 
        mci = container_of(head, struct mem_ctl_info, rcu);
        INIT_LIST_HEAD(&mci->link);
-       complete(&mci->complete);
 }
 
 static void del_mc_from_global_list(struct mem_ctl_info *mci)
 {
        atomic_dec(&edac_handlers);
        list_del_rcu(&mci->link);
-       init_completion(&mci->complete);
        call_rcu(&mci->rcu, complete_mc_list_del);
-       wait_for_completion(&mci->complete);
+       rcu_barrier();
 }
 
 /**
@@ -401,7 +478,6 @@ struct mem_ctl_info *edac_mc_find(int idx)
 
        return NULL;
 }
-
 EXPORT_SYMBOL(edac_mc_find);
 
 /**
@@ -416,10 +492,10 @@ EXPORT_SYMBOL(edac_mc_find);
  */
 
 /* FIXME - should a warning be printed if no error detection? correction? */
-int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx)
+int edac_mc_add_mc(struct mem_ctl_info *mci)
 {
        debugf0("%s()\n", __func__);
-       mci->mc_idx = mc_idx;
+
 #ifdef CONFIG_EDAC_DEBUG
        if (edac_debug_level >= 3)
                edac_mc_dump_mci(mci);
@@ -433,7 +509,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx)
                        edac_mc_dump_csrow(&mci->csrows[i]);
                        for (j = 0; j < mci->csrows[i].nr_channels; j++)
                                edac_mc_dump_channel(&mci->csrows[i].
-                                                    channels[j]);
+                                               channels[j]);
                }
        }
 #endif
@@ -447,7 +523,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx)
 
        if (edac_create_sysfs_mci_device(mci)) {
                edac_mc_printk(mci, KERN_WARNING,
-                              "failed to create sysfs device\n");
+                       "failed to create sysfs device\n");
                goto fail1;
        }
 
@@ -462,20 +538,19 @@ int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx)
        }
 
        /* Report action taken */
-       edac_mc_printk(mci, KERN_INFO, "Giving out device to %s %s: DEV %s\n",
-                      mci->mod_name, mci->ctl_name, dev_name(mci));
+       edac_mc_printk(mci, KERN_INFO, "Giving out device to '%s' '%s':"
+               " DEV %s\n", mci->mod_name, mci->ctl_name, edac_dev_name(mci));
 
        mutex_unlock(&mem_ctls_mutex);
        return 0;
 
-      fail1:
+fail1:
        del_mc_from_global_list(mci);
 
-      fail0:
+fail0:
        mutex_unlock(&mem_ctls_mutex);
        return 1;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_add_mc);
 
 /**
@@ -489,10 +564,13 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev)
 {
        struct mem_ctl_info *mci;
 
-       debugf0("MC: %s()\n", __func__);
+       debugf0("%s()\n", __func__);
+
        mutex_lock(&mem_ctls_mutex);
 
-       if ((mci = find_mci_by_dev(dev)) == NULL) {
+       /* find the requested mci struct in the global list */
+       mci = find_mci_by_dev(dev);
+       if (mci == NULL) {
                mutex_unlock(&mem_ctls_mutex);
                return NULL;
        }
@@ -500,18 +578,19 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev)
        /* marking MCI offline */
        mci->op_state = OP_OFFLINE;
 
-       /* flush workq processes */
-       edac_mc_workq_teardown(mci);
-
-       edac_remove_sysfs_mci_device(mci);
        del_mc_from_global_list(mci);
        mutex_unlock(&mem_ctls_mutex);
+
+       /* flush workq processes and remove sysfs */
+       edac_mc_workq_teardown(mci);
+       edac_remove_sysfs_mci_device(mci);
+
        edac_printk(KERN_INFO, EDAC_MC,
-                   "Removed device %d for %s %s: DEV %s\n", mci->mc_idx,
-                   mci->mod_name, mci->ctl_name, dev_name(mci));
+               "Removed device %d for %s %s: DEV %s\n", mci->mc_idx,
+               mci->mod_name, mci->ctl_name, edac_dev_name(mci));
+
        return mci;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_del_mc);
 
 static void edac_mc_scrub_block(unsigned long page, unsigned long offset,
@@ -576,20 +655,19 @@ int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, unsigned long page)
 
        if (row == -1)
                edac_mc_printk(mci, KERN_ERR,
-                              "could not look up page error address %lx\n",
-                              (unsigned long)page);
+                       "could not look up page error address %lx\n",
+                       (unsigned long)page);
 
        return row;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_find_csrow_by_page);
 
 /* FIXME - setable log (warning/emerg) levels */
 /* FIXME - integrate with evlog: http://evlog.sourceforge.net/ */
 void edac_mc_handle_ce(struct mem_ctl_info *mci,
-                      unsigned long page_frame_number,
-                      unsigned long offset_in_page, unsigned long syndrome,
-                      int row, int channel, const char *msg)
+               unsigned long page_frame_number,
+               unsigned long offset_in_page, unsigned long syndrome,
+               int row, int channel, const char *msg)
 {
        unsigned long remapped_page;
 
@@ -599,8 +677,8 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci,
        if (row >= mci->nr_csrows || row < 0) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: row out of range "
-                              "(%d >= %d)\n", row, mci->nr_csrows);
+                       "INTERNAL ERROR: row out of range "
+                       "(%d >= %d)\n", row, mci->nr_csrows);
                edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -608,9 +686,9 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci,
        if (channel >= mci->csrows[row].nr_channels || channel < 0) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: channel out of range "
-                              "(%d >= %d)\n", channel,
-                              mci->csrows[row].nr_channels);
+                       "INTERNAL ERROR: channel out of range "
+                       "(%d >= %d)\n", channel,
+                       mci->csrows[row].nr_channels);
                edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -618,11 +696,11 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci,
        if (edac_mc_get_log_ce())
                /* FIXME - put in DIMM location */
                edac_mc_printk(mci, KERN_WARNING,
-                              "CE page 0x%lx, offset 0x%lx, grain %d, syndrome "
-                              "0x%lx, row %d, channel %d, label \"%s\": %s\n",
-                              page_frame_number, offset_in_page,
-                              mci->csrows[row].grain, syndrome, row, channel,
-                              mci->csrows[row].channels[channel].label, msg);
+                       "CE page 0x%lx, offset 0x%lx, grain %d, syndrome "
+                       "0x%lx, row %d, channel %d, label \"%s\": %s\n",
+                       page_frame_number, offset_in_page,
+                       mci->csrows[row].grain, syndrome, row, channel,
+                       mci->csrows[row].channels[channel].label, msg);
 
        mci->ce_count++;
        mci->csrows[row].ce_count++;
@@ -639,31 +717,29 @@ void edac_mc_handle_ce(struct mem_ctl_info *mci,
                 * page - which can then be scrubbed.
                 */
                remapped_page = mci->ctl_page_to_phys ?
-                   mci->ctl_page_to_phys(mci, page_frame_number) :
-                   page_frame_number;
+                       mci->ctl_page_to_phys(mci, page_frame_number) :
+                       page_frame_number;
 
                edac_mc_scrub_block(remapped_page, offset_in_page,
-                                   mci->csrows[row].grain);
+                               mci->csrows[row].grain);
        }
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_handle_ce);
 
 void edac_mc_handle_ce_no_info(struct mem_ctl_info *mci, const char *msg)
 {
        if (edac_mc_get_log_ce())
                edac_mc_printk(mci, KERN_WARNING,
-                              "CE - no information available: %s\n", msg);
+                       "CE - no information available: %s\n", msg);
 
        mci->ce_noinfo_count++;
        mci->ce_count++;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_handle_ce_no_info);
 
 void edac_mc_handle_ue(struct mem_ctl_info *mci,
-                      unsigned long page_frame_number,
-                      unsigned long offset_in_page, int row, const char *msg)
+               unsigned long page_frame_number,
+               unsigned long offset_in_page, int row, const char *msg)
 {
        int len = EDAC_MC_LABEL_LEN * 4;
        char labels[len + 1];
@@ -677,8 +753,8 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci,
        if (row >= mci->nr_csrows || row < 0) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: row out of range "
-                              "(%d >= %d)\n", row, mci->nr_csrows);
+                       "INTERNAL ERROR: row out of range "
+                       "(%d >= %d)\n", row, mci->nr_csrows);
                edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -689,7 +765,7 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci,
        pos += chars;
 
        for (chan = 1; (chan < mci->csrows[row].nr_channels) && (len > 0);
-            chan++) {
+               chan++) {
                chars = snprintf(pos, len + 1, ":%s",
                                 mci->csrows[row].channels[chan].label);
                len -= chars;
@@ -698,21 +774,20 @@ void edac_mc_handle_ue(struct mem_ctl_info *mci,
 
        if (edac_mc_get_log_ue())
                edac_mc_printk(mci, KERN_EMERG,
-                              "UE page 0x%lx, offset 0x%lx, grain %d, row %d, "
-                              "labels \"%s\": %s\n", page_frame_number,
-                              offset_in_page, mci->csrows[row].grain, row,
-                              labels, msg);
+                       "UE page 0x%lx, offset 0x%lx, grain %d, row %d, "
+                       "labels \"%s\": %s\n", page_frame_number,
+                       offset_in_page, mci->csrows[row].grain, row,
+                       labels, msg);
 
        if (edac_mc_get_panic_on_ue())
                panic("EDAC MC%d: UE page 0x%lx, offset 0x%lx, grain %d, "
-                     "row %d, labels \"%s\": %s\n", mci->mc_idx,
-                     page_frame_number, offset_in_page,
-                     mci->csrows[row].grain, row, labels, msg);
+                       "row %d, labels \"%s\": %s\n", mci->mc_idx,
+                       page_frame_number, offset_in_page,
+                       mci->csrows[row].grain, row, labels, msg);
 
        mci->ue_count++;
        mci->csrows[row].ue_count++;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_handle_ue);
 
 void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci, const char *msg)
@@ -722,11 +797,10 @@ void edac_mc_handle_ue_no_info(struct mem_ctl_info *mci, const char *msg)
 
        if (edac_mc_get_log_ue())
                edac_mc_printk(mci, KERN_WARNING,
-                              "UE - no information available: %s\n", msg);
+                       "UE - no information available: %s\n", msg);
        mci->ue_noinfo_count++;
        mci->ue_count++;
 }
-
 EXPORT_SYMBOL_GPL(edac_mc_handle_ue_no_info);
 
 /*************************************************************
@@ -734,9 +808,9 @@ EXPORT_SYMBOL_GPL(edac_mc_handle_ue_no_info);
  * called to process UE events
  */
 void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
-                          unsigned int csrow,
-                          unsigned int channela,
-                          unsigned int channelb, char *msg)
+                       unsigned int csrow,
+                       unsigned int channela,
+                       unsigned int channelb, char *msg)
 {
        int len = EDAC_MC_LABEL_LEN * 4;
        char labels[len + 1];
@@ -746,8 +820,8 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
        if (csrow >= mci->nr_csrows) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: row out of range (%d >= %d)\n",
-                              csrow, mci->nr_csrows);
+                       "INTERNAL ERROR: row out of range (%d >= %d)\n",
+                       csrow, mci->nr_csrows);
                edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -755,9 +829,9 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
        if (channela >= mci->csrows[csrow].nr_channels) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: channel-a out of range "
-                              "(%d >= %d)\n",
-                              channela, mci->csrows[csrow].nr_channels);
+                       "INTERNAL ERROR: channel-a out of range "
+                       "(%d >= %d)\n",
+                       channela, mci->csrows[csrow].nr_channels);
                edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -765,9 +839,9 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
        if (channelb >= mci->csrows[csrow].nr_channels) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: channel-b out of range "
-                              "(%d >= %d)\n",
-                              channelb, mci->csrows[csrow].nr_channels);
+                       "INTERNAL ERROR: channel-b out of range "
+                       "(%d >= %d)\n",
+                       channelb, mci->csrows[csrow].nr_channels);
                edac_mc_handle_ue_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -785,16 +859,15 @@ void edac_mc_handle_fbd_ue(struct mem_ctl_info *mci,
 
        if (edac_mc_get_log_ue())
                edac_mc_printk(mci, KERN_EMERG,
-                              "UE row %d, channel-a= %d channel-b= %d "
-                              "labels \"%s\": %s\n", csrow, channela, channelb,
-                              labels, msg);
+                       "UE row %d, channel-a= %d channel-b= %d "
+                       "labels \"%s\": %s\n", csrow, channela, channelb,
+                       labels, msg);
 
        if (edac_mc_get_panic_on_ue())
                panic("UE row %d, channel-a= %d channel-b= %d "
-                     "labels \"%s\": %s\n", csrow, channela,
-                     channelb, labels, msg);
+                       "labels \"%s\": %s\n", csrow, channela,
+                       channelb, labels, msg);
 }
-
 EXPORT_SYMBOL(edac_mc_handle_fbd_ue);
 
 /*************************************************************
@@ -802,23 +875,23 @@ EXPORT_SYMBOL(edac_mc_handle_fbd_ue);
  * called to process CE events
  */
 void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci,
-                          unsigned int csrow, unsigned int channel, char *msg)
+                       unsigned int csrow, unsigned int channel, char *msg)
 {
 
        /* Ensure boundary values */
        if (csrow >= mci->nr_csrows) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: row out of range (%d >= %d)\n",
-                              csrow, mci->nr_csrows);
+                       "INTERNAL ERROR: row out of range (%d >= %d)\n",
+                       csrow, mci->nr_csrows);
                edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
                return;
        }
        if (channel >= mci->csrows[csrow].nr_channels) {
                /* something is wrong */
                edac_mc_printk(mci, KERN_ERR,
-                              "INTERNAL ERROR: channel out of range (%d >= %d)\n",
-                              channel, mci->csrows[csrow].nr_channels);
+                       "INTERNAL ERROR: channel out of range (%d >= %d)\n",
+                       channel, mci->csrows[csrow].nr_channels);
                edac_mc_handle_ce_no_info(mci, "INTERNAL ERROR");
                return;
        }
@@ -826,34 +899,12 @@ void edac_mc_handle_fbd_ce(struct mem_ctl_info *mci,
        if (edac_mc_get_log_ce())
                /* FIXME - put in DIMM location */
                edac_mc_printk(mci, KERN_WARNING,
-                              "CE row %d, channel %d, label \"%s\": %s\n",
-                              csrow, channel,
-                              mci->csrows[csrow].channels[channel].label, msg);
+                       "CE row %d, channel %d, label \"%s\": %s\n",
+                       csrow, channel,
+                       mci->csrows[csrow].channels[channel].label, msg);
 
        mci->ce_count++;
        mci->csrows[csrow].ce_count++;
        mci->csrows[csrow].channels[channel].ce_count++;
 }
-
 EXPORT_SYMBOL(edac_mc_handle_fbd_ce);
-
-/*
- * Iterate over all MC instances and check for ECC, et al, errors
- */
-void edac_check_mc_devices(void)
-{
-       struct list_head *item;
-       struct mem_ctl_info *mci;
-
-       debugf3("%s()\n", __func__);
-       mutex_lock(&mem_ctls_mutex);
-
-       list_for_each(item, &mc_devices) {
-               mci = list_entry(item, struct mem_ctl_info, link);
-
-               if (mci->edac_check != NULL)
-                       mci->edac_check(mci);
-       }
-
-       mutex_unlock(&mem_ctls_mutex);
-}