[Accton] Correct port index and offer the default speed. (#3213)
* [as5712-54x] Verified with index from 1. Add qsfp_event() for command "show interaface trancerver". Signed-off-by: roy_lee <roy_lee@accton.com> * [as6712-32x] Add default port speed. Verified with index from 1. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7726-32x] Add default port speed. Verified with index from 1. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7712-32x] Add default port speed. Verified with index from 1. Signed-off-by: roy_lee <roy_lee@accton.com> * [as5812-54x] Add default port speed. Verified with index from 1. Signed-off-by: roy_lee <roy_lee@accton.com> * [as5712-54x] Update port-config with 1-based index. Signed-off-by: roy_lee <roy_lee@accton.com> * [as5812-54x] Somehow the service may block, use type=simple to work-around. Add syslog function for monitor. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7716-32x] Update port-config with 1-based index. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7816-64x] Update port-config with 1-based index. Implement sfputil change_event. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7326-56x] Update port-config with 1-based index. Implement sfputil change_event. Signed-off-by: roy_lee <roy_lee@accton.com> * Remove debug code. Signed-off-by: roy_lee <roy_lee@accton.com> * [as7312-54x] Update port-config with 1-based index and default port speed. Signed-off-by: roy_lee <roy_lee@accton.com>
This commit is contained in:
parent
9d64ce761f
commit
efe9438c61
@ -1,73 +1,73 @@
|
|||||||
# name lanes alias index
|
# name lanes alias index speed
|
||||||
Ethernet0 13 tenGigE0 0
|
Ethernet0 13 tenGigE0 1 10000
|
||||||
Ethernet1 14 tenGigE1 1
|
Ethernet1 14 tenGigE1 2 10000
|
||||||
Ethernet2 15 tenGigE2 2
|
Ethernet2 15 tenGigE2 3 10000
|
||||||
Ethernet3 16 tenGigE3 3
|
Ethernet3 16 tenGigE3 4 10000
|
||||||
Ethernet4 21 tenGigE4 4
|
Ethernet4 21 tenGigE4 5 10000
|
||||||
Ethernet5 22 tenGigE5 5
|
Ethernet5 22 tenGigE5 6 10000
|
||||||
Ethernet6 23 tenGigE6 6
|
Ethernet6 23 tenGigE6 7 10000
|
||||||
Ethernet7 24 tenGigE7 7
|
Ethernet7 24 tenGigE7 8 10000
|
||||||
Ethernet8 25 tenGigE8 8
|
Ethernet8 25 tenGigE8 9 10000
|
||||||
Ethernet9 26 tenGigE9 9
|
Ethernet9 26 tenGigE9 10 10000
|
||||||
Ethernet10 27 tenGigE10 10
|
Ethernet10 27 tenGigE10 11 10000
|
||||||
Ethernet11 28 tenGigE11 11
|
Ethernet11 28 tenGigE11 12 10000
|
||||||
Ethernet12 29 tenGigE12 12
|
Ethernet12 29 tenGigE12 13 10000
|
||||||
Ethernet13 30 tenGigE13 13
|
Ethernet13 30 tenGigE13 14 10000
|
||||||
Ethernet14 31 tenGigE14 14
|
Ethernet14 31 tenGigE14 15 10000
|
||||||
Ethernet15 32 tenGigE15 15
|
Ethernet15 32 tenGigE15 16 10000
|
||||||
Ethernet16 45 tenGigE16 16
|
Ethernet16 45 tenGigE16 17 10000
|
||||||
Ethernet17 46 tenGigE17 17
|
Ethernet17 46 tenGigE17 18 10000
|
||||||
Ethernet18 47 tenGigE18 18
|
Ethernet18 47 tenGigE18 19 10000
|
||||||
Ethernet19 48 tenGigE19 19
|
Ethernet19 48 tenGigE19 20 10000
|
||||||
Ethernet20 49 tenGigE20 20
|
Ethernet20 49 tenGigE20 21 10000
|
||||||
Ethernet21 50 tenGigE21 21
|
Ethernet21 50 tenGigE21 22 10000
|
||||||
Ethernet22 51 tenGigE22 22
|
Ethernet22 51 tenGigE22 23 10000
|
||||||
Ethernet23 52 tenGigE23 23
|
Ethernet23 52 tenGigE23 24 10000
|
||||||
Ethernet24 53 tenGigE24 24
|
Ethernet24 53 tenGigE24 25 10000
|
||||||
Ethernet25 54 tenGigE25 25
|
Ethernet25 54 tenGigE25 26 10000
|
||||||
Ethernet26 55 tenGigE26 26
|
Ethernet26 55 tenGigE26 27 10000
|
||||||
Ethernet27 56 tenGigE27 27
|
Ethernet27 56 tenGigE27 28 10000
|
||||||
Ethernet28 57 tenGigE28 28
|
Ethernet28 57 tenGigE28 29 10000
|
||||||
Ethernet29 58 tenGigE29 29
|
Ethernet29 58 tenGigE29 30 10000
|
||||||
Ethernet30 59 tenGigE30 30
|
Ethernet30 59 tenGigE30 31 10000
|
||||||
Ethernet31 60 tenGigE31 31
|
Ethernet31 60 tenGigE31 32 10000
|
||||||
Ethernet32 61 tenGigE32 32
|
Ethernet32 61 tenGigE32 33 10000
|
||||||
Ethernet33 62 tenGigE33 33
|
Ethernet33 62 tenGigE33 34 10000
|
||||||
Ethernet34 63 tenGigE34 34
|
Ethernet34 63 tenGigE34 35 10000
|
||||||
Ethernet35 64 tenGigE35 35
|
Ethernet35 64 tenGigE35 36 10000
|
||||||
Ethernet36 65 tenGigE36 36
|
Ethernet36 65 tenGigE36 37 10000
|
||||||
Ethernet37 66 tenGigE37 37
|
Ethernet37 66 tenGigE37 38 10000
|
||||||
Ethernet38 67 tenGigE38 38
|
Ethernet38 67 tenGigE38 39 10000
|
||||||
Ethernet39 68 tenGigE39 39
|
Ethernet39 68 tenGigE39 40 10000
|
||||||
Ethernet40 69 tenGigE40 40
|
Ethernet40 69 tenGigE40 41 10000
|
||||||
Ethernet41 70 tenGigE41 41
|
Ethernet41 70 tenGigE41 42 10000
|
||||||
Ethernet42 71 tenGigE42 42
|
Ethernet42 71 tenGigE42 43 10000
|
||||||
Ethernet43 72 tenGigE43 43
|
Ethernet43 72 tenGigE43 44 10000
|
||||||
Ethernet44 73 tenGigE44 44
|
Ethernet44 73 tenGigE44 45 10000
|
||||||
Ethernet45 74 tenGigE45 45
|
Ethernet45 74 tenGigE45 46 10000
|
||||||
Ethernet46 75 tenGigE46 46
|
Ethernet46 75 tenGigE46 47 10000
|
||||||
Ethernet47 76 tenGigE47 47
|
Ethernet47 76 tenGigE47 48 10000
|
||||||
Ethernet48 97 tenGigE48 48
|
Ethernet48 97 tenGigE48 49 10000
|
||||||
Ethernet49 98 tenGigE49 49
|
Ethernet49 98 tenGigE49 49 10000
|
||||||
Ethernet50 99 tenGigE50 50
|
Ethernet50 99 tenGigE50 49 10000
|
||||||
Ethernet51 100 tenGigE51 51
|
Ethernet51 100 tenGigE51 49 10000
|
||||||
Ethernet52 101 tenGigE52 52
|
Ethernet52 101 tenGigE52 50 10000
|
||||||
Ethernet53 102 tenGigE53 53
|
Ethernet53 102 tenGigE53 50 10000
|
||||||
Ethernet54 103 tenGigE54 54
|
Ethernet54 103 tenGigE54 50 10000
|
||||||
Ethernet55 104 tenGigE55 55
|
Ethernet55 104 tenGigE55 50 10000
|
||||||
Ethernet56 81 tenGigE56 56
|
Ethernet56 81 tenGigE56 51 10000
|
||||||
Ethernet57 82 tenGigE57 57
|
Ethernet57 82 tenGigE57 51 10000
|
||||||
Ethernet58 83 tenGigE58 58
|
Ethernet58 83 tenGigE58 51 10000
|
||||||
Ethernet59 84 tenGigE59 59
|
Ethernet59 84 tenGigE59 51 10000
|
||||||
Ethernet60 105 tenGigE60 60
|
Ethernet60 105 tenGigE60 52 10000
|
||||||
Ethernet61 106 tenGigE61 61
|
Ethernet61 106 tenGigE61 52 10000
|
||||||
Ethernet62 107 tenGigE62 62
|
Ethernet62 107 tenGigE62 52 10000
|
||||||
Ethernet63 108 tenGigE63 63
|
Ethernet63 108 tenGigE63 52 10000
|
||||||
Ethernet64 109 tenGigE64 64
|
Ethernet64 109 tenGigE64 53 10000
|
||||||
Ethernet65 110 tenGigE65 65
|
Ethernet65 110 tenGigE65 53 10000
|
||||||
Ethernet66 111 tenGigE66 66
|
Ethernet66 111 tenGigE66 53 10000
|
||||||
Ethernet67 112 tenGigE67 67
|
Ethernet67 112 tenGigE67 53 10000
|
||||||
Ethernet68 77 tenGigE68 68
|
Ethernet68 77 tenGigE68 54 10000
|
||||||
Ethernet69 78 tenGigE69 69
|
Ethernet69 78 tenGigE69 54 10000
|
||||||
Ethernet70 79 tenGigE70 70
|
Ethernet70 79 tenGigE70 54 10000
|
||||||
Ethernet71 80 tenGigE71 71
|
Ethernet71 80 tenGigE71 54 10000
|
||||||
|
@ -12,14 +12,19 @@ except ImportError as e:
|
|||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 71
|
PORT_END = 54
|
||||||
PORTS_IN_BLOCK = 72
|
PORTS_IN_BLOCK = 54
|
||||||
QSFP_PORT_START = 48
|
QSFP_PORT_START = 49
|
||||||
QSFP_PORT_END = 72
|
QSFP_PORT_END = 54
|
||||||
|
|
||||||
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
||||||
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
||||||
@ -28,87 +33,67 @@ class SfpUtil(SfpUtilBase):
|
|||||||
I2C_BUS_ORDER = -1
|
I2C_BUS_ORDER = -1
|
||||||
|
|
||||||
#The sidebands of QSFP is different.
|
#The sidebands of QSFP is different.
|
||||||
#present is in-order.
|
qsfp_sb_map = [0, 2, 4, 1, 3, 5]
|
||||||
#But lp_mode and reset are not.
|
|
||||||
qsfp_sb_map = [1, 3, 5, 2, 4, 6]
|
|
||||||
|
|
||||||
_port_to_is_present = {}
|
_port_to_is_present = {}
|
||||||
_port_to_lp_mode = {}
|
_port_to_lp_mode = {}
|
||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: [1, 2],
|
1: [1, 2],
|
||||||
1: [2, 3],
|
2: [2, 3],
|
||||||
2: [3, 4],
|
3: [3, 4],
|
||||||
3: [4, 5],
|
4: [4, 5],
|
||||||
4: [5, 6],
|
5: [5, 6],
|
||||||
5: [6, 7],
|
6: [6, 7],
|
||||||
6: [7, 8],
|
7: [7, 8],
|
||||||
7: [8, 9],
|
8: [8, 9],
|
||||||
8: [9, 10],
|
9: [9, 10],
|
||||||
9: [10, 11],
|
10: [10, 11],
|
||||||
10: [11, 12],
|
11: [11, 12],
|
||||||
11: [12, 13],
|
12: [12, 13],
|
||||||
12: [13, 14],
|
13: [13, 14],
|
||||||
13: [14, 15],
|
14: [14, 15],
|
||||||
14: [15, 16],
|
15: [15, 16],
|
||||||
15: [16, 17],
|
16: [16, 17],
|
||||||
16: [17, 18],
|
17: [17, 18],
|
||||||
17: [18, 19],
|
18: [18, 19],
|
||||||
18: [19, 20],
|
19: [19, 20],
|
||||||
19: [20, 21],
|
20: [20, 21],
|
||||||
20: [21, 22],
|
21: [21, 22],
|
||||||
21: [22, 23],
|
22: [22, 23],
|
||||||
22: [23, 24],
|
23: [23, 24],
|
||||||
23: [24, 25],
|
24: [24, 25],
|
||||||
24: [25, 26],
|
25: [25, 26],
|
||||||
25: [26, 27],
|
26: [26, 27],
|
||||||
26: [27, 28],
|
27: [27, 28],
|
||||||
27: [28, 29],
|
28: [28, 29],
|
||||||
28: [29, 30],
|
29: [29, 30],
|
||||||
29: [30, 31],
|
30: [30, 31],
|
||||||
30: [31, 32],
|
31: [31, 32],
|
||||||
31: [32, 33],
|
32: [32, 33],
|
||||||
32: [33, 34],
|
33: [33, 34],
|
||||||
33: [34, 35],
|
34: [34, 35],
|
||||||
34: [35, 36],
|
35: [35, 36],
|
||||||
35: [36, 37],
|
36: [36, 37],
|
||||||
36: [37, 38],
|
37: [37, 38],
|
||||||
37: [38, 39],
|
38: [38, 39],
|
||||||
38: [39, 40],
|
39: [39, 40],
|
||||||
39: [40, 41],
|
40: [40, 41],
|
||||||
40: [41, 42],
|
41: [41, 42],
|
||||||
41: [42, 43],
|
42: [42, 43],
|
||||||
42: [43, 44],
|
43: [43, 44],
|
||||||
43: [44, 45],
|
44: [44, 45],
|
||||||
44: [45, 46],
|
45: [45, 46],
|
||||||
45: [46, 47],
|
46: [46, 47],
|
||||||
46: [47, 48],
|
47: [47, 48],
|
||||||
47: [48, 49],
|
48: [48, 49],
|
||||||
48: [49, 50],#QSFP49
|
49: [49, 50],#QSFP49
|
||||||
49: [49, 50],
|
50: [51, 52],
|
||||||
50: [49, 50],
|
51: [53, 54],
|
||||||
51: [49, 50],
|
52: [50, 51],
|
||||||
52: [50, 52],#QSFP50
|
53: [52, 53],
|
||||||
53: [50, 52],
|
54: [54, 55],#QSFP54
|
||||||
54: [50, 52],
|
|
||||||
55: [50, 52],
|
|
||||||
56: [51, 54],#QSFP51
|
|
||||||
57: [51, 54],
|
|
||||||
58: [51, 54],
|
|
||||||
59: [51, 54],
|
|
||||||
60: [52, 51],#QSFP52
|
|
||||||
61: [52, 51],
|
|
||||||
62: [52, 51],
|
|
||||||
63: [52, 51],
|
|
||||||
64: [53, 53], #QSFP53
|
|
||||||
65: [53, 53],
|
|
||||||
66: [53, 53],
|
|
||||||
67: [53, 53],
|
|
||||||
68: [54, 55],#QSFP54
|
|
||||||
69: [54, 55],
|
|
||||||
70: [54, 55],
|
|
||||||
71: [54, 55],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -135,16 +120,6 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def port_to_eeprom_mapping(self):
|
def port_to_eeprom_mapping(self):
|
||||||
return self._port_to_eeprom_mapping
|
return self._port_to_eeprom_mapping
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
|
||||||
|
|
||||||
for x in range(0, self.port_end+1):
|
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
|
||||||
self._port_to_i2c_mapping[x][1]
|
|
||||||
)
|
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
|
||||||
|
|
||||||
#Two i2c buses might get flipped order, check them both.
|
#Two i2c buses might get flipped order, check them both.
|
||||||
def update_i2c_order(self):
|
def update_i2c_order(self):
|
||||||
if self.I2C_BUS_ORDER < 0:
|
if self.I2C_BUS_ORDER < 0:
|
||||||
@ -162,12 +137,11 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
order = self.update_i2c_order()
|
order = self.update_i2c_order()
|
||||||
if port_num < 24:
|
if port_num <= 24:
|
||||||
present_path = self.BASE_CPLD2_PATH.format(order)
|
present_path = self.BASE_CPLD2_PATH.format(order)
|
||||||
else:
|
else:
|
||||||
present_path = self.BASE_CPLD3_PATH.format(order)
|
present_path = self.BASE_CPLD3_PATH.format(order)
|
||||||
|
present_path = present_path + "module_present_" + str(port_num)
|
||||||
present_path = present_path + "module_present_" + str(self._port_to_i2c_mapping[port_num][0])
|
|
||||||
self.__port_to_is_present = present_path
|
self.__port_to_is_present = present_path
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -187,8 +161,8 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def qsfp_sb_remap(self, port_num):
|
def qsfp_sb_remap(self, port_num):
|
||||||
qsfp_start = self.qsfp_port_start
|
qsfp_start = self.qsfp_port_start
|
||||||
qsfp_index = self._port_to_i2c_mapping[port_num][0] - qsfp_start
|
qsfp_index = port_num - qsfp_start
|
||||||
qsfp_index = self.qsfp_sb_map[qsfp_index-1]
|
qsfp_index = self.qsfp_sb_map[qsfp_index]
|
||||||
return qsfp_start+qsfp_index
|
return qsfp_start+qsfp_index
|
||||||
|
|
||||||
def get_low_power_mode_cpld(self, port_num):
|
def get_low_power_mode_cpld(self, port_num):
|
||||||
@ -282,9 +256,8 @@ class SfpUtil(SfpUtilBase):
|
|||||||
mod_rst_path = lp_mode_path + "module_reset_"
|
mod_rst_path = lp_mode_path + "module_reset_"
|
||||||
q = self.qsfp_sb_remap(port_num)
|
q = self.qsfp_sb_remap(port_num)
|
||||||
mod_rst_path = mod_rst_path + str(q)
|
mod_rst_path = mod_rst_path + str(q)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(mod_rst_path, 'r+')
|
reg_file = open(mod_rst_path, 'r+', buffering=0)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
@ -298,11 +271,81 @@ class SfpUtil(SfpUtilBase):
|
|||||||
reg_file.close()
|
reg_file.close()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def _get_presence_bitmap(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
order = self.update_i2c_order()
|
||||||
on this platform.
|
|
||||||
"""
|
present_path = self.BASE_CPLD2_PATH.format(order)
|
||||||
raise NotImplementedError
|
nodes.append(present_path + "module_present_all")
|
||||||
|
present_path = self.BASE_CPLD3_PATH.format(order)
|
||||||
|
nodes.append(present_path + "module_present_all")
|
||||||
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_presence_bitmap
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
fp_port = self._port_to_i2c_mapping[port][0]
|
||||||
|
mask = (1 << (fp_port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
||||||
|
|
||||||
|
for x in range(self.port_start, self.port_end+1):
|
||||||
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
|
self._port_to_i2c_mapping[x][1]
|
||||||
|
)
|
||||||
|
|
||||||
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,73 +1,73 @@
|
|||||||
# name lanes alias index
|
# name lanes alias index speed
|
||||||
Ethernet0 13 tenGigE0 1
|
Ethernet0 13 tenGigE0 1 10000
|
||||||
Ethernet1 14 tenGigE1 2
|
Ethernet1 14 tenGigE1 2 10000
|
||||||
Ethernet2 15 tenGigE2 3
|
Ethernet2 15 tenGigE2 3 10000
|
||||||
Ethernet3 16 tenGigE3 4
|
Ethernet3 16 tenGigE3 4 10000
|
||||||
Ethernet4 21 tenGigE4 5
|
Ethernet4 21 tenGigE4 5 10000
|
||||||
Ethernet5 22 tenGigE5 6
|
Ethernet5 22 tenGigE5 6 10000
|
||||||
Ethernet6 23 tenGigE6 7
|
Ethernet6 23 tenGigE6 7 10000
|
||||||
Ethernet7 24 tenGigE7 8
|
Ethernet7 24 tenGigE7 8 10000
|
||||||
Ethernet8 25 tenGigE8 9
|
Ethernet8 25 tenGigE8 9 10000
|
||||||
Ethernet9 26 tenGigE9 10
|
Ethernet9 26 tenGigE9 10 10000
|
||||||
Ethernet10 27 tenGigE10 11
|
Ethernet10 27 tenGigE10 11 10000
|
||||||
Ethernet11 28 tenGigE11 12
|
Ethernet11 28 tenGigE11 12 10000
|
||||||
Ethernet12 29 tenGigE12 13
|
Ethernet12 29 tenGigE12 13 10000
|
||||||
Ethernet13 30 tenGigE13 14
|
Ethernet13 30 tenGigE13 14 10000
|
||||||
Ethernet14 31 tenGigE14 15
|
Ethernet14 31 tenGigE14 15 10000
|
||||||
Ethernet15 32 tenGigE15 16
|
Ethernet15 32 tenGigE15 16 10000
|
||||||
Ethernet16 45 tenGigE16 17
|
Ethernet16 45 tenGigE16 17 10000
|
||||||
Ethernet17 46 tenGigE17 18
|
Ethernet17 46 tenGigE17 18 10000
|
||||||
Ethernet18 47 tenGigE18 19
|
Ethernet18 47 tenGigE18 19 10000
|
||||||
Ethernet19 48 tenGigE19 20
|
Ethernet19 48 tenGigE19 20 10000
|
||||||
Ethernet20 49 tenGigE20 21
|
Ethernet20 49 tenGigE20 21 10000
|
||||||
Ethernet21 50 tenGigE21 22
|
Ethernet21 50 tenGigE21 22 10000
|
||||||
Ethernet22 51 tenGigE22 23
|
Ethernet22 51 tenGigE22 23 10000
|
||||||
Ethernet23 52 tenGigE23 24
|
Ethernet23 52 tenGigE23 24 10000
|
||||||
Ethernet24 53 tenGigE24 25
|
Ethernet24 53 tenGigE24 25 10000
|
||||||
Ethernet25 54 tenGigE25 26
|
Ethernet25 54 tenGigE25 26 10000
|
||||||
Ethernet26 55 tenGigE26 27
|
Ethernet26 55 tenGigE26 27 10000
|
||||||
Ethernet27 56 tenGigE27 28
|
Ethernet27 56 tenGigE27 28 10000
|
||||||
Ethernet28 57 tenGigE28 29
|
Ethernet28 57 tenGigE28 29 10000
|
||||||
Ethernet29 58 tenGigE29 30
|
Ethernet29 58 tenGigE29 30 10000
|
||||||
Ethernet30 59 tenGigE30 31
|
Ethernet30 59 tenGigE30 31 10000
|
||||||
Ethernet31 60 tenGigE31 32
|
Ethernet31 60 tenGigE31 32 10000
|
||||||
Ethernet32 61 tenGigE32 33
|
Ethernet32 61 tenGigE32 33 10000
|
||||||
Ethernet33 62 tenGigE33 34
|
Ethernet33 62 tenGigE33 34 10000
|
||||||
Ethernet34 63 tenGigE34 35
|
Ethernet34 63 tenGigE34 35 10000
|
||||||
Ethernet35 64 tenGigE35 36
|
Ethernet35 64 tenGigE35 36 10000
|
||||||
Ethernet36 65 tenGigE36 37
|
Ethernet36 65 tenGigE36 37 10000
|
||||||
Ethernet37 66 tenGigE37 38
|
Ethernet37 66 tenGigE37 38 10000
|
||||||
Ethernet38 67 tenGigE38 39
|
Ethernet38 67 tenGigE38 39 10000
|
||||||
Ethernet39 68 tenGigE39 40
|
Ethernet39 68 tenGigE39 40 10000
|
||||||
Ethernet40 69 tenGigE40 41
|
Ethernet40 69 tenGigE40 41 10000
|
||||||
Ethernet41 70 tenGigE41 42
|
Ethernet41 70 tenGigE41 42 10000
|
||||||
Ethernet42 71 tenGigE42 43
|
Ethernet42 71 tenGigE42 43 10000
|
||||||
Ethernet43 72 tenGigE43 44
|
Ethernet43 72 tenGigE43 44 10000
|
||||||
Ethernet44 73 tenGigE44 45
|
Ethernet44 73 tenGigE44 45 10000
|
||||||
Ethernet45 74 tenGigE45 46
|
Ethernet45 74 tenGigE45 46 10000
|
||||||
Ethernet46 75 tenGigE46 47
|
Ethernet46 75 tenGigE46 47 10000
|
||||||
Ethernet47 76 tenGigE47 48
|
Ethernet47 76 tenGigE47 48 10000
|
||||||
Ethernet48 97 tenGigE48 49
|
Ethernet48 97 tenGigE48 49 10000
|
||||||
Ethernet49 98 tenGigE49 50
|
Ethernet49 98 tenGigE49 49 10000
|
||||||
Ethernet50 99 tenGigE50 51
|
Ethernet50 99 tenGigE50 49 10000
|
||||||
Ethernet51 100 tenGigE51 52
|
Ethernet51 100 tenGigE51 49 10000
|
||||||
Ethernet52 101 tenGigE52 53
|
Ethernet52 101 tenGigE52 50 10000
|
||||||
Ethernet53 102 tenGigE53 54
|
Ethernet53 102 tenGigE53 50 10000
|
||||||
Ethernet54 103 tenGigE54 55
|
Ethernet54 103 tenGigE54 50 10000
|
||||||
Ethernet55 104 tenGigE55 56
|
Ethernet55 104 tenGigE55 50 10000
|
||||||
Ethernet56 81 tenGigE56 57
|
Ethernet56 81 tenGigE56 51 10000
|
||||||
Ethernet57 82 tenGigE57 58
|
Ethernet57 82 tenGigE57 51 10000
|
||||||
Ethernet58 83 tenGigE58 59
|
Ethernet58 83 tenGigE58 51 10000
|
||||||
Ethernet59 84 tenGigE59 60
|
Ethernet59 84 tenGigE59 51 10000
|
||||||
Ethernet60 105 tenGigE60 61
|
Ethernet60 105 tenGigE60 52 10000
|
||||||
Ethernet61 106 tenGigE61 62
|
Ethernet61 106 tenGigE61 52 10000
|
||||||
Ethernet62 107 tenGigE62 63
|
Ethernet62 107 tenGigE62 52 10000
|
||||||
Ethernet63 108 tenGigE63 64
|
Ethernet63 108 tenGigE63 52 10000
|
||||||
Ethernet64 109 tenGigE64 65
|
Ethernet64 109 tenGigE64 53 10000
|
||||||
Ethernet65 110 tenGigE65 66
|
Ethernet65 110 tenGigE65 53 10000
|
||||||
Ethernet66 111 tenGigE66 67
|
Ethernet66 111 tenGigE66 53 10000
|
||||||
Ethernet67 112 tenGigE67 68
|
Ethernet67 112 tenGigE67 53 10000
|
||||||
Ethernet68 77 tenGigE68 69
|
Ethernet68 77 tenGigE68 54 10000
|
||||||
Ethernet69 78 tenGigE69 70
|
Ethernet69 78 tenGigE69 54 10000
|
||||||
Ethernet70 79 tenGigE70 71
|
Ethernet70 79 tenGigE70 54 10000
|
||||||
EthernEt71 80 tenGigE71 72
|
Ethernet71 80 tenGigE71 54 10000
|
||||||
|
@ -11,15 +11,19 @@ try:
|
|||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 1
|
PORT_START = 1
|
||||||
PORT_END = 72
|
PORT_END = 54
|
||||||
PORTS_IN_BLOCK = 72
|
PORTS_IN_BLOCK = 54
|
||||||
QSFP_PORT_START = 48
|
QSFP_PORT_START = 49
|
||||||
QSFP_PORT_END = 72
|
QSFP_PORT_END = 54
|
||||||
|
|
||||||
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
||||||
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
||||||
@ -30,7 +34,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
#The sidebands of QSFP is different.
|
#The sidebands of QSFP is different.
|
||||||
#present is in-order.
|
#present is in-order.
|
||||||
#But lp_mode and reset are not.
|
#But lp_mode and reset are not.
|
||||||
qsfp_sb_map = [1, 3, 5, 2, 4, 6]
|
qsfp_sb_map = [0, 2, 4, 1, 3, 5]
|
||||||
|
|
||||||
_port_to_is_present = {}
|
_port_to_is_present = {}
|
||||||
_port_to_lp_mode = {}
|
_port_to_lp_mode = {}
|
||||||
@ -85,30 +89,12 @@ class SfpUtil(SfpUtilBase):
|
|||||||
46: [46,47],
|
46: [46,47],
|
||||||
47: [47,48],
|
47: [47,48],
|
||||||
48: [48,49],
|
48: [48,49],
|
||||||
49: [49, 50],#QSFP49
|
49: [49,50],#QSFP_start
|
||||||
50: [49, 50],
|
50: [51,52],
|
||||||
51: [49, 50],
|
51: [53,54],
|
||||||
52: [49, 50],
|
52: [50,51],
|
||||||
53: [50, 52],#QSFP50
|
53: [52,53],
|
||||||
54: [50, 52],
|
54: [54,55],
|
||||||
55: [50, 52],
|
|
||||||
56: [50, 52],
|
|
||||||
57: [51, 54],#QSFP51
|
|
||||||
58: [51, 54],
|
|
||||||
59: [51, 54],
|
|
||||||
60: [51, 54],
|
|
||||||
61: [52, 51],#QSFP52
|
|
||||||
62: [52, 51],
|
|
||||||
63: [52, 51],
|
|
||||||
64: [52, 51],
|
|
||||||
65: [53, 53],#QSFP53
|
|
||||||
66: [53, 53],
|
|
||||||
67: [53, 53],
|
|
||||||
68: [53, 53],
|
|
||||||
69: [54, 55],#QSFP54
|
|
||||||
70: [54, 55],
|
|
||||||
71: [54, 55],
|
|
||||||
72: [54, 55],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -142,7 +128,6 @@ class SfpUtil(SfpUtilBase):
|
|||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x][1]
|
self._port_to_i2c_mapping[x][1]
|
||||||
)
|
)
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
#Two i2c buses might get flipped order, check them both.
|
#Two i2c buses might get flipped order, check them both.
|
||||||
@ -170,7 +155,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
else:
|
else:
|
||||||
present_path = self.BASE_CPLD3_PATH.format(order)
|
present_path = self.BASE_CPLD3_PATH.format(order)
|
||||||
|
|
||||||
present_path = present_path + "module_present_" + str(self._port_to_i2c_mapping[port_num][0])
|
present_path = present_path + "module_present_" + str(port_num)
|
||||||
self.__port_to_is_present = present_path
|
self.__port_to_is_present = present_path
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -190,8 +175,8 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def qsfp_sb_remap(self, port_num):
|
def qsfp_sb_remap(self, port_num):
|
||||||
qsfp_start = self.qsfp_port_start
|
qsfp_start = self.qsfp_port_start
|
||||||
qsfp_index = self._port_to_i2c_mapping[port_num][0] - qsfp_start
|
qsfp_index = port_num - qsfp_start
|
||||||
qsfp_index = self.qsfp_sb_map[qsfp_index-1]
|
qsfp_index = self.qsfp_sb_map[qsfp_index]
|
||||||
return qsfp_start+qsfp_index
|
return qsfp_start+qsfp_index
|
||||||
|
|
||||||
def get_low_power_mode_cpld(self, port_num):
|
def get_low_power_mode_cpld(self, port_num):
|
||||||
@ -287,7 +272,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
mod_rst_path = mod_rst_path + str(q)
|
mod_rst_path = mod_rst_path + str(q)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(mod_rst_path, 'r+')
|
reg_file = open(mod_rst_path, 'r+', buffering=0)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
@ -301,11 +286,67 @@ class SfpUtil(SfpUtilBase):
|
|||||||
reg_file.close()
|
reg_file.close()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def _get_presence_bitmap(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
order = self.update_i2c_order()
|
||||||
on this platform.
|
|
||||||
"""
|
present_path = self.BASE_CPLD2_PATH.format(order)
|
||||||
raise NotImplementedError
|
nodes.append(present_path + "module_present_all")
|
||||||
|
present_path = self.BASE_CPLD3_PATH.format(order)
|
||||||
|
nodes.append(present_path + "module_present_all")
|
||||||
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_presence_bitmap
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
fp_port = self._port_to_i2c_mapping[port][0]
|
||||||
|
mask = (1 << (fp_port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
66
device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/port_config.ini
Normal file → Executable file
66
device/accton/x86_64-accton_as6712_32x-r0/Accton-AS6712-32X/port_config.ini
Normal file → Executable file
@ -1,33 +1,33 @@
|
|||||||
# name lanes alias
|
# name lanes alias index speed
|
||||||
Ethernet0 49,50,51,52 fortyGigE1
|
Ethernet0 49,50,51,52 fortyGigE1 1 40000
|
||||||
Ethernet4 53,54,55,56 fortyGigE2
|
Ethernet4 53,54,55,56 fortyGigE2 2 40000
|
||||||
Ethernet8 57,58,59,60 fortyGigE3
|
Ethernet8 57,58,59,60 fortyGigE3 3 40000
|
||||||
Ethernet12 61,62,63,64 fortyGigE4
|
Ethernet12 61,62,63,64 fortyGigE4 4 40000
|
||||||
Ethernet16 65,66,67,68 fortyGigE5
|
Ethernet16 65,66,67,68 fortyGigE5 5 40000
|
||||||
Ethernet20 69,70,71,72 fortyGigE6
|
Ethernet20 69,70,71,72 fortyGigE6 6 40000
|
||||||
Ethernet24 73,74,75,76 fortyGigE7
|
Ethernet24 73,74,75,76 fortyGigE7 7 40000
|
||||||
Ethernet28 77,78,79,80 fortyGigE8
|
Ethernet28 77,78,79,80 fortyGigE8 8 40000
|
||||||
Ethernet32 33,34,35,36 fortyGigE9
|
Ethernet32 33,34,35,36 fortyGigE9 9 40000
|
||||||
Ethernet36 37,38,39,40 fortyGigE10
|
Ethernet36 37,38,39,40 fortyGigE10 10 40000
|
||||||
Ethernet40 41,42,43,44 fortyGigE11
|
Ethernet40 41,42,43,44 fortyGigE11 11 40000
|
||||||
Ethernet44 45,46,47,48 fortyGigE12
|
Ethernet44 45,46,47,48 fortyGigE12 12 40000
|
||||||
Ethernet48 81,82,83,84 fortyGigE13
|
Ethernet48 81,82,83,84 fortyGigE13 13 40000
|
||||||
Ethernet52 85,86,87,88 fortyGigE14
|
Ethernet52 85,86,87,88 fortyGigE14 14 40000
|
||||||
Ethernet56 89,90,91,92 fortyGigE15
|
Ethernet56 89,90,91,92 fortyGigE15 15 40000
|
||||||
Ethernet60 93,94,95,96 fortyGigE16
|
Ethernet60 93,94,95,96 fortyGigE16 16 40000
|
||||||
Ethernet64 97,98,99,100 fortyGigE17
|
Ethernet64 97,98,99,100 fortyGigE17 17 40000
|
||||||
Ethernet68 101,102,103,104 fortyGigE18
|
Ethernet68 101,102,103,104 fortyGigE18 18 40000
|
||||||
Ethernet72 105,106,107,108 fortyGigE19
|
Ethernet72 105,106,107,108 fortyGigE19 19 40000
|
||||||
Ethernet76 109,110,111,112 fortyGigE20
|
Ethernet76 109,110,111,112 fortyGigE20 20 40000
|
||||||
Ethernet80 17,18,19,20 fortyGigE21
|
Ethernet80 17,18,19,20 fortyGigE21 21 40000
|
||||||
Ethernet84 21,22,23,24 fortyGigE22
|
Ethernet84 21,22,23,24 fortyGigE22 22 40000
|
||||||
Ethernet88 25,26,27,28 fortyGigE23
|
Ethernet88 25,26,27,28 fortyGigE23 23 40000
|
||||||
Ethernet92 29,30,31,32 fortyGigE24
|
Ethernet92 29,30,31,32 fortyGigE24 24 40000
|
||||||
Ethernet96 113,114,115,116 fortyGigE25
|
Ethernet96 113,114,115,116 fortyGigE25 25 40000
|
||||||
Ethernet100 117,118,119,120 fortyGigE26
|
Ethernet100 117,118,119,120 fortyGigE26 26 40000
|
||||||
Ethernet104 121,122,123,124 fortyGigE27
|
Ethernet104 121,122,123,124 fortyGigE27 27 40000
|
||||||
Ethernet108 125,126,127,128 fortyGigE28
|
Ethernet108 125,126,127,128 fortyGigE28 28 40000
|
||||||
Ethernet112 1,2,3,4 fortyGigE29
|
Ethernet112 1,2,3,4 fortyGigE29 29 40000
|
||||||
Ethernet116 5,6,7,8 fortyGigE30
|
Ethernet116 5,6,7,8 fortyGigE30 30 40000
|
||||||
Ethernet120 9,10,11,12 fortyGigE31
|
Ethernet120 9,10,11,12 fortyGigE31 31 40000
|
||||||
Ethernet124 13,14,15,16 fortyGigE32
|
Ethernet124 13,14,15,16 fortyGigE32 32 40000
|
||||||
|
@ -12,14 +12,18 @@ try:
|
|||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 31
|
PORT_END = 32
|
||||||
PORTS_IN_BLOCK = 32
|
PORTS_IN_BLOCK = 32
|
||||||
QSFP_PORT_START = 0
|
QSFP_PORT_START = 1
|
||||||
QSFP_PORT_END = 32
|
QSFP_PORT_END = 32
|
||||||
|
|
||||||
I2C_DEV_PATH = "/sys/bus/i2c/devices/"
|
I2C_DEV_PATH = "/sys/bus/i2c/devices/"
|
||||||
@ -32,78 +36,38 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: [1, 2],
|
1: [1, 2],
|
||||||
1: [2, 3],
|
2: [2, 3],
|
||||||
2: [3, 4],
|
3: [3, 4],
|
||||||
3: [4, 5],
|
4: [4, 5],
|
||||||
4: [5, 6],
|
5: [5, 6],
|
||||||
5: [6, 7],
|
6: [6, 7],
|
||||||
6: [7, 8],
|
7: [7, 8],
|
||||||
7: [8, 9],
|
8: [8, 9],
|
||||||
8: [9, 10],
|
9: [9, 10],
|
||||||
9: [10, 11],
|
10: [10, 11],
|
||||||
10: [11, 12],
|
11: [11, 12],
|
||||||
11: [12, 13],
|
12: [12, 13],
|
||||||
12: [13, 14],
|
13: [13, 14],
|
||||||
13: [14, 15],
|
14: [14, 15],
|
||||||
14: [15, 16],
|
15: [15, 16],
|
||||||
15: [16, 17],
|
16: [16, 17],
|
||||||
16: [17, 18],
|
17: [17, 18],
|
||||||
17: [18, 19],
|
18: [18, 19],
|
||||||
18: [19, 20],
|
19: [19, 20],
|
||||||
19: [20, 21],
|
20: [20, 21],
|
||||||
20: [21, 22],
|
21: [21, 22],
|
||||||
21: [22, 23],
|
22: [22, 23],
|
||||||
22: [23, 24],
|
23: [23, 24],
|
||||||
23: [24, 25],
|
24: [24, 25],
|
||||||
24: [25, 26],
|
25: [25, 26],
|
||||||
25: [26, 27],
|
26: [26, 27],
|
||||||
26: [27, 28],
|
27: [27, 28],
|
||||||
27: [28, 29],
|
28: [28, 29],
|
||||||
28: [29, 30],
|
29: [29, 30],
|
||||||
29: [30, 31],
|
30: [30, 31],
|
||||||
30: [31, 32],
|
31: [31, 32],
|
||||||
31: [32, 33],
|
32: [32, 33],
|
||||||
32: [33, 34],
|
|
||||||
33: [34, 35],
|
|
||||||
34: [35, 36],
|
|
||||||
35: [36, 37],
|
|
||||||
36: [37, 38],
|
|
||||||
37: [38, 39],
|
|
||||||
38: [39, 40],
|
|
||||||
39: [40, 41],
|
|
||||||
40: [41, 42],
|
|
||||||
41: [42, 43],
|
|
||||||
42: [43, 44],
|
|
||||||
43: [44, 45],
|
|
||||||
44: [45, 46],
|
|
||||||
45: [46, 47],
|
|
||||||
46: [47, 48],
|
|
||||||
47: [48, 49],
|
|
||||||
48: [49, 50],#QSFP49
|
|
||||||
49: [49, 50],
|
|
||||||
50: [49, 50],
|
|
||||||
51: [49, 50],
|
|
||||||
52: [50, 52],#QSFP50
|
|
||||||
53: [50, 52],
|
|
||||||
54: [50, 52],
|
|
||||||
55: [50, 52],
|
|
||||||
56: [51, 54],#QSFP51
|
|
||||||
57: [51, 54],
|
|
||||||
58: [51, 54],
|
|
||||||
59: [51, 54],
|
|
||||||
60: [52, 51],#QSFP52
|
|
||||||
61: [52, 51],
|
|
||||||
62: [52, 51],
|
|
||||||
63: [52, 51],
|
|
||||||
64: [53, 53], #QSFP53
|
|
||||||
65: [53, 53],
|
|
||||||
66: [53, 53],
|
|
||||||
67: [53, 53],
|
|
||||||
68: [54, 55],#QSFP54
|
|
||||||
69: [54, 55],
|
|
||||||
70: [54, 55],
|
|
||||||
71: [54, 55],
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -133,15 +97,14 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
||||||
|
|
||||||
for x in range(0, self.port_end+1):
|
for x in range(self.port_start, self.port_end+1):
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x][1]
|
self._port_to_i2c_mapping[x][1]
|
||||||
)
|
)
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
def get_cpld_dev_path(self, port_num):
|
def get_cpld_dev_path(self, port_num):
|
||||||
if port_num < 16:
|
if port_num <= 16:
|
||||||
cpld_num = 0
|
cpld_num = 0
|
||||||
else:
|
else:
|
||||||
cpld_num = 1
|
cpld_num = 1
|
||||||
@ -157,6 +120,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
cpld_path = self.get_cpld_dev_path(port_num)
|
cpld_path = self.get_cpld_dev_path(port_num)
|
||||||
present_path = cpld_path + "/module_present_"
|
present_path = cpld_path + "/module_present_"
|
||||||
present_path += str(self._port_to_i2c_mapping[port_num][0])
|
present_path += str(self._port_to_i2c_mapping[port_num][0])
|
||||||
@ -281,11 +245,67 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def get_transceiver_status(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
|
||||||
on this platform.
|
cpld_path = self.get_cpld_dev_path(self.port_start)
|
||||||
"""
|
nodes.append(cpld_path + "/module_present_all")
|
||||||
raise NotImplementedError
|
cpld_path = self.get_cpld_dev_path(self.port_end)
|
||||||
|
nodes.append(cpld_path + "/module_present_all")
|
||||||
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self.get_transceiver_status
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
fp_port = self._port_to_i2c_mapping[port][0]
|
||||||
|
mask = (1 << (fp_port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,55 +1,55 @@
|
|||||||
# name lanes alias index
|
# name lanes alias index speed
|
||||||
Ethernet0 41 twentyfiveGigE1 0
|
Ethernet0 41 twentyfiveGigE1 1 25000
|
||||||
Ethernet1 42 twentyfiveGigE2 1
|
Ethernet1 42 twentyfiveGigE2 2 25000
|
||||||
Ethernet2 43 twentyfiveGigE3 2
|
Ethernet2 43 twentyfiveGigE3 3 25000
|
||||||
Ethernet3 44 twentyfiveGigE4 3
|
Ethernet3 44 twentyfiveGigE4 4 25000
|
||||||
Ethernet4 49 twentyfiveGigE5 4
|
Ethernet4 49 twentyfiveGigE5 5 25000
|
||||||
Ethernet5 50 twentyfiveGigE6 5
|
Ethernet5 50 twentyfiveGigE6 6 25000
|
||||||
Ethernet6 51 twentyfiveGigE7 6
|
Ethernet6 51 twentyfiveGigE7 7 25000
|
||||||
Ethernet7 52 twentyfiveGigE8 7
|
Ethernet7 52 twentyfiveGigE8 8 25000
|
||||||
Ethernet8 53 twentyfiveGigE9 8
|
Ethernet8 53 twentyfiveGigE9 9 25000
|
||||||
Ethernet9 54 twentyfiveGigE10 9
|
Ethernet9 54 twentyfiveGigE10 10 25000
|
||||||
Ethernet10 55 twentyfiveGigE11 10
|
Ethernet10 55 twentyfiveGigE11 11 25000
|
||||||
Ethernet11 56 twentyfiveGigE12 11
|
Ethernet11 56 twentyfiveGigE12 12 25000
|
||||||
Ethernet12 65 twentyfiveGigE13 12
|
Ethernet12 65 twentyfiveGigE13 13 25000
|
||||||
Ethernet13 66 twentyfiveGigE14 13
|
Ethernet13 66 twentyfiveGigE14 14 25000
|
||||||
Ethernet14 67 twentyfiveGigE15 14
|
Ethernet14 67 twentyfiveGigE15 15 25000
|
||||||
Ethernet15 68 twentyfiveGigE16 15
|
Ethernet15 68 twentyfiveGigE16 16 25000
|
||||||
Ethernet16 33 twentyfiveGigE17 16
|
Ethernet16 33 twentyfiveGigE17 17 25000
|
||||||
Ethernet17 34 twentyfiveGigE18 17
|
Ethernet17 34 twentyfiveGigE18 18 25000
|
||||||
Ethernet18 35 twentyfiveGigE19 18
|
Ethernet18 35 twentyfiveGigE19 19 25000
|
||||||
Ethernet19 36 twentyfiveGigE20 19
|
Ethernet19 36 twentyfiveGigE20 20 25000
|
||||||
Ethernet20 37 twentyfiveGigE21 20
|
Ethernet20 37 twentyfiveGigE21 21 25000
|
||||||
Ethernet21 38 twentyfiveGigE22 21
|
Ethernet21 38 twentyfiveGigE22 22 25000
|
||||||
Ethernet22 39 twentyfiveGigE23 22
|
Ethernet22 39 twentyfiveGigE23 23 25000
|
||||||
Ethernet23 40 twentyfiveGigE24 23
|
Ethernet23 40 twentyfiveGigE24 24 25000
|
||||||
Ethernet24 69 twentyfiveGigE25 24
|
Ethernet24 69 twentyfiveGigE25 25 25000
|
||||||
Ethernet25 70 twentyfiveGigE26 25
|
Ethernet25 70 twentyfiveGigE26 26 25000
|
||||||
Ethernet26 71 twentyfiveGigE27 26
|
Ethernet26 71 twentyfiveGigE27 27 25000
|
||||||
Ethernet27 72 twentyfiveGigE28 27
|
Ethernet27 72 twentyfiveGigE28 28 25000
|
||||||
Ethernet28 81 twentyfiveGigE29 28
|
Ethernet28 81 twentyfiveGigE29 29 25000
|
||||||
Ethernet29 82 twentyfiveGigE30 29
|
Ethernet29 82 twentyfiveGigE30 30 25000
|
||||||
Ethernet30 83 twentyfiveGigE31 30
|
Ethernet30 83 twentyfiveGigE31 31 25000
|
||||||
Ethernet31 84 twentyfiveGigE32 31
|
Ethernet31 84 twentyfiveGigE32 32 25000
|
||||||
Ethernet32 85 twentyfiveGigE33 32
|
Ethernet32 85 twentyfiveGigE33 33 25000
|
||||||
Ethernet33 86 twentyfiveGigE34 33
|
Ethernet33 86 twentyfiveGigE34 34 25000
|
||||||
Ethernet34 87 twentyfiveGigE35 34
|
Ethernet34 87 twentyfiveGigE35 35 25000
|
||||||
Ethernet35 88 twentyfiveGigE36 35
|
Ethernet35 88 twentyfiveGigE36 36 25000
|
||||||
Ethernet36 97 twentyfiveGigE37 36
|
Ethernet36 97 twentyfiveGigE37 37 25000
|
||||||
Ethernet37 98 twentyfiveGigE38 37
|
Ethernet37 98 twentyfiveGigE38 38 25000
|
||||||
Ethernet38 99 twentyfiveGigE39 38
|
Ethernet38 99 twentyfiveGigE39 39 25000
|
||||||
Ethernet39 100 twentyfiveGigE40 39
|
Ethernet39 100 twentyfiveGigE40 40 25000
|
||||||
Ethernet40 101 twentyfiveGigE41 40
|
Ethernet40 101 twentyfiveGigE41 41 25000
|
||||||
Ethernet41 102 twentyfiveGigE42 41
|
Ethernet41 102 twentyfiveGigE42 42 25000
|
||||||
Ethernet42 103 twentyfiveGigE43 42
|
Ethernet42 103 twentyfiveGigE43 43 25000
|
||||||
Ethernet43 104 twentyfiveGigE44 43
|
Ethernet43 104 twentyfiveGigE44 44 25000
|
||||||
Ethernet44 105 twentyfiveGigE45 44
|
Ethernet44 105 twentyfiveGigE45 45 25000
|
||||||
Ethernet45 106 twentyfiveGigE46 45
|
Ethernet45 106 twentyfiveGigE46 46 25000
|
||||||
Ethernet46 107 twentyfiveGigE47 46
|
Ethernet46 107 twentyfiveGigE47 47 25000
|
||||||
Ethernet47 108 twentyfiveGigE48 47
|
Ethernet47 108 twentyfiveGigE48 48 25000
|
||||||
Ethernet48 5,6,7,8 hundredGigE49 48
|
Ethernet48 5,6,7,8 hundredGigE49 49 100000
|
||||||
Ethernet52 1,2,3,4 hundredGigE50 52
|
Ethernet52 1,2,3,4 hundredGigE50 50 100000
|
||||||
Ethernet56 109,110,111,112 hundredGigE51 56
|
Ethernet56 109,110,111,112 hundredGigE51 51 100000
|
||||||
Ethernet60 21,22,23,24 hundredGigE52 60
|
Ethernet60 21,22,23,24 hundredGigE52 52 100000
|
||||||
Ethernet64 9,10,11,12 hundredGigE53 64
|
Ethernet64 9,10,11,12 hundredGigE53 53 100000
|
||||||
Ethernet68 117,118,119,120 hundredGigE54 68
|
Ethernet68 117,118,119,120 hundredGigE54 54 100000
|
||||||
|
@ -15,11 +15,11 @@ except ImportError as e:
|
|||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 71
|
PORT_END = 54
|
||||||
PORTS_IN_BLOCK = 72
|
PORTS_IN_BLOCK = 54
|
||||||
QSFP_PORT_START = 48
|
QSFP_PORT_START = 49
|
||||||
QSFP_PORT_END = 72
|
QSFP_PORT_END = 54
|
||||||
|
|
||||||
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
||||||
|
|
||||||
@ -33,78 +33,60 @@ class SfpUtil(SfpUtilBase):
|
|||||||
2: "6-0064",
|
2: "6-0064",
|
||||||
}
|
}
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: 18,
|
1: 18,
|
||||||
1: 19,
|
2: 19,
|
||||||
2: 20,
|
3: 20,
|
||||||
3: 21,
|
4: 21,
|
||||||
4: 22,
|
5: 22,
|
||||||
5: 23,
|
6: 23,
|
||||||
6: 24,
|
7: 24,
|
||||||
7: 25,
|
8: 25,
|
||||||
8: 26,
|
9: 26,
|
||||||
9: 27,
|
10: 27,
|
||||||
10: 28,
|
11: 28,
|
||||||
11: 29,
|
12: 29,
|
||||||
12: 30,
|
13: 30,
|
||||||
13: 31,
|
14: 31,
|
||||||
14: 32,
|
15: 32,
|
||||||
15: 33,
|
16: 33,
|
||||||
16: 34,
|
17: 34,
|
||||||
17: 35,
|
18: 35,
|
||||||
18: 36,
|
19: 36,
|
||||||
19: 37,
|
20: 37,
|
||||||
20: 38,
|
21: 38,
|
||||||
21: 39,
|
22: 39,
|
||||||
22: 40,
|
23: 40,
|
||||||
23: 41,
|
24: 41,
|
||||||
24: 42,
|
25: 42,
|
||||||
25: 43,
|
26: 43,
|
||||||
26: 44,
|
27: 44,
|
||||||
27: 45,
|
28: 45,
|
||||||
28: 46,
|
29: 46,
|
||||||
29: 47,
|
30: 47,
|
||||||
30: 48,
|
31: 48,
|
||||||
31: 49,
|
32: 49,
|
||||||
32: 50,
|
33: 50,
|
||||||
33: 51,
|
34: 51,
|
||||||
34: 52,
|
35: 52,
|
||||||
35: 53,
|
36: 53,
|
||||||
36: 54,
|
37: 54,
|
||||||
37: 55,
|
38: 55,
|
||||||
38: 56,
|
39: 56,
|
||||||
39: 57,
|
40: 57,
|
||||||
40: 58,
|
41: 58,
|
||||||
41: 59,
|
42: 59,
|
||||||
42: 60,
|
43: 60,
|
||||||
43: 61,
|
44: 61,
|
||||||
44: 62,
|
45: 62,
|
||||||
45: 63,
|
46: 63,
|
||||||
46: 64,
|
47: 64,
|
||||||
47: 65,
|
48: 65,
|
||||||
48: 66, #QSFP49
|
49: 66, #QSFP49
|
||||||
49: 66,
|
50: 67,
|
||||||
50: 66,
|
51: 68,
|
||||||
51: 66,
|
52: 69,
|
||||||
52: 67, #QSFP50
|
53: 70,
|
||||||
53: 67,
|
54: 71, #QSFP54
|
||||||
54: 67,
|
|
||||||
55: 67,
|
|
||||||
56: 68, #QSFP51
|
|
||||||
57: 68,
|
|
||||||
58: 68,
|
|
||||||
59: 68,
|
|
||||||
60: 69, #QSFP52
|
|
||||||
61: 69,
|
|
||||||
62: 69,
|
|
||||||
63: 69,
|
|
||||||
64: 70, #QSFP53
|
|
||||||
65: 70,
|
|
||||||
66: 70,
|
|
||||||
67: 70,
|
|
||||||
68: 71, #QSFP54
|
|
||||||
69: 71,
|
|
||||||
70: 71,
|
|
||||||
71: 71,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -133,30 +115,18 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
||||||
for x in range(0, self.port_end+1):
|
for x in range(self.port_start, self.port_end+1):
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x])
|
self._port_to_i2c_mapping[x])
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
|
|
||||||
# For port 48~51 are QSFP, here presumed they're all split to 4 lanes.
|
|
||||||
def get_cage_num(self, port_num):
|
|
||||||
cage_num = port_num
|
|
||||||
if (port_num >= self.QSFP_PORT_START):
|
|
||||||
cage_num = (port_num - self.QSFP_PORT_START)/4
|
|
||||||
cage_num = cage_num + self.QSFP_PORT_START
|
|
||||||
|
|
||||||
return cage_num
|
|
||||||
|
|
||||||
# For cage 0~23 and 48~51 are at cpld2, others are at cpld3.
|
|
||||||
def get_cpld_num(self, port_num):
|
def get_cpld_num(self, port_num):
|
||||||
cpld_i = 1
|
cpld_i = 1
|
||||||
cage_num = self.get_cage_num(port_num)
|
if (port_num > 24 and port_num < self.qsfp_port_start):
|
||||||
if (port_num > 23 and port_num < self.QSFP_PORT_START):
|
|
||||||
cpld_i = 2
|
cpld_i = 2
|
||||||
|
|
||||||
if (cage_num >= 52):
|
if (port_num > 52):
|
||||||
cpld_i = 2
|
cpld_i = 2
|
||||||
|
|
||||||
return cpld_i
|
return cpld_i
|
||||||
@ -166,12 +136,11 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
cage_num = self.get_cage_num(port_num)
|
|
||||||
cpld_i = self.get_cpld_num(port_num)
|
cpld_i = self.get_cpld_num(port_num)
|
||||||
|
|
||||||
cpld_ps = self._cpld_mapping[cpld_i]
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
path = "/sys/bus/i2c/devices/{0}/module_present_{1}"
|
path = "/sys/bus/i2c/devices/{0}/module_present_{1}"
|
||||||
port_ps = path.format(cpld_ps, cage_num+1)
|
port_ps = path.format(cpld_ps, port_num)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
val_file = open(port_ps)
|
val_file = open(port_ps)
|
||||||
@ -250,11 +219,10 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
|
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
cage_num = self.get_cage_num(port_num)
|
|
||||||
cpld_i = self.get_cpld_num(port_num)
|
cpld_i = self.get_cpld_num(port_num)
|
||||||
cpld_ps = self._cpld_mapping[cpld_i]
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
path = "/sys/bus/i2c/devices/{0}/module_reset_{1}"
|
path = "/sys/bus/i2c/devices/{0}/module_reset_{1}"
|
||||||
port_ps = path.format(cpld_ps, cage_num+1)
|
port_ps = path.format(cpld_ps, port_num)
|
||||||
try:
|
try:
|
||||||
reg_file = open(port_ps, 'w')
|
reg_file = open(port_ps, 'w')
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
|
@ -1,57 +1,57 @@
|
|||||||
# name lanes alias index
|
# name lanes alias index speed
|
||||||
Ethernet0 3 twentyfiveGigE1 0
|
Ethernet0 3 twentyfiveGigE1 1 25000
|
||||||
Ethernet1 2 twentyfiveGigE2 1
|
Ethernet1 2 twentyfiveGigE2 2 25000
|
||||||
Ethernet2 4 twentyfiveGigE3 2
|
Ethernet2 4 twentyfiveGigE3 3 25000
|
||||||
Ethernet3 8 twentyfiveGigE4 3
|
Ethernet3 8 twentyfiveGigE4 4 25000
|
||||||
Ethernet4 7 twentyfiveGigE5 4
|
Ethernet4 7 twentyfiveGigE5 5 25000
|
||||||
Ethernet5 1 twentyfiveGigE6 5
|
Ethernet5 1 twentyfiveGigE6 6 25000
|
||||||
Ethernet6 5 twentyfiveGigE7 6
|
Ethernet6 5 twentyfiveGigE7 7 25000
|
||||||
Ethernet7 16 twentyfiveGigE8 7
|
Ethernet7 16 twentyfiveGigE8 8 25000
|
||||||
Ethernet8 6 twentyfiveGigE9 8
|
Ethernet8 6 twentyfiveGigE9 9 25000
|
||||||
Ethernet9 14 twentyfiveGigE10 9
|
Ethernet9 14 twentyfiveGigE10 10 25000
|
||||||
Ethernet10 13 twentyfiveGigE11 10
|
Ethernet10 13 twentyfiveGigE11 11 25000
|
||||||
Ethernet11 15 twentyfiveGigE12 11
|
Ethernet11 15 twentyfiveGigE12 12 25000
|
||||||
Ethernet12 23 twentyfiveGigE13 12
|
Ethernet12 23 twentyfiveGigE13 13 25000
|
||||||
Ethernet13 22 twentyfiveGigE14 13
|
Ethernet13 22 twentyfiveGigE14 14 25000
|
||||||
Ethernet14 24 twentyfiveGigE15 14
|
Ethernet14 24 twentyfiveGigE15 15 25000
|
||||||
Ethernet15 32 twentyfiveGigE16 15
|
Ethernet15 32 twentyfiveGigE16 16 25000
|
||||||
Ethernet16 31 twentyfiveGigE17 16
|
Ethernet16 31 twentyfiveGigE17 17 25000
|
||||||
Ethernet17 21 twentyfiveGigE18 17
|
Ethernet17 21 twentyfiveGigE18 18 25000
|
||||||
Ethernet18 29 twentyfiveGigE19 18
|
Ethernet18 29 twentyfiveGigE19 19 25000
|
||||||
Ethernet19 36 twentyfiveGigE20 19
|
Ethernet19 36 twentyfiveGigE20 20 25000
|
||||||
Ethernet20 30 twentyfiveGigE21 20
|
Ethernet20 30 twentyfiveGigE21 21 25000
|
||||||
Ethernet21 34 twentyfiveGigE22 21
|
Ethernet21 34 twentyfiveGigE22 22 25000
|
||||||
Ethernet22 33 twentyfiveGigE23 22
|
Ethernet22 33 twentyfiveGigE23 23 25000
|
||||||
Ethernet23 35 twentyfiveGigE24 23
|
Ethernet23 35 twentyfiveGigE24 24 25000
|
||||||
Ethernet24 43 twentyfiveGigE25 24
|
Ethernet24 43 twentyfiveGigE25 25 25000
|
||||||
Ethernet25 42 twentyfiveGigE26 25
|
Ethernet25 42 twentyfiveGigE26 26 25000
|
||||||
Ethernet26 44 twentyfiveGigE27 26
|
Ethernet26 44 twentyfiveGigE27 27 25000
|
||||||
Ethernet27 52 twentyfiveGigE28 27
|
Ethernet27 52 twentyfiveGigE28 28 25000
|
||||||
Ethernet28 51 twentyfiveGigE29 28
|
Ethernet28 51 twentyfiveGigE29 29 25000
|
||||||
Ethernet29 41 twentyfiveGigE30 29
|
Ethernet29 41 twentyfiveGigE30 30 25000
|
||||||
Ethernet30 49 twentyfiveGigE31 30
|
Ethernet30 49 twentyfiveGigE31 31 25000
|
||||||
Ethernet31 60 twentyfiveGigE32 31
|
Ethernet31 60 twentyfiveGigE32 32 25000
|
||||||
Ethernet32 50 twentyfiveGigE33 32
|
Ethernet32 50 twentyfiveGigE33 33 25000
|
||||||
Ethernet33 58 twentyfiveGigE34 33
|
Ethernet33 58 twentyfiveGigE34 34 25000
|
||||||
Ethernet34 57 twentyfiveGigE35 34
|
Ethernet34 57 twentyfiveGigE35 35 25000
|
||||||
Ethernet35 59 twentyfiveGigE36 35
|
Ethernet35 59 twentyfiveGigE36 36 25000
|
||||||
Ethernet36 62 twentyfiveGigE37 36
|
Ethernet36 62 twentyfiveGigE37 37 25000
|
||||||
Ethernet37 63 twentyfiveGigE38 37
|
Ethernet37 63 twentyfiveGigE38 38 25000
|
||||||
Ethernet38 64 twentyfiveGigE39 38
|
Ethernet38 64 twentyfiveGigE39 39 25000
|
||||||
Ethernet39 65 twentyfiveGigE40 39
|
Ethernet39 65 twentyfiveGigE40 40 25000
|
||||||
Ethernet40 66 twentyfiveGigE41 40
|
Ethernet40 66 twentyfiveGigE41 41 25000
|
||||||
Ethernet41 61 twentyfiveGigE42 41
|
Ethernet41 61 twentyfiveGigE42 42 25000
|
||||||
Ethernet42 68 twentyfiveGigE43 42
|
Ethernet42 68 twentyfiveGigE43 43 25000
|
||||||
Ethernet43 69 twentyfiveGigE44 43
|
Ethernet43 69 twentyfiveGigE44 44 25000
|
||||||
Ethernet44 67 twentyfiveGigE45 44
|
Ethernet44 67 twentyfiveGigE45 45 25000
|
||||||
Ethernet45 71 twentyfiveGigE46 45
|
Ethernet45 71 twentyfiveGigE46 46 25000
|
||||||
Ethernet46 72 twentyfiveGigE47 46
|
Ethernet46 72 twentyfiveGigE47 47 25000
|
||||||
Ethernet47 70 twentyfiveGigE48 47
|
Ethernet47 70 twentyfiveGigE48 48 25000
|
||||||
Ethernet48 77,78,79,80 hundredGigE49 48
|
Ethernet48 77,78,79,80 hundredGigE49 49 100000
|
||||||
Ethernet52 85,86,87,88 hundredGigE50 52
|
Ethernet52 85,86,87,88 hundredGigE50 50 100000
|
||||||
Ethernet56 93,94,95,96 hundredGigE51 56
|
Ethernet56 93,94,95,96 hundredGigE51 51 100000
|
||||||
Ethernet60 97,98,99,100 hundredGigE52 60
|
Ethernet60 97,98,99,100 hundredGigE52 52 100000
|
||||||
Ethernet64 105,106,107,108 hundredGigE53 64
|
Ethernet64 105,106,107,108 hundredGigE53 53 100000
|
||||||
Ethernet68 113,114,115,116 hundredGigE54 68
|
Ethernet68 113,114,115,116 hundredGigE54 54 100000
|
||||||
Ethernet72 121,122,123,124 hundredGigE55 72
|
Ethernet72 121,122,123,124 hundredGigE55 55 100000
|
||||||
Ethernet76 125,126,127,128 hundredGigE56 76
|
Ethernet76 125,126,127,128 hundredGigE56 56 100000
|
||||||
|
@ -11,15 +11,18 @@ try:
|
|||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 81
|
PORT_END = 56
|
||||||
PORTS_IN_BLOCK = 82
|
PORTS_IN_BLOCK = 56
|
||||||
QSFP_PORT_START = 48
|
QSFP_PORT_START = 49
|
||||||
QSFP_PORT_END = 82
|
QSFP_PORT_END = 56
|
||||||
|
|
||||||
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/"
|
||||||
|
|
||||||
@ -34,88 +37,63 @@ class SfpUtil(SfpUtilBase):
|
|||||||
}
|
}
|
||||||
|
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: 42,
|
1: 42,
|
||||||
1: 41,
|
2: 41,
|
||||||
2: 44,
|
3: 44,
|
||||||
3: 43,
|
4: 43,
|
||||||
4: 47,
|
5: 47,
|
||||||
5: 45,
|
6: 45,
|
||||||
6: 46,
|
7: 46,
|
||||||
7: 50,
|
8: 50,
|
||||||
8: 48,
|
9: 48,
|
||||||
9: 49,
|
10: 49,
|
||||||
10: 51,
|
11: 51,
|
||||||
11: 52,
|
12: 52,
|
||||||
12: 53,
|
13: 53,
|
||||||
13: 56,
|
14: 56,
|
||||||
14: 55,
|
15: 55,
|
||||||
15: 54,
|
16: 54,
|
||||||
16: 58,
|
17: 58,
|
||||||
17: 57,
|
18: 57,
|
||||||
18: 59,
|
19: 59,
|
||||||
19: 60,
|
20: 60,
|
||||||
20: 61,
|
21: 61,
|
||||||
21: 63,
|
22: 63,
|
||||||
22: 62,
|
23: 62,
|
||||||
23: 64,
|
24: 64,
|
||||||
24: 66,
|
25: 66,
|
||||||
25: 68,
|
26: 68,
|
||||||
26: 65,
|
27: 65,
|
||||||
27: 67,
|
28: 67,
|
||||||
28: 69,
|
29: 69,
|
||||||
29: 71,
|
30: 71,
|
||||||
30: 72,
|
31: 72,
|
||||||
31: 70,
|
32: 70,
|
||||||
32: 74,
|
33: 74,
|
||||||
33: 73,
|
34: 73,
|
||||||
34: 76,
|
35: 76,
|
||||||
35: 75,
|
36: 75,
|
||||||
36: 77,
|
37: 77,
|
||||||
37: 79,
|
38: 79,
|
||||||
38: 78,
|
39: 78,
|
||||||
39: 80,
|
40: 80,
|
||||||
40: 81,
|
41: 81,
|
||||||
41: 82,
|
42: 82,
|
||||||
42: 84,
|
43: 84,
|
||||||
43: 85,
|
44: 85,
|
||||||
44: 83,
|
45: 83,
|
||||||
45: 87,
|
46: 87,
|
||||||
46: 88,
|
47: 88,
|
||||||
47: 86,
|
48: 86,
|
||||||
48: 25, #QSFP49
|
49: 25,#QSFP49
|
||||||
49: 25,
|
50: 26,
|
||||||
50: 25,
|
51: 27,
|
||||||
51: 25,
|
52: 28,
|
||||||
52: 26, #QSFP50
|
53: 29,
|
||||||
53: 26,
|
54: 30,
|
||||||
54: 26,
|
55: 31,
|
||||||
55: 26,
|
56: 32,#QSFP56
|
||||||
56: 27, #QSFP51
|
}
|
||||||
57: 26,
|
|
||||||
58: 26,
|
|
||||||
59: 26,
|
|
||||||
60: 28, #QSFP52
|
|
||||||
61: 26,
|
|
||||||
62: 26,
|
|
||||||
63: 26,
|
|
||||||
64: 29, #QSFP53
|
|
||||||
65: 26,
|
|
||||||
66: 26,
|
|
||||||
67: 26,
|
|
||||||
68: 30, #QSFP54
|
|
||||||
69: 26,
|
|
||||||
70: 26,
|
|
||||||
71: 26,
|
|
||||||
72: 31, #QSFP55
|
|
||||||
73: 26,
|
|
||||||
74: 26,
|
|
||||||
75: 26,
|
|
||||||
76: 32, #QSFP56
|
|
||||||
77: 26,
|
|
||||||
78: 26,
|
|
||||||
79: 26,
|
|
||||||
80: 22,
|
|
||||||
81: 23}
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_start(self):
|
def port_start(self):
|
||||||
@ -143,27 +121,16 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
||||||
for x in range(0, self.port_end+1):
|
for x in range(self.port_start, self.port_end+1):
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x])
|
self._port_to_i2c_mapping[x])
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
|
# For port 0~23 and 48~51 are at cpld2, others are at cpld3.
|
||||||
# For port 48~51 are QSFP, here presumed they're all split to 4 lanes.
|
|
||||||
def get_cage_num(self, port_num):
|
|
||||||
cage_num = port_num
|
|
||||||
if (port_num >= self.QSFP_PORT_START):
|
|
||||||
cage_num = (port_num - self.QSFP_PORT_START)/4
|
|
||||||
cage_num = cage_num + self.QSFP_PORT_START
|
|
||||||
|
|
||||||
return cage_num
|
|
||||||
|
|
||||||
# For cage 0~23 and 48~51 are at cpld2, others are at cpld3.
|
|
||||||
def get_cpld_num(self, port_num):
|
def get_cpld_num(self, port_num):
|
||||||
cpld_i = 1
|
cpld_i = 1
|
||||||
cage_num = self.get_cage_num(port_num)
|
if (port_num > 30):
|
||||||
if (port_num > 29):
|
|
||||||
cpld_i = 2
|
cpld_i = 2
|
||||||
return cpld_i
|
return cpld_i
|
||||||
|
|
||||||
@ -172,13 +139,11 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
cage_num = self.get_cage_num(port_num)
|
|
||||||
cpld_i = self.get_cpld_num(port_num)
|
cpld_i = self.get_cpld_num(port_num)
|
||||||
#print "[ROY] cpld:%d" % cpld_i
|
|
||||||
|
|
||||||
cpld_ps = self._cpld_mapping[cpld_i]
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
path = "/sys/bus/i2c/devices/{0}/module_present_{1}"
|
path = "/sys/bus/i2c/devices/{0}/module_present_{1}"
|
||||||
port_ps = path.format(cpld_ps, cage_num+1)
|
port_ps = path.format(cpld_ps, port_num)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
val_file = open(port_ps)
|
val_file = open(port_ps)
|
||||||
@ -256,10 +221,66 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def reset(self, port_num):
|
def reset(self, port_num):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def _get_present_bitmap(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
rev = []
|
||||||
on this platform.
|
port_num = [30,26]
|
||||||
"""
|
|
||||||
raise NotImplementedError
|
path = "/sys/bus/i2c/devices/{0}/module_present_all"
|
||||||
|
cpld_i = self.get_cpld_num(self.port_start)
|
||||||
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
|
nodes.append((path.format(cpld_ps), port_num[0]))
|
||||||
|
cpld_i = self.get_cpld_num(self.port_end)
|
||||||
|
cpld_ps = self._cpld_mapping[cpld_i]
|
||||||
|
nodes.append((path.format(cpld_ps), port_num[1]))
|
||||||
|
|
||||||
|
bitmaps = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node[0])
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap = reg_file.readline().rstrip()
|
||||||
|
bitmap = bin(int(bitmap, 16))[2:].zfill(node[1])
|
||||||
|
rev.append(bitmap)
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
bitmaps = "".join(rev[::-1])
|
||||||
|
bitmaps = hex(int(bitmaps, 2))
|
||||||
|
return int(bitmaps, 0)
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_present_bitmap
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
mask = (1 << (port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
# name lanes alias
|
# name lanes alias index speed
|
||||||
Ethernet0 49,50,51,52 hundredGigE1
|
Ethernet0 49,50,51,52 hundredGigE1 1 100000
|
||||||
Ethernet4 53,54,55,56 hundredGigE2
|
Ethernet4 53,54,55,56 hundredGigE2 2 100000
|
||||||
Ethernet8 57,58,59,60 hundredGigE3
|
Ethernet8 57,58,59,60 hundredGigE3 3 100000
|
||||||
Ethernet12 61,62,63,64 hundredGigE4
|
Ethernet12 61,62,63,64 hundredGigE4 4 100000
|
||||||
Ethernet16 65,66,67,68 hundredGigE5
|
Ethernet16 65,66,67,68 hundredGigE5 5 100000
|
||||||
Ethernet20 69,70,71,72 hundredGigE6
|
Ethernet20 69,70,71,72 hundredGigE6 6 100000
|
||||||
Ethernet24 73,74,75,76 hundredGigE7
|
Ethernet24 73,74,75,76 hundredGigE7 7 100000
|
||||||
Ethernet28 77,78,79,80 hundredGigE8
|
Ethernet28 77,78,79,80 hundredGigE8 8 100000
|
||||||
Ethernet32 33,34,35,36 hundredGigE9
|
Ethernet32 33,34,35,36 hundredGigE9 9 100000
|
||||||
Ethernet36 37,38,39,40 hundredGigE10
|
Ethernet36 37,38,39,40 hundredGigE10 10 100000
|
||||||
Ethernet40 41,42,43,44 hundredGigE11
|
Ethernet40 41,42,43,44 hundredGigE11 11 100000
|
||||||
Ethernet44 45,46,47,48 hundredGigE12
|
Ethernet44 45,46,47,48 hundredGigE12 12 100000
|
||||||
Ethernet48 81,82,83,84 hundredGigE13
|
Ethernet48 81,82,83,84 hundredGigE13 13 100000
|
||||||
Ethernet52 85,86,87,88 hundredGigE14
|
Ethernet52 85,86,87,88 hundredGigE14 14 100000
|
||||||
Ethernet56 89,90,91,92 hundredGigE15
|
Ethernet56 89,90,91,92 hundredGigE15 15 100000
|
||||||
Ethernet60 93,94,95,96 hundredGigE16
|
Ethernet60 93,94,95,96 hundredGigE16 16 100000
|
||||||
Ethernet64 97,98,99,100 hundredGigE17
|
Ethernet64 97,98,99,100 hundredGigE17 17 100000
|
||||||
Ethernet68 101,102,103,104 hundredGigE18
|
Ethernet68 101,102,103,104 hundredGigE18 18 100000
|
||||||
Ethernet72 105,106,107,108 hundredGigE19
|
Ethernet72 105,106,107,108 hundredGigE19 19 100000
|
||||||
Ethernet76 109,110,111,112 hundredGigE20
|
Ethernet76 109,110,111,112 hundredGigE20 20 100000
|
||||||
Ethernet80 17,18,19,20 hundredGigE21
|
Ethernet80 17,18,19,20 hundredGigE21 21 100000
|
||||||
Ethernet84 21,22,23,24 hundredGigE22
|
Ethernet84 21,22,23,24 hundredGigE22 22 100000
|
||||||
Ethernet88 25,26,27,28 hundredGigE23
|
Ethernet88 25,26,27,28 hundredGigE23 23 100000
|
||||||
Ethernet92 29,30,31,32 hundredGigE24
|
Ethernet92 29,30,31,32 hundredGigE24 24 100000
|
||||||
Ethernet96 113,114,115,116 hundredGigE25
|
Ethernet96 113,114,115,116 hundredGigE25 25 100000
|
||||||
Ethernet100 117,118,119,120 hundredGigE26
|
Ethernet100 117,118,119,120 hundredGigE26 26 100000
|
||||||
Ethernet104 121,122,123,124 hundredGigE27
|
Ethernet104 121,122,123,124 hundredGigE27 27 100000
|
||||||
Ethernet108 125,126,127,128 hundredGigE28
|
Ethernet108 125,126,127,128 hundredGigE28 28 100000
|
||||||
Ethernet112 1,2,3,4 hundredGigE29
|
Ethernet112 1,2,3,4 hundredGigE29 29 100000
|
||||||
Ethernet116 5,6,7,8 hundredGigE30
|
Ethernet116 5,6,7,8 hundredGigE30 30 100000
|
||||||
Ethernet120 9,10,11,12 hundredGigE31
|
Ethernet120 9,10,11,12 hundredGigE31 31 100000
|
||||||
Ethernet124 13,14,15,16 hundredGigE32
|
Ethernet124 13,14,15,16 hundredGigE32 32 100000
|
||||||
|
@ -8,12 +8,16 @@ try:
|
|||||||
except ImportError, e:
|
except ImportError, e:
|
||||||
raise ImportError (str(e) + "- required module not found")
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform specific SfpUtill class"""
|
"""Platform specific SfpUtill class"""
|
||||||
|
|
||||||
_port_start = 0
|
_port_start = 1
|
||||||
_port_end = 31
|
_port_end = 32
|
||||||
ports_in_block = 32
|
ports_in_block = 32
|
||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
@ -56,8 +60,8 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
||||||
for x in range(0, self._port_end + 1):
|
for x in range(self.port_start, self.port_end + 1):
|
||||||
port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1])
|
port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x])
|
||||||
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
@ -67,10 +71,10 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
path = "/sys/bus/i2c/devices/4-0060/module_reset_{0}"
|
path = "/sys/bus/i2c/devices/4-0060/module_reset_{0}"
|
||||||
port_ps = path.format(port_num+1)
|
port_ps = path.format(port_num)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(port_ps, 'w')
|
reg_file = open(port_ps, 'w', buffering=0)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
@ -90,8 +94,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
path = "/sys/bus/i2c/devices/4-0060/module_present_{0}"
|
path = "/sys/bus/i2c/devices/4-0060/module_present_{0}"
|
||||||
port_ps = path.format(port_num+1)
|
port_ps = path.format(port_num)
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(port_ps)
|
reg_file = open(port_ps)
|
||||||
@ -115,20 +118,12 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def qsfp_ports(self):
|
def qsfp_ports(self):
|
||||||
return range(0, self.ports_in_block + 1)
|
return range(self.port_start, self.ports_in_block + 1)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_to_eeprom_mapping(self):
|
def port_to_eeprom_mapping(self):
|
||||||
return self._port_to_eeprom_mapping
|
return self._port_to_eeprom_mapping
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def get_low_power_mode(self, port_num):
|
def get_low_power_mode(self, port_num):
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self._port_start or port_num > self._port_end:
|
if port_num < self._port_start or port_num > self._port_end:
|
||||||
@ -186,3 +181,60 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if eeprom is not None:
|
if eeprom is not None:
|
||||||
eeprom.close()
|
eeprom.close()
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _get_all_presence(self):
|
||||||
|
nodes = []
|
||||||
|
|
||||||
|
cpld_path = "/sys/bus/i2c/devices/4-0060/"
|
||||||
|
nodes.append(cpld_path + "module_present_all")
|
||||||
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_all_presence
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
mask = (1 << (port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
# name lanes alias
|
# name lanes alias index speed
|
||||||
Ethernet0 49,50,51,52 hundredGigE1
|
Ethernet0 49,50,51,52 hundredGigE1 1 100000
|
||||||
Ethernet4 53,54,55,56 hundredGigE2
|
Ethernet4 53,54,55,56 hundredGigE2 2 100000
|
||||||
Ethernet8 57,58,59,60 hundredGigE3
|
Ethernet8 57,58,59,60 hundredGigE3 3 100000
|
||||||
Ethernet12 61,62,63,64 hundredGigE4
|
Ethernet12 61,62,63,64 hundredGigE4 4 100000
|
||||||
Ethernet16 65,66,67,68 hundredGigE5
|
Ethernet16 65,66,67,68 hundredGigE5 5 100000
|
||||||
Ethernet20 69,70,71,72 hundredGigE6
|
Ethernet20 69,70,71,72 hundredGigE6 6 100000
|
||||||
Ethernet24 73,74,75,76 hundredGigE7
|
Ethernet24 73,74,75,76 hundredGigE7 7 100000
|
||||||
Ethernet28 77,78,79,80 hundredGigE8
|
Ethernet28 77,78,79,80 hundredGigE8 8 100000
|
||||||
Ethernet32 33,34,35,36 hundredGigE9
|
Ethernet32 33,34,35,36 hundredGigE9 9 100000
|
||||||
Ethernet36 37,38,39,40 hundredGigE10
|
Ethernet36 37,38,39,40 hundredGigE10 10 100000
|
||||||
Ethernet40 41,42,43,44 hundredGigE11
|
Ethernet40 41,42,43,44 hundredGigE11 11 100000
|
||||||
Ethernet44 45,46,47,48 hundredGigE12
|
Ethernet44 45,46,47,48 hundredGigE12 12 100000
|
||||||
Ethernet48 81,82,83,84 hundredGigE13
|
Ethernet48 81,82,83,84 hundredGigE13 13 100000
|
||||||
Ethernet52 85,86,87,88 hundredGigE14
|
Ethernet52 85,86,87,88 hundredGigE14 14 100000
|
||||||
Ethernet56 89,90,91,92 hundredGigE15
|
Ethernet56 89,90,91,92 hundredGigE15 15 100000
|
||||||
Ethernet60 93,94,95,96 hundredGigE16
|
Ethernet60 93,94,95,96 hundredGigE16 16 100000
|
||||||
Ethernet64 97,98,99,100 hundredGigE17
|
Ethernet64 97,98,99,100 hundredGigE17 17 100000
|
||||||
Ethernet68 101,102,103,104 hundredGigE18
|
Ethernet68 101,102,103,104 hundredGigE18 18 100000
|
||||||
Ethernet72 105,106,107,108 hundredGigE19
|
Ethernet72 105,106,107,108 hundredGigE19 19 100000
|
||||||
Ethernet76 109,110,111,112 hundredGigE20
|
Ethernet76 109,110,111,112 hundredGigE20 20 100000
|
||||||
Ethernet80 17,18,19,20 hundredGigE21
|
Ethernet80 17,18,19,20 hundredGigE21 21 100000
|
||||||
Ethernet84 21,22,23,24 hundredGigE22
|
Ethernet84 21,22,23,24 hundredGigE22 22 100000
|
||||||
Ethernet88 25,26,27,28 hundredGigE23
|
Ethernet88 25,26,27,28 hundredGigE23 23 100000
|
||||||
Ethernet92 29,30,31,32 hundredGigE24
|
Ethernet92 29,30,31,32 hundredGigE24 24 100000
|
||||||
Ethernet96 113,114,115,116 hundredGigE25
|
Ethernet96 113,114,115,116 hundredGigE25 25 100000
|
||||||
Ethernet100 117,118,119,120 hundredGigE26
|
Ethernet100 117,118,119,120 hundredGigE26 26 100000
|
||||||
Ethernet104 121,122,123,124 hundredGigE27
|
Ethernet104 121,122,123,124 hundredGigE27 27 100000
|
||||||
Ethernet108 125,126,127,128 hundredGigE28
|
Ethernet108 125,126,127,128 hundredGigE28 28 100000
|
||||||
Ethernet112 1,2,3,4 hundredGigE29
|
Ethernet112 1,2,3,4 hundredGigE29 29 100000
|
||||||
Ethernet116 5,6,7,8 hundredGigE30
|
Ethernet116 5,6,7,8 hundredGigE30 30 100000
|
||||||
Ethernet120 9,10,11,12 hundredGigE31
|
Ethernet120 9,10,11,12 hundredGigE31 31 100000
|
||||||
Ethernet124 13,14,15,16 hundredGigE32
|
Ethernet124 13,14,15,16 hundredGigE32 32 100000
|
||||||
|
@ -10,13 +10,16 @@ try:
|
|||||||
from sonic_sfp.sfputilbase import SfpUtilBase
|
from sonic_sfp.sfputilbase import SfpUtilBase
|
||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 31
|
PORT_END = 32
|
||||||
PORTS_IN_BLOCK = 32
|
PORTS_IN_BLOCK = 32
|
||||||
|
|
||||||
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
||||||
@ -27,38 +30,38 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: [1, 29],
|
1: 29,
|
||||||
1: [2, 30],
|
2: 30,
|
||||||
2: [3, 31],
|
3: 31,
|
||||||
3: [4, 32],
|
4: 32,
|
||||||
4: [5, 34],
|
5: 34,
|
||||||
5: [6, 33],
|
6: 33,
|
||||||
6: [7, 36],
|
7: 36,
|
||||||
7: [8, 35],
|
8: 35,
|
||||||
8: [9, 25],
|
9: 25,
|
||||||
9: [10, 26],
|
10: 26,
|
||||||
10: [11, 27],
|
11: 27,
|
||||||
11: [12, 28],
|
12: 28,
|
||||||
12: [14, 37],
|
13: 37,
|
||||||
13: [15, 38],
|
14: 38,
|
||||||
14: [16, 39],
|
15: 39,
|
||||||
15: [17, 40],
|
16: 40,
|
||||||
16: [18, 41],
|
17: 41,
|
||||||
17: [19, 42],
|
18: 42,
|
||||||
18: [20, 43],
|
19: 43,
|
||||||
19: [21, 44],
|
20: 44,
|
||||||
20: [22, 53],
|
21: 53,
|
||||||
21: [23, 54],
|
22: 54,
|
||||||
22: [24, 55],
|
23: 55,
|
||||||
23: [25, 56],
|
24: 56,
|
||||||
24: [26, 45],
|
25: 45,
|
||||||
25: [27, 46],
|
26: 46,
|
||||||
26: [28, 47],
|
27: 47,
|
||||||
27: [29, 48],
|
28: 48,
|
||||||
28: [30, 49],
|
29: 49,
|
||||||
29: [31, 50],
|
30: 50,
|
||||||
30: [32, 51],
|
31: 51,
|
||||||
31: [33, 52],
|
32: 52,
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -80,11 +83,10 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
||||||
|
|
||||||
for x in range(0, self.port_end+1):
|
for x in range(self.port_start, self.port_end+1):
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x][1]
|
self._port_to_i2c_mapping[x]
|
||||||
)
|
)
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
def get_presence(self, port_num):
|
def get_presence(self, port_num):
|
||||||
@ -92,7 +94,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
present_path = self.BASE_CPLD_PATH + "module_present_" + str(port_num+1)
|
present_path = self.BASE_CPLD_PATH + "module_present_" + str(port_num)
|
||||||
self.__port_to_is_present = present_path
|
self.__port_to_is_present = present_path
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -172,7 +174,7 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
mod_rst_path = self.BASE_CPLD_PATH + "module_reset_" + str(port_num+1)
|
mod_rst_path = self.BASE_CPLD_PATH + "module_reset_" + str(port_num)
|
||||||
self.__port_to_mod_rst = mod_rst_path
|
self.__port_to_mod_rst = mod_rst_path
|
||||||
try:
|
try:
|
||||||
reg_file = open(self.__port_to_mod_rst, 'r+')
|
reg_file = open(self.__port_to_mod_rst, 'r+')
|
||||||
@ -187,10 +189,57 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def _get_present_bitmap(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
|
||||||
on this platform.
|
nodes.append(self.BASE_CPLD_PATH + "module_present_all")
|
||||||
"""
|
bitmap = ""
|
||||||
raise NotImplementedError
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_present_bitmap
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
mask = (1 << (port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
@ -1,33 +1,33 @@
|
|||||||
# name lanes alias
|
# name lanes alias index speed
|
||||||
Ethernet0 1,2,3,4 hundredGigE1
|
Ethernet0 1,2,3,4 hundredGigE1 1 100000
|
||||||
Ethernet4 5,6,7,8 hundredGigE2
|
Ethernet4 5,6,7,8 hundredGigE2 2 100000
|
||||||
Ethernet8 9,10,11,12 hundredGigE3
|
Ethernet8 9,10,11,12 hundredGigE3 3 100000
|
||||||
Ethernet12 13,14,15,16 hundredGigE4
|
Ethernet12 13,14,15,16 hundredGigE4 4 100000
|
||||||
Ethernet16 17,18,19,20 hundredGigE5
|
Ethernet16 17,18,19,20 hundredGigE5 5 100000
|
||||||
Ethernet20 21,22,23,24 hundredGigE6
|
Ethernet20 21,22,23,24 hundredGigE6 6 100000
|
||||||
Ethernet24 25,26,27,28 hundredGigE7
|
Ethernet24 25,26,27,28 hundredGigE7 7 100000
|
||||||
Ethernet28 29,30,31,32 hundredGigE8
|
Ethernet28 29,30,31,32 hundredGigE8 8 100000
|
||||||
Ethernet32 33,34,35,36 hundredGigE9
|
Ethernet32 33,34,35,36 hundredGigE9 9 100000
|
||||||
Ethernet36 37,38,39,40 hundredGigE10
|
Ethernet36 37,38,39,40 hundredGigE10 10 100000
|
||||||
Ethernet40 41,42,43,44 hundredGigE11
|
Ethernet40 41,42,43,44 hundredGigE11 11 100000
|
||||||
Ethernet44 45,46,47,48 hundredGigE12
|
Ethernet44 45,46,47,48 hundredGigE12 12 100000
|
||||||
Ethernet48 49,50,51,52 hundredGigE13
|
Ethernet48 49,50,51,52 hundredGigE13 13 100000
|
||||||
Ethernet52 53,54,55,56 hundredGigE14
|
Ethernet52 53,54,55,56 hundredGigE14 14 100000
|
||||||
Ethernet56 57,58,59,60 hundredGigE15
|
Ethernet56 57,58,59,60 hundredGigE15 15 100000
|
||||||
Ethernet60 61,62,63,64 hundredGigE16
|
Ethernet60 61,62,63,64 hundredGigE16 16 100000
|
||||||
Ethernet64 65,66,67,68 hundredGigE17
|
Ethernet64 65,66,67,68 hundredGigE17 17 100000
|
||||||
Ethernet68 69,70,71,72 hundredGigE18
|
Ethernet68 69,70,71,72 hundredGigE18 18 100000
|
||||||
Ethernet72 73,74,75,76 hundredGigE19
|
Ethernet72 73,74,75,76 hundredGigE19 19 100000
|
||||||
Ethernet76 77,78,79,80 hundredGigE20
|
Ethernet76 77,78,79,80 hundredGigE20 20 100000
|
||||||
Ethernet80 81,82,83,84 hundredGigE21
|
Ethernet80 81,82,83,84 hundredGigE21 21 100000
|
||||||
Ethernet84 85,86,87,88 hundredGigE22
|
Ethernet84 85,86,87,88 hundredGigE22 22 100000
|
||||||
Ethernet88 89,90,91,92 hundredGigE23
|
Ethernet88 89,90,91,92 hundredGigE23 23 100000
|
||||||
Ethernet92 93,94,95,96 hundredGigE24
|
Ethernet92 93,94,95,96 hundredGigE24 24 100000
|
||||||
Ethernet96 97,98,99,100 hundredGigE25
|
Ethernet96 97,98,99,100 hundredGigE25 25 100000
|
||||||
Ethernet100 101,102,103,104 hundredGigE26
|
Ethernet100 101,102,103,104 hundredGigE26 26 100000
|
||||||
Ethernet104 105,106,107,108 hundredGigE27
|
Ethernet104 105,106,107,108 hundredGigE27 27 100000
|
||||||
Ethernet108 109,110,111,112 hundredGigE28
|
Ethernet108 109,110,111,112 hundredGigE28 28 100000
|
||||||
Ethernet112 113,114,115,116 hundredGigE29
|
Ethernet112 113,114,115,116 hundredGigE29 29 100000
|
||||||
Ethernet116 117,118,119,120 hundredGigE30
|
Ethernet116 117,118,119,120 hundredGigE30 30 100000
|
||||||
Ethernet120 121,122,123,124 hundredGigE31
|
Ethernet120 121,122,123,124 hundredGigE31 31 100000
|
||||||
Ethernet124 125,126,127,128 hundredGigE32
|
Ethernet124 125,126,127,128 hundredGigE32 32 100000
|
||||||
|
@ -11,13 +11,17 @@ try:
|
|||||||
except ImportError as e:
|
except ImportError as e:
|
||||||
raise ImportError("%s - required module not found" % str(e))
|
raise ImportError("%s - required module not found" % str(e))
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform-specific SfpUtil class"""
|
"""Platform-specific SfpUtil class"""
|
||||||
|
|
||||||
PORT_START = 0
|
PORT_START = 1
|
||||||
PORT_END = 33
|
PORT_END = 32 #34 cages actually, but last 2 are not at port_config.ini.
|
||||||
PORTS_IN_BLOCK = 34
|
PORTS_IN_BLOCK = 32
|
||||||
|
|
||||||
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
BASE_OOM_PATH = "/sys/bus/i2c/devices/{0}-0050/"
|
||||||
BASE_CPLD_PATH = "/sys/bus/i2c/devices/11-0060/"
|
BASE_CPLD_PATH = "/sys/bus/i2c/devices/11-0060/"
|
||||||
@ -27,40 +31,40 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
_port_to_i2c_mapping = {
|
_port_to_i2c_mapping = {
|
||||||
0: [1, 21],
|
1: 21,
|
||||||
1: [2, 22],
|
2: 22,
|
||||||
2: [3, 23],
|
3: 23,
|
||||||
3: [4, 24],
|
4: 24,
|
||||||
4: [5, 26],
|
5: 26,
|
||||||
5: [6, 25],
|
6: 25,
|
||||||
6: [7, 28],
|
7: 28,
|
||||||
7: [8, 27],
|
8: 27,
|
||||||
8: [9, 17],
|
9: 17,
|
||||||
9: [10, 18],
|
10: 18,
|
||||||
10: [11, 19],
|
11: 19,
|
||||||
11: [12, 20],
|
12: 20,
|
||||||
12: [13, 29],
|
13: 29,
|
||||||
13: [14, 30],
|
14: 30,
|
||||||
14: [15, 31],
|
15: 31,
|
||||||
15: [16, 32],
|
16: 32,
|
||||||
16: [17, 33],
|
17: 33,
|
||||||
17: [18, 34],
|
18: 34,
|
||||||
18: [19, 35],
|
19: 35,
|
||||||
19: [20, 36],
|
20: 36,
|
||||||
20: [21, 45],
|
21: 45,
|
||||||
21: [22, 46],
|
22: 46,
|
||||||
22: [23, 47],
|
23: 47,
|
||||||
23: [24, 48],
|
24: 48,
|
||||||
24: [25, 37],
|
25: 37,
|
||||||
25: [26, 38],
|
26: 38,
|
||||||
26: [27, 39],
|
27: 39,
|
||||||
27: [28, 40],
|
28: 40,
|
||||||
28: [29, 41],
|
29: 41,
|
||||||
29: [30, 42],
|
30: 42,
|
||||||
30: [31, 43],
|
31: 43,
|
||||||
31: [32, 44],
|
32: 44,
|
||||||
32: [33, 15],
|
33: 15,
|
||||||
33: [34, 16],
|
34: 16,
|
||||||
}
|
}
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -82,19 +86,18 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
eeprom_path = self.BASE_OOM_PATH + "eeprom"
|
||||||
|
|
||||||
for x in range(0, self.port_end+1):
|
for x in range(self.port_start, self.port_end+1):
|
||||||
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
self.port_to_eeprom_mapping[x] = eeprom_path.format(
|
||||||
self._port_to_i2c_mapping[x][1]
|
self._port_to_i2c_mapping[x]
|
||||||
)
|
)
|
||||||
|
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
def get_presence(self, port_num):
|
def get_presence(self, port_num):
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self.port_start or port_num > self.port_end:
|
if not port_num in range(self.port_start, self.port_end+1):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
present_path = self.BASE_CPLD_PATH + "module_present_" + str(port_num+1)
|
present_path = self.BASE_CPLD_PATH + "module_present_" + str(port_num)
|
||||||
self.__port_to_is_present = present_path
|
self.__port_to_is_present = present_path
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -174,26 +177,81 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if port_num < self.port_start or port_num > self.port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
mod_rst_path = self.BASE_CPLD_PATH + "module_reset_" + str(port_num+1)
|
mod_rst_path = self.BASE_CPLD_PATH + "module_reset_" + str(port_num)
|
||||||
|
|
||||||
self.__port_to_mod_rst = mod_rst_path
|
self.__port_to_mod_rst = mod_rst_path
|
||||||
try:
|
try:
|
||||||
reg_file = open(self.__port_to_mod_rst, 'r+')
|
reg_file = open(self.__port_to_mod_rst, 'r+', buffering=0)
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
print "Error: unable to open file: %s" % str(e)
|
print "Error: unable to open file: %s" % str(e)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
reg_value = '1'
|
#toggle reset
|
||||||
|
reg_file.seek(0)
|
||||||
reg_file.write(reg_value)
|
reg_file.write('1')
|
||||||
|
time.sleep(1)
|
||||||
|
reg_file.seek(0)
|
||||||
|
reg_file.write('0')
|
||||||
reg_file.close()
|
reg_file.close()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def get_transceiver_change_event(self):
|
@property
|
||||||
"""
|
def get_transceiver_status(self):
|
||||||
TODO: This function need to be implemented
|
nodes = []
|
||||||
when decide to support monitoring SFP(Xcvrd)
|
|
||||||
on this platform.
|
cpld_path = self.BASE_CPLD_PATH
|
||||||
"""
|
nodes.append(cpld_path + "module_present_all")
|
||||||
raise NotImplementedError
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self.get_transceiver_status
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
fp_port = port
|
||||||
|
mask = (1 << (fp_port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
@ -1,65 +1,65 @@
|
|||||||
# name lanes alias
|
# name lanes alias index speed
|
||||||
Ethernet0 73,74,75,76 hundredGigE1
|
Ethernet0 73,74,75,76 hundredGigE1 1 100000
|
||||||
Ethernet4 65,66,67,68 hundredGigE2
|
Ethernet4 65,66,67,68 hundredGigE2 2 100000
|
||||||
Ethernet8 81,82,83,84 hundredGigE3
|
Ethernet8 81,82,83,84 hundredGigE3 3 100000
|
||||||
Ethernet12 89,90,91,92 hundredGigE4
|
Ethernet12 89,90,91,92 hundredGigE4 4 100000
|
||||||
Ethernet16 105,106,107,108 hundredGigE5
|
Ethernet16 105,106,107,108 hundredGigE5 5 100000
|
||||||
Ethernet20 97,98,99,100 hundredGigE6
|
Ethernet20 97,98,99,100 hundredGigE6 6 100000
|
||||||
Ethernet24 113,114,115,116 hundredGigE7
|
Ethernet24 113,114,115,116 hundredGigE7 7 100000
|
||||||
Ethernet28 121,122,123,124 hundredGigE8
|
Ethernet28 121,122,123,124 hundredGigE8 8 100000
|
||||||
Ethernet32 41,42,43,44 hundredGigE9
|
Ethernet32 41,42,43,44 hundredGigE9 9 100000
|
||||||
Ethernet36 33,34,35,36 hundredGigE10
|
Ethernet36 33,34,35,36 hundredGigE10 10 100000
|
||||||
Ethernet40 49,50,51,52 hundredGigE11
|
Ethernet40 49,50,51,52 hundredGigE11 11 100000
|
||||||
Ethernet44 57,58,59,60 hundredGigE12
|
Ethernet44 57,58,59,60 hundredGigE12 12 100000
|
||||||
Ethernet48 137,138,139,140 hundredGigE13
|
Ethernet48 137,138,139,140 hundredGigE13 13 100000
|
||||||
Ethernet52 129,130,131,132 hundredGigE14
|
Ethernet52 129,130,131,132 hundredGigE14 14 100000
|
||||||
Ethernet56 145,146,147,148 hundredGigE15
|
Ethernet56 145,146,147,148 hundredGigE15 15 100000
|
||||||
Ethernet60 153,154,155,156 hundredGigE16
|
Ethernet60 153,154,155,156 hundredGigE16 16 100000
|
||||||
Ethernet64 173,174,175,176 hundredGigE17
|
Ethernet64 173,174,175,176 hundredGigE17 17 100000
|
||||||
Ethernet68 165,166,167,168 hundredGigE18
|
Ethernet68 165,166,167,168 hundredGigE18 18 100000
|
||||||
Ethernet72 181,182,183,184 hundredGigE19
|
Ethernet72 181,182,183,184 hundredGigE19 19 100000
|
||||||
Ethernet76 189,190,191,192 hundredGigE20
|
Ethernet76 189,190,191,192 hundredGigE20 20 100000
|
||||||
Ethernet80 13,14,15,16 hundredGigE21
|
Ethernet80 13,14,15,16 hundredGigE21 21 100000
|
||||||
Ethernet84 5,6,7,8 hundredGigE22
|
Ethernet84 5,6,7,8 hundredGigE22 22 100000
|
||||||
Ethernet88 29,30,31,32 hundredGigE23
|
Ethernet88 29,30,31,32 hundredGigE23 23 100000
|
||||||
Ethernet92 21,22,23,24 hundredGigE24
|
Ethernet92 21,22,23,24 hundredGigE24 24 100000
|
||||||
Ethernet96 205,206,207,208 hundredGigE25
|
Ethernet96 205,206,207,208 hundredGigE25 25 100000
|
||||||
Ethernet100 197,198,199,200 hundredGigE26
|
Ethernet100 197,198,199,200 hundredGigE26 26 100000
|
||||||
Ethernet104 213,214,215,216 hundredGigE27
|
Ethernet104 213,214,215,216 hundredGigE27 27 100000
|
||||||
Ethernet108 221,222,223,224 hundredGigE28
|
Ethernet108 221,222,223,224 hundredGigE28 28 100000
|
||||||
Ethernet112 229,230,231,232 hundredGigE29
|
Ethernet112 229,230,231,232 hundredGigE29 29 100000
|
||||||
Ethernet116 237,238,239,240 hundredGigE30
|
Ethernet116 237,238,239,240 hundredGigE30 30 100000
|
||||||
Ethernet120 245,246,247,248 hundredGigE31
|
Ethernet120 245,246,247,248 hundredGigE31 31 100000
|
||||||
Ethernet124 253,254,255,256 hundredGigE32
|
Ethernet124 253,254,255,256 hundredGigE32 32 100000
|
||||||
Ethernet128 69,70,71,72 hundredGigE33
|
Ethernet128 69,70,71,72 hundredGigE33 33 100000
|
||||||
Ethernet132 77,78,79,80 hundredGigE34
|
Ethernet132 77,78,79,80 hundredGigE34 34 100000
|
||||||
Ethernet136 93,94,95,96 hundredGigE35
|
Ethernet136 93,94,95,96 hundredGigE35 35 100000
|
||||||
Ethernet140 85,86,87,88 hundredGigE36
|
Ethernet140 85,86,87,88 hundredGigE36 36 100000
|
||||||
Ethernet144 101,102,103,104 hundredGigE37
|
Ethernet144 101,102,103,104 hundredGigE37 37 100000
|
||||||
Ethernet148 109,110,111,112 hundredGigE38
|
Ethernet148 109,110,111,112 hundredGigE38 38 100000
|
||||||
Ethernet152 125,126,127,128 hundredGigE39
|
Ethernet152 125,126,127,128 hundredGigE39 39 100000
|
||||||
Ethernet156 117,118,119,120 hundredGigE40
|
Ethernet156 117,118,119,120 hundredGigE40 40 100000
|
||||||
Ethernet160 37,38,39,40 hundredGigE41
|
Ethernet160 37,38,39,40 hundredGigE41 41 100000
|
||||||
Ethernet164 45,46,47,48 hundredGigE42
|
Ethernet164 45,46,47,48 hundredGigE42 42 100000
|
||||||
Ethernet168 61,62,63,64 hundredGigE43
|
Ethernet168 61,62,63,64 hundredGigE43 43 100000
|
||||||
Ethernet172 53,54,55,56 hundredGigE44
|
Ethernet172 53,54,55,56 hundredGigE44 44 100000
|
||||||
Ethernet176 133,134,135,136 hundredGigE45
|
Ethernet176 133,134,135,136 hundredGigE45 45 100000
|
||||||
Ethernet180 141,142,143,144 hundredGigE46
|
Ethernet180 141,142,143,144 hundredGigE46 46 100000
|
||||||
Ethernet184 157,158,159,160 hundredGigE47
|
Ethernet184 157,158,159,160 hundredGigE47 47 100000
|
||||||
Ethernet188 149,150,151,152 hundredGigE48
|
Ethernet188 149,150,151,152 hundredGigE48 48 100000
|
||||||
Ethernet192 161,162,163,164 hundredGigE49
|
Ethernet192 161,162,163,164 hundredGigE49 49 100000
|
||||||
Ethernet196 169,170,171,172 hundredGigE50
|
Ethernet196 169,170,171,172 hundredGigE50 50 100000
|
||||||
Ethernet200 185,186,187,188 hundredGigE51
|
Ethernet200 185,186,187,188 hundredGigE51 51 100000
|
||||||
Ethernet204 177,178,179,180 hundredGigE52
|
Ethernet204 177,178,179,180 hundredGigE52 52 100000
|
||||||
Ethernet208 1,2,3,4 hundredGigE53
|
Ethernet208 1,2,3,4 hundredGigE53 53 100000
|
||||||
Ethernet212 9,10,11,12 hundredGigE54
|
Ethernet212 9,10,11,12 hundredGigE54 54 100000
|
||||||
Ethernet216 25,26,27,28 hundredGigE55
|
Ethernet216 25,26,27,28 hundredGigE55 55 100000
|
||||||
Ethernet220 17,18,19,20 hundredGigE56
|
Ethernet220 17,18,19,20 hundredGigE56 56 100000
|
||||||
Ethernet224 193,194,195,196 hundredGigE57
|
Ethernet224 193,194,195,196 hundredGigE57 57 100000
|
||||||
Ethernet228 201,202,203,204 hundredGigE58
|
Ethernet228 201,202,203,204 hundredGigE58 58 100000
|
||||||
Ethernet232 217,218,219,220 hundredGigE59
|
Ethernet232 217,218,219,220 hundredGigE59 59 100000
|
||||||
Ethernet236 209,210,211,212 hundredGigE60
|
Ethernet236 209,210,211,212 hundredGigE60 60 100000
|
||||||
Ethernet240 225,226,227,228 hundredGigE61
|
Ethernet240 225,226,227,228 hundredGigE61 61 100000
|
||||||
Ethernet244 233,234,235,236 hundredGigE62
|
Ethernet244 233,234,235,236 hundredGigE62 62 100000
|
||||||
Ethernet248 249,250,251,252 hundredGigE63
|
Ethernet248 249,250,251,252 hundredGigE63 63 100000
|
||||||
Ethernet252 241,242,243,244 hundredGigE64
|
Ethernet252 241,242,243,244 hundredGigE64 64 100000
|
||||||
|
@ -8,12 +8,15 @@ try:
|
|||||||
except ImportError, e:
|
except ImportError, e:
|
||||||
raise ImportError (str(e) + "- required module not found")
|
raise ImportError (str(e) + "- required module not found")
|
||||||
|
|
||||||
|
#from xcvrd
|
||||||
|
SFP_STATUS_INSERTED = '1'
|
||||||
|
SFP_STATUS_REMOVED = '0'
|
||||||
|
|
||||||
class SfpUtil(SfpUtilBase):
|
class SfpUtil(SfpUtilBase):
|
||||||
"""Platform specific SfpUtill class"""
|
"""Platform specific SfpUtill class"""
|
||||||
|
|
||||||
_port_start = 0
|
_port_start = 1
|
||||||
_port_end = 63
|
_port_end = 64
|
||||||
ports_in_block = 64
|
ports_in_block = 64
|
||||||
|
|
||||||
_port_to_eeprom_mapping = {}
|
_port_to_eeprom_mapping = {}
|
||||||
@ -86,18 +89,18 @@ class SfpUtil(SfpUtilBase):
|
|||||||
_qsfp_ports = range(0, ports_in_block + 1)
|
_qsfp_ports = range(0, ports_in_block + 1)
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom'
|
eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom'
|
||||||
for x in range(0, self._port_end + 1):
|
for x in range(self.port_start, self.port_end + 1):
|
||||||
port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1])
|
port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x])
|
||||||
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
||||||
SfpUtilBase.__init__(self)
|
SfpUtilBase.__init__(self)
|
||||||
|
|
||||||
def reset(self, port_num):
|
def reset(self, port_num):
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self._port_start or port_num > self._port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
path = "/sys/bus/i2c/devices/19-0060/module_reset_{0}"
|
path = "/sys/bus/i2c/devices/19-0060/module_reset_{0}"
|
||||||
port_ps = path.format(port_num+1)
|
port_ps = path.format(port_num)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(port_ps, 'w')
|
reg_file = open(port_ps, 'w')
|
||||||
@ -113,12 +116,11 @@ class SfpUtil(SfpUtilBase):
|
|||||||
|
|
||||||
def get_presence(self, port_num):
|
def get_presence(self, port_num):
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self._port_start or port_num > self._port_end:
|
if port_num < self.port_start or port_num > self.port_end:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present"
|
path = "/sys/bus/i2c/devices/19-0060/module_present_{0}"
|
||||||
port_ps = path.format(self.port_to_i2c_mapping[port_num+1])
|
port_ps = path.format(port_num)
|
||||||
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
reg_file = open(port_ps)
|
reg_file = open(port_ps)
|
||||||
@ -148,14 +150,6 @@ class SfpUtil(SfpUtilBase):
|
|||||||
def port_to_eeprom_mapping(self):
|
def port_to_eeprom_mapping(self):
|
||||||
return self._port_to_eeprom_mapping
|
return self._port_to_eeprom_mapping
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
def get_low_power_mode(self, port_num):
|
def get_low_power_mode(self, port_num):
|
||||||
# Check for invalid port_num
|
# Check for invalid port_num
|
||||||
if port_num < self._port_start or port_num > self._port_end:
|
if port_num < self._port_start or port_num > self._port_end:
|
||||||
@ -213,3 +207,62 @@ class SfpUtil(SfpUtilBase):
|
|||||||
if eeprom is not None:
|
if eeprom is not None:
|
||||||
eeprom.close()
|
eeprom.close()
|
||||||
time.sleep(0.01)
|
time.sleep(0.01)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def _get_present_bitmap(self):
|
||||||
|
nodes = []
|
||||||
|
|
||||||
|
cpld_path = "/sys/bus/i2c/devices/19-0060/"
|
||||||
|
nodes.append(cpld_path + "module_present_all")
|
||||||
|
|
||||||
|
bitmap = ""
|
||||||
|
for node in nodes:
|
||||||
|
try:
|
||||||
|
reg_file = open(node)
|
||||||
|
|
||||||
|
except IOError as e:
|
||||||
|
print "Error: unable to open file: %s" % str(e)
|
||||||
|
return False
|
||||||
|
bitmap += reg_file.readline().rstrip() + " "
|
||||||
|
reg_file.close()
|
||||||
|
|
||||||
|
rev = bitmap.split(" ")
|
||||||
|
rev = "".join(rev[::-1])
|
||||||
|
return int(rev,16)
|
||||||
|
|
||||||
|
|
||||||
|
data = {'valid':0, 'last':0, 'present':0}
|
||||||
|
def get_transceiver_change_event(self, timeout=2000):
|
||||||
|
now = time.time()
|
||||||
|
port_dict = {}
|
||||||
|
port = 0
|
||||||
|
|
||||||
|
if timeout < 1000:
|
||||||
|
timeout = 1000
|
||||||
|
timeout = (timeout) / float(1000) # Convert to secs
|
||||||
|
|
||||||
|
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||||
|
return True, {}
|
||||||
|
|
||||||
|
reg_value = self._get_present_bitmap
|
||||||
|
reg_value = ~reg_value
|
||||||
|
changed_ports = self.data['present'] ^ reg_value
|
||||||
|
if changed_ports:
|
||||||
|
for port in range (self.port_start, self.port_end+1):
|
||||||
|
# Mask off the bit corresponding to our port
|
||||||
|
mask = (1 << (port - 1))
|
||||||
|
if changed_ports & mask:
|
||||||
|
if (reg_value & mask) == 0:
|
||||||
|
port_dict[port] = SFP_STATUS_REMOVED
|
||||||
|
else:
|
||||||
|
port_dict[port] = SFP_STATUS_INSERTED
|
||||||
|
|
||||||
|
# Update cache
|
||||||
|
self.data['present'] = reg_value
|
||||||
|
self.data['last'] = now
|
||||||
|
self.data['valid'] = 1
|
||||||
|
return True, port_dict
|
||||||
|
else:
|
||||||
|
return True, {}
|
||||||
|
return False, {}
|
||||||
|
|
||||||
|
@ -96,58 +96,71 @@ class FanUtil(object):
|
|||||||
(FAN_NUM_5_IDX, FANR_NODE_SPEED_IDX_OF_MAP): 'fanr5_speed_rpm',
|
(FAN_NUM_5_IDX, FANR_NODE_SPEED_IDX_OF_MAP): 'fanr5_speed_rpm',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
def __init__(self, log_level=logging.DEBUG):
|
||||||
|
ch = logging.StreamHandler()
|
||||||
|
ch.setLevel(log_level)
|
||||||
|
self.logger.addHandler(ch)
|
||||||
|
|
||||||
|
fan_path = self.BASE_VAL_PATH
|
||||||
|
for fan_num in range(self.FAN_NUM_1_IDX, self.FAN_NUM_ON_MAIN_BROAD+1):
|
||||||
|
for node_num in range(self.FAN_NODE_FAULT_IDX_OF_MAP, self.FAN_NODE_NUM_OF_MAP+1):
|
||||||
|
self._fan_to_device_path_mapping[(fan_num, node_num)] = fan_path.format(
|
||||||
|
self._fan_to_device_node_mapping[(fan_num, node_num)])
|
||||||
|
|
||||||
|
|
||||||
def _get_fan_to_device_node(self, fan_num, node_num):
|
def _get_fan_to_device_node(self, fan_num, node_num):
|
||||||
return self._fan_to_device_node_mapping[(fan_num, node_num)]
|
return self._fan_to_device_node_mapping[(fan_num, node_num)]
|
||||||
|
|
||||||
def _get_fan_node_val(self, fan_num, node_num):
|
def _get_fan_node_val(self, fan_num, node_num):
|
||||||
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
||||||
logging.debug('GET. Parameter error. fan_num:%d', fan_num)
|
self.logger.debug('GET. Parameter error. fan_num:%d', fan_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if node_num < self.FAN_NODE_FAULT_IDX_OF_MAP or node_num > self.FAN_NODE_NUM_OF_MAP:
|
if node_num < self.FAN_NODE_FAULT_IDX_OF_MAP or node_num > self.FAN_NODE_NUM_OF_MAP:
|
||||||
logging.debug('GET. Parameter error. node_num:%d', node_num)
|
self.logger.debug('GET. Parameter error. node_num:%d', node_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
device_path = self.get_fan_to_device_path(fan_num, node_num)
|
device_path = self.get_fan_to_device_path(fan_num, node_num)
|
||||||
try:
|
try:
|
||||||
val_file = open(device_path, 'r')
|
val_file = open(device_path, 'r')
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
logging.error('GET. unable to open file: %s', str(e))
|
self.logger.error('GET. unable to open file: %s', str(e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
content = val_file.readline().rstrip()
|
content = val_file.readline().rstrip()
|
||||||
|
|
||||||
if content == '':
|
if content == '':
|
||||||
logging.debug('GET. content is NULL. device_path:%s', device_path)
|
self.logger.debug('GET. content is NULL. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
val_file.close()
|
val_file.close()
|
||||||
except:
|
except:
|
||||||
logging.debug('GET. unable to close file. device_path:%s', device_path)
|
self.logger.debug('GET. unable to close file. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return int(content)
|
return int(content)
|
||||||
|
|
||||||
def _set_fan_node_val(self, fan_num, node_num, val):
|
def _set_fan_node_val(self, fan_num, node_num, val):
|
||||||
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
||||||
logging.debug('GET. Parameter error. fan_num:%d', fan_num)
|
self.logger.debug('GET. Parameter error. fan_num:%d', fan_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if node_num < self.FAN_NODE_FAULT_IDX_OF_MAP or node_num > self.FAN_NODE_NUM_OF_MAP:
|
if node_num < self.FAN_NODE_FAULT_IDX_OF_MAP or node_num > self.FAN_NODE_NUM_OF_MAP:
|
||||||
logging.debug('GET. Parameter error. node_num:%d', node_num)
|
self.logger.debug('GET. Parameter error. node_num:%d', node_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
content = str(val)
|
content = str(val)
|
||||||
if content == '':
|
if content == '':
|
||||||
logging.debug('GET. content is NULL. device_path:%s', device_path)
|
self.logger.debug('GET. content is NULL. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
device_path = self.get_fan_to_device_path(fan_num, node_num)
|
device_path = self.get_fan_to_device_path(fan_num, node_num)
|
||||||
try:
|
try:
|
||||||
val_file = open(device_path, 'w')
|
val_file = open(device_path, 'w')
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
logging.error('GET. unable to open file: %s', str(e))
|
self.logger.error('GET. unable to open file: %s', str(e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
val_file.write(content)
|
val_file.write(content)
|
||||||
@ -155,19 +168,11 @@ class FanUtil(object):
|
|||||||
try:
|
try:
|
||||||
val_file.close()
|
val_file.close()
|
||||||
except:
|
except:
|
||||||
logging.debug('GET. unable to close file. device_path:%s', device_path)
|
self.logger.debug('GET. unable to close file. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
fan_path = self.BASE_VAL_PATH
|
|
||||||
|
|
||||||
for fan_num in range(self.FAN_NUM_1_IDX, self.FAN_NUM_ON_MAIN_BROAD+1):
|
|
||||||
for node_num in range(self.FAN_NODE_FAULT_IDX_OF_MAP, self.FAN_NODE_NUM_OF_MAP+1):
|
|
||||||
self._fan_to_device_path_mapping[(fan_num, node_num)] = fan_path.format(
|
|
||||||
self._fan_to_device_node_mapping[(fan_num, node_num)])
|
|
||||||
|
|
||||||
def get_num_fans(self):
|
def get_num_fans(self):
|
||||||
return self.FAN_NUM_ON_MAIN_BROAD
|
return self.FAN_NUM_ON_MAIN_BROAD
|
||||||
|
|
||||||
@ -212,15 +217,15 @@ class FanUtil(object):
|
|||||||
|
|
||||||
def get_fan_status(self, fan_num):
|
def get_fan_status(self, fan_num):
|
||||||
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
if fan_num < self.FAN_NUM_1_IDX or fan_num > self.FAN_NUM_ON_MAIN_BROAD:
|
||||||
logging.debug('GET. Parameter error. fan_num, %d', fan_num)
|
self.logger.debug('GET. Parameter error. fan_num, %d', fan_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if self.get_fan_fault(fan_num) is not None and self.get_fan_fault(fan_num) > 0:
|
if self.get_fan_fault(fan_num) is not None and self.get_fan_fault(fan_num) > 0:
|
||||||
logging.debug('GET. FAN fault. fan_num, %d', fan_num)
|
self.logger.debug('GET. FAN fault. fan_num, %d', fan_num)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if self.get_fanr_fault(fan_num) is not None and self.get_fanr_fault(fan_num) > 0:
|
if self.get_fanr_fault(fan_num) is not None and self.get_fanr_fault(fan_num) > 0:
|
||||||
logging.debug('GET. FANR fault. fan_num, %d', fan_num)
|
self.logger.debug('GET. FANR fault. fan_num, %d', fan_num)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -52,7 +52,11 @@ class ThermalUtil(object):
|
|||||||
THERMAL_NUM_3_IDX: ['63', '4a'],
|
THERMAL_NUM_3_IDX: ['63', '4a'],
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
logger = logging.getLogger(__name__)
|
||||||
|
def __init__(self, log_level=logging.DEBUG):
|
||||||
|
ch = logging.StreamHandler()
|
||||||
|
ch.setLevel(log_level)
|
||||||
|
self.logger.addHandler(ch)
|
||||||
thermal_path = self.BASE_VAL_PATH
|
thermal_path = self.BASE_VAL_PATH
|
||||||
|
|
||||||
for x in range(self.THERMAL_NUM_1_IDX, self.THERMAL_NUM_ON_MAIN_BROAD+1):
|
for x in range(self.THERMAL_NUM_1_IDX, self.THERMAL_NUM_ON_MAIN_BROAD+1):
|
||||||
@ -62,7 +66,7 @@ class ThermalUtil(object):
|
|||||||
|
|
||||||
def _get_thermal_node_val(self, thermal_num):
|
def _get_thermal_node_val(self, thermal_num):
|
||||||
if thermal_num < self.THERMAL_NUM_1_IDX or thermal_num > self.THERMAL_NUM_ON_MAIN_BROAD:
|
if thermal_num < self.THERMAL_NUM_1_IDX or thermal_num > self.THERMAL_NUM_ON_MAIN_BROAD:
|
||||||
logging.debug('GET. Parameter error. thermal_num, %d', thermal_num)
|
self.logger.debug('GET. Parameter error. thermal_num, %d', thermal_num)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
device_path = self.get_thermal_to_device_path(thermal_num)
|
device_path = self.get_thermal_to_device_path(thermal_num)
|
||||||
@ -70,19 +74,19 @@ class ThermalUtil(object):
|
|||||||
try:
|
try:
|
||||||
val_file = open(filename, 'r')
|
val_file = open(filename, 'r')
|
||||||
except IOError as e:
|
except IOError as e:
|
||||||
logging.error('GET. unable to open file: %s', str(e))
|
self.logger.error('GET. unable to open file: %s', str(e))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
content = val_file.readline().rstrip()
|
content = val_file.readline().rstrip()
|
||||||
|
|
||||||
if content == '':
|
if content == '':
|
||||||
logging.debug('GET. content is NULL. device_path:%s', device_path)
|
self.logger.debug('GET. content is NULL. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
val_file.close()
|
val_file.close()
|
||||||
except:
|
except:
|
||||||
logging.debug('GET. unable to close file. device_path:%s', device_path)
|
self.logger.debug('GET. unable to close file. device_path:%s', device_path)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return int(content)
|
return int(content)
|
||||||
|
@ -5,10 +5,10 @@ After=sysinit.target
|
|||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=oneshot
|
Type=simple
|
||||||
ExecStartPre=/usr/local/bin/accton_as5812_util.py install
|
ExecStartPre=/usr/local/bin/accton_as5812_util.py install
|
||||||
ExecStart=/usr/local/bin/accton_as5812_monitor.py
|
ExecStart=/usr/local/bin/accton_as5812_monitor.py
|
||||||
RemainAfterExit=yes
|
#RemainAfterExit=yes
|
||||||
|
|
||||||
# Resource Limitations
|
# Resource Limitations
|
||||||
LimitCORE=infinity
|
LimitCORE=infinity
|
||||||
|
@ -30,6 +30,7 @@ try:
|
|||||||
import imp
|
import imp
|
||||||
import logging
|
import logging
|
||||||
import logging.config
|
import logging.config
|
||||||
|
import logging.handlers
|
||||||
import types
|
import types
|
||||||
import time # this is only being used as part of the example
|
import time # this is only being used as part of the example
|
||||||
import traceback
|
import traceback
|
||||||
@ -46,7 +47,7 @@ FUNCTION_NAME = 'accton_as5812_monitor'
|
|||||||
DUTY_MAX = 100
|
DUTY_MAX = 100
|
||||||
|
|
||||||
global log_file
|
global log_file
|
||||||
global log_level
|
global log_console
|
||||||
|
|
||||||
# Make a class we can use to capture stdout and sterr in the log
|
# Make a class we can use to capture stdout and sterr in the log
|
||||||
class accton_as5812_monitor(object):
|
class accton_as5812_monitor(object):
|
||||||
@ -54,26 +55,32 @@ class accton_as5812_monitor(object):
|
|||||||
_ori_temp = 0
|
_ori_temp = 0
|
||||||
_new_perc = 0
|
_new_perc = 0
|
||||||
|
|
||||||
def __init__(self, log_file, log_level):
|
llog = logging.getLogger("["+FUNCTION_NAME+"]")
|
||||||
|
def __init__(self, log_console, log_file):
|
||||||
"""Needs a logger and a logger level."""
|
"""Needs a logger and a logger level."""
|
||||||
# set up logging to file
|
|
||||||
logging.basicConfig(
|
formatter = logging.Formatter('%(name)s %(message)s')
|
||||||
filename=log_file,
|
sys_handler = logging.handlers.SysLogHandler(address = '/dev/log')
|
||||||
filemode='w',
|
sys_handler.setFormatter(formatter)
|
||||||
level=log_level,
|
sys_handler.ident = 'common'
|
||||||
format= '[%(asctime)s] {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s',
|
sys_handler.setLevel(logging.WARNING) #only fatal for syslog
|
||||||
datefmt='%H:%M:%S'
|
self.llog.addHandler(sys_handler)
|
||||||
)
|
self.llog.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
if log_file:
|
||||||
|
fh = logging.FileHandler(log_file)
|
||||||
|
fh.setLevel(logging.INFO)
|
||||||
|
formatter = logging.Formatter('%(asctime)-15s %(name)s %(message)s')
|
||||||
|
fh.setFormatter(formatter)
|
||||||
|
self.llog.addHandler(fh)
|
||||||
|
|
||||||
# set up logging to console
|
# set up logging to console
|
||||||
if log_level == logging.DEBUG:
|
if log_console:
|
||||||
console = logging.StreamHandler()
|
console = logging.StreamHandler()
|
||||||
console.setLevel(log_level)
|
console.setLevel(logging.DEBUG) #For debugging
|
||||||
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
|
formatter = logging.Formatter('%(asctime)-15s %(name)s %(message)s')
|
||||||
console.setFormatter(formatter)
|
console.setFormatter(formatter)
|
||||||
logging.getLogger('').addHandler(console)
|
self.llog.addHandler(console)
|
||||||
|
|
||||||
logging.debug('SET. logfile:%s / loglevel:%d', log_file, log_level)
|
|
||||||
|
|
||||||
def manage_fans(self):
|
def manage_fans(self):
|
||||||
FAN_LEV1_UP_TEMP = 57700 # temperature
|
FAN_LEV1_UP_TEMP = 57700 # temperature
|
||||||
@ -108,26 +115,25 @@ class accton_as5812_monitor(object):
|
|||||||
|
|
||||||
for x in range(fan.get_idx_fan_start(), fan.get_num_fans()+1):
|
for x in range(fan.get_idx_fan_start(), fan.get_num_fans()+1):
|
||||||
fan_stat = fan.get_fan_status(x)
|
fan_stat = fan.get_fan_status(x)
|
||||||
if fan_stat is None:
|
if fan_stat is None or fan_stat is False:
|
||||||
return False
|
|
||||||
if fan_stat is False:
|
|
||||||
self._new_perc = FAN_LEV1_SPEED_PERC
|
self._new_perc = FAN_LEV1_SPEED_PERC
|
||||||
logging.debug('INFO. SET new_perc to %d (FAN fault. fan_num:%d)', self._new_perc, x)
|
self.llog.error('SET new_perc to %d (FAN fault. fan_num:%d)', self._new_perc, x)
|
||||||
break
|
break
|
||||||
logging.debug('INFO. fan_stat is True (fan_num:%d)', x)
|
else:
|
||||||
|
self.llog.debug('fan_stat is True (fan_num:%d)', x)
|
||||||
|
|
||||||
if fan_stat is not None and fan_stat is not False:
|
if fan_stat is not None and fan_stat is not False:
|
||||||
diff = new_temp - self._ori_temp
|
diff = new_temp - self._ori_temp
|
||||||
if diff == 0:
|
if diff == 0:
|
||||||
logging.debug('INFO. RETURN. THERMAL temp not changed. %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
self.llog.debug('RETURN. THERMAL temp not changed. %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
if diff >= 0:
|
if diff >= 0:
|
||||||
is_up = True
|
is_up = True
|
||||||
logging.debug('INFO. THERMAL temp UP %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
self.llog.debug('THERMAL temp UP %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
||||||
else:
|
else:
|
||||||
is_up = False
|
is_up = False
|
||||||
logging.debug('INFO. THERMAL temp DOWN %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
self.llog.debug('THERMAL temp DOWN %d / %d (new_temp / ori_temp)', new_temp, self._ori_temp)
|
||||||
|
|
||||||
if is_up is True:
|
if is_up is True:
|
||||||
if new_temp >= FAN_LEV1_UP_TEMP:
|
if new_temp >= FAN_LEV1_UP_TEMP:
|
||||||
@ -138,7 +144,7 @@ class accton_as5812_monitor(object):
|
|||||||
self._new_perc = FAN_LEV3_SPEED_PERC
|
self._new_perc = FAN_LEV3_SPEED_PERC
|
||||||
else:
|
else:
|
||||||
self._new_perc = FAN_LEV4_SPEED_PERC
|
self._new_perc = FAN_LEV4_SPEED_PERC
|
||||||
logging.debug('INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)
|
self.llog.debug('SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)
|
||||||
else:
|
else:
|
||||||
if new_temp <= FAN_LEV4_DOWN_TEMP:
|
if new_temp <= FAN_LEV4_DOWN_TEMP:
|
||||||
self._new_perc = FAN_LEV4_SPEED_PERC
|
self._new_perc = FAN_LEV4_SPEED_PERC
|
||||||
@ -148,57 +154,60 @@ class accton_as5812_monitor(object):
|
|||||||
self._new_perc = FAN_LEV2_SPEED_PERC
|
self._new_perc = FAN_LEV2_SPEED_PERC
|
||||||
else:
|
else:
|
||||||
self._new_perc = FAN_LEV1_SPEED_PERC
|
self._new_perc = FAN_LEV1_SPEED_PERC
|
||||||
logging.debug('INFO. SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)
|
self.llog.debug('SET. FAN_SPEED as %d (new THERMAL temp:%d)', self._new_perc, new_temp)
|
||||||
|
|
||||||
cur_perc = fan.get_fan_duty_cycle(fan.get_idx_fan_start())
|
cur_perc = fan.get_fan_duty_cycle(fan.get_idx_fan_start())
|
||||||
if cur_perc == self._new_perc:
|
if cur_perc == self._new_perc:
|
||||||
logging.debug('INFO. RETURN. FAN speed not changed. %d / %d (new_perc / ori_perc)', self._new_perc, cur_perc)
|
self.llog.debug('RETURN. FAN speed not changed. %d / %d (new_perc / ori_perc)', self._new_perc, cur_perc)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
set_stat = fan.set_fan_duty_cycle(fan.get_idx_fan_start(), self._new_perc)
|
set_stat = fan.set_fan_duty_cycle(fan.get_idx_fan_start(), self._new_perc)
|
||||||
if set_stat is True:
|
if set_stat is True:
|
||||||
logging.debug('INFO: PASS. set_fan_duty_cycle (%d)', self._new_perc)
|
self.llog.debug('PASS. set_fan_duty_cycle (%d)', self._new_perc)
|
||||||
else:
|
else:
|
||||||
logging.debug('INFO: FAIL. set_fan_duty_cycle (%d)', self._new_perc)
|
self.llog.error('FAIL. set_fan_duty_cycle (%d)', self._new_perc)
|
||||||
|
|
||||||
logging.debug('INFO: GET. ori_perc is %d. ori_temp is %d', cur_perc, self._ori_temp)
|
self.llog.debug('GET. ori_perc is %d. ori_temp is %d', cur_perc, self._ori_temp)
|
||||||
self._ori_temp = new_temp
|
self._ori_temp = new_temp
|
||||||
logging.debug('INFO: UPDATE. ori_perc to %d. ori_temp to %d', cur_perc, self._ori_temp)
|
self.llog.info('UPDATE. ori_perc to %d. ori_temp to %d', cur_perc, self._ori_temp)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def handler(signum, frame):
|
def sig_handler(signum, frame):
|
||||||
fan = FanUtil()
|
fan = FanUtil()
|
||||||
logging.debug('INFO:Cause signal %d, set fan speed max.', signum)
|
logging.critical('Cause signal %d, set fan speed max.', signum)
|
||||||
fan.set_fan_duty_cycle(fan.get_idx_fan_start(), DUTY_MAX)
|
fan.set_fan_duty_cycle(fan.get_idx_fan_start(), DUTY_MAX)
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
log_file = '%s.log' % FUNCTION_NAME
|
log_file = '%s.log' % FUNCTION_NAME
|
||||||
log_level = logging.INFO
|
log_console = 0
|
||||||
|
log_file = ""
|
||||||
if len(sys.argv) != 1:
|
if len(sys.argv) != 1:
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.getopt(argv,'hdl:',['lfile='])
|
opts, args = getopt.getopt(argv,'hdl')
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
print 'Usage: %s [-d] [-l <log_file>]' % sys.argv[0]
|
print 'Usage: %s [-d] [-l]' % sys.argv[0]
|
||||||
return 0
|
return 0
|
||||||
for opt, arg in opts:
|
for opt, arg in opts:
|
||||||
if opt == '-h':
|
if opt == '-h':
|
||||||
print 'Usage: %s [-d] [-l <log_file>]' % sys.argv[0]
|
print 'Usage: %s [-d] [-l]' % sys.argv[0]
|
||||||
return 0
|
return 0
|
||||||
elif opt in ('-d', '--debug'):
|
elif opt in ('-d'):
|
||||||
log_level = logging.DEBUG
|
log_console = 1
|
||||||
elif opt in ('-l', '--lfile'):
|
elif opt in ('-l'):
|
||||||
log_file = arg
|
log_file = '%s.log' % sys.argv[0]
|
||||||
|
|
||||||
signal.signal(signal.SIGINT, handler)
|
signal.signal(signal.SIGINT, sig_handler)
|
||||||
signal.signal(signal.SIGTERM, handler)
|
signal.signal(signal.SIGTERM, sig_handler)
|
||||||
monitor = accton_as5812_monitor(log_file, log_level)
|
monitor = accton_as5812_monitor(log_console, log_file)
|
||||||
|
|
||||||
|
#time.sleep(100)
|
||||||
# Loop forever, doing something useful hopefully:
|
# Loop forever, doing something useful hopefully:
|
||||||
while True:
|
while True:
|
||||||
monitor.manage_fans()
|
monitor.manage_fans()
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main(sys.argv[1:])
|
main(sys.argv[1:])
|
||||||
|
@ -585,35 +585,46 @@ static ssize_t show_present_all(struct device *dev, struct device_attribute *da,
|
|||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
int i, status;
|
int i, status;
|
||||||
u8 values[4] = {0};
|
u32 values;
|
||||||
u8 regs[] = {0x9, 0xA, 0xB, 0x18};
|
u8 *value = (u8*)&values;
|
||||||
|
u8 regs_h1[] = {0x0f, 0x10, 0x11, 0x12};
|
||||||
|
u8 regs_h2[] = {0x10, 0x11, 0x12, 0x13};
|
||||||
|
u8 *regs_p;
|
||||||
struct i2c_client *client = to_i2c_client(dev);
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
struct as7326_56x_cpld_data *data = i2c_get_clientdata(client);
|
struct as7326_56x_cpld_data *data = i2c_get_clientdata(client);
|
||||||
|
|
||||||
|
if (data->type == as7326_56x_cpld2) {
|
||||||
|
regs_p = regs_h1;
|
||||||
|
} else {
|
||||||
|
regs_p = regs_h2;
|
||||||
|
}
|
||||||
mutex_lock(&data->update_lock);
|
mutex_lock(&data->update_lock);
|
||||||
|
for (i = 0; i < sizeof(values); i++) {
|
||||||
for (i = 0; i < ARRAY_SIZE(regs); i++) {
|
status = as7326_56x_cpld_read_internal(client, regs_p[i]);
|
||||||
status = as7326_56x_cpld_read_internal(client, regs[i]);
|
|
||||||
|
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
values[i] = ~(u8)status;
|
value[i] = ~(u8)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&data->update_lock);
|
mutex_unlock(&data->update_lock);
|
||||||
|
|
||||||
/* Return values 1 -> 56 in order */
|
values = cpu_to_le32(values);
|
||||||
|
/* For port 1 ~ 30 in order */
|
||||||
if (data->type == as7326_56x_cpld2) {
|
if (data->type == as7326_56x_cpld2) {
|
||||||
values[3] &= 0xF;
|
values &= 0x3FFFFFFF;
|
||||||
}
|
} else { /* Port 31 ~ 56 */
|
||||||
else { /* as7326_56x_cpld3 */
|
u8 tmp1 = (values >> 18) & 0x3;
|
||||||
values[3] &= 0x3;
|
u8 tmp2 = (values >> 24) ;
|
||||||
|
|
||||||
|
values &= 0x3ffff;
|
||||||
|
values |= (tmp2 << 18);
|
||||||
|
values |= (tmp1 << 26);
|
||||||
}
|
}
|
||||||
|
|
||||||
return sprintf(buf, "%.2x %.2x %.2x %.2x\n",
|
return sprintf(buf, "%x\n", values);
|
||||||
values[0], values[1], values[2], values[3]);
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
mutex_unlock(&data->update_lock);
|
mutex_unlock(&data->update_lock);
|
||||||
|
@ -121,7 +121,7 @@ def show_set_help():
|
|||||||
print cmd +" [led|sfp|fan]"
|
print cmd +" [led|sfp|fan]"
|
||||||
print " use \""+ cmd + " led 0-4 \" to set led color"
|
print " use \""+ cmd + " led 0-4 \" to set led color"
|
||||||
print " use \""+ cmd + " fan 0-100\" to set fan duty percetage"
|
print " use \""+ cmd + " fan 0-100\" to set fan duty percetage"
|
||||||
print " use \""+ cmd + " sfp 1-32 {0|1}\" to set sfp# tx_disable"
|
print " use \""+ cmd + " sfp 1-64 {0|1}\" to set sfp# tx_disable"
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def diss_i2c_ir3507a(addr):
|
def diss_i2c_ir3507a(addr):
|
||||||
@ -149,7 +149,7 @@ def ir3507_check():
|
|||||||
|
|
||||||
def show_eeprom_help():
|
def show_eeprom_help():
|
||||||
cmd = sys.argv[0].split("/")[-1]+ " " + args[0]
|
cmd = sys.argv[0].split("/")[-1]+ " " + args[0]
|
||||||
print " use \""+ cmd + " 1-32 \" to dump sfp# eeprom"
|
print " use \""+ cmd + " 1-64 \" to dump sfp# eeprom"
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def my_log(txt):
|
def my_log(txt):
|
||||||
@ -180,10 +180,11 @@ def driver_check():
|
|||||||
kos = [
|
kos = [
|
||||||
'modprobe i2c_dev',
|
'modprobe i2c_dev',
|
||||||
'modprobe i2c_mux_pca954x force_deselect_on_exit=1',
|
'modprobe i2c_mux_pca954x force_deselect_on_exit=1',
|
||||||
|
'modprobe optoe',
|
||||||
'modprobe accton_i2c_cpld' ,
|
'modprobe accton_i2c_cpld' ,
|
||||||
'modprobe ym2651y' ,
|
'modprobe ym2651y' ,
|
||||||
'modprobe x86-64-accton-as7816-64x-fan' ,
|
'modprobe x86-64-accton-as7816-64x-fan' ,
|
||||||
'modprobe x86-64-accton-as7816-64x-sfp' ,
|
#'modprobe x86-64-accton-as7816-64x-sfp' ,
|
||||||
'modprobe x86-64-accton-as7816-64x-leds' ,
|
'modprobe x86-64-accton-as7816-64x-leds' ,
|
||||||
'modprobe x86-64-accton-as7816-64x-psu' ]
|
'modprobe x86-64-accton-as7816-64x-psu' ]
|
||||||
|
|
||||||
@ -229,7 +230,7 @@ i2c_bus = {'fan': ['17-0068'] ,
|
|||||||
i2c_nodes = {'fan': ['present', 'front_speed_rpm', 'rear_speed_rpm'] ,
|
i2c_nodes = {'fan': ['present', 'front_speed_rpm', 'rear_speed_rpm'] ,
|
||||||
'thermal': ['hwmon/hwmon*/temp1_input'] ,
|
'thermal': ['hwmon/hwmon*/temp1_input'] ,
|
||||||
'psu': ['psu_present', 'psu_power_good'] ,
|
'psu': ['psu_present', 'psu_power_good'] ,
|
||||||
'sfp': ['sfp_is_present ', 'sfp_tx_disable']}
|
'sfp': ['module_present']}
|
||||||
|
|
||||||
sfp_map = [37,38,39,40,42,41,44,43,33,34,35,36,45,46,47,48,49,50,51,52,
|
sfp_map = [37,38,39,40,42,41,44,43,33,34,35,36,45,46,47,48,49,50,51,52,
|
||||||
61,62,63,64,53,54,55,56,57,58,59,60,69,70,71,72,77,78,79,80,65,
|
61,62,63,64,53,54,55,56,57,58,59,60,69,70,71,72,77,78,79,80,65,
|
||||||
@ -283,7 +284,8 @@ def device_install():
|
|||||||
return status
|
return status
|
||||||
|
|
||||||
for i in range(0,len(sfp_map)):
|
for i in range(0,len(sfp_map)):
|
||||||
status, output =log_os_system("echo as7816_64x_port"+str(i+1)+" 0x50 > /sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/new_device", 1)
|
path = "/sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/new_device"
|
||||||
|
status, output =log_os_system("echo optoe1 0x50 > " + path, 1)
|
||||||
if status:
|
if status:
|
||||||
print output
|
print output
|
||||||
if FORCE == 0:
|
if FORCE == 0:
|
||||||
@ -393,7 +395,9 @@ def devices_info():
|
|||||||
elif 'sfp' == key:
|
elif 'sfp' == key:
|
||||||
for k in range(0,DEVICE_NO[key]):
|
for k in range(0,DEVICE_NO[key]):
|
||||||
node = key+str(k+1)
|
node = key+str(k+1)
|
||||||
path = i2c_prefix+ str(sfp_map[k])+ buses[i]+"/"+ nodes[j]
|
fmt = i2c_prefix+"19-0060/{0}_{1}"
|
||||||
|
path = fmt.format(nodes[j], k+1)
|
||||||
|
|
||||||
my_log(node+": "+ path)
|
my_log(node+": "+ path)
|
||||||
ALL_DEVICE[key][node].append(path)
|
ALL_DEVICE[key][node].append(path)
|
||||||
else:
|
else:
|
||||||
@ -428,10 +432,8 @@ def show_eeprom(index):
|
|||||||
print("Please install first!")
|
print("Please install first!")
|
||||||
return
|
return
|
||||||
|
|
||||||
if len(ALL_DEVICE)==0:
|
i = int(index)-1
|
||||||
devices_info()
|
node = i2c_prefix+ str(sfp_map[i])+ i2c_bus['sfp'][0]+"/"+ 'eeprom'
|
||||||
node = ALL_DEVICE['sfp'] ['sfp'+str(index)][0]
|
|
||||||
node = node.replace(node.split("/")[-1], 'sfp_eeprom')
|
|
||||||
# check if got hexdump command in current environment
|
# check if got hexdump command in current environment
|
||||||
ret, log = log_os_system("which hexdump", 0)
|
ret, log = log_os_system("which hexdump", 0)
|
||||||
ret, log2 = log_os_system("which busybox hexdump", 0)
|
ret, log2 = log_os_system("which busybox hexdump", 0)
|
||||||
@ -446,7 +448,7 @@ def show_eeprom(index):
|
|||||||
return 1
|
return 1
|
||||||
|
|
||||||
print node + ":"
|
print node + ":"
|
||||||
ret, log = log_os_system("cat "+node+"| "+hex_cmd+" -C", 1)
|
ret, log = log_os_system(hex_cmd +" -C "+node, 1)
|
||||||
if ret==0:
|
if ret==0:
|
||||||
print log
|
print log
|
||||||
else:
|
else:
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
|
#include <linux/printk.h>
|
||||||
|
|
||||||
|
|
||||||
#define MAX_PORT_NUM 64
|
#define MAX_PORT_NUM 64
|
||||||
@ -180,7 +181,7 @@ struct attrs as7712_common[] = {
|
|||||||
struct attrs as7816_common[] = {
|
struct attrs as7816_common[] = {
|
||||||
[CMN_VERSION] = {0x01, false, &common_attrs[CMN_VERSION]},
|
[CMN_VERSION] = {0x01, false, &common_attrs[CMN_VERSION]},
|
||||||
[CMN_ACCESS] = {0x00, false, &common_attrs[CMN_ACCESS]},
|
[CMN_ACCESS] = {0x00, false, &common_attrs[CMN_ACCESS]},
|
||||||
[CMN_PRESENT_ALL] = {0x30, false, &common_attrs[CMN_PRESENT_ALL]},
|
[CMN_PRESENT_ALL] = {0x70, false, &common_attrs[CMN_PRESENT_ALL]},
|
||||||
};
|
};
|
||||||
struct attrs as7312_common[] = {
|
struct attrs as7312_common[] = {
|
||||||
[CMN_VERSION] = {0x01, false, &common_attrs[CMN_VERSION]},
|
[CMN_VERSION] = {0x01, false, &common_attrs[CMN_VERSION]},
|
||||||
@ -282,7 +283,7 @@ static int get_sfp_spec(int model, u16 *num, u8 *types)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_present_reg(int model, u8 port, u8 *cpld_addr, u8 *reg, u8 *num)
|
static int get_present_reg_distinct(int model, u8 port, u8 *cpld_addr, u8 *reg, u8 *num)
|
||||||
{
|
{
|
||||||
u8 cpld_address[] = CPLD_ADDRS;
|
u8 cpld_address[] = CPLD_ADDRS;
|
||||||
|
|
||||||
@ -388,7 +389,7 @@ static ssize_t show_presnet_all_distinct(struct device *dev,
|
|||||||
mutex_lock(&data->update_lock);
|
mutex_lock(&data->update_lock);
|
||||||
while(i < data->sfp_num)
|
while(i < data->sfp_num)
|
||||||
{
|
{
|
||||||
get_present_reg(data->model, i, &cpld_addr, ®, &num);
|
get_present_reg_distinct(data->model, i, &cpld_addr, ®, &num);
|
||||||
if(cpld_addr == client->addr)
|
if(cpld_addr == client->addr)
|
||||||
value = cpld_read_internal(client, reg);
|
value = cpld_read_internal(client, reg);
|
||||||
else
|
else
|
||||||
@ -416,8 +417,9 @@ static ssize_t show_presnet_all(struct device *dev,
|
|||||||
struct i2c_client *client = to_i2c_client(dev);
|
struct i2c_client *client = to_i2c_client(dev);
|
||||||
struct cpld_data *data = i2c_get_clientdata(client);
|
struct cpld_data *data = i2c_get_clientdata(client);
|
||||||
struct cpld_sensor *sensor = to_cpld_sensor(devattr);
|
struct cpld_sensor *sensor = to_cpld_sensor(devattr);
|
||||||
u8 i, values[MAX_RESP_LENGTH/8];
|
u8 i, values[MAX_PORT_NUM/8];
|
||||||
|
|
||||||
|
/*In case, the registers out-of-order*/
|
||||||
if (sensor->reg < 0) {
|
if (sensor->reg < 0) {
|
||||||
return show_presnet_all_distinct(dev, devattr, buf);
|
return show_presnet_all_distinct(dev, devattr, buf);
|
||||||
}
|
}
|
||||||
@ -683,12 +685,11 @@ static int add_attributes_portly(struct cpld_data *data, struct attrs **pa)
|
|||||||
|
|
||||||
for (i = 0; pa[i]; i++) {
|
for (i = 0; pa[i]; i++) {
|
||||||
a = pa[i];
|
a = pa[i];
|
||||||
|
|
||||||
invert = a->invert;
|
|
||||||
b = a->base;
|
b = a->base;
|
||||||
if (b == NULL)
|
if (b == NULL)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
invert = a->invert;
|
||||||
for (j = 0; j < data->sfp_num; j++)
|
for (j = 0; j < data->sfp_num; j++)
|
||||||
{
|
{
|
||||||
snprintf(name, NAME_SIZE, "%s_%d", b->name, j+1);
|
snprintf(name, NAME_SIZE, "%s_%d", b->name, j+1);
|
||||||
|
Loading…
Reference in New Issue
Block a user