From 8813edd8d9695d4e3939fdaa3c530c682f91de11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Wed, 14 Jun 2023 23:21:34 +0200 Subject: [PATCH 1/6] kernel: mtd: bcm-wfi: add cferam name support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some devices rename cferam bootloader using specific patterns and don't follow broadcom standards for renaming cferam files. This requires supporting different cferam file names. Signed-off-by: Álvaro Fernández Rojas --- .../drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c index 1ddcf6745fa..1cafc91fded 100644 --- a/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c +++ b/target/linux/generic/files/drivers/mtd/mtdsplit/mtdsplit_bcm_wfi.c @@ -31,6 +31,7 @@ #define CFERAM_NAME "cferam" #define CFERAM_NAME_LEN (sizeof(CFERAM_NAME) - 1) +#define CFERAM_NAME_MAX_LEN 32 #define KERNEL_NAME "vmlinux.lz" #define KERNEL_NAME_LEN (sizeof(KERNEL_NAME) - 1) #define OPENWRT_NAME "1-openwrt" @@ -157,17 +158,28 @@ static int parse_bcm_wfi(struct mtd_info *master, const struct mtd_partition **pparts, uint8_t *buf, loff_t off, loff_t size, bool cfe_part) { + struct device_node *mtd_node; struct mtd_partition *parts; loff_t cfe_off, kernel_off, rootfs_off; unsigned int num_parts = BCM_WFI_PARTS, cur_part = 0; + const char *cferam_name = CFERAM_NAME; + size_t cferam_name_len; int ret; + mtd_node = mtd_get_of_node(master); + if (mtd_node) + of_property_read_string(mtd_node, "brcm,cferam", &cferam_name); + + cferam_name_len = strnlen(cferam_name, CFERAM_NAME_MAX_LEN); + if (cferam_name_len > 0) + cferam_name_len--; + if (cfe_part) { num_parts++; cfe_off = off; - ret = jffs2_find_file(master, buf, CFERAM_NAME, - CFERAM_NAME_LEN, &cfe_off, + ret = jffs2_find_file(master, buf, cferam_name, + cferam_name_len, &cfe_off, size - (cfe_off - off), NULL, NULL); if (ret) return ret; From 915e914cfaa243ea36f8c7a4f0f045ec890304fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Wed, 14 Jun 2023 23:23:14 +0200 Subject: [PATCH 2/6] bmips: fix NETGEAR DGND3700v2 boot loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DGND3700v2 renames the cferam bootloader from cferam to cfeXXX, where XXX is the number of firmware upgrades performed by the bootloader. Other bcm63xx devices rename cferam.000 to cferam.XXX, but this device is special because the cferam name isn't changed on the first firmware flashing but it's changed on the subsequent ones. Therefore, we need to look for "cfe" instead of "cferam" to properly detect the cferam partition and fix the bootlop. Signed-off-by: Álvaro Fernández Rojas --- target/linux/bmips/dts/bcm6362-netgear-dgnd3700-v2.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/target/linux/bmips/dts/bcm6362-netgear-dgnd3700-v2.dts b/target/linux/bmips/dts/bcm6362-netgear-dgnd3700-v2.dts index 46bb3e8bf65..a335218be07 100644 --- a/target/linux/bmips/dts/bcm6362-netgear-dgnd3700-v2.dts +++ b/target/linux/bmips/dts/bcm6362-netgear-dgnd3700-v2.dts @@ -222,6 +222,7 @@ compatible = "brcm,wfi"; label = "wfi"; reg = <0x0004000 0x1c7c000>; + brcm,cferam = "cfe"; }; partition@1c80000 { From cdfcac6e246de9f237d1425e498db3f34ddebbaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Wed, 14 Jun 2023 23:27:29 +0200 Subject: [PATCH 3/6] bcm63xx: fix NETGEAR DGND3700v2 boot loop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The DGND3700v2 renames the cferam bootloader from cferam to cfeXXX, where XXX is the number of firmware upgrades performed by the bootloader. Other bcm63xx devices rename cferam.000 to cferam.XXX, but this device is special because the cferam name isn't changed on the first firmware flashing but it's changed on the subsequent ones. Therefore, we need to look for "cfe" instead of "cferam" to properly detect the cferam partition and fix the bootlop. Signed-off-by: Álvaro Fernández Rojas --- target/linux/bcm63xx/dts/bcm6362-netgear-dgnd3700-v2.dts | 1 + 1 file changed, 1 insertion(+) diff --git a/target/linux/bcm63xx/dts/bcm6362-netgear-dgnd3700-v2.dts b/target/linux/bcm63xx/dts/bcm6362-netgear-dgnd3700-v2.dts index 50133265f7e..4bef5908e03 100644 --- a/target/linux/bcm63xx/dts/bcm6362-netgear-dgnd3700-v2.dts +++ b/target/linux/bcm63xx/dts/bcm6362-netgear-dgnd3700-v2.dts @@ -167,6 +167,7 @@ compatible = "brcm,wfi"; label = "wfi"; reg = <0x0004000 0x1c7c000>; + brcm,cferam = "cfe"; }; partition@1c80000 { From 434df8df549a4d709be9eb19c0d2bd8abb4d4881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 15 Jun 2023 10:46:10 +0200 Subject: [PATCH 4/6] base-files: upgrade: nand: add JFFS2 cleanmarkers support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some Broadcom MIPS devices require JFFS2 cleanmarkers to be present on the kernel partition or the bootloader will identify the partition as corrupt and won't boot the kernel. Signed-off-by: Álvaro Fernández Rojas --- package/base-files/files/lib/upgrade/nand.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/package/base-files/files/lib/upgrade/nand.sh b/package/base-files/files/lib/upgrade/nand.sh index fa29d575a81..d910bf17915 100644 --- a/package/base-files/files/lib/upgrade/nand.sh +++ b/package/base-files/files/lib/upgrade/nand.sh @@ -301,6 +301,7 @@ nand_upgrade_fit() { nand_upgrade_tar() { local tar_file="$1" local gz="$2" + local jffs2_markers="${CI_JFFS2_CLEAN_MARKERS:-0}" # WARNING: This fails if tar contains more than one 'sysupgrade-*' directory. local board_dir="$(tar t${gz}f "$tar_file" | grep -m 1 '^sysupgrade-.*/$')" @@ -329,6 +330,7 @@ nand_upgrade_tar() { ubi_kernel_length="$kernel_length" fi fi + local has_env=0 nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "$ubi_kernel_length" "$has_env" || return 1 @@ -340,8 +342,14 @@ nand_upgrade_tar() { fi if [ "$kernel_length" ]; then if [ "$kernel_mtd" ]; then - tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ - mtd write - "$CI_KERNPART" + if [ "$jffs2_markers" = 1 ]; then + flash_erase -j "/dev/mtd${kernel_mtd}" 0 0 + tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ + nandwrite "/dev/mtd${kernel_mtd}" - + else + tar xO${gz}f "$tar_file" "$board_dir/kernel" | \ + mtd write - "$CI_KERNPART" + fi else local ubidev="$( nand_find_ubi "${CI_KERN_UBIPART:-$CI_UBIPART}" )" local kern_ubivol="$( nand_find_volume $ubidev "$CI_KERNPART" )" From 464dfac049daecad145184f8c2dd4a46a7fdd37c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 15 Jun 2023 10:48:25 +0200 Subject: [PATCH 5/6] bmips: switch to standard nand_do_upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that JFFS2 cleanmarkers are supported on the standard nand_do_upgrade function we can start using it on bmips. Signed-off-by: Álvaro Fernández Rojas --- .../base-files/lib/upgrade/cfe-jffs2-nand.sh | 37 ------------------- .../base-files/lib/upgrade/platform.sh | 5 +-- .../base-files/lib/upgrade/platform.sh | 2 - .../base-files/lib/upgrade/platform.sh | 5 +-- 4 files changed, 4 insertions(+), 45 deletions(-) delete mode 100644 target/linux/bmips/base-files/lib/upgrade/cfe-jffs2-nand.sh diff --git a/target/linux/bmips/base-files/lib/upgrade/cfe-jffs2-nand.sh b/target/linux/bmips/base-files/lib/upgrade/cfe-jffs2-nand.sh deleted file mode 100644 index 64b8df652b9..00000000000 --- a/target/linux/bmips/base-files/lib/upgrade/cfe-jffs2-nand.sh +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later - -cfe_jffs2_nand_upgrade() { - local tar_file="$1" - local kernel_mtd="$(find_mtd_index $CI_KERNPART)" - - if [ -z "$kernel_mtd" ]; then - echo "$CI_KERNPART partition not found" - return 1 - fi - - local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') - board_dir=${board_dir%/} - - local kernel_length=$(tar xf $tar_file ${board_dir}/kernel -O | wc -c 2> /dev/null) - local rootfs_length=$(tar xf $tar_file ${board_dir}/root -O | wc -c 2> /dev/null) - - if [ "$kernel_length" = 0 ]; then - echo "kernel cannot be empty" - return 1 - fi - - flash_erase -j /dev/mtd${kernel_mtd} 0 0 - tar xf $tar_file ${board_dir}/kernel -O | nandwrite /dev/mtd${kernel_mtd} - - - local rootfs_type="$(identify_tar "$tar_file" ${board_dir}/root)" - - nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "0" "0" - - local ubidev="$( nand_find_ubi "$CI_UBIPART" )" - - local root_ubivol="$(nand_find_volume $ubidev $CI_ROOTPART)" - tar xf $tar_file ${board_dir}/root -O | \ - ubiupdatevol /dev/$root_ubivol -s $rootfs_length - - - nand_do_upgrade_success -} diff --git a/target/linux/bmips/bcm63268/base-files/lib/upgrade/platform.sh b/target/linux/bmips/bcm63268/base-files/lib/upgrade/platform.sh index 0aaf10442bb..befffd346e1 100644 --- a/target/linux/bmips/bcm63268/base-files/lib/upgrade/platform.sh +++ b/target/linux/bmips/bcm63268/base-files/lib/upgrade/platform.sh @@ -1,7 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -. /lib/upgrade/cfe-jffs2-nand.sh - PART_NAME=firmware REQUIRE_IMAGE_METADATA=1 @@ -12,7 +10,8 @@ platform_check_image() { platform_do_upgrade() { case "$(board_name)" in comtrend,vr-3032u) - cfe_jffs2_nand_upgrade "$1" + CI_JFFS2_CLEAN_MARKERS=1 + nand_do_upgrade "$1" ;; sercomm,h500-s-lowi |\ sercomm,h500-s-vfes |\ diff --git a/target/linux/bmips/bcm6328/base-files/lib/upgrade/platform.sh b/target/linux/bmips/bcm6328/base-files/lib/upgrade/platform.sh index eb1d7fd0e5b..1cf95be26a5 100644 --- a/target/linux/bmips/bcm6328/base-files/lib/upgrade/platform.sh +++ b/target/linux/bmips/bcm6328/base-files/lib/upgrade/platform.sh @@ -1,7 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -. /lib/upgrade/cfe-jffs2-nand.sh - PART_NAME=firmware REQUIRE_IMAGE_METADATA=1 diff --git a/target/linux/bmips/bcm6362/base-files/lib/upgrade/platform.sh b/target/linux/bmips/bcm6362/base-files/lib/upgrade/platform.sh index 9175cf4255e..ded966e4cca 100644 --- a/target/linux/bmips/bcm6362/base-files/lib/upgrade/platform.sh +++ b/target/linux/bmips/bcm6362/base-files/lib/upgrade/platform.sh @@ -1,7 +1,5 @@ # SPDX-License-Identifier: GPL-2.0-or-later -. /lib/upgrade/cfe-jffs2-nand.sh - PART_NAME=firmware REQUIRE_IMAGE_METADATA=1 @@ -13,7 +11,8 @@ platform_do_upgrade() { case "$(board_name)" in huawei,hg253s-v2 |\ netgear,dgnd3700-v2) - cfe_jffs2_nand_upgrade "$1" + CI_JFFS2_CLEAN_MARKERS=1 + nand_do_upgrade "$1" ;; *) default_do_upgrade "$1" From 60fc3bc9487cbda7092e1b926467b07ea041bc60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Fern=C3=A1ndez=20Rojas?= Date: Thu, 15 Jun 2023 10:53:08 +0200 Subject: [PATCH 6/6] bcm63xx: switch to standard nand_do_upgrade MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that JFFS2 cleanmarkers are supported on the standard nand_do_upgrade function we can start using it on bcm63xx. Signed-off-by: Álvaro Fernández Rojas --- .../base-files/lib/upgrade/platform.sh | 39 +------------------ 1 file changed, 2 insertions(+), 37 deletions(-) diff --git a/target/linux/bcm63xx/base-files/lib/upgrade/platform.sh b/target/linux/bcm63xx/base-files/lib/upgrade/platform.sh index 0d836729ee6..620e0ab4f42 100644 --- a/target/linux/bcm63xx/base-files/lib/upgrade/platform.sh +++ b/target/linux/bcm63xx/base-files/lib/upgrade/platform.sh @@ -29,42 +29,6 @@ platform_check_image() { esac } -cfe_jffs2_upgrade_tar() { - local tar_file="$1" - local kernel_mtd="$(find_mtd_index $CI_KERNPART)" - - if [ -z "$kernel_mtd" ]; then - echo "$CI_KERNPART partition not found" - return 1 - fi - - local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$') - board_dir=${board_dir%/} - - local kernel_length=$(tar xf $tar_file ${board_dir}/kernel -O | wc -c 2> /dev/null) - local rootfs_length=$(tar xf $tar_file ${board_dir}/root -O | wc -c 2> /dev/null) - - if [ "$kernel_length" = 0 ]; then - echo "kernel cannot be empty" - return 1 - fi - - flash_erase -j /dev/mtd${kernel_mtd} 0 0 - tar xf $tar_file ${board_dir}/kernel -O | nandwrite /dev/mtd${kernel_mtd} - - - local rootfs_type="$(identify_tar "$tar_file" ${board_dir}/root)" - - nand_upgrade_prepare_ubi "$rootfs_length" "$rootfs_type" "0" "0" - - local ubidev="$( nand_find_ubi "$CI_UBIPART" )" - - local root_ubivol="$(nand_find_volume $ubidev $CI_ROOTPART)" - tar xf $tar_file ${board_dir}/root -O | \ - ubiupdatevol /dev/$root_ubivol -s $rootfs_length - - - nand_do_upgrade_success -} - platform_do_upgrade() { case "$(board_name)" in comtrend,vg-8050|\ @@ -72,7 +36,8 @@ platform_do_upgrade() { huawei,hg253s-v2|\ netgear,dgnd3700-v2) REQUIRE_IMAGE_METADATA=1 - cfe_jffs2_upgrade_tar "$1" + CI_JFFS2_CLEAN_MARKERS=1 + nand_do_upgrade "$1" ;; sercomm,ad1018|\ sercomm,h500-s-lowi|\