[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:
Roy Lee 2019-07-25 03:14:43 +08:00 committed by lguohan
parent 9d64ce761f
commit efe9438c61
25 changed files with 1526 additions and 1189 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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, {}

View 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

View File

@ -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, {}

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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, {}

View File

@ -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

View File

@ -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, {}

View File

@ -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

View File

@ -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, {}

View File

@ -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

View File

@ -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, {}

View File

@ -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

View File

@ -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, {}

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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:])

View File

@ -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);

View File

@ -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:

View File

@ -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, &reg, &num); get_present_reg_distinct(data->model, i, &cpld_addr, &reg, &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);