From 909a7e94bba1cb3787a2b62063930c22a71f5582 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Fri, 22 Dec 2017 10:54:30 +0800 Subject: [PATCH 01/14] Update sonic-platform-modules-accton to lastest Signed-off-by: roylee123 --- platform/broadcom/sonic-platform-modules-accton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 7ba26ec403c7..e66b74fcf7a9 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 7ba26ec403c7f0d0acb958f794311ac3fd1af9a1 +Subproject commit e66b74fcf7a943d8c7c8f241a8221eca65171ced From a40d2d9781bf68d45bf8681256fbbe283e110e6d Mon Sep 17 00:00:00 2001 From: Joe LeVeque Date: Mon, 22 Jan 2018 10:52:52 -0800 Subject: [PATCH 02/14] Install sonic-platform-common package in platform-monitor docker for ledd (#1330) * Install sonic-platform-common package in platform-monitor docker for ledd * Specify Python wheel dependencies in docker-platform-monitor.mk; Remove explicit specifications from Dockerfile.j2 --- dockers/docker-platform-monitor/Dockerfile.j2 | 48 +++++++------------ rules/docker-platform-monitor.mk | 2 + 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/dockers/docker-platform-monitor/Dockerfile.j2 b/dockers/docker-platform-monitor/Dockerfile.j2 index b6406b3e3a6a..4dd8acaf0e26 100755 --- a/dockers/docker-platform-monitor/Dockerfile.j2 +++ b/dockers/docker-platform-monitor/Dockerfile.j2 @@ -9,44 +9,30 @@ RUN apt-get update # Install required packages RUN apt-get install -y python-pip sensord fancontrol -{% if docker_platform_monitor_debs.strip() %} -# Copy built Debian packages -COPY \ -{% for deb in docker_platform_monitor_debs.split(' ') -%} +{% if docker_platform_monitor_debs.strip() -%} +# Copy all locally-built Debian package dependencies +COPY{{' '}} +{%- for deb in docker_platform_monitor_debs.split(' ') -%} debs/{{ deb }}{{' '}} {%- endfor -%} -debs/ -{%- endif %} +/debs/ -{% if docker_platform_monitor_debs.strip() %} -# Install built Debian packages -RUN dpkg -i \ -{% for deb in docker_platform_monitor_debs.split(' ') -%} -debs/{{ deb }}{{' '}} -{%- endfor %} -{%- endif %} +# Install all locally-built Debian package dependencies +# and implicitly install their dependencies +RUN dpkg_apt() { [ -f $1 ] && { dpkg -i $1 || apt-get -y install -f; } || return 1; }; dpkg_apt /debs/*.deb +{% endif %} -{% if docker_platform_monitor_whls.strip() %} -# Copy built Python wheels -COPY \ -{% for whl in docker_platform_monitor_whls.split(' ') -%} +{% if docker_platform_monitor_whls.strip() -%} +# Copy all locally-built Python wheel dependencies +COPY{{' '}} +{%- for whl in docker_platform_monitor_whls.split(' ') -%} python-wheels/{{ whl }}{{' '}} {%- endfor -%} -python-wheels/ -{%- endif %} - -{% if docker_platform_monitor_whls.strip() %} -# Install built Python wheels -RUN pip install \ -{% for whl in docker_platform_monitor_whls.split(' ') -%} -python-wheels/{{ whl }}{{' '}} -{%- endfor %} -{%- endif %} - -COPY python-wheels /python-wheels +/python-wheels/ -# Install Python SwSS SDK (dependency of sonic-ledd) -RUN pip install /python-wheels/swsssdk-2.0.1-py2-none-any.whl +# Install all locally-built Python wheel dependencies +RUN pip install /python-wheels/*.whl +{% endif %} # Clean up RUN apt-get remove -y python-pip diff --git a/rules/docker-platform-monitor.mk b/rules/docker-platform-monitor.mk index 76e7dac4ab63..345e82f7b86f 100644 --- a/rules/docker-platform-monitor.mk +++ b/rules/docker-platform-monitor.mk @@ -3,6 +3,8 @@ DOCKER_PLATFORM_MONITOR = docker-platform-monitor.gz $(DOCKER_PLATFORM_MONITOR)_PATH = $(DOCKERS_PATH)/docker-platform-monitor $(DOCKER_PLATFORM_MONITOR)_DEPENDS += $(SONIC_LEDD) +$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SONIC_PLATFORM_COMMON_PY2) +$(DOCKER_PLATFORM_MONITOR)_PYTHON_WHEELS += $(SWSSSDK_PY2) $(DOCKER_PLATFORM_MONITOR)_LOAD_DOCKERS = $(DOCKER_CONFIG_ENGINE) SONIC_DOCKER_IMAGES += $(DOCKER_PLATFORM_MONITOR) From beb209742269b9118fc0898a242f22f1f4838a39 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Tue, 23 Jan 2018 15:16:16 +0800 Subject: [PATCH 03/14] [7312_54x] Add plug-in files. Signed-off-by: roylee123 --- .../plugins/eeprom.py | 24 ++ .../plugins/psuutil.py | 61 +++++ .../plugins/sfputil.py | 222 ++++++++++++++++++ 3 files changed, 307 insertions(+) create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py create mode 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py create mode 100755 device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py new file mode 100644 index 000000000000..7681caafeef4 --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/eeprom.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +try: + import exceptions + import binascii + import time + import optparse + import warnings + import os + import sys + from sonic_eeprom import eeprom_base + from sonic_eeprom import eeprom_tlvinfo + import subprocess +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + self.eeprom_path = "/sys/bus/i2c/devices/1-0057/eeprom" + #Two i2c buses might get flipped order, check them both. + if not os.path.exists(self.eeprom_path): + self.eeprom_path = "/sys/bus/i2c/devices/0-0057/eeprom" + super(board, self).__init__(self.eeprom_path, 0, '', True) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py new file mode 100644 index 000000000000..d2c2956009be --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +############################################################################# +# Accton +# +# Module contains an implementation of SONiC PSU Base API and +# provides the PSUs status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_psu.psu_base import PsuBase +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 1: "11-0051", + 2: "10-0050", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py new file mode 100755 index 000000000000..db846427385f --- /dev/null +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -0,0 +1,222 @@ +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# + +try: + import time + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) + + +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 48 + QSFP_PORT_END = 72 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, #QSFP49 + 49: 66, + 50: 66, + 51: 66, + 52: 67, #QSFP50 + 53: 67, + 54: 67, + 55: 67, + 56: 68, #QSFP51 + 57: 68, + 58: 68, + 59: 68, + 60: 69, #QSFP52 + 61: 69, + 62: 69, + 63: 69, + 64: 70, #QSFP53 + 65: 70, + 66: 70, + 67: 70, + 68: 71, #QSFP54 + 69: 71, + 70: 71, + 71: 71, + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x][0], + self._port_to_i2c_mapping[x][0]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + + present_path = self.BASE_VAL_PATH + "sfp_is_present" + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][0]) + + try: + val_file = open(self.__port_to_is_present) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" + self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + + try: + val_file = open(self.__port_to_lp_mode) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def set_low_power_mode(self, port_num, lpmode): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" + self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + + try: + reg_file = open(self.__port_to_lp_mode, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + if lpmode is True: + reg_value = '1' + else: + reg_value = '0' + + reg_file.write(reg_value) + reg_file.close() + + return True + + def reset(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + try: + reg_file = open(self.__port_to_mod_rst, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True From 7ec29c0212651d8c186793f87afb43c71ebf261d Mon Sep 17 00:00:00 2001 From: roylee123 Date: Wed, 24 Jan 2018 16:38:29 +0800 Subject: [PATCH 04/14] [as7312-54x] Update i2c related drivers after tested on R0B model. Signed-off-by: roylee123 --- device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py | 4 ++-- platform/broadcom/sonic-platform-modules-accton | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py index d2c2956009be..8bc20318ccb0 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -25,8 +25,8 @@ def __init__(self): self.psu_presence = "/psu_present" self.psu_oper_status = "/psu_power_good" self.psu_mapping = { - 1: "11-0051", - 2: "10-0050", + 1: "10-0051", + 2: "11-0053", } def get_num_psus(self): diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 3f06d9f5864c..2f1ccb95f101 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 3f06d9f5864c9daae4b582d60307ccb6d21c6ceb +Subproject commit 2f1ccb95f101c114d59599d7486dac72fcab38d4 From 004b4ef9ce2f8dd74008c6e5241dd9c2531afff8 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Wed, 24 Jan 2018 17:27:41 +0800 Subject: [PATCH 05/14] Add as7312-54x driver package. Signed-off-by: roylee123 --- platform/broadcom/one-image.mk | 1 + platform/broadcom/platform-modules-accton.mk | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/platform/broadcom/one-image.mk b/platform/broadcom/one-image.mk index 2e54972dce3a..968e686f91c8 100755 --- a/platform/broadcom/one-image.mk +++ b/platform/broadcom/one-image.mk @@ -16,6 +16,7 @@ $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELL_S6000_PLATFORM_MODULE) \ $(ACCTON_AS5712_54X_PLATFORM_MODULE) \ $(ACCTON_AS7816_64X_PLATFORM_MODULE) \ $(ACCTON_AS7716_32X_PLATFORM_MODULE) \ + $(ACCTON_AS7312_54X_PLATFORM_MODULE) \ $(INVENTEC_D7032Q28B_PLATFORM_MODULE) \ $(INVENTEC_D7054Q28B_PLATFORM_MODULE) \ $(CEL_DX010_PLATFORM_MODULE) \ diff --git a/platform/broadcom/platform-modules-accton.mk b/platform/broadcom/platform-modules-accton.mk index 08820e9a270a..db207673b995 100755 --- a/platform/broadcom/platform-modules-accton.mk +++ b/platform/broadcom/platform-modules-accton.mk @@ -4,11 +4,13 @@ ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION = 1.1 ACCTON_AS7716_32X_PLATFORM_MODULE_VERSION = 1.1 +ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION = 1.1 export ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION export ACCTON_AS5712_54X_PLATFORM_MODULE_VERSION export ACCTON_AS7816_64X_PLATFORM_MODULE_VERSION export ACCTON_AS7716_32X_PLATFORM_MODULE_VERSION +export ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION ACCTON_AS7712_32X_PLATFORM_MODULE = sonic-platform-accton-as7712-32x_$(ACCTON_AS7712_32X_PLATFORM_MODULE_VERSION)_amd64.deb $(ACCTON_AS7712_32X_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-accton @@ -28,3 +30,6 @@ ACCTON_AS7716_32X_PLATFORM_MODULE = sonic-platform-accton-as7716-32x_$(ACCTON_AS $(ACCTON_AS7716_32X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7716_32x-r0 $(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS7716_32X_PLATFORM_MODULE))) +ACCTON_AS7312_54X_PLATFORM_MODULE = sonic-platform-accton-as7312-54x_$(ACCTON_AS7312_54X_PLATFORM_MODULE_VERSION)_amd64.deb +$(ACCTON_AS7312_54X_PLATFORM_MODULE)_PLATFORM = x86_64-accton_as7312_54x-r0 +$(eval $(call add_extra_package,$(ACCTON_AS7712_32X_PLATFORM_MODULE),$(ACCTON_AS7312_54X_PLATFORM_MODULE))) From 511022b7f854537f4cebdb0fb2df7ac4f5d0b76e Mon Sep 17 00:00:00 2001 From: roylee123 Date: Thu, 25 Jan 2018 14:18:01 +0800 Subject: [PATCH 06/14] [as7312-54x] Add index to port_config.ini for mmaping port with single lane. Validate sfputil.py and mark unsupported for lp mode. Signed-off-by: roylee123 --- .../Accton-AS7312-54X/port_config.ini | 110 +++++++++--------- .../plugins/sfputil.py | 54 ++------- 2 files changed, 62 insertions(+), 102 deletions(-) mode change 100755 => 100644 device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py diff --git a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini index 8eeb6a993cb5..2c4d0c023772 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini +++ b/device/accton/x86_64-accton_as7312_54x-r0/Accton-AS7312-54X/port_config.ini @@ -1,55 +1,55 @@ -# name lanes alias -Ethernet0 41 twentyfiveGigE1 -Ethernet1 42 twentyfiveGigE2 -Ethernet2 43 twentyfiveGigE3 -Ethernet3 44 twentyfiveGigE4 -Ethernet4 49 twentyfiveGigE5 -Ethernet5 50 twentyfiveGigE6 -Ethernet6 51 twentyfiveGigE7 -Ethernet7 52 twentyfiveGigE8 -Ethernet8 53 twentyfiveGigE9 -Ethernet9 54 twentyfiveGigE10 -Ethernet10 55 twentyfiveGigE11 -Ethernet11 56 twentyfiveGigE12 -Ethernet12 65 twentyfiveGigE13 -Ethernet13 66 twentyfiveGigE14 -Ethernet14 67 twentyfiveGigE15 -Ethernet15 68 twentyfiveGigE16 -Ethernet16 33 twentyfiveGigE17 -Ethernet17 34 twentyfiveGigE18 -Ethernet18 35 twentyfiveGigE19 -Ethernet19 36 twentyfiveGigE20 -Ethernet20 37 twentyfiveGigE21 -Ethernet21 38 twentyfiveGigE22 -Ethernet22 39 twentyfiveGigE23 -Ethernet23 40 twentyfiveGigE24 -Ethernet24 69 twentyfiveGigE25 -Ethernet25 70 twentyfiveGigE26 -Ethernet26 71 twentyfiveGigE27 -Ethernet27 72 twentyfiveGigE28 -Ethernet28 81 twentyfiveGigE29 -Ethernet29 82 twentyfiveGigE30 -Ethernet30 83 twentyfiveGigE31 -Ethernet31 84 twentyfiveGigE32 -Ethernet32 85 twentyfiveGigE33 -Ethernet33 86 twentyfiveGigE34 -Ethernet34 87 twentyfiveGigE35 -Ethernet35 88 twentyfiveGigE36 -Ethernet36 97 twentyfiveGigE37 -Ethernet37 98 twentyfiveGigE38 -Ethernet38 99 twentyfiveGigE39 -Ethernet39 100 twentyfiveGigE40 -Ethernet40 101 twentyfiveGigE41 -Ethernet41 102 twentyfiveGigE42 -Ethernet42 103 twentyfiveGigE43 -Ethernet43 104 twentyfiveGigE44 -Ethernet44 105 twentyfiveGigE45 -Ethernet45 106 twentyfiveGigE46 -Ethernet46 107 twentyfiveGigE47 -Ethernet47 108 twentyfiveGigE48 -Ethernet48 5,6,7,8 hundredGigE49 -Ethernet52 1,2,3,4 hundredGigE50 -Ethernet56 109,110,111,112 hundredGigE51 -Ethernet60 21,22,23,24 hundredGigE52 -Ethernet64 9,10,11,12 hundredGigE53 -Ethernet68 117,118,119,120 hundredGigE54 +# name lanes alias index +Ethernet0 41 twentyfiveGigE1 0 +Ethernet1 42 twentyfiveGigE2 1 +Ethernet2 43 twentyfiveGigE3 2 +Ethernet3 44 twentyfiveGigE4 3 +Ethernet4 49 twentyfiveGigE5 4 +Ethernet5 50 twentyfiveGigE6 5 +Ethernet6 51 twentyfiveGigE7 6 +Ethernet7 52 twentyfiveGigE8 7 +Ethernet8 53 twentyfiveGigE9 8 +Ethernet9 54 twentyfiveGigE10 9 +Ethernet10 55 twentyfiveGigE11 10 +Ethernet11 56 twentyfiveGigE12 11 +Ethernet12 65 twentyfiveGigE13 12 +Ethernet13 66 twentyfiveGigE14 13 +Ethernet14 67 twentyfiveGigE15 14 +Ethernet15 68 twentyfiveGigE16 15 +Ethernet16 33 twentyfiveGigE17 16 +Ethernet17 34 twentyfiveGigE18 17 +Ethernet18 35 twentyfiveGigE19 18 +Ethernet19 36 twentyfiveGigE20 19 +Ethernet20 37 twentyfiveGigE21 20 +Ethernet21 38 twentyfiveGigE22 21 +Ethernet22 39 twentyfiveGigE23 22 +Ethernet23 40 twentyfiveGigE24 23 +Ethernet24 69 twentyfiveGigE25 24 +Ethernet25 70 twentyfiveGigE26 25 +Ethernet26 71 twentyfiveGigE27 26 +Ethernet27 72 twentyfiveGigE28 27 +Ethernet28 81 twentyfiveGigE29 28 +Ethernet29 82 twentyfiveGigE30 29 +Ethernet30 83 twentyfiveGigE31 30 +Ethernet31 84 twentyfiveGigE32 31 +Ethernet32 85 twentyfiveGigE33 32 +Ethernet33 86 twentyfiveGigE34 33 +Ethernet34 87 twentyfiveGigE35 34 +Ethernet35 88 twentyfiveGigE36 35 +Ethernet36 97 twentyfiveGigE37 36 +Ethernet37 98 twentyfiveGigE38 37 +Ethernet38 99 twentyfiveGigE39 38 +Ethernet39 100 twentyfiveGigE40 39 +Ethernet40 101 twentyfiveGigE41 40 +Ethernet41 102 twentyfiveGigE42 41 +Ethernet42 103 twentyfiveGigE43 42 +Ethernet43 104 twentyfiveGigE44 43 +Ethernet44 105 twentyfiveGigE45 44 +Ethernet45 106 twentyfiveGigE46 45 +Ethernet46 107 twentyfiveGigE47 46 +Ethernet47 108 twentyfiveGigE48 47 +Ethernet48 5,6,7,8 hundredGigE49 48 +Ethernet52 1,2,3,4 hundredGigE50 52 +Ethernet56 109,110,111,112 hundredGigE51 56 +Ethernet60 21,22,23,24 hundredGigE52 60 +Ethernet64 9,10,11,12 hundredGigE53 64 +Ethernet68 117,118,119,120 hundredGigE54 68 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py old mode 100755 new mode 100644 index db846427385f..9063444bbab7 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -129,8 +129,8 @@ def __init__(self): for x in range(0, self.port_end+1): self.port_to_eeprom_mapping[x] = eeprom_path.format( - self._port_to_i2c_mapping[x][0], - self._port_to_i2c_mapping[x][0]) + self._port_to_i2c_mapping[x], + self._port_to_i2c_mapping[x]) SfpUtilBase.__init__(self) @@ -138,10 +138,9 @@ def get_presence(self, port_num): # Check for invalid port_num if port_num < self.port_start or port_num > self.port_end: return False - + print port_num present_path = self.BASE_VAL_PATH + "sfp_is_present" - self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][0]) - + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) try: val_file = open(self.__port_to_is_present) except IOError as e: @@ -158,56 +157,17 @@ def get_presence(self, port_num): return False def get_low_power_mode(self, port_num): - if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: - return False - - lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" - self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) - - try: - val_file = open(self.__port_to_lp_mode) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - content = val_file.readline().rstrip() - val_file.close() - - # content is a string, either "0" or "1" - if content == "1": - return True - - return False + raise NotImplementedError def set_low_power_mode(self, port_num, lpmode): - if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: - return False - - lp_mode_path = self.BASE_VAL_PATH + "sfp_lp_mode" - self.__port_to_lp_mode = lp_mode_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) - - try: - reg_file = open(self.__port_to_lp_mode, 'r+') - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - if lpmode is True: - reg_value = '1' - else: - reg_value = '0' - - reg_file.write(reg_value) - reg_file.close() - - return True + raise NotImplementedError def reset(self, port_num): if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" - self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num][0], self._port_to_i2c_mapping[port_num][1]) + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) try: reg_file = open(self.__port_to_mod_rst, 'r+') except IOError as e: From a66f02bc712f69f7a1971bfd58d34fcec3eaf9f6 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Fri, 26 Jan 2018 09:42:51 +0800 Subject: [PATCH 07/14] [as7312-54x] Change for R01 HW board. Signed-off-by: roylee123 --- .../plugins/psuutil.py | 90 ++--- .../plugins/sfputil.py | 340 +++++++++--------- .../plugins/sfputil.py | 248 ++++++++----- 3 files changed, 367 insertions(+), 311 deletions(-) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py index 8bc20318ccb0..08989ba1965a 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -15,47 +15,49 @@ except ImportError as e: raise ImportError (str(e) + "- required module not found") -class PsuUtil(PsuBase): - """Platform-specific PSUutil class""" - - def __init__(self): - PsuBase.__init__(self) - - self.psu_path = "/sys/bus/i2c/devices/" - self.psu_presence = "/psu_present" - self.psu_oper_status = "/psu_power_good" - self.psu_mapping = { - 1: "10-0051", - 2: "11-0053", - } - - def get_num_psus(self): - return len(self.psu_mapping) - - def get_psu_status(self, index): - if index is None: - return False - - status = 0 - node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status - try: - with open(node, 'r') as power_status: - status = int(power_status.read()) - except IOError: - return False - - return status == 1 - - def get_psu_presence(self, index): - if index is None: - return False - - status = 0 - node = self.psu_path + self.psu_mapping[index] + self.psu_presence - try: - with open(node, 'r') as presence_status: - status = int(presence_status.read()) - except IOError: - return False - - return status == 1 + class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "11-0051" + , + 1: "10-0050" + , + } + +def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py index 9063444bbab7..2fcf142b64dc 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -10,173 +10,173 @@ raise ImportError("%s - required module not found" % str(e)) -class SfpUtil(SfpUtilBase): - """Platform-specific SfpUtil class""" - - PORT_START = 0 - PORT_END = 71 - PORTS_IN_BLOCK = 72 - QSFP_PORT_START = 48 - QSFP_PORT_END = 72 - - BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" - - _port_to_is_present = {} - _port_to_lp_mode = {} - - _port_to_eeprom_mapping = {} - _port_to_i2c_mapping = { - 0: 18, - 1: 19, - 2: 20, - 3: 21, - 4: 22, - 5: 23, - 6: 24, - 7: 25, - 8: 26, - 9: 27, - 10: 28, - 11: 29, - 12: 30, - 13: 31, - 14: 32, - 15: 33, - 16: 34, - 17: 35, - 18: 36, - 19: 37, - 20: 38, - 21: 39, - 22: 40, - 23: 41, - 24: 42, - 25: 43, - 26: 44, - 27: 45, - 28: 46, - 29: 47, - 30: 48, - 31: 49, - 32: 50, - 33: 51, - 34: 52, - 35: 53, - 36: 54, - 37: 55, - 38: 56, - 39: 57, - 40: 58, - 41: 59, - 42: 60, - 43: 61, - 44: 62, - 45: 63, - 46: 64, - 47: 65, - 48: 66, #QSFP49 - 49: 66, - 50: 66, - 51: 66, - 52: 67, #QSFP50 - 53: 67, - 54: 67, - 55: 67, - 56: 68, #QSFP51 - 57: 68, - 58: 68, - 59: 68, - 60: 69, #QSFP52 - 61: 69, - 62: 69, - 63: 69, - 64: 70, #QSFP53 - 65: 70, - 66: 70, - 67: 70, - 68: 71, #QSFP54 - 69: 71, - 70: 71, - 71: 71, - } - - @property - def port_start(self): - return self.PORT_START - - @property - def port_end(self): - return self.PORT_END - - @property - def qsfp_port_start(self): - return self.QSFP_PORT_START - - @property - def qsfp_port_end(self): - return self.QSFP_PORT_END - - @property - def qsfp_ports(self): - return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) - - @property - def port_to_eeprom_mapping(self): - return self._port_to_eeprom_mapping - - def __init__(self): - eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" - - for x in range(0, self.port_end+1): - self.port_to_eeprom_mapping[x] = eeprom_path.format( - self._port_to_i2c_mapping[x], - self._port_to_i2c_mapping[x]) - - SfpUtilBase.__init__(self) - - def get_presence(self, port_num): - # Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: - return False - print port_num - present_path = self.BASE_VAL_PATH + "sfp_is_present" - self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) - try: - val_file = open(self.__port_to_is_present) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - content = val_file.readline().rstrip() - val_file.close() - - # content is a string, either "0" or "1" - if content == "1": - return True - - return False - - def get_low_power_mode(self, port_num): - raise NotImplementedError - - def set_low_power_mode(self, port_num, lpmode): - raise NotImplementedError - - def reset(self, port_num): - if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: - return False - - mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" - self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) - try: - reg_file = open(self.__port_to_mod_rst, 'r+') - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - reg_value = '1' - - reg_file.write(reg_value) - reg_file.close() - - return True + class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 48 + QSFP_PORT_END = 72 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} +_port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} +_port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, #QSFP49 + 49: 66, + 50: 66, + 51: 66, + 52: 67, #QSFP50 + 53: 67, + 54: 67, + 55: 67, + 56: 68, #QSFP51 + 57: 68, + 58: 68, + 59: 68, + 60: 69, #QSFP52 + 61: 69, + 62: 69, + 63: 69, + 64: 70, #QSFP53 + 65: 70, + 66: 70, + 67: 70, + 68: 71, #QSFP54 + 69: 71, + 70: 71, + 71: 71, +} + +@property +def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x], + self._port_to_i2c_mapping[x]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): +# Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + print port_num + present_path = self.BASE_VAL_PATH + "sfp_is_present" + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + try: + val_file = open(self.__port_to_is_present) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + +# content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + try: + reg_file = open(self.__port_to_mod_rst, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py index 2e636292bfa9..4276923e2cea 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -1,128 +1,182 @@ -#!/usr/bin/env python +# sfputil.py +# +# Platform-specific SFP transceiver interface for SONiC +# try: import time - from sonic_sfp.sfputilbase import SfpUtilBase -except ImportError, e: - raise ImportError (str(e) + "- required module not found") + from sonic_sfp.sfputilbase import SfpUtilBase +except ImportError as e: + raise ImportError("%s - required module not found" % str(e)) class SfpUtil(SfpUtilBase): - """Platform specific SfpUtill class""" + """Platform-specific SfpUtill class""" - _port_start = 0 - _port_end = 31 - ports_in_block = 32 + PORT_START = 0 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 48 + QSFP_PORT_END = 72 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} + _port_to_lp_mode = {} _port_to_eeprom_mapping = {} - port_to_i2c_mapping = { - 9 : 18, - 10 : 19, - 11 : 20, - 12 : 21, - 1 : 22, - 2 : 23, - 3 : 24, - 4 : 25, - 6 : 26, - 5 : 27, - 8 : 28, - 7 : 29, - 13 : 30, - 14 : 31, - 15 : 32, - 16 : 33, - 17 : 34, - 18 : 35, - 19 : 36, - 20 : 37, - 25 : 38, - 26 : 39, - 27 : 40, - 28 : 41, - 29 : 42, - 30 : 43, - 31 : 44, - 32 : 45, - 21 : 46, - 22 : 47, - 23 : 48, - 24 : 49, - } - - _qsfp_ports = range(0, ports_in_block + 1) + _port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, #QSFP49 + 49: 66, + 50: 66, + 51: 66, + 52: 67, #QSFP50 + 53: 67, + 54: 67, + 55: 67, + 56: 68, #QSFP51 + 57: 68, + 58: 68, + 59: 68, + 60: 69, #QSFP52 + 61: 69, + 62: 69, + 63: 69, + 64: 70, #QSFP53 + 65: 70, + 66: 70, + 67: 70, + 68: 71, #QSFP54 + 69: 71, + 70: 71, + 71: 71, + } - def __init__(self): - eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' - for x in range(0, self._port_end + 1): - port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) - self._port_to_eeprom_mapping[x] = port_eeprom_path - SfpUtilBase.__init__(self) + @property + def port_start(self): + return self.PORT_START - def reset(self, port_num): - # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: - return False + @property + def port_end(self): + return self.PORT_END - path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset" - port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) - - try: - reg_file = open(port_ps, 'w') - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START - #toggle reset - reg_file.seek(0) - reg_file.write('1') - time.sleep(1) - reg_file.seek(0) - reg_file.write('0') - reg_file.close() - return True + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) - def set_low_power_mode(self, port_nuM, lpmode): - raise NotImplementedError + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x], + self._port_to_i2c_mapping[x]) + + SfpUtilBase.__init__(self) - def get_low_power_mode(self, port_num): - raise NotImplementedError - def get_presence(self, port_num): # Check for invalid port_num - if port_num < self._port_start or port_num > self._port_end: + if port_num < self.port_start or port_num > self.port_end: return False - path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present" - port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) - - + present_path = self.BASE_VAL_PATH + "sfp_is_present" + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) try: - reg_file = open(port_ps) + val_file = open(self.__port_to_is_present) except IOError as e: - print "Error: unable to open file: %s" % str(e) + print "Error: unable to open file: %s" % str(e) return False - reg_value = reg_file.readline().rstrip() - if reg_value == '1': + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": return True return False - @property - def port_start(self): - return self._port_start + def get_low_power_mode(self, port_num): + raise NotImplementedError - @property - def port_end(self): - return self._port_end - - @property - def qsfp_ports(self): - return range(0, self.ports_in_block + 1) + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError - @property - def port_to_eeprom_mapping(self): - return self._port_to_eeprom_mapping + def reset(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + try: + reg_file = open(self.__port_to_mod_rst, 'w') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + reg_value = '0' #This bit will auto reset to 1 after written. + reg_file.write(reg_value) + reg_file.close() + + return True From 7a7a6d33b9f511f87627cecb445d8f3f88946a4d Mon Sep 17 00:00:00 2001 From: roylee123 Date: Fri, 26 Jan 2018 10:28:19 +0800 Subject: [PATCH 08/14] [as7312-54x] recovered for the lint corrected not suitable for python. Signed-off-by: roylee123 --- .../plugins/psuutil.py | 90 +++-- .../plugins/sfputil.py | 340 +++++++++--------- 2 files changed, 214 insertions(+), 216 deletions(-) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py index 08989ba1965a..c81a54ed5687 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -15,49 +15,47 @@ except ImportError as e: raise ImportError (str(e) + "- required module not found") - class PsuUtil(PsuBase): - """Platform-specific PSUutil class""" - - def __init__(self): - PsuBase.__init__(self) - - self.psu_path = "/sys/bus/i2c/devices/" - self.psu_presence = "/psu_present" - self.psu_oper_status = "/psu_power_good" - self.psu_mapping = { - 2: "11-0051" - , - 1: "10-0050" - , - } - -def get_num_psus(self): - return len(self.psu_mapping) - - def get_psu_status(self, index): - if index is None: - return False - - status = 0 - node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status - try: - with open(node, 'r') as power_status: - status = int(power_status.read()) - except IOError: - return False - - return status == 1 - - def get_psu_presence(self, index): - if index is None: - return False - - status = 0 - node = self.psu_path + self.psu_mapping[index] + self.psu_presence - try: - with open(node, 'r') as presence_status: - status = int(presence_status.read()) - except IOError: - return False - - return status == 1 +class PsuUtil(PsuBase): + """Platform-specific PSUutil class""" + + def __init__(self): + PsuBase.__init__(self) + + self.psu_path = "/sys/bus/i2c/devices/" + self.psu_presence = "/psu_present" + self.psu_oper_status = "/psu_power_good" + self.psu_mapping = { + 2: "11-0051", + 1: "10-0050", + } + + def get_num_psus(self): + return len(self.psu_mapping) + + def get_psu_status(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index]+self.psu_oper_status + try: + with open(node, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_psu_presence(self, index): + if index is None: + return False + + status = 0 + node = self.psu_path + self.psu_mapping[index] + self.psu_presence + try: + with open(node, 'r') as presence_status: + status = int(presence_status.read()) + except IOError: + return False + + return status == 1 diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py index 2fcf142b64dc..9063444bbab7 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -10,173 +10,173 @@ raise ImportError("%s - required module not found" % str(e)) - class SfpUtil(SfpUtilBase): - """Platform-specific SfpUtil class""" - - PORT_START = 0 - PORT_END = 71 - PORTS_IN_BLOCK = 72 - QSFP_PORT_START = 48 - QSFP_PORT_END = 72 - - BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" - - _port_to_is_present = {} -_port_to_lp_mode = {} - - _port_to_eeprom_mapping = {} -_port_to_i2c_mapping = { - 0: 18, - 1: 19, - 2: 20, - 3: 21, - 4: 22, - 5: 23, - 6: 24, - 7: 25, - 8: 26, - 9: 27, - 10: 28, - 11: 29, - 12: 30, - 13: 31, - 14: 32, - 15: 33, - 16: 34, - 17: 35, - 18: 36, - 19: 37, - 20: 38, - 21: 39, - 22: 40, - 23: 41, - 24: 42, - 25: 43, - 26: 44, - 27: 45, - 28: 46, - 29: 47, - 30: 48, - 31: 49, - 32: 50, - 33: 51, - 34: 52, - 35: 53, - 36: 54, - 37: 55, - 38: 56, - 39: 57, - 40: 58, - 41: 59, - 42: 60, - 43: 61, - 44: 62, - 45: 63, - 46: 64, - 47: 65, - 48: 66, #QSFP49 - 49: 66, - 50: 66, - 51: 66, - 52: 67, #QSFP50 - 53: 67, - 54: 67, - 55: 67, - 56: 68, #QSFP51 - 57: 68, - 58: 68, - 59: 68, - 60: 69, #QSFP52 - 61: 69, - 62: 69, - 63: 69, - 64: 70, #QSFP53 - 65: 70, - 66: 70, - 67: 70, - 68: 71, #QSFP54 - 69: 71, - 70: 71, - 71: 71, -} - -@property -def port_start(self): - return self.PORT_START - - @property - def port_end(self): - return self.PORT_END - - @property - def qsfp_port_start(self): - return self.QSFP_PORT_START - - @property - def qsfp_port_end(self): - return self.QSFP_PORT_END - - @property - def qsfp_ports(self): - return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) - - @property - def port_to_eeprom_mapping(self): - return self._port_to_eeprom_mapping - - def __init__(self): - eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" - - for x in range(0, self.port_end+1): - self.port_to_eeprom_mapping[x] = eeprom_path.format( - self._port_to_i2c_mapping[x], - self._port_to_i2c_mapping[x]) - - SfpUtilBase.__init__(self) - - def get_presence(self, port_num): -# Check for invalid port_num - if port_num < self.port_start or port_num > self.port_end: - return False - print port_num - present_path = self.BASE_VAL_PATH + "sfp_is_present" - self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) - try: - val_file = open(self.__port_to_is_present) - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - content = val_file.readline().rstrip() - val_file.close() - -# content is a string, either "0" or "1" - if content == "1": - return True - - return False - - def get_low_power_mode(self, port_num): - raise NotImplementedError - - def set_low_power_mode(self, port_num, lpmode): - raise NotImplementedError - - def reset(self, port_num): - if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: - return False - - mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" - self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) - try: - reg_file = open(self.__port_to_mod_rst, 'r+') - except IOError as e: - print "Error: unable to open file: %s" % str(e) - return False - - reg_value = '1' - - reg_file.write(reg_value) - reg_file.close() - - return True +class SfpUtil(SfpUtilBase): + """Platform-specific SfpUtil class""" + + PORT_START = 0 + PORT_END = 71 + PORTS_IN_BLOCK = 72 + QSFP_PORT_START = 48 + QSFP_PORT_END = 72 + + BASE_VAL_PATH = "/sys/class/i2c-adapter/i2c-{0}/{1}-0050/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: 18, + 1: 19, + 2: 20, + 3: 21, + 4: 22, + 5: 23, + 6: 24, + 7: 25, + 8: 26, + 9: 27, + 10: 28, + 11: 29, + 12: 30, + 13: 31, + 14: 32, + 15: 33, + 16: 34, + 17: 35, + 18: 36, + 19: 37, + 20: 38, + 21: 39, + 22: 40, + 23: 41, + 24: 42, + 25: 43, + 26: 44, + 27: 45, + 28: 46, + 29: 47, + 30: 48, + 31: 49, + 32: 50, + 33: 51, + 34: 52, + 35: 53, + 36: 54, + 37: 55, + 38: 56, + 39: 57, + 40: 58, + 41: 59, + 42: 60, + 43: 61, + 44: 62, + 45: 63, + 46: 64, + 47: 65, + 48: 66, #QSFP49 + 49: 66, + 50: 66, + 51: 66, + 52: 67, #QSFP50 + 53: 67, + 54: 67, + 55: 67, + 56: 68, #QSFP51 + 57: 68, + 58: 68, + 59: 68, + 60: 69, #QSFP52 + 61: 69, + 62: 69, + 63: 69, + 64: 70, #QSFP53 + 65: 70, + 66: 70, + 67: 70, + 68: 71, #QSFP54 + 69: 71, + 70: 71, + 71: 71, + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_port_start(self): + return self.QSFP_PORT_START + + @property + def qsfp_port_end(self): + return self.QSFP_PORT_END + + @property + def qsfp_ports(self): + return range(self.QSFP_PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def __init__(self): + eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format( + self._port_to_i2c_mapping[x], + self._port_to_i2c_mapping[x]) + + SfpUtilBase.__init__(self) + + def get_presence(self, port_num): + # Check for invalid port_num + if port_num < self.port_start or port_num > self.port_end: + return False + print port_num + present_path = self.BASE_VAL_PATH + "sfp_is_present" + self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + try: + val_file = open(self.__port_to_is_present) + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + content = val_file.readline().rstrip() + val_file.close() + + # content is a string, either "0" or "1" + if content == "1": + return True + + return False + + def get_low_power_mode(self, port_num): + raise NotImplementedError + + def set_low_power_mode(self, port_num, lpmode): + raise NotImplementedError + + def reset(self, port_num): + if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: + return False + + mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" + self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + try: + reg_file = open(self.__port_to_mod_rst, 'r+') + except IOError as e: + print "Error: unable to open file: %s" % str(e) + return False + + reg_value = '1' + + reg_file.write(reg_value) + reg_file.close() + + return True From ae4e6500ec9f7c64a13f4c1397e2e5a6718b1c47 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Fri, 26 Jan 2018 10:59:13 +0800 Subject: [PATCH 09/14] Remove debug printing. Signed-off-by: roylee123 --- device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py index 9063444bbab7..e7500cab69ab 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -138,7 +138,7 @@ def get_presence(self, port_num): # Check for invalid port_num if port_num < self.port_start or port_num > self.port_end: return False - print port_num + present_path = self.BASE_VAL_PATH + "sfp_is_present" self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) try: From dc44175e8939ab667e69946eed4253667129e2a0 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Thu, 8 Feb 2018 11:47:02 +0800 Subject: [PATCH 10/14] [platform] as7312-32x, update for util.py recovered. Signed-off-by: roylee123 --- platform/broadcom/sonic-platform-modules-accton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 2f1ccb95f101..3781e7f3cb5b 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 2f1ccb95f101c114d59599d7486dac72fcab38d4 +Subproject commit 3781e7f3cb5bc7e2d1d4a9e99ee0ce9b6e597828 From 5f943a5cd5ac84ebe8fcde691c104d1c01d71af7 Mon Sep 17 00:00:00 2001 From: roylee123 Date: Mon, 12 Feb 2018 11:27:55 +0800 Subject: [PATCH 11/14] [platform] Accton: merged the commit by Polly Hsu. Change platform modules to depend on 3.16.0-5-amdn64 kernel. Signed-off-by: roylee123 --- platform/broadcom/sonic-platform-modules-accton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index 3781e7f3cb5b..d991871840d8 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit 3781e7f3cb5bc7e2d1d4a9e99ee0ce9b6e597828 +Subproject commit d991871840d84b5a6e8c50e97af02f85ca2e3780 From 182e45a78fe454466836a2e33fac68efa4e99231 Mon Sep 17 00:00:00 2001 From: roy_lee Date: Wed, 14 Feb 2018 12:00:39 +0800 Subject: [PATCH 12/14] [Device] As7312-54x, update for correct I2C addresses for sfp and psu. Signed-off-by: roy_lee --- .../plugins/psuutil.py | 2 +- .../plugins/sfputil.py | 38 ++++++++++++++----- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py index c81a54ed5687..d73e65bf7981 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/psuutil.py @@ -25,7 +25,7 @@ def __init__(self): self.psu_presence = "/psu_present" self.psu_oper_status = "/psu_power_good" self.psu_mapping = { - 2: "11-0051", + 2: "11-0053", 1: "10-0050", } diff --git a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py index e7500cab69ab..2cac13d46b6b 100644 --- a/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7312_54x-r0/plugins/sfputil.py @@ -25,6 +25,11 @@ class SfpUtil(SfpUtilBase): _port_to_lp_mode = {} _port_to_eeprom_mapping = {} + _cpld_mapping = { + 0: "4-0060", + 1: "5-0062", + 2: "6-0064", + } _port_to_i2c_mapping = { 0: 18, 1: 19, @@ -125,11 +130,9 @@ def port_to_eeprom_mapping(self): return self._port_to_eeprom_mapping def __init__(self): - eeprom_path = self.BASE_VAL_PATH + "sfp_eeprom" - + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' for x in range(0, self.port_end+1): self.port_to_eeprom_mapping[x] = eeprom_path.format( - self._port_to_i2c_mapping[x], self._port_to_i2c_mapping[x]) SfpUtilBase.__init__(self) @@ -138,11 +141,27 @@ def get_presence(self, port_num): # Check for invalid port_num if port_num < self.port_start or port_num > self.port_end: return False + + # For cage 0~23 and 48~51 are at cpld2, others are at cpld3. + # For port 48~51 are QSFP, here presumed they are all broken-out to 4 lanes. + cage_num = port_num + cpld_i = 1 + if (port_num > 23): + cpld_i = 2 + + if (port_num >= self.QSFP_PORT_START): + cpld_i = 1 + cage_num = (port_num - self.QSFP_PORT_START)/4 + cage_num = cage_num + self.QSFP_PORT_START + if (cage_num >= 52): + cpld_i = 2 + + cpld_ps = self._cpld_mapping[cpld_i] + path = "/sys/bus/i2c/devices/{0}/module_present_{1}" + port_ps = path.format(cpld_ps, cage_num+1) - present_path = self.BASE_VAL_PATH + "sfp_is_present" - self.__port_to_is_present = present_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) try: - val_file = open(self.__port_to_is_present) + val_file = open(port_ps) except IOError as e: print "Error: unable to open file: %s" % str(e) return False @@ -166,10 +185,11 @@ def reset(self, port_num): if port_num < self.qsfp_port_start or port_num > self.qsfp_port_end: return False - mod_rst_path = self.BASE_VAL_PATH + "sfp_mod_rst" - self.__port_to_mod_rst = mod_rst_path.format(self._port_to_i2c_mapping[port_num], self._port_to_i2c_mapping[port_num]) + + path = "/sys/bus/i2c/devices/5-0062/module_reset_{0}" + port_ps = path.format(port_num+1) try: - reg_file = open(self.__port_to_mod_rst, 'r+') + reg_file = open(port_ps, 'w') except IOError as e: print "Error: unable to open file: %s" % str(e) return False From 941a59fcb055708830db7f3a2302cdae453c7de5 Mon Sep 17 00:00:00 2001 From: roy_lee Date: Wed, 14 Feb 2018 12:02:17 +0800 Subject: [PATCH 13/14] [Platform] as7312-54x, pushed submodule to new i2c drivers and script. Signed-off-by: roy_lee --- platform/broadcom/sonic-platform-modules-accton | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-accton b/platform/broadcom/sonic-platform-modules-accton index d991871840d8..5c48c84b0f3f 160000 --- a/platform/broadcom/sonic-platform-modules-accton +++ b/platform/broadcom/sonic-platform-modules-accton @@ -1 +1 @@ -Subproject commit d991871840d84b5a6e8c50e97af02f85ca2e3780 +Subproject commit 5c48c84b0f3f5ee8b44f02ff3e0c3d1ad2169066 From 469604862764e8657385497e70006fddf2928ae2 Mon Sep 17 00:00:00 2001 From: roy_lee Date: Wed, 14 Feb 2018 14:22:15 +0800 Subject: [PATCH 14/14] resolved PR New model as7312 54x #1339 merge conflicts on sfputil.py. Signed-off-by: roy_lee --- .../x86_64-accton_as7712_32x-r0/plugins/sfputil.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py index 2e636292bfa9..fd117ee38867 100644 --- a/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py +++ b/device/accton/x86_64-accton_as7712_32x-r0/plugins/sfputil.py @@ -53,7 +53,7 @@ class SfpUtil(SfpUtilBase): _qsfp_ports = range(0, ports_in_block + 1) def __init__(self): - eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom' + eeprom_path = '/sys/bus/i2c/devices/{0}-0050/eeprom' for x in range(0, self._port_end + 1): port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x+1]) self._port_to_eeprom_mapping[x] = port_eeprom_path @@ -64,9 +64,9 @@ def reset(self, port_num): if port_num < self._port_start or port_num > self._port_end: return False - path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset" - port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) - + path = "/sys/bus/i2c/devices/4-0060/module_reset_{0}" + port_ps = path.format(port_num+1) + try: reg_file = open(port_ps, 'w') except IOError as e: @@ -93,8 +93,8 @@ def get_presence(self, port_num): if port_num < self._port_start or port_num > self._port_end: return False - path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present" - port_ps = path.format(self.port_to_i2c_mapping[port_num+1]) + path = "/sys/bus/i2c/devices/4-0060/module_present_{0}" + port_ps = path.format(port_num+1) try: