FTL编程回读校验:program后回读比对+ECC检查,失败标记坏块由dhara迁移(根治低VDD静默丢数据)
This commit is contained in:
@@ -132,6 +132,36 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 编程回读校验(2026-09-20 台架实证):供电低于标称(3.1V)时
|
||||||
|
* program 可"状态成功"但 cell 未可靠 latch(ECC 不可纠或数据错位)——
|
||||||
|
* 状态寄存器发现不了,下次复位 journal resume 因 ECC 门拒绝这些
|
||||||
|
* checkpoint 页 → 新写入整体静默丢失(重格式化循环的真根因)。
|
||||||
|
* 回读比对+ECC 检查,失败则标记坏块由 dhara 迁移,宁可丢块不丢卷。 */
|
||||||
|
if (gd5f_page_read(phy_pg) != GD5F_OK) {
|
||||||
|
dhara_nand_mark_bad(n, p >> n->log2_ppb);
|
||||||
|
dhara_set_error(err, DHARA_E_ECC);
|
||||||
|
DBG_ERROR("program verify: readback fail, blk %lu",
|
||||||
|
(unsigned long)(p >> n->log2_ppb));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gd5f_check_ecc() != GD5F_OK) {
|
||||||
|
dhara_nand_mark_bad(n, p >> n->log2_ppb);
|
||||||
|
dhara_set_error(err, DHARA_E_ECC);
|
||||||
|
DBG_ERROR("program verify: ecc uncorrectable, blk %lu",
|
||||||
|
(unsigned long)(p >> n->log2_ppb));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
gd5f_read_from_cache(0, s_copy_buf, FTL_PAGE_SIZE);
|
||||||
|
if (memcmp(s_copy_buf, data, FTL_PAGE_SIZE) != 0) {
|
||||||
|
dhara_nand_mark_bad(n, p >> n->log2_ppb);
|
||||||
|
dhara_set_error(err, DHARA_E_BAD_BLOCK);
|
||||||
|
DBG_ERROR("program verify: data mismatch, blk %lu",
|
||||||
|
(unsigned long)(p >> n->log2_ppb));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user