70
70
SFP_DOM_OFFSET = 256
71
71
72
72
SFP_STATUS_CONTROL_OFFSET = 110
73
- SFP_STATUS_CONTROL_WIDTH = 7
73
+ SFP_STATUS_CONTROL_WIDTH = 1
74
74
SFP_TX_DISABLE_HARD_BIT = 7
75
75
SFP_TX_DISABLE_SOFT_BIT = 6
76
76
@@ -912,15 +912,14 @@ def get_rx_los(self):
912
912
rx_los_list = []
913
913
try :
914
914
if self .sfp_type == 'QSFP_DD' :
915
- offset = 512
915
+ offset = 2176
916
916
rx_los_mask = [ 0x01 , 0x02 , 0x04 , 0x08 ,0x10 , 0x20 , 0x40 , 0x80 ]
917
917
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 )
919
919
if dom_channel_monitor_raw is not None :
920
920
rx_los_data = int (dom_channel_monitor_raw [0 ], 8 )
921
921
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 ))
924
923
elif self .sfp_type == 'QSFP' :
925
924
rx_los_data = self ._get_eeprom_data ('rx_los' )
926
925
# As the function expects a single boolean, if any one channel experience LOS,
@@ -962,13 +961,19 @@ def get_tx_disable(self):
962
961
tx_disable_list = []
963
962
try :
964
963
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
+
966
970
elif self .sfp_type == 'QSFP' :
967
971
tx_disable_data = self ._get_eeprom_data ('tx_disable' )
968
972
for tx_disable_id in ('Tx1Disable' , 'Tx2Disable' , 'Tx3Disable' , 'Tx4Disable' ):
969
973
tx_disable_list .append (tx_disable_data ['data' ][tx_disable_id ]['value' ] == 'On' )
970
974
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 )
972
977
data = int (tx_disable_data [0 ], 16 )
973
978
tx_disable_hard = (sffbase ().test_bit (data , SFP_TX_DISABLE_HARD_BIT ) != 0 )
974
979
tx_disable_soft = (sffbase ().test_bit (data , SFP_TX_DISABLE_SOFT_BIT ) != 0 )
@@ -977,19 +982,41 @@ def get_tx_disable(self):
977
982
return 'N/A'
978
983
return tx_disable_list
979
984
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
+
980
1002
def get_tx_disable_channel (self ):
981
1003
"""
982
1004
Retrieves the TX disabled channels in this SFP
983
1005
"""
984
- tx_disable_channel = 0
1006
+ tx_disable_channel = None
985
1007
try :
986
1008
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 )
988
1013
elif self .sfp_type == 'QSFP' :
989
1014
tx_disable_data = self ._get_eeprom_data ('tx_disable' )
990
1015
for tx_disable_id in ('Tx1Disable' , 'Tx2Disable' , 'Tx3Disable' , 'Tx4Disable' ):
991
1016
tx_disable_channel <<= 1
992
1017
tx_disable_channel |= (tx_disable_data ['data' ]['Tx1Disable' ]['value' ] == 'On' )
1018
+ else :
1019
+ tx_disable_channel = int (self .get_tx_disable ()[0 ])
993
1020
except (TypeError , ValueError ):
994
1021
return 'N/A'
995
1022
return tx_disable_channel
@@ -1091,7 +1118,7 @@ def get_tx_bias(self):
1091
1118
return None
1092
1119
if not self .qsfp_dd_txbias_supported :
1093
1120
for lane in range (0 , 8 ):
1094
- tx_bias_list .append ("N/A" )
1121
+ tx_bias_list .append (False )
1095
1122
return tx_bias_list
1096
1123
1097
1124
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):
1128
1155
return None
1129
1156
if not self .qsfp_dd_rxpower_supported :
1130
1157
for lane in range (0 , 8 ):
1131
- rx_power_list .append ("N/A" )
1158
+ rx_power_list .append (False )
1132
1159
return rx_power_list
1133
1160
1134
1161
offset = QSFP_DD_PAGE17
@@ -1165,7 +1192,7 @@ def get_tx_power(self):
1165
1192
return None
1166
1193
if not self .qsfp_dd_txpower_supported :
1167
1194
for lane in range (0 , 8 ):
1168
- tx_power_list .append ("N/A" )
1195
+ tx_power_list .append (False )
1169
1196
return tx_power_list
1170
1197
1171
1198
offset = QSFP_DD_PAGE17
@@ -1293,17 +1320,45 @@ def get_intl_state(self):
1293
1320
except ValueError : pass
1294
1321
return intl_state
1295
1322
1296
- def tx_disable (self , tx_disable ):
1297
- """
1298
- Disable SFP TX for all channels
1299
- """
1300
- return False
1301
-
1302
1323
def tx_disable_channel (self , channel , disable ):
1303
1324
"""
1304
- Sets the tx_disable for specified SFP channels
1325
+ Enables/Disables TX channel for SFP based on disable flag
1305
1326
"""
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 ]))
1307
1362
1308
1363
def set_power_override (self , power_override , power_set ):
1309
1364
"""
0 commit comments