Skip to content

Commit 4575949

Browse files
committed
Support setting tx taps on gearbox ports
1 parent 9f2e27b commit 4575949

File tree

5 files changed

+134
-5
lines changed

5 files changed

+134
-5
lines changed

gearsyncd/gearboxparser.cpp

+23-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616

1717
#include "gearboxparser.h"
18+
#include "gearboxutils.h"
1819
#include "phyparser.h"
1920
#include <vector>
2021

@@ -42,7 +43,7 @@ bool GearboxParser::parse()
4243
return false;
4344
}
4445

45-
json phys, phy, interfaces, interface, val, lanes;
46+
json phys, phy, interfaces, interface, val, lanes, txFir;
4647

4748
std::vector<swss::FieldValueTuple> attrs;
4849

@@ -285,6 +286,27 @@ bool GearboxParser::parse()
285286
SWSS_LOG_ERROR("missing 'line_lanes' field in 'interfaces' item %d in gearbox configuration", iter);
286287
return false;
287288
}
289+
290+
for (std::string txFirKey: swss::tx_fir_strings)
291+
{
292+
if (interface.find(txFirKey) != interface.end())
293+
{
294+
txFir = interface[txFirKey]; // vec
295+
std::string txFirValuesStr("");
296+
for (uint32_t iter2 = 0; iter2 < txFir.size(); iter2++)
297+
{
298+
val = txFir[iter2];
299+
if (txFirValuesStr.length() > 0)
300+
{
301+
txFirValuesStr += ",";
302+
}
303+
txFirValuesStr += std::to_string(val.get<int>());
304+
}
305+
attr = std::make_pair(txFirKey, txFirValuesStr);
306+
attrs.push_back(attr);
307+
}
308+
}
309+
288310
std::string key;
289311
key = "interface:" + std::to_string(index);
290312
if (getWriteToDb() == true)

lib/gearboxutils.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,11 @@ std::map<int, gearbox_interface_t> GearboxUtils::loadInterfaceMap(Table *gearbox
266266
}
267267
}
268268
}
269+
else if (tx_fir_strings.find(val.first) != tx_fir_strings.end())
270+
{
271+
SWSS_LOG_DEBUG("Parsed key:%s, val:%s", val.first.c_str(), val.second.c_str());
272+
interface.tx_firs[val.first] = val.second;
273+
}
269274
}
270275
gearboxInterfaceMap[interface.index] = interface;
271276
}

lib/gearboxutils.h

+19
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,24 @@
3030

3131
namespace swss {
3232

33+
static const std::set<std::string> tx_fir_strings =
34+
{
35+
"system_tx_fir_pre1",
36+
"system_tx_fir_pre2",
37+
"system_tx_fir_pre3",
38+
"system_tx_fir_post1",
39+
"system_tx_fir_post2",
40+
"system_tx_fir_post3",
41+
"system_tx_fir_main",
42+
"line_tx_fir_pre1",
43+
"line_tx_fir_pre2",
44+
"line_tx_fir_pre3",
45+
"line_tx_fir_post1",
46+
"line_tx_fir_post2",
47+
"line_tx_fir_post3",
48+
"line_tx_fir_main"
49+
};
50+
3351
typedef struct
3452
{
3553
int phy_id;
@@ -54,6 +72,7 @@ typedef struct
5472
int phy_id;
5573
std::set<int> line_lanes;
5674
std::set<int> system_lanes;
75+
std::map<std::string, std::string> tx_firs;
5776
} gearbox_interface_t;
5877

5978
typedef struct

orchagent/portsorch.cpp

+63-3
Original file line numberDiff line numberDiff line change
@@ -3703,7 +3703,7 @@ void PortsOrch::doPortTask(Consumer &consumer)
37033703
p.m_preemphasis = serdes_attr;
37043704
m_portList[alias] = p;
37053705
}
3706-
else if (setPortSerdesAttribute(p.m_port_id, serdes_attr))
3706+
else if (setPortSerdesAttribute(p.m_port_id, gSwitchId, serdes_attr))
37073707
{
37083708
SWSS_LOG_NOTICE("Set port %s preemphasis is success", alias.c_str());
37093709
p.m_preemphasis = serdes_attr;
@@ -6530,7 +6530,7 @@ bool PortsOrch::removeAclTableGroup(const Port &p)
65306530
return true;
65316531
}
65326532

6533-
bool PortsOrch::setPortSerdesAttribute(sai_object_id_t port_id,
6533+
bool PortsOrch::setPortSerdesAttribute(sai_object_id_t port_id, sai_object_id_t switch_id,
65346534
map<sai_port_serdes_attr_t, vector<uint32_t>> &serdes_attr)
65356535
{
65366536
SWSS_LOG_ENTER();
@@ -6582,7 +6582,7 @@ bool PortsOrch::setPortSerdesAttribute(sai_object_id_t port_id,
65826582
port_serdes_attr.value.u32list.list = it->second.data();
65836583
attr_list.emplace_back(port_serdes_attr);
65846584
}
6585-
status = sai_port_api->create_port_serdes(&port_serdes_id, gSwitchId,
6585+
status = sai_port_api->create_port_serdes(&port_serdes_id, switch_id,
65866586
static_cast<uint32_t>(serdes_attr.size()+1),
65876587
attr_list.data());
65886588

@@ -6648,6 +6648,22 @@ void PortsOrch::getPortSerdesVal(const std::string& val_str,
66486648
}
66496649
}
66506650

6651+
void PortsOrch::getPortSerdesValBase10(const std::string& val_str,
6652+
std::vector<uint32_t> &lane_values)
6653+
{
6654+
SWSS_LOG_ENTER();
6655+
6656+
uint32_t lane_val;
6657+
std::string lane_str;
6658+
std::istringstream iss(val_str);
6659+
6660+
while (std::getline(iss, lane_str, ','))
6661+
{
6662+
lane_val = (uint32_t)std::stoul(lane_str, NULL, 10);
6663+
lane_values.push_back(lane_val);
6664+
}
6665+
}
6666+
66516667
bool PortsOrch::getPortAdvSpeedsVal(const std::string &val_str,
66526668
std::vector<uint32_t> &speed_values)
66536669
{
@@ -7017,6 +7033,50 @@ bool PortsOrch::initGearboxPort(Port &port)
70177033

70187034
fields[0] = FieldValueTuple(port.m_alias + "_line", sai_serialize_object_id(linePort));
70197035
m_gbcounterTable->set("", fields);
7036+
7037+
/* Set serdes tx taps on system and line side */
7038+
map<sai_port_serdes_attr_t, vector<uint32_t>> serdes_attr;
7039+
typedef pair<sai_port_serdes_attr_t, vector<uint32_t>> serdes_attr_pair;
7040+
vector<uint32_t> attr_val;
7041+
for (auto pair: tx_fir_strings_system_side) {
7042+
if (m_gearboxInterfaceMap[port.m_index].tx_firs.find(pair.first) != m_gearboxInterfaceMap[port.m_index].tx_firs.end() ) {
7043+
attr_val.clear();
7044+
getPortSerdesValBase10(m_gearboxInterfaceMap[port.m_index].tx_firs[pair.first], attr_val);
7045+
serdes_attr.insert(serdes_attr_pair(pair.second, attr_val));
7046+
}
7047+
}
7048+
if (serdes_attr.size() != 0)
7049+
{
7050+
if (setPortSerdesAttribute(systemPort, phyOid, serdes_attr))
7051+
{
7052+
SWSS_LOG_NOTICE("Set port %s system side preemphasis is success", port.m_alias.c_str());
7053+
}
7054+
else
7055+
{
7056+
SWSS_LOG_ERROR("Failed to set port %s system side pre-emphasis", port.m_alias.c_str());
7057+
return false;
7058+
}
7059+
}
7060+
serdes_attr.clear();
7061+
for (auto pair: tx_fir_strings_line_side) {
7062+
if (m_gearboxInterfaceMap[port.m_index].tx_firs.find(pair.first) != m_gearboxInterfaceMap[port.m_index].tx_firs.end() ) {
7063+
attr_val.clear();
7064+
getPortSerdesValBase10(m_gearboxInterfaceMap[port.m_index].tx_firs[pair.first], attr_val);
7065+
serdes_attr.insert(serdes_attr_pair(pair.second, attr_val));
7066+
}
7067+
}
7068+
if (serdes_attr.size() != 0)
7069+
{
7070+
if (setPortSerdesAttribute(linePort, phyOid, serdes_attr))
7071+
{
7072+
SWSS_LOG_NOTICE("Set port %s line side preemphasis is success", port.m_alias.c_str());
7073+
}
7074+
else
7075+
{
7076+
SWSS_LOG_ERROR("Failed to set port %s line side pre-emphasis", port.m_alias.c_str());
7077+
return false;
7078+
}
7079+
}
70207080
}
70217081
}
70227082

orchagent/portsorch.h

+24-1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ static const unordered_map<string, sai_port_oper_status_t> string_oper_status =
4747
{ "not present", SAI_PORT_OPER_STATUS_NOT_PRESENT }
4848
};
4949

50+
static const std::map<std::string, sai_port_serdes_attr_t> tx_fir_strings_system_side =
51+
{
52+
{"system_tx_fir_pre1", SAI_PORT_SERDES_ATTR_TX_FIR_PRE1},
53+
{"system_tx_fir_pre2", SAI_PORT_SERDES_ATTR_TX_FIR_PRE2},
54+
{"system_tx_fir_pre3", SAI_PORT_SERDES_ATTR_TX_FIR_PRE3},
55+
{"system_tx_fir_post1", SAI_PORT_SERDES_ATTR_TX_FIR_POST1},
56+
{"system_tx_fir_post2", SAI_PORT_SERDES_ATTR_TX_FIR_POST2},
57+
{"system_tx_fir_post3", SAI_PORT_SERDES_ATTR_TX_FIR_POST3},
58+
{"system_tx_fir_main", SAI_PORT_SERDES_ATTR_TX_FIR_MAIN}
59+
};
60+
61+
static const std::map<std::string, sai_port_serdes_attr_t> tx_fir_strings_line_side =
62+
{
63+
{"line_tx_fir_pre1", SAI_PORT_SERDES_ATTR_TX_FIR_PRE1},
64+
{"line_tx_fir_pre2", SAI_PORT_SERDES_ATTR_TX_FIR_PRE2},
65+
{"line_tx_fir_pre3", SAI_PORT_SERDES_ATTR_TX_FIR_PRE3},
66+
{"line_tx_fir_post1", SAI_PORT_SERDES_ATTR_TX_FIR_POST1},
67+
{"line_tx_fir_post2", SAI_PORT_SERDES_ATTR_TX_FIR_POST2},
68+
{"line_tx_fir_post3", SAI_PORT_SERDES_ATTR_TX_FIR_POST3},
69+
{"line_tx_fir_main", SAI_PORT_SERDES_ATTR_TX_FIR_MAIN}
70+
};
71+
5072
struct PortUpdate
5173
{
5274
Port port;
@@ -374,11 +396,12 @@ class PortsOrch : public Orch, public Subject
374396
void refreshPortStateLinkTraining(const Port &port);
375397

376398
void getPortSerdesVal(const std::string& s, std::vector<uint32_t> &lane_values);
399+
void getPortSerdesValBase10(const std::string& s, std::vector<uint32_t> &lane_values);
377400
bool getPortAdvSpeedsVal(const std::string &s, std::vector<uint32_t> &speed_values);
378401
bool getPortInterfaceTypeVal(const std::string &s, sai_port_interface_type_t &interface_type);
379402
bool getPortAdvInterfaceTypesVal(const std::string &s, std::vector<uint32_t> &type_values);
380403

381-
bool setPortSerdesAttribute(sai_object_id_t port_id,
404+
bool setPortSerdesAttribute(sai_object_id_t port_id, sai_object_id_t switch_id,
382405
std::map<sai_port_serdes_attr_t, std::vector<uint32_t>> &serdes_attr);
383406

384407

0 commit comments

Comments
 (0)