7 Commits
Author SHA1 Message Date
etwenandClaude Opus 5 a5b7c4757b feat(boot): Name the log and the banner after the kind of boot
EN_Cold_Warm_boot = 1 opens Logs\Blanton_Reboot_Cycle_<ts>.log and prints
a "Reboot Cycle : N" banner each round; = 2 opens
Blanton_Power_Cycle_<ts>.log and prints "Power Cycle : N". Three sites
branch on the flag now: the log name, the banner, and the boot itself.

Two things follow from it.

With EN_Cold_Warm_boot = 0 there is no longer a logopen either, so the
run that already hangs at wait "Booting in blind mode" now also leaves no
log to show where it stopped. EN_log = 1 on its own no longer produces a
log from this macro.

And anything that parses these logs has to accept both banners. The cycle
banner is the record separator the check-point and per-segment timing
reports are built on, so a parser that only greps "Reboot Cycle :" finds
zero cycles in a power-cycle log and reports nothing without complaining.

The logopen timestamp flag stays a literal 1 rather than EN_timestamp the
way Script A does it. That is the right call here - the per-segment
timing analysis is derived from those timestamps and there is no other
way to recover them - but it does mean this macro ignores
EN_timestamp = 0.

Recorded under V1.2.2 in Script A's history; the header version is
unchanged because V1.2.2 has not been tagged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-09 10:15:39 +08:00
etwenandClaude Opus 5 f5694345fb feat(boot): Rename Script 5 to Boot Cycle, add a cold path and stop the log growing
The macro does warm and cold now, so "Reboot" was too narrow:
5_Blanton_Script_Reboot_Cycle.ttl -> 5_Blanton_Script_Boot_Cycle.ttl.

EN_Cold_Warm_boot in config.ttl picks which:

  0  neither - for the A/B/C flow, where this macro is not used
  1  reboot (warm), what the macro always did
  2  cold, by writing the CB FPGA:
     pcimem .../0000:05:00.0/resource0 0x480 w 0xD0000

Three things about that worth knowing before anyone runs it. Setting 0 and
then running this macro hangs it: nothing reboots, and the
wait "Booting in blind mode" underneath has no timeout, so it waits for a
boot that will never come. 0x480 is ICB_CTRL_REG in
docs/Blantons_FPGA_Registers.md and that table has no bit definitions for
it, nor is 0xD0000 written down anywhere in this repo. And the BDF
0000:05:00.0 is hard-coded, while blanton_fpga_pcimem.sh auto-detects the
CB FPGA precisely because it moves per unit - on a DUT where it is not at
05:00.0 this is a raw 32-bit write to an unknown register on some other
device. The cold path has not been run on hardware.

Separately, both stress logs are now removed before each run:

  rm -rf /host/hw-eval/jobs/qfx5252-stress-{ssd,usb}.log

qfx5252-stress-* appends to its --log file and the macro cats the whole
thing afterwards, so every cycle printed back everything the cycles
before it had written. On the 199-cycle log from 2026-09-04 that was 289
lines at cycle 1 and 36,555 at cycle 199; at ~6.2 ms a line, which is
what a 115200 baud console costs, it accounts for +212 s of the +214 s
the cycle grew over the run. The stress itself is fixed at --runtime 30,
and the other eleven gaps between check points drifted by under 1.5 s
each. The DUT was never getting slower - the test was reading its own
history aloud, once per cycle.

Script A's header goes to V1.2.2 and its Version History covers all of
the above.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-09 09:14:09 +08:00
etwenandClaude Opus 5 7a1967bc9a docs: Update CLAUDE / ARCHITECTURE for V1.2.1 and add the release note
CLAUDE.md: status to V1.2.1 / 2026-09-08; the BER paragraph now says
Script A takes a baseline as well as Script C taking the closing sweep;
and a new gotcha that 'clear' is what puts the lanes back, with the
Script A versus Script C traffic reports as the way to tell whether they
came back in time.

ARCHITECTURE.md: Script A ref to V1.2.1 and its row updated with the
baseline sweep; the BER row notes both call sites; the sleep 30 /
BER_INTERVAL known issue now says three places rather than two; a new
known issue for the missing settle between Script A's BER clear and its
first traffic run; and the git tag checkbox to V1.2.1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-08 09:35:36 +08:00
etwenandClaude Opus 5 496e3ab650 feat(ttl): Take a BER baseline in Script A, before the first traffic run
blanton_ber.sh init -> start -> sleep 30 -> report -> stop -> clear,
branched on SWB_UNIT0 / SWB_UNIT1 the same way the traffic block beside it
is.

Script C already took the closing sweep after its traffic report. With
this one at the front the pair brackets the soak, the same shape the DSC
scans got in V1.2.0 and for the same reason: one BER figure says very
little, a change in it says a lot.

The sleep 30 is blanton_ber.sh's BER_INTERVAL. Reporting before a full
interval has accumulated reads a window that has not finished, and
nothing warns about it - that number now lives in three places.

The block was copied out of Script C, whose comment says it runs after
the traffic report, because there it does. Here it runs before. The
comment was rewritten to describe where the code actually sits and why
'clear' has to happen before the traffic block.

Not yet run on hardware. Nothing settles between blanton_ber.sh clear and
the blanton_traffic_linespeed ps that follows it, and 'clear' is what
releases lanes PRBS was holding out of normal operation. Script C does
not have that ordering, so the two traffic reports are a built-in
comparison: NA or FAIL pairs in Script A's that are absent from
Script C's mean the lanes had not come back, and a sleep after 'clear'
is the fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-08 09:35:36 +08:00
etwenandClaude Opus 5 29ec4c2239 docs: Update CLAUDE / ARCHITECTURE for V1.2.0 and add the release note
CLAUDE.md: status to V1.2.0 / 2026-09-07; the PRBS paragraph now says the
A/B/C call sites were deleted in V1.1.9 rather than commented out; the
DSC scan and parser get a commands block and a line in the status
summary; the soak loop uses sleep 60; the bcmcmd gotcha records that
bcm_dsc_scan.sh hit the same stdin trap on 2026-09-07 and why the
existing marker check could not see it; and a new gotcha on pause versus
sleep.

ARCHITECTURE.md: bcm_dsc_scan.sh / bcm_dsc_parse.sh in the tree and a
Key Features row of their own; EN_TX_FIR in the config.ttl line; Script A
ref to V1.2.0 and the A / B / C rows updated for the DSC steps and sleep;
constraint 10 extended with the recurrence; new constraint 18 (pause
stops the macro, sleep stops the DUT) with the old 18 renumbered to 19
and EN_TX_FIR added to it; the git tag checkbox to V1.2.0; the PRBS and
bmc_monitor_ddr known issues corrected from "commented out" to "deleted";
and a new known issue for the DSC scan being off by default and sharing
ports with the other traffic tools.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-07 10:02:42 +08:00
etwenandClaude Opus 5 d73b119dc3 feat(ttl): Wait on the DUT with sleep, and gate the DSC scan on EN_TX_FIR
Every 'pause N' in Scripts A, B and C is now 'sendln "sleep N"' followed
by 'wait prompt_sonic_root'.

pause stops the macro for N seconds without touching the DUT: the shell
sits idle and the macro is guessing how long the previous command needed.
On a loaded DUT the guess runs short, the next command goes out before
the previous one has finished, and the whole run ends up a beat ahead of
the switch. Putting the wait on the DUT means the macro resumes when the
prompt actually returns, so the two cannot drift apart - and the wait
lands in the console log with a timestamp, so a round that ran long is
visible afterwards.

Durations changed with it: the management-ping sample in Script A is 15 s
(was 30) and the settle after each traffic 'clear' is 5 s (was 15). The
traffic run stays 15 s and Script B's monitor loop stays 60 s. Script 4
and Script 5 were not converted; the 'pause 1' at the top of B and C
stays, since it runs before there is a prompt to wait for.

EN_TX_FIR gates the DSC scan in Script A and Script C, and the four cp
lines that carry blanton_dsc_Script{A,C}_u{0,1}.log out with the job
logs. It defaults to 0: a full scan is ~10 min and both scripts do one,
so leaving it off keeps ~20 min out of a routine run.

Script C also stops printing bmc_poll.log and mlucas_amm_log to the
console. Both are still copied to /host/hw-eval/jobs and out to the USB
stick, so nothing is lost - the master log is just shorter.

Script A's header goes to V1.2.0 and its Version History covers all of
the above.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-07 10:02:42 +08:00
etwenandClaude Opus 5 79a3604ac4 fix(dsc): bcmcmd was eating the port list, so only one port was scanned
The scan loop read its port file on stdin. bcmcmd reads stdin too, so the
first call swallowed the rest of the file and the loop ended after a
single port.

Nothing about that looked wrong. The log held one PORT marker and one dsc
block, the marker-to-dump comparison passed because both counts shrank
together, the exit code was 0, and a 445-port scan just finished in
seconds.

The loop now reads on fd 3 (done 3< "$PORTFILE") and bcmcmd is given
< /dev/null. A second check compares the iteration count against the port
list count - the marker/dump comparison cannot see a loop that ends
early, so it needed a number that does not shrink with it. The Saved:
line reports dumps out of TOTAL rather than out of markers.

This is the same bcmcmd trap blanton_traffic_linespeed.sh hit at v0.3.1,
where only the first VLAN was configured.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-09-07 10:02:25 +08:00
10 changed files with 521 additions and 71 deletions
+45 -18
View File
@@ -161,7 +161,7 @@ Blanton_TTL_Script/
├── 4_Blanton_Script_thermal_safety.ttl # 熱 / 安規:獨立跑,不接 A→B→C ├── 4_Blanton_Script_thermal_safety.ttl # 熱 / 安規:獨立跑,不接 A→B→C
├── 5_Blanton_Script_Reboot_Cycle.ttl # 重開機循環:獨立跑,while 1 無止境(未上機驗證) ├── 5_Blanton_Script_Reboot_Cycle.ttl # 重開機循環:獨立跑,while 1 無止境(未上機驗證)
├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log / EN_timestamp、 ├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_TX_FIR / EN_log / EN_timestamp、
│ # 風扇與 SWB 宣告、SSD/USB/BMC_USB 壓力秒數、三個 prompt 字串 │ # 風扇與 SWB 宣告、SSD/USB/BMC_USB 壓力秒數、三個 prompt 字串
├── hammer/ # 🚫 gitignored — mlucas ELF binary~99 MB),DUT image 自帶, ├── hammer/ # 🚫 gitignored — mlucas ELF binary~99 MB),DUT image 自帶,
│ # publish.sh 也排除;Script B / Script 4 只負責 chmod +x 後執行 │ # publish.sh 也排除;Script B / Script 4 只負責 chmod +x 後執行
@@ -199,7 +199,11 @@ Blanton_TTL_Script/
├── mgmt_ping_monitor.sh # 10G/1G 管理網路 ping 監控(iproute2 ├── mgmt_ping_monitor.sh # 10G/1G 管理網路 ping 監控(iproute2
│ # eth0→TARGET_10G、eth1→TARGET_1G,兩張卡同時持續 ping │ # eth0→TARGET_10G、eth1→TARGET_1G,兩張卡同時持續 ping
├── port_prbs_monitor.sh # 100G uplink PRBS 測試(bcmcmd phy diag ├── port_prbs_monitor.sh # 100G uplink PRBS 測試(bcmcmd phy diag
│ # ⚠️ V1.1.9 起 A/B/C 內註解掉的呼叫已整段刪除,只剩手動執行
├── blanton_ber.sh # 全機 SerDes BER 掃描(phydiag prbs / prbsstat ├── blanton_ber.sh # 全機 SerDes BER 掃描(phydiag prbs / prbsstat
├── bcm_dsc_scan.sh # 全機 SerDes DSC dumpphydiag <port> dsc~445 port × 2 unit
│ # 由 EN_TX_FIR 控制,A 與 C 各掃一次;單次約 10 分鐘
├── bcm_dsc_parse.sh # DSC raw log → <prefix>_lane.csv / _pm.csv(純 sh + awk
├── blanton_multiphase_margin.sh # 多相 VRM margin(原生 i2c38 條軌) ├── blanton_multiphase_margin.sh # 多相 VRM margin(原生 i2c38 條軌)
├── pwr_brick.sh # PDB / CPB power brick 讀值(VI2C ch4 ├── pwr_brick.sh # PDB / CPB power brick 讀值(VI2C ch4
├── nfc_polling.sh # NFC tag 背景輪詢 + PASS/FAIL 統計 ├── nfc_polling.sh # NFC tag 背景輪詢 + PASS/FAIL 統計
@@ -210,7 +214,7 @@ Blanton_TTL_Script/
│ # ⚠️ 已納入交付,但 A/B/C 的呼叫仍註解掉(bring-up 中) │ # ⚠️ 已納入交付,但 A/B/C 的呼叫仍註解掉(bring-up 中)
├── usb_target.sh # 偵測 USB 裝置節點/掛載點(排除系統碟) ├── usb_target.sh # 偵測 USB 裝置節點/掛載點(排除系統碟)
├── bmc_monitor.sh # BMC 監控:free -m + I2C 寫入/讀回圖樣測試 ├── bmc_monitor.sh # BMC 監控:free -m + I2C 寫入/讀回圖樣測試
├── bmc_monitor_ddr.sh # ⚠️ 已停用:B/C 內呼叫處已註解DDR 壓力走 bgctl + bmc-manager ├── bmc_monitor_ddr.sh # ⚠️ 已停用:V1.1.9 起 B/C 內的註解區塊已刪除DDR 壓力走 bgctl + bmc-manager
│ # ↑ 三支都要 chmod +x 才能跑(見 Key Constraints │ # ↑ 三支都要 chmod +x 才能跑(見 Key Constraints
└── LTC2980_Margin_Script/ # 電壓 margin 子專案(另有獨立 repo └── LTC2980_Margin_Script/ # 電壓 margin 子專案(另有獨立 repo
├── margin.sh # margin_init/status/set/apply_profile/save ├── margin.sh # margin_init/status/set/apply_profile/save
@@ -370,9 +374,9 @@ PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_perc
| 模組 | 進入點 | 功能 | | 模組 | 進入點 | 功能 |
|------|--------|------| |------|--------|------|
| **Script APre-test** | `1_Blanton_Script_A.ttl` V1.1.8 | root 登入 → `date -s` 對時 → 清 job log → **收掉前一輪殘留**`hw-test-session finish``bgctl reset --yes``bgctl stop --all``bgctl list` 確認清空)→ `hw-test-session start`**設定風扇轉速****等資料面就緒**`wait_init.ttl`)→ DUT 清單(boot/version/fwutil/syseeprom/ssdhealth/TPM/NVMe)→ BMC enroll + version/status → source bash 工具 → 清/讀 7 組 PCIe AER + `ras-mc-ctl --summary``lspci` → margin → PMON → dmesg → **10G/1G 管理網路 ping****NFC 基線**start → 30s → stop → report)→ 100G uplink 設定與狀態 → **一輪流量基線** `show uptime` | | **Script APre-test** | `1_Blanton_Script_A.ttl` V1.2.1 | root 登入 → `date -s` 對時 → 清 job log → **收掉前一輪殘留**`hw-test-session finish``bgctl reset --yes``bgctl stop --all``bgctl list` 確認清空)→ `hw-test-session start`**設定風扇轉速****等資料面就緒**`wait_init.ttl`)→ DUT 清單(boot/version/fwutil/syseeprom/ssdhealth/TPM/NVMe)→ BMC enroll + version/status → source bash 工具 → 清/讀 7 組 PCIe AER + `ras-mc-ctl --summary``lspci` → margin → PMON → dmesg → **10G/1G 管理網路 ping****NFC 基線**start → 30s → stop → report)→ 100G uplink 設定與狀態 → **BER 基線掃描**(依 `SWB_UNIT`V1.2.1 新增)→ **一輪流量基線****SerDes DSC 基線**`EN_TX_FIR``show uptime` |
| **Script BStress** | `2_Blanton_Script_B.ttl` | **V1.1.8 起 `mlucas-avx2 -cpu 0:15` 由 `systemd-run --unit=mlucas-amm``Type=exec`、`Restart=always`)啟動,不再是 shell 的 `&` 背景 job** + `bgctl run``memtester` / SSD / USB 壓力(v1.1.7 起 SSD/USB 的 `--runtime`/`--passes``config.ttl``SSD_RUNTIME`/`SSD_COUNT``USB_RUNTIME`/`USB_COUNT`BMC memtester 不帶次數 = 跑到被停) + BMC DDR(`bmc-manager run memtester`)→ BMC USB net test(探測 cdc_ncm 介面,`systemd-run``BMC_USB_RUNTIME` 秒的 ping,V1.1.8 前寫死 4 小時)→ 啟動 mgmt ping 監控 → **啟動 NFC 輪詢**`jobs` / `systemctl is-active mlucas-amm` / `bgctl list` → traffic(依 `SWB_UNIT`)→ `while 1` 每輪 PMON + `bgctl list`/`jobs`/`systemctl is-active mlucas-amm` + `pause 60`**V1.1.4 起 margin 不在迴圈內**| | **Script BStress** | `2_Blanton_Script_B.ttl` | **V1.1.8 起 `mlucas-avx2 -cpu 0:15` 由 `systemd-run --unit=mlucas-amm``Type=exec`、`Restart=always`)啟動,不再是 shell 的 `&` 背景 job** + `bgctl run``memtester` / SSD / USB 壓力(v1.1.7 起 SSD/USB 的 `--runtime`/`--passes``config.ttl``SSD_RUNTIME`/`SSD_COUNT``USB_RUNTIME`/`USB_COUNT`BMC memtester 不帶次數 = 跑到被停) + BMC DDR(`bmc-manager run memtester`)→ BMC USB net test(探測 cdc_ncm 介面,`systemd-run``BMC_USB_RUNTIME` 秒的 ping,V1.1.8 前寫死 4 小時)→ 啟動 mgmt ping 監控 → **啟動 NFC 輪詢**`jobs` / `systemctl is-active mlucas-amm` / `bgctl list` → traffic(依 `SWB_UNIT`)→ `while 1` 每輪 PMON + `bgctl list`/`jobs`/`systemctl is-active mlucas-amm` + `sleep 60`**V1.1.4 起 margin 不在迴圈內**V1.2.0 起等待走 DUT 端 `sleep` 而非 macro 端 `pause`|
| **Script CPost-test** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + **`systemctl stop mlucas-amm`**systemd unit 不是 shell job`jobs -p` 抓不到)+ `bgctl stop --all` / `reset` + 停 BMC USB unit、mgmt ping 與 **NFC 輪詢** → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl` **寫進 `log/bmc_usb_net.log`**(不再印在 console`ip -s link show eth0/eth1``cat` mlucas log(並 `cp` 進 job 目錄一起帶走)→ **NFC `report`** → traffic `stop` + `report`**BER 掃描**(依 `SWB_UNIT`)→ NVMe 健康 → `show reboot-cause`**margin 掃描**`EN_Margin`V1.1.4 由 Script B 移來)→ `uptime`**job log 複製到 USB(帶時戳)**`exit` + wait『Script done』→ `hw-test-session finish` | | **Script CPost-test** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` + **`systemctl stop mlucas-amm`**systemd unit 不是 shell job`jobs -p` 抓不到)+ `bgctl stop --all` / `reset` + 停 BMC USB unit、mgmt ping 與 **NFC 輪詢** → PMON + dmesg → 7 組 AER + `ras-mc-ctl` → BMC USB `journalctl` **寫進 `log/bmc_usb_net.log`**(不再印在 console`ip -s link show eth0/eth1``cat` mlucas log(並 `cp` 進 job 目錄一起帶走)→ **NFC `report`** → traffic `stop` + `report`**SerDes DSC 收尾**`EN_TX_FIR`)→ **BER 掃描**(依 `SWB_UNIT`)→ NVMe 健康 → `show reboot-cause`**margin 掃描**`EN_Margin`V1.1.4 由 Script B 移來)→ `uptime`**job log 複製到 USB(帶時戳)**`exit` + wait『Script done』→ `hw-test-session finish` |
| **Script 4Thermal / Safety** | `4_Blanton_Script_thermal_safety.ttl` | **獨立腳本,不接 A→B→C。** Script A 式的環境建立(登入 / session / 風扇 / `wait_init` / DUT 清單 / BMC / PCIe 清除 / `pcie_bus` / PMON / dmesg)→ **滿載**`mlucas-avx2 -cpu 0:15`V1.1.8 起與 Script B 同樣掛成 `mlucas-amm` systemd unit + `blanton_tr518.sh start`)→ `while 1`PMON + `TH6_SWB0/1_power_readback.sh` + `bgctl list` / `jobs` / `systemctl is-active mlucas-amm``pause 60`。**沒有收尾段** —— 中斷後 DUT 仍在 `port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,且 CPU 仍滿載,要手動 `blanton_tr518.sh stop` + `systemctl stop mlucas-amm` | | **Script 4Thermal / Safety** | `4_Blanton_Script_thermal_safety.ttl` | **獨立腳本,不接 A→B→C。** Script A 式的環境建立(登入 / session / 風扇 / `wait_init` / DUT 清單 / BMC / PCIe 清除 / `pcie_bus` / PMON / dmesg)→ **滿載**`mlucas-avx2 -cpu 0:15`V1.1.8 起與 Script B 同樣掛成 `mlucas-amm` systemd unit + `blanton_tr518.sh start`)→ `while 1`PMON + `TH6_SWB0/1_power_readback.sh` + `bgctl list` / `jobs` / `systemctl is-active mlucas-amm``pause 60`。**沒有收尾段** —— 中斷後 DUT 仍在 `port cd lb=mac` / `l2 learn off` / `test mode nr=yes`,且 CPU 仍滿載,要手動 `blanton_tr518.sh stop` + `systemctl stop mlucas-amm` |
| **Script 5Reboot Cycle** | `5_Blanton_Script_Reboot_Cycle.ttl` | **獨立腳本,不接 A→B→C。** `while 1`:登入 → `sudo -i` → 對時 → 風扇 → **Check Pt1~Pt13**DUT/BMC info、mgmt ping、NFC、SSD、USB、BMC USB、port status + 15s traffic、BER、NVMe、platform data、dmesg i2c、PCIe error counters)→ `show uptime``reboot``wait "Booting in blind mode"``cnt_cycle` 每輪 +1 印在標頭。**沒有結束條件** —— 要停就關掉 Tera Term 的 macro。**尚未上機驗證** | | **Script 5Reboot Cycle** | `5_Blanton_Script_Reboot_Cycle.ttl` | **獨立腳本,不接 A→B→C。** `while 1`:登入 → `sudo -i` → 對時 → 風扇 → **Check Pt1~Pt13**DUT/BMC info、mgmt ping、NFC、SSD、USB、BMC USB、port status + 15s traffic、BER、NVMe、platform data、dmesg i2c、PCIe error counters)→ `show uptime``reboot``wait "Booting in blind mode"``cnt_cycle` 每輪 +1 印在標頭。**沒有結束條件** —— 要停就關掉 Tera Term 的 macro。**尚未上機驗證** |
| **SWB loopback 流量** | `blanton_traffic_linespeed <sub> [-u 0\|1\|all]` | `init`VLAN 30..137,成對 `cdN`/`cdN+32`)→ `clear``start``tx 200 length=324 PatternRandom=yes`v0.7.0 起)→ `stop``report`per-pair TX/RX 交叉比對 PASS/FAIL);另有 `ps`link/speed)與 `run`(一條龍)。**V0.6.0 起含 100G uplink `ce0`**VLAN 138):它沒有 loopback 對象,靠 **ingress mirror 打回自己**維持循環,`report` 最後一列就是它,底下再接一份跨 unit summary | | **SWB loopback 流量** | `blanton_traffic_linespeed <sub> [-u 0\|1\|all]` | `init`VLAN 30..137,成對 `cdN`/`cdN+32`)→ `clear``start``tx 200 length=324 PatternRandom=yes`v0.7.0 起)→ `stop``report`per-pair TX/RX 交叉比對 PASS/FAIL);另有 `ps`link/speed)與 `run`(一條龍)。**V0.6.0 起含 100G uplink `ce0`**VLAN 138):它沒有 loopback 對象,靠 **ingress mirror 打回自己**維持循環,`report` 最後一列就是它,底下再接一份跨 unit summary |
@@ -386,9 +390,10 @@ PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_perc
| **Margin 寫 NVM** | `margin_save` / `margin_save all` / `margin_save blanton` | ⚠️ 永久寫入。`0x15` 送 PMBus **send-byte**(不帶 data byte)。`all` = 依 `settings/` 走 9 顆、跑完還原原本載入的板子;`blanton` = 本平台捷徑,18 顆全走原生 i2c bus(`MARGIN_BLANTON_STORE` 表),不需 `margin_init`。每筆之間 `MARGIN_STORE_SETTLE`0.5s),工具**不 poll busy bit** | | **Margin 寫 NVM** | `margin_save` / `margin_save all` / `margin_save blanton` | ⚠️ 永久寫入。`0x15` 送 PMBus **send-byte**(不帶 data byte)。`all` = 依 `settings/` 走 9 顆、跑完還原原本載入的板子;`blanton` = 本平台捷徑,18 顆全走原生 i2c bus(`MARGIN_BLANTON_STORE` 表),不需 `margin_init`。每筆之間 `MARGIN_STORE_SETTLE`0.5s),工具**不 poll busy bit** |
| **管理網路 ping** | `mgmt_ping_monitor.sh {start\|stop\|status\|fg\|tail\|clear\|summary}` | 一輪 = 10G leg + 1G leg,各自 `ip address/route replace``ping -I <if>` 打自己的對端;兩張卡都保持 up。每 leg 記 `ip -s link show` 與該卡的 TX/RX packet delta,另出一行可 grep 的 `RESULT` | | **管理網路 ping** | `mgmt_ping_monitor.sh {start\|stop\|status\|fg\|tail\|clear\|summary}` | 一輪 = 10G leg + 1G leg,各自 `ip address/route replace``ping -I <if>` 打自己的對端;兩張卡都保持 up。每 leg 記 `ip -s link show` 與該卡的 TX/RX packet delta,另出一行可 grep 的 `RESULT` |
| **BMC 監控** | `bmc_monitor.sh {start\|stop\|status\|fg\|tail\|clear}` | 由 host 端 `bmc-manager run` 週期取樣 `free -m`,另加一組 **I2C 寫入/讀回圖樣測試**bus 1、addr 0x41、offset 0x00C0,寫 `55AA55AA` 讀回、再寫 `AA55AA55` 讀回)。B 啟動、C 停止並 `cat log/bmc_poll.log` | | **BMC 監控** | `bmc_monitor.sh {start\|stop\|status\|fg\|tail\|clear}` | 由 host 端 `bmc-manager run` 週期取樣 `free -m`,另加一組 **I2C 寫入/讀回圖樣測試**bus 1、addr 0x41、offset 0x00C0,寫 `55AA55AA` 讀回、再寫 `AA55AA55` 讀回)。B 啟動、C 停止並 `cat log/bmc_poll.log` |
| **BMC DDR 壓力** | `bmc_monitor_ddr.sh` | ⚠️ **已停用** —— B/C 內呼叫處已註解,改由 `bgctl run bmc-manager run memtester` 取代。檔案保留未刪 | | **BMC DDR 壓力** | `bmc_monitor_ddr.sh` | ⚠️ **已停用** —— V1.1.9 起 B/C 內的註解區塊已刪除,改由 `bgctl run bmc-manager run memtester` 取代。檔案保留未刪 |
| **100G PRBS** | `port_prbs_monitor.sh {start [both\|a\|b]\|stop\|status\|report\|clear}` | 兩個 uplink 各一個 worker,可同時或單獨跑。setup`lpmode off` `prbs set` `prbsstat STArt`)→ 週期 `prbs get`(判定)+ `prbsstat Ber`(只記錄)→ teardown`STOp` + `prbs clear`)。輸出 `PRBS OK!` 才算 PASS。**⚠️ A/B/C 的呼叫目前註解掉** | | **SerDes DSC 擷取** | `bcm_dsc_scan.sh [-u 0\|1] [-f <name>] [-F] [-n] [-C]` + `bcm_dsc_parse.sh -i <log> -o <prefix>` | `bcmcmd -n <unit> -c "dsh -c 'phydiag <port> dsc'"` 掃全清單(1 個 100G + 445 個 200G port)× 2 unitraw log 寫進 `<script_dir>/log` `cp` `/host/hw-eval/jobs``-f` 支援 `%u` / `%t`;沒帶 `%u` 時自動插 `_u0`/`_u1`。成功與否**不看 `bcmcmd` 的 exit code**,改比對 `SERDES DISPLAY DIAG DATA END` 數量 + 實際迭代筆數,結尾印 `### DSC_SCAN_DONE rc=<n>`。parse 端輸出 `_lane.csv`(每 laneTXEQ/RXFFE/DFE/EYE/SNR)與 `_pm.csv`(每 pm_id:溫度/PLL/lane 數/統計)。**由 `EN_TX_FIR` 控制,預設關** |
| **SerDes BER 掃描** | `blanton_ber.sh {init\|clear\|start\|stop\|report} [-u 0\|1\|all]` | 全機每個對接 port 的 PRBS BER`prbs set p=3` + `prbs get`(確認每條 lane 都鎖上)`prbsstat STArt Interval=30` →(等一個 interval)→ `prbsstat Ber``STOp` `prbs clear``report` 一列一條 lane**BER < 1e-6 才 PASS**,最後跨 unit 的 summary 帶最差 lane。⚠️ PRBS 期間 link 顯示 DOWN、不過流量 | | **100G PRBS** | `port_prbs_monitor.sh {start [both\|a\|b]\|stop\|status\|report\|clear}` | 兩個 uplink 各一個 worker,可同時或單獨跑。setup`lpmode off` `prbs set` `prbsstat STArt`)→ 週期 `prbs get`(判定)+ `prbsstat Ber`(只記錄)→ teardown`STOp` + `prbs clear`)。輸出含 `PRBS OK!` PASS**⚠️ V1.1.9 起 A/B/C 內的註解呼叫已刪除,只能手動跑** |
| **SerDes BER 掃描** | `blanton_ber.sh {init\|clear\|start\|stop\|report} [-u 0\|1\|all]` | 全機每個對接 port 的 PRBS BER`prbs set p=3` + `prbs get`(確認每條 lane 都鎖上)→ `prbsstat STArt Interval=30` →(等一個 interval)→ `prbsstat Ber``STOp``prbs clear``report` 一列一條 lane**BER < 1e-6 才 PASS**,最後跨 unit 的 summary 帶最差 lane。⚠️ PRBS 期間 link 顯示 DOWN、不過流量。V1.2.1 起 Script A 與 Script C 各跑一次(A 在流量之前、C 在流量報表之後),夾住 soak |
| **TR518 負載** | `blanton_tr518.sh {start\|stop} [-u 0\|1\|all]` | `port cd lb=mac``l2 learn off``test mode nr=yes``tr 518 ... testphase=1`,然後 settle `TR_SETTLE_SEC`120s)再讓人量功耗。`stop` 只送 `port cd lb=none`(照 `TR518.txt`),L2 學習與 test mode **不會還原**`TR_RESTORE_*=1` 才會 | | **TR518 負載** | `blanton_tr518.sh {start\|stop} [-u 0\|1\|all]` | `port cd lb=mac``l2 learn off``test mode nr=yes``tr 518 ... testphase=1`,然後 settle `TR_SETTLE_SEC`120s)再讓人量功耗。`stop` 只送 `port cd lb=none`(照 `TR518.txt`),L2 學習與 test mode **不會還原**`TR_RESTORE_*=1` 才會 |
| **PDB / CPB brick** | `pwr_brick.sh show [-r]` | 5 顆 brick 的 Vin / Iin / Vout / Iout / TempSWB0 `0x62`/`0x63`、SWB1 `0x60`/`0x61`、CPB `0x26`)。四顆 ADPM12200 **每個量各自一個 PMBus PAGE**Vin 9、Iin 10、Vout 2、Iout 14、Temp 18),讀之前一定要先寫 PAGE —— `blanton_pwr_data.sh` 完全沒寫,所以整張 PDB 表都是 NA。換算用手冊 DIRECT 公式 `X=(1/m)(Y×10⁻ᴿ−b)`。每個值重讀到通過三道檢查為止(非 `0xFFFF`、非 `0x0000`、落在合理範圍)—— 這條匯流排**只壞高位元組**,`11.98 V` 會變成 `32.00 V`,全一過濾擋不住 | | **PDB / CPB brick** | `pwr_brick.sh show [-r]` | 5 顆 brick 的 Vin / Iin / Vout / Iout / TempSWB0 `0x62`/`0x63`、SWB1 `0x60`/`0x61`、CPB `0x26`)。四顆 ADPM12200 **每個量各自一個 PMBus PAGE**Vin 9、Iin 10、Vout 2、Iout 14、Temp 18),讀之前一定要先寫 PAGE —— `blanton_pwr_data.sh` 完全沒寫,所以整張 PDB 表都是 NA。換算用手冊 DIRECT 公式 `X=(1/m)(Y×10⁻ᴿ−b)`。每個值重讀到通過三道檢查為止(非 `0xFFFF`、非 `0x0000`、落在合理範圍)—— 這條匯流排**只壞高位元組**,`11.98 V` 會變成 `32.00 V`,全一過濾擋不住 |
| **SWB 軌功耗** | `TH6_SWB{0,1}_power_readback.sh` | 讀 `show platform voltage/current` **各一次**,19 條軌 V×I 與總功耗。舊版每軌各讀一次(38 次呼叫、每軌不同時刻),總和是不同瞬間的加總 | | **SWB 軌功耗** | `TH6_SWB{0,1}_power_readback.sh` | 讀 `show platform voltage/current` **各一次**,19 條軌 V×I 與總功耗。舊版每軌各讀一次(38 次呼叫、每軌不同時刻),總和是不同瞬間的加總 |
@@ -510,6 +515,11 @@ pwr_data
`vlan create``Entry exists`(重跑 init)與 `vlan remove``not found`init 前先 stop `vlan create``Entry exists`(重跑 init)與 `vlan remove``not found`init 前先 stop
當良性情況分開計數。另外 `bcmcmd` 一律以 `</dev/null` 執行 —— 當良性情況分開計數。另外 `bcmcmd` 一律以 `</dev/null` 執行 ——
否則它會吃掉 while 迴圈的 stdin,導致**只有第一個 VLAN 被設定**V0.3.1 修的 bug)。 否則它會吃掉 while 迴圈的 stdin,導致**只有第一個 VLAN 被設定**V0.3.1 修的 bug)。
**2026-09-07 `bcm_dsc_scan.sh` 又踩了同一個坑**port 清單走 stdin445 個 port 只掃了 1 個),
而且因為 `### PORT` marker 與 dsc 區塊數量一起變少,原本的比對檢查完全看不出來、`rc=0`
修法:迴圈改讀 fd 3`done 3< "$PORTFILE"`+ `bcmcmd ... < /dev/null`,再加一道
「實際迭代筆數 == 清單筆數」的獨立檢查。**寫任何餵檔案給 `while` 又在裡面呼叫 `bcmcmd` 的迴圈,
都要假設它會讀 stdin;而且完整性檢查不能只比對兩個會一起變少的數字。**
11. **DUT 密碼不得進 git**`1_Blanton_Script_A.ttl` 目前的 `sendln "YourPaSsWoRd"` 是 placeholder 11. **DUT 密碼不得進 git**`1_Blanton_Script_A.ttl` 目前的 `sendln "YourPaSsWoRd"` 是 placeholder
實際帳密必須放 `secret/config_secret.ttl`gitignored)並由 `config.ttl` include。 實際帳密必須放 `secret/config_secret.ttl`gitignored)並由 `config.ttl` include。
12. **`.sh` / `.conf` 必須是 LF**CRLF 的 shell script 在 SONiC 上直接掛 12. **`.sh` / `.conf` 必須是 LF**CRLF 的 shell script 在 SONiC 上直接掛
@@ -549,8 +559,15 @@ pwr_data
⚠️ **`4_Blanton_Script_thermal_safety.ttl` 用同一個 `mlucas-amm` unit,但它沒有收尾段** ⚠️ **`4_Blanton_Script_thermal_safety.ttl` 用同一個 `mlucas-amm` unit,但它沒有收尾段**
所以那行 `systemctl stop mlucas-amm` 必須由測試員手動下 —— 這是 Script 4 目前 所以那行 `systemctl stop mlucas-amm` 必須由測試員手動下 —— 這是 Script 4 目前
唯一一個「不下就會延續到下一輪」的負載。 唯一一個「不下就會延續到下一輪」的負載。
18. **`config.ttl` 少一個變數會讓 macro 當場中止**,不是當成 0。V1.1.8 新增 `EN_timestamp` 18. **`pause` 停的是 macro`sleep` 停的是 DUT。** V1.2.0 起 A/B/C 的等待一律改成
Script A `logopen` 的第 5 個參數)與 `BMC_USB_RUNTIME`Script B 的 ping unit)。 `sendln "sleep N"` + `wait prompt_sonic_root``pause N` 期間 macro 不理會 DUTshell 是閒著的,
等於用猜的估上一個指令要跑多久 —— DUT 一忙就會提早往下送指令;改成 DUT 端 `sleep` 之後,
prompt 回來才繼續,兩邊不可能走散,而且這段等待會帶時戳進 log,事後看得出哪一輪跑久了。
⚠️ **Script 4 與 Script 5 尚未轉換,仍在用 `pause`**B/C 開頭的 `pause 1` 也保留
(它在登入前執行,沒有 prompt 可等)。
19. **`config.ttl` 少一個變數會讓 macro 當場中止**,不是當成 0。V1.1.8 新增 `EN_timestamp`
Script A `logopen` 的第 5 個參數)與 `BMC_USB_RUNTIME`Script B 的 ping unit);
V1.2.0 再加 `EN_TX_FIR`(A/C 的 DSC 掃描與 C 的四行 `cp`,預設 0)。
只更新 `.ttl` 卻沿用舊的 `config.ttl`Script A 會停在 `logopen` 那一行。 只更新 `.ttl` 卻沿用舊的 `config.ttl`Script A 會停在 `logopen` 那一行。
另外 **時間戳的「格式」不在 macro 裡** —— 它在 Tera Term 的 另外 **時間戳的「格式」不在 macro 裡** —— 它在 Tera Term 的
Setup → Additional settings → Log,存在那台電腦的 `TERATERM.INI`,會跟著 PC 而不是跟著腳本走。 Setup → Additional settings → Log,存在那台電腦的 `TERATERM.INI`,會跟著 PC 而不是跟著腳本走。
@@ -787,7 +804,7 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
- [ ] `CHANGELOG.md`:延續三支腳本頂端的 Version History,集中成一份 - [ ] `CHANGELOG.md`:延續三支腳本頂端的 Version History,集中成一份
- [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊,`config.ttl``script_version` 並寫進 log 開頭 - [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊,`config.ttl``script_version` 並寫進 log 開頭
- [ ] `docs/TTL_Script_Blanton_Status_*.xlsx` 更新為全 OK,或把剩餘項目移進 Future Extensions - [ ] `docs/TTL_Script_Blanton_Status_*.xlsx` 更新為全 OK,或把剩餘項目移進 Future Extensions
- [x] 打 git tagpush `nas` + `gitea`(已至 `V1.1.8``publish/` 依 Script A 檔頭版號打包) - [x] 打 git tagpush `nas` + `gitea`(已至 `V1.2.1``publish/` 依 Script A 檔頭版號打包)
**驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C **驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C
並產出 summary`publish/` 內容與 git tag 一致。 並產出 summary`publish/` 內容與 git tag 一致。
@@ -821,14 +838,19 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
Script A 既不往下走也不報錯。可加最大重試次數 + `messagebox` 提示。 Script A 既不往下走也不報錯。可加最大重試次數 + `messagebox` 提示。
- **腳本的執行權**`mgmt_ping_monitor.sh``bmc_monitor.sh`(以及已停用的 `bmc_monitor_ddr.sh`)需人工 `chmod +x` - **腳本的執行權**`mgmt_ping_monitor.sh``bmc_monitor.sh`(以及已停用的 `bmc_monitor_ddr.sh`)需人工 `chmod +x`
可在 Script B 起它之前補一行(比照既有的 `chmod +x ~/hammer/tools/amd/mlucas-avx2`),或在 publish 時處理。 可在 Script B 起它之前補一行(比照既有的 `chmod +x ~/hammer/tools/amd/mlucas-avx2`),或在 publish 時處理。
- **`bmc_monitor_ddr.sh` 已停用**B/C 內的呼叫已註解DDR 壓力改由 `bgctl run bmc-manager run memtester` - **`bmc_monitor_ddr.sh` 已停用**V1.1.9 起 B/C 內那段註解掉的呼叫已刪除DDR 壓力
取代。檔案還留在 repo,待確認不再需要後刪除,或在檔頭標註停用。 `bgctl run bmc-manager run memtester` 取代。檔案還留在 repo,待確認不再需要後刪除,或在檔頭標註停用。
`bmc_monitor.sh` 已於 2026-08-25 重新啟用,並加上 I2C 寫入/讀回圖樣測試。) `bmc_monitor.sh` 已於 2026-08-25 重新啟用,並加上 I2C 寫入/讀回圖樣測試。)
- **`rm /host/hw-eval/jobs/*` 清不掉子目錄**:Script A 用的是不帶 `-r``rm`,但 Script C - **`rm /host/hw-eval/jobs/*` 清不掉子目錄**:Script A 用的是不帶 `-r``rm`,但 Script C
`cp -r` 那個目錄,代表裡面可能有子目錄。清不乾淨的話,上一輪的 job log 會被當成這輪的一起 `cp -r` 那個目錄,代表裡面可能有子目錄。清不乾淨的話,上一輪的 job log 會被當成這輪的一起
複製到 USB。要確認 `bgctl` 的產出結構,必要時改成 `rm -rf .../jobs/*` 複製到 USB。要確認 `bgctl` 的產出結構,必要時改成 `rm -rf .../jobs/*`
- **100G PRBS 尚未接進 A/B/C**`port_prbs_monitor.sh` 隨包交付、可手動執行,但三支腳本裡的呼叫 - **100G PRBS 已從 A/B/C 移除**`port_prbs_monitor.sh` 隨包交付、可手動執行,但 V1.1.9 起
都還註解著(bring-up 中)。要啟用時記得 PRBS 期間 link 會顯示 down`stop` 之後才會回來 三支腳本裡那些註解掉的呼叫已整段刪除(連同 Script C 的 `bmc_monitor_ddr.sh` 區塊)
要接回去得重寫,不是把註解拿掉。啟用時記得 PRBS 期間 link 會顯示 down`stop` 之後才會回來。
- **DSC 擷取預設是關的**`EN_TX_FIR = 0`,所以出貨設定不會跑 `bcm_dsc_scan.sh`
開啟後 Script A 與 Script C 各掃一次、整輪多約 20 分鐘;只要單邊資料可以在腳本裡改成 `-u 0`
掃描本身是唯讀(`phydiag ... dsc` 不改 SerDes 設定),但**它與 `blanton_ber.sh` /
`blanton_traffic_linespeed` / `blanton_tr518.sh` 一樣都在動同一批 port,不要同時跑**。
- **Script 5Reboot Cycle)尚未上機驗證**`5_Blanton_Script_Reboot_Cycle.ttl` 隨 V1.1.7 交付, - **Script 5Reboot Cycle)尚未上機驗證**`5_Blanton_Script_Reboot_Cycle.ttl` 隨 V1.1.7 交付,
但還沒在真 DUT 上跑過一輪完整循環。兩個要現場確認的點:`wait "Booting in blind mode"` 是否 但還沒在真 DUT 上跑過一輪完整循環。兩個要現場確認的點:`wait "Booting in blind mode"` 是否
真的在每一版開機訊息裡出現(沒出現就會永遠等下去,而且沒有 `timeout` 保護);以及每輪重跑 真的在每一版開機訊息裡出現(沒出現就會永遠等下去,而且沒有 `timeout` 保護);以及每輪重跑
@@ -892,9 +914,14 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,
- **margin 在 soak 期間不再取樣**V1.1.4):只剩 Script A 的起始值與 Script C 的結束值。 - **margin 在 soak 期間不再取樣**V1.1.4):只剩 Script A 的起始值與 Script C 的結束值。
漂移發生在中間就看不到了。若要恢復,比較好的做法是在 B 的迴圈內每 N 輪才掃一次, 漂移發生在中間就看不到了。若要恢復,比較好的做法是在 B 的迴圈內每 N 輪才掃一次,
而不是每輪都掃。 而不是每輪都掃。
- **`blanton_ber.sh``sleep 30``BER_INTERVAL` 是兩處要同步改的數字**:Script C 寫死 - **`blanton_ber.sh``sleep 30``BER_INTERVAL` 是兩處要同步改的數字**:Script AV1.2.1 起)
`sendln "sleep 30"`,腳本預設 `BER_INTERVAL=30`。改一邊沒改另一邊,report 會讀到還沒累積完 與 Script C 都寫死 `sendln "sleep 30"`,腳本預設 `BER_INTERVAL=30`。改一邊沒改另一邊,report 會
一個 interval 的數字,而且不會有任何警告。 讀到還沒累積完一個 interval 的數字,而且不會有任何警告。現在有**三處**要一起改。
- **Script A 的 BER `clear` 與第一輪流量之間沒有 settle**:V1.2.1 把 BER 掃描放在流量**之前**,
而 PRBS 是把 lane 拉出正常運作、`clear` 才放回去的。Script A 的 `blanton_ber.sh clear` 之後
緊接著就是 `blanton_traffic_linespeed ps` / `init`,中間沒有等待;Script C 的 BER 在流量報表
之後,沒有這個順序。上機時比對兩份 traffic report —— Script A 有 NA/FAIL 而 Script C 沒有,
就是 lane 尚未回穩,在 `clear` 後加一個 `sleep` 即可。**尚未上機驗證。**
- **`ce0` 的 ingress mirror 尚未上機驗證**`mirror port ce0 Mode=Ingress DestPort=ce0` 這條路是 - **`ce0` 的 ingress mirror 尚未上機驗證**`mirror port ce0 Mode=Ingress DestPort=ce0` 這條路是
推論出來的(鏡像複本不受 egress filter 的 source-port knockout 限制),語法取自 DUT 的 推論出來的(鏡像複本不受 egress filter 的 source-port knockout 限制),語法取自 DUT 的
`help mirror`,但**還沒證明硬體真的接受 destport == srcport**。驗證方式是隔 10 秒看兩次 `help mirror`,但**還沒證明硬體真的接受 destport == srcport**。驗證方式是隔 10 秒看兩次
+38 -5
View File
@@ -9,18 +9,23 @@ DUT 端的取數能力由一組 **bash 工具庫** 提供(CB FPGA `pcimem` →
完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。 完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。
**目前狀態(2026-09-06**Script A 為 **V1.1.8**(A 集中記錄所有 TTL 的變更)。涵蓋 **目前狀態(2026-09-08**Script A 為 **V1.2.1**(A 集中記錄所有 TTL 的變更)。涵蓋
PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin9 顆 LTC2980/ SWB loopback 線速流量 / PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin9 顆 LTC2980/ SWB loopback 線速流量 /
10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 `bgctl` 10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 `bgctl`
switch unit 數量由 `config.ttl``SWB_UNIT0` / `SWB_UNIT1` 宣告,風扇轉速由 `FAN_SPEED` 指定 switch unit 數量由 `config.ttl``SWB_UNIT0` / `SWB_UNIT1` 宣告,風扇轉速由 `FAN_SPEED` 指定
(預設 100 = 全速;soak 是熱測試,散熱不該是變因)。 (預設 100 = 全速;soak 是熱測試,散熱不該是變因)。
測試 job log 收在 DUT 的 `/host/hw-eval/jobs/`Script C 結束時掛好 USB 再帶時戳複製到 `/mnt/usb/` 測試 job log 收在 DUT 的 `/host/hw-eval/jobs/`Script C 結束時掛好 USB 再帶時戳複製到 `/mnt/usb/`
100G PRBS`port_prbs_monitor.sh`)已隨包交付,但 **A/B/C 的呼叫仍註解掉**,還在 bring-up。 100G PRBS`port_prbs_monitor.sh`)已隨包交付、可手動執行,但 **V1.1.9 起 A/B/C 裡註解掉的呼叫已整段刪除**
Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs` + `systemctl is-active mlucas-amm`,並 `pause 60` 要接回去得重寫(`bmc_monitor_ddr.sh` 在 Script C 的註解區塊同時移除)。
V1.0.10 之前完全沒有 pause)。V1.1.8 起 AMD CPU 壓力(`mlucas-avx2`)由 `systemd-run` 掛成 V1.1.9 新增 **SerDes DSC 擷取**`bcm_dsc_scan.sh`DUT 端,`phydiag <port> dsc` 掃全機 ~445 port × 2 unit
約 10 分鐘)由 Script A 與 Script C 各跑一次夾住 soak`bcm_dsc_parse.sh`Host 端)把 raw log 轉成
`_lane.csv` / `_pm.csv`。**由 `config.ttl``EN_TX_FIR` 控制,預設 0(關)** —— 開了整輪測試多 ~20 分鐘。
Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs` + `systemctl is-active mlucas-amm`,並 `sendln "sleep 60"`
(V1.0.10 之前完全沒有間隔;V1.2.0 起 A/B/C 的等待一律改成 DUT 端 `sleep` 而非 macro 端 `pause`)。V1.1.8 起 AMD CPU 壓力(`mlucas-avx2`)由 `systemd-run` 掛成
`mlucas-amm` transient unit`Restart=always`),不再是 shell 的 `&` 背景 job —— 掉線也不會停, `mlucas-amm` transient unit`Restart=always`),不再是 shell 的 `&` 背景 job —— 掉線也不會停,
Script C 用 `systemctl stop mlucas-amm` 收掉並把 log 複製到隨身碟。 Script C 用 `systemctl stop mlucas-amm` 收掉並把 log 複製到隨身碟。
V1.1.0 新增全機 SerDes BER 掃描(`blanton_ber.sh`**Script C 已接**`SWB_UNIT` 分支) V1.1.0 新增全機 SerDes BER 掃描(`blanton_ber.sh`,依 `SWB_UNIT` 分支)**V1.2.1 起 Script A 也接了一次**
在第一輪流量之前取基線,與 Script C 流量報表之後的收尾掃描一起夾住 soak(同 DSC 的做法)。另有
TR518 負載(`blanton_tr518.sh`**TTL 尚未接**)、SWB 軌功耗(`TH6_SWB{0,1}_power_readback.sh`), TR518 負載(`blanton_tr518.sh`**TTL 尚未接**)、SWB 軌功耗(`TH6_SWB{0,1}_power_readback.sh`),
線速流量也納入 100G `ce0`VLAN 138,靠 ingress mirror 維持循環)。 線速流量也納入 100G `ce0`VLAN 138,靠 ingress mirror 維持循環)。
Script A 開頭會先收掉前一輪殘留(`hw-test-session finish` + `bgctl reset/stop --all`), Script A 開頭會先收掉前一輪殘留(`hw-test-session finish` + `bgctl reset/stop --all`),
@@ -150,6 +155,22 @@ sleep 30 # 至少等一個 interval 再 rep
# -u 0 / -u 1 單邊;-c 1e-9 換門檻;-F 只列失敗;-f <log> 離線重解 # -u 0 / -u 1 單邊;-c 1e-9 換門檻;-F 只列失敗;-f <log> 離線重解
# ⚠️ 不能跟 blanton_traffic_linespeed / blanton_tr518 同時跑(都會接管同一批 port) # ⚠️ 不能跟 blanton_traffic_linespeed / blanton_tr518 同時跑(都會接管同一批 port)
# ── SerDes DSC 擷取(TX_FIR / RXFFE / DFE / EYE / SNR)──
./Blanton_Script/bcm_dsc_scan.sh # unit 0+1 全掃,約 10 分鐘
./Blanton_Script/bcm_dsc_scan.sh -u 0 # 只掃一個 unit(時間減半)
./Blanton_Script/bcm_dsc_scan.sh -f my.log -F # 自訂檔名 + 覆蓋
./Blanton_Script/bcm_dsc_scan.sh -n # dry-run,只列要掃的 port
# log: ~/Blanton_Script/log/,掃完自動 cp 到 /host/hw-eval/jobs-C 可關)
# 檔名沒帶 %u 時會自動插 _u0 / _u1,所以兩個 unit 不會互相覆蓋
# 結尾固定印 "### DSC_SCAN_DONE rc=<n>"rc=0 才是全部 port 都拿到完整 dump
# ⚠️ 由 TTL 的 EN_TX_FIR 控制,預設 0(關)—— A 與 C 各掃一次,開了整輪多 ~20 分鐘
# ── DSC raw log → CSV(離線解,Host 或 DUT 都可)──────
sh ~/Blanton_Script/bcm_dsc_parse.sh -i blanton_dsc_ScriptA_u0.log -o u0
# 產出 u0_lane.csv(每 lane 一列)+ u0_pm.csv(每 pm_id 一列)
# 純 sh + awk(mawk 相容),欄位靠括號群組順序抓,SDK 改排版不會壞;
# 群組數 != 9 的列標成 UNPARSED 印到 stderr,不會安靜解錯
# ── TR518 負載 + 量功耗(TTL 尚未接)───────────────── # ── TR518 負載 + 量功耗(TTL 尚未接)─────────────────
./Blanton_Script/blanton_tr518.sh start # 兩 unit,跑完 settle 120s ./Blanton_Script/blanton_tr518.sh start # 兩 unit,跑完 settle 120s
./Blanton_Script/TH6_SWB0_power_readback.sh # 19 條軌 V×I + TOTAL POWER ./Blanton_Script/TH6_SWB0_power_readback.sh # 19 條軌 V×I + TOTAL POWER
@@ -304,9 +325,17 @@ Tera Term 連 COM port (115200-8-N-1)
`Failed to execute the diagnostic command` 都照樣回 0),所以 `blanton_traffic_linespeed.sh` `Failed to execute the diagnostic command` 都照樣回 0),所以 `blanton_traffic_linespeed.sh`
是**比對輸出**而非看 exit code。另外 `bcmcmd` 一律要 `</dev/null` —— 是**比對輸出**而非看 exit code。另外 `bcmcmd` 一律要 `</dev/null` ——
否則它會吃掉 while 迴圈的 stdin**只有第一個 VLAN 被設定**(V0.3.1 修過的 bug,很難看出來)。 否則它會吃掉 while 迴圈的 stdin**只有第一個 VLAN 被設定**(V0.3.1 修過的 bug,很難看出來)。
**2026-09-07 `bcm_dsc_scan.sh` 又踩了同一個坑**port 清單走 stdin,第一次 `bcmcmd` 就把剩下的吃光,
445 個 port 只掃了 1 個,而且 marker 與 dump 數量一起變少 → 比對通過、exit 0、log 看起來正常。
修法是迴圈改讀 fd 3`done 3< "$PORTFILE"`+ `bcmcmd ... < /dev/null`,並加一道
「實際迭代筆數 == 清單筆數」的檢查。**任何 `while ... done < file` 裡呼叫 `bcmcmd` 都要當它會讀 stdin。**
- ⚠️ **`stress_hhmd.py` / `stress_pcie.py` 已於 2026-08-17 由 KC 移除**Status 表 ScriptB #5/#7)。 - ⚠️ **`stress_hhmd.py` / `stress_pcie.py` 已於 2026-08-17 由 KC 移除**Status 表 ScriptB #5/#7)。
Script B 現在是 **8 個背景 job**1 mlucas + 5 mem + ssd + usb),不是 10 個。 Script B 現在是 **8 個背景 job**1 mlucas + 5 mem + ssd + usb),不是 10 個。
I2C/PCIe 的持續讀取壓力目前沒有替代品。 I2C/PCIe 的持續讀取壓力目前沒有替代品。
- ⚠️ **`pause` 是停 macro`sleep` 是停 DUT**V1.2.0 起 A/B/C 一律用後者):`pause N` 期間 macro 不理會
DUT,shell 是閒著的,等於用猜的估上一個指令跑多久;`sendln "sleep N"` + `wait prompt_sonic_root`
把等待放到 DUT 上,prompt 回來才繼續,兩邊不會走散,而且這一段會帶時戳進 log。
**Script 4 / Script 5 尚未轉換,仍在用 `pause`**B/C 開頭那個 `pause 1` 也保留(登入前沒有 prompt 可等)
- ⚠️ **soak 迴圈沒有 `pause`**:取樣間隔不是 Status 表寫的 10 分鐘,而是取決於指令執行時間。 - ⚠️ **soak 迴圈沒有 `pause`**:取樣間隔不是 Status 表寫的 10 分鐘,而是取決於指令執行時間。
`-u 0` 已於 `491e807` 移除,A/B/C 現在都跑兩個 switch unit。) `-u 0` 已於 `491e807` 移除,A/B/C 現在都跑兩個 switch unit。)
- 🔒 **`.sh` / `.conf` 一定要 LF**。CRLF 的 shell script 在 SONiC 上直接掛(`$'\r': command not found`); - 🔒 **`.sh` / `.conf` 一定要 LF**。CRLF 的 shell script 在 SONiC 上直接掛(`$'\r': command not found`);
@@ -325,6 +354,10 @@ Tera Term 連 COM port (115200-8-N-1)
- ⚠️ **兩張管理網卡同網段會 ARP flux**`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,同一個 /24 下 - ⚠️ **兩張管理網卡同網段會 ARP flux**`mgmt_ping_monitor.sh` 讓 eth0/eth1 同時 up,同一個 /24 下
對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張。`ARP_STRICT=1` 擋掉;判讀時看 `RESULT` 行的 對端 ARP 可能由任一張卡回應,回包落在沒送封包的那張。`ARP_STRICT=1` 擋掉;判讀時看 `RESULT` 行的
`nic_tx`/`nic_rx`(該卡自己的 packet delta)—— **ping 成功但 `nic_tx` 接近 0 = 封包從另一張卡出去的** `nic_tx`/`nic_rx`(該卡自己的 packet delta)—— **ping 成功但 `nic_tx` 接近 0 = 封包從另一張卡出去的**
- ⚠️ **BER 的 `clear` 才是把 lane 放回正常運作的動作**V1.2.1 起 Script A 在第一輪流量**之前**跑 BER,
`blanton_ber.sh clear` 與緊接著的 `blanton_traffic_linespeed ps` 之間**沒有任何 settle**。
Script C 是流量報表之後才跑 BER,沒有這個順序問題。第一次上機時比對兩邊的 traffic report ——
**Script A 有 NA/FAIL 而 Script C 沒有,就是 lane 還沒回穩**,在 `clear` 後補一個 `sleep` 即可
- ⚠️ **PRBS 跑起來時 `show interfaces status` 會顯示 DOWN**,那是 link 離開正常運作模式,不是故障。 - ⚠️ **PRBS 跑起來時 `show interfaces status` 會顯示 DOWN**,那是 link 離開正常運作模式,不是故障。
`port_prbs_monitor.sh``start` 因此刻意不印 port status(避免測試員誤判),只在 `prbs clear` 之後的報表裡印 `port_prbs_monitor.sh``start` 因此刻意不印 port status(避免測試員誤判),只在 `prbs clear` 之後的報表裡印
- ⚠️ **`ip -s link` 的欄位順序是 `bytes packets errors ...`**,要 packet 數取的是**第 2 欄**不是第 1 欄 - ⚠️ **`ip -s link` 的欄位順序是 `bytes packets errors ...`**,要 packet 數取的是**第 2 欄**不是第 1 欄
+76
View File
@@ -0,0 +1,76 @@
# v1.2.0 — SerDes DSC capture, and the macro now waits on the DUT
## ✨ New features
**Full-machine SerDes DSC capture, before and after the soak**
* `bcm_dsc_scan.sh` runs `phydiag <port> dsc` through the Broadcom diag shell across the whole port list — one 100G port plus the 200G ranges, about 445 per unit, on both units — and writes the raw log under `Blanton_Script/log/`, then copies it to `/host/hw-eval/jobs/`.
* Script A takes a baseline and Script C takes a closing dump, so the pair brackets the stress run and the two are directly comparable.
* `-u 0` scans one unit, `-f <name>` names the log (`%u``u0`/`u1`, `%t` → timestamp), `-F` overwrites, `-n` dry runs, `-C` skips the copy. A name without `%u` gets `_u0` / `_u1` inserted automatically, so unit 1 can never overwrite unit 0.
* Every run ends with `### DSC_SCAN_DONE rc=<n>`. `rc=0` means every port returned a complete dump.
* `phydiag ... dsc` is read-only — it does not change any SerDes setting.
**`bcm_dsc_parse.sh` turns a raw DSC log into two CSVs**
* `<prefix>_lane.csv` — one row per lane: TXEQ, RXFFE, DFE, EYE, SNR and the rest.
* `<prefix>_pm.csv` — one row per `pm_id`: temperature, PLL, lane count, SNR/EYE statistics.
* POSIX `sh` + `awk`, no Python, so it runs on the DUT as happily as on a laptop. Lane rows are read by the order of their bracket groups rather than by fixed column positions, so the SDK re-spacing its output does not break parsing; a row that does not yield 9 groups is reported as `UNPARSED` on stderr instead of being parsed wrongly.
**`EN_TX_FIR` in `config.ttl` — the DSC scan is off by default**
* A full scan is about 10 minutes and both Script A and Script C do one, so the shipped default (`0`) keeps ~20 minutes out of a routine run. Set it to `1` when the SerDes data is what you are after.
**The macro now waits on the DUT instead of on itself**
* Every `pause N` in Scripts A, B and C became `sendln "sleep N"` followed by `wait prompt_sonic_root`.
* `pause` stopped the macro for N seconds without touching the DUT — the shell sat idle and the macro was guessing how long the previous command would take. On a loaded DUT the guess ran short and the next command went out before the previous one had finished, putting the whole run a beat ahead of the switch. Now the wait happens on the DUT and the macro resumes when the prompt actually comes back.
* It also means the wait appears in the console log with a timestamp, so a round that ran long is visible afterwards.
* Timings changed with it: the management-ping sample in Script A is 15 s (was 30), the settle after each traffic `clear` is 5 s (was 15). The traffic run itself stays 15 s and Script B's monitor loop stays 60 s.
## 🐛 Bug fixes
**The DSC scan only ever scanned one port — and reported success**
* The scan loop read its port list on stdin, and `bcmcmd` reads stdin too, so the first call swallowed the rest of the file and the loop ended after a single port.
* Nothing looked wrong. The log held one port marker and one dsc block, the marker-to-dump comparison passed because both numbers shrank together, the exit code was 0, and a 445-port scan simply finished in seconds.
* The loop now reads on file descriptor 3 and `bcmcmd` is given `< /dev/null`, and there is a new check that the number of iterations matches the number of ports in the list — a check that cannot be fooled by the loop ending early.
**Dead call sites removed from Scripts A, B and C**
* The commented-out 100G PRBS calls, a duplicated commented 100G port-status block in Script A, and the stale `bmc_monitor_ddr.sh` block in Script C have been deleted. They had been dead since bring-up.
* `port_prbs_monitor.sh` still ships and still runs by hand — but re-enabling it means writing the calls again, not un-commenting them.
## 🔧 Changes
* **Script C no longer prints the BMC poll log or the mlucas log to the console.** Both files are still copied to `/host/hw-eval/jobs/` and out to the USB stick with everything else; only the master log got shorter.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.2.0.zip` | The full Tera Term working directory, including `Blanton_Script/` to copy onto the DUT |
**After copying to the DUT:**
```bash
chmod +x ~/Blanton_Script/*.sh # bcm_dsc_scan.sh is invoked as ./Blanton_Script/... and needs it
grep -rlU $'\r' ~/Blanton_Script # expect no output
ls ~/hammer/tools/amd/mlucas-avx2 # must already be there
```
## ⚠️ Before you run
* **Replace `config.ttl` along with the macros.** `EN_TX_FIR` is new, and Tera Term aborts on an undefined variable rather than treating it as 0.
* **`bcm_dsc_scan.sh` needs the execute bit.** Script A and Script C invoke it as `./Blanton_Script/bcm_dsc_scan.sh`. Without `chmod +x` it fails with `Permission denied`, the macro walks straight past it, and Script C's four `cp` lines then each report a missing file.
* **The DSC scan shares the ports with `blanton_ber.sh`, `blanton_traffic_linespeed` and `blanton_tr518.sh`** — do not run it alongside any of them.
* **Script 4 and Script 5 still use `pause`.** Only A, B and C were converted.
* **`--runtime` is the job's overall limit, not a per-pass one.** `--passes` does not extend it; for a 24 hour soak set `RUNTIME` to `86400`.
* **Script 4 has no teardown**: finish it with `blanton_tr518.sh stop` **and** `systemctl stop mlucas-amm`.
* **Script 5 (reboot cycle) is still unverified on hardware**, has no exit condition, and its `wait "Booting in blind mode"` has no `timeout` guard.
* **`blanton_multiphase_margin.sh save` is permanent**, and must not be mixed with `margin.sh`.
* **`READ_VIN` and `READ_IIN` are still not in the ADPM12200 coefficient table.**
* **The BMC USB service log only exists on the USB stick.**
* **`FAN_SPEED` is 100.**
* **Still unverified from v1.1.0**: the `ce0` ingress mirror, the 120 s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop.
## 🔗 Links
* [ARCHITECTURE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/ARCHITECTURE.md) — test flow, data models, constraints
* [CLAUDE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/CLAUDE.md) — commands and the bench gotchas
* [Blanton_Test_Flow.drawio](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/Blanton_Test_Flow.drawio) — the scripts side by side
**Full changelog:** [V1.1.8...V1.2.0](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.1.8...V1.2.0)
+49
View File
@@ -0,0 +1,49 @@
# v1.2.1 — A BER baseline, so the SerDes numbers have something to be compared against
## ✨ New features
**Script A now takes a SerDes BER sweep before the first traffic run**
* `blanton_ber.sh init → start → sleep 30 → report → stop → clear`, branched on `SWB_UNIT0` / `SWB_UNIT1` exactly like the traffic block beside it.
* Script C already ran the closing sweep after its traffic report. With this one at the front, the pair brackets the soak — the same shape as the DSC scans added in v1.2.0, and the same reason: a BER figure on its own says very little, a *change* in it says a lot.
* The `sleep 30` matches `blanton_ber.sh`'s `BER_INTERVAL`. Reporting before one full interval has accumulated reads a window that has not finished, and nothing warns you about it.
## 🐛 Bug fixes
**The new block's comment described the wrong position**
* It was copied out of Script C, which runs BER *after* the traffic report, and the comment came with it and still said "after". In Script A the block runs *before* traffic. The comment now says what the code does and why the ordering is what it is.
## ⚠️ Before you run
* **Watch Script A's first traffic report on the first run.** PRBS holds the lanes out of normal operation and `blanton_ber.sh clear` is what releases them — and in Script A nothing settles between that `clear` and the `blanton_traffic_linespeed ps` / `init` that follows. Script C does not have this ordering, so the two reports are a built-in comparison: **if Script A shows NA or FAIL pairs that Script C does not, the lanes had not come back yet**, and a `sleep` after `clear` is the fix. This has not been run on hardware yet.
* **`sleep 30` and `BER_INTERVAL` now live in three places** — Script A, Script C, and `blanton_ber.sh` itself. Changing one without the others silently reports a partial interval.
* **BER, `blanton_traffic_linespeed` and `blanton_tr518.sh` cannot overlap.** They all take over the same ports. Script A now touches those ports twice before the soak even starts.
* **`EN_TX_FIR` is still 0 by default**, so the DSC scans do not run unless you turn them on; a full scan is ~10 min in each of Script A and Script C.
* **Replace `config.ttl` along with the macros.** Tera Term aborts the macro on an undefined variable rather than treating it as 0.
* **`bcm_dsc_scan.sh` needs the execute bit**: `chmod +x ~/Blanton_Script/*.sh` after copying.
* **`--runtime` is the job's overall limit, not a per-pass one.** `--passes` does not extend it.
* **Script 4 has no teardown**: finish it with `blanton_tr518.sh stop` **and** `systemctl stop mlucas-amm`.
* **Script 5 (reboot cycle) has no exit condition.** A 199-cycle / 60-hour run has now been analysed: PCIe AER stayed at 0, all 218 traffic pairs and all 864 lanes passed every cycle, and the BMC never reset. Two things it did surface — `bmc-first-enroll` does not exist on that BMC build, and NFC returned FAIL on every cycle.
* **`blanton_multiphase_margin.sh save` is permanent**, and must not be mixed with `margin.sh`.
* **`READ_VIN` and `READ_IIN` are still not in the ADPM12200 coefficient table.**
* **The BMC USB service log only exists on the USB stick.**
* **`FAN_SPEED` is 100.**
* **Still unverified from v1.1.0**: the `ce0` ingress mirror, the 120 s settle in `blanton_tr518.sh`, and `test mode nr=no` on stop.
## 📦 Downloads
| File | Contents |
|---|---|
| `Script_ABC_Blanton_V1.2.1.zip` | The full Tera Term working directory, including `Blanton_Script/` to copy onto the DUT |
```bash
chmod +x ~/Blanton_Script/*.sh
grep -rlU $'\r' ~/Blanton_Script # expect no output
ls ~/hammer/tools/amd/mlucas-avx2 # must already be there
```
## 🔗 Links
* [ARCHITECTURE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/ARCHITECTURE.md) — test flow, data models, constraints
* [CLAUDE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/CLAUDE.md) — commands and the bench gotchas
**Full changelog:** [V1.2.0...V1.2.1](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.2.0...V1.2.1)
+221 -12
View File
@@ -1,7 +1,7 @@
; ============================================================================= ; =============================================================================
; Script A for Blanton ; Script A for Blanton
; Version : V1.1.9 ; Version : V1.2.2
; Date : 2026-09-07 ; Date : 2026-09-09
; Author : ETWen ; Author : ETWen
; ============================================================================= ; =============================================================================
; Version History: ; Version History:
@@ -484,6 +484,156 @@
; bmc_monitor.sh and friends in the chmod +x line after ; bmc_monitor.sh and friends in the chmod +x line after
; deployment. Without it both scans fail with Permission ; deployment. Without it both scans fail with Permission
; denied and the macro walks straight past it ; denied and the macro walks straight past it
; V1.2.0 2026-09-07
; Blanton_Script/bcm_dsc_scan.sh v1.3.0 bcmcmd was eating the port list
; The scan loop read the port file on stdin, and bcmcmd
; reads stdin too, so the first call swallowed the rest of
; the file and the loop ended after ONE port
; Nothing looked wrong: the log held one PORT marker and
; one dsc block, markers == dumps, exit code 0. A 445 port
; scan finished in seconds and reported success
; Fixed by reading the loop on fd 3 (done 3< "$PORTFILE")
; and giving bcmcmd < /dev/null
; Added a check that the iteration count equals the port
; list count. The marker / dump comparison cannot catch a
; loop that ends early, because both numbers shrink
; together; the Saved: line now reports dumps out of TOTAL,
; not out of markers
; !! this is the same bcmcmd trap
; blanton_traffic_linespeed.sh hit at v0.3.1, where only
; the first VLAN was configured. Every while ... done <
; file loop that calls bcmcmd needs < /dev/null - assume
; it will read stdin unless proven otherwise
; ScriptA / ScriptB / ScriptC Wait on the DUT with 'sleep', not on the macro with 'pause'
; pause N stops the macro for N seconds without touching
; the DUT: the shell sits idle and the macro is guessing
; how long the last command took. sendln "sleep N" + wait
; prompt_sonic_root moves the wait onto the DUT, so the
; macro resumes when the prompt actually comes back and the
; two cannot drift apart
; It also lands in the console log with a timestamp, so a
; round that ran long is visible afterwards instead of
; invisible
; Durations changed with it: ScriptA mgmt ping 30 -> 15 s;
; the settle after every traffic 'clear' 15 -> 5 s; the
; traffic run itself stays 15 s; ScriptB's monitor loop
; stays 60 s
; !! Script4 and Script5 were NOT converted and still use
; pause. The 'pause 1' at the top of ScriptB / ScriptC
; also stays - it only spaces the log header and runs
; before there is a prompt to wait for
; config.ttl Add EN_TX_FIR to gate the SerDes DSC scan
; EN_TX_FIR = 1 enables bcm_dsc_scan.sh in ScriptA and
; ScriptC, and the four cp lines that carry
; blanton_dsc_Script{A,C}_u{0,1}.log to /host/hw-eval/jobs.
; Default is 0
; A full scan is ~10 min and both scripts do one, so
; leaving it off keeps ~20 min out of a routine run. Turn
; it on when the SerDes data is what you are after
; ScriptC Stop printing the BMC poll and mlucas logs to the console
; cat bmc_poll.log and cat mlucas_amm_log are commented
; out. Both files are still copied to /host/hw-eval/jobs
; and out to the USB stick with everything else, so no data
; is lost - the master log is just shorter
; V1.2.1 2026-09-08
; ScriptA Add a BER baseline sweep before the traffic run
; blanton_ber.sh init / start / sleep 30 / report / stop /
; clear, branched on SWB_UNIT0 and SWB_UNIT1 the same way
; the traffic block is. ScriptC already took the closing
; sweep after its traffic report, so the two now bracket
; the soak the way the DSC scans do
; sleep 30 is not arbitrary: it is blanton_ber.sh's
; BER_INTERVAL. 'report' before one full interval has
; accumulated reads a window that has not finished
; The block was copied from ScriptC, which runs it AFTER
; traffic, and its comment said so. In ScriptA it runs
; BEFORE traffic, so the comment was rewritten to match
; where the code actually is
; !! nothing settles between 'blanton_ber.sh clear' and
; 'blanton_traffic_linespeed ps' that follows it. PRBS
; holds the lanes out of normal operation and 'clear' is
; what releases them, so the first traffic run of
; ScriptA now starts on lanes that have just been
; released. ScriptC does not have this ordering. Watch
; ScriptA's first traffic report for NA or FAIL pairs
; that ScriptC's does not show - if they appear, a sleep
; after 'clear' is the fix
; !! ScriptA now runs BER twice as far as the switch is
; concerned: once here and once inside ScriptC. Neither
; can overlap blanton_traffic_linespeed or
; blanton_tr518.sh - they all take over the same ports
; V1.2.2 2026-09-09
; 5_.._Boot_Cycle.ttl Renamed from 5_Blanton_Script_Reboot_Cycle.ttl
; It does warm and cold now, so 'Reboot' was too narrow.
; Same macro otherwise - git records it as a rename
; 5_.._Boot_Cycle.ttl Warm or cold boot, chosen by EN_Cold_Warm_boot
; 1 = 'reboot' (warm, what the macro always did). 2 = cold,
; by writing the CB FPGA: pcimem
; /sys/bus/pci/devices/0000:05:00.0/resource0 0x480 w
; 0xD0000. 0 = neither
; !! EN_Cold_Warm_boot = 0 hangs the macro. Neither branch
; runs, so nothing reboots, and the 'wait "Booting in
; blind mode"' underneath has no timeout - cycle 1
; finishes and the macro then waits for a boot that will
; never come. 0 is the value for the A/B/C flow, where
; this macro is not used at all; do not run ScriptBoot
; with it
; !! 0x480 is ICB_CTRL_REG in
; docs/Blantons_FPGA_Registers.md, and that table
; carries no bit definitions for it. 0xD0000 is not
; written down anywhere in this repo either. Whoever
; knows what those bits do should put it in the register
; doc before someone changes the value
; !! the BDF 0000:05:00.0 is hard-coded here, while
; blanton_fpga_pcimem.sh auto-detects the CB FPGA
; precisely because it moves per unit (see the V1.0.x
; notes and Key Constraints #4). On a DUT where the FPGA
; is not at 05:00.0 this becomes a raw 32-bit write to
; an unknown register on some other device. Verify the
; BDF on every unit before running the cold path
; !! NOT verified on hardware. The warm path has 199 cycles
; behind it; the cold path has none
; 5_.._Boot_Cycle.ttl Truncate the two stress logs before each run
; rm -rf /host/hw-eval/jobs/qfx5252-stress-ssd.log and the
; usb one, added ahead of each qfx5252-stress-* call
; qfx5252-stress-* APPENDS to its --log file and the macro
; cats the whole thing afterwards, so every cycle printed
; back everything the ones before it had written
; Measured on the 199 cycle log from 2026-09-04: cycle 1
; printed 289 lines, cycle 199 printed 36,555. At ~6.2 ms a
; line - which is what a 115200 baud console costs - that
; is +212 s of the +214 s the cycle grew over the run. The
; stress itself is fixed at --runtime 30, and the other
; eleven segments between check points drifted by less than
; 1.5 s each. The DUT was never getting slower; the test
; was reading its own history aloud once per cycle
; 5_.._Boot_Cycle.ttl Name the log file and the banner after the kind of boot
; EN_Cold_Warm_boot = 1 gives
; Logs\Blanton_Reboot_Cycle_<ts>.log and a 'Reboot Cycle :
; N' banner; = 2 gives Blanton_Power_Cycle_<ts>.log and
; 'Power Cycle : N'. Three sites now branch on the flag:
; the log name, the banner and the boot itself
; !! with 0 there is no longer a logopen either, so the run
; that already hangs at wait "Booting in blind mode" now
; also leaves no log to show where it stopped. EN_log =
; 1 no longer guarantees a log in this macro -
; EN_Cold_Warm_boot has to be 1 or 2 as well
; !! anything that parses these logs has to accept BOTH
; banners. The cycle banner is the record separator the
; check-point and per-segment timing reports are built
; on, so a parser that only greps 'Reboot Cycle :' finds
; zero cycles in a power-cycle log and silently reports
; nothing at all
; The logopen timestamp flag is still a literal 1 here
; rather than EN_timestamp the way ScriptA does it. Leaving
; it on is the right call - the per-segment timing analysis
; is derived from those timestamps and there is nothing
; else to recover them from - but it does mean this macro
; ignores EN_timestamp = 0
; config.ttl Add EN_Cold_Warm_boot
; 0 = normal test (A/B/C), 1 = reboot cycle, 2 = power
; cycle. Default 0 so that opening the shared config cannot
; reboot anyone's DUT by accident
; ============================================================================= ; =============================================================================
include "config.ttl" include "config.ttl"
@@ -649,7 +799,8 @@ include "utils/show_dmesg.ttl"
wait prompt_sonic_root wait prompt_sonic_root
sendln "./Blanton_Script/mgmt_ping_monitor.sh start" sendln "./Blanton_Script/mgmt_ping_monitor.sh start"
wait prompt_sonic_root wait prompt_sonic_root
pause 30 sendln "sleep 15"
wait prompt_sonic_root
sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop" sendln "~/Blanton_Script/mgmt_ping_monitor.sh stop"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cat ~/Blanton_Script/log/mgmt_ping.log" sendln "cat ~/Blanton_Script/log/mgmt_ping.log"
@@ -692,6 +843,56 @@ sendln "config feature state lldp disabled"
wait prompt_sonic_root wait prompt_sonic_root
sendln "config save -y" sendln "config save -y"
; ========== BER ==========
; Baseline sweep, taken BEFORE the traffic run - ScriptC takes the closing
; one after its traffic report, so the pair brackets the soak.
; PRBS takes the SerDes out of normal operation; 'clear' is what puts the
; lanes back, so it has to run before the traffic block below.
; sleep 30 matches blanton_ber.sh BER_INTERVAL - reporting earlier reads an
; interval that has not finished accumulating.
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh init"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh start"
wait prompt_sonic_root
sendln "sleep 30"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh report"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh stop"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh clear"
elseif SWB_UNIT0 = 1 && SWB_UNIT1 = 0 then
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh init -u 0"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh start -u 0"
wait prompt_sonic_root
sendln "sleep 30"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh report -u 0"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh stop -u 0"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh clear -u 0"
elseif SWB_UNIT0 = 0 && SWB_UNIT1 = 1 then
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh init -u 1"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh start -u 1"
wait prompt_sonic_root
sendln "sleep 30"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh report -u 1"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh stop -u 1"
wait prompt_sonic_root
sendln "./Blanton_Script/blanton_ber.sh clear -u 1"
else
endif
if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed ps" sendln "blanton_traffic_linespeed ps"
@@ -700,12 +901,14 @@ if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear" sendln "blanton_traffic_linespeed clear"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show" sendln "blanton_traffic_linespeed show"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start" sendln "blanton_traffic_linespeed start"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 15"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed stop" sendln "blanton_traffic_linespeed stop"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed report" sendln "blanton_traffic_linespeed report"
@@ -717,12 +920,14 @@ elseif SWB_UNIT0 = 1 && SWB_UNIT1 = 0 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear -u 0" sendln "blanton_traffic_linespeed clear -u 0"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show -u 0" sendln "blanton_traffic_linespeed show -u 0"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start -u 0" sendln "blanton_traffic_linespeed start -u 0"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 15"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed stop -u 0" sendln "blanton_traffic_linespeed stop -u 0"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed report -u 0" sendln "blanton_traffic_linespeed report -u 0"
@@ -734,12 +939,14 @@ elseif SWB_UNIT0 = 0 && SWB_UNIT1 = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear -u 1" sendln "blanton_traffic_linespeed clear -u 1"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show -u 1" sendln "blanton_traffic_linespeed show -u 1"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start -u 1" sendln "blanton_traffic_linespeed start -u 1"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 15"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed stop -u 1" sendln "blanton_traffic_linespeed stop -u 1"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed report -u 1" sendln "blanton_traffic_linespeed report -u 1"
@@ -747,9 +954,11 @@ else
endif endif
; ========== Collect bcm dsc data ========== if EN_TX_FIR = 1 then
wait prompt_sonic_root ; ========== Collect bcm dsc data ==========
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptA.log -F" wait prompt_sonic_root
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptA.log -F"
endif
; ========== Show Power on uptime ========== ; ========== Show Power on uptime ==========
wait prompt_sonic_root wait prompt_sonic_root
+11 -6
View File
@@ -109,7 +109,8 @@ timeout = 0
wait prompt_sonic_root wait prompt_sonic_root
sendln "./Blanton_Script/mgmt_ping_monitor.sh start" sendln "./Blanton_Script/mgmt_ping_monitor.sh start"
wait prompt_sonic_root wait prompt_sonic_root
pause 3 sendln "sleep 3"
wait prompt_sonic_root
sendln "./Blanton_Script/mgmt_ping_monitor.sh status" sendln "./Blanton_Script/mgmt_ping_monitor.sh status"
; ========== NFC Test ========== ; ========== NFC Test ==========
@@ -139,7 +140,8 @@ if SWB_UNIT0 = 1 && SWB_UNIT1 = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear" sendln "blanton_traffic_linespeed clear"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show" sendln "blanton_traffic_linespeed show"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start" sendln "blanton_traffic_linespeed start"
@@ -151,7 +153,8 @@ elseif SWB_UNIT0 = 1 && SWB_UNIT1 = 0 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear -u 0" sendln "blanton_traffic_linespeed clear -u 0"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show -u 0" sendln "blanton_traffic_linespeed show -u 0"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start -u 0" sendln "blanton_traffic_linespeed start -u 0"
@@ -163,7 +166,8 @@ elseif SWB_UNIT0 = 0 && SWB_UNIT1 = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed clear -u 1" sendln "blanton_traffic_linespeed clear -u 1"
wait prompt_sonic_root wait prompt_sonic_root
pause 15 sendln "sleep 5"
wait prompt_sonic_root
sendln "blanton_traffic_linespeed show -u 1" sendln "blanton_traffic_linespeed show -u 1"
wait prompt_sonic_root wait prompt_sonic_root
sendln "blanton_traffic_linespeed start -u 1" sendln "blanton_traffic_linespeed start -u 1"
@@ -173,7 +177,7 @@ endif
; ========== Monitor loop: platform data + background jobs (pause 60s per round) ========== ; ========== Monitor loop: platform data + background jobs (sleep 60s per round) ==========
while 1 while 1
include "utils/setup_pmon.ttl" include "utils/setup_pmon.ttl"
wait prompt_sonic_root wait prompt_sonic_root
@@ -182,5 +186,6 @@ while 1
sendln "jobs" sendln "jobs"
wait prompt_sonic_root wait prompt_sonic_root
sendln "systemctl is-active mlucas-amm" sendln "systemctl is-active mlucas-amm"
pause 60 wait prompt_sonic_root
sendln "sleep 60"
endwhile endwhile
+20 -16
View File
@@ -53,8 +53,8 @@ sendln "/usr/sbin/ras-mc-ctl --summary"
; ========== BMC Monitor TAKE DATA ========== ; ========== BMC Monitor TAKE DATA ==========
wait prompt_sonic_root wait prompt_sonic_root
sendln "./Blanton_Script/bmc_monitor.sh stop" sendln "./Blanton_Script/bmc_monitor.sh stop"
wait prompt_sonic_root ; wait prompt_sonic_root
sendln "cat ./Blanton_Script/log/bmc_poll.log" ; sendln "cat ./Blanton_Script/log/bmc_poll.log"
; ========== BMC USB Test result ========== ; ========== BMC USB Test result ==========
wait prompt_sonic_root wait prompt_sonic_root
@@ -64,8 +64,8 @@ sendln "journalctl -u qfx5252-bmc-usb-net-test.service --no-pager -o short-iso >
; ========== CHECK Stress results ========== ; ========== CHECK Stress results ==========
wait prompt_sonic_root ; wait prompt_sonic_root
sendln "cat ~/hammer/tools/amd/mlucas_amm_log" ; sendln "cat ~/hammer/tools/amd/mlucas_amm_log"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cat /host/hw-eval/jobs/qfx5252-stress-ssd.log" sendln "cat /host/hw-eval/jobs/qfx5252-stress-ssd.log"
wait prompt_sonic_root wait prompt_sonic_root
@@ -150,10 +150,11 @@ else
endif endif
; ========== Collect bcm dsc data ========== if EN_TX_FIR = 1 then
wait prompt_sonic_root ; ========== Collect bcm dsc data ==========
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptC.log -F" wait prompt_sonic_root
sendln "./Blanton_Script/bcm_dsc_scan.sh -f blanton_dsc_ScriptC.log -F"
endif
; ========== NVME Err Info ========== ; ========== NVME Err Info ==========
wait prompt_sonic_root wait prompt_sonic_root
@@ -199,14 +200,17 @@ wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/mgmt_ping.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/mgmt_ping.log /host/hw-eval/jobs/"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/nfc_poll.log /host/hw-eval/jobs/"
wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u0.log /host/hw-eval/jobs/" if EN_TX_FIR = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u1.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u0.log /host/hw-eval/jobs/"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u0.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptA_u1.log /host/hw-eval/jobs/"
wait prompt_sonic_root wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u1.log /host/hw-eval/jobs/" sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u0.log /host/hw-eval/jobs/"
wait prompt_sonic_root
sendln "cp ./Blanton_Script/log/blanton_dsc_ScriptC_u1.log /host/hw-eval/jobs/"
endif
wait prompt_sonic_root wait prompt_sonic_root
getdate ts_date "%Y%m%d" getdate ts_date "%Y%m%d"
@@ -8,8 +8,14 @@ gettime str_starttime "%Y%m%d-%H%M%S"
getdir mdir getdir mdir
if EN_log = 1 then if EN_log = 1 then
if EN_Cold_Warm_boot = 1 then
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name "Reboot_Cycle" str_starttime sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name "Reboot_Cycle" str_starttime
logopen filename 0 1 1 1 logopen filename 0 1 1 1
elseif EN_Cold_Warm_boot = 2 then
sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name "Power_Cycle" str_starttime
logopen filename 0 1 1 1
else
endif
endif endif
cnt_cycle = 0 cnt_cycle = 0
@@ -26,9 +32,16 @@ while 1
wait prompt_sonic_root wait prompt_sonic_root
sendln "sleep 10" sendln "sleep 10"
if EN_Cold_Warm_boot = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sprintf2 strTitle "echo -e '\033[1;32mReboot Cycle : %d \033[0m'" cnt_cycle sprintf2 strTitle "echo -e '\033[1;32mReboot Cycle : %d \033[0m'" cnt_cycle
sendln strTitle sendln strTitle
elseif EN_Cold_Warm_boot = 2 then
wait prompt_sonic_root
sprintf2 strTitle "echo -e '\033[1;32mPower Cycle : %d \033[0m'" cnt_cycle
sendln strTitle
else
endif
; ========== Pre Setting ========== ; ========== Pre Setting ==========
; Make log directory ; Make log directory
@@ -172,6 +185,8 @@ while 1
sprintf2 strCKPt5 "echo -e '\033[36mCheck Pt5 : SSD Test\033[0m'" sprintf2 strCKPt5 "echo -e '\033[36mCheck Pt5 : SSD Test\033[0m'"
sendln strCKPt5 sendln strCKPt5
wait prompt_sonic_root
sendln "rm -rf /host/hw-eval/jobs/qfx5252-stress-ssd.log"
wait prompt_sonic_root wait prompt_sonic_root
sendln "qfx5252-stress-ssd 1G --runtime 30 --passes 2 --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log" sendln "qfx5252-stress-ssd 1G --runtime 30 --passes 2 --write --force --log /host/hw-eval/jobs/qfx5252-stress-ssd.log"
wait prompt_sonic_root wait prompt_sonic_root
@@ -189,6 +204,8 @@ while 1
waitregex '<<DEV=([^>]*)>>' waitregex '<<DEV=([^>]*)>>'
usb_dev = groupmatchstr1 usb_dev = groupmatchstr1
wait prompt_sonic_root
sendln "rm -rf /host/hw-eval/jobs/qfx5252-stress-usb.log"
wait prompt_sonic_root wait prompt_sonic_root
sprintf2 cmd "qfx5252-stress-usb %s 256M --runtime 30 --passes 2 --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev sprintf2 cmd "qfx5252-stress-usb %s 256M --runtime 30 --passes 2 --write --log /host/hw-eval/jobs/qfx5252-stress-usb.log" usb_dev
sendln cmd sendln cmd
@@ -412,8 +429,15 @@ while 1
sendln "show uptime" sendln "show uptime"
; ========== Show Power on uptime ========== ; ========== Show Power on uptime ==========
if EN_Cold_Warm_boot = 1 then
wait prompt_sonic_root wait prompt_sonic_root
sendln "reboot" sendln "reboot"
elseif EN_Cold_Warm_boot = 2 then
wait prompt_sonic_root
sendln "pcimem /sys/bus/pci/devices/0000:05:00.0/resource0 0x480 w 0xD0000"
else
endif
wait "Booting in blind mode" wait "Booting in blind mode"
endwhile endwhile
@@ -12,6 +12,9 @@
# 避免灌爆 Tera Term logopen 的 log # 避免灌爆 Tera Term logopen 的 log
# V1.2.0 20260906 新增 -f 自訂 log 檔名(支援 %u / %t 佔位符)與 # V1.2.0 20260906 新增 -f 自訂 log 檔名(支援 %u / %t 佔位符)與
# -F 強制覆蓋;預設不覆蓋既有檔案,自動加序號 # -F 強制覆蓋;預設不覆蓋既有檔案,自動加序號
# V1.3.0 20260907 修正 bcmcmd 讀取 stdin 導致掃描迴圈在第一筆之後
# 提前結束的問題(迴圈改用 fd 3,bcmcmd 導向
# /dev/null);新增實際迭代筆數與清單筆數的檢查
# #
# Description: # Description:
# 在 Blanton SONiC DUT 上批次執行 Broadcom diag shell 的 # 在 Blanton SONiC DUT 上批次執行 Broadcom diag shell 的
@@ -278,16 +281,18 @@ for U in $UNITS; do
: > "$LOG" || { echo "ERROR: cannot write $LOG" >&2; exit 2; } : > "$LOG" || { echo "ERROR: cannot write $LOG" >&2; exit 2; }
LOGS="$LOGS $LOG" LOGS="$LOGS $LOG"
printf '### SCAN_BEGIN unit=%s time=%s total=%s script=bcm_dsc_scan_V1.1.0\n' \ printf '### SCAN_BEGIN unit=%s time=%s total=%s script=bcm_dsc_scan_V1.3.0\n' \
"$U" "$(date '+%Y-%m-%d %H:%M:%S')" "$TOTAL" >> "$LOG" "$U" "$(date '+%Y-%m-%d %H:%M:%S')" "$TOTAL" >> "$LOG"
echo "[unit $U] scanning $TOTAL ports -> $LOG" >&2 echo "[unit $U] scanning $TOTAL ports -> $LOG" >&2
SEQ=0 SEQ=0
while IFS=, read -r P SPD; do while IFS=, read -r P SPD <&3; do
SEQ=$((SEQ + 1)) SEQ=$((SEQ + 1))
printf '### PORT unit=%s port=%s speed=%s seq=%s/%s\n' "$U" "$P" "$SPD" "$SEQ" "$TOTAL" >> "$LOG" printf '### PORT unit=%s port=%s speed=%s seq=%s/%s\n' "$U" "$P" "$SPD" "$SEQ" "$TOTAL" >> "$LOG"
bcmcmd -n "$U" -c "dsh -c 'phydiag $P dsc'" >> "$LOG" 2>&1 || RC=1 # bcmcmd 會讀取 stdin,若不導成 /dev/null 會把 PORTFILE 剩餘內容吸走,
# 導致迴圈在第一筆之後就讀到 EOF 而提前結束。
bcmcmd -n "$U" -c "dsh -c 'phydiag $P dsc'" >> "$LOG" 2>&1 < /dev/null || RC=1
if [ "$TTY" -eq 1 ]; then if [ "$TTY" -eq 1 ]; then
printf '\r[unit %s] %s/%s port=%-5s' "$U" "$SEQ" "$TOTAL" "$P" >&2 printf '\r[unit %s] %s/%s port=%-5s' "$U" "$SEQ" "$TOTAL" "$P" >&2
@@ -296,19 +301,26 @@ for U in $UNITS; do
fi fi
sleep "$DELAY" sleep "$DELAY"
done < "$PORTFILE" done 3< "$PORTFILE"
[ "$TTY" -eq 1 ] && printf '\n' >&2 [ "$TTY" -eq 1 ] && printf '\n' >&2
printf '### SCAN_END unit=%s time=%s\n' "$U" "$(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG" printf '### SCAN_END unit=%s time=%s\n' "$U" "$(date '+%Y-%m-%d %H:%M:%S')" >> "$LOG"
# 概略檢查:每筆 PORT marker 應對應一個 dsc 區塊 # 檢查 1:實際迭代筆數是否等於 port 清單筆數。
# 迴圈若因 stdin 被子程序吸走而提前結束,只靠下面的 marker/dump 比對抓不到。
if [ "$SEQ" -ne "$TOTAL" ]; then
echo "ERROR: unit $U 只跑了 $SEQ/$TOTAL 筆,迴圈提前結束" >&2
RC=1
fi
# 檢查 2:每筆 PORT marker 應對應一個 dsc 區塊
MARK=$(grep -c '^### PORT ' "$LOG" || true) MARK=$(grep -c '^### PORT ' "$LOG" || true)
DUMP=$(grep -c 'SERDES DISPLAY DIAG DATA END' "$LOG" || true) DUMP=$(grep -c 'SERDES DISPLAY DIAG DATA END' "$LOG" || true)
if [ "$MARK" -ne "$DUMP" ]; then if [ "$MARK" -ne "$DUMP" ]; then
echo "WARN: unit $U markers=$MARK dsc_blocks=$DUMP (有 port 未取得完整 dump)" >&2 echo "WARN: unit $U markers=$MARK dsc_blocks=$DUMP (有 port 未取得完整 dump)" >&2
RC=1 RC=1
fi fi
echo "Saved: $LOG (${DUMP}/${MARK} dumps)" >&2 echo "Saved: $LOG (${DUMP}/${TOTAL} dumps)" >&2
done done
# ---------------------------------------------------------------------------- # ----------------------------------------------------------------------------
+11
View File
@@ -5,6 +5,8 @@ project_name = "Blanton"
strTestcase="ENV" ;ENV,EMC,Margin...etc strTestcase="ENV" ;ENV,EMC,Margin...etc
EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test EN_Margin = 0 ; 1: Enable Margin Test, 0: Disable Margin Test
EN_TX_FIR = 0 ; 1: Enable bcm_dsc_scan.sh collect port TX_FIR, 0: Disable (saves ~20 min: ScriptA and ScriptC each scan for ~10 min)
EN_log = 1 ; 1: Enable log, 0: Disable log EN_log = 1 ; 1: Enable log, 0: Disable log
EN_timestamp = 1 ; 1: Enable timestamp in log, 0: Disable timestamp in log EN_timestamp = 1 ; 1: Enable timestamp in log, 0: Disable timestamp in log
@@ -33,3 +35,12 @@ BMC_USB_RUNTIME = 172800 ; Unit seconds, 172800 = 2 days
prompt_login = "sonic login:" prompt_login = "sonic login:"
prompt_sonic = "admin@sonic:~$" prompt_sonic = "admin@sonic:~$"
prompt_sonic_root = "root@sonic:~#" prompt_sonic_root = "root@sonic:~#"
;================================================================
; Reboot or Power Cycle
;================================================================
; 0: Normal Test
; 1: Enable Reboot Cycle
; 2: Enable Power Cycle
EN_Cold_Warm_boot = 0