diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2010-03-28 07:16:27 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2010-03-28 07:16:27 +0000 |
commit | 15ae56b61742ee4534ea711e8269046e5bef0d98 (patch) | |
tree | 042a1f288b90590f2d9549165432c2e01b71cf90 | |
parent | 74c50ba2fb6775a56c5c8df22b0e74a2d3dd196c (diff) | |
download | master-187ad058-15ae56b61742ee4534ea711e8269046e5bef0d98.tar.gz master-187ad058-15ae56b61742ee4534ea711e8269046e5bef0d98.tar.bz2 master-187ad058-15ae56b61742ee4534ea711e8269046e5bef0d98.zip |
package/mtd: fix automatic partition size detection in fis_remap
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@20537 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r-- | package/mtd/Makefile | 2 | ||||
-rw-r--r-- | package/mtd/src/fis.c | 26 |
2 files changed, 20 insertions, 8 deletions
diff --git a/package/mtd/Makefile b/package/mtd/Makefile index ced26d5c6c..9438b96fdc 100644 --- a/package/mtd/Makefile +++ b/package/mtd/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mtd -PKG_RELEASE:=11 +PKG_RELEASE:=12 PKG_BUILD_DIR := $(KERNEL_BUILD_DIR)/$(PKG_NAME) STAMP_PREPARED := $(STAMP_PREPARED)_$(call confvar,CONFIG_MTD_REDBOOT_PARTS) diff --git a/package/mtd/src/fis.c b/package/mtd/src/fis.c index 3108c5a9e6..b285d24db4 100644 --- a/package/mtd/src/fis.c +++ b/package/mtd/src/fis.c @@ -146,7 +146,7 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new) struct fis_image_desc *desc; struct fis_part *part; uint32_t offset = 0, size = 0; - char *end, *tmp; + char *start, *end, *tmp; int i; desc = fis_open(); @@ -156,6 +156,7 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new) if (!quiet) fprintf(stderr, "Updating FIS table... \n"); + start = (char *) desc; end = (char *) desc + fis_erasesize; while ((char *) desc < end) { if (!desc->hdr.name[0] || (desc->hdr.name[0] == 0xff)) @@ -167,9 +168,12 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new) if (!strcmp((char *) desc->hdr.name, "RedBoot")) redboot = desc; + /* update max offset */ + if (offset < desc->hdr.flash_base) + offset = desc->hdr.flash_base; + for (i = 0; i < n_old; i++) { if (!strncmp((char *) desc->hdr.name, (char *) old[i].name, sizeof(desc->hdr.name))) { - size += desc->hdr.size; last = desc; if (!first) first = desc; @@ -180,13 +184,21 @@ fis_remap(struct fis_part *old, int n_old, struct fis_part *new, int n_new) } desc--; - if (desc == last) { - desc = fisdir; + /* determine size of available space */ + desc = (struct fis_image_desc *) start; + while ((char *) desc < end) { + if (!desc->hdr.name[0] || (desc->hdr.name[0] == 0xff)) + break; + + if (desc->hdr.flash_base > last->hdr.flash_base && + desc->hdr.flash_base < offset) + offset = desc->hdr.flash_base; + + desc++; } + desc--; - /* size fixup */ - if (desc && (last->hdr.flash_base < desc->hdr.flash_base - last->hdr.size)) - size += (desc->hdr.flash_base - last->hdr.flash_base) - last->hdr.size; + size = offset - first->hdr.flash_base; #ifdef notyet desc = first - 1; |