Skip to content

Commit

Permalink
fix sfp eeprom unreadable after switching from SW to FW control mode
Browse files Browse the repository at this point in the history
Signed-off-by: Yuanzhe, Liu <[email protected]>
  • Loading branch information
yuazhe committed Jul 12, 2024
1 parent 11730d5 commit 7485e95
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -499,16 +499,20 @@ def get_change_event_for_module_host_management_mode(self, timeout):
s.on_event(event)

if s.in_stable_state():
if s.get_control_type() == SFP_FW_CONTROL and not s.is_eeprom_ready(2):
logger.log_error(f'SFP {sfp_index} eeprom is not readable')
s.fill_change_event(port_dict)
s.refresh_poll_obj(self.poll_obj, self.registered_fds)
else:
logger.log_debug(f'SFP {sfp_index} does not reach stable state, state={s.state}')

ready_sfp_set = wait_ready_task.get_ready_set()
for sfp_index in ready_sfp_set:
s = self._sfp_list[sfp_index]
s.on_event(sfp.EVENT_RESET_DONE)
if s.in_stable_state():
if s.get_control_type() == SFP_FW_CONTROL and not s.is_eeprom_ready(2):
logger.log_error(f'SFP {sfp_index} eeprom is not readable')
s.fill_change_event(port_dict)
s.refresh_poll_obj(self.poll_obj, self.registered_fds)
else:
Expand Down
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 @@ -50,6 +50,8 @@
except ImportError as e:
pass

from datetime import datetime

# Define the sdk constants
SX_PORT_MODULE_STATUS_INITIALIZING = 0
SX_PORT_MODULE_STATUS_PLUGGED = 1
Expand Down Expand Up @@ -488,6 +490,12 @@ def get_presence(self):
return False
eeprom_raw = self._read_eeprom(0, 1, log_on_error=False)
return eeprom_raw is not None

def is_eeprom_ready(self, wait_time):
while wait_time > 0 and self._read_eeprom(0, 1, False) is None:
sleep(0.1)
wait_time -= 0.1
return self._read_eeprom(0, 1, False) is not None:

# read eeprom specfic bytes beginning from offset with size as num_bytes
def read_eeprom(self, offset, num_bytes):
Expand Down Expand Up @@ -1691,8 +1699,14 @@ def initialize_sfp_modules(cls, sfp_list):
if not s.in_stable_state():
logger.log_error(f'SFP {index} is not in stable state after initializing, state={s.state}')
logger.log_notice(f'SFP {index} is in state {s.state} after module initialization')



logger.log_error(f'current time {str(datetime.now())}')
# If the module is FW control, verify that it's ready
for s in sfp_list:
if not s.is_eeprom_ready(2):
logger.log_error(f'SFP {s.sdk_index} eeprom is not readable')
logger.log_error(f'current time {str(datetime.now())}')

class RJ45Port(NvidiaSFPCommon):
"""class derived from SFP, representing RJ45 ports"""

Expand Down

0 comments on commit 7485e95

Please sign in to comment.