Fixed FW upgrade sequence. (#2111)
* Fixed FW upgrade sequence. * Removed code duplication.
This commit is contained in:
parent
37287d2eef
commit
a1715a15e3
1
device/mellanox/x86_64-mlnx_lssn2700-r0/platform_reboot
Symbolic link
1
device/mellanox/x86_64-mlnx_lssn2700-r0/platform_reboot
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../x86_64-mlnx_msn2700-r0/platform_reboot
|
1
device/mellanox/x86_64-mlnx_msn2010-r0/platform_reboot
Symbolic link
1
device/mellanox/x86_64-mlnx_msn2010-r0/platform_reboot
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../x86_64-mlnx_msn2700-r0/platform_reboot
|
1
device/mellanox/x86_64-mlnx_msn2100-r0/platform_reboot
Symbolic link
1
device/mellanox/x86_64-mlnx_msn2100-r0/platform_reboot
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../x86_64-mlnx_msn2700-r0/platform_reboot
|
1
device/mellanox/x86_64-mlnx_msn2410-r0/platform_reboot
Symbolic link
1
device/mellanox/x86_64-mlnx_msn2410-r0/platform_reboot
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../x86_64-mlnx_msn2700-r0/platform_reboot
|
34
device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot
Executable file
34
device/mellanox/x86_64-mlnx_msn2700-r0/platform_reboot
Executable file
@ -0,0 +1,34 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
declare -r EXIT_SUCCESS="0"
|
||||||
|
declare -r EXIT_ERROR="1"
|
||||||
|
|
||||||
|
declare -r FW_UPGRADE_SCRIPT="/usr/bin/mlnx-fw-upgrade.sh"
|
||||||
|
|
||||||
|
FORCE_REBOOT="no"
|
||||||
|
|
||||||
|
function ParseArguments() {
|
||||||
|
while [ $# -ge 1 ]; do
|
||||||
|
case "$1" in
|
||||||
|
-f|--force)
|
||||||
|
FORCE_REBOOT="yes"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
ParseArguments "$@"
|
||||||
|
|
||||||
|
${FW_UPGRADE_SCRIPT} --upgrade
|
||||||
|
EXIT_CODE="$?"
|
||||||
|
if [[ "${EXIT_CODE}" != "${EXIT_SUCCESS}" ]]; then
|
||||||
|
echo "Failed to burn MLNX FW: errno=${EXIT_CODE}"
|
||||||
|
|
||||||
|
if [[ "${FORCE_REBOOT}" != "yes" ]]; then
|
||||||
|
echo "Reboot is interrupted: use -f|--force to override"
|
||||||
|
exit "${EXIT_ERROR}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec /sbin/reboot $@
|
1
device/mellanox/x86_64-mlnx_msn2740-r0/platform_reboot
Symbolic link
1
device/mellanox/x86_64-mlnx_msn2740-r0/platform_reboot
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../x86_64-mlnx_msn2700-r0/platform_reboot
|
@ -1,68 +1,143 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
fw_required="{{ MLNX_FW_VERSION }}"
|
declare -r SCRIPT_NAME="$(basename "$0")"
|
||||||
query_retry_count_max="10"
|
declare -r SCRIPT_PATH="$(readlink -f "$0")"
|
||||||
fw_file=/etc/mlnx/fw-SPC.mfa
|
declare -r SCRIPT_DIR="$(dirname "$SCRIPT_PATH")"
|
||||||
|
|
||||||
run_or_fail() {
|
declare -r EXIT_SUCCESS="0"
|
||||||
$1
|
declare -r EXIT_ERROR="1"
|
||||||
if [[ $? != 0 ]]; then
|
|
||||||
echo $1 failed
|
declare -r QUERY_CMD="mlxfwmanager --query"
|
||||||
exit 1
|
declare -r BURN_CMD="mlxfwmanager -u -f -y"
|
||||||
fi
|
|
||||||
|
declare -r FW_FILE="/etc/mlnx/fw-SPC.mfa"
|
||||||
|
declare -r QUERY_FILE="/tmp/mlnxfwmanager-query.txt"
|
||||||
|
|
||||||
|
declare -r FW_REQUIRED="{{ MLNX_FW_VERSION }}"
|
||||||
|
|
||||||
|
IMAGE_UPGRADE="no"
|
||||||
|
|
||||||
|
function PrintHelp() {
|
||||||
|
echo
|
||||||
|
echo "Usage: ./${SCRIPT_NAME} [OPTIONS]"
|
||||||
|
echo
|
||||||
|
echo "OPTIONS:"
|
||||||
|
echo " -u, --upgrade Upgrade MLNX ASIC firmware using next boot image (useful after SONiC-To-SONiC update)"
|
||||||
|
echo " -h, --help Print help"
|
||||||
|
echo
|
||||||
|
echo "Examples:"
|
||||||
|
echo " ./${SCRIPT_NAME}"
|
||||||
|
echo " ./${SCRIPT_NAME} --upgrade"
|
||||||
|
echo " ./${SCRIPT_NAME} --help"
|
||||||
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
# wait until devices will be available
|
function ParseArguments() {
|
||||||
query_retry_count="0"
|
while [ $# -ge 1 ]; do
|
||||||
query_cmd="mlxfwmanager --query"
|
case "$1" in
|
||||||
${query_cmd} > /dev/null
|
-u|--upgrade)
|
||||||
|
IMAGE_UPGRADE="yes"
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
PrintHelp
|
||||||
|
exit "${EXIT_SUCCESS}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
while [[ (${query_retry_count} -lt ${query_retry_count_max}) && ($? -ne "0") ]]; do
|
function WaitForDevice() {
|
||||||
sleep 1
|
local -i QUERY_RETRY_COUNT_MAX="10"
|
||||||
query_retry_count=$[${query_retry_count}+1]
|
local -i QUERY_RETRY_COUNT="0"
|
||||||
${query_cmd} > /dev/null
|
|
||||||
done
|
|
||||||
|
|
||||||
function upgrade() {
|
${QUERY_CMD} > /dev/null
|
||||||
if [ ! -z "$1" ]; then
|
|
||||||
fw_file="$1"
|
while [[ ("${QUERY_RETRY_COUNT}" -lt "${QUERY_RETRY_COUNT_MAX}") && ("$?" -ne "0") ]]; do
|
||||||
if [ ! -f "$fw_file" ]; then
|
sleep 1s
|
||||||
>&2 echo "No such file: $fw_file"
|
((QUERY_RETRY_COUNT++))
|
||||||
exit 1
|
${QUERY_CMD} > /dev/null
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function RunCmd() {
|
||||||
|
$1
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo "Command failed: cmd=$1, errno=$?"
|
||||||
|
exit "${EXIT_ERROR}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function UpgradeFW() {
|
||||||
|
local _FW_FILE="$1"
|
||||||
|
|
||||||
|
if [ ! -z "${_FW_FILE}" ]; then
|
||||||
|
if [ ! -f "${_FW_FILE}" ]; then
|
||||||
|
echo "No such file: ${_FW_FILE}"
|
||||||
|
exit "${EXIT_ERROR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
run_or_fail "${query_cmd} -i ${fw_file}" > /tmp/mlnxfwmanager-query.txt
|
RunCmd "${QUERY_CMD} -i ${_FW_FILE}" > "${QUERY_FILE}"
|
||||||
|
|
||||||
# get current firmware version and available version from $fw_file
|
local -r _FW_INFO="$(grep FW ${QUERY_FILE})"
|
||||||
fw_info=$(grep FW /tmp/mlnxfwmanager-query.txt)
|
local -r _FW_CURRENT="$(echo ${_FW_INFO} | cut -f2 -d' ')"
|
||||||
fw_current=$(echo $fw_info | cut -f2 -d' ')
|
local -r _FW_AVAILABLE="$(echo ${_FW_INFO} | cut -f3 -d' ')"
|
||||||
fw_available=$(echo $fw_info | cut -f3 -d' ')
|
|
||||||
|
|
||||||
fw_required=$fw_available
|
|
||||||
else
|
else
|
||||||
run_or_fail "${query_cmd}" > /tmp/mlnxfwmanager-query.txt
|
RunCmd "${QUERY_CMD}" > "${QUERY_FILE}"
|
||||||
|
|
||||||
# get current firmware version and required version
|
local -r _FW_INFO="$(grep FW ${QUERY_FILE})"
|
||||||
fw_info=$(grep FW /tmp/mlnxfwmanager-query.txt)
|
local -r _FW_CURRENT="$(echo ${_FW_INFO} | cut -f2 -d' ')"
|
||||||
fw_current=$(echo $fw_info | cut -f2 -d' ')
|
local -r _FW_AVAILABLE="${FW_REQUIRED}"
|
||||||
|
|
||||||
|
_FW_FILE="${FW_FILE}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z ${fw_current} ]]; then
|
if [[ -z "${_FW_CURRENT}" ]]; then
|
||||||
echo "Could not retreive current FW version."
|
echo "Could not retreive current FW version"
|
||||||
exit 1
|
exit "${EXIT_ERROR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -z ${fw_required} ]]; then
|
if [[ -z "${_FW_AVAILABLE}" ]]; then
|
||||||
echo "Could not retreive required FW version."
|
echo "Could not retreive available FW version"
|
||||||
exit 1
|
exit "${EXIT_ERROR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ${fw_current} == ${fw_required} ]]; then
|
if [[ "${_FW_CURRENT}" == "${_FW_AVAILABLE}" ]]; then
|
||||||
echo "Mellanox firmware is up to date."
|
echo "Mellanox firmware is up to date"
|
||||||
else
|
else
|
||||||
echo "Mellanox firmware required version is ${fw_required}. Installing compatible version..."
|
echo "Mellanox firmware upgrade is required. Installing compatible version..."
|
||||||
run_or_fail "mlxfwmanager -i ${fw_file} -u -f -y"
|
RunCmd "${BURN_CMD} -i ${_FW_FILE}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
upgrade "$1"
|
function UpgradeFWFromImage() {
|
||||||
|
local -r _NEXT_SONIC_IMAGE="$(sonic_installer list | grep "Next: " | cut -f2 -d' ')"
|
||||||
|
local -r _CURRENT_SONIC_IMAGE="$(sonic_installer list | grep "Current: " | cut -f2 -d' ')"
|
||||||
|
|
||||||
|
local -r _FS_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/fs.squashfs"
|
||||||
|
local -r _FS_MOUNTPOINT="/tmp/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}-fs"
|
||||||
|
|
||||||
|
if [[ "${_CURRENT_SONIC_IMAGE}" == "${_NEXT_SONIC_IMAGE}" ]]; then
|
||||||
|
echo "Mellanox firmware is up to date"
|
||||||
|
else
|
||||||
|
mkdir -p "${_FS_MOUNTPOINT}"
|
||||||
|
mount -t squashfs "${_FS_PATH}" "${_FS_MOUNTPOINT}"
|
||||||
|
|
||||||
|
UpgradeFW "${_FS_MOUNTPOINT}/etc/mlnx/fw-SPC.mfa"
|
||||||
|
|
||||||
|
umount -rf "${_FS_MOUNTPOINT}"
|
||||||
|
rm -rf "${_FS_MOUNTPOINT}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
ParseArguments "$@"
|
||||||
|
|
||||||
|
WaitForDevice
|
||||||
|
|
||||||
|
if [ "${IMAGE_UPGRADE}" != "yes" ]; then
|
||||||
|
UpgradeFW
|
||||||
|
else
|
||||||
|
UpgradeFWFromImage
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit "${EXIT_SUCCESS}"
|
||||||
|
Loading…
Reference in New Issue
Block a user