-
released this
2026-09-02 21:44:12 +08:00 | 38 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 | 40 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 | 41 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 | 42 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 | 43 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 | 44 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:
-
released this
2026-08-28 16:33:43 +08:00 | 45 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 | 46 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 | 48 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 | 49 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
-