Unplugged-cable behavior fixed end to end: heat grid rolls on the slot boundary (view computes the newest slot from the draw clock; history sampled every frame so slots color within a frame; noise phase displayed as commanded straight from the shared clock — radiating and the per-slot vote deleted), SNR ghost panic disambiguated via the PMA 1.1 latch (link dropped mid-read discards the batch, ghost on a proven-up link still dies), measure skips the 25s relink wait when the ECD verdict says faulted and the header says MEASURING instead of GOOD while a diag runs, RollBall mailbox deadline resized to 10s from bench measurement (<25ms linked, ~220ms no-link, >3s during a live plug's training; docs/modules/wiitek updated)
This commit is contained in:
@@ -38,7 +38,7 @@ type phyDev interface {
|
||||
}
|
||||
|
||||
type snrSource interface {
|
||||
snrMargins() ([4]float64, error)
|
||||
snrMargins() ([4]float64, bool, error)
|
||||
}
|
||||
|
||||
// PMA 1.1 latches low, so the first read reports any drop since it was last
|
||||
@@ -137,10 +137,9 @@ func (m *phyModule) poll() error {
|
||||
var margins [4]float64
|
||||
haveSNR := false
|
||||
if src, ok := m.dev.(snrSource); ok && link {
|
||||
if margins, err = src.snrMargins(); err != nil {
|
||||
if margins, haveSNR, err = src.snrMargins(); err != nil {
|
||||
return err
|
||||
}
|
||||
haveSNR = true
|
||||
}
|
||||
blocks, ber, pcsRaw, err := devPCSLatch(m.dev)
|
||||
if err != nil {
|
||||
@@ -405,7 +404,18 @@ func measureCable(mods []*phyModule, done *atomic.Bool) (cableInfo, error) {
|
||||
if err = devRestartAN(end); err != nil {
|
||||
return c, err
|
||||
}
|
||||
waitCarrier([2]string{mods[0].dev.name(), mods[1].dev.name()}, done)
|
||||
// A pair the diag just called faulted is not going to relink; waiting the
|
||||
// full carrier timeout would hold the verdict hostage for 25 s on an
|
||||
// unplugged cable.
|
||||
healthy := true
|
||||
for _, v := range c.ecd.verdicts {
|
||||
if v != pairOK {
|
||||
healthy = false
|
||||
}
|
||||
}
|
||||
if healthy {
|
||||
waitCarrier([2]string{mods[0].dev.name(), mods[1].dev.name()}, done)
|
||||
}
|
||||
for i, m := range mods {
|
||||
b, ok := m.dev.(*bcm)
|
||||
if !ok {
|
||||
|
||||
Reference in New Issue
Block a user