-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[sfputil]: Add support for SFP presence, low-power mode and reset (#877)
- Update sfputil plugins for Dell FORCE10-S6000, Arista 7050-QX-32, 7050-QX-32-S
- Loading branch information
Showing
6 changed files
with
182 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,12 @@ | ||
#!/usr/bin/env python | ||
# sfputil.py | ||
# | ||
# Platform-specific SFP transceiver interface for SONiC | ||
# | ||
|
||
try: | ||
import arista.utils.sonic_sfputil as arista_sfputil | ||
except ImportError, e: | ||
raise ImportError (str(e) + "- required module not found") | ||
except ImportError as e: | ||
raise ImportError("%s - required module not found" % str(e)) | ||
|
||
|
||
sfputil = arista_sfputil.getSfpUtil() | ||
SfpUtil = arista_sfputil.getSfpUtil() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,12 @@ | ||
#!/usr/bin/env python | ||
# sfputil.py | ||
# | ||
# Platform-specific SFP transceiver interface for SONiC | ||
# | ||
|
||
try: | ||
import arista.utils.sonic_sfputil as arista_sfputil | ||
except ImportError, e: | ||
raise ImportError (str(e) + "- required module not found") | ||
except ImportError as e: | ||
raise ImportError("%s - required module not found" % str(e)) | ||
|
||
|
||
sfputil = arista_sfputil.getSfpUtil() | ||
SfpUtil = arista_sfputil.getSfpUtil() |
182 changes: 165 additions & 17 deletions
182
device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,175 @@ | ||
#!/usr/bin/env python | ||
# sfputil.py | ||
# | ||
# Platform-specific SFP transceiver interface for SONiC | ||
# | ||
|
||
try: | ||
from sonic_sfp.sfputilbase import sfputilbase | ||
except ImportError, e: | ||
raise ImportError (str(e) + "- required module not found") | ||
import time | ||
from sonic_sfp.sfputilbase import SfpUtilBase | ||
except ImportError as e: | ||
raise ImportError("%s - required module not found" % str(e)) | ||
|
||
|
||
class sfputil(sfputilbase): | ||
"""Platform specific sfputil class""" | ||
class SfpUtil(SfpUtilBase): | ||
"""Platform-specific SfpUtil class""" | ||
|
||
port_start = 0 | ||
port_end = 31 | ||
ports_in_block = 32 | ||
PORT_START = 0 | ||
PORT_END = 31 | ||
PORTS_IN_BLOCK = 32 | ||
|
||
eeprom_offset = 20 | ||
EEPROM_OFFSET = 20 | ||
|
||
port_to_eeprom_mapping = {} | ||
_port_to_eeprom_mapping = {} | ||
|
||
_qsfp_ports = range(0, ports_in_block + 1) | ||
@property | ||
def port_start(self): | ||
return self.PORT_START | ||
|
||
@property | ||
def port_end(self): | ||
return self.PORT_END | ||
|
||
@property | ||
def qsfp_ports(self): | ||
return range(0, self.PORTS_IN_BLOCK + 1) | ||
|
||
@property | ||
def port_to_eeprom_mapping(self): | ||
return self._port_to_eeprom_mapping | ||
|
||
def __init__(self): | ||
eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" | ||
|
||
def __init__(self, port_num): | ||
# Override port_to_eeprom_mapping for class initialization | ||
eeprom_path = '/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom' | ||
for x in range(0, self.port_end + 1): | ||
self.port_to_eeprom_mapping[x] = eeprom_path.format(x + self.eeprom_offset) | ||
sfputilbase.__init__(self, port_num) | ||
self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) | ||
|
||
SfpUtilBase.__init__(self) | ||
|
||
def get_presence(self, port_num): | ||
# Check for invalid port_num | ||
if port_num < self.port_start or port_num > self.port_end: | ||
return False | ||
|
||
try: | ||
reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") | ||
except IOError as e: | ||
print "Error: unable to open file: %s" % str(e) | ||
return False | ||
|
||
content = reg_file.readline().rstrip() | ||
|
||
# content is a string containing the hex representation of the register | ||
reg_value = int(content, 16) | ||
|
||
# Mask off the bit corresponding to our port | ||
mask = (1 << port_num) | ||
|
||
# ModPrsL is active low | ||
if reg_value & mask == 0: | ||
return True | ||
|
||
return False | ||
|
||
def get_low_power_mode(self, port_num): | ||
# Check for invalid port_num | ||
if port_num < self.port_start or port_num > self.port_end: | ||
return False | ||
|
||
try: | ||
reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_lpmode") | ||
except IOError as e: | ||
print "Error: unable to open file: %s" % str(e) | ||
|
||
content = reg_file.readline().rstrip() | ||
|
||
# content is a string containing the hex representation of the register | ||
reg_value = int(content, 16) | ||
|
||
# Mask off the bit corresponding to our port | ||
mask = (1 << port_num) | ||
|
||
# LPMode is active high | ||
if reg_value & mask == 0: | ||
return False | ||
|
||
return True | ||
|
||
def set_low_power_mode(self, port_num, lpmode): | ||
# Check for invalid port_num | ||
if port_num < self.port_start or port_num > self.port_end: | ||
return False | ||
|
||
try: | ||
reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_lpmode", "r+") | ||
except IOError as e: | ||
print "Error: unable to open file: %s" % str(e) | ||
return False | ||
|
||
content = reg_file.readline().rstrip() | ||
|
||
# content is a string containing the hex representation of the register | ||
reg_value = int(content, 16) | ||
|
||
# Mask off the bit corresponding to our port | ||
mask = (1 << port_num) | ||
|
||
# LPMode is active high; set or clear the bit accordingly | ||
if lpmode is True: | ||
reg_value = reg_value | mask | ||
else: | ||
reg_value = reg_value & ~mask | ||
|
||
# Convert our register value back to a hex string and write back | ||
content = hex(reg_value) | ||
|
||
reg_file.seek(0) | ||
reg_file.write(content) | ||
reg_file.close() | ||
|
||
return True | ||
|
||
def reset(self, port_num): | ||
QSFP_RESET_REGISTER_DEVICE_FILE = "/sys/devices/platform/dell-s6000-cpld.0/qsfp_reset" | ||
|
||
# Check for invalid port_num | ||
if port_num < self.port_start or port_num > self.port_end: | ||
return False | ||
|
||
try: | ||
reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "r+") | ||
except IOError as e: | ||
print "Error: unable to open file: %s" % str(e) | ||
return False | ||
|
||
content = reg_file.readline().rstrip() | ||
|
||
# File content is a string containing the hex representation of the register | ||
reg_value = int(content, 16) | ||
|
||
# Mask off the bit corresponding to our port | ||
mask = (1 << port_num) | ||
|
||
# ResetL is active low | ||
reg_value = reg_value & ~mask | ||
|
||
# Convert our register value back to a hex string and write back | ||
reg_file.seek(0) | ||
reg_file.write(hex(reg_value)) | ||
reg_file.close() | ||
|
||
# Sleep 1 second to allow it to settle | ||
time.sleep(1) | ||
|
||
# Flip the bit back high and write back to the register to take port out of reset | ||
try: | ||
reg_file = open(QSFP_RESET_REGISTER_DEVICE_FILE, "w") | ||
except IOError as e: | ||
print "Error: unable to open file: %s" % str(e) | ||
return False | ||
|
||
reg_value = reg_value | mask | ||
reg_file.seek(0) | ||
reg_file.write(hex(reg_value)) | ||
reg_file.close() | ||
|
||
return True |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Submodule sonic-utilities
updated
from c7f6ff to ac7ea4