Skip to content

Commit 6b12b4c

Browse files
authored
[sfp] Add parsing the dom_capability to sff8472 (#102)
- What I did Following SFF-8472 to read diagnostic monitoring type register. Use that register to check if diagnostic monitoring function implemented or not. - How I did it Check the register position from SFF-8472 document. Read the register value from the EEPROM.
1 parent 7fc76b9 commit 6b12b4c

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

sonic_platform_base/sonic_sfp/sff8436.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -506,14 +506,14 @@ def parse_vendor_sn(self, sn_raw_data, start_pos):
506506

507507
def parse_vendor_date(self, sn_raw_data, start_pos):
508508
return sffbase.parse(self, self.vendor_date, sn_raw_data, start_pos)
509-
509+
510510
def parse_vendor_oui(self, sn_raw_data, start_pos):
511511
return sffbase.parse(self, self.vendor_oui, sn_raw_data, start_pos)
512512

513513
def parse_ext_specification_compliance(self, sn_raw_data, start_pos):
514514
return sffbase.parse(self, self.sfp_ext_specification_compliance, sn_raw_data, start_pos)
515515

516-
def parse_qsfp_dom_capability(self, sn_raw_data, start_pos):
516+
def parse_dom_capability(self, sn_raw_data, start_pos):
517517
return sffbase.parse(self, self.qsfp_dom_capability, sn_raw_data, start_pos)
518518

519519
def dump_pretty(self):

sonic_platform_base/sonic_sfp/sff8472.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,13 @@ class sff8472InterfaceId(sffbase):
519519
'type': 'date'}
520520
}
521521

522+
sfp_dom_capability = {
523+
'sff8472_dom_support':
524+
{'offset': 0,
525+
'bit': 6,
526+
'type': 'bitvalue'}
527+
}
528+
522529
# Returns calibration type
523530
def _get_calibration_type(self, eeprom_data):
524531
try:
@@ -568,6 +575,9 @@ def parse_vendor_date(self, sn_raw_data, start_pos):
568575
def parse_vendor_oui(self, sn_raw_data, start_pos):
569576
return sffbase.parse(self, self.vendor_oui, sn_raw_data, start_pos)
570577

578+
def parse_dom_capability(self, dom_type_raw_data, start_pos):
579+
return sffbase.parse(self, self.sfp_dom_capability, dom_type_raw_data, start_pos)
580+
571581
def dump_pretty(self):
572582
if self.interface_data == None:
573583
print('Object not initialized, nothing to print')

sonic_platform_base/sonic_sfp/sfputilbase.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,12 @@
122122
'Fibre Channel link length/Transmitter Technology',
123123
'Fibre Channel transmission media', 'Fibre Channel Speed')
124124

125+
qsfp_dom_capability_tup = ('Tx_power_support', 'Rx_power_support',
126+
'Voltage_support', 'Temp_support')
127+
128+
# Add an EOL to prevent this being viewed as string instead of list
129+
sfp_dom_capability_tup = ('sff8472_dom_support', 'EOL')
130+
125131
class SfpUtilError(Exception):
126132
"""Base class for exceptions in this module."""
127133
pass
@@ -818,6 +824,7 @@ def get_eeprom_dict(self, port_num):
818824
def get_transceiver_info_dict(self, port_num):
819825
transceiver_info_dict = {}
820826
compliance_code_dict = {}
827+
dom_capability_dict = {}
821828

822829
# ToDo: OSFP tranceiver info parsing not fully supported.
823830
# in inf8628.py lack of some memory map definition
@@ -902,6 +909,7 @@ def get_transceiver_info_dict(self, port_num):
902909
transceiver_info_dict['specification_compliance'] = '{}'
903910
transceiver_info_dict['nominal_bit_rate'] = 'N/A'
904911
transceiver_info_dict['application_advertisement'] = 'N/A'
912+
transceiver_info_dict['dom_capability'] = '{}'
905913

906914
else:
907915
file_path = self._get_port_eeprom_path(port_num, self.IDENTITY_EEPROM_ADDR)
@@ -988,6 +996,12 @@ def get_transceiver_info_dict(self, port_num):
988996
else:
989997
return None
990998

999+
sfp_dom_capability_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH)
1000+
if sfp_dom_capability_raw is not None:
1001+
sfp_dom_capability_data = sfpi_obj.parse_dom_capability(sfp_dom_capability_raw, 0)
1002+
else:
1003+
return None
1004+
9911005
try:
9921006
sysfsfile_eeprom.close()
9931007
except IOError:
@@ -1021,6 +1035,11 @@ def get_transceiver_info_dict(self, port_num):
10211035
compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value']
10221036
transceiver_info_dict['specification_compliance'] = str(compliance_code_dict)
10231037

1038+
for key in qsfp_dom_capability_tup:
1039+
if key in sfp_dom_capability_data['data']:
1040+
dom_capability_dict[key] = "yes" if sfp_dom_capability_data['data'][key]['value'] == 'on' else "no"
1041+
transceiver_info_dict['dom_capability'] = str(dom_capability_dict)
1042+
10241043
transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value'])
10251044
else:
10261045
for key in sfp_cable_length_tup:
@@ -1033,6 +1052,11 @@ def get_transceiver_info_dict(self, port_num):
10331052
compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value']
10341053
transceiver_info_dict['specification_compliance'] = str(compliance_code_dict)
10351054

1055+
for key in sfp_dom_capability_tup:
1056+
if key in sfp_dom_capability_data['data']:
1057+
dom_capability_dict[key] = "yes" if sfp_dom_capability_data['data'][key]['value'] == 'on' else "no"
1058+
transceiver_info_dict['dom_capability'] = str(dom_capability_dict)
1059+
10361060
transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['NominalSignallingRate(UnitsOf100Mbd)']['value'])
10371061

10381062
return transceiver_info_dict
@@ -1092,7 +1116,7 @@ def get_transceiver_dom_info_dict(self, port_num):
10921116
# in SFF-8636 dom capability definitions evolving with the versions.
10931117
qsfp_dom_capability_raw = self._read_eeprom_specific_bytes(sysfsfile_eeprom, (offset_xcvr + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH)
10941118
if qsfp_dom_capability_raw is not None:
1095-
qspf_dom_capability_data = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0)
1119+
qspf_dom_capability_data = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0)
10961120
else:
10971121
return None
10981122

0 commit comments

Comments
 (0)