sai_status_t set_port_serdes_attribute_fn()

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;
}