From d1a7a784e798fb53e708c7749803f81d0993f384 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Wed, 13 Feb 2019 02:15:54 -0500 Subject: [PATCH 1/8] DellEMC S6000, xcvrd support --- .../plugins/sfputil.py | 64 +++++++++++++++++-- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 9275c4c9b6fb..3dcece8e7d9d 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -20,6 +20,7 @@ class SfpUtil(SfpUtilBase): EEPROM_OFFSET = 20 _port_to_eeprom_mapping = {} + port_dict = {} @property def port_start(self): @@ -37,12 +38,30 @@ def qsfp_ports(self): def port_to_eeprom_mapping(self): return self._port_to_eeprom_mapping + @property + def transceiver_status(self): + return self.modprs_register + def __init__(self): + port = self.port_start eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" for x in range(0, self.port_end + 1): self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + # Get Transceiver status + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + self.modprs_register = int(content, 16) + SfpUtilBase.__init__(self) def get_presence(self, port_num): @@ -175,9 +194,42 @@ def reset(self, port_num): return True def get_transceiver_change_event(self): - """ - TODO: This function need to be implemented - when decide to support monitoring SFP(Xcvrd) - on this platform. - """ - raise NotImplementedError + + port_dict = {} + port = self.port_start + + try: + reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") + + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False, {} + + content = reg_file.readline().rstrip() + + # content is a string containing the hex representation of the register + reg_value = int(content, 16) + + # Check OIR change events + if reg_value == self.modprs_register: + return True, {} + else: + changed_ports = self.modprs_register ^ reg_value + while port >= self.port_start and port <= self.port_end: + + # Mask off the bit corresponding to our port + mask = (1 << port) + + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + port += 1 + + # Update reg value + self.modprs_register = reg_value + + return True, port_dict From 8145fb7a0b8ebaea2a69423d5553bc92121769d1 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Tue, 19 Feb 2019 05:30:04 -0500 Subject: [PATCH 2/8] sleep 1 second to avoid busy looping --- .../plugins/sfputil.py | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 3dcece8e7d9d..50fd91c4edaa 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -39,8 +39,7 @@ def port_to_eeprom_mapping(self): return self._port_to_eeprom_mapping @property - def transceiver_status(self): - return self.modprs_register + def get_transceiver_status(self): def __init__(self): port = self.port_start @@ -59,8 +58,21 @@ def __init__(self): content = reg_file.readline().rstrip() - # content is a string containing the hex representation of the register - self.modprs_register = int(content, 16) + reg_file.close() + + return int(content, 16) + + + def __init__(self): + + port = self.port_start + eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" + + for x in range(0, self.port_end + 1): + self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) + + # Get Transceiver status + self.modprs_register = self.get_transceiver_status SfpUtilBase.__init__(self) @@ -198,20 +210,16 @@ def get_transceiver_change_event(self): port_dict = {} port = self.port_start - try: - reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") - - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False, {} - - content = reg_file.readline().rstrip() - - # content is a string containing the hex representation of the register - reg_value = int(content, 16) + # Sleep for a minute + if self.modprs_register == self.get_transceiver_status: + time.sleep(1) + if self.modprs_register == self.get_transceiver_status: + state_change = 0 + else: + state_change = 1 # Check OIR change events - if reg_value == self.modprs_register: + if not state_change: return True, {} else: changed_ports = self.modprs_register ^ reg_value From e19df4a3f7e4c09321c02aac46c4f21d795da7b1 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Tue, 19 Feb 2019 05:36:49 -0500 Subject: [PATCH 3/8] removal of dead code --- .../dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 50fd91c4edaa..e102d9a87add 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -41,14 +41,6 @@ def port_to_eeprom_mapping(self): @property def get_transceiver_status(self): - def __init__(self): - port = self.port_start - eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" - - for x in range(0, self.port_end + 1): - self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) - - # Get Transceiver status try: reg_file = open("/sys/devices/platform/dell-s6000-cpld.0/qsfp_modprs") @@ -65,7 +57,6 @@ def __init__(self): def __init__(self): - port = self.port_start eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom" for x in range(0, self.port_end + 1): From 5ef9199bae8fae6d96ec6debcc11ff3840fac2ba Mon Sep 17 00:00:00 2001 From: paavaanan Date: Wed, 20 Feb 2019 00:02:38 -0500 Subject: [PATCH 4/8] Correct typo error to 1 second --- device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index e102d9a87add..88d76271f0b0 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -201,7 +201,7 @@ def get_transceiver_change_event(self): port_dict = {} port = self.port_start - # Sleep for a minute + # Sleep for a second if self.modprs_register == self.get_transceiver_status: time.sleep(1) if self.modprs_register == self.get_transceiver_status: From c7133d2461f98d8a3e0343507099d5a30706de6b Mon Sep 17 00:00:00 2001 From: paavaanan Date: Mon, 15 Apr 2019 06:44:37 -0400 Subject: [PATCH 5/8] Introduced 1 second sleep --- device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 88d76271f0b0..7d6dbcb505b7 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -204,15 +204,9 @@ def get_transceiver_change_event(self): # Sleep for a second if self.modprs_register == self.get_transceiver_status: time.sleep(1) - if self.modprs_register == self.get_transceiver_status: - state_change = 0 - else: - state_change = 1 - - # Check OIR change events - if not state_change: return True, {} else: + reg_value = self.get_transceiver_status changed_ports = self.modprs_register ^ reg_value while port >= self.port_start and port <= self.port_end: From 23f08f65a9988a7778faa99bfb083168a86dd072 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Tue, 23 Apr 2019 06:33:48 -0400 Subject: [PATCH 6/8] Revamped script with blocking call support --- .../plugins/sfputil.py | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 7d6dbcb505b7..ddcd93a27be7 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -201,28 +201,27 @@ def get_transceiver_change_event(self): port_dict = {} port = self.port_start - # Sleep for a second - if self.modprs_register == self.get_transceiver_status: - time.sleep(1) - return True, {} - else: + while True: reg_value = self.get_transceiver_status - changed_ports = self.modprs_register ^ reg_value - while port >= self.port_start and port <= self.port_end: + if reg_value != self.modprs_register: + changed_ports = self.modprs_register ^ reg_value + while port >= self.port_start and port <= self.port_end: - # Mask off the bit corresponding to our port - mask = (1 << port) + # Mask off the bit corresponding to our port + mask = (1 << port) - if changed_ports & mask: - # ModPrsL is active low - if reg_value & mask == 0: - port_dict[port] = '1' - else: - port_dict[port] = '0' + if changed_ports & mask: + # ModPrsL is active low + if reg_value & mask == 0: + port_dict[port] = '1' + else: + port_dict[port] = '0' - port += 1 + port += 1 - # Update reg value - self.modprs_register = reg_value + # Update reg value + self.modprs_register = reg_value + return True, port_dict - return True, port_dict + # Sleep for a second + time.sleep(1) From b4801b3961379b65aae31d045a1109c20d4c6168 Mon Sep 17 00:00:00 2001 From: paavaanan Date: Wed, 24 Apr 2019 08:20:28 -0400 Subject: [PATCH 7/8] get_transceiver_change_event api definition update --- device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index ddcd93a27be7..195f31104856 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -196,7 +196,7 @@ def reset(self, port_num): return True - def get_transceiver_change_event(self): + def get_transceiver_change_event(self, timeout=0): port_dict = {} port = self.port_start From b1034b07ba4066e36f325b8887606a9a3fe94ffd Mon Sep 17 00:00:00 2001 From: paavaanan Date: Fri, 26 Apr 2019 08:52:01 -0400 Subject: [PATCH 8/8] adding timeout support for get_transceiver_change_event --- .../plugins/sfputil.py | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py index 195f31104856..b27bf4bc22ea 100644 --- a/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py +++ b/device/dell/x86_64-dell_s6000_s1220-r0/plugins/sfputil.py @@ -5,6 +5,7 @@ try: import time + import datetime from sonic_sfp.sfputilbase import SfpUtilBase except ImportError as e: raise ImportError("%s - required module not found" % str(e)) @@ -62,7 +63,7 @@ def __init__(self): for x in range(0, self.port_end + 1): self._port_to_eeprom_mapping[x] = eeprom_path.format(x + self.EEPROM_OFFSET) - # Get Transceiver status + # Get Transceiver status self.modprs_register = self.get_transceiver_status SfpUtilBase.__init__(self) @@ -198,10 +199,28 @@ def reset(self, port_num): def get_transceiver_change_event(self, timeout=0): + start_time = time.time() port_dict = {} port = self.port_start + forever = False - while True: + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) # Convert to secs + else: + print "get_transceiver_change_event:Invalid timeout value", timeout + return False, {} + + end_time = start_time + timeout + if start_time > end_time: + print 'get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout + + return False, {} # Time wrap or possibly incorrect timeout + + while timeout >= 0: + # Check for OIR events and return updated port_dict reg_value = self.get_transceiver_status if reg_value != self.modprs_register: changed_ports = self.modprs_register ^ reg_value @@ -223,5 +242,15 @@ def get_transceiver_change_event(self, timeout=0): self.modprs_register = reg_value return True, port_dict - # Sleep for a second - time.sleep(1) + if forever: + time.sleep(1) + else: + timeout = end_time - time.time() + if timeout >= 1: + time.sleep(1) # We poll at 1 second granularity + else: + if timeout > 0: + time.sleep(timeout) + return True, {} + print "get_transceiver_change_event: Should not reach here." + return False, {}