|
|
@@ -599,21 +599,28 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
|
|
|
uint32_t start_page;
|
|
|
int result;
|
|
|
|
|
|
- SNFUD_ASSERT(chip);
|
|
|
-
|
|
|
start_page = phy_blk * chip->page_per_blk;
|
|
|
|
|
|
result = snf_read_page_spare(chip, start_page, spare_buf, sizeof(spare_buf));
|
|
|
if (result != SFUD_SUCCESS) {
|
|
|
- SFUD_INFO("%s, snf_read_page_spare page0 fail, result:%d", __func__, result);
|
|
|
- goto exit;
|
|
|
+ SFUD_INFO("%s, read page0 spare fail, result:%d", __func__, result);
|
|
|
+ if (result == SFUD_ERR_READ_ECC) {
|
|
|
+ result = SFUD_ERR_BAD_BLK; //read ecc error means bad block.
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+ return SFUD_ERR_READ;
|
|
|
}
|
|
|
+
|
|
|
if (spare_buf[0] == 0xFF) {
|
|
|
if (chip->bbm_type == 2) {
|
|
|
result = snf_read_page_spare(chip, start_page + 1, spare_buf, sizeof(spare_buf));
|
|
|
if (result != SFUD_SUCCESS) {
|
|
|
- SFUD_INFO("%s, snf_read_page_spare page1 fail, result:%d", __func__, result);
|
|
|
- goto exit;
|
|
|
+ SFUD_INFO("%s, read page1 spare fail, result:%d", __func__, result);
|
|
|
+ if (result == SFUD_ERR_READ_ECC) {
|
|
|
+ result = SFUD_ERR_BAD_BLK; //read ecc error means bad block.
|
|
|
+ goto exit;
|
|
|
+ }
|
|
|
+ return SFUD_ERR_READ;
|
|
|
}
|
|
|
if (spare_buf[0] == 0xFF) {
|
|
|
return SFUD_SUCCESS;
|
|
|
@@ -623,12 +630,14 @@ static int snf_check_physical_bad_block(snfud_flash_chip *chip, uint32_t phy_blk
|
|
|
} else {
|
|
|
return SFUD_SUCCESS;
|
|
|
}
|
|
|
+ } else {
|
|
|
+ result = SFUD_ERR_BAD_BLK;
|
|
|
}
|
|
|
|
|
|
exit:
|
|
|
SFUD_INFO("%s bad block:%d.", __func__, phy_blk);
|
|
|
|
|
|
- return SFUD_ERR_READ;
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
static int snf_write_physical_blcok(snfud_flash_chip *chip, uint32_t phy_blk, uint32_t offset, uint8_t *data, uint32_t size)
|
|
|
@@ -1946,6 +1955,7 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
|
|
|
sfud_err result = SFUD_SUCCESS;
|
|
|
uint8_t *pbuf;
|
|
|
int bbt_size;
|
|
|
+ int timeout;
|
|
|
int i;
|
|
|
|
|
|
bbt_size = sizeof(snf_bbt) + sizeof(snf_blk_node) * chip->total_blk;
|
|
|
@@ -1964,6 +1974,8 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
|
|
|
SFUD_INFO("%s Create a new BBT.", __func__);
|
|
|
memset(chip->bbt, 0, bbt_size);
|
|
|
for (i = 0; i < chip->total_blk; i++) {
|
|
|
+ timeout = 0;
|
|
|
+retry:
|
|
|
result = snf_check_physical_bad_block(chip, i);
|
|
|
if (result == SFUD_SUCCESS) {
|
|
|
chip->bbt->node[i].status = SNF_BLK_GOOD;
|
|
|
@@ -1971,6 +1983,12 @@ static sfud_err snf_bbt_init(snfud_flash_chip *chip)
|
|
|
chip->bbt->node[i].status = SNF_BLK_BAD;
|
|
|
chip->bbt->bad_blocks++;
|
|
|
} else {
|
|
|
+ if (timeout == 0) {
|
|
|
+ SFUD_INFO("%s block(%d) bad blk check fail, retry...", __func__, i);
|
|
|
+ }
|
|
|
+ if (timeout++ < 20) {
|
|
|
+ goto retry;
|
|
|
+ }
|
|
|
SFUD_INFO("%s block(%d) bad blk check fail, flash abnormal.", __func__, i);
|
|
|
SNFUD_ASSERT(0);
|
|
|
}
|