diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py index 69ff7679994..34fb729b6df 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py @@ -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 diff --git a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py index 3068c8bdfe1..d0a8b31532e 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_sfp.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_sfp.py @@ -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()