static int verify_eraseblock(int ebnum) { size_t read; int err = 0; loff_t addr = ebnum * mtd->erasesize; prandom_bytes_state(&rnd_state, writebuf, subpgsize); clear_data(readbuf, subpgsize); err = mtd_read(mtd, addr, subpgsize, &read, readbuf); if (unlikely(err || read != subpgsize)) { if (mtd_is_bitflip(err) && read == subpgsize) { pr_info("ECC correction at %#llx\n", (long long)addr); err = 0; } else { pr_err("error: read failed at %#llx\n", (long long)addr); return err ? err : -1; } } if (unlikely(memcmp(readbuf, writebuf, subpgsize))) { pr_err("error: verify failed at %#llx\n", (long long)addr); pr_info("------------- written----------------\n"); print_subpage(writebuf); pr_info("------------- read ------------------\n"); print_subpage(readbuf); pr_info("-------------------------------------\n"); errcnt += 1; } addr += subpgsize; prandom_bytes_state(&rnd_state, writebuf, subpgsize); clear_data(readbuf, subpgsize); err = mtd_read(mtd, addr, subpgsize, &read, readbuf); if (unlikely(err || read != subpgsize)) { if (mtd_is_bitflip(err) && read == subpgsize) { pr_info("ECC correction at %#llx\n", (long long)addr); err = 0; } else { pr_err("error: read failed at %#llx\n", (long long)addr); return err ? err : -1; } } if (unlikely(memcmp(readbuf, writebuf, subpgsize))) { pr_info("error: verify failed at %#llx\n", (long long)addr); pr_info("------------- written----------------\n"); print_subpage(writebuf); pr_info("------------- read ------------------\n"); print_subpage(readbuf); pr_info("-------------------------------------\n"); errcnt += 1; } return err; }
static int verify_eraseblock(int ebnum) { size_t read = 0; int err = 0; loff_t addr = ebnum * mtd->erasesize; set_random_data(writebuf, subpgsize); clear_data(readbuf, subpgsize); read = 0; err = mtd->read(mtd, addr, subpgsize, &read, readbuf); if (unlikely(err || read != subpgsize)) { if (err == -EUCLEAN && read == subpgsize) { printk(PRINT_PREF "ECC correction at %#llx\n", (long long)addr); err = 0; } else { printk(PRINT_PREF "error: read failed at %#llx\n", (long long)addr); return err ? err : -1; } } if (unlikely(memcmp(readbuf, writebuf, subpgsize))) { printk(PRINT_PREF "error: verify failed at %#llx\n", (long long)addr); printk(PRINT_PREF "------------- written----------------\n"); print_subpage(writebuf); printk(PRINT_PREF "------------- read ------------------\n"); print_subpage(readbuf); printk(PRINT_PREF "-------------------------------------\n"); errcnt += 1; } addr += subpgsize; set_random_data(writebuf, subpgsize); clear_data(readbuf, subpgsize); read = 0; err = mtd->read(mtd, addr, subpgsize, &read, readbuf); if (unlikely(err || read != subpgsize)) { if (err == -EUCLEAN && read == subpgsize) { printk(PRINT_PREF "ECC correction at %#llx\n", (long long)addr); err = 0; } else { printk(PRINT_PREF "error: read failed at %#llx\n", (long long)addr); return err ? err : -1; } } if (unlikely(memcmp(readbuf, writebuf, subpgsize))) { printk(PRINT_PREF "error: verify failed at %#llx\n", (long long)addr); printk(PRINT_PREF "------------- written----------------\n"); print_subpage(writebuf); printk(PRINT_PREF "------------- read ------------------\n"); print_subpage(readbuf); printk(PRINT_PREF "-------------------------------------\n"); errcnt += 1; } return err; }