• V1.2.1 7a1967bc9a

    etwen 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 on SWB_UNIT0 / SWB_UNIT1 exactly like the traffic block beside it.
    • Script C already ran the closing sweep after its traffic report. With this one at the front, the pair brackets the soak — the same shape as the DSC scans added in v1.2.0, and the same reason: a BER figure on its own says very little, a change in it says a lot.
    • The sleep 30 matches blanton_ber.sh's BER_INTERVAL. Reporting before one full interval has accumulated reads a window that has not finished, and nothing warns you about it.

    🐛 Bug fixes

    The new block's comment described the wrong position

    • It was copied out of Script C, which runs BER after the traffic report, and the comment came with it and still said "after". In Script A the block runs before traffic. The comment now says what the code does and why the ordering is what it is.

    ⚠️ Before you run

    • Watch Script A's first traffic report on the first run. PRBS holds the lanes out of normal operation and blanton_ber.sh clear is what releases them — and in Script A nothing settles between that clear and the blanton_traffic_linespeed ps / init that follows. Script C does not have this ordering, so the two reports are a built-in comparison: if Script A shows NA or FAIL pairs that Script C does not, the lanes had not come back yet, and a sleep after clear is the fix. This has not been run on hardware yet.
    • sleep 30 and BER_INTERVAL now live in three places — Script A, Script C, and blanton_ber.sh itself. Changing one without the others silently reports a partial interval.
    • BER, blanton_traffic_linespeed and blanton_tr518.sh cannot overlap. They all take over the same ports. Script A now touches those ports twice before the soak even starts.
    • EN_TX_FIR is still 0 by default, so the DSC scans do not run unless you turn them on; a full scan is ~10 min in each of Script A and Script C.
    • Replace config.ttl along with the macros. Tera Term aborts the macro on an undefined variable rather than treating it as 0.
    • bcm_dsc_scan.sh needs the execute bit: chmod +x ~/Blanton_Script/*.sh after copying.
    • --runtime is the job's overall limit, not a per-pass one. --passes does not extend it.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • Script 5 (reboot cycle) has no exit condition. A 199-cycle / 60-hour run has now been analysed: PCIe AER stayed at 0, all 218 traffic pairs and all 864 lanes passed every cycle, and the BMC never reset. Two things it did surface — bmc-first-enroll does not exist on that BMC build, and NFC returned FAIL on every cycle.
    • blanton_multiphase_margin.sh save is permanent, and must not be mixed with margin.sh.
    • READ_VIN and READ_IIN are still not in the ADPM12200 coefficient table.
    • The BMC USB service log only exists on the USB stick.
    • FAN_SPEED is 100.
    • Still unverified from v1.1.0: the ce0 ingress mirror, the 120 s settle in blanton_tr518.sh, and test mode nr=no on stop.

    📦 Downloads

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

    🔗 Links

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

    Downloads
  • V1.2.0 29ec4c2239

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

    New features

    Full-machine SerDes DSC capture, before and after the soak

    • bcm_dsc_scan.sh runs phydiag <port> dsc through the Broadcom diag shell across the whole port list — one 100G port plus the 200G ranges, about 445 per unit, on both units — and writes the raw log under Blanton_Script/log/, then copies it to /host/hw-eval/jobs/.
    • Script A takes a baseline and Script C takes a closing dump, so the pair brackets the stress run and the two are directly comparable.
    • -u 0 scans one unit, -f <name> names the log (%uu0/u1, %t → timestamp), -F overwrites, -n dry runs, -C skips the copy. A name without %u gets _u0 / _u1 inserted automatically, so unit 1 can never overwrite unit 0.
    • Every run ends with ### DSC_SCAN_DONE rc=<n>. rc=0 means every port returned a complete dump.
    • phydiag ... dsc is read-only — it does not change any SerDes setting.

    bcm_dsc_parse.sh turns a raw DSC log into two CSVs

    • <prefix>_lane.csv — one row per lane: TXEQ, RXFFE, DFE, EYE, SNR and the rest.
    • <prefix>_pm.csv — one row per pm_id: temperature, PLL, lane count, SNR/EYE statistics.
    • POSIX sh + awk, no Python, so it runs on the DUT as happily as on a laptop. Lane rows are read by the order of their bracket groups rather than by fixed column positions, so the SDK re-spacing its output does not break parsing; a row that does not yield 9 groups is reported as UNPARSED on stderr instead of being parsed wrongly.

    EN_TX_FIR in config.ttl — the DSC scan is off by default

    • A full scan is about 10 minutes and both Script A and Script C do one, so the shipped default (0) keeps ~20 minutes out of a routine run. Set it to 1 when the SerDes data is what you are after.

    The macro now waits on the DUT instead of on itself

    • Every pause N in Scripts A, B and C became sendln "sleep N" followed by wait prompt_sonic_root.
    • pause stopped the macro for N seconds without touching the DUT — the shell sat idle and the macro was guessing how long the previous command would take. On a loaded DUT the guess ran short and the next command went out before the previous one had finished, putting the whole run a beat ahead of the switch. Now the wait happens on the DUT and the macro resumes when the prompt actually comes back.
    • It also means the wait appears in the console log with a timestamp, so a round that ran long is visible afterwards.
    • Timings changed with it: the management-ping sample in Script A is 15 s (was 30), the settle after each traffic clear is 5 s (was 15). The traffic run itself stays 15 s and Script B's monitor loop stays 60 s.

    🐛 Bug fixes

    The DSC scan only ever scanned one port — and reported success

    • The scan loop read its port list on stdin, and bcmcmd reads stdin too, so the first call swallowed the rest of the file and the loop ended after a single port.
    • Nothing looked wrong. The log held one port marker and one dsc block, the marker-to-dump comparison passed because both numbers shrank together, the exit code was 0, and a 445-port scan simply finished in seconds.
    • The loop now reads on file descriptor 3 and bcmcmd is given < /dev/null, and there is a new check that the number of iterations matches the number of ports in the list — a check that cannot be fooled by the loop ending early.

    Dead call sites removed from Scripts A, B and C

    • The commented-out 100G PRBS calls, a duplicated commented 100G port-status block in Script A, and the stale bmc_monitor_ddr.sh block in Script C have been deleted. They had been dead since bring-up.
    • port_prbs_monitor.sh still ships and still runs by hand — but re-enabling it means writing the calls again, not un-commenting them.

    🔧 Changes

    • Script C no longer prints the BMC poll log or the mlucas log to the console. Both files are still copied to /host/hw-eval/jobs/ and out to the USB stick with everything else; only the master log got shorter.

    📦 Downloads

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

    After copying to the DUT:

    chmod +x ~/Blanton_Script/*.sh      # bcm_dsc_scan.sh is invoked as ./Blanton_Script/... and needs it
    grep -rlU $'\r' ~/Blanton_Script    # expect no output
    ls ~/hammer/tools/amd/mlucas-avx2   # must already be there
    

    ⚠️ Before you run

    • Replace config.ttl along with the macros. EN_TX_FIR is new, and Tera Term aborts on an undefined variable rather than treating it as 0.
    • bcm_dsc_scan.sh needs the execute bit. Script A and Script C invoke it as ./Blanton_Script/bcm_dsc_scan.sh. Without chmod +x it fails with Permission denied, the macro walks straight past it, and Script C's four cp lines then each report a missing file.
    • The DSC scan shares the ports with blanton_ber.sh, blanton_traffic_linespeed and blanton_tr518.sh — do not run it alongside any of them.
    • Script 4 and Script 5 still use pause. Only A, B and C were converted.
    • --runtime is the job's overall limit, not a per-pass one. --passes does not extend it; for a 24 hour soak set RUNTIME to 86400.
    • Script 4 has no teardown: finish it with blanton_tr518.sh stop and systemctl stop mlucas-amm.
    • Script 5 (reboot cycle) is still unverified on hardware, has no exit condition, and its wait "Booting in blind mode" has no timeout guard.
    • blanton_multiphase_margin.sh save is permanent, and must not be mixed with margin.sh.
    • READ_VIN and READ_IIN are still not in the ADPM12200 coefficient table.
    • The BMC USB service log only exists on the USB stick.
    • FAN_SPEED is 100.
    • Still unverified from v1.1.0: the ce0 ingress mirror, the 120 s settle in blanton_tr518.sh, and test mode nr=no on stop.

    🔗 Links

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

    Downloads
  • V1.1.8 eacb218da8

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

    New features

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

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

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

    Script C stops the unit and brings its log home

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

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

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

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

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

    The shipped stress defaults are now one hour

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

    🐛 Bug fixes

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

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

    📦 Downloads

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

    After copying to the DUT:

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

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

    ⚠️ Before you run

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

    🔗 Links

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

    Downloads
  • V1.1.7 1a06367ade

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

    New features

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

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

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

    5_Blanton_Script_Reboot_Cycle.ttl — an unattended reboot-cycle run

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

    • Each round: login → sudo -idate -s → fan speed → wait_initCheck Pt1 … Pt13show uptimereboot → wait for the next boot. The cycle number is printed in the banner of every round.

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

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

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

    🐛 Bug fixes

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

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

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

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

    Two check points both numbered 12

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

    📦 Downloads

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

    After copying to the DUT:

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

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

    ⚠️ Before you run

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

    🔗 Links

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

    Downloads
  • V1.1.6 78a8f641c9

    etwen 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 0x prefix, so four of the five selected the wrong page:

      Reading Datasheet PAGE Should send Spreadsheet said
      Vin 9 0x09 0x00
      Iin 10 0x0A 0x10
      Vout 2 0x02 0x02
      Iout 14 0x0E 0x14
      Temp 18 0x12 0x18
    • Only Vout worked — because 2 reads the same in either base. That is why Iin and Iout answered 0xFFFF and the temperature answered 0x0000, and why a Vin scaling had to be invented to make 50 V appear.

    • blanton_pwr_data.sh sends no page at all (its PDB table has page "-"), which is the reason it reports the whole PDB section as NA.

    New features

    pwr_brick.sh — the five power bricks, read properly

    • show prints Vin / Iin / Vout / Iout / Temp for all five: SWB0.PU207 (0x62), SWB0.PU13 (0x63), SWB1.PU332 (0x60), SWB1.PU85 (0x61) and CPB.PU37 (0x26). -r adds the raw words.
    • Conversions come from the datasheet's DIRECT equation, X = (1/m)(Y × 10⁻ᴿ − b), with Table 3's coefficients: voltage Y × 8 mV, current Y × 0.04 A, temperature Y × 0.01 °C.
    • Cross-checked, not assumed: READ_VOUT returns 0x05D4 → 1492 × 8 = 11936 mV, which is exactly the figure show platform voltage reports for that rail from a completely separate sensor path.
    • CPB.PU37 is 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 V into 32.00 V — positive, plausible in magnitude, and invisible to any "reject 0xFFFF" filter. Each value is re-read (up to PB_TRIES, default 8) until it is not 0xFFFF, not 0x0000, and lands inside a plausibility window.
    • 0x0000 is 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 / comboB for CB and each SWB CONN. comboB is comboA with every direction flipped, so running both covers each rail high and low while its neighbours sit the other way.
    • NC channels stay at nominal in 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 journalctl dump had been commented out, so that service log reached nothing at all. It now runs with -o short-iso into log/bmc_usb_net.log and is copied into the job directory for the USB archive. The ISO timestamps line up with the other monitor logs, and rm -f first keeps the file to one run.
    • It is no longer printed to the console, so the USB copy is the only copy. If that cp fails — 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.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

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

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

    ⚠️ Before you run

    • READ_VIN and READ_IIN are 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_M are 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.
    • NA has two meanings: nothing readable, or read but outside its plausibility window. Use PB_TRIES=1 ./Blanton_Script/pwr_brick.sh show -r to see the unretried raw words and tell them apart.
    • Margin profiles are positional. comboA_SWB_CONN13 applied to a CONN16 board margins the wrong rails and nothing detects it.
    • blanton_multiphase_margin.sh save is permanent, and it must not be mixed with margin.sh — same rails, two access paths, no interlock.
    • A soak longer than 24 hours needs the stress runtimes raised--runtime 86400 is a ceiling.
    • Script 4 (thermal/safety) has no teardown — finish with blanton_tr518.sh stop and kill $(jobs -p).
    • These three cannot share the switch: blanton_ber.sh, blanton_tr518.sh, blanton_traffic_linespeed.
    • FAN_SPEED is 100.
    • The three items listed as unverified in v1.1.0 are still unverified: the ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop.

    🔗 Links

    Full changelog: V1.1.5...V1.1.6

    Downloads
  • V1.1.5 215fed6e95

    etwen 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-usb was 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 164M) 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 list every 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.sh drives the multiphase controllers on both switch boards over the native i2c buses — SWB0 on /dev/i2c-13 and -15, SWB1 on -14 and -16. 19 rails per board, 38 in all.

    • high3 / low3 / comboA / comboB set 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
      
    • save commits them. It has no per-rail mapping, so it reports as one operation: Multiphase Save All.

    • -u 0 / -u 1 for a single board; rails belonging to the other board are skipped and counted separately, not failed.

    • save writes NVM permanently (PMBus STORE_USER_ALL, and 0x17 on the TH6 core rail). A power cycle does not undo it.

    • These are not the LTC2980s that margin.sh drives. 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_linespeed v0.7.0 appends PatternRandom=yes to every tx, ce0 included. 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 no forces 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=512 to tx 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.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

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

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

    ⚠️ Before you run

    • A soak longer than 24 hours needs the runtimes raised. --runtime 86400 is a ceiling; past it, SSD and USB are idle and only a shorter bgctl list hints at it.
    • blanton_multiphase_margin.sh save is permanent. Read the rails back before committing, and never run it during a test.
    • Do not mix blanton_multiphase_margin.sh and margin.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 stop and kill $(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_SPEED is 100 — the fans run flat out unless you change config.ttl.
    • The three items listed as unverified in v1.1.0 are still unverified: the ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop.

    🔗 Links

    Full changelog: V1.1.4...V1.1.5

    Downloads
  • V1.1.4 db44f72352

    etwen 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:15 in the background and blanton_tr518.sh start on the data plane.
    • Then loops every minute: platform data, both switch boards' rail power via TH6_SWB0/1_power_readback.sh, and bgctl 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 off and test mode nr=yes, and mlucas-avx2 is still running. Run blanton_tr518.sh stop and kill $(jobs -p) before anything else uses the box — nothing in show interfaces status reveals the leftover state.
    • It cannot share a DUT with Script B. Both take over the cd ports.

    Test flow diagram

    • docs/Blanton_Test_Flow.drawio draws all four scripts side by side, with the config flags that change each step marked, the one real goto in 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.sh walks nine LTC2980s over I2C and dominated the round. The scan moved to Script C, which takes it once before show 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 finish ran from inside the session's own shell

    • Script C now sends exit and waits for Script done first, so finish runs in the login shell that opened the session.

    The new script arrived with LF line endings

    • Every other .ttl in the repo is CRLF, and .gitattributes marks *.ttl as -text — whatever is committed is exactly what Tera Term gets. Converted to CRLF to match.

    📦 Downloads

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

    After copying to the DUT:

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

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

    ⚠️ Before you run

    • 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: VNOM became 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.sh is armed.
    • ce0 keeps circulating until you stop it.
    • Two numbers must stay in step: Script C's sleep 30 and blanton_ber.sh's BER_INTERVAL.
    • FAN_SPEED is 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 ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop. The settle matters most for this release — Script 4 depends on tr 518 still driving traffic minutes after it was started.

    🔗 Links

    Full changelog: V1.1.3...V1.1.4

    Downloads
  • V1.1.3 9cc41f6fbd

    etwen 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 / _low through combo_SWB_CONN16_high / _low replace the old comboA / comboB pair. 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 _high swapped 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.sh now names the right profile per board instead of one name for all nine.

    🐛 Bug fixes

    VNOM was 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_T3 0.8 → 0.82, and so on.
    • This is not a display change. VNOM is the denominator of margin_status's deviation %, and the basis margin_set derives 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 reads 0.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.sh still named comboA for all nine boards. With comboA.conf removed, every board would have stopped at Profile 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.csv is generated from settings/*.conf, so all 86 changed rails were wrong in it. Regenerated with tools/gen_channel_map.sh. It is output, not source — regenerate it, never hand-edit it.

    📦 Downloads

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

    After copying to the DUT:

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

    blanton_ber.sh and nfc_polling.sh are invoked by the macros through ./ or ~/, so they need the execute bit along with bmc_monitor.sh and usb_target.sh — neither git nor a Windows/USB copy carries it reliably.

    ⚠️ Before you run

    • Re-baseline your margin expectations. Any pass/fail limits or golden logs derived from the old VNOM values need redoing against this build.
    • margin_save in any form writes NVM permanently and now writes margin windows derived from the new reference. Run margin_status_all.sh first and never call it during a test.
    • SWB profiles are per-CONN. Applying combo_SWB_CONN13_high to a CONN16 board is silently wrong.
    • These three tests cannot share the switch: blanton_ber.sh, blanton_tr518.sh and blanton_traffic_linespeed.
    • PRBS takes the links down while blanton_ber.sh is armed.
    • ce0 keeps running until you stop it.
    • Two numbers must stay in step: Script C's sleep 30 and blanton_ber.sh's BER_INTERVAL.
    • FAN_SPEED is 100 — the fans run flat out unless you change config.ttl.
    • nfc_polling.sh start clears 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-id it 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 ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop.

    🔗 Links

    Full changelog: V1.1.2...V1.1.3

    Downloads
  • V1.1.2 bc2b529c3a

    etwen 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.sh runs blantons_nfc_validate.py over and over in the background and keeps score. start / stop / status / tail / report / clear / fg.

    • report works while the poll is still running. It only reads the log, so it never disturbs the run — and it labels itself RUNNING so 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
      
    • ERROR is counted apart from FAIL. 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.

    • report also lists which NFCID1s were seen and how often, and the last ten failures with their timestamps and reasons.

    • start clears 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 is nfc_poll.log. The cp failed, 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.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

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

    blanton_ber.sh and nfc_polling.sh are invoked by the macros through ./ or ~/, so they need the execute bit along with bmc_monitor.sh and usb_target.sh — neither git nor a Windows/USB copy carries it reliably. blantons_nfc_validate.py does not need it: nfc_polling.sh calls it through python3 precisely so one more chmod cannot be forgotten.

    ⚠️ Before you run

    • nfc_polling.sh start clears 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.log and 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.sh and blanton_traffic_linespeed all take over port loopback and L2 learning. Script C already orders BER after the traffic report.
    • PRBS takes the links down while blanton_ber.sh is armed. That is the test working, not a fault.
    • ce0 keeps running until you stop it. An interrupted run leaves the 100G port saturated with nothing in show interfaces status to hint at it.
    • Two numbers must stay in step: Script C's sleep 30 and blanton_ber.sh's BER_INTERVAL.
    • FAN_SPEED is 100 — the fans run flat out unless you change config.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 ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop. See v1.1.0 for the one-command check on each.

    🔗 Links

    Full changelog: V1.1.1...V1.1.2

    Downloads
  • V1.1.1 c3b0d49145

    etwen 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, then bgctl list so 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 list nobody was reading.
    • The bgctl list at 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.zip The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT

    After copying to the DUT:

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

    blanton_ber.sh is invoked by Script C as ./Blanton_Script/blanton_ber.sh, so it needs the execute bit along with bmc_monitor.sh and usb_target.sh — and neither git nor a Windows/USB copy carries it reliably. Without the chmod the BER section fails with Permission denied and the log simply has no BER in it.

    ⚠️ Before you run

    • hw-test-session finish at 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.sh and blanton_traffic_linespeed all take over port loopback and L2 learning. Script C already orders BER after the traffic report.
    • PRBS takes the links down while blanton_ber.sh is armed. That is the test working, not a fault.
    • ce0 keeps running until you stop it. If a run is interrupted between start and stop, the 100G port stays saturated with nothing in show interfaces status to hint at it.
    • Two numbers must stay in step: Script C's sleep 30 and blanton_ber.sh's BER_INTERVAL.
    • FAN_SPEED is 100 — the fans run flat out unless you change config.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 ce0 ingress mirror, the 120s settle in blanton_tr518.sh, and test mode nr=no on stop. See v1.1.0 for the one-command check on each.

    🔗 Links

    Full changelog: V1.1.0...V1.1.1

    Downloads