in fboss/agent/hw/sai/fake/FakeSaiPort.cpp [624:770]
sai_status_t set_port_serdes_attribute_fn(
sai_object_id_t port_serdes_id,
const sai_attribute_t* attr) {
auto fs = FakeSai::getInstance();
auto& portSerdes = fs->portSerdesManager.get(port_serdes_id);
auto& port = fs->portManager.get(portSerdes.port);
auto fillVec = [](auto& vec, auto* list, size_t count) {
std::copy(list, list + count, std::back_inserter(vec));
};
auto checkLanes = [&port](auto vec) {
return port.lanes.size() == vec.size();
};
switch (attr->id) {
case SAI_PORT_SERDES_ATTR_PREEMPHASIS:
fillVec(
portSerdes.preemphasis,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.preemphasis)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_PRE1:
fillVec(
portSerdes.txFirPre1,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirPre1)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_PRE2:
fillVec(
portSerdes.txFirPre2,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirPre2)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_IDRIVER:
fillVec(
portSerdes.iDriver,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.iDriver)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_MAIN:
fillVec(
portSerdes.txFirMain,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirMain)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST1:
fillVec(
portSerdes.txFirPost1,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirPost1)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST2:
fillVec(
portSerdes.txFirPost2,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirPost2)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_TX_FIR_POST3:
fillVec(
portSerdes.txFirPost3,
attr->value.u32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.txFirPost3)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_CTLE_CODE:
fillVec(
portSerdes.rxCtlCode,
attr->value.s32list.list,
attr->value.u32list.count);
if (!checkLanes(portSerdes.rxCtlCode)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_DSP_MODE:
fillVec(
portSerdes.rxDspMode,
attr->value.s32list.list,
attr->value.s32list.count);
if (!checkLanes(portSerdes.rxDspMode)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AFE_TRIM:
fillVec(
portSerdes.rxAfeTrim,
attr->value.s32list.list,
attr->value.s32list.count);
if (!checkLanes(portSerdes.rxAfeTrim)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AC_COUPLING_BYPASS:
fillVec(
portSerdes.rxCouplingByPass,
attr->value.s32list.list,
attr->value.s32list.count);
if (!checkLanes(portSerdes.rxCouplingByPass)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
case SAI_PORT_SERDES_ATTR_EXT_FAKE_RX_AFE_ADAPTIVE_ENABLE:
fillVec(
portSerdes.rxAfeTrimAdaptiveEnable,
attr->value.s32list.list,
attr->value.s32list.count);
if (!checkLanes(portSerdes.rxAfeTrimAdaptiveEnable)) {
return SAI_STATUS_INVALID_ATTRIBUTE_0;
}
break;
default:
return SAI_STATUS_NOT_SUPPORTED;
}
return SAI_STATUS_SUCCESS;
}