diff --git a/sonic_platform_base/sonic_xcvr/fields/xcvr_field.py b/sonic_platform_base/sonic_xcvr/fields/xcvr_field.py index 3c36a843e6be..d56f9432dbfa 100644 --- a/sonic_platform_base/sonic_xcvr/fields/xcvr_field.py +++ b/sonic_platform_base/sonic_xcvr/fields/xcvr_field.py @@ -94,15 +94,15 @@ def read_before_write(self): return True def decode(self, raw_data, **decoded_deps): - return bool((raw_data[0] >> self.bitpos) & 1) + return bool((raw_data[0] >> self.bitpos % 8) & 1) def encode(self, val, raw_state=None): assert not self.ro and raw_state is not None curr_state = raw_state[0] if val: - curr_state |= (1 << self.bitpos) + curr_state |= (1 << self.bitpos % 8) else: - curr_state &= ~(1 << self.bitpos) + curr_state &= ~(1 << self.bitpos % 8) return bytearray([curr_state]) @@ -249,7 +249,7 @@ def decode(self, raw_data, **decoded_deps): for field in self.fields: offset = field.get_offset() if not field.get_deps(): - result[field.name] = field.decode(raw_data[offset - start: offset + field.get_size() - start], + result[field.name] = field.decode(raw_data[offset - start: offset + field.get_size() - start], **decoded_deps) # Now decode any fields that have dependant fields in the same RegGroupField scope diff --git a/tests/sonic_xcvr/test_xcvr_field.py b/tests/sonic_xcvr/test_xcvr_field.py index 59f90cfa93c4..f0cebc78de8f 100644 --- a/tests/sonic_xcvr/test_xcvr_field.py +++ b/tests/sonic_xcvr/test_xcvr_field.py @@ -47,6 +47,10 @@ def __init__(self, codes): self.NUM_REG = NumberRegField("NumReg", 100, format=">Q", size=8, ro=False) self.SCALE_NUM_REG = NumberRegField("ScaleNumReg", 120, format=">i", size=4, scale=100, ro=False) self.FIXED_NUM_REG = FixedNumberRegField("FixedNumReg", 130, 8, format=">f", size=4, ro=False) + self.NUM_REG_WITH_BIT = NumberRegField("NumRegWithBit", 140, + RegBitField("NumRegBit", bitpos=20, ro=False), + format="