Skip to content

Commit 2606cd5

Browse files
chiourungprgeor
andauthored
Add flag to read partial VDM (#397)
It spend much time to read full VDM. Add flag to read VDM for real value, threshold or flag. Signed-off-by: chiourung_huang <[email protected]> Co-authored-by: Prince George <[email protected]>
1 parent 56921d8 commit 2606cd5

File tree

3 files changed

+82
-45
lines changed

3 files changed

+82
-45
lines changed

sonic_platform_base/sonic_xcvr/api/public/cmis.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ def get_transceiver_bulk_status(self):
230230
bulk_status["tx%dpower" % i] = float("{:.3f}".format(self.mw_to_dbm(tx_power[i - 1]))) if tx_power[i - 1] != 'N/A' else 'N/A'
231231

232232
laser_temp_dict = self.get_laser_temperature()
233-
self.vdm_dict = self.get_vdm()
233+
self.vdm_dict = self.get_vdm(self.vdm.VDM_REAL_VALUE)
234234
try:
235235
bulk_status['laser_temperature'] = laser_temp_dict['monitor value']
236236
bulk_status['prefec_ber'] = self.vdm_dict['Pre-FEC BER Average Media Input'][1][0]
@@ -303,7 +303,7 @@ def get_transceiver_threshold_info(self):
303303
threshold_info_dict['lasertemplowwarning'] = laser_temp_dict['low warn']
304304
except (KeyError, TypeError):
305305
pass
306-
self.vdm_dict = self.get_vdm()
306+
self.vdm_dict = self.get_vdm(self.vdm.VDM_THRESHOLD)
307307
try:
308308
threshold_info_dict['prefecberhighalarm'] = self.vdm_dict['Pre-FEC BER Average Media Input'][1][1]
309309
threshold_info_dict['prefecberlowalarm'] = self.vdm_dict['Pre-FEC BER Average Media Input'][1][2]
@@ -1132,11 +1132,13 @@ def set_loopback_mode(self, loopback_mode):
11321132
else:
11331133
return False
11341134

1135-
def get_vdm(self):
1135+
def get_vdm(self, field_option=None):
11361136
'''
11371137
This function returns all the VDM items, including real time monitor value, threholds and flags
11381138
'''
1139-
vdm = self.vdm.get_vdm_allpage() if self.vdm is not None else {}
1139+
if field_option is None:
1140+
field_option = self.vdm.ALL_FIELD
1141+
vdm = self.vdm.get_vdm_allpage(field_option) if self.vdm is not None else {}
11401142
return vdm
11411143

11421144
def get_module_firmware_fault_state_changed(self):
@@ -1860,7 +1862,7 @@ def get_transceiver_status(self):
18601862
trans_status['txbiaslowalarm_flag%d' % lane] = tx_bias_flag_dict['tx_bias_low_alarm']['TxBiasLowAlarmFlag%d' % lane]
18611863
trans_status['txbiashighwarning_flag%d' % lane] = tx_bias_flag_dict['tx_bias_high_warn']['TxBiasHighWarnFlag%d' % lane]
18621864
trans_status['txbiaslowwarning_flag%d' % lane] = tx_bias_flag_dict['tx_bias_low_warn']['TxBiasLowWarnFlag%d' % lane]
1863-
self.vdm_dict = self.get_vdm()
1865+
self.vdm_dict = self.get_vdm(self.vdm.VDM_FLAG)
18641866
try:
18651867
trans_status['prefecberhighalarm_flag'] = self.vdm_dict['Pre-FEC BER Average Media Input'][1][5]
18661868
trans_status['prefecberlowalarm_flag'] = self.vdm_dict['Pre-FEC BER Average Media Input'][1][6]

sonic_platform_base/sonic_xcvr/api/public/cmisVDM.py

Lines changed: 67 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
VDM_UNFREEZE = 0
1919

2020
class CmisVdmApi(XcvrApi):
21+
22+
VDM_REAL_VALUE = 0x1
23+
VDM_THRESHOLD = 0x2
24+
VDM_FLAG = 0x4
25+
ALL_FIELD = 0xff
26+
2127
def __init__(self, xcvr_eeprom):
2228
super(CmisVdmApi, self).__init__(xcvr_eeprom)
2329

@@ -30,7 +36,7 @@ def get_F16(self, value):
3036
result = mantissa*10**(scale_exponent-24)
3137
return result
3238

33-
def get_vdm_page(self, page, VDM_flag_page):
39+
def get_vdm_page(self, page, VDM_flag_page, field_option=ALL_FIELD):
3440
'''
3541
This function returns VDM items from a specific VDM page.
3642
Output format is a dictionary. Key is observable type; value is a dictionary.
@@ -67,42 +73,55 @@ def get_vdm_page(self, page, VDM_flag_page):
6773
for index, typeID in enumerate(vdm_typeID):
6874
if typeID not in VDM_TYPE_DICT:
6975
continue
70-
else:
71-
vdm_info_dict = VDM_TYPE_DICT[typeID]
72-
thrshID = VDM_thresholdID[index]
73-
vdm_type = vdm_info_dict[0]
74-
vdm_format = vdm_info_dict[1]
75-
scale = vdm_info_dict[2]
76-
77-
vdm_value_offset = vdm_valuePage * PAGE_SIZE + PAGE_OFFSET + VDM_SIZE * index
78-
vdm_high_alarm_offset = vdm_thrshPage * PAGE_SIZE + PAGE_OFFSET + THRSH_SPACING * thrshID
79-
vdm_low_alarm_offset = vdm_high_alarm_offset + 2
80-
vdm_high_warn_offset = vdm_high_alarm_offset + 4
81-
vdm_low_warn_offset = vdm_high_alarm_offset + 6
8276

77+
vdm_info_dict = VDM_TYPE_DICT[typeID]
78+
thrshID = VDM_thresholdID[index]
79+
vdm_type = vdm_info_dict[0]
80+
vdm_format = vdm_info_dict[1]
81+
scale = vdm_info_dict[2]
82+
83+
vdm_value_offset = vdm_valuePage * PAGE_SIZE + PAGE_OFFSET + VDM_SIZE * index
84+
vdm_high_alarm_offset = vdm_thrshPage * PAGE_SIZE + PAGE_OFFSET + THRSH_SPACING * thrshID
85+
vdm_low_alarm_offset = vdm_high_alarm_offset + 2
86+
vdm_high_warn_offset = vdm_high_alarm_offset + 4
87+
vdm_low_warn_offset = vdm_high_alarm_offset + 6
88+
89+
if field_option & self.VDM_REAL_VALUE:
8390
vdm_value_raw = self.xcvr_eeprom.read_raw(vdm_value_offset, VDM_SIZE, True)
84-
vdm_thrsh_high_alarm_raw = self.xcvr_eeprom.read_raw(vdm_high_alarm_offset, VDM_SIZE, True)
85-
vdm_thrsh_low_alarm_raw = self.xcvr_eeprom.read_raw(vdm_low_alarm_offset, VDM_SIZE, True)
86-
vdm_thrsh_high_warn_raw = self.xcvr_eeprom.read_raw(vdm_high_warn_offset, VDM_SIZE, True)
87-
vdm_thrsh_low_warn_raw = self.xcvr_eeprom.read_raw(vdm_low_warn_offset, VDM_SIZE, True)
88-
if not vdm_value_raw or not vdm_thrsh_high_alarm_raw or not vdm_thrsh_low_alarm_raw \
89-
or not vdm_high_warn_offset or not vdm_thrsh_low_warn_raw:
90-
return {}
91+
if not vdm_value_raw:
92+
continue
9193
if vdm_format == 'S16':
9294
vdm_value = struct.unpack('>h',vdm_value_raw)[0] * scale
95+
elif vdm_format == 'U16':
96+
vdm_value = struct.unpack('>H',vdm_value_raw)[0] * scale
97+
elif vdm_format == 'F16':
98+
vdm_value_int = struct.unpack('>H',vdm_value_raw)[0]
99+
vdm_value = self.get_F16(vdm_value_int)
100+
else:
101+
continue
102+
else:
103+
vdm_value = None
104+
105+
if field_option & self.VDM_THRESHOLD:
106+
vdm_thrsh_raw = self.xcvr_eeprom.read_raw(vdm_high_alarm_offset, VDM_SIZE*4, True)
107+
if not vdm_thrsh_raw:
108+
continue
109+
vdm_thrsh_high_alarm_raw = vdm_thrsh_raw[0:2]
110+
vdm_thrsh_low_alarm_raw = vdm_thrsh_raw[2:4]
111+
vdm_thrsh_high_warn_raw = vdm_thrsh_raw[4:6]
112+
vdm_thrsh_low_warn_raw = vdm_thrsh_raw[6:8]
113+
114+
if vdm_format == 'S16':
93115
vdm_thrsh_high_alarm = struct.unpack('>h', vdm_thrsh_high_alarm_raw)[0] * scale
94116
vdm_thrsh_low_alarm = struct.unpack('>h', vdm_thrsh_low_alarm_raw)[0] * scale
95117
vdm_thrsh_high_warn = struct.unpack('>h', vdm_thrsh_high_warn_raw)[0] * scale
96118
vdm_thrsh_low_warn = struct.unpack('>h', vdm_thrsh_low_warn_raw)[0] * scale
97119
elif vdm_format == 'U16':
98-
vdm_value = struct.unpack('>H',vdm_value_raw)[0] * scale
99120
vdm_thrsh_high_alarm = struct.unpack('>H', vdm_thrsh_high_alarm_raw)[0] * scale
100121
vdm_thrsh_low_alarm = struct.unpack('>H', vdm_thrsh_low_alarm_raw)[0] * scale
101122
vdm_thrsh_high_warn = struct.unpack('>H', vdm_thrsh_high_warn_raw)[0] * scale
102123
vdm_thrsh_low_warn = struct.unpack('>H', vdm_thrsh_low_warn_raw)[0] * scale
103124
elif vdm_format == 'F16':
104-
vdm_value_int = struct.unpack('>H',vdm_value_raw)[0]
105-
vdm_value = self.get_F16(vdm_value_int)
106125
vdm_thrsh_high_alarm_int = struct.unpack('>H', vdm_thrsh_high_alarm_raw)[0]
107126
vdm_thrsh_low_alarm_int = struct.unpack('>H', vdm_thrsh_low_alarm_raw)[0]
108127
vdm_thrsh_high_warn_int = struct.unpack('>H', vdm_thrsh_high_warn_raw)[0]
@@ -113,13 +132,24 @@ def get_vdm_page(self, page, VDM_flag_page):
113132
vdm_thrsh_low_warn = self.get_F16(vdm_thrsh_low_warn_int)
114133
else:
115134
continue
135+
else:
136+
vdm_thrsh_high_alarm = None
137+
vdm_thrsh_low_alarm = None
138+
vdm_thrsh_high_warn = None
139+
vdm_thrsh_low_warn = None
116140

117-
vdm_flag_offset = 32 * (page - 0x20) + index//2
118-
bit_offset = 4*(index%2)
119-
vdm_high_alarm_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset)) & 0x1)
120-
vdm_low_alarm_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+1)) & 0x1)
121-
vdm_high_warn_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+2)) & 0x1)
122-
vdm_low_warn_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+3)) & 0x1)
141+
if VDM_flag_page:
142+
vdm_flag_offset = 32 * (page - 0x20) + index//2
143+
bit_offset = 4*(index%2)
144+
vdm_high_alarm_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset)) & 0x1)
145+
vdm_low_alarm_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+1)) & 0x1)
146+
vdm_high_warn_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+2)) & 0x1)
147+
vdm_low_warn_flag = bool((VDM_flag_page[vdm_flag_offset] >> (bit_offset+3)) & 0x1)
148+
else:
149+
vdm_high_alarm_flag = None
150+
vdm_low_alarm_flag = None
151+
vdm_high_warn_flag = None
152+
vdm_low_warn_flag = None
123153

124154
if vdm_type not in vdm_Page_data:
125155
vdm_Page_data[vdm_type] = {
@@ -148,7 +178,7 @@ def get_vdm_page(self, page, VDM_flag_page):
148178
vdm_low_warn_flag]
149179
return vdm_Page_data
150180

151-
def get_vdm_allpage(self):
181+
def get_vdm_allpage(self, field_option=ALL_FIELD ):
152182
'''
153183
This function returns VDM items from all advertised VDM pages.
154184
Output format is a dictionary. Key is observable type; value is a dictionary.
@@ -170,8 +200,13 @@ def get_vdm_allpage(self):
170200
return None
171201
VDM_START_PAGE = 0x20
172202
vdm = dict()
173-
vdm_flag_page = self.xcvr_eeprom.read_raw(VDM_FLAG_PAGE * PAGE_SIZE + PAGE_OFFSET, PAGE_SIZE)
203+
204+
if field_option & self.VDM_FLAG:
205+
vdm_flag_page = self.xcvr_eeprom.read_raw(VDM_FLAG_PAGE * PAGE_SIZE + PAGE_OFFSET, PAGE_SIZE)
206+
else:
207+
vdm_flag_page = None
208+
174209
for page in range(VDM_START_PAGE, VDM_START_PAGE + vdm_page_supported_raw + 1):
175-
vdm_current_page = self.get_vdm_page(page, vdm_flag_page)
210+
vdm_current_page = self.get_vdm_page(page, vdm_flag_page, field_option)
176211
vdm.update(vdm_current_page)
177212
return vdm

tests/sonic_xcvr/test_cmisVDM.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ def test_get_F16(self, input_param, expected):
3535
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
3636
),
3737
38-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
39-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
40-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
41-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
42-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
43-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
44-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
45-
bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'), bytearray(b'\x00\x00'),
38+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
39+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
40+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
41+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
42+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
43+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
44+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
45+
bytearray(b'\x00\x00'), bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00'),
4646
],
4747
{
4848
'Pre-FEC BER Minimum Media Input': {1: [0, 0, 0, 0, 0, False, False, False, False]},

0 commit comments

Comments
 (0)