Skip to content
Closed
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
dmasize=32M
usemsi=0
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
#!/usr/bin/env python

import os.path
import time

try:
import time
from sonic_sfp.sfputilbase import SfpUtilBase
except ImportError, e:
raise ImportError (str(e) + "- required module not found")

#from xcvrd
SFP_STATUS_INSERTED = '1'
SFP_STATUS_REMOVED = '0'

class SfpUtil(SfpUtilBase):
"""Platform specific SfpUtill class"""
Expand All @@ -14,17 +19,29 @@ class SfpUtil(SfpUtilBase):
last_port = 31
port_num = 32

sfp_status = 0

port_to_eeprom = {}
port_to_i2cbus_mapping = {
port_to_i2cbus_0 = {
1 : 14,
2 : 15,
3 : 16,
4 : 17,
}

port_to_i2cbus_1 = {
1 : 15,
2 : 16,
3 : 17,
4 : 18,
}

port_to_i2cbus_mapping = {}

eeprom_path = "/sys/bus/i2c/devices/{0}-005f/sfp{1}_eeprom"
port_reset_path = "/sys/bus/i2c/devices/{0}-005f/sfp{1}_port_reset"
present_path = "/sys/bus/i2c/devices/{0}-005f/sfp{1}_is_present"
lpmode_path = "/sys/bus/i2c/devices/{0}-005f/sfp{1}_lpmode"

_qsfp_ports = range(first_port, port_num + 1)
@property
Expand All @@ -43,15 +60,75 @@ def qsfp_ports(self):
def port_to_eeprom_mapping(self):
return self.port_to_eeprom

def get_transceiver_change_event(self):
"""
TODO: This function need to be implemented
when decide to support monitoring SFP(Xcvrd)
on this platform.
"""
raise NotImplementedError
@property
def get_presence_all(self):
port = self.port_start
bitmap = ""

while (port >= self.port_start) and (port <= self.port_end):
index = (port % 8)
i2c_index = (port / 8) + 1
path = self.present_path
port_path = path.format(self.port_to_i2cbus_mapping[i2c_index], (index + 1))

try:
reg_file = open(port_path)
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False

reg_value = reg_file.readline().rstrip()
reg_file.close()

if reg_value == '1':
bitmap += '1' + " "
else:
bitmap += '0' + " "

port += 1

content = bitmap.split(" ")
content = "".join(content[::-1])

return int(content, 2)

def get_transceiver_change_event(self, timeout=0):
while True:
port_dict = {}
port = self.port_start

# Check for OIR events and return updated port_dict
reg_value = self.get_presence_all
if reg_value != self.sfp_status:
changed_ports = self.sfp_status ^ reg_value
while (port >= self.port_start) and (port <= self.port_end):

# Mask off the bit corresponding to our port
mask = (1 << port)

if changed_ports & mask:
# port presence is high
if (reg_value & mask) == mask:
port_dict[port] = SFP_STATUS_INSERTED
else:
port_dict[port] = SFP_STATUS_REMOVED

port += 1

# Update reg value
self.sfp_status = reg_value
return True, port_dict

time.sleep(0.5)

def __init__(self):
path = self.present_path
port_path = path.format(self.port_to_i2cbus_0[1], 1)
if not os.path.exists(port_path):
self.port_to_i2cbus_mapping = self.port_to_i2cbus_1
else:
self.port_to_i2cbus_mapping = self.port_to_i2cbus_0

path = self.eeprom_path
for x in range(self.first_port, self.last_port + 1):
index = (x % 8)
Expand Down Expand Up @@ -85,15 +162,58 @@ def reset(self, port_num):
reg_file.close()
return True

def set_low_power_mode(self, port_nuM, lpmode):
raise NotImplementedError
def set_low_power_mode(self, port_num, lpmode):
# Check for invalid port_num
if port_num < self.first_port or port_num > self.last_port:
return False

index = (port_num % 8)
i2c_index = (port_num / 8) + 1
path = self.lpmode_path
port_path = path.format(self.port_to_i2cbus_mapping[i2c_index], (index + 1))

try:
reg_file = open(port_path, 'w')
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False

if lpmode == True:
reg_file.write('1')
else:
reg_file.write('0')

reg_file.close()
return True

def get_low_power_mode(self, port_num):
raise NotImplementedError
# Check for invalid port_num
if port_num < self.first_port or port_num > self.last_port:
return False

index = (port_num % 8)
i2c_index = (port_num / 8) + 1
path = self.lpmode_path
port_path = path.format(self.port_to_i2cbus_mapping[i2c_index], (index + 1))

try:
reg_file = open(port_path)
except IOError as e:
print "Error: unable to open file: %s" % str(e)
return False

reg_value = reg_file.readline().rstrip()

reg_file.close()

if reg_value == '1':
return True

return False

def get_presence(self, port_num):
# Check for invalid port_num
if port_num < self.first_port or port_num > self.last_port:
if port_num < self.port_start or port_num > self.port_end:
return False

index = (port_num % 8)
Expand All @@ -109,6 +229,9 @@ def get_presence(self, port_num):
return False

reg_value = reg_file.readline().rstrip()

reg_file.close()

if reg_value == '1':
return True

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"skip_ledd": false
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
dmasize=32M
usemsi=0
Loading