[U-Boot] [PATCH] NAND: fixed bugs in nand_[read,write]_skip_bad()

- fixed bugs in nand_[read,write]_skip_bad() to double speed - added printing of dots to show progress
Signed-off-by: Valeriy Glushkov gvv@lstec.com --- drivers/mtd/nand/nand_base.c | 16 ++++++++++++++-- drivers/mtd/nand/nand_util.c | 6 ++++-- 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 00c9d4a..e4da6b1 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1136,8 +1136,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, ret = chip->ecc.read_page_raw(mtd, chip, bufpoi); else ret = chip->ecc.read_page(mtd, chip, bufpoi); - if (ret < 0) + if (ret < 0) { + printf("nand_read_opts: page 0x%x error %d\n", + realpage, ret); break; + }
/* Transfer not aligned data */ if (!aligned) { @@ -1190,6 +1193,9 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, /* Increment page address */ realpage++;
+ if( !((realpage << chip->page_shift) & 0xfffff) ) + debug("."); + page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) { @@ -1828,8 +1834,11 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
ret = chip->write_page(mtd, chip, wbuf, page, cached, (ops->mode == MTD_OOB_RAW)); - if (ret) + if (ret) { + printf("nand_write_opts: page 0x%x error %d\n", + realpage, ret); break; + }
writelen -= bytes; if (!writelen) @@ -1839,6 +1848,9 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, buf += bytes; realpage++;
+ if( !((realpage << chip->page_shift) & 0xfffff) ) + debug("."); + page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) { diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 52b3d21..818a876 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -498,8 +498,8 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND write to offset %x failed %d\n", offset, rval); - return rval; } + return rval; }
while (left_to_write > 0) { @@ -513,6 +513,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, continue; }
+ debug(","); if (left_to_write < (nand->erasesize - block_offset)) write_size = left_to_write; else @@ -568,8 +569,8 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND read from offset %x failed %d\n", offset, rval); - return rval; } + return rval; }
while (left_to_read > 0) { @@ -583,6 +584,7 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, continue; }
+ debug(","); if (left_to_read < (nand->erasesize - block_offset)) read_length = left_to_read; else

Anybody interested in the patch?
----- Original Message ----- From: "Valeriy Glushkov" gvv@lstec.com To: u-boot@lists.denx.de Sent: 18 ?????? 2008 ?. 19:27 Subject: [U-Boot] [PATCH] NAND: fixed bugs in nand_[read,write]_skip_bad()
- fixed bugs in nand_[read,write]_skip_bad() to double speed
- added printing of dots to show progress
Signed-off-by: Valeriy Glushkov gvv@lstec.com
drivers/mtd/nand/nand_base.c | 16 ++++++++++++++-- drivers/mtd/nand/nand_util.c | 6 ++++-- 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 00c9d4a..e4da6b1 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1136,8 +1136,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, ret = chip->ecc.read_page_raw(mtd, chip, bufpoi); else ret = chip->ecc.read_page(mtd, chip, bufpoi);
- if (ret < 0)
if (ret < 0) {
printf("nand_read_opts: page 0x%x error %d\n",
realpage, ret);
break;
}
/* Transfer not aligned data */ if (!aligned) {
@@ -1190,6 +1193,9 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, /* Increment page address */ realpage++;
- if( !((realpage << chip->page_shift) & 0xfffff) )
- debug(".");
- page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) {
@@ -1828,8 +1834,11 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
ret = chip->write_page(mtd, chip, wbuf, page, cached, (ops->mode == MTD_OOB_RAW));
- if (ret)
if (ret) {
printf("nand_write_opts: page 0x%x error %d\n",
realpage, ret); break;
}
writelen -= bytes; if (!writelen)
@@ -1839,6 +1848,9 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, buf += bytes; realpage++;
- if( !((realpage << chip->page_shift) & 0xfffff) )
- debug(".");
- page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) {
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 52b3d21..818a876 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -498,8 +498,8 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND write to offset %x failed %d\n", offset, rval);
- return rval; }
- return rval;
}
while (left_to_write > 0) { @@ -513,6 +513,7 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, continue; }
- debug(","); if (left_to_write < (nand->erasesize - block_offset)) write_size = left_to_write; else
@@ -568,8 +569,8 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND read from offset %x failed %d\n", offset, rval);
- return rval; }
- return rval;
}
while (left_to_read > 0) { @@ -583,6 +584,7 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, continue; }
- debug(","); if (left_to_read < (nand->erasesize - block_offset)) read_length = left_to_read; else
-- 1.5.2.5
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

On Tue, Nov 18, 2008 at 07:27:29PM +0200, Valeriy Glushkov wrote:
- fixed bugs in nand_[read,write]_skip_bad() to double speed
Changelog should specify what the bugs are.
- added printing of dots to show progress
Signed-off-by: Valeriy Glushkov gvv@lstec.com
drivers/mtd/nand/nand_base.c | 16 ++++++++++++++-- drivers/mtd/nand/nand_util.c | 6 ++++-- 2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 00c9d4a..e4da6b1 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1136,8 +1136,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, ret = chip->ecc.read_page_raw(mtd, chip, bufpoi); else ret = chip->ecc.read_page(mtd, chip, bufpoi);
- if (ret < 0)
- if (ret < 0) {
- printf("nand_read_opts: page 0x%x error %d\n",
break;realpage, ret);
- }
This patch is whitespace-damaged.
/* Transfer not aligned data */ if (!aligned) {
@@ -1190,6 +1193,9 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, /* Increment page address */ realpage++;
- if( !((realpage << chip->page_shift) & 0xfffff) )
if (!(xxx)), not if( !(xxx) ).
- debug(".");
Should progress meters really be debug()?
Maybe space it out according to percentage, rather than a fixed interval.
page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) { @@ -1828,8 +1834,11 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,
ret = chip->write_page(mtd, chip, wbuf, page, cached, (ops->mode == MTD_OOB_RAW));
- if (ret)
if (ret) {
printf("nand_write_opts: page 0x%x error %d\n",
realpage, ret); break;
}
writelen -= bytes; if (!writelen)
@@ -1839,6 +1848,9 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to, buf += bytes; realpage++;
- if( !((realpage << chip->page_shift) & 0xfffff) )
- debug(".");
- page = realpage & chip->pagemask; /* Check, if we cross a chip boundary */ if (!page) {
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 52b3d21..818a876 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -498,8 +498,8 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND write to offset %x failed %d\n", offset, rval);
- return rval; }
- return rval; }
This bit should be posted in a separate patch, as it's a bugfix that can go in outside the merge window.
Or, we could just get rid of this altogether and always use the loop.
-Scott

- fixed bugs with returning from nand_[read,write]_skip_bad() to double read/write speed
Signed-off-by: Valeriy Glushkov gvv@lstec.com ---
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 52b3d21..818a876 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -498,8 +498,8 @@ int nand_write_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND write to offset %x failed %d\n", offset, rval); - return rval; } + return rval; }
while (left_to_write > 0) { @@ -568,8 +569,8 @@ int nand_read_skip_bad(nand_info_t *nand, size_t offset, size_t *length, if (rval != 0) { printf ("NAND read from offset %x failed %d\n", offset, rval); - return rval; } + return rval; }
while (left_to_read > 0) {

Valeriy Glushkov wrote:
- fixed bugs with returning from nand_[read,write]_skip_bad() to double
read/write speed
Signed-off-by: Valeriy Glushkov gvv@lstec.com
Patch is still whitespace-damaged; applied by hand to u-boot-nand-flash.
In the future, do not use Outlook to send patches. Either use a mail client that does not alter the contents of the e-mail, or use git send-email.
-Scott
participants (2)
-
Scott Wood
-
Valeriy Glushkov