i7core_edac: properly handle error count

Instead of generating a burst of errors or reporting the error
count via driver-specific details, use the new way provided by
edac_mc_handle_error.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Mauro Carvalho Chehab 2012-06-04 13:38:52 -03:00
parent 9eb07a7fb8
commit 00d1833927

View file

@ -1536,18 +1536,6 @@ static int mci_bind_devs(struct mem_ctl_info *mci,
/**************************************************************************** /****************************************************************************
Error check routines Error check routines
****************************************************************************/ ****************************************************************************/
static void i7core_rdimm_update_errcount(struct mem_ctl_info *mci,
const int chan,
const int dimm,
const int add)
{
int i;
for (i = 0; i < add; i++) {
edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, 1, 0, 0, 0,
chan, dimm, -1, "error", "");
}
}
static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci, static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci,
const int chan, const int chan,
@ -1586,12 +1574,17 @@ static void i7core_rdimm_update_ce_count(struct mem_ctl_info *mci,
/*updated the edac core */ /*updated the edac core */
if (add0 != 0) if (add0 != 0)
i7core_rdimm_update_errcount(mci, chan, 0, add0); edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, add0,
0, 0, 0,
chan, 0, -1, "error", "");
if (add1 != 0) if (add1 != 0)
i7core_rdimm_update_errcount(mci, chan, 1, add1); edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, add1,
0, 0, 0,
chan, 1, -1, "error", "");
if (add2 != 0) if (add2 != 0)
i7core_rdimm_update_errcount(mci, chan, 2, add2); edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, add2,
0, 0, 0,
chan, 2, -1, "error", "");
} }
static void i7core_rdimm_check_mc_ecc_err(struct mem_ctl_info *mci) static void i7core_rdimm_check_mc_ecc_err(struct mem_ctl_info *mci)
@ -1710,7 +1703,7 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
const struct mce *m) const struct mce *m)
{ {
struct i7core_pvt *pvt = mci->pvt_info; struct i7core_pvt *pvt = mci->pvt_info;
char *type, *optype, *err, msg[80]; char *type, *optype, *err;
enum hw_event_mc_err_type tp_event; enum hw_event_mc_err_type tp_event;
unsigned long error = m->status & 0x1ff0000l; unsigned long error = m->status & 0x1ff0000l;
bool uncorrected_error = m->mcgstatus & 1ll << 61; bool uncorrected_error = m->mcgstatus & 1ll << 61;
@ -1788,20 +1781,18 @@ static void i7core_mce_output_error(struct mem_ctl_info *mci,
err = "unknown"; err = "unknown";
} }
snprintf(msg, sizeof(msg), "count=%d %s", core_err_cnt, optype);
/* /*
* Call the helper to output message * Call the helper to output message
* FIXME: what to do if core_err_cnt > 1? Currently, it generates * FIXME: what to do if core_err_cnt > 1? Currently, it generates
* only one event * only one event
*/ */
if (uncorrected_error || !pvt->is_registered) if (uncorrected_error || !pvt->is_registered)
edac_mc_handle_error(tp_event, mci, 1, edac_mc_handle_error(tp_event, mci, core_err_cnt,
m->addr >> PAGE_SHIFT, m->addr >> PAGE_SHIFT,
m->addr & ~PAGE_MASK, m->addr & ~PAGE_MASK,
syndrome, syndrome,
channel, dimm, -1, channel, dimm, -1,
err, msg); err, optype);
} }
/* /*