+/*
+ * FIS table updating code for mtd
+ *
+ * Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License v2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
#include <sys/mman.h>
#include <stdint.h>
#include <stdlib.h>
desc = fis_open();
if (!desc)
- return 0;
+ return -1;
for (i = 0; i < n_new - 1; i++) {
if (!new[i].size) {
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();
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))
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;
}
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;