aboutsummaryrefslogtreecommitdiffstats
path: root/package/mtd
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2010-03-28 07:16:27 +0000
committerGabor Juhos <juhosg@openwrt.org>2010-03-28 07:16:27 +0000
commit15ae56b61742ee4534ea711e8269046e5bef0d98 (patch)
tree042a1f288b90590f2d9549165432c2e01b71cf90 /package/mtd
parent74c50ba2fb6775a56c5c8df22b0e74a2d3dd196c (diff)
downloadupstream-15ae56b61742ee4534ea711e8269046e5bef0d98.tar.gz
upstream-15ae56b61742ee4534ea711e8269046e5bef0d98.tar.bz2
upstream-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
Diffstat (limited to 'package/mtd')
-rw-r--r--package/mtd/Makefile2
-rw-r--r--package/mtd/src/fis.c26
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;