Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+26 -25
+26 -25
drivers/edac/i7300_edac.c
··· 372 372 static void i7300_process_error_global(struct mem_ctl_info *mci) 373 373 { 374 374 struct i7300_pvt *pvt; 375 - u32 errnum, value; 375 + u32 errnum, error_reg; 376 376 unsigned long errors; 377 377 const char *specific; 378 378 bool is_fatal; ··· 381 381 382 382 /* read in the 1st FATAL error register */ 383 383 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 384 - FERR_GLOBAL_HI, &value); 385 - if (unlikely(value)) { 386 - errors = value; 384 + FERR_GLOBAL_HI, &error_reg); 385 + if (unlikely(error_reg)) { 386 + errors = error_reg; 387 387 errnum = find_first_bit(&errors, 388 388 ARRAY_SIZE(ferr_global_hi_name)); 389 389 specific = GET_ERR_FROM_TABLE(ferr_global_hi_name, errnum); ··· 391 391 392 392 /* Clear the error bit */ 393 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 396 goto error_global; 397 397 } 398 398 399 399 pci_read_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 400 - FERR_GLOBAL_LO, &value); 401 - if (unlikely(value)) { 402 - errors = value; 400 + FERR_GLOBAL_LO, &error_reg); 401 + if (unlikely(error_reg)) { 402 + errors = error_reg; 403 403 errnum = find_first_bit(&errors, 404 404 ARRAY_SIZE(ferr_global_lo_name)); 405 405 specific = GET_ERR_FROM_TABLE(ferr_global_lo_name, errnum); ··· 407 407 408 408 /* Clear the error bit */ 409 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 412 goto error_global; 413 413 } ··· 427 427 static void i7300_process_fbd_error(struct mem_ctl_info *mci) 428 428 { 429 429 struct i7300_pvt *pvt; 430 - u32 errnum, value; 430 + u32 errnum, value, error_reg; 431 431 u16 val16; 432 432 unsigned branch, channel, bank, rank, cas, ras; 433 433 u32 syndrome; ··· 440 440 441 441 /* read in the 1st FATAL error register */ 442 442 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 443 - FERR_FAT_FBD, &value); 444 - if (unlikely(value & FERR_FAT_FBD_ERR_MASK)) { 445 - errors = value & FERR_FAT_FBD_ERR_MASK ; 443 + FERR_FAT_FBD, &error_reg); 444 + if (unlikely(error_reg & FERR_FAT_FBD_ERR_MASK)) { 445 + errors = error_reg & FERR_FAT_FBD_ERR_MASK ; 446 446 errnum = find_first_bit(&errors, 447 447 ARRAY_SIZE(ferr_fat_fbd_name)); 448 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 451 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map, 452 452 NRECMEMA, &val16); 453 453 bank = NRECMEMA_BANK(val16); ··· 455 455 456 456 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 457 457 NRECMEMB, &value); 458 - 459 458 is_wr = NRECMEMB_IS_WR(value); 460 459 cas = NRECMEMB_CAS(value); 461 460 ras = NRECMEMB_RAS(value); 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); 462 465 463 466 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE, 464 467 "FATAL (Branch=%d DRAM-Bank=%d %s " ··· 479 476 480 477 /* read in the 1st NON-FATAL error register */ 481 478 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 482 - FERR_NF_FBD, &value); 483 - if (unlikely(value & FERR_NF_FBD_ERR_MASK)) { 484 - errors = value & FERR_NF_FBD_ERR_MASK; 479 + FERR_NF_FBD, &error_reg); 480 + if (unlikely(error_reg & FERR_NF_FBD_ERR_MASK)) { 481 + errors = error_reg & FERR_NF_FBD_ERR_MASK; 485 482 errnum = find_first_bit(&errors, 486 483 ARRAY_SIZE(ferr_nf_fbd_name)); 487 484 specific = GET_ERR_FROM_TABLE(ferr_nf_fbd_name, errnum); 488 - 489 - /* Clear the error bit */ 490 - pci_write_config_dword(pvt->pci_dev_16_2_fsb_err_regs, 491 - FERR_GLOBAL_LO, value); 485 + branch = (GET_FBD_FAT_IDX(error_reg) == 2) ? 1 : 0; 492 486 493 487 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 494 488 REDMEMA, &syndrome); 495 489 496 - branch = (GET_FBD_FAT_IDX(value) == 2) ? 1 : 0; 497 490 pci_read_config_word(pvt->pci_dev_16_1_fsb_addr_map, 498 491 RECMEMA, &val16); 499 492 bank = RECMEMA_BANK(val16); ··· 497 498 498 499 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 499 500 RECMEMB, &value); 500 - 501 501 is_wr = RECMEMB_IS_WR(value); 502 502 cas = RECMEMB_CAS(value); 503 503 ras = RECMEMB_RAS(value); 504 504 505 505 pci_read_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 506 506 REDMEMB, &value); 507 - 508 507 channel = (branch << 1); 509 508 if (IS_SECOND_CH(value)) 510 509 channel++; 510 + 511 + /* Clear the error bit */ 512 + pci_write_config_dword(pvt->pci_dev_16_1_fsb_addr_map, 513 + FERR_NF_FBD, error_reg); 511 514 512 515 /* Form out message */ 513 516 snprintf(pvt->tmp_prt_buffer, PAGE_SIZE,