Skip to content

Commit 754c0b1

Browse files
akokhanlguohan
authored andcommitted
[platform]: BFN platform modules update (#3389)
* Fixed initial state for eeprom.py and sfputil.py when thrift server is down * Added transceiver plug-in/out event processing Signed-off-by: Andriy Kokhan <[email protected]>
1 parent f920560 commit 754c0b1

File tree

3 files changed

+116
-19
lines changed

3 files changed

+116
-19
lines changed

device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/eeprom.py

+24-14
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import sys
1010
import errno
1111
import datetime
12+
import logging
13+
import logging.config
14+
import yaml
1215

1316
sys.path.append(os.path.dirname(__file__))
1417
import pltfm_mgr_rpc
@@ -71,13 +74,17 @@
7174
pltfm_mgr = None
7275

7376
EEPROM_SYMLINK = "/var/run/platform/eeprom/syseeprom"
74-
77+
EEPROM_STATUS = "/var/run/platform/eeprom/status"
7578

7679
class board(eeprom_tlvinfo.TlvInfoDecoder):
77-
RETRIES = 30
80+
RETRIES = 3
7881

7982
def __init__(self, name, path, cpld_root, ro):
8083

84+
with open(os.path.dirname(__file__) + "/logging.conf", 'r') as f:
85+
config_dict = yaml.load(f)
86+
logging.config.dictConfig(config_dict)
87+
8188
if not os.path.exists(os.path.dirname(EEPROM_SYMLINK)):
8289
try:
8390
os.makedirs(os.path.dirname(EEPROM_SYMLINK))
@@ -86,19 +93,17 @@ def __init__(self, name, path, cpld_root, ro):
8693
raise
8794

8895
open(EEPROM_SYMLINK, 'a').close()
96+
f = open(EEPROM_STATUS, 'w')
97+
f.write("initializing..")
98+
f.close()
8999

90100
self.eeprom_path = EEPROM_SYMLINK
91-
super(board, self).__init__(self.eeprom_path, 0, '', True)
101+
super(board, self).__init__(self.eeprom_path, 0, EEPROM_STATUS, True)
92102

93-
for attempt in range(self.RETRIES + 1):
94-
if not self.eeprom_init():
95-
time.sleep(1)
96-
else:
103+
for attempt in range(self.RETRIES):
104+
if self.eeprom_init() or (attempt + 1 >= self.RETRIES):
97105
break
98-
99-
if attempt == self.RETRIES:
100-
raise RuntimeError("Could not initialize syseeprom")
101-
106+
time.sleep(1)
102107

103108
def thrift_setup(self):
104109
global thrift_server, transport, pltfm_mgr
@@ -119,13 +124,18 @@ def thrift_teardown(self):
119124

120125
def eeprom_init(self):
121126
global pltfm_mgr
127+
122128
try:
123-
self.thrift_setup()
124-
eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get()
125-
self.thrift_teardown()
129+
self.thrift_setup()
130+
eeprom = pltfm_mgr.pltfm_mgr_sys_eeprom_get()
131+
self.thrift_teardown()
126132
except:
127133
return False
128134

135+
f = open(EEPROM_STATUS, 'w')
136+
f.write("ok")
137+
f.close()
138+
129139
eeprom_params = ""
130140
for attr, val in eeprom.__dict__.iteritems():
131141
if val is None:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
version: 1
2+
disable_existing_loggers: False
3+
4+
formatters:
5+
simple:
6+
format: '%(asctime)s %(name)-30s %(levelname)-7s %(message)s'
7+
8+
handlers:
9+
file:
10+
class: logging.handlers.RotatingFileHandler
11+
formatter: simple
12+
filename: /var/log/platform.log
13+
14+
root:
15+
level: ERROR
16+
handlers:
17+
- file

device/barefoot/x86_64-accton_wedge100bf_32x-r0/plugins/sfputil.py

+75-5
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class SfpUtil(SfpUtilBase):
3434
QSFP_PORT_START = 1
3535
QSFP_PORT_END = 0
3636
EEPROM_OFFSET = 0
37+
QSFP_CHECK_INTERVAL = 4
3738

3839
@property
3940
def port_start(self):
@@ -56,6 +57,11 @@ def port_to_eeprom_mapping(self):
5657
raise Exception()
5758

5859
def __init__(self):
60+
self.ready = False
61+
self.phy_port_dict = {'-1': 'system_not_ready'}
62+
self.phy_port_cur_state = {}
63+
self.qsfp_interval = self.QSFP_CHECK_INTERVAL
64+
5965
if not os.path.exists(os.path.dirname(SFP_EEPROM_CACHE)):
6066
try:
6167
os.makedirs(os.path.dirname(SFP_EEPROM_CACHE))
@@ -142,12 +148,76 @@ def reset(self, port_num):
142148
self.thrift_teardown()
143149
return status
144150

151+
def check_transceiver_change(self):
152+
if not self.ready:
153+
return
154+
155+
self.phy_port_dict = {}
156+
157+
try:
158+
self.thrift_setup()
159+
except:
160+
return
161+
162+
# Get presence of each SFP
163+
for port in range(self.port_start, self.port_end + 1):
164+
try:
165+
sfp_resent = pltfm_mgr.pltfm_mgr_qsfp_presence_get(port)
166+
except:
167+
sfp_resent = False
168+
sfp_state = '1' if sfp_resent else '0'
169+
170+
if port in self.phy_port_cur_state:
171+
if self.phy_port_cur_state[port] != sfp_state:
172+
self.phy_port_dict[port] = sfp_state
173+
else:
174+
self.phy_port_dict[port] = sfp_state
175+
176+
# Update port current state
177+
self.phy_port_cur_state[port] = sfp_state
178+
179+
self.thrift_teardown()
180+
145181
def get_transceiver_change_event(self, timeout=0):
146-
phy_port_dict = {}
147-
status = True
148-
# TODO: Process transceiver plug-in/out event
149-
time.sleep(1)
150-
return status, phy_port_dict
182+
forever = False
183+
if timeout == 0:
184+
forever = True
185+
elif timeout > 0:
186+
timeout = timeout / float(1000) # Convert to secs
187+
else:
188+
print "get_transceiver_change_event:Invalid timeout value", timeout
189+
return False, {}
190+
191+
while forever or timeout > 0:
192+
if not self.ready:
193+
try:
194+
self.thrift_setup()
195+
self.thrift_teardown()
196+
except:
197+
pass
198+
else:
199+
self.ready = True
200+
self.phy_port_dict = {}
201+
break
202+
elif self.qsfp_interval == 0:
203+
self.qsfp_interval = self.QSFP_CHECK_INTERVAL
204+
205+
# Process transceiver plug-in/out event
206+
self.check_transceiver_change()
207+
208+
# Break if tranceiver state has changed
209+
if bool(self.phy_port_dict):
210+
break
211+
212+
if timeout:
213+
timeout -= 1
214+
215+
if self.qsfp_interval:
216+
self.qsfp_interval -= 1
217+
218+
time.sleep(1)
219+
220+
return self.ready, self.phy_port_dict
151221

152222
def _get_port_eeprom_path(self, port_num, devid):
153223
eeprom_path = None

0 commit comments

Comments
 (0)