• V1.1.6 78a8f641c9

    etwen 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 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 | 40 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 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 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 | 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: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 | 42 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 | 43 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 | 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, 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
  • V1.1.0 59861cf953

    etwen 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.sh runs PRBS across every cabled port and reports the bit error rate lane by lane. init → start → wait → report → stop → clear, with -u 0 / -u 1 for 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.

    • report ends 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
      
    • init also 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 from FAIL, because "not measured" and "measured and bad" are different problems.

    • Script C runs the sweep after the traffic report, following SWB_UNIT0 / SWB_UNIT1 the same way the traffic block does.

    TR518 load test, for measuring power under traffic

    • New blanton_tr518.sh puts the cd ports in loopback and runs the built-in tr 518 packet test, then waits TR_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 1 for one unit; no flag runs both.
    • stop sends port cd lb=none and nothing else, which is exactly what the bench procedure does. L2 learning and test mode are left as start set them — the tool says so on every stop rather than quietly leaving the box in a state you did not ask about. TR_RESTORE_LEARN=1 / TR_RESTORE_TESTMODE=1 if you want a true inverse.

    Per-rail power readback for both switch boards

    • TH6_SWB0_power_readback.sh / TH6_SWB1_power_readback.sh report 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 voltage and show platform current once per rail — 38 invocations of a slow CLI, and 38 different instants. Under load the currents move a lot (TH6_CORE was 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 W to the total. It now says so on stderr; the printed report format is unchanged.

    The 100G port stopped sending after one round trip

    • ce0 has no loopback partner, and a switch never forwards a frame back out the port it arrived on — so a tx burst went out, came back, and was dropped. TX 100, RX 100, silence. That measures the link; it does not exercise it.
    • init now sets an ingress mirror of ce0 back 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). stop is 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

    • ce0 was treated as a cross-unit check. The bench says otherwise: there is one ce0 per 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 leaves unit0.TX == unit1.RX (0 == 0) and reports PASS.

    Every BER lane reported NA, and the Port column printed NA too

    • bcmcmd returns 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.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 joins bmc_monitor.sh and usb_target.sh in needing the execute bit — 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

    • 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. Run one at a time; Script C already orders BER after the traffic report.
    • PRBS takes the links down. While blanton_ber.sh is armed the ports report DOWN and no traffic passes. That is the test working, not a fault. clear releases them.
    • 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. blanton_traffic_linespeed stop (or bcmcmd -n <u> -c 'mirror port ce0 Mode=Off') ends it.
    • Two numbers must stay in step: Script C's sleep 30 and blanton_ber.sh's BER_INTERVAL. Change one without the other and report reads an interval that has not finished accumulating — with no warning.
    • FAN_SPEED is 100. This build runs the fans flat out unless you change config.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 ce0 ingress mirror. mirror port ce0 Mode=Ingress DestPort=ce0 should make the port circulate, but the hardware may refuse a mirror destination equal to its source. Check show c | grep POK.ce0 twice ten seconds apart — the number must climb. The report cannot tell you: a one-shot burst is also TX == RX and also says PASS. Fallback is tr 518 PortList=268.
    • The 120s settle in blanton_tr518.sh. If tr 518's traffic is time-limited (its parameters include runtime=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=no in blanton_tr518.sh is the derived inverse of the nr=yes that start sends; it is not part of the bench-verified sequence, and is off by default.

    🔗 Links

    Full changelog: V1.0.11...V1.1.0

    Downloads
  • etwen 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 blanton walks all 18 of them from one flat list: no margin_init, no FPGA channel setup, no pcimem.
    • 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.md and 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_STORE at the top of margin.sh rather 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 exist means 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 in settings/

    • Runs margin_init + margin_save across all nine boards, then puts back whichever board you had loaded, so a following margin_status still 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 failed tally, and both return a non-zero exit code when anything failed.

    The fans now default to full speed

    • FAN_SPEED in config.ttl is 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_save discarded the result of every write, so a NACK printed Change Saved exactly 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_ALL was sent with a data byte it should not have

    • The command went out as 0x15 followed by a dummy 0x00 — an SMBus write-byte, where STORE_USER_ALL is a send-byte. The LTC2977 tolerated it, but tolerance is not correctness. It is now i2cset ... 0x15 c on the native path and a no-data cb_pmbus_write on the FPGA path.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.0.11.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
    

    mgmt_ping_monitor.sh and port_prbs_monitor.sh launch their workers through bash, so those two run without the execute bit. bmc_monitor.sh and usb_target.sh still need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without the chmod, start fails with Permission denied and the later cat finds nothing: the section ends up empty and nothing reports an error.

    ⚠️ Before you run

    • margin_save in any form writes NVM permanently. A power cycle does not undo it. margin_save all and margin_save blanton do it to all 18 controllers at once. Run margin_status_all.sh first 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 blanton issues 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_UNIT1 in config.ttl say which switch units this DUT has; traffic and the readiness gate both follow them.
    • FAN_SPEED is now 100. It is applied at the start of every run, so this build runs the fans flat out unless you change config.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.sh by hand if you want it; the calls in A/B/C remain commented out.
    • Two settings persist to config_db.json and survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.

    🔗 Links

    Full changelog: V1.0.10...V1.0.11

    Downloads
  • etwen 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) and jobs (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: bgctl knows about the platform's job runner, jobs knows about anything the macro backgrounded in that shell.

    A single table for all 144 margin channels

    • docs/LTC2980_channel_map.csv flattens the nine settings/*.conf files into one sheet — Board,CONN,Ch,NetName,Vnom — so "which board and channel is PVDD1V5_TSC on?" is one search instead of opening nine files.
    • tools/gen_channel_map.sh regenerates it. The CSV is output, not source: edit the .conf files 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 / 8 picks the chip, ch % 8 picks 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.txt and tools/fan_ctrl.txt join the existing traffic_loopback_*.txt set: the raw bcmcmd / 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 1 had 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 with pause 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 10mins while running with no delay whatsoever. It now says what it does.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.0.10.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
    

    mgmt_ping_monitor.sh and port_prbs_monitor.sh launch their workers through bash, so those two run without the execute bit. bmc_monitor.sh and usb_target.sh still need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without the chmod, start fails with Permission denied and the later cat finds nothing: the section ends up empty and nothing reports an error.

    ⚠️ Before you run

    • Declare the switch population. SWB_UNIT0 / SWB_UNIT1 in config.ttl say 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.sh by 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.txt sets port all lb=mac and l2 learn off across the whole unit, which is the same hardware blanton_traffic_linespeed is using. Pick one.
    • Two settings persist to config_db.json and survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.

    🔗 Links

    Full changelog: V1.0.9...V1.0.10

    Downloads
  • V1.0.9 03d609cc1f

    etwen 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.sh drives a PRBS test on both 100G uplinks: it clears low-power mode, arms the pattern, then polls phy diag <phy> prbs get in the background until stopped. A poll counts as PASS only when the output says PRBS OK!; prbsstat Ber is captured alongside every poll for the record.

    • stop runs prbsstat STOp and prbs clear on each port before rendering the report, so the test does not leave PRBS armed behind it.

    • report gives 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 a or start b runs 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 reports SKIP, not FAIL.

    • 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.sh reports 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 that mount succeeded.
    • 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/usb was 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 status right after starting PRBS reads as a failure

    • With PRBS armed the link is out of normal operation and reports DOWN. port_prbs_monitor.sh deliberately does not print the port status at start — it appears in the report instead, after prbs clear, labelled as the recovered state.

    📦 Downloads

    File Contents
    Script_ABC_Blanton_V1.0.9.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
    

    mgmt_ping_monitor.sh and port_prbs_monitor.sh launch their workers through bash, so those two run without the execute bit. bmc_monitor.sh and usb_target.sh still need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without the chmod, start fails with Permission denied and the later cat finds nothing: the section ends up empty and nothing reports an error.

    ⚠️ Before you run

    • Declare the switch population. SWB_UNIT0 / SWB_UNIT1 in config.ttl say 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.sh by hand if you want it; uncommenting the calls in A/B/C is not supported in this build.
    • Two settings persist to config_db.json and survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.

    🔗 Links

    Full changelog: V1.0.8...V1.0.9

    Downloads