#!/bin/sh
#
# If NVMe firmware file is located here:
# /install/MN12MN12.img
#
# Call the script as follows to update firmware for device /dev/nvme0:
#    updatenode <noderange> -P "update_nvme_firmware /install/MN12MN12.img [/dev/nvme0]"
#
function usage() {
    echo "Usage: $0 </path_to/NVME.img> [nvme device]"
}
if [[ -z ${1} ]]; then
   echo "Error: you must provide the path of the NVMe Firmware file"
   usage
   exit 1
fi
NVME_FILE_PATH=${1}
if ! which nvme > /dev/null; then
    echo "Error: nvme utility not found, install 'nvme-cli' package and retry"
    exit 1
fi
if [[ -z ${2} ]]; then
    if ! ls /dev/nvme* 2>1 >/dev/null; then
        echo "INFO: No NVMe device find, nothing to do"
        exit 0
    else
        TARGET_DEV=`ls /dev/nvme* | egrep "nvme[0-9]*$"`
    fi
else
    TARGET_DEV=${2}
    if ! ls $TARGET_DEV 2>1 >/dev/null; then
        echo "Error: Could not find NVMe device: $TARGET_DEV"
        exit 1
    fi
fi

WORKING_DIR="/tmp/xcat.nvme"
/usr/bin/mkdir -p ${WORKING_DIR}
NVME_FIRM_FILE=`basename ${NVME_FILE_PATH}`
TARGET_FIRM_FILE="${WORKING_DIR}/${NVME_FIRM_FILE}"

echo "==> NVMe Firmware File PATH: ${NVME_FILE_PATH}"
echo "==> NVMe Firmware File: ${NVME_FIRM_FILE}"

if [[ -e ${TARGET_FIRM_FILE} ]]; then
   rm -f ${TARGET_FIRM_FILE}
fi

echo "==> Retrieving file from http://${MASTER}/${NVME_FILE_PATH}"
wget -q http://${MASTER}/${NVME_FILE_PATH} -O ${TARGET_FIRM_FILE}
if [[ $? -ne 0 ]]; then
    echo "Error: Download ${NVME_FILE_PATH} failed from ${MASTER}"
    exit 1
fi

ls -ltr ${TARGET_FIRM_FILE}
RC=0
for DEV in $TARGET_DEV; do
    if ! nvme fw-download $DEV --fw=${TARGET_FIRM_FILE} 2>1 >/dev/null ; then
        echo "${DEV}: Firmware download to device failed"
        RC=1
        continue
    fi

    nvme fw-activate $DEV -a 1 -s 1
    nvme fw-activate $DEV -a 1 -s 2
    nvme fw-activate $DEV -a 1 -s 3
    nvme fw-activate $DEV -a 1 -s 4

    nvme reset $DEV

    TARGET_VERSION=`nvme id-ctrl $DEV | grep "fr " | awk '{ print $3}'`

    if [[ x"$NVME_FIRM_FILE" == x"${TARGET_VERSION}.img" ]]; then
        echo "${DEV}: Firmware successfully updated to $TARGET_VERSION"
    else
        echo "${DEV}: Firmware update failed, current version is ${TARGET_VERSION}"
        RC=1
    fi
done
#
# Clean up
#
rm -f ${TARGET_FIRM_FILE}
/usr/bin/rmdir ${WORKING_DIR}

exit $RC
