diff --git a/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh b/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh index 4a55ef49ea1dc10a1be039ad67f0af1f54b458f9..de77f7978e06fa831a04fc1697f394d4a91974e2 100755 --- a/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh +++ b/iopsys-brcm63xx-arm/base-files/lib/upgrade/iopsys-4-to-5-migrator.sh @@ -107,7 +107,7 @@ flush_fs_cache() { #-------------------------------------------------------------- # Raw copy of kernel in JFFS2 flash bank $1 to file $2 jffs_to_img() { - local mtd partSize eraseSize usageSize + local mtd [ -n "$1" -a -n "$2" ] || return [ $1 -ge 0 -a $1 -le 1 ] || return @@ -117,22 +117,7 @@ jffs_to_img() { [ $mtd -gt 0 ] || return [ -c "/dev/mtd${mtd}" -a -b "/dev/mtdblock${mtd}" ] || return - # Copy the mtd to a file but leave out the last empty part due - # to when we later rewrite it back there may be bad blocks. - read -t 5 -s partSize <"/sys/class/mtd/mtd${mtd}/size" - read -t 5 -s eraseSize <"/sys/class/mtd/mtd${mtd}/erasesize" - [ -n "$partSize" -a -n "$eraseSize" ] || return - [ $partSize -gt 0 -a $eraseSize -gt 0 ] || return - [ $partSize -gt $eraseSize ] || return - - usageSize=$(tr -s "\377" <"/dev/mtd${mtd}" | wc -c) || return - if [ $((usageSize + 2*eraseSize)) -gt $((partSize - 2*eraseSize)) ]; then - echo "Error, peculiar usage size of mtd${mtd}: $usageSize" >&2 - return 1 - fi - - dd if="/dev/mtd${mtd}" bs=1k count=$((usageSize + 2*erasesize)) \ - of="$2" 2>/dev/null || return + nanddump --bb=skipbad -qf "$2" "/dev/mtd${mtd}" || return return 0 } @@ -669,12 +654,13 @@ nvram_old_seqnum() { [ -n "$1" ] || return [ $1 -ge 1 -a $1 -le 3 ] || return - [ -c "/dev/mtd0ro" ] || return + [ -c "/dev/mtd0" ] || return offs=$((mtdEbSz * $1)) - dd if="/dev/mtd0ro" bs=1 skip=$((offs + 8)) \ - count=4 2>/dev/null | hexdump -ve \"0x%8.8x\" + nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \ + tee /dev/null | dd bs=1 skip=8 count=4 2>/dev/null | \ + hexdump -ve \"0x%8.8x\" # The tee is for circumventing a broken pipe. } @@ -684,25 +670,26 @@ nvram_old_seqnum() { # format at index $1 is valid. # $1 = index from 0 to 3. is_nvram_old_valid() { - local offs offsCrc crc1 crc2 + local offsEb offsSub crc1 crc2 [ -n "$1" ] || return [ $1 -ge 0 -a $1 -le 3 ] || return - [ -c "/dev/mtd0ro" ] || return + [ -c "/dev/mtd0" ] || return if [ $1 -eq 0 ]; then # nvram embedded into cferom for Broadcom ARM Gen2. - offs=$((mtdEbSz / 2 + 0x580)) - offsCrc=0 + offsEb=0 + offsSub=$((mtdEbSz / 2 + 0x580)) else - offs=$((mtdEbSz * $1)) - offsCrc=16 + offsEb=$((mtdEbSz * $1)) + offsSub=16 fi if [ $1 -ge 1 ]; then # Magic identifier? - dd if="/dev/mtd0ro" bs=1 skip=$((offs + 0)) count=6 2>/dev/null | \ - strings -n 4 | grep -qEi "^NVRAM$" || return + nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \ + tee /dev/null | dd bs=1 count=6 2>/dev/null | strings -n 4 | \ + grep -qEi "^NVRAM$" || return # The tee is for circumventing a broken pipe. # Sequence number OK? nvram_old_seqnum $1 >/dev/null || return @@ -710,12 +697,14 @@ is_nvram_old_valid() { fi # Checksum? - dd if="/dev/mtd0ro" bs=1 skip=$((offs + offsCrc)) \ - count=1020 2>/dev/null >"/tmp/iopmigr-nvram-crc" || return - head -c 4 "/dev/zero" >>"/tmp/iopmigr-nvram-crc" || return + nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \ + tee /dev/null | dd bs=1 skip=$offsSub count=1020 \ + 2>/dev/null >"/tmp/iopmigr-nvram-crc" || return + echo -ne "\x00\x00\x00\x00" >>"/tmp/iopmigr-nvram-crc" || return crc1=$(ubicrc32 "/tmp/iopmigr-nvram-crc") || return - crc2=$(dd if="/dev/mtd0ro" bs=1 skip=$((offs + offsCrc + 1020)) \ - count=4 2>/dev/null | hexdump -ve \"0x%8.8x\\n\") || return + crc2=$(nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \ + tee /dev/null | dd bs=1 skip=$((offsSub + 1020)) count=4 2>/dev/null | \ + hexdump -ve \"0x%8.8x\\n\") || return [ $((crc1)) -eq $((crc2)) ] } @@ -730,17 +719,19 @@ is_nvram_mirror_valid() { [ -n "$1" ] || return [ $1 -ge 1 -a $1 -le 3 ] || return - [ -c "/dev/mtd0ro" ] || return + [ -c "/dev/mtd0" ] || return offs=$((mtdEbSz * $1)) # Checksum? - dd if="/dev/mtd0ro" bs=1 skip=$((offs)) \ - count=1020 2>/dev/null >"/tmp/iopmigr-nvram-crc" || return - head -c 4 "/dev/zero" >>"/tmp/iopmigr-nvram-crc" || return + nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \ + tee /dev/null | dd bs=1 count=1020 2>/dev/null \ + >"/tmp/iopmigr-nvram-crc" || return + echo -ne "\x00\x00\x00\x00" >>"/tmp/iopmigr-nvram-crc" || return crc1=$(ubicrc32 "/tmp/iopmigr-nvram-crc") || return - crc2=$(dd if="/dev/mtd0ro" bs=1 skip=$((offs + 1020)) \ - count=4 2>/dev/null | hexdump -ve \"0x%8.8x\\n\") || return + crc2=$(nanddump --bb=padbad -qa -l $mtdEbSz -s $offs "/dev/mtd0" | \ + tee /dev/null | dd bs=1 skip=1020 count=4 2>/dev/null | \ + hexdump -ve \"0x%8.8x\\n\") || return [ $((crc1)) -eq $((crc2)) ] } @@ -788,7 +779,7 @@ nvram_old_freshest() { # to Broadcom nvram mirror format. As used in # Iopsys v5. nvram_old_convert() { - local seqn offs i + local offs i offsEb offsSub for i in 1 2 3; do if ! is_nvram_old_valid $i && is_nvram_mirror_valid $i; then @@ -798,25 +789,28 @@ nvram_old_convert() { done # Find most up to date copy of old nvram. - seqn=$(nvram_old_freshest) || return - [ -n "$seqn" ] || return + i=$(nvram_old_freshest) || return + [ -n "$i" ] || return # Set offset in flash depending of nvram index. - if [ $seqn -eq 0 ]; then + if [ $i -eq 0 ]; then # nvram embedded into cferom for Broadcom ARM Gen2. - offs=$((mtdEbSz / 2 + 0x580)) - elif [ $seqn -ge 1 -a $seqn -le 3 ]; then + offsEb=0 + offsSub=$((mtdEbSz / 2 + 0x580)) + elif [ $i -ge 1 -a $i -le 3 ]; then # Iopsys v4 format. - offs=$((mtdEbSz * seqn + 16)) + offsEb=$((mtdEbSz * $i)) + offsSub=16 else return 1 fi - echo "NVRAM converting from $seqn..." + echo "NVRAM converting from $i..." # Convert it into Broadcom nvram mirror format. [ $mtdEbSz -gt 32768 ] || return - dd if="/dev/mtd0ro" bs=1 skip=$((offs)) \ - count=1024 2>/dev/null >"/tmp/iopmigr-nvram-conv" || return + nanddump --bb=padbad -qa -l $mtdEbSz -s $offsEb "/dev/mtd0" | \ + tee /dev/null | dd bs=1 skip=$offsSub count=1024 \ + 2>/dev/null >"/tmp/iopmigr-nvram-conv" || return head -c $((mtdEbSz - 1024)) "/dev/zero" | \ tr "\000" "\377" >>"/tmp/iopmigr-nvram-conv"