ipq40xx: Fix Linksys upgrade, restore config step
[openwrt/staging/dedeckeh.git] / target / linux / ipq40xx / base-files / lib / upgrade / linksys.sh
old mode 100755 (executable)
new mode 100644 (file)
index b8e6dd7..696f653
@@ -1,11 +1,10 @@
 linksys_get_target_firmware() {
-
        local cur_boot_part mtd_ubi0
 
-       cur_boot_part=$(/usr/sbin/fw_printenv -n boot_part)
-       if [ -z "${cur_boot_part}" ] ; then
-               mtd_ubi0=$(cat /sys/devices/virtual/ubi/ubi0/mtd_num)
-               case $(egrep "^mtd${mtd_ubi0}:" /proc/mtd | cut -d '"' -f 2) in
+       cur_boot_part="$(/usr/sbin/fw_printenv -n boot_part)"
+       if [ -z "${cur_boot_part}" ]; then
+               mtd_ubi0=$(cat /sys/class/ubi/ubi0/mtd_num)
+               case "$(grep -E "^mtd${mtd_ubi0}:" /proc/mtd | cut -d '"' -f 2)" in
                kernel|rootfs)
                        cur_boot_part=1
                        ;;
@@ -17,7 +16,7 @@ linksys_get_target_firmware() {
                        "${cur_boot_part}" "${mtd_ubi0}"
        fi
 
-       # OEM U-Boot for EA6350v3 and EA8300; bootcmd=
+       # OEM U-Boot for EA6350v3, EA8300 and MR8300; bootcmd=
        #  if test $auto_recovery = no;
        #      then bootipq;
        #  elif test $boot_part = 1;
@@ -25,7 +24,7 @@ linksys_get_target_firmware() {
        #      else run bootpart2;
        #  fi
 
-       case $cur_boot_part in
+       case "$cur_boot_part" in
        1)
                fw_setenv -s - <<-EOF
                        boot_part 2
@@ -48,23 +47,30 @@ linksys_get_target_firmware() {
        esac
 }
 
-linksys_get_root_magic() {
-       (get_image "$@" | dd skip=786432 bs=4 count=1 | hexdump -v -n 4 -e '1/1 "%02x"') 2>/dev/null
+linksys_is_factory_image() {
+       local board=$(board_name)
+       board=${board##*,}
+
+       # check matching footer signature
+       tail -c 256 $1 | grep -q -i "\.LINKSYS\.........${board}"
 }
 
 platform_do_upgrade_linksys() {
        local magic_long="$(get_magic_long "$1")"
 
+       local rm_oem_fw_vols="squashfs ubifs"   # from OEM [alt_]rootfs UBI
+       local vol
+
        mkdir -p /var/lock
        local part_label="$(linksys_get_target_firmware)"
        touch /var/lock/fw_printenv.lock
 
-       if [ ! -n "$part_label" ]; then
+       if [ -z "$part_label" ]; then
                echo "cannot find target partition"
                exit 1
        fi
 
-       local target_mtd=$(find_mtd_part $part_label)
+       local target_mtd=$(find_mtd_part "$part_label")
 
        [ "$magic_long" = "73797375" ] && {
                CI_KERNPART="$part_label"
@@ -74,47 +80,46 @@ platform_do_upgrade_linksys() {
                        CI_UBIPART="alt_rootfs"
                fi
 
-               # remove "squashfs" vol (in case we are flashing over a stock image, which is also UBI)
-
-               local mtdnum="$( find_mtd_index "$CI_UBIPART" )"
+               local mtdnum="$(find_mtd_index "$CI_UBIPART")"
                if [ ! "$mtdnum" ]; then
                        echo "cannot find ubi mtd partition $CI_UBIPART"
                        return 1
                fi
 
-               local ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+               local ubidev="$(nand_find_ubi "$CI_UBIPART")"
                if [ ! "$ubidev" ]; then
                        ubiattach -m "$mtdnum"
                        sync
-                       ubidev="$( nand_find_ubi "$CI_UBIPART" )"
+                       ubidev="$(nand_find_ubi "$CI_UBIPART")"
                fi
 
                if [ "$ubidev" ]; then
-                       local squash_ubivol="$( nand_find_volume $ubidev squashfs )"
-                       # kill volume
-                       [ "$squash_ubivol" ] && ubirmvol /dev/$ubidev -N squashfs || true
+                       for vol in $rm_oem_fw_vols; do
+                               ubirmvol "/dev/$ubidev" -N "$vol" 2>/dev/null
+                       done
                fi
 
                # complete std upgrade
-               nand_upgrade_tar "$1"
+               if nand_upgrade_tar "$1" ; then
+                       nand_do_upgrade_success
+               else
+                       nand_do_upgrade_failure
+               fi
+
        }
+
        [ "$magic_long" = "27051956" ] && {
-               # This magic is for a uImage (which is a sysupgrade image)
-               # check firmwares' rootfs types
-               local oldroot="$(linksys_get_root_magic $target_mtd)"
-               local newroot="$(linksys_get_root_magic "$1")"
-
-               if [ "$newroot" = "55424923" -a "$oldroot" = "55424923" ]; then
-                       # we're upgrading from a firmware with UBI to one with UBI
-                       # erase everything to be safe
-                       # - Is that really needed? Won't remove (or comment) the if, because it may be needed in a future device.
-                       #mtd erase $part_label
-                       #get_image "$1" | mtd -n write - $part_label
-                       echo "writing \"$1\" UBI image to \"$part_label\" (UBI)..."
-                       get_image "$1" | mtd write - $part_label
-               else
-                       echo "writing \"$1\" image to \"$part_label\""
-                       get_image "$1" | mtd write - $part_label
+               echo "writing \"$1\" image to \"$part_label\""
+               get_image "$1" | mtd write - "$part_label"
+       }
+
+       [ "$magic_long" = "d00dfeed" ] && {
+               if ! linksys_is_factory_image "$1"; then
+                       echo "factory image doesn't match device"
+                       return 1
                fi
+
+               echo "writing \"$1\" factory image to \"$part_label\""
+               get_image "$1" | mtd -e "$part_label" write - "$part_label"
        }
 }