Skip to content
Merged
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
18 changes: 16 additions & 2 deletions platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py
Original file line number Diff line number Diff line change
Expand Up @@ -847,13 +847,27 @@ def get_tx_fault(self):
print(e)
return [False] * api.NUM_CHANNELS if api else None

def _get_serial(self):
"""
Get serial number from EEPROM. sfp_base.get_serial() might read from
memory cache, which is not always up to date. This function is used by reinit_if_sn_changed() to detect if a SFP is replaced.
"""
api = self.get_xcvr_api()
if not api:
return None

sn = api.xcvr_eeprom.read(consts.VENDOR_SERIAL_NO_FIELD)
if sn is None:
return None
return sn.rstrip()

def reinit_if_sn_changed(self):
"""Reinitialize the SFP if the module ID has changed
"""
sn = self.get_serial()
sn = self._get_serial()
if sn != self.sn:
self.reinit()
self.sn = self.get_serial()
self.sn = self._get_serial()
self.temp_high_threshold = None
self.temp_critical_threshold = None
return True
Expand Down
12 changes: 12 additions & 0 deletions platform/mellanox/mlnx-platform-api/tests/test_sfp.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,3 +607,15 @@ def mock_read(field):
assert sfp.get_temperature_info() == (True, 58.0, 75.0, 85.0)
sfp.is_sw_control.side_effect = Exception('')
assert sfp.get_temperature_info() == (False, None, None, None)

def test_reinit_if_sn_changed(self):
sfp = SFP(0)
sfp.get_xcvr_api = mock.MagicMock(return_value=None)
assert not sfp.reinit_if_sn_changed()

sfp.get_xcvr_api.return_value = mock.MagicMock()
sfp.get_xcvr_api.return_value.xcvr_eeprom.read = mock.MagicMock(return_value='1234567890')
assert sfp.reinit_if_sn_changed()

sfp.get_xcvr_api.return_value.xcvr_eeprom.read.return_value = '1234567891'
assert sfp.reinit_if_sn_changed()
Loading