-
released this
2026-09-08 09:35:42 +08:00 | 2 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 onSWB_UNIT0/SWB_UNIT1exactly 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 30matchesblanton_ber.sh'sBER_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 clearis what releases them — and in Script A nothing settles between thatclearand theblanton_traffic_linespeed ps/initthat 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 asleepafterclearis the fix. This has not been run on hardware yet. sleep 30andBER_INTERVALnow live in three places — Script A, Script C, andblanton_ber.shitself. Changing one without the others silently reports a partial interval.- BER,
blanton_traffic_linespeedandblanton_tr518.shcannot overlap. They all take over the same ports. Script A now touches those ports twice before the soak even starts. EN_TX_FIRis 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.ttlalong with the macros. Tera Term aborts the macro on an undefined variable rather than treating it as 0. bcm_dsc_scan.shneeds the execute bit:chmod +x ~/Blanton_Script/*.shafter copying.--runtimeis the job's overall limit, not a per-pass one.--passesdoes not extend it.- Script 4 has no teardown: finish it with
blanton_tr518.sh stopandsystemctl 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-enrolldoes not exist on that BMC build, and NFC returned FAIL on every cycle. blanton_multiphase_margin.sh saveis permanent, and must not be mixed withmargin.sh.READ_VINandREAD_IINare still not in the ADPM12200 coefficient table.- The BMC USB service log only exists on the USB stick.
FAN_SPEEDis 100.- Still unverified from v1.1.0: the
ce0ingress mirror, the 120 s settle inblanton_tr518.sh, andtest mode nr=noon stop.
📦 Downloads
File Contents Script_ABC_Blanton_V1.2.1.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTchmod +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 — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.2.0...V1.2.1
Downloads
-
released this
2026-09-07 10:02:48 +08:00 | 4 commits to main since this release✨ New features
Full-machine SerDes DSC capture, before and after the soak
bcm_dsc_scan.shrunsphydiag <port> dscthrough 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 underBlanton_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 0scans one unit,-f <name>names the log (%u→u0/u1,%t→ timestamp),-Foverwrites,-ndry runs,-Cskips the copy. A name without%ugets_u0/_u1inserted automatically, so unit 1 can never overwrite unit 0.- Every run ends with
### DSC_SCAN_DONE rc=<n>.rc=0means every port returned a complete dump. phydiag ... dscis read-only — it does not change any SerDes setting.
bcm_dsc_parse.shturns 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 perpm_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 asUNPARSEDon stderr instead of being parsed wrongly.
EN_TX_FIRinconfig.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 to1when the SerDes data is what you are after.
The macro now waits on the DUT instead of on itself
- Every
pause Nin Scripts A, B and C becamesendln "sleep N"followed bywait prompt_sonic_root. pausestopped 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
clearis 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
bcmcmdreads 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
bcmcmdis 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.shblock in Script C have been deleted. They had been dead since bring-up. port_prbs_monitor.shstill 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.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter 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.ttlalong with the macros.EN_TX_FIRis new, and Tera Term aborts on an undefined variable rather than treating it as 0. bcm_dsc_scan.shneeds the execute bit. Script A and Script C invoke it as./Blanton_Script/bcm_dsc_scan.sh. Withoutchmod +xit fails withPermission denied, the macro walks straight past it, and Script C's fourcplines then each report a missing file.- The DSC scan shares the ports with
blanton_ber.sh,blanton_traffic_linespeedandblanton_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. --runtimeis the job's overall limit, not a per-pass one.--passesdoes not extend it; for a 24 hour soak setRUNTIMEto86400.- Script 4 has no teardown: finish it with
blanton_tr518.sh stopandsystemctl stop mlucas-amm. - Script 5 (reboot cycle) is still unverified on hardware, has no exit condition, and its
wait "Booting in blind mode"has notimeoutguard. blanton_multiphase_margin.sh saveis permanent, and must not be mixed withmargin.sh.READ_VINandREAD_IINare still not in the ADPM12200 coefficient table.- The BMC USB service log only exists on the USB stick.
FAN_SPEEDis 100.- Still unverified from v1.1.0: the
ce0ingress mirror, the 120 s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- Blanton_Test_Flow.drawio — the scripts side by side
Full changelog: V1.1.8...V1.2.0
Downloads
-
released this
2026-09-06 17:31:37 +08:00 | 9 commits to main since this release✨ New features
mlucasnow 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
jobsfrom 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=alwaysbrings 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-ammbesidejobs, 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 ifsystemd-runis not available on a build.Script C stops the unit and brings its log home
systemctl stop mlucas-ammwas added next to the existingkill $(jobs -p), andmlucas_amm_logis 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 inshow interfaces statusto reveal it.
EN_timestamp— turn the per-line log timestamp on or off fromconfig.ttl- Script A's
logopentakes 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 is172800(2 days).
The shipped stress defaults are now one hour
SSD_RUNTIMEandUSB_RUNTIMEgo from 600 to3600. v1.1.7 shipped a 10 minute stress by default.
🐛 Bug fixes
publish.shproduced a different bundle depending on whose machine it ran onrsynccopied whatever sat insrc/Script_ABC_Blanton/, so a developer with thehammer/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 -halso 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.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter 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 belowblanton_ber.sh,nfc_polling.sh,blanton_tr518.sh,blanton_multiphase_margin.sh,pwr_brick.shand the twoTH6_SWB*_power_readback.share invoked through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
- Replace
config.ttlalong with the macros.EN_timestampandBMC_USB_RUNTIMEare new, and Tera Term aborts the macro on an undefined variable rather than treating it as 0 — keeping an oldconfig.ttlstops Script A at thelogopenline. 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-avx2is 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_timestamponly decides whether there is one; the format lives in Tera Term's Setup → Additional settings → Log, stored in that PC'sTERATERM.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.
--runtimeis the job's overall limit, not a per-pass one.qfx5252-stress-*stops afterRUNTIMEseconds whatever--passessays. For a 24 hour soak setRUNTIMEto86400.mlucas-ammhas not been run on hardware yet. The unit resolves~through bash's fallback to the passwd entry, because systemd does not setHOMEfor a system service withoutUser=. 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-ammthe same way Script B does, and it still ends atwhile 1— so stopping it meansblanton_tr518.sh stopandsystemctl 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 notimeoutguard. blanton_multiphase_margin.sh saveis permanent, and must not be mixed withmargin.sh— same rails, two access paths, no interlock.READ_VINandREAD_IINare 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_SPEEDis 100.- Still unverified from v1.1.0: the
ce0ingress mirror, the 120 s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- Blanton_Test_Flow.drawio — the scripts side by side
Full changelog: V1.1.7...V1.1.8
Downloads
- The AMD CPU load is started as
-
released this
2026-09-04 22:44:25 +08:00 | 13 commits to main since this release✨ New features
blanton_multiphase_margin.sh normal— put the rails back without a power cyclenormalreturns 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|allas usual.- Until now the only way out of a margin was to power-cycle the DUT. That mattered more than it sounds:
saverun 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.txtfor anyone driving the bench by hand.
⚠️
TH6_COREis 0.8 V nominal but settles near 0.8591 V once the load line is active. Reading back 0.859 afternormalis 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.ttlSSD_RUNTIME/SSD_COUNTandUSB_RUNTIME/USB_COUNTreplace the values that were hard-coded in Script B, so a site changes them in one place.COUNTis passed straight through as--passes.
🐛 Bug fixes
Script B left the global
timeoutat 15 s for the rest of the cdc_ncm section- The NCM probe sets
timeout = 15and restored it only at:skip_ping— which the success path reaches severalwaits later. Until then everywaitgave up after 15 s instead of blocking, and awaitthat 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_pingin the reboot-cycle macro had no label to jump to- The probe was copied out of Script B without its
:skip_pinglabel. 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 thetimeoutis restored before the branch so one line covers both paths.
Two check points both numbered 12
Dmesg_i2candPCIE Error Countersboth announced themselves asCheck Pt12. The second is nowPt13; Pt1 … Pt13 are unique.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.7.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.sh,nfc_polling.sh,blanton_tr518.sh,blanton_multiphase_margin.sh,pwr_brick.shand the twoTH6_SWB*_power_readback.share invoked through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
--runtimeis the job's overall limit, not a per-pass one.qfx5252-stress-*stops afterRUNTIMEseconds whatever--passessays, soSSD_RUNTIME=600is a 10 minute stress, not 600 ×SSD_COUNT. For a 24 hour soak setRUNTIMEto86400. 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 notimeoutguard, so a changed string waits forever — and that re-runningbmc-first-enrollevery cycle is safe. - Script 5 has no exit condition.
while 1with arebootat the end of each round; stop it by closing the Tera Term macro. blanton_multiphase_margin.sh saveis permanent, and must not be mixed withmargin.sh— same rails, two access paths, no interlock. Never run it while the board is margined.READ_VINandREAD_IINare still not in the ADPM12200 coefficient table —pwr_brick.shdecodes 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 stopandkill $(jobs -p). - These three cannot share the switch:
blanton_ber.sh,blanton_tr518.sh,blanton_traffic_linespeed. FAN_SPEEDis 100.- Still unverified from v1.1.0: the
ce0ingress mirror, the 120 s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- Blanton_Test_Flow.drawio — the scripts side by side
Full changelog: V1.1.6...V1.1.7
Downloads
-
released this
2026-09-02 21:44:12 +08:00 | 17 commits to main since this release🐛 Bug fixes
Every PDB reading was
NA, and the cause was a page number written in the wrong base-
The four ADPM12200 bricks put each measurement on its own PMBus PAGE, and the page has to be written before every read. The bring-up spreadsheet listed those page numbers in decimal but with an
0xprefix, so four of the five selected the wrong page:Reading Datasheet PAGE Should send Spreadsheet said Vin 9 0x090x00Iin 10 0x0A0x10Vout 2 0x020x02✅Iout 14 0x0E0x14Temp 18 0x120x18 -
Only Vout worked — because 2 reads the same in either base. That is why Iin and Iout answered
0xFFFFand the temperature answered0x0000, and why a Vin scaling had to be invented to make 50 V appear. -
blanton_pwr_data.shsends no page at all (its PDB table haspage "-"), which is the reason it reports the whole PDB section asNA.
✨ New features
pwr_brick.sh— the five power bricks, read properlyshowprints Vin / Iin / Vout / Iout / Temp for all five:SWB0.PU207(0x62),SWB0.PU13(0x63),SWB1.PU332(0x60),SWB1.PU85(0x61) andCPB.PU37(0x26).-radds the raw words.- Conversions come from the datasheet's DIRECT equation,
X = (1/m)(Y × 10⁻ᴿ − b), with Table 3's coefficients: voltageY × 8 mV, currentY × 0.04 A, temperatureY × 0.01 °C. - Cross-checked, not assumed:
READ_VOUTreturns0x05D4→ 1492 × 8 = 11936 mV, which is exactly the figureshow platform voltagereports for that rail from a completely separate sensor path. CPB.PU37is a different part — no page writes and its own scaling — and is handled separately.- The datasheet is now in the repo (
docs/ADPM12200CMLZxx_DS_*.pdf) so the pages and coefficients can be checked without hunting for it.
Every value is validated before it is printed
- This bus corrupts the high byte only. That turns
11.98 Vinto32.00 V— positive, plausible in magnitude, and invisible to any "reject 0xFFFF" filter. Each value is re-read (up toPB_TRIES, default 8) until it is not0xFFFF, not0x0000, and lands inside a plausibility window. 0x0000is rejected as a raw word for the same reason: on the temperature register it decodes to a perfectly believable 0 °C.
Complementary margin profiles per board
comboA/comboBfor CB and each SWB CONN.comboBiscomboAwith every direction flipped, so running both covers each rail high and low while its neighbours sit the other way.- NC channels stay at
nominalin both — there is nothing to margin on an unused rail (CONN14 CH10/11/13, CONN15 CH10).
The BMC USB service log is captured again — to a file
- Script C's
journalctldump had been commented out, so that service log reached nothing at all. It now runs with-o short-isointolog/bmc_usb_net.logand is copied into the job directory for the USB archive. The ISO timestamps line up with the other monitor logs, andrm -ffirst keeps the file to one run. - It is no longer printed to the console, so the USB copy is the only copy. If that
cpfails — and nothing checks it — the service log is gone. Check the job directory before packing up.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.6.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.sh,nfc_polling.sh,blanton_tr518.sh,blanton_multiphase_margin.sh,pwr_brick.shand the twoTH6_SWB*_power_readback.share invoked through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
READ_VINandREAD_IINare not in the datasheet's coefficient table. They are decoded here with the voltage and current coefficients — consistent with a ~50 V input, but not stated by the datasheet. Anything quoting brick Vin should have that confirmed first.PB_VIN_M/PB_IIN_Mare where to change it.- The BMC USB service log only exists on the USB stick. It is not in the master console log any more.
NAhas two meanings: nothing readable, or read but outside its plausibility window. UsePB_TRIES=1 ./Blanton_Script/pwr_brick.sh show -rto see the unretried raw words and tell them apart.- Margin profiles are positional.
comboA_SWB_CONN13applied to a CONN16 board margins the wrong rails and nothing detects it. blanton_multiphase_margin.sh saveis permanent, and it must not be mixed withmargin.sh— same rails, two access paths, no interlock.- A soak longer than 24 hours needs the stress runtimes raised —
--runtime 86400is a ceiling. - Script 4 (thermal/safety) has no teardown — finish with
blanton_tr518.sh stopandkill $(jobs -p). - These three cannot share the switch:
blanton_ber.sh,blanton_tr518.sh,blanton_traffic_linespeed. FAN_SPEEDis 100.- The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- Blanton_Test_Flow.drawio — the four scripts side by side
Full changelog: V1.1.5...V1.1.6
Downloads
-
-
released this
2026-09-01 11:04:55 +08:00 | 19 commits to main since this release🐛 Bug fixes
USB stress ran for sixty seconds of an overnight soak
qfx5252-stress-usbwas started with--runtime 60. It finished a minute in and the USB path sat idle for the rest of the night. Nothing failed, nothing said so, and the run looked complete.- SSD stress had the same shape at
--runtime 3600— one hour of a soak that usually runs far longer. - Both are now
--runtime 86400, and the BMC DDR memtester lost its loop count (64M 1→64M) so it runs until it is stopped rather than finishing one pass. - 86400 is 24 hours, not "forever". A soak longer than a day leaves SSD and USB dead for the remainder. Script B prints
bgctl listevery round (since v1.0.10), so the shorter list is visible there — but nothing raises an alarm.
✨ New features
Multiphase VRM margin
-
New
blanton_multiphase_margin.shdrives the multiphase controllers on both switch boards over the native i2c buses — SWB0 on/dev/i2c-13and-15, SWB1 on-14and-16. 19 rails per board, 38 in all. -
high3/low3/comboA/comboBset the voltages and report one line per rail:SWB0_0V9_ANLG0 - 0.930V Configure Done SWB0_0V75_ANLG0 - 0.775V Configure Done ... [ OK ] high3: 38 rail(s) configured -
savecommits them. It has no per-rail mapping, so it reports as one operation:Multiphase Save All. -
-u 0/-u 1for a single board; rails belonging to the other board are skipped and counted separately, not failed. -
savewrites NVM permanently (PMBusSTORE_USER_ALL, and0x17on the TH6 core rail). A power cycle does not undo it. -
These are not the LTC2980s that
margin.shdrives. The two tools reach the same rails from different sides and each assumes it is the only writer. There is no interlock — do not run both.
Traffic bursts carry a random pattern
blanton_traffic_linespeedv0.7.0 appendsPatternRandom=yesto everytx,ce0included. A fixed pattern can sit on a benign bit sequence for an entire run; a changing one is what makes a weak lane show itself.-r noforces the fixed pattern;-r ""leaves the argument off entirely, which is the pre-v0.7.0 wire format if a future SDK rejects it.- Defaults change from
tx 100 length=512totx 200 length=324. - Counter totals are not comparable across this build: 64800 bytes per burst instead of 51200, about 27% more. The PASS/FAIL cross-check compares a pair against each other and is unaffected — only absolute figures moved.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.5.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.sh,nfc_polling.sh,blanton_tr518.sh,blanton_multiphase_margin.shand the twoTH6_SWB*_power_readback.share invoked through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
- A soak longer than 24 hours needs the runtimes raised.
--runtime 86400is a ceiling; past it, SSD and USB are idle and only a shorterbgctl listhints at it. blanton_multiphase_margin.sh saveis permanent. Read the rails back before committing, and never run it during a test.- Do not mix
blanton_multiphase_margin.shandmargin.sh— same rails, two different access paths, no interlock. - Traffic counters changed scale. Any absolute thresholds taken from earlier logs need redoing.
- Script 4 (thermal/safety) has no teardown — finish with
blanton_tr518.sh stopandkill $(jobs -p). - These three cannot share the switch:
blanton_ber.sh,blanton_tr518.sh,blanton_traffic_linespeed. - Margin is only sampled at the start and end of a soak (since v1.1.4), not during it.
FAN_SPEEDis 100 — the fans run flat out unless you changeconfig.ttl.- The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- Blanton_Test_Flow.drawio — the four scripts side by side
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.1.4...V1.1.5
Downloads
-
released this
2026-08-31 22:19:43 +08:00 | 20 commits to main since this release✨ New features
4_Blanton_Script_thermal_safety.ttl- A standalone script — it is not part of the A → B → C chain and is not started by any of them. Run it on its own when the question is thermal or safety rather than functional.
- Brings the DUT up the same way Script A does (login, session reset, fan speed,
wait_init, DUT inventory, BMC, PCIe error clear,pcie_bus, PMON, dmesg), then loads it:mlucas-avx2 -cpu 0:15in the background andblanton_tr518.sh starton the data plane. - Then loops every minute: platform data, both switch boards' rail power via
TH6_SWB0/1_power_readback.sh, andbgctl list/jobs. That is the point of the script — power per rail under sustained full load, sampled over hours. - It has no teardown. When you interrupt it the DUT is still in
port cd lb=mac,l2 learn offandtest mode nr=yes, andmlucas-avx2is still running. Runblanton_tr518.sh stopandkill $(jobs -p)before anything else uses the box — nothing inshow interfaces statusreveals the leftover state. - It cannot share a DUT with Script B. Both take over the
cdports.
Test flow diagram
docs/Blanton_Test_Flow.drawiodraws all four scripts side by side, with the config flags that change each step marked, the one realgotoin Script B drawn, and the manual handoffs between A → B → C shown as such.
🐛 Bug fixes
The soak loop spent most of its minute reading margin
- Script B's per-round loop is meant to be a quick sample.
margin_status_all.shwalks nine LTC2980s over I2C and dominated the round. The scan moved to Script C, which takes it once beforeshow uptime. - The trade-off is real and worth knowing: margin is now only measured at the start (Script A) and the end (Script C). Drift that happens during the soak is no longer visible.
hw-test-session finishran from inside the session's own shell- Script C now sends
exitand waits forScript donefirst, sofinishruns in the login shell that opened the session.
The new script arrived with LF line endings
- Every other
.ttlin the repo is CRLF, and.gitattributesmarks*.ttlas-text— whatever is committed is exactly what Tera Term gets. Converted to CRLF to match.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.4.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.sh,nfc_polling.sh,blanton_tr518.shand the twoTH6_SWB*_power_readback.share invoked through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
- Script 4 leaves the switch loaded and looped back. Always finish with
blanton_tr518.sh stop. If the next test starts without it, traffic and BER results are meaningless and nothing warns you. - Do not run Script 4 and Script B on the same DUT. Same ports, same L2 settings.
- Margin is no longer sampled during the soak — only Script A (start) and Script C (end).
- Re-baseline your margin limits if you have not already:
VNOMbecame the measured median in v1.1.3, which moved both the deviation % and the margin window. - These three cannot share the switch:
blanton_ber.sh,blanton_tr518.sh,blanton_traffic_linespeed. - PRBS takes the links down while
blanton_ber.shis armed. ce0keeps circulating until you stop it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. FAN_SPEEDis 100 — relevant here more than anywhere: a thermal run at full fan is not the same test as one at 30%.- The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop. The settle matters most for this release — Script 4 depends ontr 518still driving traffic minutes after it was started.
🔗 Links
- Blanton_Test_Flow.drawio — the four scripts side by side
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.1.3...V1.1.4
Downloads
-
released this
2026-08-30 22:13:48 +08:00 | 21 commits to main since this release✨ New features
Per-CONN margin profiles for the switch boards
combo_SWB_CONN13_high/_lowthroughcombo_SWB_CONN16_high/_lowreplace the oldcomboA/comboBpair. Each file's per-channel percentages follow the rails on that board, so a CONN13 profile is no longer a rough fit for CONN16.- SWB0 and SWB1 share a profile per CONN — the two boards carry identical rails and differ only by I2C bus.
- A high pass and a low pass are now the same run with
_highswapped for_low. - A profile applied to the wrong CONN margins the wrong rails and says nothing. The percentages are positional, so nothing detects the mismatch.
margin_apply_profile_all.shnow names the right profile per board instead of one name for all nine.
🐛 Bug fixes
VNOMwas the spec value, not what the rails actually sit at- 86 of the 144 channels moved up between +0.8% and +2.5% to the measured median for this platform —
PVDD3_3V_SYNTH_LDO_*3.3 → 3.38,P0V9_AVDD_*0.9 → 0.915,PVDD0_8V_T30.8 → 0.82, and so on. - This is not a display change.
VNOMis the denominator ofmargin_status's deviation %, and the basismargin_setderives high / low / OV / UV from. A rail sitting steady at 0.756 V used to read+0.80%against a nominal 0.75 and now reads0.00%; and asking for+3%now lands on a different absolute voltage than it did last week. - Margin logs from before and after this build cannot be compared directly. The numbers moved because the reference moved, not because the hardware did.
The batch profile script pointed at files that no longer exist
margin_apply_profile_all.shstill namedcomboAfor all nine boards. WithcomboA.confremoved, every board would have stopped atProfile not found— a nine-line wall of errors on a script that is normally left to run.
The channel map CSV was stale
docs/LTC2980_channel_map.csvis generated fromsettings/*.conf, so all 86 changed rails were wrong in it. Regenerated withtools/gen_channel_map.sh. It is output, not source — regenerate it, never hand-edit it.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.3.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.shandnfc_polling.share invoked by the macros through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.⚠️ Before you run
- Re-baseline your margin expectations. Any pass/fail limits or golden logs derived from the old
VNOMvalues need redoing against this build. margin_savein any form writes NVM permanently and now writes margin windows derived from the new reference. Runmargin_status_all.shfirst and never call it during a test.- SWB profiles are per-CONN. Applying
combo_SWB_CONN13_highto a CONN16 board is silently wrong. - These three tests cannot share the switch:
blanton_ber.sh,blanton_tr518.shandblanton_traffic_linespeed. - PRBS takes the links down while
blanton_ber.shis armed. ce0keeps running until you stop it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. FAN_SPEEDis 100 — the fans run flat out unless you changeconfig.ttl.nfc_polling.sh startclears the log, so Script B wipes Script A's NFC baseline file (the numbers are already in the console log).- The NFC tool is written for the customer's tag. It polls Type A / B / F only and parses Type A strictly; a tag of another technology is never discovered and fails as
no RF interface activation notification received. Without--expected-idit does not check identity, so a different tag of the same type still passes. - The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- LTC2980_channel_map.csv — all 144 margin channels with the new
VNOM
Full changelog: V1.1.2...V1.1.3
Downloads
-
released this
2026-08-28 22:41:08 +08:00 | 22 commits to main since this release✨ New features
Background NFC polling
-
New
nfc_polling.shrunsblantons_nfc_validate.pyover and over in the background and keeps score.start/stop/status/tail/report/clear/fg. -
reportworks while the poll is still running. It only reads the log, so it never disturbs the run — and it labels itselfRUNNINGso a mid-soak snapshot is not mistaken for the final answer:state : RUNNING (pid=2240323) -- this is a snapshot, the count is still moving rounds : 240 PASS : 238 FAIL : 2 ERROR : 0 (tool did not produce a verdict) RESULT : FAIL --- tags seen --- 046F7BD2142290 238 -
ERRORis counted apart fromFAIL. A round where the tool printed neither[PASS]nor[FAIL]— it crashed, the file was missing, it hung past the timeout — did not measure anything. That is a different problem from a tag that would not read, and rolling the two together hides whichever one you are not looking for. -
reportalso lists which NFCID1s were seen and how often, and the last ten failures with their timestamps and reasons. -
startclears the log first, so a report always describes the run you just did rather than everything since the DUT was built. -
Script A takes a 30-second NFC baseline, Script B starts the poll for the soak, Script C stops it with the other monitors and reports.
🐛 Bug fixes
The NFC log never reached the USB stick
- Script C copied
nfc_polling.log; the file isnfc_poll.log. Thecpfailed, nothing checked it, and the run finished looking fine — you would only notice back at the desk with a job archive that had no NFC log in it.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.2.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.shandnfc_polling.share invoked by the macros through./or~/, so they need the execute bit along withbmc_monitor.shandusb_target.sh— neither git nor a Windows/USB copy carries it reliably.blantons_nfc_validate.pydoes not need it:nfc_polling.shcalls it throughpython3precisely so one morechmodcannot be forgotten.⚠️ Before you run
nfc_polling.sh startclears the log. Script B starts a fresh poll for the soak, which wipes Script A's baseline log — the baseline numbers are already in the master console log by then, but the file is gone.- NFC log path is
~/Blanton_Script/log/nfc_poll.logand it is copied into the job directory by Script C for the USB archive. - These three tests cannot share the switch.
blanton_ber.sh,blanton_tr518.shandblanton_traffic_linespeedall take over port loopback and L2 learning. Script C already orders BER after the traffic report. - PRBS takes the links down while
blanton_ber.shis armed. That is the test working, not a fault. ce0keeps running until you stop it. An interrupted run leaves the 100G port saturated with nothing inshow interfaces statusto hint at it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. FAN_SPEEDis 100 — the fans run flat out unless you changeconfig.ttl.- Declare the switch population with
SWB_UNIT0/SWB_UNIT1. - PRBS on the two 100G uplinks (
port_prbs_monitor.sh) is still not wired into the macros. - The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop. See v1.1.0 for the one-command check on each.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.1.1...V1.1.2
Downloads
-
-
released this
2026-08-28 22:04:36 +08:00 | 23 commits to main since this release🐛 Bug fixes
A previous run's jobs and session survived into the next one
- Script A now clears the box before it starts:
hw-test-session finish,bgctl reset --yes,bgctl stop --all, thenbgctl listso you can see it came back empty. - This matters after a run that ended badly — a closed Tera Term window, a DUT reboot mid-soak, a macro stopped by hand. The stress jobs kept running and the session stayed open, so the next run started on a box that was already loaded. Nothing failed; the numbers were just quietly wrong, and the only hint was a
bgctl listnobody was reading. - The
bgctl listat the end is the point of the sequence, not decoration: it is the one line in the log that proves the DUT was idle when the run began.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.1.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputblanton_ber.shis invoked by Script C as./Blanton_Script/blanton_ber.sh, so it needs the execute bit along withbmc_monitor.shandusb_target.sh— and neither git nor a Windows/USB copy carries it reliably. Without thechmodthe BER section fails withPermission deniedand the log simply has no BER in it.⚠️ Before you run
hw-test-session finishat the start will complain if no session is open. That is expected on a fresh DUT and does not stop the run.- These three tests cannot share the switch.
blanton_ber.sh,blanton_tr518.shandblanton_traffic_linespeedall take over port loopback and L2 learning. Script C already orders BER after the traffic report. - PRBS takes the links down while
blanton_ber.shis armed. That is the test working, not a fault. ce0keeps running until you stop it. If a run is interrupted betweenstartandstop, the 100G port stays saturated with nothing inshow interfaces statusto hint at it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. FAN_SPEEDis 100 — the fans run flat out unless you changeconfig.ttl.- Declare the switch population with
SWB_UNIT0/SWB_UNIT1. - PRBS on the two 100G uplinks (
port_prbs_monitor.sh) is still not wired into the macros. - The three items listed as unverified in v1.1.0 are still unverified: the
ce0ingress mirror, the 120s settle inblanton_tr518.sh, andtest mode nr=noon stop. See v1.1.0 for the one-command check on each.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.1.0...V1.1.1
Downloads
- Script A now clears the box before it starts: