]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge branch 'tx28-bugfix'
authorLothar Waßmann <LW@KARO-electronics.de>
Mon, 4 Jul 2016 12:49:42 +0000 (14:49 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Mon, 4 Jul 2016 12:49:42 +0000 (14:49 +0200)
board/karo/common/mmc.c
common/cmd_gpio.c
common/cmd_misc.c
common/cmd_mtdparts.c
fs/fs.c

index 0048bfb4af02b9bec562ad14e54c5695cee97fe3..6143e1575649dac9f7af379a836ed0ea4c4340e8 100644 (file)
@@ -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;
index 58d8125f84dac75a7ea0db3099c04d838ea9064d..93c53a867cba3786ce9e842160fd727fbd6befe8 100644 (file)
@@ -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] [<bank> | <pin>]  - show [all/claimed] GPIOs"
+#else
+#define gpio_status_help_msg ""
+#endif
+
 U_BOOT_CMD(gpio, 4, 0, do_gpio,
           "query and control gpio pins",
           "<input|set|clear|toggle> <pin>\n"
           "    - input/set/clear/toggle the specified pin\n"
-          "gpio status [-a] [<bank> | <pin>]  - show [all/claimed] GPIOs");
+          gpio_status_help_msg);
index 93f9eabd6b547e1cfa30bbdfb5c6872aa015c626..41bb860a0f9ab89dad459be808a989dbbbcd96fc 100644 (file)
@@ -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(
index 3e34558acfd1a38ec4527e2618cf9db9ea7271fd..33096c05b27942935dd5dc7d4d2ab1d594f145cd 100644 (file)
@@ -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 <mtd-dev> <size>[@<offset>] <name> [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 827b143e85e5538f9a250565ce2a54b0455fdab8..0299c4b138760abc027139083fb1048f8aac28c9 100644 (file)
--- 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;