platform/marvell-armhf/sonic-platform-nokia/7215/sonic_platform/sfp.py (100 lines of code) (raw):
# Name: sfp.py, version: 1.0
#
# Description: Module contains the definitions of SFP related APIs
# for Nokia IXR 7250 platform.
#
# Copyright (c) 2023, Nokia
# All rights reserved.
#
try:
from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase
from sonic_py_common.logger import Logger
from sonic_py_common import device_info
except ImportError as e:
raise ImportError(str(e) + "- required module not found")
import subprocess as cmd
smbus_present = 1
try:
import smbus
except ImportError as e:
smbus_present = 0
COPPER_TYPE = "COPPER"
SFP_TYPE = "SFP"
# SFP PORT numbers
SFP_PORT_START = 49
SFP_PORT_END = 52
logger = Logger()
class Sfp(SfpOptoeBase):
"""
Nokia IXR-7215 Platform-specific Sfp refactor class
"""
instances = []
# Paths
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
HOST_CHK_CMD = "docker > /dev/null 2>&1"
PLATFORM = "armhf-nokia_ixs7215_52x-r0"
HWSKU = "Nokia-7215"
port_to_i2c_mapping = 0
# def __init__(self, index, sfp_type, stub):
def __init__(self, index, sfp_type, eeprom_path, port_i2c_map):
SfpOptoeBase.__init__(self)
self.index = index
self.port_num = index
self.sfp_type = sfp_type
self.eeprom_path = eeprom_path
self.port_to_i2c_mapping = port_i2c_map
self.name = sfp_type + str(index-1)
self.port_name = sfp_type + str(index)
self.port_to_eeprom_mapping = {}
self.port_to_eeprom_mapping[index] = eeprom_path
self._version_info = device_info.get_sonic_version_info()
self.lastPresence = False
logger.log_debug("Sfp __init__ index {} setting name to {} and eeprom_path to {}".format(index, self.name, self.eeprom_path))
Sfp.instances.append(self)
def get_eeprom_path(self):
return self.eeprom_path
def get_presence(self):
"""
Retrieves the presence
Returns:
bool: True if is present, False if not
"""
if self.sfp_type == COPPER_TYPE:
return False
if smbus_present == 0: # if called from sfputil outside of pmon
cmdstatus, sfpstatus = cmd.getstatusoutput('sudo i2cget -y 0 0x41 0x3')
sfpstatus = int(sfpstatus, 16)
else:
bus = smbus.SMBus(0)
DEVICE_ADDRESS = 0x41
DEVICE_REG = 0x3
sfpstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
pos = [1, 2, 4, 8]
bit_pos = pos[self.index-SFP_PORT_START]
sfpstatus = sfpstatus & (bit_pos)
if sfpstatus == 0:
return True
return False
def get_name(self):
"""
Retrieves the name of the device
Returns:
string: The name of the device
"""
return self.name
def get_position_in_parent(self):
"""
Retrieves 1-based relative physical position in parent device.
Returns:
integer: The 1-based relative physical position in parent device or
-1 if cannot determine the position
"""
return -1
def is_replaceable(self):
"""
Indicate whether this device is replaceable.
Returns:
bool: True if it is replaceable.
"""
if self.sfp_type == "SFP":
return True
else:
return False
def _get_error_code(self):
"""
Get error code of the SFP module
Returns:
The error code
"""
return NotImplementedError
def get_error_description(self):
"""
Get error description
Args:
error_code: The error code returned by _get_error_code
Returns:
The error description
"""
if not self.get_presence():
error_description = self.SFP_STATUS_UNPLUGGED
else:
error_description = self.SFP_STATUS_OK
return error_description
# return NotImplementedError
def get_reset_status(self):
"""
Retrieves the reset status of SFP
Returns:
A Boolean, True if reset enabled, False if disabled
"""
if self.sfp_type == COPPER_TYPE:
return False
if self.sfp_type == SFP_TYPE:
return False
def get_status(self):
"""
Retrieves the operational status of the device
"""
reset = self.get_reset_status()
if reset is True:
status = False
else:
status = True
return status
def reset(self):
"""
Reset SFP.
Returns:
A boolean, True if successful, False if not
"""
# RJ45 and SFP ports not resettable
return False
def set_lpmode(self, lpmode):
"""
Sets the lpmode (low power mode) of SFP
Args:
lpmode: A Boolean, True to enable lpmode, False to disable it
Note : lpmode can be overridden by set_power_override
Returns:
A boolean, True if lpmode is set successfully, False if not
"""
if self.sfp_type == COPPER_TYPE:
return False
if self.sfp_type == SFP_TYPE:
return False
def get_lpmode(self):
"""
Retrieves the lpmode (low power mode) status of this SFP
Returns:
A Boolean, True if lpmode is enabled, False if disabled
"""
if self.sfp_type == COPPER_TYPE:
return False
if self.sfp_type == SFP_TYPE:
return False