#!/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 -P "update_nvme_firmware /install/MN12MN12.img [/dev/nvme0]" # function usage() { echo "Usage: $0 [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