Browse Source

mtd: Added trx_fixup for brcm63xx imagetag, and made references to fix_trx use the weak reference rather than the brcm47xx ifdef. This fixes a bug in which sysupgrade failed due to changing bad CRC on reboot.

Signed-off-by: Daniel Dickinson <[email protected]>

SVN-Revision: 24837
Daniel Dickinson 15 years ago
parent
commit
b3bcc483b2
2 changed files with 77 additions and 6 deletions
  1. 71 0
      package/mtd/src/imagetag.c
  2. 6 6
      package/mtd/src/jffs2.c

+ 71 - 0
package/mtd/src/imagetag.c

@@ -77,6 +77,77 @@ uint32_t compute_crc32(uint32_t crc, off_t start, size_t compute_len, int fd)
 	return crc;
 	return crc;
 }
 }
 
 
+int
+trx_fixup(int fd, const char *name)
+{
+	struct mtd_info_user mtdInfo;
+	unsigned long len;
+	void *ptr, *scan;
+	int bfd;
+	struct bcm_tag *tag;
+	ssize_t res;
+	uint32_t cfelen, imagelen, imagestart, rootfslen;
+	uint32_t imagecrc, rootfscrc, headercrc;
+	uint32_t offset = 0;
+	cfelen = imagelen = imagestart = imagecrc = rootfscrc = headercrc = rootfslen = 0;
+
+
+	if (ioctl(fd, MEMGETINFO, &mtdInfo) < 0) {
+		fprintf(stderr, "Failed to get mtd info\n");
+		goto err;
+	}
+
+	len = mtdInfo.size;
+	if (mtdInfo.size <= 0) {
+		fprintf(stderr, "Invalid MTD device size\n");
+		goto err;
+	}
+
+	bfd = mtd_open(name, true);
+	ptr = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, bfd, 0);
+	if (!ptr || (ptr == (void *) -1)) {
+		perror("mmap");
+		goto err1;
+	}
+
+	tag = (struct bcm_tag *) (ptr);
+
+	cfelen = strntoul(&tag->cfeLength[0], NULL, 10, IMAGE_LEN);
+	if (cfelen) {
+	  fprintf(stderr, "Non-zero CFE length.  This is currently unsupported.\n");
+	  exit(1);
+	}
+
+	headercrc = compute_crc32(CRC_START, offset, offsetof(struct bcm_tag, headerCRC), fd);
+	if (headercrc != *(uint32_t *)(&tag->headerCRC[0])) {
+		fprintf(stderr, "Tag verify failed.  This may not be a valid image.\n");
+		exit(1);
+	}
+
+	sprintf(&tag->rootLength[0], "%lu", 0);
+	strncpy(&tag->totalLength[0], &tag->kernelLength[0], IMAGE_LEN);
+
+	imagestart = sizeof(tag);
+	memcpy(&tag->imageCRC[0], &tag->kernelCRC[0], CRC_LEN);
+	memcpy(&tag->fskernelCRC[0], &tag->kernelCRC[0], CRC_LEN);
+	rootfscrc = CRC_START;
+	memcpy(&tag->rootfsCRC[0], &rootfscrc, sizeof(uint32_t));
+	headercrc = crc32(CRC_START, tag, offsetof(struct bcm_tag, headerCRC));
+	memcpy(&tag->headerCRC[0], &headercrc, sizeof(uint32_t));
+
+	msync(ptr, sizeof(struct bcm_tag), MS_SYNC|MS_INVALIDATE);
+	munmap(ptr, len);
+	close(bfd);
+	return 0;
+
+err1:
+	close(bfd);
+err:
+	fprintf(stderr, "Error fixing up imagetag header\n");
+	return -1;
+}
+
+
 int
 int
 trx_check(int imagefd, const char *mtd, char *buf, int *len)
 trx_check(int imagefd, const char *mtd, char *buf, int *len)
 {
 {

+ 6 - 6
package/mtd/src/jffs2.c

@@ -244,9 +244,9 @@ int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename)
 	pad(erasesize);
 	pad(erasesize);
 	free(buf);
 	free(buf);
 
 
-#ifdef target_brcm
-	trx_fixup(outfd, mtd);
-#endif
+	if (trx_fixup) {
+	  trx_fixup(outfd, mtd);
+	}
 	return (mtdofs - ofs);
 	return (mtdofs - ofs);
 }
 }
 
 
@@ -347,9 +347,9 @@ int mtd_write_jffs2(const char *mtd, const char *filename, const char *dir)
 
 
 	err = 0;
 	err = 0;
 
 
-#ifdef target_brcm
-	trx_fixup(outfd, mtd);
-#endif
+	if (trx_fixup) {
+	  trx_fixup(outfd, mtd);
+	}
 
 
 done:
 done:
 	close(outfd);
 	close(outfd);