a134bfe0b2
Why I did it The hw resources should be released before updating firmware. How I did it Added logic to release hw resources in syncd.sh script Signed-off-by: Vadym Hlushko <vadymh@nvidia.com> Co-authored-by: Vadym Hlushko <62022266+vadymhlushko-mlnx@users.noreply.github.com>
194 lines
5.9 KiB
Bash
Executable File
194 lines
5.9 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
. /usr/local/bin/syncd_common.sh
|
|
|
|
declare -r UNKN_MST="unknown"
|
|
|
|
function GetMstDevice() {
|
|
local _MST_DEVICE="$(ls /dev/mst/*_pci_cr0 2>&1)"
|
|
|
|
if [[ ! -c "${_MST_DEVICE}" ]]; then
|
|
echo "${UNKN_MST}"
|
|
else
|
|
echo "${_MST_DEVICE}"
|
|
fi
|
|
}
|
|
|
|
function startplatform() {
|
|
|
|
# platform specific tasks
|
|
|
|
# start mellanox drivers regardless of
|
|
# boot type
|
|
if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then
|
|
BOOT_TYPE=`getBootType`
|
|
if [[ x"$WARM_BOOT" == x"true" || x"$BOOT_TYPE" == x"fast" ]]; then
|
|
export FAST_BOOT=1
|
|
fi
|
|
|
|
if [[ x"$WARM_BOOT" != x"true" ]]; then
|
|
if [[ x"$(/bin/systemctl is-active pmon)" == x"active" ]]; then
|
|
/bin/systemctl stop pmon
|
|
debug "pmon is active while syncd starting, stop it first"
|
|
fi
|
|
fi
|
|
|
|
debug "Starting Firmware update procedure"
|
|
/usr/bin/mst start --with_i2cdev
|
|
|
|
local -r _MST_DEVICE="$(GetMstDevice)"
|
|
if [[ "${_MST_DEVICE}" != "${UNKN_MST}" ]]; then
|
|
/usr/bin/flint -d $_MST_DEVICE --clear_semaphore
|
|
fi
|
|
|
|
/usr/bin/mlnx-fw-upgrade.sh
|
|
/etc/init.d/sxdkernel restart
|
|
debug "Firmware update procedure ended"
|
|
fi
|
|
|
|
if [[ x"$sonic_asic_platform" == x"broadcom" ]]; then
|
|
if [[ x"$WARM_BOOT" != x"true" ]]; then
|
|
. /host/machine.conf
|
|
if [ -n "$aboot_platform" ]; then
|
|
platform=$aboot_platform
|
|
elif [ -n "$onie_platform" ]; then
|
|
platform=$onie_platform
|
|
else
|
|
platform="unknown"
|
|
fi
|
|
if [[ x"$platform" == x"x86_64-arista_720dt_48s" ]]; then
|
|
is_bcm0=$(ls /sys/class/net | grep bcm0)
|
|
if [[ "$is_bcm0" == "bcm0" ]]; then
|
|
debug "stop SDK opennsl-modules ..."
|
|
/etc/init.d/opennsl-modules stop
|
|
debug "start SDK opennsl-modules ..."
|
|
/etc/init.d/opennsl-modules start
|
|
debug "started SDK opennsl-modules"
|
|
fi
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
if [[ x"$sonic_asic_platform" == x"barefoot" ]]; then
|
|
is_usb0=$(ls /sys/class/net | grep usb0)
|
|
if [[ "$is_usb0" == "usb0" ]]; then
|
|
/usr/bin/ip link set usb0 down
|
|
/usr/bin/ip link set usb0 up
|
|
fi
|
|
fi
|
|
|
|
if [[ x"$WARM_BOOT" != x"true" ]]; then
|
|
if [ x$sonic_asic_platform == x'cavium' ]; then
|
|
/etc/init.d/xpnet.sh start
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function waitplatform() {
|
|
|
|
BOOT_TYPE=`getBootType`
|
|
if [[ x"$sonic_asic_platform" == x"mellanox" ]]; then
|
|
if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then
|
|
PMON_TIMER_STATUS=$(systemctl is-active pmon.timer)
|
|
if [[ x"$PMON_TIMER_STATUS" = x"inactive" ]]; then
|
|
systemctl start pmon.timer
|
|
else
|
|
debug "PMON service is delayed by a timer for better fast/warm boot performance"
|
|
fi
|
|
else
|
|
debug "Starting pmon service..."
|
|
/bin/systemctl start pmon
|
|
debug "Started pmon service"
|
|
fi
|
|
fi
|
|
if [[ x"$BOOT_TYPE" = @(x"fast"|x"warm"|x"fastfast") ]]; then
|
|
debug "LLDP service is delayed by a timer for better fast/warm boot performance"
|
|
else
|
|
lldp_state=$(systemctl is-enabled lldp.timer)
|
|
if [[ $lldp_state == "enabled" ]]
|
|
then
|
|
debug "Starting lldp service..."
|
|
/bin/systemctl start lldp
|
|
debug "Started lldp service"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function stopplatform1() {
|
|
|
|
if [[ x$sonic_asic_platform == x"mellanox" ]] && [[ x$TYPE == x"cold" ]]; then
|
|
debug "Stopping pmon service ahead of syncd..."
|
|
/bin/systemctl stop pmon
|
|
debug "Stopped pmon service"
|
|
fi
|
|
|
|
if [[ x$sonic_asic_platform != x"mellanox" ]] || [[ x$TYPE != x"cold" ]]; then
|
|
# Invoke platform specific pre shutdown routine.
|
|
PLATFORM=`$SONIC_DB_CLI CONFIG_DB hget 'DEVICE_METADATA|localhost' platform`
|
|
PLATFORM_PRE_SHUTDOWN="/usr/share/sonic/device/$PLATFORM/plugins/syncd_request_pre_shutdown"
|
|
[ -f $PLATFORM_PRE_SHUTDOWN ] && \
|
|
/usr/bin/docker exec -i syncd$DEV /usr/share/sonic/platform/plugins/syncd_request_pre_shutdown --${TYPE}
|
|
|
|
debug "${TYPE} shutdown syncd process ..."
|
|
/usr/bin/docker exec -i syncd$DEV /usr/bin/syncd_request_shutdown --${TYPE}
|
|
|
|
# wait until syncd quits gracefully or force syncd to exit after
|
|
# waiting for 20 seconds
|
|
start_in_secs=${SECONDS}
|
|
end_in_secs=${SECONDS}
|
|
timer_threshold=20
|
|
while docker top syncd$DEV | grep -q /usr/bin/syncd \
|
|
&& [[ $((end_in_secs - start_in_secs)) -le $timer_threshold ]]; do
|
|
sleep 0.1
|
|
end_in_secs=${SECONDS}
|
|
done
|
|
|
|
if [[ $((end_in_secs - start_in_secs)) -gt $timer_threshold ]]; then
|
|
debug "syncd process in container syncd$DEV did not exit gracefully"
|
|
fi
|
|
|
|
/usr/bin/docker exec -i syncd$DEV /bin/sync
|
|
debug "Finished ${TYPE} shutdown syncd process ..."
|
|
fi
|
|
}
|
|
|
|
function stopplatform2() {
|
|
# platform specific tasks
|
|
|
|
if [[ x"$WARM_BOOT" != x"true" ]]; then
|
|
if [ x$sonic_asic_platform == x'mellanox' ]; then
|
|
/etc/init.d/sxdkernel stop
|
|
/usr/bin/mst stop
|
|
elif [ x$sonic_asic_platform == x'cavium' ]; then
|
|
/etc/init.d/xpnet.sh stop
|
|
/etc/init.d/xpnet.sh start
|
|
fi
|
|
fi
|
|
}
|
|
|
|
OP=$1
|
|
DEV=$2
|
|
|
|
SERVICE="syncd"
|
|
PEER="swss"
|
|
DEBUGLOG="/tmp/swss-syncd-debug$DEV.log"
|
|
LOCKFILE="/tmp/swss-syncd-lock$DEV"
|
|
NAMESPACE_PREFIX="asic"
|
|
if [ "$DEV" ]; then
|
|
NET_NS="$NAMESPACE_PREFIX$DEV" #name of the network namespace
|
|
SONIC_DB_CLI="sonic-db-cli -n $NET_NS"
|
|
else
|
|
NET_NS=""
|
|
SONIC_DB_CLI="sonic-db-cli"
|
|
fi
|
|
|
|
case "$1" in
|
|
start|wait|stop)
|
|
$1
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {start|wait|stop}"
|
|
exit 1
|
|
;;
|
|
esac
|