-
released this
2026-08-28 16:33:43 +08:00 | 24 commits to main since this release✨ New features
Whole-switch SerDes BER sweep
-
New
blanton_ber.shruns PRBS across every cabled port and reports the bit error rate lane by lane.init→start→ wait →report→stop→clear, with-u 0/-u 1for a single switch unit. -
A lane passes only when its BER is below 1e-6. Equal to the threshold is a FAIL, not a pass.
-c <ber>sets a different bar. -
reportends with a summary across both units, and each unit's row carries its worst lane — so a run where everything passes still tells you how much margin there was:Unit LANES PASS FAIL NA WORST BER WORST LANE RESULT unit 0 432 432 0 0 1.98e-08 203[0] PASS unit 1 432 432 0 0 6.34e-10 366[1] PASS -
initalso checks that every lane locked. This matters: an unlocked lane still reports a BER later, and it is a meaningless one. Without the check, a dead lane can report a beautiful number and pass. -
A lane whose reading is not a number is
NA— counted separately fromFAIL, because "not measured" and "measured and bad" are different problems. -
Script C runs the sweep after the traffic report, following
SWB_UNIT0/SWB_UNIT1the same way the traffic block does.
TR518 load test, for measuring power under traffic
- New
blanton_tr518.shputs the cd ports in loopback and runs the built-intr 518packet test, then waitsTR_SETTLE_SEC(120s by default) before handing back — so the power figures you take afterwards are loaded and settled, not caught mid-ramp. -u 0/-u 1for one unit; no flag runs both.stopsendsport cd lb=noneand nothing else, which is exactly what the bench procedure does. L2 learning and test mode are left asstartset them — the tool says so on everystoprather than quietly leaving the box in a state you did not ask about.TR_RESTORE_LEARN=1/TR_RESTORE_TESTMODE=1if you want a true inverse.
Per-rail power readback for both switch boards
TH6_SWB0_power_readback.sh/TH6_SWB1_power_readback.shreport V × I and total power for the 19 rails on each board.
🐛 Bug fixes
The power readback measured every rail at a different moment
- It ran
show platform voltageandshow platform currentonce per rail — 38 invocations of a slow CLI, and 38 different instants. Under load the currents move a lot (TH6_COREwas seen going from 186 A to 636 A), so the "total" was a sum of readings taken seconds apart. Both tables are now read once, up front. Same output, one moment. - A rail missing from the sensor table used to contribute a silent
0.000 V / 0.00 Wto the total. It now says so on stderr; the printed report format is unchanged.
The 100G port stopped sending after one round trip
ce0has no loopback partner, and a switch never forwards a frame back out the port it arrived on — so atxburst went out, came back, and was dropped. TX 100, RX 100, silence. That measures the link; it does not exercise it.initnow sets an ingress mirror ofce0back to itself. The mirrored copy is not egress-filtered, so each packet keeps lapping and the load is set by how much you inject (-tx).stopis what ends it — removing the VLAN membership does not, because the mirrored copy never consulted the VLAN.
The 100G verdict was being decided the wrong way
ce0was treated as a cross-unit check. The bench says otherwise: there is onece0per unit and a burst sent on unit 0 alone came back on unit 0. It is now judged within its own unit. The distinction is invisible while everything works and decisive when it does not — read as cross-unit, both links dying still leavesunit0.TX == unit1.RX(0 == 0) and reports PASS.
Every BER lane reported
NA, and the Port column printedNAtoobcmcmdreturns CRLF, and the BER is the last token on its line, so the carriage return stayed glued to the number: it failed the numeric check, and printing it sent the cursor back to column 1 so the RESULT column overwrote the start of the row. Both symptoms, one stray\r.
📦 Downloads
File Contents Script_ABC_Blanton_V1.1.0.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 joinsbmc_monitor.shandusb_target.shin needing the execute bit — 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
- These three tests cannot share the switch.
blanton_ber.sh,blanton_tr518.shandblanton_traffic_linespeedall take over port loopback and L2 learning. Run one at a time; Script C already orders BER after the traffic report. - PRBS takes the links down. While
blanton_ber.shis armed the ports report DOWN and no traffic passes. That is the test working, not a fault.clearreleases them. 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.blanton_traffic_linespeed stop(orbcmcmd -n <u> -c 'mirror port ce0 Mode=Off') ends it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. Change one without the other andreportreads an interval that has not finished accumulating — with no warning. FAN_SPEEDis 100. This build runs the fans flat out unless you changeconfig.ttl.- Declare the switch population with
SWB_UNIT0/SWB_UNIT1; traffic, the readiness gate and now the BER sweep all follow it. - PRBS on the two 100G uplinks (
port_prbs_monitor.sh) is still not wired into the macros. Unchanged from v1.0.9.
🔬 Not yet verified on hardware
Three things in this build were reasoned out rather than measured, and each has a one-command check:
- The
ce0ingress mirror.mirror port ce0 Mode=Ingress DestPort=ce0should make the port circulate, but the hardware may refuse a mirror destination equal to its source. Checkshow c | grep POK.ce0twice ten seconds apart — the number must climb. The report cannot tell you: a one-shot burst is alsoTX == RXand also says PASS. Fallback istr 518 PortList=268. - The 120s settle in
blanton_tr518.sh. Iftr 518's traffic is time-limited (its parameters includeruntime=1,CheckDataTime=200), waiting 120s could mean measuring after the load has already dropped. Compare a power readback at 0s, 30s and 120s. test mode nr=noinblanton_tr518.shis the derived inverse of thenr=yesthatstartsends; it is not part of the bench-verified sequence, and is off by default.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.11...V1.1.0
Downloads
-
-
released this
2026-08-28 10:32:12 +08:00 | 25 commits to main since this release✨ New features
margin_save blanton— all 18 LTC2977 in one go- On this platform the CB FPGA's I2C channels are also exposed as ordinary Linux i2c buses, so every margin controller on the box — CB and both switch boards — can be reached with plain
i2cset.margin_save blantonwalks all 18 of them from one flat list: nomargin_init, no FPGA channel setup, nopcimem. - The channel-to-bus mapping it relies on (F3 Ch6 → bus 13, Ch7 → 14, Ch8 → 15, Ch9 → 16; CB is bus 4 as before) is now written down in
ARCHITECTURE.mdand the margin README, not just known at the bench. - A partly-populated DUT is a normal build. Comment out the lines you do not have in
MARGIN_BLANTON_STOREat the top ofmargin.shrather than letting the tool talk to boards that are not there. - Missing bus and unresponsive chip are reported as two different failures.
/dev/i2c-16 does not existmeans the FPGA's i2c adapters did not enumerate;i2cset failed (NACK/busy)means the board is absent or the address is wrong. Chasing the second when you have the first wastes an afternoon.
margin_save all— every board insettings/- Runs
margin_init+margin_saveacross all nine boards, then puts back whichever board you had loaded, so a followingmargin_statusstill reports the board you were looking at. - It does not stop at the first failure: a half-saved set is harder to reason about than a fully-attempted one. The summary names the boards that failed.
Both print a per-chip line and a
N saved, M failedtally, and both return a non-zero exit code when anything failed.The fans now default to full speed
FAN_SPEEDinconfig.ttlis 100 instead of 30. A soak is a thermal test of everything except the cooling, so the cooling should not be a variable in it — and a DUT that throttles halfway through a run produces results that look like a different fault. Lower it deliberately if quiet operation is what you are measuring.
🐛 Bug fixes
A failed NVM write still reported success
margin_savediscarded the result of every write, so a NACK printedChange Savedexactly like a successful store. For the one operation in this tool that is permanent, that is the worst place to stay quiet. Each store is now checked and named if it fails.
STORE_USER_ALLwas sent with a data byte it should not have- The command went out as
0x15followed by a dummy0x00— an SMBus write-byte, whereSTORE_USER_ALLis a send-byte. The LTC2977 tolerated it, but tolerance is not correctness. It is nowi2cset ... 0x15 con the native path and a no-datacb_pmbus_writeon the FPGA path.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.11.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 outputmgmt_ping_monitor.shandport_prbs_monitor.shlaunch their workers throughbash, so those two run without the execute bit.bmc_monitor.shandusb_target.shstill need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without thechmod,startfails withPermission deniedand the latercatfinds nothing: the section ends up empty and nothing reports an error.⚠️ Before you run
margin_savein any form writes NVM permanently. A power cycle does not undo it.margin_save allandmargin_save blantondo it to all 18 controllers at once. Runmargin_status_all.shfirst and never call any of them during a test run — the macros do not, and should not be made to.- The 18 raw commands were verified on the DUT; the wrapper was not.
margin_save blantonissues exactly the sequence that was run by hand at the bench, and the packaging was tested against stubbed hardware, but the function itself has not been run on a DUT yet. Watch the per-chip lines the first time. - Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has; traffic and the readiness gate both follow them. FAN_SPEEDis now 100. It is applied at the start of every run, so this build runs the fans flat out unless you changeconfig.ttl. Expect the noise.- Management connectivity is in use, not preserved. Both management NICs are up and pinging — drive the run from the serial console.
- PRBS is still not wired into the macros. Run
port_prbs_monitor.shby hand if you want it; the calls in A/B/C remain commented out. - Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- LTC2980_Margin_Script/README.md — the three
margin_savevariants and what each one sends
Full changelog: V1.0.10...V1.0.11
Downloads
- On this platform the CB FPGA's I2C channels are also exposed as ordinary Linux i2c buses, so every margin controller on the box — CB and both switch boards — can be reached with plain
-
released this
2026-08-27 14:29:50 +08:00 | 27 commits to main since this release✨ New features
Every soak round now reports the background jobs
- Script B's monitoring loop prints
bgctl list(platform jobs) andjobs(the login shell's own background jobs) on every pass, right after the platform data. A stress job that dies three hours into an overnight soak now shows up as a shorter list on the next round, instead of only being noticed at the end — or not at all. - The two lists answer different questions and are both worth having:
bgctlknows about the platform's job runner,jobsknows about anything the macro backgrounded in that shell.
A single table for all 144 margin channels
docs/LTC2980_channel_map.csvflattens the ninesettings/*.conffiles into one sheet —Board,CONN,Ch,NetName,Vnom— so "which board and channel isPVDD1V5_TSCon?" is one search instead of opening nine files.tools/gen_channel_map.shregenerates it. The CSV is output, not source: edit the.conffiles and re-run the script, never the other way round.- Unused channels stay in the table as
NC/-rather than being dropped, because the channel number is also the PMBus page (ch / 8picks the chip,ch % 8picks the page) — filtering the gaps out would shift everything after them.
The bench command lists that these scripts came from
tools/100G_PRBS.txt,tools/TR518.txtandtools/fan_ctrl.txtjoin the existingtraffic_loopback_*.txtset: the rawbcmcmd/ sysfs sequences, kept in the form you can paste into a console when a script is misbehaving and you want to drive the hardware directly.
🐛 Bug fixes
The soak loop ran as fast as the DUT could answer
while 1had no pause at all, so each round started the moment the previous one finished. Over a long soak that means constant console traffic and a log full of near-identical samples taken seconds apart. The loop now ends each round withpause 60.- Note the gap this leaves: the Status sheet asks for a 10-minute sampling interval, and 60 seconds is still hard-coded rather than configurable. This makes the loop sane, it does not finish the job.
A comment promised a cadence the code never had
- The loop was labelled
Get data every 10minswhile running with no delay whatsoever. It now says what it does.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.10.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 outputmgmt_ping_monitor.shandport_prbs_monitor.shlaunch their workers throughbash, so those two run without the execute bit.bmc_monitor.shandusb_target.shstill need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without thechmod,startfails withPermission deniedand the latercatfinds nothing: the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has; traffic and the readiness gate both follow them. - Set
FAN_SPEED. It is applied at the start of every run. - Management connectivity is in use, not preserved. Both management NICs are up and pinging — drive the run from the serial console.
- PRBS is still not wired into the macros. Run
port_prbs_monitor.shby hand if you want it; the calls in A/B/C remain commented out, unchanged from v1.0.9. - TR518 and the loopback traffic test cannot both run.
tools/TR518.txtsetsport all lb=macandl2 learn offacross the whole unit, which is the same hardwareblanton_traffic_linespeedis using. Pick one. - Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
- LTC2980_channel_map.csv — all 144 margin channels
Full changelog: V1.0.9...V1.0.10
Downloads
- Script B's monitoring loop prints
-
released this
2026-08-26 15:35:48 +08:00 | 28 commits to main since this release✨ New features
100G uplink PRBS test
-
New
port_prbs_monitor.shdrives a PRBS test on both 100G uplinks: it clears low-power mode, arms the pattern, then pollsphy diag <phy> prbs getin the background until stopped. A poll counts as PASS only when the output saysPRBS OK!;prbsstat Beris captured alongside every poll for the record. -
stoprunsprbsstat STOpandprbs clearon each port before rendering the report, so the test does not leave PRBS armed behind it. -
reportgives the tally the bench actually wants:PORT POLLS PASS FAIL RESULT Ethernet513 42 42 0 PASS Ethernet514 42 40 2 FAIL -
One port at a time is a first-class mode.
start aorstart bruns a single uplink, which is how you separate a genuine port fault from the DUT not coping with two PRBS streams at once. A port that was not run reportsSKIP, notFAIL. -
Every command and its full output — setup, each poll, teardown — goes to that port's raw log.
⚠️ The script ships in this build and can be run by hand, but the calls in Script A, B and C are commented out: PRBS is still under bring-up on this platform.
USB target detection
usb_target.shreports an inserted USB device's node, mount point or by-id path. It excludes whatever disk backs/and/host— this platform can boot from a USB DOM, which also reports as USB — refuses to guess when several USB disks are present, and when mounting, verifies the result is writable rather than trusting thatmountsucceeded.- Script B builds the USB stress command from the detected node instead of a hard-coded
/dev/sda1.
🐛 Bug fixes
The job logs were being written to a path nobody collected
- Stress output, the monitors' logs and the USB archive disagreed about where the job directory lives. Everything now uses
/host/hw-eval/jobs/, so what Script B writes is what Script C copies out.
Script C copied to a USB that was never mounted
- The archive step assumed
/mnt/usbwas ready. Script C now finds the device and mounts it first, so a run's logs leave the DUT instead of being written into an empty mount point.
show interfaces statusright after starting PRBS reads as a failure- With PRBS armed the link is out of normal operation and reports DOWN.
port_prbs_monitor.shdeliberately does not print the port status atstart— it appears in the report instead, afterprbs clear, labelled as the recovered state.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.9.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 outputmgmt_ping_monitor.shandport_prbs_monitor.shlaunch their workers throughbash, so those two run without the execute bit.bmc_monitor.shandusb_target.shstill need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without thechmod,startfails withPermission deniedand the latercatfinds nothing: the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has; traffic and the readiness gate both follow them. - Set
FAN_SPEED. It is applied at the start of every run. - Management connectivity is in use, not preserved. Both management NICs are up and pinging — drive the run from the serial console.
- PRBS is not wired into the macros yet. Run
port_prbs_monitor.shby hand if you want it; uncommenting the calls in A/B/C is not supported in this build. - Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.8...V1.0.9
Downloads
-
-
released this
2026-08-26 10:13:34 +08:00 | 29 commits to main since this release✨ New features
Both management NICs are pinged simultaneously and continuously
mgmt_ping_monitor.shno longer alternates fixed bursts.startconfigures both NICs, then pings from each at the same time and keeps accumulating until stopped — so a soak-long run is one continuous measurement rather than a series of snapshots.stoprenders a report into the log: the last 20 entries per NIC, each one's ping statistics and PASS/FAIL, thenip -s link showfor both interfaces.- Every line is timestamped, and a request that got no reply prints a marker instead of merely being absent — a drop is visible in the tail, not inferred from a gap in the sequence numbers.
statusshows both pids and how many replies each NIC has received so far, which is the quick way to see one side is dead without waiting for the report.
The USB stress target is detected, not assumed
- New
usb_target.shreports an inserted USB device's node, mount point or by-id path. Script B asks it for the node and builds the stress command from the answer, so a stick that enumerates assdbno longer sends a write test at whatever/dev/sda1happens to be. - It excludes whatever disk backs
/and/host— this platform can boot from a USB DOM, which also reports as USB — refuses to guess when several USB disks are present, and when it mounts, verifies the result is actually writable rather than trusting thatmountsucceeded.
BMC I2C integrity is exercised through the soak
bmc_monitor.shis back in the run and now writes two complementary patterns to a BMC scratch register and reads each back. One pattern alone cannot catch a bit stuck the same way it was written; repeating the pair through the soak turns an intermittent I2C fault into something the log records rather than something the tester has to witness.
Test artefacts leave the DUT with the run
- Script C copies
bmc_poll.logandmgmt_ping.loginto the job directory before it is archived to USB, so the monitors' output travels with thebgctljob logs. - DDR stress now runs continuously instead of stopping after 100 passes, matching the other soak loads.
🐛 Bug fixes
Three FAILs that were not link faults
- A bench run reported
FAIL=3with zero NIC errors, zero drops and sub-millisecond replies. Every failure was missing exactlyicmp_seq=1and nothing else: once the neighbour entry for the target expires, the first echo request is spent resolving ARP andpingcounts it as loss. A discarded warm-up ping per NIC now absorbs that, which is what lets the loss threshold stay at zero and still mean something. Raising the threshold instead would have hidden genuine single-packet loss.
Job logs were being cleared before they were collected
- Script C ran
bgctl reset --yeswhile killing processes — before the job directory is copied to USB. Moved to after the archive, so a run's own logs are collected before anything clears them.
The fan controller was bound twice
- One of the two MAX31790 controllers received a second
bindimmediately after the first, which could only fail because the driver was already attached.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.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 outputmgmt_ping_monitor.shno longer re-execs itself, sobash mgmt_ping_monitor.sh startworks without the execute bit.bmc_monitor.shandusb_target.shstill need it — and neither git (mode 100644) nor a Windows/USB copy carries it. Without thechmod,startfails withPermission deniedand the latercatfinds nothing: the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has. Traffic and the readiness gate both follow them; with neither set the traffic stage is skipped rather than failing against hardware that is not there. - Set the fan speed you want.
FAN_SPEEDinconfig.ttlis applied at the start of every run. - Management connectivity is in use, not preserved. Both NICs are up and pinging — drive the run from the serial console.
- If the two management NICs share a subnet, keep
ARP_STRICT=1. Otherwise the target's ARP can be answered by either NIC and a reply may arrive on the one that did not send. Checknic_tx/nic_rxon the RESULT line: they are that interface's own counter delta. - Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.7...V1.0.8
Downloads
-
released this
2026-08-25 14:22:22 +08:00 | 35 commits to main since this release✨ New features
10G / 1G management port ping test
- New
mgmt_ping_monitor.shexercises both management NICs in one loop: it brings each up with iproute2, waits for the link to settle, then pings that NIC's own target —eth0→192.168.1.30,eth1→192.168.1.31. - Runs detached like the other monitors:
start/stop/status/fg/summary.startclears the previous log, so one run means one log. - Every leg writes a single greppable line —
RESULT 10G eth0 -> 192.168.1.30 tx=10 rx=10 loss=0% rtt_avg=1.743ms nic_tx=10 nic_rx=10 PASS— so a whole soak can be read withsummaryinstead of scrolling. nic_tx/nic_rxare that interface's own counter delta across the burst. If a ping passes but they stay near zero, the traffic left on the other NIC and the number does not belong to this one.- Script A runs one round as a baseline; Script B leaves it running through the soak.
Fan speed is set at the start of every run
FAN_SPEEDinconfig.ttl(default 30) is applied by Script A, so a run no longer inherits whatever the previous test left the fans doing.- Both MAX31790 controllers are rebound first, which clears a controller left in an odd state.
Stress load moved onto the platform's own job runner
- CPU, DDR, SSD and USB stress now go through
bgctl, replacing the~/hammer/tools/stress_*.pyscripts.bgctl listshows what is running; Script C stops everything withbgctl stop --all. - BMC DDR stress runs through
bmc-manager, and a new BMC USB test discovers thecdc_ncminterface and pings across it for four hours undersystemd-run.
More of the DUT on record
- Script A now captures the boot image,
show version, firmware status, system EEPROM, SSD health, TPM version and NVMe SMART data before the test starts. - PCIe AER now sits next to
ras-mc-ctl --summary, and Script C closes with NVMe health so a disk that degraded during the soak is visible. dmesgcapture uses human-readable timestamps and one combined error pattern, then clears the ring buffer — so Script C's dmesg shows only what the soak produced, not everything since boot.- Each run opens with
hw-test-session startand closes withfinish; Script C copies the job logs to/mnt/usb/jobs-<date>_<time>so they leave the DUT with the run they belong to.
🐛 Bug fixes
Script A no longer hangs waiting for ports that are already up
- The readiness gate required more than 216 ports up, but a fully cabled unit reports exactly 216 — 108 loopback pairs times two. Script A sat in the poll loop forever on the very state it was waiting for. It now proceeds at 216.
- The comments in
wait_init.ttlstill described the old "more than" rule; they now match the code, so the off-by-one cannot be reintroduced by reading the wrong line.
The macro no longer runs ahead of the DUT during the soak
- Script B set a 15-second wait cap for the
cdc_ncmprobe and never restored it. In Tera Term that cap is global, so it stayed in force for everything after — including the traffic setup, which walks 108 VLANs per switch unit and takes far longer. A timed-out wait returns without the prompt, leaving every later command issued a step early.
Fan controller is no longer bound twice
- One of the two MAX31790 controllers received a second
bindimmediately after the first, which could only fail because the driver was already attached.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.7.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis not optional.mgmt_ping_monitor.shis executed rather than sourced and re-execs its own path to daemonise, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without itstartfails withPermission deniedand the latercatfinds nothing — the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has. Traffic and the readiness gate both follow them: a single unit gets-u 0or-u 1, and with neither set the traffic stage is skipped instead of failing against hardware that is not there. - Both management NICs stay up. If they share a subnet, keep
ARP_STRICT=1— otherwise the target's ARP can be answered by either NIC and a reply may arrive on the one that did not send. - Management connectivity is exercised, not preserved. Drive the run from the serial console.
- Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled, and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.5...V1.0.7
Downloads
- New
-
released this
2026-08-21 16:06:54 +08:00 | 39 commits to main since this releaseBlanton TTL Script V1.0.5
One test run is Script A (baseline) -> B (soak) -> C (verdict), all captured in a single Tera Term log.
✨ New features
Partly populated DUTs
-
config.ttldeclares the switch population once:SWB_UNIT0 = 1 ; this DUT has switch unit 0 SWB_UNIT1 = 1 ; this DUT has switch unit 1 -
The traffic blocks in A, B and C branch on it: no
-uwhen both units are fitted (the tool's ownTL_UNITS="0 1"applies),-u 0or-u 1for a single one, and the whole stage is skipped when neither is set -
utils/wait_init.ttlreads the same two flags, so the wait and the traffic cannot disagree about what is installed
Readiness gate
- Script A now waits on the data plane rather than the sensors: it polls
bcmcmd -n <u> -c ps | grep -w up | wc -land proceeds once every fitted unit reports at leastWT_MIN(216) ports up — 216 being 108 loopback pairs x 2, i.e. every cabled port
BMC
bmc_monitor.sh(samplesfree -m) andbmc_monitor_ddr.sh(memtester) run through the soak viabmc-manager run, started by Script B and collected by Script C
Inventory and link state
- Script A: boot image, board EEPROM (
hpe-eeprom-tlv), BMC version, 100G uplink configuration and status, uptime - Script C:
show reboot-causeand uptime, so an unplanned reset during the soak shows up in the closing snapshot - LLDP disabled and transceiver low-power mode cleared before traffic, so the loopback counters only reflect the injected burst
🐛 Bug fixes
- Script A never got past the port wait. The threshold was strictly greater than 216, but a fully cabled unit reports exactly 216, so the loop spun forever on the very state it was waiting for. Now "at least 216"
- Single-unit traffic paths were unreachable. All nine branch conditions compared
SWB_UNIT0against itself, so a DUT with only unit 0 ran the both-unit commands against an absent unit 1, and a DUT with only unit 1 skipped traffic altogether config save -ywas sent without waiting for the prompt, leaving the macro one step ahead of the DUT from that point on
⚠️ Deployment notes
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT>:~/ chmod +x ~/Blanton_Script/bmc_monitor*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis still not optional.bmc_monitor*.share executed rather than sourced,do_startre-execs its own path, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without it Script B'sstartfails withPermission deniedand Script C'scatfinds nothing — the BMC section ends up empty and nothing reports an error.Two settings in this build persist to
config_db.jsonand survive a reboot: LLDP is left disabled, and Ethernet513 is left shut down. Restore them before the DUT moves on to other work.📦 Downloads
File Contents Script_ABC_Blanton_V1.0.5.zipThe full Tera Term working directory, including Blanton_Script/to scp onto the DUTDownloads
-
-
released this
2026-08-21 09:33:06 +08:00 | 46 commits to main since this releaseBlanton TTL Script V1.0.3
One test run is Script A (baseline) -> B (soak) -> C (verdict), all captured in a single Tera Term log.
✨ New features
Traffic
blanton_traffic_linespeed.shdrives SWB loopback line-speed traffic overbcmcmd, VLAN 30..137 pairingcdNwithcdN+32- Per-pair TX/RX cross-check (
cdA.TX == cdB.RX) yields PASS/FAIL; awk on the DUT,tools/bcm_mibpair_report_V1.1.0.pyoff-box - All three scripts now cover both switch units
BMC
bmc_monitor.shsamplesfree -m;bmc_monitor_ddr.shrunsmemtesteras a stress load. Both reach the BMC throughbmc-manager runfrom the host, so no interactive SSH to the BMC is needed- Script B starts them, Script C stops them and folds their logs into the master log
Data collection
- Script A records
show boot, the BMC version, 100G port status andshow uptime, and waits for pmon to come up before taking a baseline (utils/wait_init.ttl) - Script C adds
show reboot-causeandshow uptime, so an unplanned reset during the soak is visible in the closing snapshot - PMON snapshot extended with
leak statusandleak channels
Packaging
publish/publish.shbuildspublish/Script_ABC_Blanton_<Ver>/(-zfor a zip). The version is read from Script A's header, so the folder name cannot disagree with the macro
🐛 Bug fixes
- Every counter in the traffic report printed as 2147483647 — the DUT's awk casts to a 32-bit int for
%d, and a real line-speed run is around 1e12. Now formatted with%.0f. Verdicts were never affected: the cross-check compares doubles and only the display path was wrong - SWB I2C channels and LTC2977 addresses — corrected against the bench. CONN13/15 and CONN14/16 were paired to the wrong channels, and addresses step by 2, not 1. This also clears the collision where two CONNs both landed on
0x5Eon Ch6 - CRLF made
margin.shunrunnable on SONiC ($'\r': command not found)..gitattributesnow pins*.shand*.confto LF.settings/*.confwas the quieter half: they are sourced, soCB_I2C_CH=6became"6\r" - margin.sh v2.6.0 — the SWB path never found the cb_i2c backend, so
TRANSPORT=swbalways failed to load. It now searches the parentBlanton_Script/directory, and the duplicated backend copies were removed - Script C hung — it called a subcommand that runs
tail -fand never returns, so the run never reached the stress results or the closing messagebox. Replaced with a directcatof the logs
⚠️ Deployment notes
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT>:~/ chmod +x ~/Blanton_Script/bmc_monitor*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis not optional.bmc_monitor*.share the first scripts here meant to be executed rather than sourced,do_startre-execs its own path, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without it Script B'sstartfails withPermission deniedand Script C'scatfinds nothing — the BMC section ends up empty and nothing reports an error.📦 Downloads
File Contents Script_ABC_Blanton_V1.0.3.zipThe full Tera Term working directory, including Blanton_Script/to scp onto the DUTDownloads