Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dell/Z9100] Fix for optics not detected in fanout mode #2496

Merged
merged 2 commits into from
Feb 16, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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