@@ -514,6 +514,18 @@ PortsOrch::PortsOrch(DBConnector *db, DBConnector *stateDb, vector<table_name_wi
514514
515515 if (gMySwitchType != " dpu" )
516516 {
517+ sai_attr_capability_t attr_cap;
518+ if (sai_query_attribute_capability (gSwitchId , SAI_OBJECT_TYPE_PORT,
519+ SAI_PORT_ATTR_AUTO_NEG_FEC_MODE_OVERRIDE,
520+ &attr_cap) != SAI_STATUS_SUCCESS)
521+ {
522+ SWSS_LOG_NOTICE (" Unable to query autoneg fec mode override" );
523+ }
524+ else if (attr_cap.set_implemented && attr_cap.create_implemented )
525+ {
526+ fec_override_sup = true ;
527+ }
528+
517529 /* Get default 1Q bridge and default VLAN */
518530 sai_status_t status;
519531 sai_attribute_t attr;
@@ -1508,6 +1520,28 @@ bool PortsOrch::setPortTpid(Port &port, sai_uint16_t tpid)
15081520 return true ;
15091521}
15101522
1523+ bool PortsOrch::setPortFecOverride (sai_object_id_t port_obj, bool fec_override)
1524+ {
1525+ sai_attribute_t attr;
1526+ sai_status_t status;
1527+
1528+ attr.id = SAI_PORT_ATTR_AUTO_NEG_FEC_MODE_OVERRIDE;
1529+ attr.value .booldata = fec_override;
1530+
1531+ status = sai_port_api->set_port_attribute (port_obj, &attr);
1532+ if (status != SAI_STATUS_SUCCESS)
1533+ {
1534+ SWSS_LOG_ERROR (" Failed to set fec override %d to port pid:%" PRIx64, attr.value .booldata , port_obj);
1535+ task_process_status handle_status = handleSaiSetStatus (SAI_API_PORT, status);
1536+ if (handle_status != task_success)
1537+ {
1538+ return parseHandleSaiStatusFailure (handle_status);
1539+ }
1540+ }
1541+ SWSS_LOG_INFO (" Set fec override %d to port pid:%" PRIx64, attr.value .booldata , port_obj);
1542+ return true ;
1543+ }
1544+
15111545bool PortsOrch::setPortFec (Port &port, sai_port_fec_mode_t fec_mode)
15121546{
15131547 SWSS_LOG_ENTER ();
@@ -1527,6 +1561,10 @@ bool PortsOrch::setPortFec(Port &port, sai_port_fec_mode_t fec_mode)
15271561 }
15281562 }
15291563
1564+ if (fec_override_sup && !setPortFecOverride (port.m_port_id , true ))
1565+ {
1566+ return false ;
1567+ }
15301568 setGearboxPortsAttr (port, SAI_PORT_ATTR_FEC_MODE, &fec_mode);
15311569
15321570 SWSS_LOG_NOTICE (" Set port %s FEC mode %d" , port.m_alias .c_str (), fec_mode);
@@ -2530,6 +2568,10 @@ bool PortsOrch::setGearboxPortAttr(const Port &port, dest_port_type_t port_type,
25302568 m_gearboxTable->hset (key, speed_attr, to_string (speed));
25312569 SWSS_LOG_NOTICE (" BOX: Updated APPL_DB key:%s %s %d" , key.c_str (), speed_attr.c_str (), speed);
25322570 }
2571+ else if (id == SAI_PORT_ATTR_FEC_MODE && fec_override_sup && !setPortFecOverride (dest_port_id, true ))
2572+ {
2573+ return false ;
2574+ }
25332575 }
25342576 else
25352577 {
0 commit comments