|
123 | 123 | { |
124 | 124 | NP_STATUS_OK = 0x00, |
125 | 125 | NP_STATUS_ERROR = 0x01, |
126 | | - NP_STATUS_BAD_BLOCK = 0x02, |
| 126 | + NP_STATUS_BB = 0x02, |
127 | 127 | NP_STATUS_WRITE_ACK = 0x03, |
| 128 | + NP_STATUS_BB_SKIP = 0x04, |
128 | 129 | }; |
129 | 130 |
|
130 | 131 | typedef struct __attribute__((__packed__)) |
@@ -214,9 +215,10 @@ static int np_send_error(uint8_t err_code) |
214 | 215 | return 0; |
215 | 216 | } |
216 | 217 |
|
217 | | -static int np_send_bad_block_info(uint32_t addr, uint32_t size) |
| 218 | +static int np_send_bad_block_info(uint32_t addr, uint32_t size, bool is_skipped) |
218 | 219 | { |
219 | | - np_resp_t resp_header = { NP_RESP_STATUS, NP_STATUS_BAD_BLOCK }; |
| 220 | + uint8_t info = is_skipped ? NP_STATUS_BB_SKIP : NP_STATUS_BB; |
| 221 | + np_resp_t resp_header = { NP_RESP_STATUS, info }; |
220 | 222 | np_resp_bad_block_t bad_block = { resp_header, addr, size }; |
221 | 223 |
|
222 | 224 | if (np_comm_cb->send((uint8_t *)&bad_block, sizeof(bad_block))) |
@@ -333,7 +335,7 @@ static int np_nand_erase(np_prog_t *prog, uint32_t page) |
333 | 335 | case NAND_READY: |
334 | 336 | break; |
335 | 337 | case NAND_ERROR: |
336 | | - if (np_send_bad_block_info(addr, prog->chip_info->block_size)) |
| 338 | + if (np_send_bad_block_info(addr, prog->chip_info->block_size, false)) |
337 | 339 | return -1; |
338 | 340 | break; |
339 | 341 | case NAND_TIMEOUT_ERROR: |
@@ -404,7 +406,7 @@ static int _np_cmd_nand_erase(np_prog_t *prog) |
404 | 406 | if (skip_bb && (is_bad = nand_bad_block_table_lookup(addr))) |
405 | 407 | { |
406 | 408 | DEBUG_PRINT("Skipped bad block at 0x%lx\r\n", addr); |
407 | | - if (np_send_bad_block_info(addr, prog->chip_info->block_size)) |
| 409 | + if (np_send_bad_block_info(addr, prog->chip_info->block_size, true)) |
408 | 410 | return -1; |
409 | 411 | } |
410 | 412 |
|
@@ -507,8 +509,11 @@ static int np_nand_handle_status(np_prog_t *prog) |
507 | 509 | switch (nand_read_status()) |
508 | 510 | { |
509 | 511 | case NAND_ERROR: |
510 | | - if (np_send_bad_block_info(prog->addr, prog->chip_info->block_size)) |
| 512 | + if (np_send_bad_block_info(prog->addr, prog->chip_info->block_size, |
| 513 | + false)) |
| 514 | + { |
511 | 515 | return -1; |
| 516 | + } |
512 | 517 | case NAND_READY: |
513 | 518 | prog->nand_wr_in_progress = 0; |
514 | 519 | prog->nand_timeout = 0; |
@@ -587,8 +592,11 @@ static int np_cmd_nand_write_data(np_prog_t *prog) |
587 | 592 | while (prog->skip_bb && nand_bad_block_table_lookup(prog->addr)) |
588 | 593 | { |
589 | 594 | DEBUG_PRINT("Skipped bad block at 0x%lx\r\n", addr); |
590 | | - if (np_send_bad_block_info(prog->addr, prog->chip_info->block_size)) |
| 595 | + if (np_send_bad_block_info(prog->addr, prog->chip_info->block_size, |
| 596 | + true)) |
| 597 | + { |
591 | 598 | return -1; |
| 599 | + } |
592 | 600 |
|
593 | 601 | prog->addr += prog->chip_info->block_size; |
594 | 602 | prog->page.page += prog->chip_info->block_size / |
@@ -691,7 +699,7 @@ static int np_nand_read(uint32_t addr, np_page_t *page, |
691 | 699 | case NAND_READY: |
692 | 700 | break; |
693 | 701 | case NAND_ERROR: |
694 | | - if (np_send_bad_block_info(addr, chip_info->block_size)) |
| 702 | + if (np_send_bad_block_info(addr, chip_info->block_size, false)) |
695 | 703 | return -1; |
696 | 704 | break; |
697 | 705 | case NAND_TIMEOUT_ERROR: |
@@ -767,7 +775,7 @@ static int _np_cmd_nand_read(np_prog_t *prog) |
767 | 775 | if (skip_bb && nand_bad_block_table_lookup(addr)) |
768 | 776 | { |
769 | 777 | DEBUG_PRINT("Skipped bad block at 0x%lx\r\n", addr); |
770 | | - if (np_send_bad_block_info(addr, prog->chip_info->block_size)) |
| 778 | + if (np_send_bad_block_info(addr, prog->chip_info->block_size, true)) |
771 | 779 | return -1; |
772 | 780 |
|
773 | 781 | /* On partial read do not count bad blocks */ |
@@ -858,7 +866,7 @@ static int np_send_bad_blocks(np_prog_t *prog) |
858 | 866 | for (bb_iter = nand_bad_block_table_iter_alloc(&addr); bb_iter; |
859 | 867 | bb_iter = nand_bad_block_table_iter_next(bb_iter, &addr)) |
860 | 868 | { |
861 | | - if (np_send_bad_block_info(addr, prog->chip_info->block_size)) |
| 869 | + if (np_send_bad_block_info(addr, prog->chip_info->block_size, false)) |
862 | 870 | return -1; |
863 | 871 | } |
864 | 872 |
|
|
0 commit comments