From: Lothar Waßmann Date: Mon, 4 Jul 2016 12:49:42 +0000 (+0200) Subject: Merge branch 'tx28-bugfix' X-Git-Tag: KARO-TX-2016-07-05~3 X-Git-Url: https://git.karo-electronics.de/?p=karo-tx-uboot.git;a=commitdiff_plain;h=637b84ce3094c73f1c6c34376af93a81e18ed4bf;hp=ec116a5aff3a35eec5e958d5070f19d9c77c7e11 Merge branch 'tx28-bugfix' --- diff --git a/board/karo/common/mmc.c b/board/karo/common/mmc.c index 0048bfb4af..6143e15756 100644 --- a/board/karo/common/mmc.c +++ b/board/karo/common/mmc.c @@ -165,17 +165,15 @@ int karo_load_mmc_part(const char *part, void *addr, size_t len) } else if (partnum == 0) { loff_t len_read; - debug("Reading file %s from mmc partition %d\n", part, - partnum); + debug("Trying to read (%u) byte from file '%s' in mmc partition %d\n", + len, part, partnum); ret = fs_read(part, (ulong)addr, 0, len, &len_read); if (ret < 0) { - printf("Failed to read %u byte from mmc partition %d\n", - len, partnum); + printf("Failed to read %u byte from %s in mmc partition %d; err: %d\n", + len, part, partnum, ret); goto out; } - if (len_read < len) { - printf("Read only %llu of %u bytes\n", (u64)len_read, len); - } + debug("Read %llu bytes from %s\n", len_read, part); } else { ret = partnum; goto out; diff --git a/common/cmd_gpio.c b/common/cmd_gpio.c index 58d8125f84..93c53a867c 100644 --- a/common/cmd_gpio.c +++ b/common/cmd_gpio.c @@ -211,8 +211,14 @@ static int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return (ret && ret != -EBUSY) ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } +#ifdef gpio_status +#define gpio_status_help_msg "gpio status [-a] [ | ] - show [all/claimed] GPIOs" +#else +#define gpio_status_help_msg "" +#endif + U_BOOT_CMD(gpio, 4, 0, do_gpio, "query and control gpio pins", " \n" " - input/set/clear/toggle the specified pin\n" - "gpio status [-a] [ | ] - show [all/claimed] GPIOs"); + gpio_status_help_msg); diff --git a/common/cmd_misc.c b/common/cmd_misc.c index 93f9eabd6b..41bb860a0f 100644 --- a/common/cmd_misc.c +++ b/common/cmd_misc.c @@ -23,12 +23,12 @@ static int do_sleep(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) while (get_timer(start) < delay) { if (ctrlc()) - return (-1); + return CMD_RET_FAILURE; udelay(100); } - return 0; + return CMD_RET_SUCCESS; } U_BOOT_CMD( diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c index 3e34558acf..33096c05b2 100644 --- a/common/cmd_mtdparts.c +++ b/common/cmd_mtdparts.c @@ -1233,6 +1233,18 @@ static uint64_t net_part_size(struct mtd_info *mtd, struct part_info *part) } #endif +static void show_ecc_stats(struct mtd_device *dev) +{ + struct mtd_info *mtd; + + if (get_mtd_info(dev->id->type, dev->id->num, &mtd)) + return; + + printf("ECC stats for device %s:\n", mtd->name); + printf(" corrected bit flips:\t%4u\n", mtd->ecc_stats.corrected); + printf(" uncorrectable errors:\t%4u\n", mtd->ecc_stats.failed); +} + static void print_partition_table(void) { struct list_head *dentry, *pentry; @@ -1280,6 +1292,7 @@ static void print_partition_table(void) #endif /* defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES) */ part_num++; } + show_ecc_stats(dev); } if (list_empty(&devices)) @@ -1406,17 +1419,17 @@ static int delete_partition(const char *id) part->name, part->size, part->offset); if (part_del(dev, part) != 0) - return 1; + return CMD_RET_FAILURE; if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) { printf("generated mtdparts too long, resetting to null\n"); - return 1; + return CMD_RET_FAILURE; } - return 0; + return CMD_RET_SUCCESS; } printf("partition %s not found\n", id); - return 1; + return CMD_RET_FAILURE; } #if defined(CONFIG_CMD_MTDPARTS_SPREAD) @@ -1482,7 +1495,7 @@ static int spread_partitions(void) dev = list_entry(dentry, struct mtd_device, link); if (get_mtd_info(dev->id->type, dev->id->num, &mtd)) - return 1; + return CMD_RET_FAILURE; part_num = 0; cur_offs = 0; @@ -1508,9 +1521,9 @@ static int spread_partitions(void) if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) { printf("generated mtdparts too long, resetting to null\n"); - return 1; + return CMD_RET_FAILURE; } - return 0; + return CMD_RET_SUCCESS; } #endif /* CONFIG_CMD_MTDPARTS_SPREAD */ @@ -1897,15 +1910,15 @@ static int do_chpart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) u8 pnum; if (mtdparts_init() !=0) - return 1; + return CMD_RET_FAILURE; if (argc < 2) { printf("no partition id specified\n"); - return 1; + return CMD_RET_FAILURE; } if (find_dev_and_part(argv[1], &dev, &pnum, &part) != 0) - return 1; + return CMD_RET_FAILURE; current_mtd_dev = dev; current_mtd_partnum = pnum; @@ -1914,7 +1927,7 @@ static int do_chpart(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) printf("partition changed to %s%d,%d\n", MTD_DEV_TYPE(dev->id->type), dev->id->num, pnum); - return 0; + return CMD_RET_SUCCESS; } /** @@ -1945,17 +1958,18 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, setenv("mtdparts", NULL); /* mtd_devices_init() calls current_save() */ - return mtd_devices_init(); + return mtd_devices_init() ? CMD_RET_FAILURE : + CMD_RET_SUCCESS; } } /* make sure we are in sync with env variables */ if (mtdparts_init() != 0) - return 1; + return CMD_RET_FAILURE; if (argc == 1) { list_partitions(); - return 0; + return CMD_RET_SUCCESS; } /* mtdparts add [@] [ro] */ @@ -1973,11 +1987,11 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, struct part_info *p; if (mtd_id_parse(argv[2], NULL, &type, &num) != 0) - return 1; + return CMD_RET_FAILURE; if ((id = id_find(type, num)) == NULL) { printf("no such device %s defined in mtdids variable\n", argv[2]); - return 1; + return CMD_RET_FAILURE; } len = strlen(id->mtd_id) + 1; /* 'mtd_id:' */ @@ -1988,14 +2002,14 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, if (len >= PART_ADD_DESC_MAXLEN) { printf("too long partition description\n"); - return 1; + return CMD_RET_FAILURE; } sprintf(tmpbuf, "%s:%s(%s)%s", id->mtd_id, argv[3], argv[4], argv[5] ? argv[5] : ""); debug("add tmpbuf: %s\n", tmpbuf); if ((device_parse(tmpbuf, NULL, &dev) != 0) || (!dev)) - return 1; + return CMD_RET_FAILURE; debug("+ %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type), dev->id->num, dev->id->mtd_id); @@ -2004,7 +2018,7 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, #if defined(CONFIG_CMD_MTDPARTS_SPREAD) if (get_mtd_info(dev->id->type, dev->id->num, &mtd)) - return 1; + return CMD_RET_FAILURE; if (!strcmp(&argv[1][3], ".spread")) { spread_partition(mtd, p, &next_offset); @@ -2018,15 +2032,15 @@ static int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, } else if (part_add(dev_tmp, p) != 0) { /* merge new partition with existing ones*/ device_del(dev); - return 1; + return CMD_RET_FAILURE; } if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) { printf("generated mtdparts too long, resetting to null\n"); - return 1; + return CMD_RET_FAILURE; } - return 0; + return CMD_RET_SUCCESS; } /* mtdparts del part-id */ diff --git a/fs/fs.c b/fs/fs.c index 827b143e85..0299c4b138 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -285,24 +285,30 @@ int fs_size(const char *filename, loff_t *size) return ret; } -int fs_read(const char *filename, ulong addr, loff_t offset, loff_t len, +int fs_read(const char *filename, ulong addr, loff_t offset, loff_t maxlen, loff_t *actread) { struct fstype_info *info = fs_get_info(fs_type); void *buf; int ret; + loff_t len; - /* - * We don't actually know how many bytes are being read, since len==0 - * means read the whole file. - */ + ret = info->size(filename, &len); + if (ret) { + printf("Failed to determine size of file %s: %d\n", + filename, ret); + goto err; + } + if (maxlen == 0) + maxlen = len; + else if (len > maxlen) + printf("** File %s larger than buffer size; truncating to %llu of %llu bytes\n", + filename, maxlen, len); + len = min(len, maxlen); buf = map_sysmem(addr, len); ret = info->read(filename, buf, offset, len, actread); +err: unmap_sysmem(buf); - - /* If we requested a specific number of bytes, check we got it */ - if (ret == 0 && len && *actread != len) - printf("** %s shorter than offset + len **\n", filename); fs_close(); return ret;