diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index c8a292cbe6e2..90477f1fcb27 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -909,10 +909,18 @@ sudo cp {{src}} $FILESYSTEM_ROOT/{{dst}} {% endfor -%} {% if sonic_asic_platform == "mellanox" %} -sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/ -sudo cp $files_path/$MLNX_SPC_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa -sudo cp $files_path/$MLNX_SPC2_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC2.mfa -sudo cp $files_path/$MLNX_SPC3_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC3.mfa +declare -rA FW_FILE_MAP=( \ + [$MLNX_SPC_FW_FILE]="fw-SPC.mfa" \ + [$MLNX_SPC2_FW_FILE]="fw-SPC2.mfa" \ + [$MLNX_SPC3_FW_FILE]="fw-SPC3.mfa" \ +) +sudo mkdir -p $FILESYSTEM_ROOT/$PLATFORM_DIR/fw/asic/ +sudo mkdir -p $FILESYSTEM_ROOT_ETC/mlnx/ +for fw_file_name in ${!FW_FILE_MAP[@]}; do + sudo cp $files_path/$fw_file_name $FILESYSTEM_ROOT/$PLATFORM_DIR/fw/asic/${FW_FILE_MAP[$fw_file_name]} + # Link old FW location to not break existing automation/scripts + sudo ln -s /host/image-$SONIC_IMAGE_VERSION/$PLATFORM_DIR/fw/asic/${FW_FILE_MAP[$fw_file_name]} $FILESYSTEM_ROOT/etc/mlnx/${FW_FILE_MAP[$fw_file_name]} +done sudo cp $files_path/$ISSU_VERSION_FILE $FILESYSTEM_ROOT/etc/mlnx/issu-version sudo cp $files_path/$MLNX_FFB_SCRIPT $FILESYSTEM_ROOT/usr/bin/mlnx-ffb.sh sudo cp $files_path/$MLNX_ONIE_FW_UPDATE $FILESYSTEM_ROOT/usr/bin/$MLNX_ONIE_FW_UPDATE diff --git a/platform/mellanox/mlnx-fw-upgrade.j2 b/platform/mellanox/mlnx-fw-upgrade.j2 index e17ec176503c..2d06c21c8ea1 100755 --- a/platform/mellanox/mlnx-fw-upgrade.j2 +++ b/platform/mellanox/mlnx-fw-upgrade.j2 @@ -32,9 +32,9 @@ declare -r UNKN_ASIC="unknown" declare -r UNKN_MST="unknown" declare -rA FW_FILE_MAP=( \ - [$SPC1_ASIC]="/etc/mlnx/fw-SPC.mfa" \ - [$SPC2_ASIC]="/etc/mlnx/fw-SPC2.mfa" \ - [$SPC3_ASIC]="/etc/mlnx/fw-SPC3.mfa" \ + [$SPC1_ASIC]="fw-SPC.mfa" \ + [$SPC2_ASIC]="fw-SPC2.mfa" \ + [$SPC3_ASIC]="fw-SPC3.mfa" \ ) IMAGE_UPGRADE="${NO_PARAM}" @@ -181,17 +181,17 @@ function RunCmd() { } function UpgradeFW() { - local -r _FS_MOUNTPOINT="$1" + local -r _FW_BIN_PATH="$1" local -r _ASIC_TYPE="$(GetAsicType)" if [[ "${_ASIC_TYPE}" = "${UNKN_ASIC}" ]]; then ExitFailure "failed to detect ASIC type" fi - if [ ! -z "${_FS_MOUNTPOINT}" ]; then - local -r _FW_FILE="${_FS_MOUNTPOINT}/${FW_FILE_MAP[$_ASIC_TYPE]}" + if [ ! -z "${_FW_BIN_PATH}" ]; then + local -r _FW_FILE="${_FW_BIN_PATH}/${FW_FILE_MAP[$_ASIC_TYPE]}" else - local -r _FW_FILE="${FW_FILE_MAP[$_ASIC_TYPE]}" + local -r _FW_FILE="/etc/mlnx/${FW_FILE_MAP[$_ASIC_TYPE]}" fi if [ ! -f "${_FW_FILE}" ]; then @@ -234,16 +234,29 @@ 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 ExitSuccess "firmware is up to date" + fi + + # /host/image-/platform/fw/asic is now the new location for FW binaries. + # Prefere this path and if it does not exist use squashfs as a fallback. + local -r _PLATFORM_FW_BIN_PATH="/host/image-${_NEXT_SONIC_IMAGE#SONiC-OS-}/platform/fw/asic/" + + if [[ -d "${_PLATFORM_FW_BIN_PATH}" ]]; then + LogInfo "Using FW binaries from ${_PLATFORM_FW_BIN_PATH}" + + UpgradeFW "${_PLATFORM_FW_BIN_PATH}" else + 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" + local -r _FW_BIN_PATH="${_FS_MOUNTPOINT}/etc/mlnx/" + + LogInfo "Using FW binaries from ${_FW_BIN_PATH}" + mkdir -p "${_FS_MOUNTPOINT}" mount -t squashfs "${_FS_PATH}" "${_FS_MOUNTPOINT}" - UpgradeFW "${_FS_MOUNTPOINT}" + UpgradeFW "${_FW_BIN_PATH}" umount -rf "${_FS_MOUNTPOINT}" rm -rf "${_FS_MOUNTPOINT}"