Skip to content

Commit 9f0352b

Browse files
author
Jostar Yang
committed
Fix as5835-54x xcvrd busy issue
1 parent 2cb56ba commit 9f0352b

File tree

3 files changed

+67
-40
lines changed

3 files changed

+67
-40
lines changed

platform/broadcom/sonic-platform-modules-accton/as5835-54x/sonic_platform/chassis.py

+4-40
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99
try:
1010
import sys
11-
import time
1211
from sonic_platform_pddf_base.pddf_chassis import PddfChassis
12+
from .event import SfpEvent
1313
except ImportError as e:
1414
raise ImportError(str(e) + "- required module not found")
1515

@@ -25,53 +25,17 @@ class Chassis(PddfChassis):
2525
def __init__(self, pddf_data=None, pddf_plugin_data=None):
2626
PddfChassis.__init__(self, pddf_data, pddf_plugin_data)
2727
self.__initialize_components()
28+
self._sfpevent = SfpEvent(self.get_all_sfps())
2829

2930
def __initialize_components(self):
3031
from sonic_platform.component import Component
3132
for index in range(NUM_COMPONENT):
3233
component = Component(index)
3334
self._component_list.append(component)
3435

35-
3636
# Provide the functions/variables below for which implementation is to be overwritten
37-
sfp_change_event_data = {'valid': 0, 'last': 0, 'present': 0}
38-
def get_change_event(self, timeout=2000):
39-
now = time.time()
40-
port_dict = {}
41-
change_dict = {}
42-
change_dict['sfp'] = port_dict
43-
44-
if timeout < 1000:
45-
timeout = 1000
46-
timeout = timeout / float(1000) # Convert to secs
47-
48-
if now < (self.sfp_change_event_data['last'] + timeout) and self.sfp_change_event_data['valid']:
49-
return True, change_dict
50-
51-
bitmap = 0
52-
for i in range(54):
53-
modpres = self.get_sfp(i+1).get_presence()
54-
if modpres:
55-
bitmap = bitmap | (1 << i)
56-
57-
changed_ports = self.sfp_change_event_data['present'] ^ bitmap
58-
if changed_ports:
59-
for i in range(54):
60-
if (changed_ports & (1 << i)):
61-
if (bitmap & (1 << i)) == 0:
62-
port_dict[i+1] = '0'
63-
else:
64-
port_dict[i+1] = '1'
65-
66-
67-
# Update teh cache dict
68-
self.sfp_change_event_data['present'] = bitmap
69-
self.sfp_change_event_data['last'] = now
70-
self.sfp_change_event_data['valid'] = 1
71-
return True, change_dict
72-
else:
73-
return True, change_dict
74-
37+
def get_change_event(self, timeout=0):
38+
return self._sfpevent.get_sfp_event(timeout)
7539

7640
def get_sfp(self, index):
7741
"""
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
try:
2+
import time
3+
from sonic_py_common.logger import Logger
4+
except ImportError as e:
5+
raise ImportError(repr(e) + " - required module not found")
6+
7+
POLL_INTERVAL_IN_SEC = 1
8+
9+
class SfpEvent:
10+
''' Listen to insert/remove sfp events '''
11+
12+
def __init__(self, sfp_list):
13+
self._sfp_list = sfp_list
14+
self._logger = Logger()
15+
self._sfp_change_event_data = {'present': 0}
16+
17+
def get_presence_bitmap(self):
18+
bitmap = 0
19+
for sfp in self._sfp_list:
20+
modpres = sfp.get_presence()
21+
i=sfp.get_position_in_parent() - 1
22+
if modpres:
23+
bitmap = bitmap | (1 << i)
24+
return bitmap
25+
26+
def get_sfp_event(self, timeout=2000):
27+
port_dict = {}
28+
change_dict = {}
29+
change_dict['sfp'] = port_dict
30+
31+
if timeout < 1000:
32+
cd_ms = 1000
33+
else:
34+
cd_ms = timeout
35+
36+
while cd_ms > 0:
37+
bitmap = self.get_presence_bitmap()
38+
changed_ports = self._sfp_change_event_data['present'] ^ bitmap
39+
if changed_ports != 0:
40+
break
41+
time.sleep(POLL_INTERVAL_IN_SEC)
42+
# timeout=0 means wait for event forever
43+
if timeout != 0:
44+
cd_ms = cd_ms - POLL_INTERVAL_IN_SEC * 1000
45+
46+
if changed_ports != 0:
47+
for sfp in self._sfp_list:
48+
i=sfp.get_position_in_parent() - 1
49+
if (changed_ports & (1 << i)):
50+
if (bitmap & (1 << i)) == 0:
51+
port_dict[i+1] = '0'
52+
else:
53+
port_dict[i+1] = '1'
54+
55+
56+
# Update the cache dict
57+
self._sfp_change_event_data['present'] = bitmap
58+
return True, change_dict
59+
else:
60+
return True, change_dict

platform/broadcom/sonic-platform-modules-accton/as5835-54x/sonic_platform/sfp.py

+3
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@ def __init__(self, index, pddf_data=None, pddf_plugin_data=None):
1515
PddfSfp.__init__(self, index, pddf_data, pddf_plugin_data)
1616

1717
# Provide the functions/variables below for which implementation is to be overwritten
18+
def get_position_in_parent(self):
19+
"""Retrieves 1-based relative physical position in parent device."""
20+
return self.port_index

0 commit comments

Comments
 (0)