+ }
+
+ printk("Updating TRX offsets and length:\n");
+ printk("old trx = [0x%08x, 0x%08x, 0x%08x], len=0x%08x crc32=0x%08x\n", trx2->offsets[0], trx2->offsets[1], trx2->offsets[2], trx2->len, trx2->crc32);
+ printk("new trx = [0x%08x, 0x%08x, 0x%08x], len=0x%08x crc32=0x%08x\n", trx.offsets[0], trx.offsets[1], trx.offsets[2], trx.len, trx.crc32);
+
+ /* Write updated trx header to the flash */
+ memcpy(block, &trx, sizeof(trx));
+ if (mtd->unlock)
+ mtd->unlock(mtd, off, mtd->erasesize);
+ erase_write(mtd, off, mtd->erasesize, block);
+ if (mtd->sync)
+ mtd->sync(mtd);
+ kfree(block);
+ printk("Done\n");
+ }
+
+ return part->size;
+}
+
+struct mtd_partition * __init
+init_mtd_partitions(struct mtd_info *mtd, size_t size)
+{
+ int cfe_size;
+
+ if ((cfe_size = find_cfe_size(mtd,size)) < 0)
+ return NULL;
+
+ /* boot loader */
+ adm5120_cfe_parts[0].offset = 0;
+ adm5120_cfe_parts[0].size = cfe_size;
+
+ /* nvram */
+ if (cfe_size != 384 * 1024) {
+ adm5120_cfe_parts[3].offset = size - ROUNDUP(NVRAM_SPACE, mtd->erasesize);
+ adm5120_cfe_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize);
+ } else {
+ /* nvram (old 128kb config partition on netgear wgt634u) */
+ adm5120_cfe_parts[3].offset = adm5120_cfe_parts[0].size;
+ adm5120_cfe_parts[3].size = ROUNDUP(NVRAM_SPACE, mtd->erasesize);
+ }
+
+ /* linux (kernel and rootfs) */
+ if (cfe_size != 384 * 1024) {
+ adm5120_cfe_parts[1].offset = adm5120_cfe_parts[0].size;
+ adm5120_cfe_parts[1].size = adm5120_cfe_parts[3].offset -
+ adm5120_cfe_parts[1].offset;
+ } else {
+ /* do not count the elf loader, which is on one block */
+ adm5120_cfe_parts[1].offset = adm5120_cfe_parts[0].size +
+ adm5120_cfe_parts[3].size + mtd->erasesize;
+ adm5120_cfe_parts[1].size = size -
+ adm5120_cfe_parts[0].size -
+ (2*adm5120_cfe_parts[3].size) -
+ mtd->erasesize;
+ }
+
+ /* find and size rootfs */
+ if (find_root(mtd,size,&adm5120_cfe_parts[2])==0) {
+ /* entirely jffs2 */
+ adm5120_cfe_parts[4].name = NULL;
+ adm5120_cfe_parts[2].size = size - adm5120_cfe_parts[2].offset -
+ adm5120_cfe_parts[3].size;
+ } else {
+ /* legacy setup */
+ /* calculate leftover flash, and assign it to the jffs2 partition */
+ if (cfe_size != 384 * 1024) {
+ adm5120_cfe_parts[4].offset = adm5120_cfe_parts[2].offset +
+ adm5120_cfe_parts[2].size;
+ if ((adm5120_cfe_parts[4].offset % mtd->erasesize) > 0) {
+ adm5120_cfe_parts[4].offset += mtd->erasesize -
+ (adm5120_cfe_parts[4].offset % mtd->erasesize);
+ }
+ adm5120_cfe_parts[4].size = adm5120_cfe_parts[3].offset -
+ adm5120_cfe_parts[4].offset;