Skip to content

Commit 37d34dd

Browse files
DellEMC Z9332f: Fix SFP issue (#11819)
* Update sfp * Update sfp * Update sfp.py
1 parent edc4485 commit 37d34dd

File tree

1 file changed

+75
-20
lines changed
  • platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform

1 file changed

+75
-20
lines changed

platform/broadcom/sonic-platform-modules-dell/z9332f/sonic_platform/sfp.py

+75-20
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
SFP_DOM_OFFSET = 256
7171

7272
SFP_STATUS_CONTROL_OFFSET = 110
73-
SFP_STATUS_CONTROL_WIDTH = 7
73+
SFP_STATUS_CONTROL_WIDTH = 1
7474
SFP_TX_DISABLE_HARD_BIT = 7
7575
SFP_TX_DISABLE_SOFT_BIT = 6
7676

@@ -912,15 +912,14 @@ def get_rx_los(self):
912912
rx_los_list = []
913913
try:
914914
if self.sfp_type == 'QSFP_DD':
915-
offset = 512
915+
offset = 2176
916916
rx_los_mask = [ 0x01, 0x02, 0x04, 0x08 ,0x10, 0x20, 0x40, 0x80 ]
917917
dom_channel_monitor_raw = self._read_eeprom_bytes(self.eeprom_path,
918-
offset + QSFP_DD_RXLOS_OFFSET, QSFP_DD_RXLOS_WIDTH)
918+
offset + 147, 1)
919919
if dom_channel_monitor_raw is not None:
920920
rx_los_data = int(dom_channel_monitor_raw[0], 8)
921921
for mask in rx_los_mask:
922-
rx_los_list.append(rx_los_data & mask != 0)
923-
922+
rx_los_list.append(bool(rx_los_data & mask != 0))
924923
elif self.sfp_type == 'QSFP':
925924
rx_los_data = self._get_eeprom_data('rx_los')
926925
# As the function expects a single boolean, if any one channel experience LOS,
@@ -962,13 +961,19 @@ def get_tx_disable(self):
962961
tx_disable_list = []
963962
try:
964963
if self.sfp_type == 'QSFP_DD':
965-
return False
964+
dom_channel_monitor_raw = self._read_eeprom_bytes(self.eeprom_path,2048 + 130, 1)
965+
if dom_channel_monitor_raw is not None:
966+
tx_disable_data = int(dom_channel_monitor_raw[0], 16)
967+
for i in range(8):
968+
tx_disable_list.append(bool(tx_disable_data & (1 << i) != 0))
969+
966970
elif self.sfp_type == 'QSFP':
967971
tx_disable_data = self._get_eeprom_data('tx_disable')
968972
for tx_disable_id in ('Tx1Disable', 'Tx2Disable', 'Tx3Disable', 'Tx4Disable'):
969973
tx_disable_list.append(tx_disable_data['data'][tx_disable_id]['value'] == 'On')
970974
else:
971-
tx_disable_data = self._read_eeprom_bytes(self.eeprom_path, SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH)
975+
offset = 256
976+
tx_disable_data = self._read_eeprom_bytes(self.eeprom_path, offset + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH)
972977
data = int(tx_disable_data[0], 16)
973978
tx_disable_hard = (sffbase().test_bit(data, SFP_TX_DISABLE_HARD_BIT) != 0)
974979
tx_disable_soft = (sffbase().test_bit(data, SFP_TX_DISABLE_SOFT_BIT) != 0)
@@ -977,19 +982,41 @@ def get_tx_disable(self):
977982
return 'N/A'
978983
return tx_disable_list
979984

985+
def tx_disable(self, tx_disable):
986+
if self.sfp_type == 'QSFP_DD':
987+
val = 0xff if tx_disable else 0x0
988+
return self._write_eeprom_bytes(2048 + 130, 1, bytearray([val]))
989+
990+
elif self.sfp_type == 'QSFP':
991+
val = 0xf if tx_disable else 0x0
992+
return self._write_eeprom_bytes( 0 + 86, 1, bytearray([val]))
993+
994+
else:
995+
offset = 256
996+
if tx_disable is True:
997+
val = 64
998+
else:
999+
val = 191
1000+
return self._write_eeprom_bytes(offset + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH, bytearray([val]))
1001+
9801002
def get_tx_disable_channel(self):
9811003
"""
9821004
Retrieves the TX disabled channels in this SFP
9831005
"""
984-
tx_disable_channel = 0
1006+
tx_disable_channel = None
9851007
try:
9861008
if self.sfp_type == 'QSFP_DD':
987-
tx_disable_channel = 0
1009+
offset = 2048
1010+
dom_channel_monitor_raw = self._read_eeprom_bytes(self.eeprom_path, offset + 130, 1)
1011+
if dom_channel_monitor_raw is not None:
1012+
tx_disable_channel = int(dom_channel_monitor_raw[0], 16)
9881013
elif self.sfp_type == 'QSFP':
9891014
tx_disable_data = self._get_eeprom_data('tx_disable')
9901015
for tx_disable_id in ('Tx1Disable', 'Tx2Disable', 'Tx3Disable', 'Tx4Disable'):
9911016
tx_disable_channel <<= 1
9921017
tx_disable_channel |= (tx_disable_data['data']['Tx1Disable']['value'] == 'On')
1018+
else:
1019+
tx_disable_channel = int(self.get_tx_disable()[0])
9931020
except (TypeError, ValueError):
9941021
return 'N/A'
9951022
return tx_disable_channel
@@ -1091,7 +1118,7 @@ def get_tx_bias(self):
10911118
return None
10921119
if not self.qsfp_dd_txbias_supported:
10931120
for lane in range(0, 8):
1094-
tx_bias_list.append("N/A")
1121+
tx_bias_list.append(False)
10951122
return tx_bias_list
10961123

10971124
tx_bias_data_raw = self._read_eeprom_bytes(self.eeprom_path, offset + QSFP_DD_TXBIAS_OFFSET, QSFP_DD_TXBIAS_WIDTH)
@@ -1128,7 +1155,7 @@ def get_rx_power(self):
11281155
return None
11291156
if not self.qsfp_dd_rxpower_supported:
11301157
for lane in range(0, 8):
1131-
rx_power_list.append("N/A")
1158+
rx_power_list.append(False)
11321159
return rx_power_list
11331160

11341161
offset = QSFP_DD_PAGE17
@@ -1165,7 +1192,7 @@ def get_tx_power(self):
11651192
return None
11661193
if not self.qsfp_dd_txpower_supported:
11671194
for lane in range(0, 8):
1168-
tx_power_list.append("N/A")
1195+
tx_power_list.append(False)
11691196
return tx_power_list
11701197

11711198
offset = QSFP_DD_PAGE17
@@ -1293,17 +1320,45 @@ def get_intl_state(self):
12931320
except ValueError: pass
12941321
return intl_state
12951322

1296-
def tx_disable(self, tx_disable):
1297-
"""
1298-
Disable SFP TX for all channels
1299-
"""
1300-
return False
1301-
13021323
def tx_disable_channel(self, channel, disable):
13031324
"""
1304-
Sets the tx_disable for specified SFP channels
1325+
Enables/Disables TX channel for SFP based on disable flag
13051326
"""
1306-
return False
1327+
channel_state = self.get_tx_disable_channel()
1328+
if channel_state is None or channel_state == 'N/A':
1329+
return False
1330+
if self.sfp_type == 'QSFP_DD':
1331+
for i in range(8):
1332+
mask = (1 << i)
1333+
if not (channel & mask):
1334+
continue
1335+
if disable:
1336+
channel_state |= mask
1337+
else:
1338+
channel_state &= ~mask
1339+
return self._write_eeprom_bytes(2048 + 130, 1, bytearray([channel_state]))
1340+
elif self.sfp_type == 'QSFP':
1341+
for i in range(4):
1342+
mask = (1 << i)
1343+
if not (channel & mask):
1344+
continue
1345+
if disable:
1346+
channel_state |= mask
1347+
else:
1348+
channel_state &= ~mask
1349+
return self._write_eeprom_bytes(86, 1, bytearray([channel_state]))
1350+
else:
1351+
channel_state = self.get_tx_disable_channel()
1352+
if channel_state is None or channel_state == "N/A":
1353+
return False
1354+
offset = 256
1355+
mask = (1 << 0)
1356+
if disable:
1357+
channel_state |= mask
1358+
else:
1359+
channel_state &= ~mask
1360+
1361+
return self._write_eeprom_bytes(offset + SFP_STATUS_CONTROL_OFFSET, SFP_STATUS_CONTROL_WIDTH, bytearray([channel_state]))
13071362

13081363
def set_power_override(self, power_override, power_set):
13091364
"""

0 commit comments

Comments
 (0)