Lines Matching +full:1 +full:d +full:- +full:histogram
1 // SPDX-License-Identifier: GPL-2.0-only
6 * Test for multi-bit error recovery on a NAND page This mostly tests the
11 * 0 - artificially inserting bit errors until the ECC fails
15 * 1 - re-writing the same pattern repeatedly until the ECC fails.
17 * generate '0' bits if '1' has been written sufficient times.
55 MODULE_PARM_DESC(mode, "0=incremental errors, 1=overwrite test");
85 c = (c & 0x55) << 1 | (c & 0xAA) >> 1; in hash()
95 return mtdtest_write(mtd, offset, mtd->writesize, wbuffer); in write_page()
98 /* Re-writes the data area while leaving the OOB alone. */
108 ops.len = mtd->writesize; in rewrite_page()
117 if (err || ops.retlen != mtd->writesize) { in rewrite_page()
118 pr_err("error: write_oob failed (%d)\n", err); in rewrite_page()
120 err = -EIO; in rewrite_page()
138 memcpy(&oldstats, &mtd->ecc_stats, sizeof(oldstats)); in read_page()
140 err = mtd_read(mtd, offset, mtd->writesize, &read, rbuffer); in read_page()
141 if (!err || err == -EUCLEAN) in read_page()
142 err = mtd->ecc_stats.corrected - oldstats.corrected; in read_page()
144 if (err < 0 || read != mtd->writesize) { in read_page()
147 err = -EIO; in read_page()
161 for (i = 0; i < mtd->writesize; i++) { in verify_page()
170 return -EIO; in verify_page()
175 #define CBIT(v, n) ((v) & (1 << (n)))
176 #define BCLR(v, n) ((v) = (v) & ~(1 << (n)))
178 /* Finds the first '1' bit in wbuffer starting at offset 'byte'
184 while (byte < mtd->writesize) { in insert_biterror()
185 for (bit = 7; bit >= 0; bit--) { in insert_biterror()
194 pr_err("biterror: Failed to find a '1' bit\n"); in insert_biterror()
195 return -EIO; in insert_biterror()
208 for (i = 0; i < mtd->writesize; i++) in incremental_errors_test()
211 err = write_page(1); in incremental_errors_test()
215 while (1) { in incremental_errors_test()
217 err = rewrite_page(1); in incremental_errors_test()
221 err = read_page(1); in incremental_errors_test()
223 pr_info("Read reported %d corrected bit errors\n", err); in incremental_errors_test()
225 pr_err("After %d biterrors per subpage, read reported error %d\n", in incremental_errors_test()
231 err = verify_page(1); in incremental_errors_test()
237 pr_info("Successfully corrected %d bit errors per subpage\n", in incremental_errors_test()
253 /* Writes 'random' data to page and then re-writes that same data repeatedly.
254 This eventually develops bit errors (bits written as '1' will slowly become
265 static unsigned bitstats[MAXBITS]; /* bit error histogram. */ in overwrite_test()
271 for (i = 0; i < mtd->writesize; i++) in overwrite_test()
274 err = write_page(1); in overwrite_test()
288 err = -EIO; in overwrite_test()
294 pr_info("Read reported %d corrected bit errors\n", in overwrite_test()
298 pr_info("Read reported error %d\n", err); in overwrite_test()
318 * errors, bitstats[1] the number of ops with 1 bit error, etc. */ in overwrite_test()
319 pr_info("Bit error histogram (%d operations total):\n", opno); in overwrite_test()
321 pr_info("Page reads with %3d corrected bit errors: %d\n", in overwrite_test()
334 pr_info("MTD device: %d\n", dev); in mtd_nandbiterrs_init()
345 err = -ENODEV; in mtd_nandbiterrs_init()
350 (unsigned long long)mtd->size, mtd->erasesize, in mtd_nandbiterrs_init()
351 mtd->writesize, mtd->oobsize); in mtd_nandbiterrs_init()
353 subsize = mtd->writesize >> mtd->subpage_sft; in mtd_nandbiterrs_init()
354 subcount = mtd->writesize / subsize; in mtd_nandbiterrs_init()
356 pr_info("Device uses %d subpages of %d bytes\n", subcount, subsize); in mtd_nandbiterrs_init()
358 offset = (loff_t)page_offset * mtd->writesize; in mtd_nandbiterrs_init()
364 wbuffer = kmalloc(mtd->writesize, GFP_KERNEL); in mtd_nandbiterrs_init()
366 err = -ENOMEM; in mtd_nandbiterrs_init()
370 rbuffer = kmalloc(mtd->writesize, GFP_KERNEL); in mtd_nandbiterrs_init()
372 err = -ENOMEM; in mtd_nandbiterrs_init()
388 /* We leave the block un-erased in case of test failure. */ in mtd_nandbiterrs_init()
393 err = -EIO; in mtd_nandbiterrs_init()