Skip to content

Commit

Permalink
Apply custom Si settings via CMIS: SONiC xcvrd platform daemon changes (
Browse files Browse the repository at this point in the history
#385)

* Optics SI settings changes for platform daemon
  • Loading branch information
AnoopKamath authored Aug 16, 2023
1 parent f3c2631 commit 816059b
Show file tree
Hide file tree
Showing 4 changed files with 430 additions and 3 deletions.
222 changes: 222 additions & 0 deletions sonic-xcvrd/tests/optics_si_settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,222 @@
{
"GLOBAL_MEDIA_SETTINGS":{
"0-31":{
"100G_SPEED":{
"CREDO-CAC82X321M2MC0HW":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":0,
"OutputAmplitudeTargetRx2":0,
"OutputAmplitudeTargetRx3":0,
"OutputAmplitudeTargetRx4":0,
"OutputAmplitudeTargetRx5":0,
"OutputAmplitudeTargetRx6":0,
"OutputAmplitudeTargetRx7":0,
"OutputAmplitudeTargetRx8":0
}
}
}
}
},
"PORT_MEDIA_SETTINGS":{
"0":{
"100G_SPEED":{
"CREDO-CAC82X321M2MC0HW":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":0,
"OutputAmplitudeTargetRx2":0,
"OutputAmplitudeTargetRx3":0,
"OutputAmplitudeTargetRx4":0,
"OutputAmplitudeTargetRx5":0,
"OutputAmplitudeTargetRx6":0,
"OutputAmplitudeTargetRx7":0,
"OutputAmplitudeTargetRx8":0
}
}
}
},
"1":{
"100G_SPEED":{
"Default":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":1,
"OutputAmplitudeTargetRx2":1,
"OutputAmplitudeTargetRx3":1,
"OutputAmplitudeTargetRx4":1,
"OutputAmplitudeTargetRx5":1,
"OutputAmplitudeTargetRx6":1,
"OutputAmplitudeTargetRx7":1,
"OutputAmplitudeTargetRx8":1
}
}
}
},
"10":{
"100G_SPEED":{
"Default":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":1,
"OutputAmplitudeTargetRx2":1,
"OutputAmplitudeTargetRx3":1,
"OutputAmplitudeTargetRx4":1,
"OutputAmplitudeTargetRx5":1,
"OutputAmplitudeTargetRx6":1,
"OutputAmplitudeTargetRx7":1,
"OutputAmplitudeTargetRx8":1
}
}
}
},
"11":{
"100G_SPEED":{
"Default":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":1,
"OutputAmplitudeTargetRx2":1,
"OutputAmplitudeTargetRx3":1,
"OutputAmplitudeTargetRx4":1,
"OutputAmplitudeTargetRx5":1,
"OutputAmplitudeTargetRx6":1,
"OutputAmplitudeTargetRx7":1,
"OutputAmplitudeTargetRx8":1
}
}
}
},
"12":{
"100G_SPEED":{
"Default":{
"OutputEqPreCursorTargetRx":{
"OutputEqPreCursorTargetRx1":3,
"OutputEqPreCursorTargetRx2":3,
"OutputEqPreCursorTargetRx3":3,
"OutputEqPreCursorTargetRx4":3,
"OutputEqPreCursorTargetRx5":3,
"OutputEqPreCursorTargetRx6":3,
"OutputEqPreCursorTargetRx7":3,
"OutputEqPreCursorTargetRx8":3
},
"OutputEqPostCursorTargetRx":{
"OutputEqPostCursorTargetRx1":0,
"OutputEqPostCursorTargetRx2":0,
"OutputEqPostCursorTargetRx3":0,
"OutputEqPostCursorTargetRx4":0,
"OutputEqPostCursorTargetRx5":0,
"OutputEqPostCursorTargetRx6":0,
"OutputEqPostCursorTargetRx7":0,
"OutputEqPostCursorTargetRx8":0
},
"OutputAmplitudeTargetRx":{
"OutputAmplitudeTargetRx1":1,
"OutputAmplitudeTargetRx2":1,
"OutputAmplitudeTargetRx3":1,
"OutputAmplitudeTargetRx4":1,
"OutputAmplitudeTargetRx5":1,
"OutputAmplitudeTargetRx6":1,
"OutputAmplitudeTargetRx7":1,
"OutputAmplitudeTargetRx8":1
}
}
}
}
}
}
42 changes: 42 additions & 0 deletions sonic-xcvrd/tests/test_xcvrd.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#from unittest.mock import DEFAULT
from xcvrd.xcvrd_utilities.port_mapping import *
from xcvrd.xcvrd_utilities.sfp_status_helper import *
from xcvrd.xcvrd_utilities.optics_si_parser import *
from xcvrd.xcvrd import *
import pytest
import copy
Expand Down Expand Up @@ -41,6 +42,14 @@
global_media_settings = media_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS'].pop('1-32')
media_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS']['1-5,6,7-20,21-32'] = global_media_settings

with open(os.path.join(test_path, 'optics_si_settings.json'), 'r') as fn:
optics_si_settings_dict = json.load(fn)
port_optics_si_settings = {}
optics_si_settings_with_comma_dict = copy.deepcopy(optics_si_settings_dict)
global_optics_si_settings = optics_si_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS'].pop('0-31')
port_optics_si_settings['PORT_MEDIA_SETTINGS'] = optics_si_settings_with_comma_dict.pop('PORT_MEDIA_SETTINGS')
optics_si_settings_with_comma_dict['GLOBAL_MEDIA_SETTINGS']['0-5,6,7-20,21-31'] = global_optics_si_settings

class TestXcvrdThreadException(object):

@patch('xcvrd.xcvrd.platform_chassis', MagicMock())
Expand Down Expand Up @@ -470,6 +479,39 @@ def _check_notify_media_setting(self, index):
port_mapping.handle_port_change_event(port_change_event)
notify_media_setting(logical_port_name, xcvr_info_dict, app_port_tbl, port_mapping)

@patch('xcvrd.xcvrd_utilities.optics_si_parser.g_optics_si_dict', optics_si_settings_dict)
@patch('xcvrd.xcvrd._wrapper_get_presence', MagicMock(return_value=True))
def test_fetch_optics_si_setting(self):
self._check_fetch_optics_si_setting(1)

@patch('xcvrd.xcvrd_utilities.optics_si_parser.g_optics_si_dict', optics_si_settings_with_comma_dict)
@patch('xcvrd.xcvrd._wrapper_get_presence', MagicMock(return_value=True))
def test_fetch_optics_si_setting_with_comma(self):
self._check_fetch_optics_si_setting(1)
self._check_fetch_optics_si_setting(6)

@patch('xcvrd.xcvrd_utilities.optics_si_parser.g_optics_si_dict', port_optics_si_settings)
@patch('xcvrd.xcvrd._wrapper_get_presence', MagicMock(return_value=True))
def test_fetch_optics_si_setting_with_port(self):
self._check_fetch_optics_si_setting(1)

@patch('xcvrd.xcvrd._wrapper_get_presence', MagicMock(return_value=True))
@patch('xcvrd.xcvrd_utilities.optics_si_parser.get_module_vendor_key', MagicMock(return_value=('CREDO-CAC82X321M','CREDO')))
def _check_fetch_optics_si_setting(self, index):
port = 1
lane_speed = 100
mock_sfp = MagicMock()
optics_si_parser.fetch_optics_si_setting(port, lane_speed, mock_sfp)

def test_get_module_vendor_key(self):
mock_sfp = MagicMock()
mock_xcvr_api = MagicMock()
mock_sfp.get_xcvr_api = MagicMock(return_value=mock_xcvr_api)
mock_xcvr_api.get_manufacturer = MagicMock(return_value='Credo ')
mock_xcvr_api.get_model = MagicMock(return_value='CAC82X321HW')
result = get_module_vendor_key(1, mock_sfp)
assert result == ('CREDO-CAC82X321HW','CREDO')

def test_detect_port_in_error_status(self):
class MockTable:
def get(self, key):
Expand Down
32 changes: 29 additions & 3 deletions sonic-xcvrd/xcvrd/xcvrd.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

from .xcvrd_utilities import sfp_status_helper
from .xcvrd_utilities import port_mapping
from .xcvrd_utilities import optics_si_parser
except ImportError as e:
raise ImportError(str(e) + " - required module not found")

Expand Down Expand Up @@ -1591,6 +1592,11 @@ def task_worker(self):
self.port_dict[lport]['cmis_expired'] = now + datetime.timedelta(seconds = max(modulePwrUpDuration, dpDeinitDuration))

elif state == self.CMIS_STATE_AP_CONF:
# Explicit control bit to apply custom Host SI settings.
# It will be set to 1 and applied via set_application if
# custom SI settings is applicable
ec = 0

# TODO: Use fine grained time when the CMIS memory map is available
if not self.check_module_state(api, ['ModuleReady']):
if (expired is not None) and (expired <= now):
Expand All @@ -1613,9 +1619,28 @@ def task_worker(self):
else:
self.log_notice("{} configured laser frequency {} GHz".format(lport, freq))

# Stage custom SI settings
if optics_si_parser.optics_si_present():
optics_si_dict = {}
# Apply module SI settings if applicable
lane_speed = int(speed/1000)//host_lane_count
optics_si_dict = optics_si_parser.fetch_optics_si_setting(pport, lane_speed, sfp)

if optics_si_dict:
self.log_notice("{}: Apply Optics SI found for Vendor: {} PN: {} lane speed: {}G".
format(lport, api.get_manufacturer(), api.get_model(), lane_speed))
if not api.stage_custom_si_settings(host_lanes_mask, optics_si_dict):
self.log_notice("{}: unable to stage custom SI settings ".format(lport))
self.force_cmis_reinit(lport, retries + 1)
continue

# Set Explicit control bit to apply Custom Host SI settings
ec = 1

# D.1.3 Software Configuration and Initialization
if not api.set_application(host_lanes_mask, appl):
self.log_notice("{}: unable to set application".format(lport))
api.set_application(host_lanes_mask, appl, ec)
if not api.scs_apply_datapath_init(host_lanes_mask):
self.log_notice("{}: unable to set application and stage DP init".format(lport))
self.force_cmis_reinit(lport, retries + 1)
continue

Expand Down Expand Up @@ -2450,9 +2475,10 @@ def init(self):
self.xcvr_table_helper = XcvrTableHelper(self.namespaces)

if is_fast_reboot_enabled():
self.log_info("Skip loading media_settings.json in case of fast-reboot")
self.log_info("Skip loading media_settings.json and optics_si_settings.json in case of fast-reboot")
else:
self.load_media_settings()
optics_si_parser.load_optics_si_settings()

# Make sure this daemon started after all port configured
self.log_notice("XCVRD INIT: Wait for port config is done")
Expand Down
Loading

0 comments on commit 816059b

Please sign in to comment.