Files
etwenandClaude Opus 5 59861cf953 feat(ber,power): Add the BER sweep and TR518 load; keep ce0 actually sending
Three new tools and one fix to an old one.

blanton_ber.sh - PRBS BER across every cabled port, init/start/report/
stop/clear, -u 0|1|all. A lane passes only below 1e-6 (equal to the
threshold fails). report ends with a per-unit summary carrying the worst
lane, so an all-PASS run still shows how much margin there was. init
checks every lane locked, because an unlocked lane still reports a BER
and it is a meaningless one. Script C runs it after the traffic report,
following SWB_UNIT0/SWB_UNIT1 like the traffic block does.

blanton_tr518.sh - the built-in packet test, used to load the rails
before measuring power. start settles 120s so the reading afterwards is
loaded rather than mid-ramp. stop sends port cd lb=none and nothing else,
exactly what the bench procedure does - l2 learning and test mode are
left as start set them, and stop says so instead of quietly leaving the
box in a state nobody asked about.

TH6_SWB{0,1}_power_readback.sh - 19 rails, V x I and total. These read
the two sensor tables ONCE. The previous version read them per rail: 38
invocations of a slow CLI at 38 different instants, so the "total" was a
sum of readings seconds apart - and under load the currents move (TH6_CORE
186 A -> 636 A). A rail missing from the table now warns on stderr instead
of silently contributing 0 W.

blanton_traffic_linespeed.sh - ce0 (VLAN 138) joins the test. It has no
loopback partner and a switch never sends a frame back out its ingress
port, so a tx burst was one round trip and then silence. init now sets an
ingress mirror of ce0 back to itself; the mirrored copy is not
egress-filtered, so packets keep lapping until stop turns the mirror off.
stop is what ends it - removing the VLAN membership does not, because the
copy never consulted the VLAN. TL_CE_MODE also drops to 'self': ps ce
shows one ce port per unit and a unit-0-only burst returned on unit 0.
Read as cross-unit, both links dying would still report PASS (0 == 0).

Fixes a parser bug worth remembering: bcmcmd returns CRLF, and the BER is
the last token on its line, so the CR stayed glued to the number. Every
lane read as NA, and printing the CR sent the cursor to column 1 so the
RESULT column overwrote the start of the row. One stray \r, two symptoms.

Not yet verified on hardware, all called out in the release notes: the
ce0 mirror (destport == srcport may be refused), the 120s settle (tr 518
may be time-limited), and 'test mode nr=no' on stop.

Script A -> V1.1.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
2026-08-28 16:33:40 +08:00

7.3 KiB
Raw Permalink Blame History

v1.1.0 — BER, power under load, and a 100G port that actually keeps sending

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. initstart → wait → reportstopclear, 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.

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