[U-Boot] [PATCH] mtd: fix false positive "Offset exceeds device limit" error

Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000
NAND read: Offset exceeds device limit => nand erase 100000 100000
NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com ---
drivers/mtd/mtd_uboot.c | 5 +++-- include/linux/mtd/mtd.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c index 7197007..c517b9c 100644 --- a/drivers/mtd/mtd_uboot.c +++ b/drivers/mtd/mtd_uboot.c @@ -43,7 +43,7 @@ static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, - loff_t *maxsize, int devtype, int chipsize) + loff_t *maxsize, int devtype, uint64_t chipsize) { if (!str2off(arg, off)) return get_part(arg, idx, off, size, maxsize, devtype); @@ -59,7 +59,8 @@ int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off, - loff_t *size, loff_t *maxsize, int devtype, int chipsize) + loff_t *size, loff_t *maxsize, int devtype, + uint64_t chipsize) { int ret;
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 33669da..552d4d6 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -484,8 +484,9 @@ int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); int del_mtd_partitions(struct mtd_info *);
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, - loff_t *maxsize, int devtype, int chipsize); + loff_t *maxsize, int devtype, uint64_t chipsize); int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off, - loff_t *size, loff_t *maxsize, int devtype, int chipsize); + loff_t *size, loff_t *maxsize, int devtype, + uint64_t chipsize); #endif #endif /* __MTD_MTD_H__ */

Hey, quick review and apply please?
NAND commands are not working!
2015-07-01 21:35 GMT+09:00 Masahiro Yamada yamada.masahiro@socionext.com:
Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000 NAND read: Offset exceeds device limit => nand erase 100000 100000 NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mtd/mtd_uboot.c | 5 +++-- include/linux/mtd/mtd.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c index 7197007..c517b9c 100644 --- a/drivers/mtd/mtd_uboot.c +++ b/drivers/mtd/mtd_uboot.c @@ -43,7 +43,7 @@ static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
loff_t *maxsize, int devtype, int chipsize)
loff_t *maxsize, int devtype, uint64_t chipsize)
{ if (!str2off(arg, off)) return get_part(arg, idx, off, size, maxsize, devtype); @@ -59,7 +59,8 @@ int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
loff_t *size, loff_t *maxsize, int devtype, int chipsize)
loff_t *size, loff_t *maxsize, int devtype,
uint64_t chipsize)
{ int ret;
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 33669da..552d4d6 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -484,8 +484,9 @@ int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); int del_mtd_partitions(struct mtd_info *);
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
loff_t *maxsize, int devtype, int chipsize);
loff_t *maxsize, int devtype, uint64_t chipsize);
int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
loff_t *size, loff_t *maxsize, int devtype, int chipsize);
loff_t *size, loff_t *maxsize, int devtype,
uint64_t chipsize);
#endif
#endif /* __MTD_MTD_H__ */
1.9.1
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

Hello Masahiro,
Am 04.07.2015 um 19:07 schrieb Masahiro Yamada:
Hey, quick review and apply please?
NAND commands are not working!
2015-07-01 21:35 GMT+09:00 Masahiro Yamada yamada.masahiro@socionext.com:
Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000 NAND read: Offset exceeds device limit => nand erase 100000 100000 NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mtd/mtd_uboot.c | 5 +++-- include/linux/mtd/mtd.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
Thanks!
Acked-by: Heiko Schocher hs@denx.de
bye, Heiko
diff --git a/drivers/mtd/mtd_uboot.c b/drivers/mtd/mtd_uboot.c index 7197007..c517b9c 100644 --- a/drivers/mtd/mtd_uboot.c +++ b/drivers/mtd/mtd_uboot.c @@ -43,7 +43,7 @@ static int get_part(const char *partname, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
loff_t *maxsize, int devtype, int chipsize)
{ if (!str2off(arg, off)) return get_part(arg, idx, off, size, maxsize, devtype);loff_t *maxsize, int devtype, uint64_t chipsize)
@@ -59,7 +59,8 @@ int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size, }
int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,
loff_t *size, loff_t *maxsize, int devtype, int chipsize)
loff_t *size, loff_t *maxsize, int devtype,
{ int ret;uint64_t chipsize)
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h index 33669da..552d4d6 100644 --- a/include/linux/mtd/mtd.h +++ b/include/linux/mtd/mtd.h @@ -484,8 +484,9 @@ int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); int del_mtd_partitions(struct mtd_info *);
int mtd_arg_off(const char *arg, int *idx, loff_t *off, loff_t *size,
loff_t *maxsize, int devtype, int chipsize);
int mtd_arg_off_size(int argc, char *const argv[], int *idx, loff_t *off,loff_t *maxsize, int devtype, uint64_t chipsize);
loff_t *size, loff_t *maxsize, int devtype, int chipsize);
loff_t *size, loff_t *maxsize, int devtype,
#endif #endif /* __MTD_MTD_H__ */uint64_t chipsize);
-- 1.9.1
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

On Wed, 2015-07-01 at 21:35 +0900, Masahiro Yamada wrote:
Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000 NAND read: Offset exceeds device limit => nand erase 100000 100000 NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mtd/mtd_uboot.c | 5 +++-- include/linux/mtd/mtd.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
Acked-by: Scott Wood scottwood@freescale.com
I'm assuming this patch will be merged via whatever tree merged the breakage...
-Scott

Tom, Could you directly apply this into your u-boot/master ?
Thanks, Masahiro
2015-07-07 6:30 GMT+09:00 Scott Wood scottwood@freescale.com:
On Wed, 2015-07-01 at 21:35 +0900, Masahiro Yamada wrote:
Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000 NAND read: Offset exceeds device limit => nand erase 100000 100000 NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
drivers/mtd/mtd_uboot.c | 5 +++-- include/linux/mtd/mtd.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
Acked-by: Scott Wood scottwood@freescale.com
I'm assuming this patch will be merged via whatever tree merged the breakage...
-Scott
U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot

On Wed, Jul 01, 2015 at 09:35:49PM +0900, Masahiro Yamada wrote:
Since commit 09c3280754f8 (mtd, nand: Move common functions from cmd_nand.c to common place), NAND commands would not work at all on large devices.
=> nand read 80000000 10000 10000 NAND read: Offset exceeds device limit => nand erase 100000 100000 NAND erase: Offset exceeds device limit
The type of the "size" of "struct mtd_info" is uint64_t, while mtd_arg_off_size() and mtd_arg_off() treat chipsize as int type. The chipsize is wrapped around if the argument is given with 2GB or larger.
Acked-by: Heiko Schocher hs@denx.de Acked-by: Scott Wood scottwood@freescale.com Signed-off-by: Masahiro Yamada yamada.masahiro@socionext.com
Applied to u-boot/master, thanks!
participants (4)
-
Heiko Schocher
-
Masahiro Yamada
-
Scott Wood
-
Tom Rini