aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2011-06-13 13:09:11 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-11-01 08:01:53 -0400
commit5f032119d6f1cc48d0d1a28b8014f270ca4c4e47 (patch)
tree29a6389b22a4c35fa5488be546c6542d99b452aa
parent767ba4a52a6de7ea2875a8af79bf11452a2a0c44 (diff)
i7300_edac: Fix error cleanup logic
The error cleanup logic was broken. Due to that, one error is generated for every error polling. Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/edac/i7300_edac.c51
1 files changed, 26 insertions, 25 deletions
diff --git a/drivers/edac/i7300_edac.c b/drivers/edac/i7300_edac.c
index a76fe8366b68..6104dba380b6 100644
--- a/drivers/edac/i7300_edac.c
+++ b/drivers/edac/i7300_edac.c
@@ -372,7 +372,7 @@ static const char *get_err_from_table(const char *table[], int size, int pos)
372static void i7300_process_error_global(struct mem_ctl_info *mci) 372static void i7300_process_error_global(struct mem_ctl_info *mci)
373{ 373{
374 struct i7300_pvt *pvt; 374 struct i7300_pvt *pvt;
375 u32 errnum, value; 375 u32 errnum, error_reg;
376 unsigned long errors; 376 unsigned long errors;
377 const char *specific; 377 const char *specific;
378 bool is_fatal; 378 bool is_fatal;
@@ -381,9 +381,9 @@ static void i7300_process_error_global(struct mem_ctl_info *mci)
381 381
382 /* read in the 1st FATAL error register */ 382 /* read in the 1st FATAL error register */
383 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 383 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs,
384 FERR_GLOBAL_HI, &value); 384 FERR_GLOBAL_HI, &error_reg);
385 if (unlikely(value)) { 385 if (unlikely(error_reg)) {
386 errors = value; 386 errors = error_reg;
387 errnum = find_first_bit(&errors, 387 errnum = find_first_bit(&errors,
388 ARRAY_SIZE(ferr_global_hi_name)); 388 ARRAY_SIZE(ferr_global_hi_name));
389 specific = GET_ERR_FROM_TABLE(ferr_global_hi_name, errnum); 389 specific = GET_ERR_FROM_TABLE(ferr_global_hi_name, errnum);
@@ -391,15 +391,15 @@ static void i7300_process_error_global(struct mem_ctl_info *mci)
391 391
392 /* Clear the error bit */ 392 /* Clear the error bit */
393 pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 393 pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs,
394 FERR_GLOBAL_HI, value); 394 FERR_GLOBAL_HI, error_reg);
395 395
396 goto error_global; 396 goto error_global;
397 } 397 }
398 398
399 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 399 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs,
400 FERR_GLOBAL_LO, &value); 400 FERR_GLOBAL_LO, &error_reg);
401 if (unlikely(value)) { 401 if (unlikely(error_reg)) {
402 errors = value; 402 errors = error_reg;
403 errnum = find_first_bit(&errors, 403 errnum = find_first_bit(&errors,
404 ARRAY_SIZE(ferr_global_lo_name)); 404 ARRAY_SIZE(ferr_global_lo_name));
405 specific = GET_ERR_FROM_TABLE(ferr_global_lo_name, errnum); 405 specific = GET_ERR_FROM_TABLE(ferr_global_lo_name, errnum);
@@ -407,7 +407,7 @@ static void i7300_process_error_global(struct mem_ctl_info *mci)
407 407
408 /* Clear the error bit */ 408 /* Clear the error bit */
409 pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 409 pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs,
410 FERR_GLOBAL_LO, value); 410 FERR_GLOBAL_LO, error_reg);
411 411
412 goto error_global; 412 goto error_global;
413 } 413 }
@@ -427,7 +427,7 @@ error_global:
427static void i7300_process_fbd_error(struct mem_ctl_info *mci) 427static void i7300_process_fbd_error(struct mem_ctl_info *mci)
428{ 428{
429 struct i7300_pvt *pvt; 429 struct i7300_pvt *pvt;
430 u32 errnum, value; 430 u32 errnum, value, error_reg;
431 u16 val16; 431 u16 val16;
432 unsigned branch, channel, bank, rank, cas, ras; 432 unsigned branch, channel, bank, rank, cas, ras;
433 u32 syndrome; 433 u32 syndrome;
@@ -440,14 +440,14 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
440 440
441 /* read in the 1st FATAL error register */ 441 /* read in the 1st FATAL error register */
442 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 442 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
443 FERR_FAT_FBD, &value); 443 FERR_FAT_FBD, &error_reg);
444 if (unlikely(value & FERR_FAT_FBD_ERR_MASK)) { 444 if (unlikely(error_reg & FERR_FAT_FBD_ERR_MASK)) {
445 errors = value & FERR_FAT_FBD_ERR_MASK ; 445 errors = error_reg & FERR_FAT_FBD_ERR_MASK ;
446 errnum = find_first_bit(&errors, 446 errnum = find_first_bit(&errors,
447 ARRAY_SIZE(ferr_fat_fbd_name)); 447 ARRAY_SIZE(ferr_fat_fbd_name));
448 specific = GET_ERR_FROM_TABLE(ferr_fat_fbd_name, errnum); 448 specific = GET_ERR_FROM_TABLE(ferr_fat_fbd_name, errnum);
449 branch = (GET_FBD_FAT_IDX(error_reg) == 2) ? 1 : 0;
449 450
450 branch = (GET_FBD_FAT_IDX(value) == 2) ? 1 : 0;
451 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map, 451 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map,
452 NRECMEMA, &val16); 452 NRECMEMA, &val16);
453 bank = NRECMEMA_BANK(val16); 453 bank = NRECMEMA_BANK(val16);
@@ -455,11 +455,14 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
455 455
456 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 456 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
457 NRECMEMB, &value); 457 NRECMEMB, &value);
458
459 is_wr = NRECMEMB_IS_WR(value); 458 is_wr = NRECMEMB_IS_WR(value);
460 cas = NRECMEMB_CAS(value); 459 cas = NRECMEMB_CAS(value);
461 ras = NRECMEMB_RAS(value); 460 ras = NRECMEMB_RAS(value);
462 461
462 /* Clean the error register */
463 pci_write_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
464 FERR_FAT_FBD, error_reg);
465
463 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE, 466 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE,
464 "FATAL (Branch=%d DRAM-Bank=%d %s " 467 "FATAL (Branch=%d DRAM-Bank=%d %s "
465 "RAS=%d CAS=%d Err=0x%lx (%s))", 468 "RAS=%d CAS=%d Err=0x%lx (%s))",
@@ -476,21 +479,17 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
476 479
477 /* read in the 1st NON-FATAL error register */ 480 /* read in the 1st NON-FATAL error register */
478 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 481 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
479 FERR_NF_FBD, &value); 482 FERR_NF_FBD, &error_reg);
480 if (unlikely(value & FERR_NF_FBD_ERR_MASK)) { 483 if (unlikely(error_reg & FERR_NF_FBD_ERR_MASK)) {
481 errors = value & FERR_NF_FBD_ERR_MASK; 484 errors = error_reg & FERR_NF_FBD_ERR_MASK;
482 errnum = find_first_bit(&errors, 485 errnum = find_first_bit(&errors,
483 ARRAY_SIZE(ferr_nf_fbd_name)); 486 ARRAY_SIZE(ferr_nf_fbd_name));
484 specific = GET_ERR_FROM_TABLE(ferr_nf_fbd_name, errnum); 487 specific = GET_ERR_FROM_TABLE(ferr_nf_fbd_name, errnum);
485 488 branch = (GET_FBD_FAT_IDX(error_reg) == 2) ? 1 : 0;
486 /* Clear the error bit */
487 pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs,
488 FERR_GLOBAL_LO, value);
489 489
490 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 490 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
491 REDMEMA, &syndrome); 491 REDMEMA, &syndrome);
492 492
493 branch = (GET_FBD_FAT_IDX(value) == 2) ? 1 : 0;
494 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map, 493 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map,
495 RECMEMA, &val16); 494 RECMEMA, &val16);
496 bank = RECMEMA_BANK(val16); 495 bank = RECMEMA_BANK(val16);
@@ -498,18 +497,20 @@ static void i7300_process_fbd_error(struct mem_ctl_info *mci)
498 497
499 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 498 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
500 RECMEMB, &value); 499 RECMEMB, &value);
501
502 is_wr = RECMEMB_IS_WR(value); 500 is_wr = RECMEMB_IS_WR(value);
503 cas = RECMEMB_CAS(value); 501 cas = RECMEMB_CAS(value);
504 ras = RECMEMB_RAS(value); 502 ras = RECMEMB_RAS(value);
505 503
506 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 504 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
507 REDMEMB, &value); 505 REDMEMB, &value);
508
509 channel = (branch << 1); 506 channel = (branch << 1);
510 if (IS_SECOND_CH(value)) 507 if (IS_SECOND_CH(value))
511 channel++; 508 channel++;
512 509
510 /* Clear the error bit */
511 pci_write_config_dword(pvt->pci_dev_16_1_fsb_addr_map,
512 FERR_NF_FBD, error_reg);
513
513 /* Form out message */ 514 /* Form out message */
514 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE, 515 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE,
515 "Corrected error (Branch=%d, Channel %d), " 516 "Corrected error (Branch=%d, Channel %d), "