Skip to content

Commit 65eb5a1

Browse files
Junchao-Mellanoxkeboliu
authored andcommitted
[Mellanox] Implement low power mode for cmis host management (sonic-net#17159)
- Why I did it For cmis host management mode, the prevous sysfs cannot be used for low power mode setting. This PR reuses existing low power mode implementation in sonic_xcvr package when CMIS host management mode is enabled - How I did it Use sonic_xcvr low power mode implementation when CMIS host management mode is enabled. - How to verify it Manual test for CMIS host management mode Regression test for old mode and backward compatible test
1 parent e9ac1fa commit 65eb5a1

2 files changed

Lines changed: 76 additions & 0 deletions

File tree

platform/mellanox/mlnx-platform-api/sonic_platform/sfp.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,18 @@ def get_lpmode(self):
397397
Returns:
398398
A Boolean, True if lpmode is enabled, False if disabled
399399
"""
400+
try:
401+
if self.is_sw_control():
402+
api = self.get_xcvr_api()
403+
return api.get_lpmode() if api else False
404+
elif DeviceDataManager.is_independent_mode():
405+
file_path = SFP_SDK_MODULE_SYSFS_ROOT_TEMPLATE.format(self.sdk_index) + SFP_SYSFS_POWER_MODE
406+
power_mode = utils.read_int_from_file(file_path)
407+
return power_mode == POWER_MODE_LOW
408+
except Exception as e:
409+
print(e)
410+
return False
411+
400412
if utils.is_host():
401413
# To avoid performance issue,
402414
# call class level method to avoid initialize the whole sonic platform API
@@ -573,6 +585,24 @@ def set_lpmode(self, lpmode):
573585
Returns:
574586
A boolean, True if lpmode is set successfully, False if not
575587
"""
588+
try:
589+
if self.is_sw_control():
590+
api = self.get_xcvr_api()
591+
if not api:
592+
return False
593+
if api.get_lpmode() == lpmode:
594+
return True
595+
api.set_lpmode(lpmode)
596+
return api.get_lpmode() == lpmode
597+
elif DeviceDataManager.is_independent_mode():
598+
# FW control under CMIS host management mode.
599+
# Currently, we don't support set LPM under this mode.
600+
# Just return False to indicate set Fail
601+
return False
602+
except Exception as e:
603+
print(e)
604+
return False
605+
576606
if utils.is_host():
577607
# To avoid performance issue,
578608
# call class level method to avoid initialize the whole sonic platform API

platform/mellanox/mlnx-platform-api/tests/test_sfp.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,8 @@ def test_is_sw_control(self, mock_get_db, mock_mode, mock_read):
312312
with pytest.raises(Exception):
313313
sfp.is_sw_control()
314314

315+
@mock.patch('sonic_platform.device_data.DeviceDataManager.is_independent_mode', mock.MagicMock(return_value=False))
316+
@mock.patch('sonic_platform.sfp.SFP.is_sw_control', mock.MagicMock(return_value=False))
315317
@mock.patch('sonic_platform.utils.is_host', mock.MagicMock(side_effect = [True, True, False, False]))
316318
@mock.patch('subprocess.check_output', mock.MagicMock(side_effect = ['True', 'False']))
317319
@mock.patch('sonic_platform.sfp.SFP._get_lpmode', mock.MagicMock(side_effect = [True, False]))
@@ -323,6 +325,8 @@ def test_get_lpmode(self):
323325
assert sfp.get_lpmode()
324326
assert not sfp.get_lpmode()
325327

328+
@mock.patch('sonic_platform.device_data.DeviceDataManager.is_independent_mode', mock.MagicMock(return_value=False))
329+
@mock.patch('sonic_platform.sfp.SFP.is_sw_control', mock.MagicMock(return_value=False))
326330
@mock.patch('sonic_platform.utils.is_host', mock.MagicMock(side_effect = [True, True, False, False]))
327331
@mock.patch('subprocess.check_output', mock.MagicMock(side_effect = ['True', 'False']))
328332
@mock.patch('sonic_platform.sfp.SFP._set_lpmode', mock.MagicMock(side_effect = [True, False]))
@@ -333,3 +337,45 @@ def test_set_lpmode(self):
333337
assert not sfp.set_lpmode(True)
334338
assert sfp.set_lpmode(False)
335339
assert not sfp.set_lpmode(False)
340+
341+
@mock.patch('sonic_platform.device_data.DeviceDataManager.is_independent_mode', mock.MagicMock(return_value=True))
342+
@mock.patch('sonic_platform.utils.read_int_from_file')
343+
@mock.patch('sonic_platform.sfp.SFP.is_sw_control')
344+
def test_get_lpmode_cmis_host_mangagement(self, mock_control, mock_read):
345+
mock_control.return_value = True
346+
sfp = SFP(0)
347+
sfp.get_xcvr_api = mock.MagicMock(return_value=None)
348+
assert not sfp.get_lpmode()
349+
350+
mock_api = mock.MagicMock()
351+
sfp.get_xcvr_api.return_value = mock_api
352+
mock_api.get_lpmode = mock.MagicMock(return_value=False)
353+
assert not sfp.get_lpmode()
354+
355+
mock_api.get_lpmode.return_value = True
356+
assert sfp.get_lpmode()
357+
358+
mock_control.return_value = False
359+
mock_read.return_value = 1
360+
assert sfp.get_lpmode()
361+
362+
mock_read.return_value = 2
363+
assert not sfp.get_lpmode()
364+
365+
@mock.patch('sonic_platform.device_data.DeviceDataManager.is_independent_mode', mock.MagicMock(return_value=True))
366+
@mock.patch('sonic_platform.sfp.SFP.is_sw_control')
367+
def test_set_lpmode_cmis_host_mangagement(self, mock_control):
368+
mock_control.return_value = True
369+
sfp = SFP(0)
370+
sfp.get_xcvr_api = mock.MagicMock(return_value=None)
371+
assert not sfp.set_lpmode(False)
372+
373+
mock_api = mock.MagicMock()
374+
sfp.get_xcvr_api.return_value = mock_api
375+
mock_api.get_lpmode = mock.MagicMock(return_value=False)
376+
assert sfp.set_lpmode(False)
377+
assert not sfp.set_lpmode(True)
378+
379+
mock_control.return_value = False
380+
assert not sfp.set_lpmode(True)
381+
assert not sfp.set_lpmode(False)

0 commit comments

Comments
 (0)