Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7907fb7
Address Copilot review feedback from previous PR
bgallagher-nexthop Mar 2, 2026
fdd5e19
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 3, 2026
a2e0429
copilot review feedback
bgallagher-nexthop Mar 3, 2026
497d75d
Empty commit to re-trigger builds
bgallagher-nexthop Mar 3, 2026
ba67b23
Empty commit to trigger builds
bgallagher-nexthop Mar 4, 2026
3ca8607
Refactor lambda to a standalone function
bgallagher-nexthop Mar 4, 2026
309e59c
Add function declaration to header file
bgallagher-nexthop Mar 5, 2026
ffa589f
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 5, 2026
1b4fb5c
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 6, 2026
e5e5b9e
Empty commit to retry build
bgallagher-nexthop Mar 6, 2026
551f8a2
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 10, 2026
372808d
Empty commit to retry CI jobs
bgallagher-nexthop Mar 10, 2026
bffd654
empty commit to retry build
bgallagher-nexthop Mar 11, 2026
d461677
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 11, 2026
cc1ce4e
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 11, 2026
ea2fc2f
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 16, 2026
fe87ef1
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 18, 2026
108bb86
Merge branch 'master' into bgallagher.copilot-review-feedback
bgallagher-nexthop Mar 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 63 additions & 62 deletions orchagent/portsorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4395,6 +4395,64 @@ void PortsOrch::doSendToIngressPortTask(Consumer &consumer)
}
}

// Helper function to program serdes with admin state management
bool PortsOrch::programSerdes(
Port &port,
sai_object_id_t port_id,
sai_object_id_t switch_id,
PortSerdesAttrMap_t &serdes_attr)
{
// Validate port_id and determine serdes type
const char* serdes_type_name;
if (port_id == port.m_port_id)
{
serdes_type_name = "ASIC";
}
else if (port_id == port.m_line_side_id)
{
serdes_type_name = "gearbox line-side";
}
else if (port_id == port.m_system_side_id)
{
serdes_type_name = "gearbox system-side";
}
else
{
SWSS_LOG_ERROR("Invalid port_id 0x%" PRIx64 " does not belong to port %s "
"(port_id: 0x%" PRIx64 ", line_side_id: 0x%" PRIx64 ", system_side_id: 0x%" PRIx64 ")",
port_id, port.m_alias.c_str(),
port.m_port_id, port.m_line_side_id, port.m_system_side_id);
return false;
}

if (port.m_admin_state_up)
{
/* Bring port down before applying serdes attribute */
if (!setPortAdminStatus(port, false))
{
SWSS_LOG_ERROR("Failed to set port %s admin status DOWN to set %s serdes attr",
port.m_alias.c_str(), serdes_type_name);
return false;
}

port.m_admin_state_up = false;
m_portList[port.m_alias] = port;
}

if (setPortSerdesAttribute(port_id, switch_id, serdes_attr))
{
SWSS_LOG_NOTICE("Successfully set %s serdes tunings for port %s",
serdes_type_name, port.m_alias.c_str());
return true;
}
else
{
SWSS_LOG_ERROR("Failed to set %s serdes tunings for port %s",
serdes_type_name, port.m_alias.c_str());
return false;
}
}

void PortsOrch::doPortTask(Consumer &consumer)
{
SWSS_LOG_ENTER();
Expand Down Expand Up @@ -5275,32 +5333,13 @@ void PortsOrch::doPortTask(Consumer &consumer)
}
else
{
if (p.m_admin_state_up)
{
/* Bring port down before applying serdes attribute*/
if (!setPortAdminStatus(p, false))
{
SWSS_LOG_ERROR("Failed to set port %s admin status DOWN to set serdes attr", p.m_alias.c_str());
it++;
continue;
}

p.m_admin_state_up = false;
m_portList[p.m_alias] = p;
}

if (setPortSerdesAttribute(p.m_port_id, gSwitchId, serdes_attr))
if (!programSerdes(p, p.m_port_id, gSwitchId, serdes_attr))
{
SWSS_LOG_NOTICE("Set port %s SI settings is successful", p.m_alias.c_str());
p.m_serdes_attrs = serdes_attr;
m_portList[p.m_alias] = p;
}
else
{
SWSS_LOG_ERROR("Failed to set port %s SI settings", p.m_alias.c_str());
it++;
continue;
}
p.m_serdes_attrs = serdes_attr;
m_portList[p.m_alias] = p;
}
}
if (pCfg.media_type.is_set)
Expand All @@ -5321,55 +5360,17 @@ void PortsOrch::doPortTask(Consumer &consumer)

if (p.m_line_side_id && !line_serdes_attr.empty())
{
if (p.m_admin_state_up)
{
/* Bring port down before applying serdes attribute*/
if (!setPortAdminStatus(p, false))
{
SWSS_LOG_ERROR("Failed to set port %s admin status DOWN to set gb line serdes attr", p.m_alias.c_str());
it++;
continue;
}

p.m_admin_state_up = false;
m_portList[p.m_alias] = p;
}

if (setPortSerdesAttribute(p.m_line_side_id, p.m_switch_id, line_serdes_attr))
if (!programSerdes(p, p.m_line_side_id, p.m_switch_id, line_serdes_attr))
{
SWSS_LOG_NOTICE("Successfully set line-side gearbox tunings for port %s", p.m_alias.c_str());
}
else
{
SWSS_LOG_ERROR("Failed to set line-side gearbox tunings for port %s", p.m_alias.c_str());
it++;
continue;
}
}

if (p.m_system_side_id && !system_serdes_attr.empty())
{
if (p.m_admin_state_up)
{
/* Bring port down before applying serdes attribute*/
if (!setPortAdminStatus(p, false))
{
SWSS_LOG_ERROR("Failed to set port %s admin status DOWN to set gb system serdes attr", p.m_alias.c_str());
it++;
continue;
}

p.m_admin_state_up = false;
m_portList[p.m_alias] = p;
}

if (setPortSerdesAttribute(p.m_system_side_id, p.m_switch_id, system_serdes_attr))
{
SWSS_LOG_NOTICE("Successfully set system-side gearbox tunings for port %s", p.m_alias.c_str());
}
else
if (!programSerdes(p, p.m_system_side_id, p.m_switch_id, system_serdes_attr))
{
SWSS_LOG_ERROR("Failed to set system-side gearbox tunings for port %s", p.m_alias.c_str());
it++;
continue;
}
Expand Down
3 changes: 3 additions & 0 deletions orchagent/portsorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,9 @@ class PortsOrch : public Orch, public Subject

void removePortSerdesAttribute(sai_object_id_t port_id);

bool programSerdes(Port &port, sai_object_id_t port_id, sai_object_id_t switch_id,
std::map<sai_port_serdes_attr_t, SerdesValue> &serdes_attr);

bool getSaiAclBindPointType(Port::Type type,
sai_acl_bind_point_type_t &sai_acl_bind_type);

Expand Down
15 changes: 15 additions & 0 deletions tests/mock_tests/portsorch_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,21 @@ namespace portsorch_test
_In_ sai_object_id_t port_serdes_id)
{
_sai_remove_port_serdes_calls.push_back(port_serdes_id);

// Erase any port-to-serdes mappings that reference this serdes ID,
// so subsequent SAI_PORT_ATTR_PORT_SERDES_ID queries reflect removal.
for (auto it = _port_to_serdes_map.begin(); it != _port_to_serdes_map.end(); )
{
if (it->second == port_serdes_id)
{
it = _port_to_serdes_map.erase(it);
}
else
{
++it;
}
}

return SAI_STATUS_SUCCESS;
}

Expand Down
Loading