Skip to content

Commit 1f4325e

Browse files
authored
[Inventec][D6356] Update Inventec 6356 (#3839)
* [Inventec][D6356] Update Inventec 6356 1.[Platform API] Add get_change_event implementation for Chassis class 2.[Platforn monitor] skip ledd to avoid pmon init failure
1 parent ab1a945 commit 1f4325e

File tree

5 files changed

+170
-20
lines changed

5 files changed

+170
-20
lines changed

device/inventec/x86_64-inventec_d6356-r0/led_proc_init.soc

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#led auto off
2-
#led stop
31
m0 load 0 0x0 /usr/share/sonic/platform/linkscan_led_fw.bin
42
m0 load 0 0x3800 /usr/share/sonic/platform/custom_led.bin
53
led auto on
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"skip_ledd": true
3+
}
4+

platform/broadcom/sonic-platform-modules-inventec/d6356/sonic_platform/chassis.py

+36
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from sonic_platform.sfp import Sfp
1515
from sonic_platform.qsfp import QSfp
1616
from sonic_platform.thermal import Thermal
17+
from sonic_platform.transceiver_event import TransceiverEvent
1718
except ImportError as e:
1819
raise ImportError(str(e) + "- required module not found")
1920

@@ -53,6 +54,8 @@ def __init__(self):
5354
thermal = Thermal(index)
5455
self._thermal_list.append(thermal)
5556

57+
# Initialize TRANSCEIVER EVENT MONITOR
58+
self.__xcvr_event = TransceiverEvent()
5659

5760
##############################################
5861
# Device methods
@@ -147,3 +150,36 @@ def get_reboot_cause(self):
147150
to pass a description of the reboot cause.
148151
"""
149152
raise NotImplementedError
153+
154+
##############################################
155+
# Other methods
156+
##############################################
157+
158+
def get_change_event(self, timeout=0):
159+
"""
160+
Returns a nested dictionary containing all devices which have
161+
experienced a change at chassis level
162+
163+
Args:
164+
timeout: Timeout in milliseconds (optional). If timeout == 0,
165+
this method will block until a change is detected.
166+
167+
Returns:
168+
(bool, dict):
169+
- True if call successful, False if not;
170+
- A nested dictionary where key is a device type,
171+
value is a dictionary with key:value pairs in the format of
172+
{'device_id':'device_event'},
173+
where device_id is the device ID for this device and
174+
device_event,
175+
status='1' represents device inserted,
176+
status='0' represents device removed.
177+
Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}}
178+
indicates that fan 0 has been removed, fan 2
179+
has been inserted and sfp 11 has been removed.
180+
"""
181+
182+
rc, xcvr_event = self.__xcvr_event.get_transceiver_change_event(timeout)
183+
184+
return rc, {'sfp': xcvr_event}
185+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
#!/usr/bin/env python
2+
#
3+
# Name: transceiver_event.py, version: 1.0
4+
#
5+
6+
try:
7+
import time
8+
import socket
9+
import re
10+
import os
11+
from collections import OrderedDict
12+
except ImportError as e:
13+
raise ImportError("%s - required module not found" % str(e))
14+
15+
16+
class NetlinkEventMonitor(object):
17+
__instance = None
18+
19+
def __new__(cls, *args, **kwargs):
20+
if not cls.__instance:
21+
# print(cls)
22+
cls.__instance = super(NetlinkEventMonitor, cls).__new__(cls)
23+
cls.__instance.__recieved_events = OrderedDict()
24+
return cls.__instance
25+
26+
def __init__(self, timeout):
27+
# print('__init__', self)
28+
NETLINK_KOBJECT_UEVENT = 15
29+
self.__socket = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, NETLINK_KOBJECT_UEVENT)
30+
self.__timeout = timeout
31+
32+
def start(self):
33+
# print('start', self.__timeout)
34+
self.__socket.bind((os.getpid(), -1))
35+
if 0 == self.__timeout:
36+
self.__socket.settimeout(None)
37+
else:
38+
self.__socket.settimeout(self.__timeout/1000.0)
39+
40+
def stop(self):
41+
self.__socket.close()
42+
43+
def __enter__(self):
44+
# print('__enter__', self)
45+
self.start()
46+
return self
47+
48+
def __exit__(self, exc_type, exc_value, traceback):
49+
# print('__exit__', self)
50+
self.stop()
51+
52+
def __iter__(self):
53+
# print('__iter__', self)
54+
while True:
55+
for item in self.next_events():
56+
yield item
57+
58+
def next_events(self):
59+
try:
60+
data = self.__socket.recv(16384)
61+
event = {}
62+
for item in data.split(b'\x00'):
63+
if not item:
64+
# check if we have an event and if we already received it
65+
if event and 'SEQNUM' in event:
66+
event_seqnum = event['SEQNUM']
67+
if event_seqnum in self.__recieved_events:
68+
pass
69+
else:
70+
# print("=", event_seqnum)
71+
self.__recieved_events[event_seqnum] = event
72+
length = len(self.__recieved_events)
73+
# print("=", length)
74+
if (length > 100):
75+
self.__recieved_events.popitem(last=False)
76+
yield event
77+
event = {}
78+
else:
79+
try:
80+
k, v = item.split(b'=', 1)
81+
event[k.decode('ascii')] = v.decode('ascii')
82+
# print("=",k,v)
83+
except ValueError:
84+
pass
85+
except Exception:
86+
yield {}
87+
88+
class TransceiverEvent(object):
89+
90+
def __init__(self):
91+
pass
92+
93+
def get_transceiver_change_event(self, timeout=0):
94+
port_dict = {}
95+
with NetlinkEventMonitor(timeout) as netlink_monitor:
96+
for event in netlink_monitor:
97+
if event and 'SUBSYSTEM' in event:
98+
if event['SUBSYSTEM'] == 'swps':
99+
#print('SWPS event. From %s, ACTION %s, IF_TYPE %s, IF_LANE %s' % (event['DEVPATH'], event['ACTION'], event['IF_TYPE'], event['IF_LANE']))
100+
portname = event['DEVPATH'].split("/")[-1]
101+
rc = re.match(r"port(?P<num>\d+)",portname)
102+
if rc is not None:
103+
if event['ACTION'] == "remove":
104+
remove_num = int(rc.group("num"))
105+
port_dict[remove_num] = "0"
106+
elif event['ACTION'] == "add":
107+
add_num = int(rc.group("num"))
108+
port_dict[add_num] = "1"
109+
return True, port_dict
110+
else:
111+
return False, {}
112+
else:
113+
pass
114+
else:
115+
return True, {}
116+

platform/broadcom/sonic-platform-modules-inventec/debian/platform-modules-d6356.init

+14-18
Original file line numberDiff line numberDiff line change
@@ -29,30 +29,26 @@ do_monitor_stop() {
2929

3030
case "$1" in
3131
start)
32-
echo -n "Setting up board... "
33-
34-
# depmod -a
35-
/usr/local/bin/inventec_d6356_util.py -f install
36-
do_monitor_${1}
37-
echo "done."
38-
;;
32+
echo -n "Setting up board... "
33+
/usr/local/bin/inventec_d6356_util.py -f install
34+
do_monitor_${1}
35+
echo "done."
36+
;;
3937

4038
stop)
41-
42-
/usr/local/bin/inventec_d6356_util.py -f clean
43-
do_monitor_${1}
44-
echo "done."
45-
46-
;;
39+
/usr/local/bin/inventec_d6356_util.py -f clean
40+
do_monitor_${1}
41+
echo "done."
42+
;;
4743

4844
force-reload|restart)
49-
echo "Not supported"
50-
;;
45+
echo "Not supported"
46+
;;
5147

5248
*)
53-
echo "Usage: /etc/init.d/platform-modules-d6356.init {start|stop}"
54-
exit 1
55-
;;
49+
echo "Usage: /etc/init.d/platform-modules-d6356.init {start|stop}"
50+
exit 1
51+
;;
5652
esac
5753

5854
exit 0

0 commit comments

Comments
 (0)