diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 02b4362a78..eaabf49ecf 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -961,13 +961,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 diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index f96007d5bc..d2da99e749 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -575,3 +575,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()