|
6 | 6 | try:
|
7 | 7 | import time
|
8 | 8 | import os
|
| 9 | + import string |
| 10 | + from ctypes import create_string_buffer |
9 | 11 | from sonic_sfp.sfputilbase import SfpUtilBase
|
10 | 12 | except ImportError as e:
|
11 | 13 | raise ImportError("%s - required module not found" % str(e))
|
@@ -176,11 +178,85 @@ def get_presence(self, port_num):
|
176 | 178 |
|
177 | 179 | return False
|
178 | 180 |
|
| 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 | + |
179 | 204 | 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 |
181 | 210 |
|
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) |
184 | 260 |
|
185 | 261 | def reset(self, port_num):
|
186 | 262 | if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end:
|
|
0 commit comments