Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
221 changes: 208 additions & 13 deletions sonic_platform_base/sonic_xcvr/api/public/c_cmis.py

Large diffs are not rendered by default.

14 changes: 13 additions & 1 deletion sonic_platform_base/sonic_xcvr/api/public/cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1056,8 +1056,20 @@ def get_module_media_interface(self):
@read_only_cached_api_return
def is_coherent_module(self):
'''
Returns True if the module follow C-CMIS spec, False otherwise
Returns True if the module follows C-CMIS spec, False otherwise.

CMIS 5.3 introduced a C-CMIS advertisement bit on Page 01h
(byte 142, bit 4). For modules complying with CMIS 5.3 or
later, that bit is used for checking C-CMIS support.
'''
cmis_rev = self.get_cmis_rev()
try:
cmis_rev_float = float(cmis_rev) if cmis_rev else None
except ValueError:
cmis_rev_float = None
if cmis_rev_float is not None and cmis_rev_float >= 5.3:
return not self.is_flat_memory() and bool(self.xcvr_eeprom.read(consts.COHERENT_PAGES_SUPPORT_ADVT_FIELD))

mintf = self.get_module_media_interface()
return False if 'ZR' not in mintf else True

Expand Down
40 changes: 40 additions & 0 deletions sonic_platform_base/sonic_xcvr/api/xcvr_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,46 @@ def get_transceiver_pm(self):
rx_sig_power_avg = FLOAT ; rx signal power avg
rx_sig_power_min = FLOAT ; rx signal power min
rx_sig_power_max = FLOAT ; rx signal power max
evm_avg = FLOAT ; error vector magnitude avg
evm_min = FLOAT ; error vector magnitude min
evm_max = FLOAT ; error vector magnitude max
clockrec_avg = FLOAT ; clock recovery loop monitor avg
clockrec_min = FLOAT ; clock recovery loop monitor min
clockrec_max = FLOAT ; clock recovery loop monitor max
lg_sopmd_avg = FLOAT ; low granularity SOPMD avg
lg_sopmd_min = FLOAT ; low granularity SOPMD min
lg_sopmd_max = FLOAT ; low granularity SOPMD max
snr_margin_avg = FLOAT ; SNR margin avg
snr_margin_min = FLOAT ; SNR margin min
snr_margin_max = FLOAT ; SNR margin max
qfactor_avg = FLOAT ; Q factor avg
qfactor_min = FLOAT ; Q factor min
qfactor_max = FLOAT ; Q factor max
qmargin_avg = FLOAT ; Q margin avg
qmargin_min = FLOAT ; Q margin min
qmargin_max = FLOAT ; Q margin max
tx_bits_pm = INTEGER ; host tx bits over PM interval
tx_bits_subint_pm = INTEGER ; host tx bits over sub-interval
tx_corr_bits_pm = INTEGER ; host tx corrected bits over PM interval
tx_min_corr_bits_subint_pm = INTEGER ; host tx min corrected bits over sub-interval
tx_max_corr_bits_subint_pm = INTEGER ; host tx max corrected bits over sub-interval
tx_frames_pm = INTEGER ; host tx frames over PM interval
tx_frames_subint_pm = INTEGER ; host tx frames over sub-interval
tx_frames_uncorr_err_pm = INTEGER ; host tx uncorrectable frames over PM interval
tx_min_frames_uncorr_err_subint_pm = INTEGER ; host tx min uncorrectable frames over sub-interval
tx_max_frames_uncorr_err_subint_pm = INTEGER ; host tx max uncorrectable frames over sub-interval
tx_corrected_frames_pm = INTEGER ; host tx corrected frames over PM interval
tx_corrected_frames_subint_pm = INTEGER ; host tx corrected frames over sub-interval
rx_bits_pm = INTEGER ; media rx bits over PM interval
rx_bits_subint_pm = INTEGER ; media rx bits over sub-interval
rx_corr_bits_pm = INTEGER ; media rx corrected bits over PM interval
rx_min_corr_bits_subint_pm = INTEGER ; media rx min corrected bits over sub-interval
rx_max_corr_bits_subint_pm = INTEGER ; media rx max corrected bits over sub-interval
rx_frames_pm = INTEGER ; media rx frames over PM interval
rx_frames_subint_pm = INTEGER ; media rx frames over sub-interval
rx_frames_uncorr_err_pm = INTEGER ; media rx uncorrectable frames over PM interval
rx_min_frames_uncorr_err_subint_pm = INTEGER ; media rx min uncorrectable frames over sub-interval
rx_max_frames_uncorr_err_subint_pm = INTEGER ; media rx max uncorrectable frames over sub-interval

If there is an issue with reading the xcvr, None should be returned.
"""
Expand Down
146 changes: 146 additions & 0 deletions sonic_platform_base/sonic_xcvr/fields/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,7 @@
FLAGS_ADVT_FIELD = "Supported Flags Advertisement"
PAGE_SUPPORT_ADVT_FIELD = "Supported Pages Advertisement"
DIAG_PAGE_SUPPORT_ADVT_FIELD = "Supported Diagnostic Pages Advertisement"
COHERENT_PAGES_SUPPORT_ADVT_FIELD = "Supported Coherent Pages Advertisement"
TX_FLAGS_ADVT_FIELD = "Supported TX Flags Advertisement"
RX_FLAGS_ADVT_FIELD = "Supported RX Flags Advertisement"
LANE_MON_ADVT_FIELD = "Supported Lane Monitor Advertisement"
Expand Down Expand Up @@ -484,6 +485,151 @@
RX_AVG_MER_PM = "rxAvgMerPm"
RX_MIN_MER_PM = "rxMinMerPm"
RX_MAX_MER_PM = "rxMaxMerPm"
RX_AVG_CLOCK_REC_PM = "rxAvgClockRecPm"
RX_MIN_CLOCK_REC_PM = "rxMinClockRecPm"
RX_MAX_CLOCK_REC_PM = "rxMaxClockRecPm"
RX_AVG_LG_SOPMD_PM = "rxAvgLGSopmdPm"
RX_MIN_LG_SOPMD_PM = "rxMinLGSopmdPm"
RX_MAX_LG_SOPMD_PM = "rxMaxLGSopmdPm"
RX_AVG_SNR_MARGIN_PM = "rxAvgSNRMarginPm"
RX_MIN_SNR_MARGIN_PM = "rxMinSNRMarginPm"
RX_MAX_SNR_MARGIN_PM = "rxMaxSNRMarginPm"
RX_AVG_QFACTOR_PM = "rxAvgQFactorPm"
RX_MIN_QFACTOR_PM = "rxMinQFactorPm"
RX_MAX_PM_QFACTOR = "rxMaxPmQFactor"
RX_AVG_QMARGIN_PM = "rxAvgQMarginPm"
RX_MIN_QMARGIN_PM = "rxMinQMarginPm"
RX_MAX_QMARGIN_PM = "rxMaxQMarginPm"

## Data Path Host Interface Performance Monitoring
DATA_PATH_HOST_IF_PM = "Data Path Host Interface Performance Monitoring"
TX_BITS_PM = "txBitsPm"
TX_BITS_SUB_INTERVAL_PM = "txBitsSubIntPm"
TX_CORR_BITS_PM = "txCorrBitsPm"
TX_MIN_CORR_BITS_SUB_INTERVAL_PM = "txMinCorrBitsSubIntPm"
TX_MAX_CORR_BITS_SUB_INTERVAL_PM = "txMaxCorrBitsSubIntPm"
TX_FRAMES_PM = "txFramesPm"
TX_FRAMES_SUB_INTERVAL_PM = "txFramesSubIntPm"
TX_FRAMES_UNCORR_ERR_PM = "txFramesUncorrErrPm"
TX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM = "txMinFramesUncorrErrSubintPm"
TX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM = "txMaxFramesUncorrErrSubintPm"
TX_CORRECTED_FRAMES_PM = "txCorrectedFramesPm"
TX_CORRECTED_FRAMES_SUB_INTERVAL_PM = "txCorrectedFramesSubintPm"

## Performance Monitoring Advertisement (Page 42h)
PM_ADVT_FIELD = "PmAdvertisement"

# Byte 128 (page 34h RX bit-count fields)
RX_BITS_PM_IMPL = "rxBitsPmImpl"
RX_BITS_SUB_INTERVAL_PM_IMPL = "rxBitsSubIntPmImpl"
RX_CORR_BITS_PM_IMPL = "rxCorrBitsPmImpl"
RX_MIN_CORR_BITS_SUB_INTERVAL_PM_IMPL = "rxMinCorrBitsSubIntPmImpl"
RX_MAX_CORR_BITS_SUB_INTERVAL_PM_IMPL = "rxMaxCorrBitsSubIntPmImpl"

# Byte 129 (page 34h RX frame-count fields)
RX_FRAMES_PM_IMPL = "rxFramesPmImpl"
RX_FRAMES_SUB_INTERVAL_PM_IMPL = "rxFramesSubIntPmImpl"
RX_FRAMES_UNCORR_ERR_PM_IMPL = "rxFramesUncorrErrPmImpl"
RX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM_IMPL = "rxMinFramesUncorrErrSubintPmImpl"
RX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM_IMPL = "rxMaxFramesUncorrErrSubintPmImpl"

# Byte 130 (CD/DGD)
RX_CD_IMPL = "rxCdImpl"
RX_AVG_CD_PM_IMPL = "rxAvgCdPmImpl"
RX_MIN_CD_PM_IMPL = "rxMinCdPmImpl"
RX_MAX_CD_PM_IMPL = "rxMaxCdPmImpl"
RX_DGD_IMPL = "rxDgdImpl"
RX_AVG_DGD_PM_IMPL = "rxAvgDgdPmImpl"
RX_MIN_DGD_PM_IMPL = "rxMinDgdPmImpl"
RX_MAX_DGD_PM_IMPL = "rxMaxDgdPmImpl"

# Byte 131 (LG-SOPMD/PDL)
RX_LG_SOPMD_IMPL = "rxLGSopmdImpl"
RX_AVG_LG_SOPMD_PM_IMPL = "rxAvgLGSopmdPmImpl"
RX_MIN_LG_SOPMD_PM_IMPL = "rxMinLGSopmdPmImpl"
RX_MAX_LG_SOPMD_PM_IMPL = "rxMaxLGSopmdPmImpl"
RX_PDL_IMPL = "rxPdlImpl"
RX_AVG_PDL_PM_IMPL = "rxAvgPdlPmImpl"
RX_MIN_PDL_PM_IMPL = "rxMinPdlPmImpl"
RX_MAX_PDL_PM_IMPL = "rxMaxPdlPmImpl"

# Byte 132 (OSNR/eSNR)
RX_OSNR_IMPL = "rxOsnrImpl"
RX_AVG_OSNR_PM_IMPL = "rxAvgOsnrPmImpl"
RX_MIN_OSNR_PM_IMPL = "rxMinOsnrPmImpl"
RX_MAX_OSNR_PM_IMPL = "rxMaxOsnrPmImpl"
RX_ESNR_IMPL = "rxEsnrImpl"
RX_AVG_ESNR_PM_IMPL = "rxAvgEsnrPmImpl"
RX_MIN_ESNR_PM_IMPL = "rxMinEsnrPmImpl"
RX_MAX_ESNR_PM_IMPL = "rxMaxEsnrPmImpl"

# Byte 133 (CFO/EVM)
RX_CFO_IMPL = "rxCfoImpl"
RX_AVG_CFO_PM_IMPL = "rxAvgCfoPmImpl"
RX_MIN_CFO_PM_IMPL = "rxMinCfoPmImpl"
RX_MAX_CFO_PM_IMPL = "rxMaxCfoPmImpl"
RX_EVM_IMPL = "rxEvmModemImpl"
RX_AVG_EVM_PM_IMPL = "rxAvgEvmModemPmImpl"
RX_MIN_EVM_PM_IMPL = "rxMinEvmModemPmImpl"
RX_MAX_EVM_PM_IMPL = "rxMaxEvmModemPmImpl"

# Byte 134 (SOPROC/TX power)
RX_SOPROC_IMPL = "rxSoprocImpl"
RX_AVG_SOPROC_PM_IMPL = "rxAvgSoprocPmImpl"
RX_MIN_SOPROC_PM_IMPL = "rxMinSoprocPmImpl"
RX_MAX_SOPROC_PM_IMPL = "rxMaxSoprocPmImpl"
TX_POWER_IMPL = "txPowerImpl"
TX_AVG_POWER_PM_IMPL = "txAvgPowerPmImpl"
TX_MIN_POWER_PM_IMPL = "txMinPowerPmImpl"
TX_MAX_POWER_PM_IMPL = "txMaxPowerPmImpl"

# Byte 135 (RX power/RX sig power)
RX_POWER_IMPL = "rxPowerImpl"
RX_AVG_POWER_PM_IMPL = "rxAvgPowerPmImpl"
RX_MIN_POWER_PM_IMPL = "rxMinPowerPmImpl"
RX_MAX_POWER_PM_IMPL = "rxMaxPowerPmImpl"
RX_SIG_POWER_IMPL = "rxSigPowerImpl"
RX_AVG_SIG_POWER_PM_IMPL = "rxAvgSigPowerPmImpl"
RX_MIN_SIG_POWER_PM_IMPL = "rxMinSigPowerPmImpl"
RX_MAX_SIG_POWER_PM_IMPL = "rxMaxSigPowerPmImpl"

# Byte 136 (page 33h alarm-latch gates - consts only, not wired into get_pm_all)
RX_MEDIA_FED_PM_IMPL = "rxMediaFedPmImpl"
RX_MEDIA_FDD_PM_IMPL = "rxMediaFddPmImpl"

# Byte 137 (page 3Bh alarm-latch gates - consts only, not wired into get_pm_all)
TX_HOST_FED_PM_IMPL = "txHostFedPmImpl"
TX_HOST_FDD_PM_IMPL = "txHostFddPmImpl"

# Byte 138 (clock recovery/HG-SOPMD)
RX_CLOCK_REC_IMPL = "rxClockRecPmImpl"
RX_AVG_CLOCK_REC_PM_IMPL = "rxAvgClockRecPmImpl"
RX_MIN_CLOCK_REC_PM_IMPL = "rxMinClockRecPmImpl"
RX_MAX_CLOCK_REC_PM_IMPL = "rxMaxClockRecPmImpl"
RX_HG_SOPMD_IMPL = "rxHGSopmdImpl"
RX_AVG_HG_SOPMD_PM_IMPL = "rxAvgHGSopmdPmImpl"
RX_MIN_HG_SOPMD_PM_IMPL = "rxMinHGSopmdPmImpl"
RX_MAX_HG_SOPMD_PM_IMPL = "rxMaxHGSopmdPmImpl"

# Byte 139 (SNR margin/MER)
RX_SNR_MARGIN_IMPL = "rxSNRMarginPmImpl"
RX_AVG_SNR_MARGIN_PM_IMPL = "rxAvgSNRMarginPmImpl"
RX_MIN_SNR_MARGIN_PM_IMPL = "rxMinSNRMarginPmImpl"
RX_MAX_SNR_MARGIN_PM_IMPL = "rxMaxSNRMarginPmImpl"
RX_MER_IMPL = "rxMERPmImpl"
RX_AVG_MER_PM_IMPL = "rxAvgMERPmImpl"
RX_MIN_MER_PM_IMPL = "rxMinMERPmImpl"
RX_MAX_MER_PM_IMPL = "rxMaxMERPmImpl"

# Byte 140 (Q-factor/Q-margin)
RX_QFACTOR_IMPL = "rxQFactorPmImpl"
RX_AVG_QFACTOR_PM_IMPL = "rxAvgQFactorPmImpl"
RX_MIN_QFACTOR_PM_IMPL = "rxMinQFactorPmImpl"
RX_MAX_QFACTOR_PM_IMPL = "rxMaxQFactorPmImpl"
RX_QMARGIN_IMPL = "rxQMarginPmImpl"
RX_AVG_QMARGIN_PM_IMPL = "rxAvgQMarginPmImpl"
RX_MIN_QMARGIN_PM_IMPL = "rxMinQMarginPmImpl"
RX_MAX_QMARGIN_PM_IMPL = "rxMaxQMarginPmImpl"

# CDB
TRANS_CDB_FIELD = "TransceiverCdb"
Expand Down
4 changes: 4 additions & 0 deletions sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/c_cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
CCmisModuleConfigSupportPage,
CCmisMediaLaneFecPmPage,
CCmisMediaLaneLinkPmPage,
CCmisDataPathHostIfPmPage,
CCmisPmAdvertisementPage
)


Expand All @@ -21,4 +23,6 @@ def __init__(self, codes, bank=0):
CCmisModuleConfigSupportPage(codes, bank=bank), # 0x04
CCmisMediaLaneFecPmPage(codes, bank=bank), # 0x34
CCmisMediaLaneLinkPmPage(codes, bank=bank), # 0x35
CCmisDataPathHostIfPmPage(codes, bank=bank), # 0x3A
CCmisPmAdvertisementPage(codes, bank=bank), # 0x42
)
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
from .page2f import CmisVdmAdvertisingCtrlPage
from .page34 import CCmisMediaLaneFecPmPage
from .page35 import CCmisMediaLaneLinkPmPage
from .page3a import CCmisDataPathHostIfPmPage
from .page42 import CCmisPmAdvertisementPage
from .page9f import CmisCdbMessagePage
from .page9f_cdb import CdbLplMessagePage

Expand Down Expand Up @@ -60,6 +62,8 @@
'CmisVdmAdvertisingCtrlPage',
'CCmisMediaLaneFecPmPage',
'CCmisMediaLaneLinkPmPage',
'CCmisDataPathHostIfPmPage',
'CCmisPmAdvertisementPage',
'CmisCdbMessagePage',
'CdbLplMessagePage',
'CdbLplMessagePage'
]
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def __init__(self, codes, page=ADVERTISING_PAGE):
NumberRegField(consts.PAGE_SUPPORT_ADVT_FIELD, self.getaddr(142),
RegBitField(consts.VDM_SUPPORTED, 6),
RegBitField(consts.DIAG_PAGE_SUPPORT_ADVT_FIELD, 5),
RegBitField(consts.COHERENT_PAGES_SUPPORT_ADVT_FIELD, 4),
),
CodeRegField(consts.BANKS_SUPPORTED_FIELD, self.getaddr(142), codes.MAX_BANKS_SUPPORTED,
*(RegBitField("Bit%d" % bit, bit) for bit in range(0, 2))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,19 @@ def __init__(self, codes, bank=0, page=0x35):
NumberRegField(consts.RX_AVG_MER_PM, self.getaddr(206), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_MIN_MER_PM, self.getaddr(208), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_MAX_MER_PM, self.getaddr(210), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_AVG_CLOCK_REC_PM, self.getaddr(212), format=">h", size=2, scale=327.67),
NumberRegField(consts.RX_MIN_CLOCK_REC_PM, self.getaddr(214), format=">h", size=2, scale=327.67),
NumberRegField(consts.RX_MAX_CLOCK_REC_PM, self.getaddr(216), format=">h", size=2, scale=327.67),
NumberRegField(consts.RX_AVG_LG_SOPMD_PM, self.getaddr(218), format=">H", size=2),
NumberRegField(consts.RX_MIN_LG_SOPMD_PM, self.getaddr(220), format=">H", size=2),
NumberRegField(consts.RX_MAX_LG_SOPMD_PM, self.getaddr(222), format=">H", size=2),
NumberRegField(consts.RX_AVG_SNR_MARGIN_PM, self.getaddr(224), format=">h", size=2, scale=10.0),
NumberRegField(consts.RX_MIN_SNR_MARGIN_PM, self.getaddr(226), format=">h", size=2, scale=10.0),
NumberRegField(consts.RX_MAX_SNR_MARGIN_PM, self.getaddr(228), format=">h", size=2, scale=10.0),
NumberRegField(consts.RX_AVG_QFACTOR_PM, self.getaddr(230), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_MIN_QFACTOR_PM, self.getaddr(232), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_MAX_PM_QFACTOR, self.getaddr(234), format=">H", size=2, scale=10.0),
NumberRegField(consts.RX_AVG_QMARGIN_PM, self.getaddr(236), format=">h", size=2, scale=10.0),
NumberRegField(consts.RX_MIN_QMARGIN_PM, self.getaddr(238), format=">h", size=2, scale=10.0),
NumberRegField(consts.RX_MAX_QMARGIN_PM, self.getaddr(240), format=">h", size=2, scale=10.0),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""
page3a.py

C-CMIS Page 3Ah - Data Path Host Interface Performance Monitors.
"""

from .page import CmisPage
from .....fields.xcvr_field import NumberRegField
from .....fields import consts


class CCmisDataPathHostIfPmPage(CmisPage):
"""C-CMIS Page 3Ah: data path host-interface performance-monitor counters."""

def __init__(self, codes, bank=0, page=0x3A):
super().__init__(codes, page=page, bank=bank)

self.fields[consts.DATA_PATH_HOST_IF_PM] = [
NumberRegField(consts.TX_BITS_PM, self.getaddr(128), format=">Q", size=8),
NumberRegField(consts.TX_BITS_SUB_INTERVAL_PM, self.getaddr(136), format=">Q", size=8),
NumberRegField(consts.TX_CORR_BITS_PM, self.getaddr(144), format=">Q", size=8),
NumberRegField(consts.TX_MIN_CORR_BITS_SUB_INTERVAL_PM, self.getaddr(152), format=">Q", size=8),
NumberRegField(consts.TX_MAX_CORR_BITS_SUB_INTERVAL_PM, self.getaddr(160), format=">Q", size=8),
NumberRegField(consts.TX_FRAMES_PM, self.getaddr(168), format=">I", size=4),
NumberRegField(consts.TX_FRAMES_SUB_INTERVAL_PM, self.getaddr(172), format=">I", size=4),
NumberRegField(consts.TX_FRAMES_UNCORR_ERR_PM, self.getaddr(176), format=">I", size=4),
NumberRegField(consts.TX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM, self.getaddr(180), format=">I", size=4),
NumberRegField(consts.TX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM, self.getaddr(184), format=">I", size=4),
NumberRegField(consts.TX_CORRECTED_FRAMES_PM, self.getaddr(188), format=">I", size=4),
NumberRegField(consts.TX_CORRECTED_FRAMES_SUB_INTERVAL_PM, self.getaddr(192), format=">I", size=4),
]
Loading
Loading