qualcommax: ipq50xx: upgrade SMEM dualboot Linksys devices

Add support for upgrades on dual firmware Linksys devices with the
partition table stored in SMEM and that store both the kernel and rootfs
in a single partition. Switching the active boot partition requires
updating the partition info table in SMEM in addition to setting
the active boot partition in a U-boot variable as U-boot will keep them
in sync upon reboot if they're not.

U-boot always sets the name of the active partition to rootfs and that
of the inactive partition to rootfs_1 in SMEM. when Linux loads the
partition table from SMEM it will load the right partition based on the
offset set in the SMEM partition table. For upgrades, flashing to the
alternate partition will always be to rootfs_1, while flashing the
current partition will be on rootfs.

Signed-off-by: George Moussalem <george.moussalem@outlook.com>
Link: https://github.com/openwrt/openwrt/pull/21038
Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
George Moussalem 2025-12-04 09:20:00 +04:00 committed by Robert Marko
parent d02de1d35a
commit 7d68582579

View file

@ -1,3 +1,5 @@
. /lib/functions/bootconfig.sh
PART_NAME=firmware
REQUIRE_IMAGE_METADATA=1
@ -50,6 +52,81 @@ remove_oem_ubi_volume() {
fi
}
linksys_bootconfig_set_primaryboot() {
local partname=$1
local tempfile
local mtdidx
mtdidx=$(find_mtd_index "$partname")
[ ! "$mtdidx" ] && {
echo "cannot find mtd index for $partname"
return 1
}
# No need to cleanup as files in /tmp will be removed upon reboot
tempfile=/tmp/mtd"$mtdidx".bin
dd if=/dev/mtd"$mtdidx" of="$tempfile" bs=1 count=336 2>/dev/null
[ $? -ne 0 ] || [ ! -f "$tempfile" ]&& {
echo "failed to create a temp copy of /dev/mtd$mtdidx"
return 1
}
set_bootconfig_primaryboot "$tempfile" "0:HLOS" $2
[ $? -ne 0 ] && {
echo "failed to toggle primaryboot on 0:HLOS part"
return 1
}
set_bootconfig_primaryboot "$tempfile" "rootfs" $2
[ $? -ne 0 ] && {
echo "failed to toggle primaryboot for rootfs part"
return 1
}
mtd write "$tempfile" /dev/mtd"$mtdidx" 2>/dev/null
[ $? -ne 0 ] && {
echo "failed to write temp copy back to /dev/mtd$mtdidx"
return 1
}
}
linksys_bootconfig_pre_upgrade() {
local setenv_script="/tmp/fw_env_upgrade"
CI_UBIPART="rootfs_1"
boot_part="$(fw_printenv -n boot_part)"
if [ -n "$UPGRADE_OPT_USE_CURR_PART" ]; then
CI_UBIPART="rootfs"
else
if [ "$boot_part" -eq "1" ]; then
echo "boot_part 2" >> $setenv_script
linksys_bootconfig_set_primaryboot "0:bootconfig" 1
linksys_bootconfig_set_primaryboot "0:bootconfig1" 1
else
echo "boot_part 1" >> $setenv_script
linksys_bootconfig_set_primaryboot "0:bootconfig" 0
linksys_bootconfig_set_primaryboot "0:bootconfig1" 0
fi
fi
boot_part_ready="$(fw_printenv -n boot_part_ready)"
if [ "$boot_part_ready" -ne "3" ]; then
echo "boot_part_ready 3" >> $setenv_script
fi
auto_recovery="$(fw_printenv -n auto_recovery)"
if [ "$auto_recovery" != "yes" ]; then
echo "auto_recovery yes" >> $setenv_script
fi
if [ -f "$setenv_script" ]; then
fw_setenv -s $setenv_script || {
echo "failed to update U-Boot environment"
return 1
}
fi
}
linksys_mx_pre_upgrade() {
local setenv_script="/tmp/fw_env_upgrade"