- mmc_switch_part(devno, ret);
-
- blk_start = 0;
- blk_cnt = DIV_ROUND_UP(len, part_info.blksz);
-
- debug("Found partition '%s': offset=%08x size=%08lx\n",
- part, blk_start, part_info.size);
- if (part_info.size < blk_cnt)
- blk_cnt = part_info.size;
-
- debug("Reading %u blks from MMC partition '%s' offset %u to %p\n",
- blk_cnt, part, blk_start, addr);
- ret = mmc->block_dev.block_read(devno, blk_start, blk_cnt, addr);
- if (ret == 0) {
- printf("Failed to read MMC partition %s\n", part);
- ret = -EIO;
+
+ blk_cnt = DIV_ROUND_UP(len, mmc->read_bl_len);
+
+ partnum = karo_mmc_find_part(mmc, part, devno, &part_info);
+ if (partnum > 0) {
+ if (part_info.start + blk_cnt < part_info.start) {
+ printf("%s: given length 0x%08x exceeds size of partition\n",
+ __func__, len);
+ return -EINVAL;
+ }
+ if (part_info.start + blk_cnt > mmc->block_dev.lba)
+ blk_cnt = mmc->block_dev.lba - part_info.start;
+
+ mmc_switch_part(devno, partnum);
+
+ memset(addr, 0xee, len);
+
+ debug("Reading 0x"LBAF" blks from MMC partition %d offset 0x"LBAF" to %p\n",
+ blk_cnt, partnum, part_info.start, addr);
+ ret = mmc->block_dev.block_read(devno, part_info.start, blk_cnt, addr);
+ if (ret == 0) {
+ printf("Failed to read MMC partition %s\n", part);
+ ret = -EIO;
+ goto out;
+ }
+ debug("Read %u (%u) byte from partition '%s' @ offset 0x"LBAF"\n",
+ ret * mmc->read_bl_len, len, part, part_info.start);
+ } else if (partnum == 0) {
+ int len_read;
+
+ printf("Reading file %s from mmc partition %d\n", part, 0);
+ len_read = fs_read(part, (ulong)addr, 0, len);
+ if (len_read < len) {
+ printf("Read only %u of %u bytes\n", len_read, len);
+ }
+ } else {
+ ret = partnum;