@@ -176,11 +176,13 @@ def _wrapper_get_transceiver_change_event(timeout):
176
176
if platform_chassis is not None :
177
177
try :
178
178
status , events = platform_chassis .get_change_event (timeout )
179
- sfp_events = events ['sfp' ]
180
- return status , sfp_events
179
+ sfp_events = events .get ('sfp' )
180
+ sfp_errors = events .get ('sfp_error' )
181
+ return status , sfp_events , sfp_errors
181
182
except NotImplementedError :
182
183
pass
183
- return platform_sfputil .get_transceiver_change_event (timeout )
184
+ status , events = platform_sfputil .get_transceiver_change_event (timeout )
185
+ return status , events , None
184
186
185
187
186
188
def _wrapper_get_sfp_type (physical_port ):
@@ -191,6 +193,14 @@ def _wrapper_get_sfp_type(physical_port):
191
193
pass
192
194
return None
193
195
196
+
197
+ def _wrapper_get_sfp_error_description (physical_port ):
198
+ if platform_chassis :
199
+ try :
200
+ return platform_chassis .get_sfp (physical_port ).get_error_description ()
201
+ except NotImplementedError :
202
+ pass
203
+ return None
194
204
# Remove unnecessary unit from the raw data
195
205
196
206
@@ -759,22 +769,9 @@ def waiting_time_compensation_with_sleep(time_start, time_to_wait):
759
769
# Update port SFP status table on receiving SFP change event
760
770
761
771
762
- def update_port_transceiver_status_table (logical_port_name , status_tbl , status , has_error = False ):
763
- if not has_error :
764
- fvs = swsscommon .FieldValuePairs ([('status' , status ), ('error' , 'N/A' )])
765
- status_tbl .set (logical_port_name , fvs )
766
- else :
767
- error_list = []
768
- int_status = int (status )
769
- for error_code , error_msg in sfp_status_helper .SFP_STATUS_ERR_DICT .items ():
770
- if error_code & int_status :
771
- error_list .append (error_msg )
772
- if error_list :
773
- fvs = swsscommon .FieldValuePairs ([('status' , str (int_status & 1 )), ('error' , '|' .join (error_list ))])
774
- status_tbl .set (logical_port_name , fvs )
775
- else :
776
- # SFP return unkown event, just ignore for now.
777
- helper_logger .log_warning ("Got unknown event {}, ignored" .format (status ))
772
+ def update_port_transceiver_status_table (logical_port_name , status_tbl , status , error_descriptions = 'N/A' ):
773
+ fvs = swsscommon .FieldValuePairs ([('status' , status ), ('error' , error_descriptions )])
774
+ status_tbl .set (logical_port_name , fvs )
778
775
779
776
780
777
# Delete port from SFP status table
@@ -1003,7 +1000,7 @@ def task_worker(self, stopping_event, sfp_error_event, y_cable_presence):
1003
1000
while not stopping_event .is_set ():
1004
1001
next_state = state
1005
1002
time_start = time .time ()
1006
- status , port_dict = _wrapper_get_transceiver_change_event (timeout )
1003
+ status , port_dict , error_dict = _wrapper_get_transceiver_change_event (timeout )
1007
1004
if not port_dict :
1008
1005
continue
1009
1006
helper_logger .log_debug ("Got event {} {} in state {}" .format (status , port_dict , state ))
@@ -1083,21 +1080,32 @@ def task_worker(self, stopping_event, sfp_error_event, y_cable_presence):
1083
1080
helper_logger .log_info ("Got SFP removed event" )
1084
1081
update_port_transceiver_status_table (
1085
1082
logical_port , status_tbl [asic_index ], sfp_status_helper .SFP_STATUS_REMOVED )
1086
- helper_logger .log_info ("receive plug out and pdate port sfp status table." )
1083
+ helper_logger .log_info ("receive plug out and update port sfp status table." )
1087
1084
del_port_sfp_dom_info_from_db (logical_port , int_tbl [asic_index ], dom_tbl [asic_index ])
1088
1085
else :
1089
- helper_logger .log_info ("Got SFP Error event" )
1090
- # Add port to error table to stop accessing eeprom of it
1091
- # If the port already in the error table, the stored error code will
1092
- # be updated to the new one.
1093
- update_port_transceiver_status_table (logical_port , status_tbl [asic_index ], value , True )
1094
- helper_logger .log_info ("receive error update port sfp status table." )
1095
- # In this case EEPROM is not accessible, so remove the DOM info
1096
- # since it will be outdated if long time no update.
1097
- # but will keep the interface info in the DB since it static.
1098
- if sfp_status_helper .is_error_block_eeprom_reading (value ):
1099
- del_port_sfp_dom_info_from_db (logical_port , None , dom_tbl [asic_index ])
1100
-
1086
+ try :
1087
+ error_bits = int (value )
1088
+ helper_logger .log_info ("Got SFP error event {}" .format (value ))
1089
+
1090
+ error_descriptions = sfp_status_helper .fetch_generic_error_description (error_bits )
1091
+
1092
+ if sfp_status_helper .has_vendor_specific_error (error_bits ):
1093
+ if error_dict :
1094
+ vendor_specific_error_description = error_dict .get (key )
1095
+ else :
1096
+ vendor_specific_error_description = _wrapper_get_sfp_error_description (key )
1097
+ error_descriptions .append (vendor_specific_error_description )
1098
+
1099
+ # Add error info to database
1100
+ # Any existing error will be replaced by the new one.
1101
+ update_port_transceiver_status_table (logical_port , status_tbl [asic_index ], value , '|' .join (error_descriptions ))
1102
+ helper_logger .log_info ("Receive error update port sfp status table." )
1103
+ # In this case EEPROM is not accessible. The DOM info will be removed since it can be out-of-date.
1104
+ # The interface info remains in the DB since it is static.
1105
+ if sfp_status_helper .is_error_block_eeprom_reading (error_bits ):
1106
+ del_port_sfp_dom_info_from_db (logical_port , None , dom_tbl [asic_index ])
1107
+ except (TypeError , ValueError ) as e :
1108
+ logger .log_error ("Got unrecognized event {}, ignored" .format (value ))
1101
1109
1102
1110
# Since ports could be connected to a mux cable, if there is a change event process the change for being on a Y cable Port
1103
1111
y_cable_helper .change_ports_status_for_y_cable_change_event (
0 commit comments