|
5 | 5 |
|
6 | 6 | try:
|
7 | 7 | import time
|
| 8 | + import string |
| 9 | + from ctypes import create_string_buffer |
8 | 10 | from sonic_sfp.sfputilbase import SfpUtilBase
|
9 | 11 | except ImportError as e:
|
10 | 12 | raise ImportError("%s - required module not found" % str(e))
|
@@ -193,11 +195,63 @@ def get_presence(self, port_num):
|
193 | 195 |
|
194 | 196 | return False
|
195 | 197 |
|
196 |
| - def get_low_power_mode(self, port_num): |
197 |
| - raise NotImplementedError |
| 198 | + def get_low_power_mode(self, port_num): |
| 199 | + # Check for invalid port_num |
| 200 | + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: |
| 201 | + return False |
198 | 202 |
|
199 |
| - def set_low_power_mode(self, port_num, lpmode): |
200 |
| - raise NotImplementedError |
| 203 | + try: |
| 204 | + eeprom = None |
| 205 | + |
| 206 | + if not self.get_presence(port_num): |
| 207 | + return False |
| 208 | + |
| 209 | + eeprom = open(self.port_to_eeprom_mapping[port_num], "rb") |
| 210 | + eeprom.seek(93) |
| 211 | + lpmode = ord(eeprom.read(1)) |
| 212 | + |
| 213 | + if ((lpmode & 0x3) == 0x1): |
| 214 | + return False # High Power Mode if "Power override" bit is 1 and "Power set" bit is 0 |
| 215 | + else: |
| 216 | + return True # Low Power Mode if one of the following conditions is matched: |
| 217 | + # 1. Power override" bit is 0 |
| 218 | + # 2. Power override" bit is 1 and "Power set" bit is 1 |
| 219 | + except IOError as e: |
| 220 | + print "Error: unable to open file: %s" % str(e) |
| 221 | + return False |
| 222 | + finally: |
| 223 | + if eeprom is not None: |
| 224 | + eeprom.close() |
| 225 | + time.sleep(0.01) |
| 226 | + |
| 227 | + def set_low_power_mode(self, port_num, lpmode): |
| 228 | + # Check for invalid port_num |
| 229 | + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: |
| 230 | + return False |
| 231 | + |
| 232 | + try: |
| 233 | + eeprom = None |
| 234 | + |
| 235 | + if not self.get_presence(port_num): |
| 236 | + return False # Port is not present, unable to set the eeprom |
| 237 | + |
| 238 | + # Fill in write buffer |
| 239 | + regval = 0x3 if lpmode else 0x1 # 0x3:Low Power Mode, 0x1:High Power Mode |
| 240 | + buffer = create_string_buffer(1) |
| 241 | + buffer[0] = chr(regval) |
| 242 | + |
| 243 | + # Write to eeprom |
| 244 | + eeprom = open(self.port_to_eeprom_mapping[port_num], "r+b") |
| 245 | + eeprom.seek(93) |
| 246 | + eeprom.write(buffer[0]) |
| 247 | + return True |
| 248 | + except IOError as e: |
| 249 | + print "Error: unable to open file: %s" % str(e) |
| 250 | + return False |
| 251 | + finally: |
| 252 | + if eeprom is not None: |
| 253 | + eeprom.close() |
| 254 | + time.sleep(0.01) |
201 | 255 |
|
202 | 256 | def reset(self, port_num):
|
203 | 257 | raise NotImplementedError
|
|
0 commit comments