[BFN] Move qsfp eeprom reading to new cached api (#9909)
* Move qsfp eeprom reading to new cached api * provide reading multiple pages in recursive manner * workaround with flat memory on cmis * remove workaround with memory model * Remove unused imports
This commit is contained in:
parent
1f9c89a8d3
commit
d9c9c70fb5
@ -1,12 +1,10 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
try:
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import importlib
|
||||
|
||||
sys.path.append(os.path.dirname(__file__))
|
||||
from sonic_platform.pltfm_mgr_rpc.pltfm_mgr_rpc import Client
|
||||
from sonic_platform.pltfm_mgr_rpc.pltfm_mgr_rpc import InvalidPltfmMgrOperation
|
||||
|
||||
from thrift.transport import TSocket
|
||||
from thrift.transport import TTransport
|
||||
@ -25,9 +23,8 @@ class ThriftClient(object):
|
||||
self.transport = TTransport.TBufferedTransport(self.transport)
|
||||
bprotocol = TBinaryProtocol.TBinaryProtocol(self.transport)
|
||||
|
||||
self.pltfm_mgr_module = importlib.import_module(".".join(["pltfm_mgr_rpc", "pltfm_mgr_rpc"]))
|
||||
pltfm_mgr_protocol = TMultiplexedProtocol.TMultiplexedProtocol(bprotocol, "pltfm_mgr_rpc")
|
||||
self.pltfm_mgr = self.pltfm_mgr_module.Client(pltfm_mgr_protocol)
|
||||
self.pltfm_mgr = Client(pltfm_mgr_protocol)
|
||||
|
||||
self.transport.open()
|
||||
return self
|
||||
@ -59,7 +56,7 @@ def pltfm_mgr_try(func, default=None, thrift_attempts=35):
|
||||
def pm_cb_run(client):
|
||||
try:
|
||||
return (None, func(client.pltfm_mgr))
|
||||
except client.pltfm_mgr_module.InvalidPltfmMgrOperation as ouch:
|
||||
except InvalidPltfmMgrOperation as ouch:
|
||||
return (ouch.code, default)
|
||||
|
||||
return thrift_try(pm_cb_run)
|
||||
|
@ -16,24 +16,6 @@ from thrift.transport import TTransport
|
||||
all_structs = []
|
||||
|
||||
|
||||
class qsfp_eeprom_page_t(object):
|
||||
PAGE0_LOWER = 0
|
||||
PAGE0_UPPER = 1
|
||||
PAGE3 = 2
|
||||
|
||||
_VALUES_TO_NAMES = {
|
||||
0: "PAGE0_LOWER",
|
||||
1: "PAGE0_UPPER",
|
||||
2: "PAGE3",
|
||||
}
|
||||
|
||||
_NAMES_TO_VALUES = {
|
||||
"PAGE0_LOWER": 0,
|
||||
"PAGE0_UPPER": 1,
|
||||
"PAGE3": 2,
|
||||
}
|
||||
|
||||
|
||||
class pltfm_mgr_sys_tmp_t(object):
|
||||
"""
|
||||
Attributes:
|
||||
|
@ -11,29 +11,38 @@ except ImportError as e:
|
||||
SFP_TYPE = "SFP"
|
||||
QSFP_TYPE = "QSFP"
|
||||
QSFP_DD_TYPE = "QSFP_DD"
|
||||
EEPROM_PAGE_SIZE = 128
|
||||
|
||||
try:
|
||||
from thrift.Thrift import TApplicationException
|
||||
|
||||
def cached_num_bytes_get(client):
|
||||
return client.pltfm_mgr.pltfm_mgr_qsfp_cached_num_bytes_get(1, 0, 0, 0)
|
||||
thrift_try(cached_num_bytes_get, 1)
|
||||
EEPROM_CACHED_API_SUPPORT = True
|
||||
except TApplicationException as e:
|
||||
EEPROM_CACHED_API_SUPPORT = False
|
||||
|
||||
class Sfp(SfpOptoeBase):
|
||||
"""
|
||||
BFN Platform-specific SFP class
|
||||
"""
|
||||
|
||||
SFP_EEPROM_PATH = "/var/run/platform/sfp/"
|
||||
|
||||
def __init__(self, port_num):
|
||||
SfpOptoeBase.__init__(self)
|
||||
self.index = port_num
|
||||
self.port_num = port_num
|
||||
self.sfp_type = QSFP_TYPE
|
||||
self.SFP_EEPROM_PATH = "/var/run/platform/sfp/"
|
||||
|
||||
if not os.path.exists(self.SFP_EEPROM_PATH):
|
||||
try:
|
||||
os.makedirs(self.SFP_EEPROM_PATH)
|
||||
except OSError as e:
|
||||
if e.errno != errno.EEXIST:
|
||||
raise
|
||||
|
||||
self.eeprom_path = self.SFP_EEPROM_PATH + "sfp{}-eeprom-cache".format(self.index)
|
||||
if not EEPROM_CACHED_API_SUPPORT:
|
||||
if not os.path.exists(self.SFP_EEPROM_PATH):
|
||||
try:
|
||||
os.makedirs(self.SFP_EEPROM_PATH)
|
||||
except OSError as e:
|
||||
if e.errno != errno.EEXIST:
|
||||
raise
|
||||
self.eeprom_path = self.SFP_EEPROM_PATH + "sfp{}-eeprom-cache".format(self.index)
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
@ -47,7 +56,7 @@ class Sfp(SfpOptoeBase):
|
||||
try:
|
||||
presence = thrift_try(qsfp_presence_get)
|
||||
except Exception as e:
|
||||
print( e.__doc__)
|
||||
print(e.__doc__)
|
||||
print(e.message)
|
||||
|
||||
return presence
|
||||
@ -75,14 +84,31 @@ class Sfp(SfpOptoeBase):
|
||||
def qsfp_info_get(client):
|
||||
return client.pltfm_mgr.pltfm_mgr_qsfp_info_get(self.index)
|
||||
|
||||
if self.get_presence():
|
||||
eeprom_hex = thrift_try(qsfp_info_get)
|
||||
eeprom_raw = bytearray.fromhex(eeprom_hex)
|
||||
with open(self.eeprom_path, 'wb') as fp:
|
||||
fp.write(eeprom_raw)
|
||||
return self.eeprom_path
|
||||
eeprom_hex = thrift_try(qsfp_info_get)
|
||||
eeprom_raw = bytearray.fromhex(eeprom_hex)
|
||||
with open(self.eeprom_path, 'wb') as fp:
|
||||
fp.write(eeprom_raw)
|
||||
return self.eeprom_path
|
||||
|
||||
return None
|
||||
def read_eeprom(self, offset, num_bytes):
|
||||
if not self.get_presence():
|
||||
return None
|
||||
|
||||
if not EEPROM_CACHED_API_SUPPORT:
|
||||
return super().read_eeprom(offset, num_bytes)
|
||||
|
||||
def cached_num_bytes_get(page, offset, num_bytes):
|
||||
def qsfp_cached_num_bytes_get(client):
|
||||
return client.pltfm_mgr.pltfm_mgr_qsfp_cached_num_bytes_get(self.index, page, offset, num_bytes)
|
||||
return bytearray.fromhex(thrift_try(qsfp_cached_num_bytes_get))
|
||||
|
||||
page_offset = offset % EEPROM_PAGE_SIZE
|
||||
if page_offset + num_bytes > EEPROM_PAGE_SIZE:
|
||||
curr_page_num_bytes_left = EEPROM_PAGE_SIZE - page_offset
|
||||
curr_page_bytes = cached_num_bytes_get(offset // EEPROM_PAGE_SIZE, page_offset, curr_page_num_bytes_left)
|
||||
return curr_page_bytes + self.read_eeprom(offset + curr_page_num_bytes_left, num_bytes - curr_page_num_bytes_left)
|
||||
|
||||
return cached_num_bytes_get(offset // EEPROM_PAGE_SIZE, page_offset, num_bytes)
|
||||
|
||||
def write_eeprom(self, offset, num_bytes, write_buffer):
|
||||
# Not supported at the moment
|
||||
|
Reference in New Issue
Block a user