FTL编程回读校验:program后回读比对+ECC检查,失败标记坏块由dhara迁移(根治低VDD静默丢数据)

This commit is contained in:
2026-09-20 04:30:19 +08:00
parent f03a3b6633
commit 022e14398e
+30
View File
@@ -132,6 +132,36 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d
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;
}