Skip to content

Commit

Permalink
[dell/Z9100] Fix for optics not detected in fanout mode (#2496)
Browse files Browse the repository at this point in the history
* [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 <Harish_Venkatraman@Dell.com>

* [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 <Harish_Venkatraman@Dell.com>
  • Loading branch information
vharish02 authored and lguohan committed Feb 16, 2019
1 parent 2dd769b commit 43aa19c
Showing 1 changed file with 68 additions and 109 deletions.
177 changes: 68 additions & 109 deletions device/dell/x86_64-dell_z9100_c2538-r0/plugins/sfputil.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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")
Expand All @@ -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)

Expand All @@ -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")
Expand All @@ -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)

Expand All @@ -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
Expand All @@ -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
Expand All @@ -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+")
Expand All @@ -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)

Expand Down

0 comments on commit 43aa19c

Please sign in to comment.