• V1.2.7 9c9ec5f4f5

    V1.2.7 Stable

    etwen released this 2026-10-22 14:26:17 +08:00 | 0 commits to main since this release

    v1.2.7 — FDR on the cabled ports only, and the vendor NFC tool updated to v2.5

    🐛 Bug fixes

    blanton_fdr.sh no longer prints the uncabled ports (v1.0.1)

    • The default port list was '1-259,270-565', which also covered ports nothing is cabled to (cd15..19, cd47..51, cd111..115, ...).
    • It is now the cabled-port list from blanton_traffic_linespeed.sh (TL_PS_PORTS), the same one blanton_ber_debug.sh uses:
      1-24,40-96,112-168,184-240,256-259,270-308,310-327,342-380,382-399,414-452,454-471,486-524,526-543,558-565.
    • Script A, B and C pick this up with no change to the TTLs.

    📦 Vendor tool update

    blantons_nfc_validate.py v2.3 → v2.5 — the customer's qfx5252-nfc-validate, renamed to keep the name nfc_polling.sh calls.

    • New: --read-ndef (Type 2 / Type 4 NDEF, Text and AMD FRU records), --write-ndef / --set-location, --max-ndef-bytes; NCI data packets with credit flow control.
    • Fixed: a FileNotFoundError crash while listing the processes that hold the NFC device open.
    • Bad arguments now print [FAIL] and exit 1 — nfc_polling.sh counts that as FAIL, not ERROR.
    • The default test --debug output ([PASS] / [FAIL] lines, NFCID1=) is unchanged, so nfc_polling.sh is not modified.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.7.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    python3 ~/Blanton_Script/blantons_nfc_validate.py --version   # expect 2.5
    

    ⚠️ Before you run

    • Port 268 (ce0, 100G uplink) is not in the FDR list — as before. Add it with FDR_PORTS="...,268" if FDR is wanted there.
    • The cabled-port list now lives in three scripts — blanton_traffic_linespeed.sh, blanton_ber_debug.sh, blanton_fdr.sh. Change all three when the cabling changes.
    • Never put the NFC write flags (--write-ndef, --set-location, --confirm-write) in NFC_ARGS — polling would rewrite the tag every round.
    • blanton_fdr.sh stop (fdrstat STOp) is still unverified on the bench; see v1.2.6.
    • Nothing turns the unused lanes back on; run unused_lanes.sh on by hand. See v1.2.6.
    • blanton_ber.sh (Script A / C) still uses p=3 and sleep 30; see v1.2.5.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.6...V1.2.7

    Downloads
  • V1.2.6 f02ba22924

    etwen released this 2026-10-21 22:55:09 +08:00 | 3 commits to main since this release

    ✨ New features

    blanton_fdr.sh — FDR statistics through phydiag fdrstat

    • Four sub-commands, each run on unit 0 then unit 1, over ports '1-259,270-565':
      start (fdrstat STArt bin_group=both Interval=30), clear (fdrstat clear), rdcnt (fdrstat Counters), stop (fdrstat STOp).
    • Output is printed as is, under a ### [time] unit N: ... header — no parsing, no PASS/FAIL.
    • -u 0 / -u 1 for one switch unit, -i <sec> for the interval, -n for a dry run. FDR_PORTS overrides the port list.

    FDR runs alongside the traffic test in Script A, B and C

    • Script A wraps its traffic baseline: fdr start after init, fdr clear after clear, fdr rdcnt after the run, fdr stop after the traffic stop. The traffic run is now 40 s instead of 15 s, so the counters are read after the first 30 s interval has been published — the same rule as prbsstat Ber.
    • Script B starts and clears FDR with the traffic setup, before the soak loop — the counters run for the whole soak — and reads them (rdcnt) in every soak round, after the Tray ID stress.
    • Script C reads them (rdcnt) before stopping the traffic and stops FDR after it — the closing read of the counters Script B started.

    Script A turns off the unused lanes before the BER baseline

    • unused_lanes.sh off — TX squelch on the unused retimer lanes and TSC31 (cd112-cd115) disabled on the TH6, on both switch boards.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.6.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    

    ⚠️ Before you run

    • chmod +x after deploying. blanton_fdr.sh, unused_lanes.sh and retimer_lanes.sh are all called by path; unused_lanes.sh also refuses to start if retimer_lanes.sh is not executable.
    • blanton_fdr.sh stop sends fdrstat STOp — that keyword is inferred from prbsstat STOp and has not been checked on the bench. bcmcmd exits 0 even when the BCM shell rejects a command, so if it is wrong, FDR keeps running and only the log shows it. Check the first run.
    • FDR only runs when both switch units are enabled (SWB_UNIT0 = SWB_UNIT1 = 1). The single-unit branches have no FDR, and Script A's single-unit traffic run is still 15 s.
    • Script B's per-round fdr rdcnt is not gated by the unit settings — with one unit enabled, FDR was never started and each round just logs whatever fdrstat Counters returns.
    • Nothing turns the unused lanes back on. Script C has no unused_lanes.sh on; run it by hand when the DUT is needed in its normal state. Whether a reboot clears it has not been checked.
    • unused_lanes.sh off is not gated by SWB_UNIT0 / SWB_UNIT1 — it always acts on both boards.
    • blanton_ber.sh (Script A / C) still uses p=3 and sleep 30; see v1.2.5.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.5...V1.2.6

    Downloads
  • V1.2.5 16da1c68f2

    etwen released this 2026-10-21 09:01:55 +08:00 | 7 commits to main since this release

    ✨ New features

    PMON snapshots now carry the switch-board rail power

    • utils/setup_pmon.ttl calls TH6_SWB0_power_readback.sh and TH6_SWB1_power_readback.sh right after show platform current — the 19 rails of each switch board with V × I and a TOTAL POWER line.
    • setup_pmon is shared, so this lands in Script A, B, C, 4 and 5 alike.

    blanton_ber_debug.sh — the hand-run BER flow as one command

    • Runs exactly what tools/BER_Test.txt does: prbs set p=p31 → prbs get twice → prbsstat STArt Interval=30 → sleep 40 → prbsstat Ber → STOp → prbs clear.
    • Every bcmcmd output is printed as is, under a ### [time] unit N: ... header — no parsing, no PASS/FAIL, no summary. For looking at the raw output on the bench; blanton_ber.sh remains the judged version.
    • -u 0 / -u 1 for one switch unit; both by default. BER_POLY, BER_INTERVAL, BER_WAIT and BER_PORTS can be overridden from the environment.

    retimer_lanes.sh / unused_lanes.sh — turn off TX on lanes nothing is cabled to

    • retimer_lanes.sh <asic> <addr> <lane_map> <off|on|status> acts on one Agera3 retimer, sys and line side. --method squelch (default, TX squelch, lanes stay powered) or --method power (TX+RX power-down, needs an agera3 that has the power command). It reads the state back afterwards and prints PASS / FAIL.
    • unused_lanes.sh <off|on|status> applies that to a built-in table — 14 retimer rows and one direct-TH6 row (TSC31, cd112-cd115) — on both switch boards. --asic 0|1|all, --th6 to also disable the TH6 ports behind the retimer rows, --only <target> for a single row. Ends with ok / refused / failed counts.
    • off is refused on a lane that receives a signal (RX PMD lock, or link up on a TH6 port) unless --force is given.

    5_1_Blanton_Script_Boot_Cycle_Fast.ttl — the boot cycle without the traffic run (standalone)

    • Identical to Script 5, except Check Pt8 only runs blanton_traffic_linespeed ps — no init / start / 15 s / stop / report. A shorter cycle when the point is the number of boots.

    Boot cycle shows its count in the window title

    • Script 5 and 5_1 set the Tera Term title to Reboot Cycle Test : n or Power Cycle Test : n each round.

    🐛 Bug fixes

    qfx5252-stress-usb now runs with --force in Script B and in the boot cycles.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.5.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    

    ⚠️ Before you run

    • chmod +x after deploying. The power readbacks are called by path from every PMON snapshot, and unused_lanes.sh refuses to start unless retimer_lanes.sh next to it is executable.
    • Script 4 now reads the switch-board power twice per round — once inside setup_pmon, once from its own loop. Harmless, but the log carries both.
    • blanton_ber_debug.sh uses p=p31 (verified on the bench); blanton_ber.sh, and so Script A / C, still sets p=3. The two may not be measuring the same pattern — do not compare their BER directly until that is settled.
    • blanton_ber_debug.sh leaves out port 268, the same list as BER_Test.txt. Add it with BER_PORTS="...,268".
    • EN_Cold_Warm_boot = 0 (the config.ttl default) hangs Script 5 and 5_1. Set it to 1 (reboot) or 2 (power cycle).
    • Script 5 and 5_1 are two copies of the same macro — a fix to one has to be made to the other.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.4...V1.2.5

    Downloads
  • V1.2.4 4db9b45ce7

    etwen released this 2026-10-01 13:32:24 +08:00 | 12 commits to main since this release

    ✨ New features

    tray_id_stress.sh — Tray ID I2C write / read-back stress

    • Buses 34 / 35 / 38 / 39, device 0x70, register 0x02. Each bus gets 0xA5 written and read back, then 0x5A written and read back — the two patterns put every bit in both states.
    • One line per step (PASS / FAIL / ERROR), then a per-bus Summary table and a single Tray ID stress RESULT: PASS|FAIL line. Exit 0 = all PASS, 1 = any FAIL or I2C error, 2 = bad arguments.
    • FAIL (the read worked but returned the wrong value) and ERROR (i2cset / i2cget itself failed) are counted separately, because they point at different faults.
    • The original register value is read first and written back at the end, verified by a read. -R skips that; -n N repeats the whole sequence N times. Buses, address, register and patterns are editable at the top of the file.

    Script A and Script B run it

    • Script A runs one pass after show_dmesg as the baseline.
    • Script B runs one pass in every soak round, before sleep 60 — 12 writes per round, registers restored each time.

    6_Blanton_Script_BER_Cycle.ttl — Diag ↔ SONiC BER cycle (standalone)

    • Each cycle measures PRBS BER on unit 0 in the Diag OS, cold-boots into SONiC, measures again, and cold-boots back to Diag. while 1, no end. The boot target is picked in the BIOS Boot Manager (USB Device = Diag, Hard Drive = SONiC).
    • Log: Logs\Blanton_BER_Cycle_<ts>.log, timestamps always on.

    🐛 Bug fixes

    prbsstat Ber was read before the first interval had been published — BER read 40–60× low

    • The BER cycle originally read prbsstat Ber 10 s after prbsstat STArt Interval=30. Checked against the error counts that prbs get reports in the same cycle, that read Diag ~60× low and SONiC ~40× low.
    • Moving to sleep 30 (equal to the interval) fixed SONiC but not Diag: its Ber goes out 30.15 s after STArt, just before the first interval is published. SONiC's bcmcmd adds ~0.3 s and just makes it.
    • The macro now uses Interval=30 + sleep 40. Over 73 cycles both sides agree with the prbs get estimate to within 0.1 decade. The rule: the sleep must be longer than the interval.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.4.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    

    ⚠️ Before you run

    • chmod +x after deploying. Script A and B call tray_id_stress.sh by path; without the exec bit every call is Permission denied and the round carries on without the check.
    • Any BER log taken before 2026-09-30 14:13 reads 40–60× low (BER cycle with sleep ≤ Interval). Relative Diag-vs-SONiC trends are usable; absolute values are not.
    • Script A / C's BER is the same edge case: blanton_ber.sh start (Interval=30) → sleep 30 → report, on SONiC. Whether it catches the first interval has not been verified. Lengthening that sleep to 40 is the safe change.
    • The BER cycle's SONiC → Diag boot writes a hard-coded BDF (pcimem /sys/bus/pci/devices/0000:05:00.0/resource0 0x480). Check the CB FPGA BDF on every unit before running it.
    • The BER cycle expects the hostname sonic. A unit with another hostname (e.g. Margin02) needs prompt_sonic / prompt_sonic_root edited, or the macro waits forever.
    • The BER cycle sets the fan to 30 % on the SONiC side only — SONiC runs ~11 °C hotter than Diag, a variable in any Diag-vs-SONiC comparison.
    • Its SONiC password is the YourPaSsWoRd placeholder, and it does not read config.ttl or secret/.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.3...V1.2.4

    Downloads
  • V1.2.3 1d3fb4f929

    etwen released this 2026-09-23 14:44:07 +08:00 | 15 commits to main since this release

    ✨ New features

    Every PMON snapshot now reads DDR5 DIMM and hot-swap controller temperatures

    • utils/setup_pmon.ttl runs ddr5_temp.sh and hsc_temp_readback.sh right after show platform temperature. Because setup_pmon is shared, this lands everywhere a snapshot is taken: Script A's baseline, each Script B soak round, Script C, the Script 4 loop and every Script 5 check point.
    • ddr5_temp.sh reads the SPD5118 hub on each DIMM: i2c bus 5, 0x50 / 0x51, register 0x31 (bit[12:2], sign bit 12, 0.25 °C/LSB). A read that fails prints read fail — never a number it did not read. Bus and addresses can be passed: ddr5_temp.sh [bus] [addr ...].
    • hsc_temp_readback.sh reads both LTC4287 hot-swap controllers on i2c bus 28 — HSC_MAIN @ 0x40 (PU11 internal / PQ1 external) and HSC_STBY @ 0x45 (PU46 internal / PQ53 external). The source is selected through 0xF3, then READ_TEMPERATURE 0x8D is read in Kelvin and converted.

    Script 4 logs AMD CPU package power every round

    • avt_pmpower.sh runs AVTCMD -module pmm "get_pmdata()" and summarizes SktPwr, PPT Fast / PPT Slow against their limits, and MemPwr.
    • It runs after the two TH6_SWB power readbacks, so each sample now puts the switch rails and the CPU package side by side.
    • -q prints the summary only. Exit 2 = AVTCMD not found, 3 = AVTCMD failed, 4 = the PM table parsed to nothing (format changed).

    🐛 Bug fixes

    hsc_temp_readback.sh was saved with CRLF line endings

    • Copied to the DUT as-is, bash on SONiC fails on the first line ($'\r': command not found). The shipped file is LF.
    • Its comments said the delay between I2C transactions was 100 ms; DELAY=0.5 is what actually runs. Comments corrected and a Version History header added.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.3.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script              # expect no output
    ls ~/AVT_Linux_NDA_2.8.37/AVTCMD              # Script 4 only - must already be there
    

    ⚠️ Before you run

    • Redeploy Blanton_Script/. If an earlier copy of hsc_temp_readback.sh reached the DUT, it is CRLF and will not run.
    • chmod +x after deploying. setup_pmon calls both new scripts by path. Without the exec bit each call is Permission denied and the snapshot carries on without those rows — nothing stops, nothing warns.
    • Each PMON snapshot is ~4 s longer. hsc_temp_readback.sh sleeps 0.5 s twice for each of its four readings. It adds up in Script 5, which snapshots at every check point.
    • AVT is not in this package (NDA). Unpack it on the DUT at exactly ~/AVT_Linux_NDA_2.8.37/ before Script 4. Missing, the call exits 2 every round and the loop runs on without a CPU power reading.
    • Script 4 logs the full PM table once a minute, because the call is made without -q.
    • CPU power is SMU telemetry, not a measurement. Its absolute accuracy is whatever the BIOS SVI calibration gives — cross-check against the VR's PMBus READ_POUT when the number matters.
    • None of the three new scripts has been checked against the Script A/B/C flow on hardware yet.
    • Do not run the boot cycle with EN_Cold_Warm_boot = 0, and check the hard-coded BDF on every board before the cold path (see v1.2.2).
    • BER, the DSC cycle, blanton_traffic_linespeed and blanton_tr518.sh cannot overlap. They all take the same ports.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • blanton_multiphase_margin.sh save is permanent, and must not be mixed with margin.sh.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.2...V1.2.3

    Downloads
  • V1.2.2 b911ccd658

    etwen released this 2026-09-15 21:27:40 +08:00 | 18 commits to main since this release

    ✨ New features

    The BER sweep now measures port 268, the 100G uplink

    • The port list ran 256-259 straight to 270-308, so ce0(268) — the 100G uplink — was never in it. It is now its own group alongside the 200G ports.
    • The summary gives each unit three rows: 200G ports, 100G p268, and TOTAL. Unit 0 and unit 1 each have their own ce0(268), and a marginal uplink lane averaged into 432 others is invisible; on its own row it is not.
    • A group that reports no lane at all now counts as a failure, not a pass. Silence on the port under test is the easiest way to ship a green report that measured nothing.

    Script 5 is now a boot cycle, warm or cold

    • 5_Blanton_Script_Reboot_Cycle.ttl → 5_Blanton_Script_Boot_Cycle.ttl, with EN_Cold_Warm_boot in config.ttl choosing: 1 = reboot (warm), 2 = a cold cycle by writing the CB FPGA, 0 = neither.
    • The log file and the per-round banner are named after the kind of boot: Blanton_Reboot_Cycle_<ts>.log / Reboot Cycle : N, or Blanton_Power_Cycle_<ts>.log / Power Cycle : N.
    • Both stress logs are removed before each run. qfx5252-stress-* appends to its --log and the macro cats the whole thing, so every cycle was printing back everything the earlier cycles had written — 289 lines at cycle 1 and 36,555 by cycle 199. At roughly 6.2 ms a line on a 115200 console that accounted for +212 s of the +214 s the cycle grew over a 199-cycle run. The DUT was never getting slower.

    bcm_100g_dsc_cycle.sh — 100G link down/up cycling with SerDes capture

    • Tuning once, then N cycles of port 268 en=0 → wait → en=1 → wait → phydiag 268 dsc on both units → retimer serdes-tx-get / serdes-rx-get for sys 0..7. One log per run under ~/dsc_log/, split by ### TEST CYCLE n/N.
    • Waiting is a poll of bcmcmd ps 268, not show interfaces status. port en= changes the SDK, and the SONiC table only follows once gbsyncd has synced it — and this test pauses gbsyncd.
    • -d echoes every command as a grey [CMD] line before running it; -n is a dry run that touches nothing; the cycle count can be a bare argument (./bcm_100g_dsc_cycle.sh 200).

    🐛 Bug fixes

    blanton_ber.sh init reported a hard error on runs that were working

    • [ERR ] unit 1: the BCM shell rejected 'phydiag ... prbs get' — except the command was fine. prbs get prints one line per lane, a lane that has not locked says PRBS Error!, and the rejection check grepped the whole output case-insensitively for ERROR|Invalid|....
    • Worse than the false alarm: the function returned early, so the lock count that was meant to judge those very lanes never ran. The operator saw an error they could not act on, and did not see which lanes had failed to lock. That check has been there since v1.0.0.
    • Per-lane result lines are now excluded, the match is case-sensitive, and a genuine rejection prints the offending line.

    🔧 Changes

    • Script A takes a BER baseline before its first traffic run (v1.2.1), so together with Script C's closing sweep the pair brackets the soak.
    • EN_TX_FIR gates the SerDes DSC scans in Script A and Script C. Default 0: a full scan is ~10 min and both scripts do one.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.2.2.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    ls ~/hammer/tools/amd/mlucas-avx2   # must already be there
    

    ⚠️ Before you run

    • Replace config.ttl with the macros. EN_Cold_Warm_boot is new, and Tera Term aborts on an undefined variable rather than treating it as 0.
    • Do not run the boot cycle with EN_Cold_Warm_boot = 0. Nothing reboots, the wait "Booting in blind mode" underneath has no timeout, and since v1.2.2 there is no logopen either — so it hangs and leaves no log showing where. 0 is the value for the A → B → C flow, where that macro is not used.
    • The cold path writes a raw FPGA register. 0x480 is ICB_CTRL_REG; the register map carries no bit definitions for it and 0xD0000 is not documented anywhere in this repo. The BDF 0000:05:00.0 is hard-coded while blanton_fpga_pcimem.sh auto-detects it because it moves per unit — check the BDF on every board before running the cold path.
    • Anything that parses these logs must accept both banners, Reboot Cycle : N and Power Cycle : N. A parser that greps only the first finds zero cycles in a power-cycle log and reports nothing without complaining.
    • bcm_100g_dsc_cycle.sh has not been run on hardware. It pauses gbsyncd0/1 for tuning and unpauses them on exit, Ctrl-C included; -P leaves them alone.
    • sleep 30 and BER_INTERVAL now live in three places — Script A, Script C and blanton_ber.sh.
    • BER, the DSC cycle, blanton_traffic_linespeed and blanton_tr518.sh cannot overlap. They all take the same ports.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • 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.
    • FAN_SPEED is 100.

    🔗 Links

    Full changelog: V1.2.1...V1.2.2

    Downloads
  • V1.2.1 7a1967bc9a

    etwen released this 2026-09-08 09:35:42 +08:00 | 23 commits to main since this release

    ✨ 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
    chmod +x ~/Blanton_Script/*.sh
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    ls ~/hammer/tools/amd/mlucas-avx2   # must already be there
    

    🔗 Links

    Full changelog: V1.2.0...V1.2.1

    Downloads
  • V1.2.0 29ec4c2239

    etwen released this 2026-09-07 10:02:48 +08:00 | 25 commits to main since this release

    ✨ 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:

    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

    Full changelog: V1.1.8...V1.2.0

    Downloads
  • V1.1.8 eacb218da8

    etwen released this 2026-09-06 17:31:37 +08:00 | 30 commits to main since this release

    ✨ New features

    mlucas now runs as a systemd unit, so it survives a lost session

    • The AMD CPU load is started as systemd-run --unit=mlucas-amm --property=Type=exec --property=Restart=always --property=RestartSec=2, instead of being backgrounded with & in the login shell. Script B and the thermal/safety macro (Script 4) both use it.
    • As a shell job it belonged to that one terminal: close Tera Term, drop the console, reconnect on a different session, and the load was gone — while jobs from the new session showed nothing to tell you. A multi-day soak could spend most of its length with an idle CPU and produce thermal numbers that looked fine because nothing was loading the part.
    • Restart=always brings it back if it exits on its own, and the log is appended (>>) inside the unit while being truncated (>) once before the unit starts, so a restart adds to the run rather than erasing it.
    • Script B now prints systemctl is-active mlucas-amm beside jobs, both in the one-shot check and in every pass of the monitor loop. One word — active — tells you the CPU is still loaded.

    The old & line is kept commented out directly above the new one, to fall back to if systemd-run is not available on a build.

    Script C stops the unit and brings its log home

    • systemctl stop mlucas-amm was added next to the existing kill $(jobs -p), and mlucas_amm_log is copied into /host/hw-eval/jobs/ with the other stress logs.
    • kill $(jobs -p) cannot reach a systemd unit, so without this the load would have run straight through the post-test snapshot and into the next test — every temperature and power reading taken at full load, with nothing in show interfaces status to reveal it.

    EN_timestamp — turn the per-line log timestamp on or off from config.ttl

    • Script A's logopen takes its 5th argument from the new flag: logopen filename 0 1 1 EN_timestamp. The argument order (<file> <binary> <append> <PlainText> <timestamp>) is now spelled out above the call.

    BMC_USB_RUNTIME — the BMC USB ping duration is a knob, not a constant

    • It was hard-coded to -w 14400 (4 hours), which no longer matched the soak lengths the SSD and USB knobs were being set to. The shipped default is 172800 (2 days).

    The shipped stress defaults are now one hour

    • SSD_RUNTIME and USB_RUNTIME go from 600 to 3600. v1.1.7 shipped a 10 minute stress by default.

    🐛 Bug fixes

    publish.sh produced a different bundle depending on whose machine it ran on

    • rsync copied whatever sat in src/Script_ABC_Blanton/, so a developer with the hammer/ mlucas binaries in their working tree shipped a ~100 MB zip while a fresh clone shipped ~200 KB. hammer/ is now excluded from the bundle and ignored by git.
    • publish.sh -h also printed the first lines of code along with the usage text, and would have truncated the usage block as the header grew. It now reads the header up to the first line of code.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.1.8.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

    chmod +x ~/Blanton_Script/*.sh      # see below
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    ls ~/hammer/tools/amd/mlucas-avx2   # must already be there - see below
    

    blanton_ber.sh, nfc_polling.sh, blanton_tr518.sh, blanton_multiphase_margin.sh, pwr_brick.sh and the two TH6_SWB*_power_readback.sh are invoked through ./ or ~/, so they need the execute bit along with bmc_monitor.sh and usb_target.sh — neither git nor a Windows/USB copy carries it reliably.

    ⚠️ Before you run

    • Replace config.ttl along with the macros. EN_timestamp and BMC_USB_RUNTIME are new, and Tera Term aborts the macro on an undefined variable rather than treating it as 0 — keeping an old config.ttl stops Script A at the logopen line.
    • hammer/ is not in the bundle. The ~99 MB of mlucas binaries comes with the DUT image, not from this repo. If ~/hammer/tools/amd/mlucas-avx2 is missing, Script B does not stop — it starts a unit that fails and is restarted every 2 seconds. Check for the file before you start.
    • The timestamp format is not in the macro. EN_timestamp only decides whether there is one; the format lives in Tera Term's Setup → Additional settings → Log, stored in that PC's TERATERM.INI. Two benches running the same macro can produce differently stamped logs.
    • The three stress durations are deliberately different: SSD and USB at 1 hour, the BMC USB ping at 2 days. Set each to match the soak you are actually running.
    • --runtime is the job's overall limit, not a per-pass one. qfx5252-stress-* stops after RUNTIME seconds whatever --passes says. For a 24 hour soak set RUNTIME to 86400.
    • mlucas-amm has not been run on hardware yet. The unit resolves ~ through bash's fallback to the passwd entry, because systemd does not set HOME for a system service without User=. It should land on /root/hammer, the same path the interactive shell uses — confirm it on the bench, or change both paths to an absolute /root/hammer/....
    • Script 4 uses the same unit but has no teardown. The thermal/safety macro now starts mlucas-amm the same way Script B does, and it still ends at while 1 — so stopping it means blanton_tr518.sh stop and systemctl stop mlucas-amm. Closing Tera Term does not stop the CPU load any more.
    • Script 5 (reboot cycle) is still unverified on hardware, still has no exit condition, and wait "Booting in blind mode" still has no timeout guard.
    • blanton_multiphase_margin.sh save is permanent, and must not be mixed with margin.sh — same rails, two access paths, no interlock.
    • READ_VIN and READ_IIN are still not in the ADPM12200 coefficient table.
    • The BMC USB service log only exists on the USB stick.
    • These three cannot share the switch: blanton_ber.sh, blanton_tr518.sh, blanton_traffic_linespeed.
    • 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

    Full changelog: V1.1.7...V1.1.8

    Downloads
  • V1.1.7 1a06367ade

    etwen released this 2026-09-04 22:44:25 +08:00 | 34 commits to main since this release

    ✨ New features

    blanton_multiphase_margin.sh normal — put the rails back without a power cycle

    • normal returns all 38 multiphase rails to their nominal set point, with the same per-rail reporting as the margin profiles (SWB0_0V9_ANLG0 - 0.930V Configure Done). -u 0|1|all as usual.
    • Until now the only way out of a margin was to power-cycle the DUT. That mattered more than it sounds: save run while the board was still margined would have written the offsets into NVM, where a power cycle does not help either.
    • The commands it sends are in tools/Multiphase_Normal.txt for anyone driving the bench by hand.

    ⚠️ TH6_CORE is 0.8 V nominal but settles near 0.8591 V once the load line is active. Reading back 0.859 after normal is the load line doing its job, not a failed write.

    5_Blanton_Script_Reboot_Cycle.ttl — an unattended reboot-cycle run

    • A standalone macro, like Script 4: it does not chain to A → B → C and does not use hw-test-session. Every cycle is a fresh boot, so there is nothing to carry over and nothing to tear down.

    • Each round: login → sudo -i → date -s → fan speed → wait_init → Check Pt1 … Pt13 → show uptime → reboot → wait for the next boot. The cycle number is printed in the banner of every round.

      Pt1 DUT info Pt2 BMC info + tools Pt3 mgmt ping Pt4 NFC poll
      Pt5 SSD stress Pt6 USB stress Pt7 BMC USB net Pt8 port status + 15 s traffic
      Pt9 BER sweep Pt10 NVMe errors Pt11 platform data Pt12 dmesg i2c
      Pt13 PCIe error counters
    • The USB step takes its device node from usb_target.sh, not a hard-coded /dev/sda1.

    The SSD and USB stress durations are declared in config.ttl

    • SSD_RUNTIME / SSD_COUNT and USB_RUNTIME / USB_COUNT replace the values that were hard-coded in Script B, so a site changes them in one place. COUNT is passed straight through as --passes.

    🐛 Bug fixes

    Script B left the global timeout at 15 s for the rest of the cdc_ncm section

    • The NCM probe sets timeout = 15 and restored it only at :skip_ping — which the success path reaches several waits later. Until then every wait gave up after 15 s instead of blocking, and a wait that returns without eating the prompt puts the whole macro a beat ahead of the DUT. It is now restored on the success path too.

    goto skip_ping in the reboot-cycle macro had no label to jump to

    • The probe was copied out of Script B without its :skip_ping label. Tera Term does not check labels when it loads a macro — it raises the error only when it actually jumps, which here means only when the NCM interface is missing. The failure mode was an error dialog stopping the whole cycle, on the one run where something was already wrong. The label is there now, and the timeout is restored before the branch so one line covers both paths.

    Two check points both numbered 12

    • Dmesg_i2c and PCIE Error Counters both announced themselves as Check Pt12. The second is now Pt13; Pt1 … Pt13 are unique.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.1.7.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

    chmod +x ~/Blanton_Script/*.sh      # see below
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    

    blanton_ber.sh, nfc_polling.sh, blanton_tr518.sh, blanton_multiphase_margin.sh, pwr_brick.sh and the two TH6_SWB*_power_readback.sh are invoked through ./ or ~/, so they need the execute bit along with bmc_monitor.sh and usb_target.sh — neither git nor a Windows/USB copy carries it reliably.

    ⚠️ Before you run

    • --runtime is the job's overall limit, not a per-pass one. qfx5252-stress-* stops after RUNTIME seconds whatever --passes says, so SSD_RUNTIME=600 is a 10 minute stress, not 600 × SSD_COUNT. For a 24 hour soak set RUNTIME to 86400. The shipped defaults are 600.
    • Script 5 has not been run on hardware yet. Two things to confirm on the bench: that wait "Booting in blind mode" really appears in this build's boot output — it has no timeout guard, so a changed string waits forever — and that re-running bmc-first-enroll every cycle is safe.
    • Script 5 has no exit condition. while 1 with a reboot at the end of each round; stop it by closing the Tera Term macro.
    • blanton_multiphase_margin.sh save is permanent, and must not be mixed with margin.sh — same rails, two access paths, no interlock. Never run it while the board is margined.
    • READ_VIN and READ_IIN are still not in the ADPM12200 coefficient table — pwr_brick.sh decodes them with the voltage and current coefficients. Confirm before quoting brick Vin.
    • The BMC USB service log only exists on the USB stick.
    • Script 4 (thermal/safety) has no teardown — finish with blanton_tr518.sh stop and kill $(jobs -p).
    • These three cannot share the switch: blanton_ber.sh, blanton_tr518.sh, blanton_traffic_linespeed.
    • 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

    Full changelog: V1.1.6...V1.1.7

    Downloads