a6efbaed97
Modify get_psu_presence(). Move read() and close() to "try: ... except IOError:" To avoid when read port present sysfs fail. This exception will let sfputil.py to exit. So "sfputil show eeprom" can't show other port status.
174 lines
4.3 KiB
Python
174 lines
4.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
try:
|
|
import time
|
|
from sonic_sfp.sfputilbase import SfpUtilBase
|
|
except ImportError, e:
|
|
raise ImportError (str(e) + "- required module not found")
|
|
|
|
SFP_STATUS_INSERTED = '1'
|
|
SFP_STATUS_REMOVED = '0'
|
|
|
|
class SfpUtil(SfpUtilBase):
|
|
"""Platform specific SfpUtill class"""
|
|
|
|
_port_start = 0
|
|
_port_end = 53
|
|
_qsfp_port_start = 48
|
|
_ports_in_block = 54
|
|
|
|
_port_to_eeprom_mapping = {}
|
|
_port_to_i2c_mapping = {
|
|
0 : 37,
|
|
1 : 38,
|
|
2 : 39,
|
|
3 : 40,
|
|
4 : 41,
|
|
5 : 42,
|
|
6 : 43,
|
|
7 : 44,
|
|
8 : 45,
|
|
9 : 46,
|
|
10 : 47,
|
|
11 : 48,
|
|
12 : 49,
|
|
13 : 50,
|
|
14 : 51,
|
|
15 : 52,
|
|
16 : 53,
|
|
17 : 54,
|
|
18 : 55,
|
|
19 : 56,
|
|
20 : 57,
|
|
21 : 58,
|
|
22 : 59,
|
|
23 : 60,
|
|
24 : 61,
|
|
25 : 62,
|
|
26 : 63,
|
|
27 : 64,
|
|
28 : 65,
|
|
29 : 66,
|
|
30 : 67,
|
|
31 : 68,
|
|
32 : 69,
|
|
33 : 70,
|
|
34 : 71,
|
|
35 : 72,
|
|
36 : 73,
|
|
37 : 74,
|
|
38 : 75,
|
|
39 : 76,
|
|
40 : 77,
|
|
41 : 78,
|
|
42 : 79,
|
|
43 : 80,
|
|
44 : 81,
|
|
45 : 82,
|
|
46 : 83,
|
|
47 : 84,
|
|
48 : 21,
|
|
49 : 22,
|
|
50 : 23,
|
|
51 : 24,
|
|
52 : 25,
|
|
53 : 26,
|
|
}
|
|
|
|
_qsfp_ports = range(_qsfp_port_start, _ports_in_block + 1)
|
|
|
|
_present_status = dict()
|
|
|
|
def __init__(self):
|
|
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom'
|
|
for x in range(self._port_start, self._port_end + 1):
|
|
port_eeprom_path = eeprom_path.format(self._port_to_i2c_mapping[x])
|
|
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
|
self._present_status[x] = SFP_STATUS_REMOVED
|
|
|
|
SfpUtilBase.__init__(self)
|
|
|
|
def reset(self, port_num):
|
|
# Check for invalid port_num
|
|
if port_num < self._qsfp_port_start or port_num > self._port_end:
|
|
print "Error: port %d is not qsfp port" % port_num
|
|
return False
|
|
|
|
path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset"
|
|
port_ps = path.format(self._port_to_i2c_mapping[port_num])
|
|
|
|
try:
|
|
reg_file = open(port_ps, 'w')
|
|
except IOError as e:
|
|
print "Error: unable to open file: %s" % str(e)
|
|
return False
|
|
|
|
#toggle reset
|
|
reg_file.seek(0)
|
|
reg_file.write('1')
|
|
time.sleep(1)
|
|
reg_file.seek(0)
|
|
reg_file.write('0')
|
|
reg_file.close()
|
|
return True
|
|
|
|
def set_low_power_mode(self, port_nuM, lpmode):
|
|
raise NotImplementedError
|
|
|
|
def get_low_power_mode(self, port_num):
|
|
raise NotImplementedError
|
|
|
|
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
|
|
|
|
path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present"
|
|
port_ps = path.format(self._port_to_i2c_mapping[port_num])
|
|
|
|
reg_value = '0'
|
|
try:
|
|
reg_file = open(port_ps)
|
|
reg_value = reg_file.readline().rstrip()
|
|
reg_file.close()
|
|
except IOError as e:
|
|
print "Error: unable to access file: %s" % str(e)
|
|
return False
|
|
|
|
if reg_value == '1':
|
|
return True
|
|
|
|
return False
|
|
|
|
def get_transceiver_change_event(self, timeout=0):
|
|
raise NotImplementedError
|
|
|
|
@property
|
|
def port_start(self):
|
|
return self._port_start
|
|
|
|
@property
|
|
def port_end(self):
|
|
return self._port_end
|
|
|
|
@property
|
|
def qsfp_ports(self):
|
|
return self._qsfp_ports
|
|
|
|
@property
|
|
def port_to_eeprom_mapping(self):
|
|
return self._port_to_eeprom_mapping
|
|
|
|
def get_transceiver_change_event(self, timeout=0):
|
|
ret_present = dict()
|
|
for phy_port in range(self._port_start, self._port_end + 1):
|
|
last_present_status = SFP_STATUS_INSERTED if self.get_presence(phy_port) else SFP_STATUS_REMOVED
|
|
if self._present_status[phy_port] != last_present_status:
|
|
ret_present[phy_port] = last_present_status
|
|
self._present_status[phy_port] = last_present_status
|
|
|
|
time.sleep(2)
|
|
|
|
return True, ret_present
|
|
|