Skip to content
Closed
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.

11 changes: 10 additions & 1 deletion sonic_platform_base/sonic_xcvr/api/public/cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1050,8 +1050,17 @@ 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 an 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_major = self.xcvr_eeprom.read(consts.CMIS_MAJOR_REVISION)
cmis_minor = self.xcvr_eeprom.read(consts.CMIS_MINOR_REVISION)
if cmis_major is not None and cmis_minor is not None and (cmis_major, cmis_minor) >= (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
116 changes: 116 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 @@ -485,6 +486,121 @@
RX_MIN_MER_PM = "rxMinMerPm"
RX_MAX_MER_PM = "rxMaxMerPm"

## 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 = "rxSopcrImpl"
RX_AVG_SOPROC_PM_IMPL = "rxAvgSopcrPmImpl"
RX_MIN_SOPROC_PM_IMPL = "rxMinSopcrPmImpl"
RX_MAX_SOPROC_PM_IMPL = "rxMaxSopcrPmImpl"
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"
CDB_SUPPORT = "CdbSupport"
Expand Down
10 changes: 10 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,11 @@
CCmisModuleConfigSupportPage,
CCmisMediaLaneFecPmPage,
CCmisMediaLaneLinkPmPage,
<<<<<<< HEAD
=======
CCmisDataPathHostIfPmPage,
CCmisPmAdvertisementPage,
>>>>>>> bec9ff8 (NOS-11204: Add C-CMIS PM API logic and advertising (#147))
)


Expand All @@ -21,4 +26,9 @@ def __init__(self, codes, bank=0):
CCmisModuleConfigSupportPage(codes, bank=bank), # 0x04
CCmisMediaLaneFecPmPage(codes, bank=bank), # 0x34
CCmisMediaLaneLinkPmPage(codes, bank=bank), # 0x35
<<<<<<< HEAD
=======
CCmisDataPathHostIfPmPage(codes, bank=bank), # 0x3A
CCmisPmAdvertisementPage(codes, bank=bank), # 0x42
>>>>>>> bec9ff8 (NOS-11204: Add C-CMIS PM API logic and advertising (#147))
)
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',
]
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
134 changes: 134 additions & 0 deletions sonic_platform_base/sonic_xcvr/mem_maps/public/cmis/pages/page42.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
"""
page42.py

C-CMIS Page 42h - Performance Monitoring Advertisement.

Advertises which Page 34h/35h performance monitors are implemented by the
module. All fields are global (non-banked) capability bits.
"""

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


class CCmisPmAdvertisementPage(CmisPage):
"""C-CMIS Page 42h: performance-monitoring "Impl" advertisement bits."""

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

self.fields[consts.PM_ADVT_FIELD] = [
NumberRegField("PmAdvtByte128", self.getaddr(128),
RegBitField(consts.RX_MAX_CORR_BITS_SUB_INTERVAL_PM_IMPL, 4),
RegBitField(consts.RX_MIN_CORR_BITS_SUB_INTERVAL_PM_IMPL, 3),
RegBitField(consts.RX_CORR_BITS_PM_IMPL, 2),
RegBitField(consts.RX_BITS_SUB_INTERVAL_PM_IMPL, 1),
RegBitField(consts.RX_BITS_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte129", self.getaddr(129),
RegBitField(consts.RX_MAX_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM_IMPL, 4),
RegBitField(consts.RX_MIN_FRAMES_UNCORR_ERR_SUB_INTERVAL_PM_IMPL, 3),
RegBitField(consts.RX_FRAMES_UNCORR_ERR_PM_IMPL, 2),
RegBitField(consts.RX_FRAMES_SUB_INTERVAL_PM_IMPL, 1),
RegBitField(consts.RX_FRAMES_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte130", self.getaddr(130),
RegBitField(consts.RX_CD_IMPL, 7),
RegBitField(consts.RX_AVG_CD_PM_IMPL, 6),
RegBitField(consts.RX_MIN_CD_PM_IMPL, 5),
RegBitField(consts.RX_MAX_CD_PM_IMPL, 4),
RegBitField(consts.RX_DGD_IMPL, 3),
RegBitField(consts.RX_AVG_DGD_PM_IMPL, 2),
RegBitField(consts.RX_MIN_DGD_PM_IMPL, 1),
RegBitField(consts.RX_MAX_DGD_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte131", self.getaddr(131),
RegBitField(consts.RX_LG_SOPMD_IMPL, 7),
RegBitField(consts.RX_AVG_LG_SOPMD_PM_IMPL, 6),
RegBitField(consts.RX_MIN_LG_SOPMD_PM_IMPL, 5),
RegBitField(consts.RX_MAX_LG_SOPMD_PM_IMPL, 4),
RegBitField(consts.RX_PDL_IMPL, 3),
RegBitField(consts.RX_AVG_PDL_PM_IMPL, 2),
RegBitField(consts.RX_MIN_PDL_PM_IMPL, 1),
RegBitField(consts.RX_MAX_PDL_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte132", self.getaddr(132),
RegBitField(consts.RX_OSNR_IMPL, 7),
RegBitField(consts.RX_AVG_OSNR_PM_IMPL, 6),
RegBitField(consts.RX_MIN_OSNR_PM_IMPL, 5),
RegBitField(consts.RX_MAX_OSNR_PM_IMPL, 4),
RegBitField(consts.RX_ESNR_IMPL, 3),
RegBitField(consts.RX_AVG_ESNR_PM_IMPL, 2),
RegBitField(consts.RX_MIN_ESNR_PM_IMPL, 1),
RegBitField(consts.RX_MAX_ESNR_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte133", self.getaddr(133),
RegBitField(consts.RX_CFO_IMPL, 7),
RegBitField(consts.RX_AVG_CFO_PM_IMPL, 6),
RegBitField(consts.RX_MIN_CFO_PM_IMPL, 5),
RegBitField(consts.RX_MAX_CFO_PM_IMPL, 4),
RegBitField(consts.RX_EVM_IMPL, 3),
RegBitField(consts.RX_AVG_EVM_PM_IMPL, 2),
RegBitField(consts.RX_MIN_EVM_PM_IMPL, 1),
RegBitField(consts.RX_MAX_EVM_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte134", self.getaddr(134),
RegBitField(consts.RX_SOPROC_IMPL, 7),
RegBitField(consts.RX_AVG_SOPROC_PM_IMPL, 6),
RegBitField(consts.RX_MIN_SOPROC_PM_IMPL, 5),
RegBitField(consts.RX_MAX_SOPROC_PM_IMPL, 4),
RegBitField(consts.TX_POWER_IMPL, 3),
RegBitField(consts.TX_AVG_POWER_PM_IMPL, 2),
RegBitField(consts.TX_MIN_POWER_PM_IMPL, 1),
RegBitField(consts.TX_MAX_POWER_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte135", self.getaddr(135),
RegBitField(consts.RX_POWER_IMPL, 7),
RegBitField(consts.RX_AVG_POWER_PM_IMPL, 6),
RegBitField(consts.RX_MIN_POWER_PM_IMPL, 5),
RegBitField(consts.RX_MAX_POWER_PM_IMPL, 4),
RegBitField(consts.RX_SIG_POWER_IMPL, 3),
RegBitField(consts.RX_AVG_SIG_POWER_PM_IMPL, 2),
RegBitField(consts.RX_MIN_SIG_POWER_PM_IMPL, 1),
RegBitField(consts.RX_MAX_SIG_POWER_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte136", self.getaddr(136),
RegBitField(consts.RX_MEDIA_FED_PM_IMPL, 1),
RegBitField(consts.RX_MEDIA_FDD_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte137", self.getaddr(137),
RegBitField(consts.TX_HOST_FED_PM_IMPL, 1),
RegBitField(consts.TX_HOST_FDD_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte138", self.getaddr(138),
RegBitField(consts.RX_CLOCK_REC_IMPL, 7),
RegBitField(consts.RX_AVG_CLOCK_REC_PM_IMPL, 6),
RegBitField(consts.RX_MIN_CLOCK_REC_PM_IMPL, 5),
RegBitField(consts.RX_MAX_CLOCK_REC_PM_IMPL, 4),
RegBitField(consts.RX_HG_SOPMD_IMPL, 3),
RegBitField(consts.RX_AVG_HG_SOPMD_PM_IMPL, 2),
RegBitField(consts.RX_MIN_HG_SOPMD_PM_IMPL, 1),
RegBitField(consts.RX_MAX_HG_SOPMD_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte139", self.getaddr(139),
RegBitField(consts.RX_SNR_MARGIN_IMPL, 7),
RegBitField(consts.RX_AVG_SNR_MARGIN_PM_IMPL, 6),
RegBitField(consts.RX_MIN_SNR_MARGIN_PM_IMPL, 5),
RegBitField(consts.RX_MAX_SNR_MARGIN_PM_IMPL, 4),
RegBitField(consts.RX_MER_IMPL, 3),
RegBitField(consts.RX_AVG_MER_PM_IMPL, 2),
RegBitField(consts.RX_MIN_MER_PM_IMPL, 1),
RegBitField(consts.RX_MAX_MER_PM_IMPL, 0),
),
NumberRegField("PmAdvtByte140", self.getaddr(140),
RegBitField(consts.RX_QFACTOR_IMPL, 7),
RegBitField(consts.RX_AVG_QFACTOR_PM_IMPL, 6),
RegBitField(consts.RX_MIN_QFACTOR_PM_IMPL, 5),
RegBitField(consts.RX_MAX_QFACTOR_PM_IMPL, 4),
RegBitField(consts.RX_QMARGIN_IMPL, 3),
RegBitField(consts.RX_AVG_QMARGIN_PM_IMPL, 2),
RegBitField(consts.RX_MIN_QMARGIN_PM_IMPL, 1),
RegBitField(consts.RX_MAX_QMARGIN_PM_IMPL, 0),
),
]
Loading
Loading