From 1c6bda8279bcdcce564bdf83c59dc6a3ac7e3f97 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 18 Apr 2022 08:46:21 +0000 Subject: [PATCH] Restore pre-emphasis when LT is transitioned from ON to OFF Signed-off-by: Dante Su --- orchagent/port.h | 3 +++ orchagent/portsorch.cpp | 19 ++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/orchagent/port.h b/orchagent/port.h index ee0320cc26..18fca7a6ca 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -174,6 +174,9 @@ class Port sai_object_id_t m_switch_id = 0; sai_object_id_t m_line_side_id = 0; + /* pre-emphasis */ + std::map> m_preemphasis; + bool m_fec_cfg = false; bool m_an_cfg = false; bool m_port_cap_lt = false; /* Port Capability - LinkTraining */ diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 7d095298e5..e5b3cec9a3 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -3100,6 +3100,12 @@ void PortsOrch::doPortTask(Consumer &consumer) p.m_link_training = lt; m_portList[alias] = p; updatePortStatePoll(p, PORT_STATE_POLL_LT, (lt > 0)); + + // Restore pre-emphasis when LT is transitioned from ON to OFF + if ((p.m_link_training < 1) && (serdes_attr.size() == 0)) + { + serdes_attr = p.m_preemphasis; + } } } @@ -3440,9 +3446,17 @@ void PortsOrch::doPortTask(Consumer &consumer) if (serdes_attr.size() != 0) { - if (setPortSerdesAttribute(p.m_port_id, serdes_attr)) + if (p.m_link_training > 0) + { + SWSS_LOG_NOTICE("Save port %s preemphasis for LT", alias.c_str()); + p.m_preemphasis = serdes_attr; + m_portList[alias] = p; + } + else if (setPortSerdesAttribute(p.m_port_id, serdes_attr)) { - SWSS_LOG_NOTICE("Set port %s preemphasis is success", alias.c_str()); + SWSS_LOG_NOTICE("Set port %s preemphasis is success", alias.c_str()); + p.m_preemphasis = serdes_attr; + m_portList[alias] = p; } else { @@ -3450,7 +3464,6 @@ void PortsOrch::doPortTask(Consumer &consumer) it++; continue; } - } /* Last step set port admin status */