Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pool:
vmImage: 'ubuntu-24.04'

container:
image: sonicdev-microsoft.azurecr.io:443/sonic-slave-bookworm:latest
image: sonicdev-microsoft.azurecr.io:443/sonic-slave-bookworm-amd64:$(BRANCH_NAME)

steps:
- task: DownloadPipelineArtifact@2
Expand Down
4 changes: 2 additions & 2 deletions sonic_platform_base/sonic_xcvr/api/public/c_cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@
})

class CCmisApi(CmisApi):
def __init__(self, xcvr_eeprom, cdb):
super(CCmisApi, self).__init__(xcvr_eeprom, cdb)
def __init__(self, xcvr_eeprom, init_cdb_fw_handler=False):
super(CCmisApi, self).__init__(xcvr_eeprom, init_cdb_fw_handler)

def _get_vdm_key_to_db_prefix_map(self):
combined_map = {**CMIS_VDM_KEY_TO_DB_PREFIX_KEY_MAP, **C_CMIS_DELTA_VDM_KEY_TO_DB_PREFIX_KEY_MAP}
Expand Down
24 changes: 22 additions & 2 deletions sonic_platform_base/sonic_xcvr/api/public/cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@

import logging
from ...codes.public.cmis import CmisCodes
from ...codes.public.cdb import CdbCodes
from ...codes.public.sff8024 import Sff8024
from ...fields import consts
from ...mem_maps.public.cdb import CdbMemMap
from ...cdb.cdb_fw import CdbFwHandler as CdbFw
from ..xcvr_api import XcvrApi
from .cmisCDB import CmisCdbApi
from .cmisVDM import CmisVdmApi
Expand Down Expand Up @@ -135,11 +138,28 @@ def set_cache_enabled(cls, enabled: bool):
"""
cls.cache_enabled = bool(enabled)

def __init__(self, xcvr_eeprom, cdb_fw_hdlr=None):
def __init__(self, xcvr_eeprom, init_cdb_fw_handler=False):
super(CmisApi, self).__init__(xcvr_eeprom)
self.vdm = CmisVdmApi(xcvr_eeprom) if not self.is_flat_memory() else None
self.cdb = CmisCdbApi(xcvr_eeprom) if self.is_cdb_supported() else None
self.cdb_fw_hdlr = cdb_fw_hdlr if self.is_cdb_supported() else None
self._init_cdb_fw_handler = init_cdb_fw_handler
self._cdb_fw_hdlr = None

@property
def cdb_fw_hdlr(self):
if not self._init_cdb_fw_handler:
return None

if self._cdb_fw_hdlr is None:
self._cdb_fw_hdlr = self._create_cdb_fw_handler()
return self._cdb_fw_hdlr

def _create_cdb_fw_handler(self):
if not self.is_cdb_supported():
self._init_cdb_fw_handler = False
return None
cdb_mem_map = CdbMemMap(CdbCodes)
return CdbFw(self.xcvr_eeprom.reader, self.xcvr_eeprom.writer, cdb_mem_map)

def get_cdb_fw_handler(self):
return self.cdb_fw_hdlr
Expand Down
9 changes: 2 additions & 7 deletions sonic_platform_base/sonic_xcvr/xcvr_api_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@
from .api.public.c_cmis import CCmisApi
from .mem_maps.public.cmis import CmisMemMap
from .mem_maps.public.c_cmis import CCmisMemMap
from .mem_maps.public.cdb import CdbMemMap
from .cdb.cdb_fw import CdbFwHandler as CdbFw
from .codes.public.cdb import CdbCodes

from .codes.credo.aec_800g import CmisAec800gCodes
from .api.credo.aec_800g import CmisAec800gApi
Expand Down Expand Up @@ -89,13 +86,11 @@ def _create_cmis_api(self):
('EOPTOLINK' in vendor_name and vendor_pn in EOP_800G_VENDOR_PN_LIST):
api = self._create_api(CmisCodes, CmisMemMap, CmisFr800gApi)
else:
cdb_mem_map = CdbMemMap(CdbCodes)
cdb_fw = CdbFw(self.reader, self.writer, cdb_mem_map)
xcvr_eeprom = XcvrEeprom(self.reader, self.writer, CmisMemMap(CmisCodes))
api = CmisApi(xcvr_eeprom, cdb_fw)
api = CmisApi(xcvr_eeprom, init_cdb_fw_handler=True)
if api.is_coherent_module():
xcvr_eeprom = XcvrEeprom(self.reader, self.writer, CCmisMemMap(CmisCodes))
api = CCmisApi(xcvr_eeprom, cdb_fw)
api = CCmisApi(xcvr_eeprom, init_cdb_fw_handler=True)
return api

def _create_qsfp_api(self):
Expand Down
8 changes: 1 addition & 7 deletions tests/sonic_xcvr/test_ccmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,18 @@
import pytest
from sonic_platform_base.sonic_xcvr.api.public.c_cmis import CCmisApi, C_CMIS_XCVR_INFO_DEFAULT_DICT
from sonic_platform_base.sonic_xcvr.mem_maps.public.c_cmis import CCmisMemMap
from sonic_platform_base.sonic_xcvr.mem_maps.public.cdb import CdbMemMap
from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom
from sonic_platform_base.sonic_xcvr.codes.public.cmis import CmisCodes
from sonic_platform_base.sonic_xcvr.codes.public.cdb import CdbCodes
from sonic_platform_base.sonic_xcvr.cdb.cdb_fw import CdbFwHandler as CdbFw


CdbFw.initFwHandler = MagicMock(return_value=True)

class TestCCmis(object):
codes = CmisCodes
mem_map = CCmisMemMap(codes)
reader = MagicMock(return_value=None)
writer = MagicMock()
eeprom = XcvrEeprom(reader, writer, mem_map)

cdb = CdbFw(reader, writer, CdbMemMap(CdbCodes))
api = CCmisApi(eeprom, cdb)
api = CCmisApi(eeprom, init_cdb_fw_handler=False)

@pytest.mark.parametrize("mock_response, expected", [
(8, 150),
Expand Down
4 changes: 2 additions & 2 deletions tests/sonic_xcvr/test_cdb_fw.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ def test_initFwHandler_send_cmd_failure(self):

result = handler.initFwHandler()

assert result == True
assert result == False

def test_initFwHandler_read_reply_none(self):
"""Test initFwHandler when read_reply returns None"""
Expand All @@ -75,7 +75,7 @@ def test_initFwHandler_read_reply_none(self):

result = handler.initFwHandler()

assert result == True
assert result == False

def test_initFwHandler_lpl_only(self):
"""Test initFwHandler with LPL only mechanism"""
Expand Down
26 changes: 26 additions & 0 deletions tests/sonic_xcvr/test_cmis.py
Original file line number Diff line number Diff line change
Expand Up @@ -2997,3 +2997,29 @@ def test_get_tx_adaptive_eq_fail_flag(self, mock_response, expected):
self.api.xcvr_eeprom.read.return_value = mock_response[1]
result = self.api.get_tx_adaptive_eq_fail_flag()
assert result == expected

@patch('sonic_platform_base.sonic_xcvr.cdb.cdb_fw.CdbFwHandler.initFwHandler', MagicMock(return_value=True))
@patch('sonic_platform_base.sonic_xcvr.api.public.cmis.CmisApi.is_cdb_supported')
def test_create_cdb_fw_handler(self, mock_cdb_support):
mock_cdb_support.return_value = False
assert self.api._create_cdb_fw_handler() is None
assert self.api._init_cdb_fw_handler is False
mock_cdb_support.return_value = True
assert self.api._create_cdb_fw_handler()

with patch.object(self.api, '_init_cdb_fw_handler', new=False):
assert self.api.cdb_fw_hdlr is None
with patch.object(self.api, '_init_cdb_fw_handler', new=True):
assert self.api.cdb_fw_hdlr is not None

@patch('sonic_platform_base.sonic_xcvr.cdb.cdb_fw.CdbFwHandler.initFwHandler', MagicMock(return_value=True))
@patch('sonic_platform_base.sonic_xcvr.api.public.cmis.CmisApi.is_cdb_supported', MagicMock(return_value=True))
@patch('sonic_platform_base.sonic_xcvr.api.public.cmis.CmisApi._create_cdb_fw_handler')
def test_lazy_create_cdb_fw_handler(self, mock_create_handler):
mock_create_handler.return_value = MagicMock()
self.api._cdb_fw_hdlr = None
with patch.object(self.api, '_init_cdb_fw_handler', new=True):
first_handle = self.api.cdb_fw_hdlr
second_handle =self.api.cdb_fw_hdlr
assert first_handle is second_handle
assert mock_create_handler.call_count == 1
10 changes: 3 additions & 7 deletions tests/sonic_xcvr/test_sfp_optoe_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@
from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom
from sonic_platform_base.sonic_xcvr.codes.public.cmis import CmisCodes
from sonic_platform_base.sonic_xcvr.api.public.sff8472 import Sff8472Api
from sonic_platform_base.sonic_xcvr.mem_maps.public.cdb import CdbMemMap
from sonic_platform_base.sonic_xcvr.codes.public.cdb import CdbCodes
from sonic_platform_base.sonic_xcvr.cdb.cdb_fw import CdbFwHandler as CdbFw

CdbFw.initFwHandler = MagicMock(return_value=True)

class TestSfpOptoeBase(object):

codes = CmisCodes
Expand All @@ -22,9 +19,8 @@ class TestSfpOptoeBase(object):
writer = MagicMock()
eeprom = XcvrEeprom(reader, writer, mem_map)
sfp_optoe_api = SfpOptoeBase()
cdb = CdbFw(reader, writer, CdbMemMap(CdbCodes))
ccmis_api = CCmisApi(eeprom, cdb)
cmis_api = CmisApi(eeprom, cdb)
ccmis_api = CCmisApi(eeprom, init_cdb_fw_handler=False)
cmis_api = CmisApi(eeprom, init_cdb_fw_handler=False)
sff8472_api = Sff8472Api(eeprom)

def test_is_transceiver_vdm_supported_non_cmis(self):
Expand Down
Loading