ipq806x: switch to full dual-boot for the nbg6817 sysupgrade support
authorStefan Lippers-Hollmann <s.l-h@gmx.de>
Thu, 18 Jan 2018 21:41:44 +0000 (22:41 +0100)
committerJohn Crispin <john@phrozen.org>
Tue, 13 Feb 2018 11:45:00 +0000 (12:45 +0100)
Instead of writing to the currently booted partition set, this
implements full dual-boot support for sysupgrade by always writing to
the other, currently inactive, partition set and toggling the dualflag
after a successful flash.

The currently active/ booted partition set is determined by parsing
/proc/cmdline for its rootfs parameter (supplied by the DTS), instead
of reading from the 0:DUAL_FLAG mtd, in order to prevent (potentially)
bricking both partition sets.

Signed-off-by: Stefan Lippers-Hollmann <s.l-h@gmx.de>
target/linux/ipq806x/base-files/lib/upgrade/zyxel.sh

index cf2acfcc174d5d08e9a50f9e5fca63a19d7fcb9b..ba8e825956fbe6f8a488ad201fffef6e25d6ffb0 100644 (file)
@@ -21,6 +21,7 @@ zyxel_do_flash() {
        local tar_file=$1
        local kernel=$2
        local rootfs=$3
+       local dualflagmtd=$4
 
        # keep sure its unbound
        losetup --detach-all || {
@@ -63,6 +64,16 @@ zyxel_do_flash() {
                umount /tmp/new_root
        }
 
+       # flashing successful, toggle the dualflag
+       case "$rootfs" in
+               "/dev/mmcblk0p5")
+                       printf "\xff" >$dualflagmtd
+                       ;;
+               "/dev/mmcblk0p8")
+                       printf "\x01" >$dualflagmtd
+                       ;;
+       esac
+
        # Cleanup
        losetup -d $loopdev >/dev/null 2>&1
        sync
@@ -79,12 +90,21 @@ zyxel_do_upgrade() {
        [ -b "${rootfs}" ] || return 1
        case "$board" in
        zyxel,nbg6817)
+               local dualflagmtd="$(find_mtd_part 0:DUAL_FLAG)"
+               [ -b $dualflagmtd ] || return 1
+
                case "$rootfs" in
                        "/dev/mmcblk0p5")
-                               kernel="/dev/mmcblk0p4"
+                               # booted from the primary partition set
+                               # write to the alternative set
+                               kernel="/dev/mmcblk0p7"
+                               rootfs="/dev/mmcblk0p8"
                        ;;
                        "/dev/mmcblk0p8")
-                               kernel="/dev/mmcblk0p7"
+                               # booted from the alternative partition set
+                               # write to the primary set
+                               kernel="/dev/mmcblk0p4"
+                               rootfs="/dev/mmcblk0p5"
                        ;;
                        *)
                                return 1
@@ -96,7 +116,7 @@ zyxel_do_upgrade() {
                ;;
        esac
 
-       zyxel_do_flash $tar_file $kernel $rootfs
+       zyxel_do_flash $tar_file $kernel $rootfs $dualflagmtd
 
        return 0
 }