NAND: fix first and last handling in nand_build_bbt
authorJon Povey <jon.povey@racelogic.co.uk>
Thu, 13 May 2010 09:31:42 +0000 (18:31 +0900)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Fri, 14 May 2010 11:23:01 +0000 (13:23 +0200)
Last block was being skipped, fix by changing the loop test from "<" to "<="

First block argument was ignored, always started from block 0 (and counted
the wrong blocks as bad if first was nonzero). Now we use it.

Signed-off-by: Jon Povey <jon.povey@racelogic.co.uk>
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/flash/nand/core.c

index e76349165e2189bc6179c73e955a768daf5ef10b..44b13ce1de85b09124528dca083b7019b133cc95 100644 (file)
@@ -222,8 +222,9 @@ COMMAND_HELPER(nand_command_get_device, unsigned name_index,
 
 int nand_build_bbt(struct nand_device *nand, int first, int last)
 {
-       uint32_t page = 0x0;
+       uint32_t page;
        int i;
+       int pages_per_block = (nand->erase_size / nand->page_size);
        uint8_t oob[6];
 
        if ((first < 0) || (first >= nand->num_blocks))
@@ -232,7 +233,8 @@ int nand_build_bbt(struct nand_device *nand, int first, int last)
        if ((last >= nand->num_blocks) || (last == -1))
                last = nand->num_blocks - 1;
 
-       for (i = first; i < last; i++)
+       page = first * pages_per_block;
+       for (i = first; i <= last; i++)
        {
                nand_read_page(nand, page, NULL, 0, oob, 6);
 
@@ -248,7 +250,7 @@ int nand_build_bbt(struct nand_device *nand, int first, int last)
                        nand->blocks[i].is_bad = 0;
                }
 
-               page += (nand->erase_size / nand->page_size);
+               page += pages_per_block;
        }
 
        return ERROR_OK;