Lines Matching full:ecc
23 * corrected by on-die ECC and should be rewritten.
28 * On chips with 8-bit ECC and additional bit can be used to distinguish
74 struct micron_on_die_ecc ecc; member
136 .ecc = micron_nand_on_die_4_ooblayout_ecc,
149 oobregion->offset = mtd->oobsize - chip->ecc.total; in micron_nand_on_die_8_ooblayout_ecc()
150 oobregion->length = chip->ecc.total; in micron_nand_on_die_8_ooblayout_ecc()
165 oobregion->length = mtd->oobsize - chip->ecc.total - 2; in micron_nand_on_die_8_ooblayout_free()
171 .ecc = micron_nand_on_die_8_ooblayout_ecc,
181 if (micron->ecc.forced) in micron_nand_on_die_ecc_setup()
184 if (micron->ecc.enabled == enable) in micron_nand_on_die_ecc_setup()
192 micron->ecc.enabled = enable; in micron_nand_on_die_ecc_setup()
214 * The internal ECC doesn't tell us the number of bitflips that have in micron_nand_on_die_ecc_status_4()
231 ret = nand_read_page_op(chip, page, 0, micron->ecc.rawbuf, in micron_nand_on_die_ecc_status_4()
236 for (step = 0; step < chip->ecc.steps; step++) { in micron_nand_on_die_ecc_status_4()
240 offs = step * chip->ecc.size; in micron_nand_on_die_ecc_status_4()
241 rawbuf = micron->ecc.rawbuf + offs; in micron_nand_on_die_ecc_status_4()
244 for (i = 0; i < chip->ecc.size; i++) in micron_nand_on_die_ecc_status_4()
248 rawbuf = micron->ecc.rawbuf + mtd->writesize + offs; in micron_nand_on_die_ecc_status_4()
251 for (i = 0; i < chip->ecc.bytes + 4; i++) in micron_nand_on_die_ecc_status_4()
254 if (WARN_ON(nbitflips > chip->ecc.strength)) in micron_nand_on_die_ecc_status_4()
321 if (chip->ecc.strength == 4) in micron_nand_read_page_on_die_ecc()
352 /* The NAND flash doesn't support on-die ECC */
356 * The NAND flash supports on-die ECC and it can be
362 * The NAND flash supports on-die ECC, and it cannot be
372 * Try to detect if the NAND support on-die ECC. To do this, we enable
375 * allow disabling the on-die ECC and we don't support such NANDs for
378 * This function also has the side effect of disabling on-die ECC if
393 * We only support on-die ECC of 4/512 or 8/512 in micron_supports_on_die_ecc()
398 /* 0x2 means on-die ECC is available. */ in micron_supports_on_die_ecc()
404 * It seems that there are devices which do not support ECC officially. in micron_supports_on_die_ecc()
406 * enabling the ECC feature but don't reflect that to the READ_ID table. in micron_supports_on_die_ecc()
407 * So we have to guarantee that we disable the ECC feature directly in micron_supports_on_die_ecc()
434 * We only support on-die ECC of 4/512 or 8/512 in micron_supports_on_die_ecc()
465 chip->ecc.mode != NAND_ECC_ON_DIE) { in micron_nand_init()
466 pr_err("On-die ECC forcefully enabled, not supported\n"); in micron_nand_init()
471 if (chip->ecc.mode == NAND_ECC_ON_DIE) { in micron_nand_init()
473 pr_err("On-die ECC selected but not supported\n"); in micron_nand_init()
479 micron->ecc.forced = true; in micron_nand_init()
480 micron->ecc.enabled = true; in micron_nand_init()
484 * In case of 4bit on-die ECC, we need a buffer to store a in micron_nand_init()
486 * to the same page after ECC correction happened and extract in micron_nand_init()
488 * That's not needed for 8-bit ECC, because the status expose in micron_nand_init()
492 micron->ecc.rawbuf = kmalloc(mtd->writesize + in micron_nand_init()
495 if (!micron->ecc.rawbuf) { in micron_nand_init()
508 chip->ecc.bytes = chip->ecc_strength_ds * 2; in micron_nand_init()
509 chip->ecc.size = 512; in micron_nand_init()
510 chip->ecc.strength = chip->ecc_strength_ds; in micron_nand_init()
511 chip->ecc.algo = NAND_ECC_BCH; in micron_nand_init()
512 chip->ecc.read_page = micron_nand_read_page_on_die_ecc; in micron_nand_init()
513 chip->ecc.write_page = micron_nand_write_page_on_die_ecc; in micron_nand_init()
516 chip->ecc.read_page_raw = nand_read_page_raw_notsupp; in micron_nand_init()
517 chip->ecc.write_page_raw = nand_write_page_raw_notsupp; in micron_nand_init()
519 chip->ecc.read_page_raw = nand_read_page_raw; in micron_nand_init()
520 chip->ecc.write_page_raw = nand_write_page_raw; in micron_nand_init()
527 kfree(micron->ecc.rawbuf); in micron_nand_init()
537 kfree(micron->ecc.rawbuf); in micron_nand_cleanup()