Skip to content

Commit 0b8c1a1

Browse files
brandonchuanglguohan
authored andcommitted
[devices]: Add lpmode in sfputil.py for Accton AS6712-32X (#3095)
Signed-off-by: brandon_chuang <[email protected]>
1 parent 8c3fdfd commit 0b8c1a1

File tree

2 files changed

+209
-153
lines changed

2 files changed

+209
-153
lines changed

device/accton/x86_64-accton_as6712_32x-r0/plugins/sfputil.py

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
try:
77
import time
88
import os
9+
import string
10+
from ctypes import create_string_buffer
911
from sonic_sfp.sfputilbase import SfpUtilBase
1012
except ImportError as e:
1113
raise ImportError("%s - required module not found" % str(e))
@@ -176,11 +178,85 @@ def get_presence(self, port_num):
176178

177179
return False
178180

181+
def get_low_power_mode_cpld(self, port_num):
182+
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
183+
return False
184+
185+
cpld_path = self.get_cpld_dev_path(port_num)
186+
_path = cpld_path + "/module_lp_mode_"
187+
_path += str(self._port_to_i2c_mapping[port_num][0])
188+
189+
try:
190+
reg_file = open(_path)
191+
except IOError as e:
192+
print "Error: unable to open file: %s" % str(e)
193+
return False
194+
195+
content = reg_file.readline().rstrip()
196+
reg_file.close()
197+
198+
# content is a string, either "0" or "1"
199+
if content == "1":
200+
return True
201+
202+
return False
203+
179204
def get_low_power_mode(self, port_num):
180-
raise NotImplementedError
205+
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
206+
return False
207+
208+
if not self.get_presence(port_num):
209+
return False
181210

182-
def set_low_power_mode(self, port_num, lpmode):
183-
raise NotImplementedError
211+
try:
212+
eeprom = None
213+
214+
eeprom = open(self.port_to_eeprom_mapping[port_num], mode="rb", buffering=0)
215+
eeprom.seek(93)
216+
lpmode = ord(eeprom.read(1))
217+
218+
if not (lpmode & 0x1): # 'Power override' bit is 0
219+
return self.get_low_power_mode_cpld(port_num)
220+
else:
221+
if ((lpmode & 0x2) == 0x2):
222+
return True # Low Power Mode if "Power set" bit is 1
223+
else:
224+
return False # High Power Mode if "Power set" bit is 0
225+
except IOError as e:
226+
print "Error: unable to open file: %s" % str(e)
227+
return False
228+
finally:
229+
if eeprom is not None:
230+
eeprom.close()
231+
time.sleep(0.01)
232+
233+
def set_low_power_mode(self, port_num, lpmode):
234+
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
235+
return False
236+
237+
try:
238+
eeprom = None
239+
240+
if not self.get_presence(port_num):
241+
return False # Port is not present, unable to set the eeprom
242+
243+
# Fill in write buffer
244+
regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode
245+
buffer = create_string_buffer(1)
246+
buffer[0] = chr(regval)
247+
248+
# Write to eeprom
249+
eeprom = open(self.port_to_eeprom_mapping[port_num], mode="r+b", buffering=0)
250+
eeprom.seek(93)
251+
eeprom.write(buffer[0])
252+
return True
253+
except IOError as e:
254+
print "Error: unable to open file: %s" % str(e)
255+
return False
256+
finally:
257+
if eeprom is not None:
258+
eeprom.close()
259+
time.sleep(0.01)
184260

185261
def reset(self, port_num):
186262
if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:

0 commit comments

Comments
 (0)