diff --git a/target/linux/brcm47xx/image/Makefile b/target/linux/brcm47xx/image/Makefile
index 69a31e7554fe519449acc9a48e07835c4ad95257..f534f5f28499fa31dafbc0afe04314cb7941e3c2 100644
--- a/target/linux/brcm47xx/image/Makefile
+++ b/target/linux/brcm47xx/image/Makefile
@@ -56,7 +56,7 @@ define trxalign/jffs2-64k
 -a 0x10000 -f $(KDIR)/root.$(1)
 endef
 define trxalign/squashfs
--a 1024 -f $(KDIR)/root.$(1) $(if $(2),-f $(2)) -a 0x10000 -A $(KDIR)/fs_mark
+-a 1024 -f $(KDIR)/root.$(1) $(if $(2),-f $(2)) -a 0x10000 -F $(KDIR)/fs_mark
 endef
 
 define Image/Build/trxV2
diff --git a/tools/firmware-utils/src/trx.c b/tools/firmware-utils/src/trx.c
index 7a64cfd1a9cc58a5282fa28aac78221df7c12e41..9697ad79dcc6e6b0866b3a6be80907cc8f2dcab8 100644
--- a/tools/firmware-utils/src/trx.c
+++ b/tools/firmware-utils/src/trx.c
@@ -98,7 +98,7 @@ int main(int argc, char **argv)
 	int c, i, append = 0;
 	size_t n;
 	ssize_t n2;
-	uint32_t cur_len;
+	uint32_t cur_len, fsmark=0;
 	unsigned long maxlen = TRX_MAX_LEN;
 	struct trx_header *p;
 	char trx_version = 1;
@@ -131,6 +131,8 @@ int main(int argc, char **argv)
 					cur_len += 4;
 				}
 				break;
+			case 'F':
+				fsmark = cur_len;
 			case 'A':
 				append = 1;
 				/* fall through */
@@ -269,10 +271,10 @@ int main(int argc, char **argv)
 	}
 
 	p->crc32 = crc32buf((char *) &p->flag_version,
-						cur_len - offsetof(struct trx_header, flag_version));
+						(fsmark)?fsmark:cur_len - offsetof(struct trx_header, flag_version));
 	p->crc32 = STORE32_LE(p->crc32);
 
-	p->len = STORE32_LE(cur_len);
+	p->len = (fsmark)?fsmark:cur_len - offsetof(struct trx_header, flag_version);
 
 	/* restore TRXv2 bin-header */
 	if (trx_version == 2) {