Files
eternalwrt-mt798x/target/linux/qualcommax/ipq60xx/base-files/lib/upgrade/platform.sh
T
Rosen PenevandRobert Marko de96f66acf ipq60xx: linksys: add partition selection
Instead of upgrading both kernels, allow support for selecting the
partition during sysupgrade.

Copy/Paste of Linux MX devices on the same target.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22594
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-01 14:20:20 +02:00

260 lines
6.6 KiB
Bash

. /lib/functions/bootconfig.sh
PART_NAME=firmware
REQUIRE_IMAGE_METADATA=1
RAMFS_COPY_BIN='fw_printenv fw_setenv head seq'
RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock'
remove_oem_ubi_volume() {
local oem_volume_name="$1"
local oem_ubivol
local mtdnum
local ubidev
mtdnum=$(find_mtd_index "$CI_UBIPART")
if [ ! "$mtdnum" ]; then
return
fi
ubidev=$(nand_find_ubi "$CI_UBIPART")
if [ ! "$ubidev" ]; then
ubiattach --mtdn="$mtdnum"
ubidev=$(nand_find_ubi "$CI_UBIPART")
fi
if [ "$ubidev" ]; then
oem_ubivol=$(nand_find_volume "$ubidev" "$oem_volume_name")
[ "$oem_ubivol" ] && ubirmvol "/dev/$ubidev" --name="$oem_volume_name"
fi
}
qihoo_bootconfig_toggle_rootfs() {
local partname=$1
local tempfile
local mtdidx
mtdidx=$(find_mtd_index "$partname")
[ ! "$mtdidx" ] && {
echo "cannot find mtd index for $partname"
return 1
}
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
}
toggle_bootconfig_primaryboot "$tempfile" "rootfs"
[ $? -ne 0 ] && {
echo "failed to toggle primaryboot for rootfs partition"
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
}
# Update bootconfig1 if exists
local mtdidx1=$(find_mtd_index "${partname}1")
[ -n "$mtdidx1" ] && mtd write "$tempfile" /dev/mtd"$mtdidx1" 2>/dev/null
return 0
}
tplink_get_boot_part() {
local cur_boot_part
local args
# Try to find rootfs from kernel arguments
read -r args < /proc/cmdline
for arg in $args; do
local ubi_mtd_arg=${arg#ubi.mtd=}
case "$ubi_mtd_arg" in
rootfs|rootfs_1)
echo "$ubi_mtd_arg"
return
;;
esac
done
# Fallback to u-boot env (e.g. when running initramfs)
cur_boot_part="$(/usr/sbin/fw_printenv -n tp_boot_idx)"
case $cur_boot_part in
1)
echo rootfs_1
;;
0|*)
echo rootfs
;;
esac
}
tplink_do_upgrade() {
local new_boot_part
case $(tplink_get_boot_part) in
rootfs)
CI_UBIPART="rootfs_1"
new_boot_part=1
;;
rootfs_1)
CI_UBIPART="rootfs"
new_boot_part=0
;;
esac
fw_setenv -s - <<-EOF
tp_boot_idx $new_boot_part
EOF
remove_oem_ubi_volume ubi_rootfs
nand_do_upgrade "$1"
}
linksys_mr_pre_upgrade() {
local setenv_script="/tmp/fw_env_upgrade"
CI_UBIPART="rootfs"
boot_part="$(fw_printenv -n boot_part)"
if [ -n "$UPGRADE_OPT_USE_CURR_PART" ]; then
if [ "$boot_part" -eq "2" ]; then
CI_KERNPART="alt_kernel"
CI_UBIPART="alt_rootfs"
fi
else
if [ "$boot_part" -eq "1" ]; then
echo "boot_part 2" >> $setenv_script
CI_KERNPART="alt_kernel"
CI_UBIPART="alt_rootfs"
else
echo "boot_part 1" >> $setenv_script
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
}
platform_check_image() {
return 0;
}
yuncore_fap650_env_setup() {
local ubifile=$(board_name)
local active=$(fw_printenv -n owrt_slotactive)
[ -z "$active" ] && active=$(hexdump -s 0x94 -n 4 -e '4 "%d"' /dev/mtd$(find_mtd_index 0:bootconfig))
cat > /tmp/env_tmp << EOF
owrt_slotactive=${active}
owrt_bootcount=0
bootfile=${ubifile}.ubi
owrt_bootcountcheck=if test \$owrt_bootcount > 4; then run owrt_tftprecover; fi; if test \$owrt_bootcount = 3; then run owrt_slotswap; else echo bootcountcheck successfull; fi
owrt_bootinc=if test \$owrt_bootcount < 5; then echo save env part; setexpr owrt_bootcount \${owrt_bootcount} + 1 && saveenv; else echo save env skipped; fi; echo current bootcount: \$owrt_bootcount
bootcmd=run owrt_bootinc && run owrt_bootcountcheck && run owrt_slotselect && run owrt_bootlinux
owrt_bootlinux=echo booting linux... && ubi part fs && ubi read 0x44000000 kernel && bootm; reset
owrt_setslot0=setenv bootargs console=ttyMSM0,115200n8 ubi.mtd=rootfs root=mtd:rootfs rootfstype=squashfs rootwait swiotlb=1 && setenv mtdparts mtdparts=nand0:0x3c00000@0(fs)
owrt_setslot1=setenv bootargs console=ttyMSM0,115200n8 ubi.mtd=rootfs_1 root=mtd:rootfs rootfstype=squashfs rootwait swiotlb=1 && setenv mtdparts mtdparts=nand0:0x3c00000@0x3c00000(fs)
owrt_slotswap=setexpr owrt_slotactive 1 - \${owrt_slotactive} && saveenv && echo slot swapped. new active slot: \$owrt_slotactive
owrt_slotselect=setenv mtdids nand0=nand0,nand1=spi0.0; if test \$owrt_slotactive = 0; then run owrt_setslot0; else run owrt_setslot1; fi
owrt_tftprecover=echo trying to recover firmware with tftp... && sleep 10 && dhcp && flash rootfs && flash rootfs_1 && setenv owrt_bootcount 0 && setenv owrt_slotactive 0 && saveenv && reset
owrt_env_ver=7
EOF
fw_setenv --script /tmp/env_tmp
}
platform_do_upgrade() {
case "$(board_name)" in
alfa-network,ap120c-ax)
CI_UBIPART="rootfs_1"
alfa_bootconfig_rootfs_rotate "0:BOOTCONFIG" "148"
nand_do_upgrade "$1"
;;
cambiumnetworks,xe3-4)
fw_setenv bootcount 0
nand_do_upgrade "$1"
;;
glinet,gl-ax1800|\
glinet,gl-axt1800|\
netgear,rbr350|\
netgear,rbs350|\
netgear,wax214)
nand_do_upgrade "$1"
;;
qihoo,360v6)
CI_UBIPART="rootfs_1"
qihoo_bootconfig_toggle_rootfs "0:bootconfig"
remove_oem_ubi_volume wifi_fw
remove_oem_ubi_volume ubi_rootfs
nand_do_upgrade "$1"
;;
jdcloud,re-cs-02|\
jdcloud,re-cs-07|\
jdcloud,re-ss-01|\
link,nn6000-v1|\
link,nn6000-v2)
local cfgpart=$(find_mmc_part "0:BOOTCONFIG")
part_num="$(hexdump -e '1/1 "%01x|"' -n 1 -s 148 -C $cfgpart | cut -f 1 -d "|" | head -n1)"
if [ "$part_num" -eq "1" ]; then
CI_KERNPART="0:HLOS_1"
CI_ROOTPART="rootfs_1"
else
CI_KERNPART="0:HLOS"
CI_ROOTPART="rootfs"
fi
emmc_do_upgrade "$1"
;;
netgear,wax610|\
netgear,wax610y)
remove_oem_ubi_volume wifi_fw
remove_oem_ubi_volume ubi_rootfs
nand_do_upgrade "$1"
;;
linksys,mr7350|\
linksys,mr7500)
linksys_mr_pre_upgrade "$1"
remove_oem_ubi_volume squashfs
nand_do_upgrade "$1"
;;
tplink,eap610-outdoor|\
tplink,eap620-hd-v3|\
tplink,eap623-outdoor-hd-v1|\
tplink,eap625-outdoor-hd-v1)
tplink_do_upgrade "$1"
;;
yuncore,fap650)
[ "$(fw_printenv -n owrt_env_ver 2>/dev/null)" != "7" ] && yuncore_fap650_env_setup
local active="$(fw_printenv -n owrt_slotactive 2>/dev/null)"
if [ "$active" = "1" ]; then
CI_UBIPART="rootfs"
else
CI_UBIPART="rootfs_1"
fi
fw_setenv owrt_bootcount 0
fw_setenv owrt_slotactive $((1 - active))
nand_do_upgrade "$1"
;;
*)
default_do_upgrade "$1"
;;
esac
}