From 7c260355e15e18ed54fb650f549ef5c7db08582c Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Tue, 19 May 2026 17:13:33 +0800 Subject: [PATCH 1/2] [Mellanox] [generate_dump] Collect SSD dump (#4553) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What I did Added logic to collect SSD dump on Mellanox platforms #### How I did it In “generate_dump” script extended in “collect_mellanox” function to run new “generate_ssd_dump” and save output as “ssd.dump”. #### How to verify it Run "show techsupport" command on Mellanox platform and verify that SSD dump is generated. Signed-off-by: Sonic Build Admin #### Previous command output (if the output of a command-line utility has changed) #### New command output (if the output of a command-line utility has changed) --- scripts/generate_dump | 10 ++++ scripts/generate_ssd_dump | 101 ++++++++++++++++++++++++++++++++++++++ setup.py | 4 ++ ssd-dump/vtFA_RTK_5766_v2 | Bin 0 -> 17704 bytes 4 files changed, 115 insertions(+) create mode 100755 scripts/generate_ssd_dump create mode 100755 ssd-dump/vtFA_RTK_5766_v2 diff --git a/scripts/generate_dump b/scripts/generate_dump index ba47dc0d8..dea2b93b4 100755 --- a/scripts/generate_dump +++ b/scripts/generate_dump @@ -1516,6 +1516,16 @@ collect_mellanox() { save_cmd "show interfaces autoneg status" "autoneg.status" + save_cmd "/usr/local/bin/generate_ssd_dump" "ssd.dump" + # generate_ssd_dump saved the output of vtFA_RTK_5766_v2 if exists in $ssd_dump_generated_files + ssd_dump_generated_files=/tmp/ssd_dump_generated_files + if [ -d $ssd_dump_generated_files ]; then + for file in $(find_files "$ssd_dump_generated_files"); do + save_file ${file} dump false + done + rm -rf ${ssd_dump_generated_files} + fi + wait } diff --git a/scripts/generate_ssd_dump b/scripts/generate_ssd_dump new file mode 100755 index 000000000..81fba446e --- /dev/null +++ b/scripts/generate_ssd_dump @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. +# +# This software product is a proprietary product of Nvidia Corporation and its affiliates +# (the "Company") and all right, title, and interest in and to the software +# product, including all associated intellectual property rights, are and +# shall remain exclusively with the Company. +# +# This software product is governed by the End User License Agreement +# provided with the software product. +# + +# Usage: ./nvme_checks.sh [ []] +# Defaults: /dev/nvme0n1 (namespace), /dev/nvme0 (controller) +# Override timeout/grace via env: TIMEOUT=10s KILL_DELAY=2s ./nvme_checks.sh + +NS_DEV=${1:-/dev/nvme0n1} +CTRL_DEV=${2:-/dev/nvme0} +TIMEOUT=${TIMEOUT:-5s} +KILL_DELAY=${KILL_DELAY:-1s} + +run_nvme_cmd() { + subcmd=$1 + dev=$2 + echo -e "\n\nRunning nvme $subcmd $dev (timeout $TIMEOUT)\n\n" + if timeout -k "$KILL_DELAY" "$TIMEOUT" nvme "$subcmd" "$dev"; then + echo "nvme $subcmd succeeded for $dev." + else + rc=$? + if [[ $rc -eq 124 ]]; then + echo "nvme $subcmd timed out after $TIMEOUT and was terminated." + else + echo "nvme $subcmd failed for $dev (exit code $rc)." + fi + fi +} + +echo -e "Running nvme list --output=json \n\n" +nvme_list_output=$(timeout ${TIMEOUT} nvme list --output=json) +echo ${nvme_list_output} + +# Namespace-level commands (require block device like /dev/nvme0n1) +if [[ -b "$NS_DEV" ]]; then + for subcmd in smart-log error-log fw-log; do + run_nvme_cmd "$subcmd" "$NS_DEV" + done +else + echo "Namespace device $NS_DEV not found (skipping smart-log/error-log/fw-log)." +fi + +# Controller-level command (requires controller device like /dev/nvme0, usually a char device) +if [[ -c "$CTRL_DEV" || -b "$CTRL_DEV" ]]; then + run_nvme_cmd "id-ctrl" "$CTRL_DEV" +else + echo "Controller device $CTRL_DEV not found (skipping id-ctrl)." +fi + +if ! printf '%s' "$nvme_list_output" | jq -e . >/dev/null 2>&1; then + echo "nvme list output is empty or invalid JSON" +elif printf '%s' "$nvme_list_output" | jq -e '.Devices[] | select(.ModelNumber=="Virtium VTPM24CEXI080-BM110006")' >/dev/null; then + echo "Found NVMe with ModelNumber VTPM24CEXI080-BM110006" + echo -e "\n\nRunning /usr/local/bin/vtFA_RTK_5766_v2 ${CTRL_DEV}\n\n" + #Create tmp directory to run vtFA_RTK_5766_v2, then get the output from that directory + ssd_dump_generated_files=/tmp/ssd_dump_generated_files + rm -rf ${ssd_dump_generated_files} + mkdir -p ${ssd_dump_generated_files} + cd ${ssd_dump_generated_files} + # Try to run vtFA_RTK_5766_v2 with retry + RETRIES="2" + DELAY="2" + attempt=1 + rc=1 + while [ "$attempt" -le "$RETRIES" ]; do + echo "Attempt $attempt/$RETRIES: vtFA_RTK_5766_v2 $CTRL_DEV (timeout $TIMEOUT)" + if timeout -k "$KILL_DELAY" "$TIMEOUT" /usr/local/bin/vtFA_RTK_5766_v2 "$CTRL_DEV"; then + echo "vtFA_RTK_5766_v2 succeeded for $CTRL_DEV." + rc=0 + break + else + rc=$? + if [ "$rc" -eq 124 ]; then + echo "vtFA_RTK_5766_v2 timed out after $TIMEOUT and was terminated." + else + echo "vtFA_RTK_5766_v2 failed (exit code $rc)." + fi + if [ "$attempt" -lt "$RETRIES" ]; then + echo "Retrying in $DELAY seconds..." + sleep "$DELAY" + fi + fi + attempt=$((attempt + 1)) + done + if [ "$rc" -ne 0 ]; then + echo "Failed to run vtFA_RTK_5766_v2 after $RETRIES attempts." + fi + cd - >/dev/null + # generate_dump script will collect files from ${ssd_dump_generated_files} and then remove the folder +else + echo "Skiping vtFA_RTK_5766_v2" +fi diff --git a/setup.py b/setup.py index 15644bc6c..c8633023f 100644 --- a/setup.py +++ b/setup.py @@ -89,6 +89,9 @@ 'watchdogutil', 'sonic_cli_gen', ], + data_files=[ + ("bin", ["ssd-dump/vtFA_RTK_5766_v2"]), + ], package_data={ 'generic_config_updater': ['gcu_services_validator.conf.json', 'gcu_field_operation_validators.conf.json'], 'show': ['aliases.ini'], @@ -139,6 +142,7 @@ 'scripts/flow_counters_stat', 'scripts/gearboxutil', 'scripts/generate_dump', + 'scripts/generate_ssd_dump', 'scripts/generate_shutdown_order.py', 'scripts/intfutil', 'scripts/intfstat', diff --git a/ssd-dump/vtFA_RTK_5766_v2 b/ssd-dump/vtFA_RTK_5766_v2 new file mode 100755 index 0000000000000000000000000000000000000000..b4cdacd4ab156e637fd0487460317c16b63f8802 GIT binary patch literal 17704 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 Ys(O_zEt@$^xay8ug~fFa2ZzZ13%3CLX#fBK literal 0 HcmV?d00001 From b3feb8a748f7798b5be4a5616236b1801d5b3c42 Mon Sep 17 00:00:00 2001 From: sschlafman Date: Tue, 19 May 2026 10:04:39 -0700 Subject: [PATCH 2/2] Added SPC5 and SN4280 SKUs (#4557) #### What I did Added SPC5 and SN4280 SKUs This is a dedicated PR for 202511. PR for master: https://github.com/sonic-net/sonic-utilities/pull/4544 #### How I did it Updated gcu_field_operation_validators.conf.json file with these SKUs "Mellanox-SN5640-C512X2", "Mellanox-SN5640-C508O1X2", "Mellanox-SN5640-O128X2 "Mellanox-SN4280-O4X96" #### How to verify it #### Previous command output (if the output of a command-line utility has changed) #### New command output (if the output of a command-line utility has changed) Signed-off-by: Shay Schlafman --- .../gcu_field_operation_validators.conf.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generic_config_updater/gcu_field_operation_validators.conf.json b/generic_config_updater/gcu_field_operation_validators.conf.json index 0fdc18a50..577cf1843 100644 --- a/generic_config_updater/gcu_field_operation_validators.conf.json +++ b/generic_config_updater/gcu_field_operation_validators.conf.json @@ -21,9 +21,9 @@ "ACS-MSN2700-A1", "Mellanox-SN2700-A1", "Mellanox-SN2700-A1-C28D8", "Mellanox-SN2700-A1-D40C8S8", "Mellanox-SN2700-A1-D44C10", "Mellanox-SN2700-A1-D48C8" ], "spc2": [ "ACS-MSN3800", "Mellanox-SN3800-D112C8", "ACS-MSN3420", "ACS-MSN3700C", "ACS-MSN3700", "Mellanox-SN3800-C64", "Mellanox-SN3800-D100C12S2", "Mellanox-SN3800-D24C52", "Mellanox-SN3800-D28C49S1", "Mellanox-SN3800-D28C50" ], "spc3": [ "ACS-MSN4700", "ACS-MSN4600", "ACS-MSN4600C", "ACS-MSN4410", "ACS-SN4280", "Mellanox-SN4600C-D112C8", "Mellanox-SN4600C-C64", "Mellanox-SN4700-O8C48", "Mellanox-SN4600C-D100C12S2", "Mellanox-SN4600C-D48C40","Mellanox-SN4700-O32","Mellanox-SN4700-V64", - "Mellanox-SN4700-A96C8V8", "Mellanox-SN4700-C128", "Mellanox-SN4700-O28", "Mellanox-SN4700-O8V48", "Mellanox-SN4700-V48C32", "Mellanox-SN4280-O28", "Mellanox-SN4280-O8C80", "Mellanox-SN4280-C48", "Mellanox-SN4280-O8C40", "Mellanox-SN4280-O8V40"], + "Mellanox-SN4700-A96C8V8", "Mellanox-SN4700-C128", "Mellanox-SN4700-O28", "Mellanox-SN4700-O8V48", "Mellanox-SN4700-V48C32", "Mellanox-SN4280-O28", "Mellanox-SN4280-O8C80", "Mellanox-SN4280-C48", "Mellanox-SN4280-O8C40", "Mellanox-SN4280-O8V40", "Mellanox-SN4280-O4X96"], "spc4": [ "ACS-SN5600", "Mellanox-SN5600-O128", "Mellanox-SN5600-V256", "Mellanox-SN5600-C256S1", "ACS-SN5400", "Mellanox-SN5600-C224O8", "Mellanox-SN5610N-C256S2", "Mellanox-SN5610N-C224O8" ], - "spc5": ["ACS-SN5640", "Mellanox-SN5640-C512S2", "Mellanox-SN5640-C448O16" ] + "spc5": ["ACS-SN5640", "Mellanox-SN5640-C512S2", "Mellanox-SN5640-C448O16", "Mellanox-SN5640-C512X2", "Mellanox-SN5640-C508O1X2", "Mellanox-SN5640-O128X2" ] }, "broadcom_asics": { "th": [ "Force10-S6100", "Arista-7060CX-32S-C32", "Arista-7060CX-32S-C32-T1", "Arista-7060CX-32S-D48C8", "Celestica-DX010-C32", "Seastone-DX010" ],