Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apply custom Si settings via CMIS: SONiC xcvrd platform daemon changes #385

Merged
merged 35 commits into from
Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
887e510
Optics SI settings changes for platform daemon
AnoopKamath Jul 5, 2023
6a8991b
Remove repeated lines
AnoopKamath Jul 6, 2023
e806c43
Address review comments:
AnoopKamath Jul 7, 2023
df3c8e6
Fix UT issues
AnoopKamath Jul 10, 2023
dc8cf53
Fix UT issues
AnoopKamath Jul 10, 2023
b36377a
Removed unused code
AnoopKamath Jul 17, 2023
dd38890
Add xcvrd test cases
AnoopKamath Jul 17, 2023
0251335
Create optics_si_settings.json
AnoopKamath Jul 17, 2023
4d17956
Fix build fail
AnoopKamath Jul 18, 2023
5a2bfbf
Fix build failures
AnoopKamath Jul 18, 2023
51ff947
fix build failures
AnoopKamath Jul 18, 2023
c52c866
fix build failures
AnoopKamath Jul 18, 2023
47d5a61
Fix build failures
AnoopKamath Jul 18, 2023
498cdbd
Merge branch 'master' into master
AnoopKamath Jul 18, 2023
813b62f
Update xcvrd.py
AnoopKamath Jul 25, 2023
925a91e
Update xcvrd.py
AnoopKamath Jul 25, 2023
860933a
Update xcvrd.py
AnoopKamath Jul 25, 2023
0005bc0
Update xcvrd.py
AnoopKamath Jul 25, 2023
cce60bf
Update test_xcvrd.py
AnoopKamath Jul 25, 2023
02f620f
Merge branch 'master' into master
AnoopKamath Jul 25, 2023
6eb7da0
Address review comments: Pass pport instead of lport
AnoopKamath Jul 26, 2023
140d7c1
Update test_xcvrd.py
AnoopKamath Jul 26, 2023
9f8bca9
remove whitespaces
AnoopKamath Jul 26, 2023
832a985
Merge branch 'master' into master
AnoopKamath Aug 10, 2023
ae8900e
Update xcvrd.py
AnoopKamath Aug 11, 2023
ee32e2e
Create optics_si_parser file
AnoopKamath Aug 15, 2023
814cc4d
Create optics_si_parser.py
AnoopKamath Aug 15, 2023
1268f44
Update xcvrd.py
AnoopKamath Aug 15, 2023
3f4c26d
Update test_xcvrd.py
AnoopKamath Aug 15, 2023
31cfa6e
Update xcvrd.py
AnoopKamath Aug 15, 2023
160a2f9
Update optics_si_parser.py
AnoopKamath Aug 15, 2023
a859f55
Update xcvrd.py
AnoopKamath Aug 15, 2023
14a5761
Update optics_si_parser.py
AnoopKamath Aug 15, 2023
bbee152
Add Vendor key to XCVRD log
AnoopKamath Aug 16, 2023
1d2262c
Change logging level
AnoopKamath Aug 16, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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":{
AnoopKamath marked this conversation as resolved.
Show resolved Hide resolved
"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
AnoopKamath marked this conversation as resolved.
Show resolved Hide resolved

# 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