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 <yualiu@nvidia.com>
  • Loading branch information
yuazhe committed Jul 12, 2024
1 parent 11730d5 commit b1c5927
Show file tree
Hide file tree
Showing 2 changed files with 17 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
14 changes: 12 additions & 2 deletions platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,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) == None:
sleep(0.1)
wait_time -= 0.1
return self._read_eeprom(0, 1, False) == 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 +1697,12 @@ 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')



# 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')

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

Expand Down

0 comments on commit b1c5927

Please sign in to comment.