[U-Boot] [PATCH] update nand.h to support address more than 0x80000000

Hi all,
I found a bug in nand.h which prevent UBOOT to supprt large NAND chip.
The bug description as below: In the original implementation, we use a wrapper function in nand.h to facilitate nand_base function usage in other files, like cmd_nand.c, nand_util.c etc.
However, the wrapper in nand.h is using off_t which is long type. If we pass a address like 0x80000000, which is allowed by nand_base.c, the wrapper would recognize it as a negative num. So we would get a huge num when this parameter get into nand_base.c
Fix it by replacing off_t to loff_t type.
Signed-off-by: Lei Wen leiwen@marvell.com --- include/nand.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/nand.h b/include/nand.h index 230aa62..293d481 100644 --- a/include/nand.h +++ b/include/nand.h @@ -36,28 +36,28 @@ typedef struct mtd_info nand_info_t; extern int nand_curr_device; extern nand_info_t nand_info[];
-static inline int nand_read(nand_info_t *info, off_t ofs, size_t *len, u_char *buf) +static inline int nand_read(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf) { return info->read(info, ofs, *len, (size_t *)len, buf); }
-static inline int nand_write(nand_info_t *info, off_t ofs, size_t *len, u_char *buf) +static inline int nand_write(nand_info_t *info, loff_t ofs, size_t *len, u_char *buf) { return info->write(info, ofs, *len, (size_t *)len, buf); }
-static inline int nand_write_oob(nand_info_t *info, off_t ofs, +static inline int nand_write_oob(nand_info_t *info, loff_t ofs, struct mtd_oob_ops *ops) { return info->write_oob(info, ofs, ops); }
-static inline int nand_block_isbad(nand_info_t *info, off_t ofs) +static inline int nand_block_isbad(nand_info_t *info, loff_t ofs) { return info->block_isbad(info, ofs); }
-static inline int nand_erase(nand_info_t *info, off_t off, size_t size) +static inline int nand_erase(nand_info_t *info, loff_t off, size_t size) {

On Tue, Jun 02, 2009 at 07:27:01PM +0800, adrian wen wrote:
Hi all,
I found a bug in nand.h which prevent UBOOT to supprt large NAND chip.
The bug description as below: In the original implementation, we use a wrapper function in nand.h to facilitate nand_base function usage in other files, like cmd_nand.c, nand_util.c etc.
However, the wrapper in nand.h is using off_t which is long type. If we pass a address like 0x80000000, which is allowed by nand_base.c, the wrapper would recognize it as a negative num. So we would get a huge num when this parameter get into nand_base.c
Fix it by replacing off_t to loff_t type.
Signed-off-by: Lei Wen leiwen@marvell.com
A substantially similar patch was posted here: http://lists.denx.de/pipermail/u-boot/2009-May/052847.html
I'm fine with this change, but it should also handle large erases.
-Scott

2009/6/3 Scott Wood scottwood@freescale.com
On Tue, Jun 02, 2009 at 07:27:01PM +0800, adrian wen wrote:
Hi all,
I found a bug in nand.h which prevent UBOOT to supprt large NAND chip.
The bug description as below: In the original implementation, we use a wrapper function in nand.h to facilitate nand_base function usage in other files, like cmd_nand.c, nand_util.c etc.
However, the wrapper in nand.h is using off_t which is long type. If we pass a address like 0x80000000, which is allowed by nand_base.c, the wrapper would recognize it as a negative num. So we would get a huge num when this parameter get into nand_base.c
Fix it by replacing off_t to loff_t type.
Signed-off-by: Lei Wen leiwen@marvell.com
A substantially similar patch was posted here: http://lists.denx.de/pipermail/u-boot/2009-May/052847.html
I'm fine with this change, but it should also handle large erases.
-Scott
I don't quitly catch the meaning. Do you mean that uboot erases begin with large address or large length?
This patch only solve the wrapper bug. For the nand_block_isbad as a example, this function defined in nand.h as: static inline int nand_block_isbad(nand_info_t *info, off_t ofs) { return info->block_isbad(info, ofs); }
However, in nand_base.c, we define this function as: static int nand_block_markbad(struct mtd_info *mtd, loff_t ofs)
Also, in nand_util.c, it use a lot of nand_block_markbad, which is the one _defined_ in nand.h. So the problem comes that when we pass a address greater than 0x80000000, the off_t type would recognize it as a negative number, while loff_t recognize it valid.
When this _0x80000000_ pass to the nand_block_markbad in nand_base.c, it would be recognized as 0xffffffff80000000, which is caused by the wrapper in nand.h.
-Adrian

Dear Scott Wood,
In message 20090602201923.GA4549@b07421-ec1.am.freescale.net you wrote:
On Tue, Jun 02, 2009 at 07:27:01PM +0800, adrian wen wrote:
Hi all,
I found a bug in nand.h which prevent UBOOT to supprt large NAND chip.
The bug description as below: In the original implementation, we use a wrapper function in nand.h to facilitate nand_base function usage in other files, like cmd_nand.c, nand_util.c etc.
However, the wrapper in nand.h is using off_t which is long type. If we pass a address like 0x80000000, which is allowed by nand_base.c, the wrapper would recognize it as a negative num. So we would get a huge num when this parameter get into nand_base.c
Fix it by replacing off_t to loff_t type.
Signed-off-by: Lei Wen leiwen@marvell.com
A substantially similar patch was posted here: http://lists.denx.de/pipermail/u-boot/2009-May/052847.html
I'm fine with this change, but it should also handle large erases.
What happened out of this? I see a question asked by Adrian, but I cannot find a reply from you?
Best regards,
Wolfgang Denk

On Sun, Jul 19, 2009 at 01:20:07AM +0200, Wolfgang Denk wrote:
Dear Scott Wood,
In message 20090602201923.GA4549@b07421-ec1.am.freescale.net you wrote:
On Tue, Jun 02, 2009 at 07:27:01PM +0800, adrian wen wrote:
Hi all,
I found a bug in nand.h which prevent UBOOT to supprt large NAND chip.
The bug description as below: In the original implementation, we use a wrapper function in nand.h to facilitate nand_base function usage in other files, like cmd_nand.c, nand_util.c etc.
However, the wrapper in nand.h is using off_t which is long type. If we pass a address like 0x80000000, which is allowed by nand_base.c, the wrapper would recognize it as a negative num. So we would get a huge num when this parameter get into nand_base.c
Fix it by replacing off_t to loff_t type.
Signed-off-by: Lei Wen leiwen@marvell.com
A substantially similar patch was posted here: http://lists.denx.de/pipermail/u-boot/2009-May/052847.html
I'm fine with this change, but it should also handle large erases.
What happened out of this? I see a question asked by Adrian, but I cannot find a reply from you?
The previous patch (linked above) was applied. Large erase is still to be done.
-Scott
participants (3)
-
adrian wen
-
Scott Wood
-
Wolfgang Denk