From 43aa19ca9b73498b3222d475557e001618ff43d1 Mon Sep 17 00:00:00 2001 From: Harish Venkatraman Date: Sat, 16 Feb 2019 09:59:51 -0800 Subject: [PATCH] [dell/Z9100] Fix for optics not detected in fanout mode (#2496) * [dell/Z9100] Fix for optics not detected in fanout mode This commit fixes the issue of optics not detected error while running sfputil show eeprom command. The root casuse was the value of port index from port_config.ini for fan out scenario. The port index should be starting from 0 and not 1. Platform cpld registers are assuming the port numbers to start from 0 (lowermost bit), sfputils.py uses this port number in get_presence function. Since the indexing passed is wrong the optics was not detected and gave SFP EEPROM not detected message. Signed-off-by: Harish Venkatraman * [dell/z9100] Fix for optics not detected in fanout mode This commit fixes the issue of optics not detected error while running sfputil show eeprom command. The root cause was wrong port_index in fan out scenarios. Earlier fix of changing the port_config.ini is reverted and changes made in z9100 platform specific sfputil.py file. The port number is decrement and tested for both 100G and 50G fanout cases. Tested for the following show commands and test was succesful show interfaces status, show interfaces transceiver eeprom, show interfaces transceiver lpmode, show interface tranceiver presence. Signed-off-by: Harish Venkatraman --- .../plugins/sfputil.py | 177 +++++++----------- 1 file changed, 68 insertions(+), 109 deletions(-) diff --git a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py index 4cccfbb291f4..49caa2bd1848 100644 --- a/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py @@ -16,15 +16,15 @@ class SfpUtil(SfpUtilBase): """Platform-specific SfpUtil class""" - PORT_START = 0 - PORT_END = 31 + PORT_START = 1 + PORT_END = 32 PORTS_IN_BLOCK = 32 - IOM_1_PORT_START = 0 - IOM_1_PORT_END = 11 - IOM_2_PORT_START = 12 - IOM_2_PORT_END = 21 - IOM_3_PORT_START = 22 - IOM_3_PORT_END = 31 + IOM_1_PORT_START = 1 + IOM_1_PORT_END = 12 + IOM_2_PORT_START = 13 + IOM_2_PORT_END = 22 + IOM_3_PORT_START = 23 + IOM_3_PORT_END = 32 BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{0}-003e/" OIR_FD_PATH = "/sys/devices/platform/dell_ich.0/sci_int_gpio_sus6" @@ -33,38 +33,39 @@ class SfpUtil(SfpUtilBase): epoll = -1 _port_to_eeprom_mapping = {} _port_to_i2c_mapping = { - 0: [9, 18], - 1: [9, 19], - 2: [9, 20], - 3: [9, 21], - 4: [9, 22], - 5: [9, 23], - 6: [9, 24], - 7: [9, 25], - 8: [8, 26], - 9: [8, 27], - 10: [8, 28], - 11: [8, 29], - 12: [8, 31], # reordered - 13: [8, 30], - 14: [8, 33], # reordered - 15: [8, 32], - 16: [7, 34], - 17: [7, 35], - 18: [7, 36], - 19: [7, 37], - 20: [7, 38], - 21: [7, 39], - 22: [7, 40], - 23: [7, 41], - 24: [6, 42], - 25: [6, 43], - 26: [6, 44], - 27: [6, 45], - 28: [6, 46], - 29: [6, 47], - 30: [6, 48], - 31: [6, 49] + 0: [0, 00], # Dummy Entry + 1: [9, 18], + 2: [9, 19], + 3: [9, 20], + 4: [9, 21], + 5: [9, 22], + 6: [9, 23], + 7: [9, 24], + 8: [9, 25], + 9: [8, 26], + 10: [8, 27], + 11: [8, 28], + 12: [8, 29], + 13: [8, 31], # reordered + 14: [8, 30], + 15: [8, 33], # reordered + 16: [8, 32], + 17: [7, 34], + 18: [7, 35], + 19: [7, 36], + 20: [7, 37], + 21: [7, 38], + 22: [7, 39], + 23: [7, 40], + 24: [7, 41], + 25: [6, 42], + 26: [6, 43], + 27: [6, 44], + 28: [6, 45], + 29: [6, 46], + 30: [6, 47], + 31: [6, 48], + 32: [6, 49] } @property @@ -127,13 +128,10 @@ def __del__(self): self.epoll.close() self.oir_fd.close() - def get_presence(self, port_num): - - global i2c_line - + def normalize_port(self, port_num): # Check for invalid port_num if port_num < self.port_start or port_num > self.port_end: - return False + return -1, -1 # port_num and i2c match if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: i2c_line = 14 @@ -144,6 +142,24 @@ def get_presence(self, port_num): port_num <= self.iom3_port_end): i2c_line = 16 + # Rationalize port settings + if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: + port_num = port_num - 1 + elif port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: + port_num = (port_num - 1) % 12 + elif (port_num >= self.iom3_port_start and + port_num <= self.iom3_port_end): + port_num = (port_num - 1) % 22 + + return i2c_line, port_num + + + def get_presence(self, port_num): + + i2c_line, port_num = self.normalize_port(port_num) + if port_num == -1: + return False + try: qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_modprs" reg_file = open(qsfp_path, "r") @@ -161,13 +177,6 @@ def get_presence(self, port_num): # content is a string containing the hex representation of the register reg_value = int(content, 16) - # Rationalize port settings - if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: - port_num = port_num % 12 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - port_num = port_num % 22 - # Mask off the bit corresponding to our port mask = (1 << port_num) @@ -179,20 +188,10 @@ def get_presence(self, port_num): def get_low_power_mode(self, port_num): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: + i2c_line, port_num = self.normalize_port(port_num) + if port_num == -1: return False - # port_num and i2c match - if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: - i2c_line = 14 - elif (port_num >= self.iom2_port_start and - port_num <= self.iom2_port_end): - i2c_line = 15 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - i2c_line = 16 - try: qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" reg_file = open(qsfp_path, "r") @@ -210,13 +209,6 @@ def get_low_power_mode(self, port_num): # content is a string containing the hex representation of the register reg_value = int(content, 16) - # Rationalize port settings - if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: - port_num = port_num % 12 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - port_num = port_num % 22 - # Mask off the bit corresponding to our port mask = (1 << port_num) @@ -228,24 +220,15 @@ def get_low_power_mode(self, port_num): def set_low_power_mode(self, port_num, lpmode): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: + i2c_line, port_num = self.normalize_port(port_num) + if port_num == -1: return False - # port_num and i2c match - if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: - i2c_line = 14 - elif (port_num >= self.iom2_port_start and - port_num <= self.iom2_port_end): - i2c_line = 15 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - i2c_line = 16 - try: qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" reg_file = open(qsfp_path, "r+") + except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -259,13 +242,6 @@ def set_low_power_mode(self, port_num, lpmode): # content is a string containing the hex representation of the register reg_value = int(content, 16) - # Rationalize port settings - if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: - port_num = port_num % 12 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - port_num = port_num % 22 - # Mask off the bit corresponding to our port mask = (1 << port_num) # LPMode is active high; set or clear the bit accordingly @@ -285,20 +261,10 @@ def set_low_power_mode(self, port_num, lpmode): def reset(self, port_num): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: + i2c_line, port_num = self.normalize_port(port_num) + if port_num == -1: return False - # port_num and i2c match - if port_num >= self.iom1_port_start and port_num <= self.iom1_port_end: - i2c_line = 14 - elif (port_num >= self.iom2_port_start and - port_num <= self.iom2_port_end): - i2c_line = 15 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - i2c_line = 16 - try: qsfp_path = self.BASE_VAL_PATH.format(i2c_line)+"qsfp_lpmode" reg_file = open(qsfp_path, "r+") @@ -312,13 +278,6 @@ def reset(self, port_num): # File content is a string containing the hex representation of th reg_value = int(content, 16) - # Rationalize port settings - if port_num >= self.iom2_port_start and port_num <= self.iom2_port_end: - port_num = port_num % 12 - elif (port_num >= self.iom3_port_start and - port_num <= self.iom3_port_end): - port_num = port_num % 22 - # Mask off the bit corresponding to our port mask = (1 << port_num)