X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fmtd%2Fnand%2Fnand_util.c;h=29c42f73b1cc4c3c2131a332e68763937ed49585;hb=bb3bcfa2426cc6a0aecec7270e3ee67ca843a125;hp=88206d067a622f44c92fe848eeebaba48a29219d;hpb=8d2effea23e938631126a7888008a0637e13b389;p=platform%2Fkernel%2Fu-boot.git diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 88206d0..29c42f7 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -41,10 +41,6 @@ #include #include -#if !defined(CONFIG_SYS_64BIT_VSPRINTF) -#warning Please define CONFIG_SYS_64BIT_VSPRINTF for correct output! -#endif - typedef struct erase_info erase_info_t; typedef struct mtd_info mtd_info_t; @@ -315,7 +311,7 @@ int nand_lock(struct mtd_info *mtd, int tight) * NAND_LOCK_STATUS_UNLOCK: page unlocked * */ -int nand_get_lock_status(struct mtd_info *mtd, ulong offset) +int nand_get_lock_status(struct mtd_info *mtd, loff_t offset) { int ret = 0; int chipnr; @@ -436,7 +432,7 @@ int nand_unlock(struct mtd_info *mtd, ulong start, ulong length) * @param length image length * @return image length including bad blocks */ -static size_t get_len_incl_bad (nand_info_t *nand, size_t offset, +static size_t get_len_incl_bad (nand_info_t *nand, loff_t offset, const size_t length) { size_t len_incl_bad = 0; @@ -452,7 +448,7 @@ static size_t get_len_incl_bad (nand_info_t *nand, size_t offset, len_incl_bad += block_len; offset += block_len; - if ((offset + len_incl_bad) >= nand->size) + if (offset >= nand->size) break; } @@ -473,7 +469,7 @@ static size_t get_len_incl_bad (nand_info_t *nand, size_t offset, * @param buf buffer to read from * @return 0 in case of success */ -int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, +int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer) { int rval; @@ -490,7 +486,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, len_incl_bad = get_len_incl_bad (nand, offset, *length); - if ((offset + len_incl_bad) >= nand->size) { + if ((offset + len_incl_bad) > nand->size) { printf ("Attempt to write outside the flash area\n"); return -EINVAL; } @@ -498,7 +494,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (len_incl_bad == *length) { rval = nand_write (nand, offset, length, buffer); if (rval != 0) - printf ("NAND write to offset %zx failed %d\n", + printf ("NAND write to offset %llx failed %d\n", offset, rval); return rval; @@ -508,8 +504,10 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, size_t block_offset = offset & (nand->erasesize - 1); size_t write_size; + WATCHDOG_RESET (); + if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { - printf ("Skip bad block 0x%08zx\n", + printf ("Skip bad block 0x%08llx\n", offset & ~(nand->erasesize - 1)); offset += nand->erasesize - block_offset; continue; @@ -522,7 +520,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, rval = nand_write (nand, offset, &write_size, p_buffer); if (rval != 0) { - printf ("NAND write to offset %zx failed %d\n", + printf ("NAND write to offset %llx failed %d\n", offset, rval); *length -= left_to_write; return rval; @@ -550,7 +548,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, * @param buffer buffer to write to * @return 0 in case of success */ -int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, +int nand_read_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer) { int rval; @@ -560,17 +558,17 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, len_incl_bad = get_len_incl_bad (nand, offset, *length); - if ((offset + len_incl_bad) >= nand->size) { + if ((offset + len_incl_bad) > nand->size) { printf ("Attempt to read outside the flash area\n"); return -EINVAL; } if (len_incl_bad == *length) { rval = nand_read (nand, offset, length, buffer); - if (rval != 0) - printf ("NAND read from offset %zx failed %d\n", - offset, rval); - + if (!rval || rval == -EUCLEAN) + return 0; + printf ("NAND read from offset %llx failed %d\n", + offset, rval); return rval; } @@ -578,8 +576,10 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, size_t block_offset = offset & (nand->erasesize - 1); size_t read_length; + WATCHDOG_RESET (); + if (nand_block_isbad (nand, offset & ~(nand->erasesize - 1))) { - printf ("Skipping bad block 0x%08zx\n", + printf ("Skipping bad block 0x%08llx\n", offset & ~(nand->erasesize - 1)); offset += nand->erasesize - block_offset; continue; @@ -591,8 +591,8 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, read_length = nand->erasesize - block_offset; rval = nand_read (nand, offset, &read_length, p_buffer); - if (rval != 0) { - printf ("NAND read from offset %zx failed %d\n", + if (rval && rval != -EUCLEAN) { + printf ("NAND read from offset %llx failed %d\n", offset, rval); *length -= left_to_read; return rval;