From df28eceb35eb2b80bd9a8d3313274720538b3314 Mon Sep 17 00:00:00 2001 From: WistronNetwork <106370135+WistronNetwork@users.noreply.github.com> Date: Fri, 1 Jul 2022 00:13:56 +0800 Subject: [PATCH] [Wistron] Add 6512-32r platform support (#10956) Why I did it Add 6512-32r support for Wistron platform Update sw-to3200k for newer branch How I did it Add code in device and platform folder for 6512-32r Update sw-to3200k code both in device and platform folder How to verify it Install on Wistron device and run command to verify Signed-off-by: RogerChang Roger_Chang@wistron.com --- .../x86_64-wistron_6512_32r-r0/default_sku | 1 + .../x86_64-wistron_6512_32r-r0/installer.conf | 4 + .../x86_64-wistron_6512_32r-r0/platform_asic | 1 + .../plugins/eeprom.py | 26 + .../plugins/psuutil.py | 59 + .../plugins/sfputil.py | 220 + .../pmon_daemon_control.json | 3 + .../sonic_platform/__init__.py | 2 + .../sonic_platform/chassis.py | 222 + .../sonic_platform/eeprom.py | 110 + .../sonic_platform/fan.py | 182 + .../sonic_platform/platform.py | 20 + .../sonic_platform/psu.py | 248 + .../sonic_platform/sfp.py | 1443 +++++ .../sonic_platform/thermal.py | 136 + .../sonic_platform/watchdog.py | 73 + .../x86_64-wistron_6512_32r-r0/topo.conf | 1 + .../6512-32_32x400G.config.yaml | 430 ++ .../wistron_6512_32r/buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../wistron_6512_32r/buffers_defaults_t1.j2 | 137 + .../wistron_6512_32r/innovium.77700_A | 59 + .../wistron_6512_32r/innovium.77700_B | 59 + .../wistron_6512_32r/ivm.sai.config.yaml | 8 + .../ivm.sai.datapath.config.yaml | 9 + .../wistron_6512_32r/pg_profile_lookup.ini | 18 + .../wistron_6512_32r/port_config.ini | 33 + .../wistron_6512_32r/qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../wistron_6512_32r/qos_defaults_t1.j2 | 114 + .../wistron_6512_32r/sai.profile | 1 + .../CSV/TL7_DAC_1M.csv | 342 ++ .../CSV/TL7_DAC_3M.csv | 342 ++ .../CSV/TL7_Optics.csv | 289 + .../Wistron_sw_to3200k/buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../Wistron_sw_to3200k/buffers_defaults_t1.j2 | 137 + .../config_32x400G_wistron_sw_to3200k.yaml | 426 ++ .../Wistron_sw_to3200k/innovium.77700_A | 59 + .../Wistron_sw_to3200k/innovium.77700_B | 59 + .../Wistron_sw_to3200k/ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../Wistron_sw_to3200k/pg_profile_lookup.ini | 18 + .../Wistron_sw_to3200k/port_config.ini | 33 + .../Wistron_sw_to3200k/qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../Wistron_sw_to3200k/qos_defaults_t1.j2 | 114 + .../Wistron_sw_to3200k/sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...g_104x1025G_6x100G_wistron_sw_to3200k.yaml | 972 ++++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 111 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...fig_24x400G_8x100G_wistron_sw_to3200k.yaml | 426 ++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 33 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...fig_28x400G_4x100G_wistron_sw_to3200k.yaml | 426 ++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 33 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../Wistron_sw_to3200k_32x100/buffers.json.j2 | 137 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + .../config_32x100G_wistron_sw_to3200k.yaml | 425 ++ .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../Wistron_sw_to3200k_32x100/port_config.ini | 33 + .../Wistron_sw_to3200k_32x100/qos.json.j2 | 114 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../Wistron_sw_to3200k_32x100/sai.profile | 1 + .../buffers.json.j2 | 38 + .../buffers_defaults_def_lossy.j2 | 38 + .../buffers_defaults_t1.j2 | 137 + ...nfig_72x25G_6x400G_wistron_sw_to3200k.yaml | 804 +++ .../innovium.77700_A | 59 + .../innovium.77700_B | 59 + .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 18 + .../port_config.ini | 87 + .../qos.json.j2 | 118 + .../qos_defaults_def_lossy.j2 | 118 + .../qos_defaults_t1.j2 | 114 + .../sai.profile | 1 + .../x86_64-wistron_sw_to3200k-r0/default_sku | 1 + .../installer.conf | 4 + .../platform_asic | 1 + .../plugins/eeprom.py | 26 + .../plugins/psuutil.py | 59 + .../plugins/sfputil.py | 186 + .../pmon_daemon_control.json | 3 + .../sw-to3200k_sonic_serdes.config | 5135 +++++++++++++++++ .../x86_64-wistron_sw_to3200k-r0/topo.conf | 1 + platform/innovium/one-image.mk | 1 + platform/innovium/platform-modules-wistron.mk | 19 + platform/innovium/rules.mk | 1 + .../6512-32r/modules/Makefile | 20 + .../6512-32r/modules/wistron_6512_32r_cpld.c | 953 +++ .../6512-32r/modules/wistron_6512_32r_fan.c | 255 + .../6512-32r/modules/wistron_6512_32r_leds.c | 245 + .../6512-32r/modules/wistron_6512_32r_oom.c | 312 + .../6512-32r/modules/wistron_6512_32r_psu.c | 347 ++ .../modules/wistron_6512_32r_syseeprom.c | 161 + .../modules/wistron_6512_32r_thermal.c | 200 + .../service/6512-32r-platform.service | 13 + .../service/6512-32r-syseeprom.service | 12 + .../service/platform-modules-6512-32r.service | 14 + .../6512-32r/setup.py | 34 + .../6512-32r/utils/platform_sync | 7 + .../6512-32r/utils/platform_syseeprom | 10 + .../6512-32r/utils/sonic-fanthrml-monitor | 416 ++ .../6512-32r/utils/sonic-led-monitor | 70 + .../6512-32r/utils/sonic-psu-monitor | 248 + .../6512-32r/utils/sonic-qsfp-monitor | 479 ++ .../6512-32r/utils/wistron_6512_32r_util.py | 482 ++ .../sonic-platform-modules-wistron/LICENSE | 16 + .../sw-to3200k/cfg/sw-to3200k-modules.conf | 18 + .../sw-to3200k/classes/__init__.py | 0 .../sw-to3200k/modules/Makefile | 20 + .../sw-to3200k/modules/wistron_i2c_psu.c | 469 ++ .../modules/wistron_sw_to3200k_cpld.c | 701 +++ .../modules/wistron_sw_to3200k_fan.c | 299 + .../modules/wistron_sw_to3200k_leds.c | 293 + .../modules/wistron_sw_to3200k_oom.c | 397 ++ .../modules/wistron_sw_to3200k_psu.c | 266 + .../modules/wistron_sw_to3200k_thermal.c | 205 + .../platform-modules-sw-to3200k.service | 14 + .../sw-to3200k/service/to3200k-led.service | 12 + .../service/to3200k-platform.service | 13 + .../sw-to3200k/service/to3200k-pld.service | 12 + .../sw-to3200k/setup.py | 32 + .../sw-to3200k/sonic_platform/__init__.py | 2 + .../sw-to3200k/sonic_platform/chassis.py | 233 + .../sw-to3200k/sonic_platform/eeprom.py | 110 + .../sw-to3200k/sonic_platform/fan.py | 192 + .../sw-to3200k/sonic_platform/platform.py | 20 + .../sw-to3200k/sonic_platform/psu.py | 278 + .../sw-to3200k/sonic_platform/sfp.py | 1515 +++++ .../sw-to3200k/sonic_platform/thermal.py | 165 + .../sw-to3200k/sonic_platform/watchdog.py | 73 + .../sw-to3200k/utils/platform_led | 4 + .../sw-to3200k/utils/platform_pld | 4 + .../sw-to3200k/utils/platform_sync | 7 + .../sw-to3200k/utils/sonic-fanthrml-monitor | 354 ++ .../sw-to3200k/utils/sonic-led-monitor | 201 + .../sw-to3200k/utils/sonic-psu-monitor | 328 ++ .../sw-to3200k/utils/sonic-qsfp-monitor | 399 ++ .../utils/wistron_sw_to3200k_util.py | 442 ++ 181 files changed, 29866 insertions(+) create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/default_sku create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/installer.conf create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/platform_asic create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/topo.conf create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf create mode 100644 platform/innovium/platform-modules-wistron.mk create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/LICENSE create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/default_sku b/device/wistron/x86_64-wistron_6512_32r-r0/default_sku new file mode 100644 index 0000000000..3b19930950 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/default_sku @@ -0,0 +1 @@ +wistron_6512_32r t1 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf new file mode 100644 index 0000000000..d5f9419d77 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=0 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic b/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic new file mode 100644 index 0000000000..84083a7415 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/platform_asic @@ -0,0 +1 @@ +innovium diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py new file mode 100644 index 0000000000..ede2cced3b --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/eeprom.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError (str(e) + "- required module not found") + +def eeprom_check(): + filepath="/sys/bus/i2c/devices/0-0055/eeprom" + if os.path.isfile(filepath): + return 1 #now board, 0x56 + else: + return 0 #now board, 0x57 + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + ret=eeprom_check() + if ret==1: + self.eeprom_path = "/sys/bus/i2c/devices/0-0055/eeprom" + else: + pass + + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py new file mode 100644 index 0000000000..000180c155 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/psuutil.py @@ -0,0 +1,59 @@ +#!/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 +# +############################################################################# + +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 = "/present" + self.psu_oper_status = "/power_good" + self.psu_mapping = { + 2: "0-0059", + 1: "0-005a", + } + + 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/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py new file mode 100644 index 0000000000..8dbc6ba851 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py @@ -0,0 +1,220 @@ +# 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""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/0-00" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/0-0006/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/0-0007/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + port_to_i2c_mapping = { + 0: '10', + 1: '11', + 2: '12', + 3: '13', + 4: '14', + 5: '15', + 6: '16', + 7: '17', + 8: '18', + 9: '19', + 10: '1a', + 11: '1b', + 12: '1c', + 13: '1d', + 14: '1e', + 15: '1f', + 16: '20', + 17: '21', + 18: '22', + 19: '23', + 20: '24', + 21: '25', + 22: '26', + 23: '27', + 24: '28', + 25: '29', + 26: '2a', + 27: '2b', + 28: '2c', + 29: '2d', + 30: '2e', + 31: '2f', + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def is_logical_port(self, port_name): + return True + + def get_logical_to_physical(self, port_name): + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return None + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + port_idx = port_idx // 8 + return [port_idx] + + def __init__(self): + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = self.BASE_OOM_PATH + self.port_to_i2c_mapping[x] + "/eeprom1" + + self._transceiver_presence = {} + 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 + if port_num < 16: + present_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_present" + else: + present_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_present" + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print("Error: unable to access file: %s" % str(e)) + return False + + if content == "1": + return True + + return False + + 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: + return False + if port_num < 16: + lpmode_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_lpmode" + else: + lpmode_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_lpmode" + self.__port_to_is_lpmode = lpmode_path + + try: + val_file = open(self.__port_to_is_lpmode) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print("Error: unable to access file: %s" % str(e)) + return False + + if content == "1": + return True + + return False + + 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: + return False + if port_num < 16: + lpmode_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_lpmode" + else: + lpmode_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_lpmode" + self.__port_to_is_lpmode = lpmode_path + + try: + val_file = open(self.__port_to_is_lpmode, 'w') + val_file.write('1' if lpmode else '0') + val_file.close() + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + return False + + def reset(self, port_num): + raise NotImplementedError + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, self.port_end+1): + port_pres[port] = self.get_presence(port) + + return port_pres + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + forever = False + + 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: + change_status = False + + cur_presence = self._get_sfp_presence() + for port in range(0, self.port_end+1): + if cur_presence[port] != self._transceiver_presence[port]: + if cur_presence[port] == 1: + port_dict[port]='1' + else: + port_dict[port]='0' + change_status = True + + self._transceiver_presence = cur_presence + if change_status: + return True, port_dict + + 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_evt_change_event: Should not reach here.") + return False, {} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json b/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json new file mode 100644 index 0000000000..94592fa8ce --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py new file mode 100644 index 0000000000..29dfc92139 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp', 'thermal', 'fan', 'watchdog'] +from . import platform diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py new file mode 100644 index 0000000000..232ca0ca5f --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# +try: + import sys + import os + import time + import subprocess + from sonic_platform_base.chassis_base import ChassisBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN = 14 +NUM_PSU = 2 +NUM_THERMAL = 8 +NUM_SFP = 32 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "docker > /dev/null 2>&1" +GET_HWSKU_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.hwsku" +GET_PLATFORM_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.platform" + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + super(Chassis, self).__init__() + + # Initialize SKU name and Platform name + self.sku_name = self._get_sku_name() + self.platform_name = self._get_platform_name() + self.name = self.sku_name + + self._transceiver_presence = [0] * NUM_SFP + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp_module = Sfp(index, 'QSFP_DD') + self._sfp_list.append(sfp_module) + + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, NUM_FAN): + fan = Fan(fan_index) + self._fan_list.append(fan) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + sw_reboot_cause = self.__read_txt_file( + reboot_cause_path) or "Unknown" + + if sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + else: + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'Unknown reason' + + return (reboot_cause, description) + + def _get_sku_name(self): + p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def _get_platform_name(self): + p = subprocess.Popen(GET_PLATFORM_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.name + + def get_sfp(self, index): + sfp = None + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format(index, len(self._sfp_list)-1)) + + return sfp + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + port_pres[port] = sfp.get_presence() + + return port_pres + + def get_change_event(self, timeout=0): + port_dict = {} + ret_dict = {'sfp': port_dict} + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) + else: + return False, ret_dict #Incorrect timeout + + while True: + if forever: + timer = 1 + else: + timer = min(timeout, 1) + start_time = time.time() + + time.sleep(timer) + cur_presence = self._get_sfp_presence() + for port in range(0, NUM_SFP): + if cur_presence[port] != self._transceiver_presence[port]: + change_event = True + if cur_presence[port] == 1: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + self._transceiver_presence = cur_presence + if change_event == True: + break + + if not forever: + elapsed_time = time.time() - start_time + timeout = round(timeout - elapsed_time, 3) + if timeout <= 0: + break + + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + sfp.reinit() + + return True, ret_dict diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py new file mode 100644 index 0000000000..9d01b1f866 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +############################################################################# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0055/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except BaseException: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status < 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except OSError: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except OSError: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py new file mode 100644 index 0000000000..aec7e23be5 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_PATH = "/sys/bus/i2c/devices/0-0044/" +FANTRAY_NAME_LIST = ["FANTRAY-1", "FANTRAY-2", + "FANTRAY-3", "FANTRAY-4", + "FANTRAY-5", "FANTRAY-6", "FANTRAY-7"] +FAN_NAME_LIST = ["fan1_front","fan2_front","fan3_front","fan4_front","fan5_front","fan6_front", "fan7_front",\ +"fan1_rear","fan2_rear","fan3_rear","fan4_rear", "fan5_rear", "fan6_rear", "fan7_rear",] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_index): + self.fan_tray_index = fan_index + self.fan_presence = "fan{}_present" + self.fan_direction = "fan{}_direction" + self.fan_speed_rpm = "fan{}_input" + FanBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except BaseException: + return False + return True + + def __search_file_by_name(self, directory, file_name): + for dirpath, dirnames, files in os.walk(directory): + for name in files: + file_path = os.path.join(dirpath, name) + if name in file_name: + return file_path + return None + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_direction.format(index1+1)) + raw = self.__read_txt_file(fan_direction_file).strip('\r\n') + direction = self.FAN_DIRECTION_INTAKE if str( + raw).upper() == "1" else self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 12000 (full speed) + """ + + speed = 0 + if self.fan_tray_index<=13: + index1=self.fan_tray_index + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1)) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + + speed = 0 + if self.fan_tray_index<=13: + index1=self.fan_tray_index + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1)) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return 10 + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + + Note: + Depends on pwm or target mode is selected: + 1) pwm = speed_pc * 255 <-- Currently use this mode. + 2) target_pwm = speed_pc * 100 / 255 + 2.1) set pwm{}_enable to 3 + + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index] + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_presence.format(index1+1)) + present_str = self.__read_txt_file(fan_direction_file) or '1' + + return int(present_str) == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and self.get_speed() > 0 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py new file mode 100644 index 0000000000..44e03cdadb --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py new file mode 100644 index 0000000000..dc13cc1ed8 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py @@ -0,0 +1,248 @@ +#!/usr/bin/env python + +############################################################################# +# psuutil.py +# Platform-specific PSU status interface for SONiC +############################################################################# + +try: + from sonic_platform_base.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] + +class Psu(PsuBase): + """Platform-specific Psu class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/0-005a", + "/sys/bus/i2c/devices/0-0059"] + + def __init__(self, psu_index): + self.index = psu_index + PsuBase.__init__(self) + + + def get_fan(self): + """ + Retrieves object representing the fan module contained in this PSU + Returns: + An object dervied from FanBase representing the fan module + contained in this PSU + """ + # Hardware not supported + return False + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + attr_file ='present' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as psu_prs: + status = int(psu_prs.read()) + except IOError: + return False + + return status == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + attr_file = 'power_good' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_model(self): + """ + Retrieves the model number/name of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query model number + :return: String, denoting model number/name + """ + attr_file ='model' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + model = "" + try: + with open(attr_path, 'r') as psu_model: + model = psu_model.read() + except IOError: + return model + + return model + + def get_mfr_id(self): + """ + Retrieves the manufacturing id of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query mfr id + :return: String, denoting manufacturing id + """ + attr_file ='vendor' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + vendor = "" + try: + with open(attr_path, 'r') as psu_vendor: + vendor = psu_vendor.read() + except IOError: + return vendor + + return vendor + + def get_serial(self): + """ + Retrieves the serial number of a power supply unit (PSU) defined + by 1-based index + :param idx: An integer, 1-based index of the PSU of which to query serial number + :return: String, denoting serial number of the PSU unit + """ + attr_file ='sn' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + sn = "" + try: + with open(attr_path, 'r') as psu_sn: + sn = psu_sn.read() + except IOError: + return sn + + return sn + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + attr_file ='temp1_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + temp = 0.0 + try: + with open(attr_path, 'r') as psu_temp: + temp = float(psu_temp.read()) / 1000 + except IOError: + return temp + + return temp + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return False #Not supported + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + return False #Not supported + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return False #Not supported + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A float number, the output voltage in volts, + e.g. 12.1 + """ + attr_file ='in2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + volt = 0.0 + try: + with open(attr_path, 'r') as psu_volt: + volt = float(psu_volt.read()) / 1000 + except IOError: + return volt + + return volt + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A float number, the electric current in amperes, e.g 15.4 + """ + attr_file ='curr2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + curr = 0.0 + try: + with open(attr_path, 'r') as psu_curr: + curr = float(psu_curr.read()) / 1000 + except IOError: + return curr + + return curr + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A float number, the power in watts, e.g. 302.6 + """ + attr_file ='power2_input' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + power = 0.0 + try: + with open(attr_path, 'r') as psu_power: + power = float(psu_power.read()) / 1000000 + except IOError: + return power + + return power diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py new file mode 100644 index 0000000000..7664999e56 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py @@ -0,0 +1,1443 @@ +#!/usr/bin/env python + +############################################################################# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +############################################################################# +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom + from sonic_py_common.logger import Logger + import sys +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET = 64 +XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH = 1 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +# definitions of the offset and width for values in XCVR_QSFP_DD info eeprom +XCVR_EXT_TYPE_OFFSET_QSFP_DD = 72 +XCVR_EXT_TYPE_WIDTH_QSFP_DD = 2 +XCVR_CONNECTOR_OFFSET_QSFP_DD = 75 +XCVR_CONNECTOR_WIDTH_QSFP_DD = 1 +XCVR_CABLE_LENGTH_OFFSET_QSFP_DD = 74 +XCVR_CABLE_LENGTH_WIDTH_QSFP_DD = 1 +XCVR_HW_REV_OFFSET_QSFP_DD = 36 +XCVR_HW_REV_WIDTH_QSFP_DD = 2 +XCVR_VENDOR_DATE_OFFSET_QSFP_DD = 54 +XCVR_VENDOR_DATE_WIDTH_QSFP_DD = 8 +XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD = 2 +XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD = 1 +XCVR_MEDIA_TYPE_OFFSET_QSFP_DD = 85 +XCVR_MEDIA_TYPE_WIDTH_QSFP_DD = 1 +XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD = 86 +XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD = 32 +XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD = 351 +XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD = 28 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +QSFP_DD_DOM_BULK_DATA_START = 14 +QSFP_DD_DOM_BULK_DATA_SIZE = 4 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 + +# definitions of the offset for values in QSFP_DD info eeprom +QSFP_DD_TYPE_OFFSET = 0 +QSFP_DD_VENDOR_NAME_OFFSET = 1 +QSFP_DD_VENDOR_PN_OFFSET = 20 +QSFP_DD_VENDOR_SN_OFFSET = 38 +QSFP_DD_VENDOR_OUI_OFFSET = 17 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 + +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DD_TEMPE_OFFSET = 14 +QSFP_DD_TEMPE_WIDTH = 2 +QSFP_DD_VOLT_OFFSET = 16 +QSFP_DD_VOLT_WIDTH = 2 +QSFP_DD_TX_BIAS_OFFSET = 42 +QSFP_DD_TX_BIAS_WIDTH = 16 +QSFP_DD_RX_POWER_OFFSET = 58 +QSFP_DD_RX_POWER_WIDTH = 16 +QSFP_DD_TX_POWER_OFFSET = 26 +QSFP_DD_TX_POWER_WIDTH = 16 +QSFP_DD_CHANNL_MON_OFFSET = 154 +QSFP_DD_CHANNL_MON_WIDTH = 48 +QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET = 19 +QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_DD_CHANNL_TX_FAULT_STATUS_OFFSET = 7 +QSFP_DD_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_DD_MODULE_THRESHOLD_OFFSET = 0 +QSFP_DD_MODULE_THRESHOLD_WIDTH = 72 +QSFP_DD_CHANNL_STATUS_OFFSET = 26 +QSFP_DD_CHANNL_STATUS_WIDTH = 1 + +QSFP_TYPE_CODE_LIST = [ + '0d', # QSFP+ or later + '11' # QSFP28 or later +] + +QSFP_DD_TYPE_CODE_LIST = [ + '18' # QSFP-DD Double Density 8X Pluggable Transceiver +] + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes','FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia','FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +QSFP_TYPE = "QSFP" +QSFP_DD_TYPE = "QSFP_DD" + +# Global logger class instance +logger = Logger() + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 0 + PORT_END = 31 + + port_to_i2c_mapping = { + 0: '10', + 1: '11', + 2: '12', + 3: '13', + 4: '14', + 5: '15', + 6: '16', + 7: '17', + 8: '18', + 9: '19', + 10: '1a', + 11: '1b', + 12: '1c', + 13: '1d', + 14: '1e', + 15: '1f', + 16: '20', + 17: '21', + 18: '22', + 19: '23', + 20: '24', + 21: '25', + 22: '26', + 23: '27', + 24: '28', + 25: '29', + 26: '2a', + 27: '2b', + 28: '2c', + 29: '2d', + 30: '2e', + 31: '2f', + } + + _sfp_port = range(32, PORT_END + 1) + RESET_1_16_PATH = "/sys/bus/i2c/devices/0-0006/port{}_reset" + RESET_17_32_PATH = "/sys/bus/i2c/devices/0-0007/port{}_reset" + PRS_1_16_PATH = "/sys/bus/i2c/devices/0-0006/port{}_present" + PRS_17_32_PATH = "/sys/bus/i2c/devices/0-0007/port{}_present" + + def __init__(self, sfp_index, sfp_type): + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + # Init eeprom path + eeprom_path_prefix = '/sys/bus/i2c/devices/0-00' + self.port_to_eeprom1_mapping = {} + self.port_to_eeprom2_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + self.port_to_eeprom1_mapping[x] = eeprom_path_prefix + self.port_to_i2c_mapping[x] + '/eeprom1' + self.port_to_eeprom2_mapping[x] = eeprom_path_prefix + self.port_to_i2c_mapping[x] + '/eeprom2' + + self._detect_sfp_type(sfp_type) + self._dom_capability_detect() + SfpBase.__init__(self) + + def reinit(self): + self._detect_sfp_type(self.sfp_type) + self._dom_capability_detect() + + def get_presence(self): + """ + Retrieves the presence of the SFP + Returns: + bool: True if SFP is present, False if not + """ + presence = False + try: + if self.index < 16: + pres_path=self.PRS_1_16_PATH.format(self.port_num) + else: + pres_path=self.PRS_17_32_PATH.format(self.port_num) + with open(pres_path, 'r') as sfp_presence: + presence = int(sfp_presence.read(), 16) + except IOError: + return False + logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) + return presence + + def _read_eeprom_specific_bytes(self, offset, num_bytes): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + if offset < 256: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom1_mapping[self.index] + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom2_mapping[self.index] + offset = offset - 256 + + try: + sysfsfile_eeprom = open(sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + + except BaseException: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def _detect_sfp_type(self, sfp_type): + eeprom_raw = [] + eeprom_raw = self._read_eeprom_specific_bytes(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH) + if eeprom_raw: + if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: + self.sfp_type = QSFP_TYPE + elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: + self.sfp_type = QSFP_DD_TYPE + else: + # we don't regonize this identifier value, treat the xSFP module as the default type + self.sfp_type = sfp_type + logger.log_info("Identifier value of {} module {} is {} which isn't regonized and will be treated as default type ({})".format( + sfp_type, self.index, eeprom_raw[0], sfp_type + )) + else: + # eeprom_raw being None indicates the module is not present. + # in this case we treat it as the default type according to the SKU + self.sfp_type = sfp_type + + def _dom_capability_detect(self): + if not self.get_presence(): + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_tx_power_supported = False + self.dom_channel_monitor_supported = False + self.dom_module_monitor_supported = False + self.dom_channel_treshold_supported = False + self.dom_module_treshold_supported =False + self.calibration = 0 + return + + self.dom_channel_monitor_supported = False + self.dom_module_monitor_supported = True + self.dom_channel_treshold_supported = False + self.dom_module_treshold_supported =False + + if self.sfp_type == QSFP_TYPE: + self.calibration = 1 + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = 128 + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self._read_eeprom_specific_bytes(QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int(qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + self.dom_supported = True + self.calibration = 1 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self._read_eeprom_specific_bytes(QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params(qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability['data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator(qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.calibration = 0 + self.qsfp_page3_available = False + + elif self.sfp_type == QSFP_DD_TYPE: + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + + offset = 0 + # two types of QSFP-DD cable types supported: Copper and Optical. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD), XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD) + if qsfp_dom_capability_raw is not None: + self.dom_temp_supported = True + self.dom_volt_supported = True + dom_capability = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0) + if dom_capability['data']['Flat_MEM']['value'] == 'Off': + self.dom_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + else: + self.dom_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.dom_tx_bias_power_supported = False + self.dom_thresholds_supported = False + + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ================================================================================ + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + application_advertisement |1*255VCHAR |supported applications advertisement + ================================================================================ + """ + transceiver_info_dict = {} + compliance_code_dict = {} + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 128 + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) + + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['application_advertisement'] = 'N/A' + + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + sfp_ext_specification_compliance_raw = self._read_eeprom_specific_bytes(offset + XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET, XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH) + if sfp_ext_specification_compliance_raw is not None: + sfp_ext_specification_compliance_data = sfpi_obj.parse_ext_specification_compliance(sfp_ext_specification_compliance_raw[0 : 1], 0) + if sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] != "Unspecified": + compliance_code_dict['Extended Specification compliance'] = sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] + transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) + transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + #QSFP-DD + else: + offset = 128 + + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET_QSFP_DD), XCVR_HW_REV_WIDTH_QSFP_DD) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + else: + return None + + sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) + else: + return None + + sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET_QSFP_DD), XCVR_VENDOR_DATE_WIDTH_QSFP_DD) + if sfp_vendor_date_raw is not None: + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) + else: + return None + + sfp_connector_raw = self._read_eeprom_specific_bytes((offset + XCVR_CONNECTOR_OFFSET_QSFP_DD), XCVR_CONNECTOR_WIDTH_QSFP_DD) + if sfp_connector_raw is not None: + sfp_connector_data = sfpi_obj.parse_connector(sfp_connector_raw, 0) + else: + return None + + sfp_ext_identifier_raw = self._read_eeprom_specific_bytes((offset + XCVR_EXT_TYPE_OFFSET_QSFP_DD), XCVR_EXT_TYPE_WIDTH_QSFP_DD) + if sfp_ext_identifier_raw is not None: + sfp_ext_identifier_data = sfpi_obj.parse_ext_iden(sfp_ext_identifier_raw, 0) + else: + return None + + sfp_cable_len_raw = self._read_eeprom_specific_bytes((offset + XCVR_CABLE_LENGTH_OFFSET_QSFP_DD), XCVR_CABLE_LENGTH_WIDTH_QSFP_DD) + if sfp_cable_len_raw is not None: + sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_cable_len_raw, 0) + else: + return None + + sfp_media_type_raw = self._read_eeprom_specific_bytes(XCVR_MEDIA_TYPE_OFFSET_QSFP_DD, XCVR_MEDIA_TYPE_WIDTH_QSFP_DD) + if sfp_media_type_raw is not None: + sfp_media_type_dict = sfpi_obj.parse_media_type(sfp_media_type_raw, 0) + if sfp_media_type_dict is None: + return None + + host_media_list = "" + sfp_application_type_first_list = self._read_eeprom_specific_bytes((XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD) + possible_application_count = 8 + if sfp_application_type_first_list is not None: + sfp_application_type_list = sfp_application_type_first_list + else: + return None + + for i in range(0, possible_application_count): + if sfp_application_type_list[i * 4] == 'ff': + break + host_electrical, media_interface = sfpi_obj.parse_application(sfp_media_type_dict, sfp_application_type_list[i * 4], sfp_application_type_list[i * 4 + 1]) + host_media_list = host_media_list + host_electrical + ' - ' + media_interface + '\n\t\t\t\t ' + else: + return None + + transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) + transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) + transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) + transceiver_info_dict['hardware_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) + transceiver_info_dict['serial'] = str(sfp_vendor_sn_data['data']['Vendor SN']['value']) + transceiver_info_dict['vendor_oui'] = str(sfp_vendor_oui_data['data']['Vendor OUI']['value']) + transceiver_info_dict['vendor_date'] = str(sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value']) + transceiver_info_dict['connector'] = str(sfp_connector_data['data']['Connector']['value']) + transceiver_info_dict['encoding'] = "Not supported for CMIS cables" + transceiver_info_dict['ext_identifier'] = str(sfp_ext_identifier_data['data']['Extended Identifier']['value']) + transceiver_info_dict['ext_rateselect_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['specification_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['cable_type'] = "Length Cable Assembly(m)" + transceiver_info_dict['cable_length'] = str(sfp_cable_len_data['data']['Length Cable Assembly(m)']['value']) + transceiver_info_dict['nominal_bit_rate'] = "Not supported for CMIS cables" + transceiver_info_dict['application_advertisement'] = host_media_list + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = {} + + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'rx5power', 'rx6power', + 'rx7power', 'rx8power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx5bias', 'tx6bias', + 'tx7bias', 'tx8bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power', + 'tx5power', 'tx6power', + 'tx7power', 'tx8power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) + + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + + #QSFP-DD + else: + offset = 0 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_DOM_BULK_DATA_START), QSFP_DD_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_DD_TEMPE_OFFSET - QSFP_DD_DOM_BULK_DATA_START + end = start + QSFP_DD_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_DD_VOLT_OFFSET - QSFP_DD_DOM_BULK_DATA_START + end = start + QSFP_DD_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = {} + + dom_info_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning' + ] + transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = QSFP_MODULE_UPPER_PAGE3_START + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), + QSFP_CHANNL_THRESHOLD_WIDTH) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + #QSFP-DD + else: + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + if not self.dom_thresholds_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + # page 02 (we put page 2 to byte 256~384) + offset = 256 + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_MODULE_THRESHOLD_OFFSET), QSFP_DD_MODULE_THRESHOLD_WIDTH) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TxPowerLowWarning']['value'] + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + if not self.dom_supported: + return None + + rx_los_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + + #QSFP-DD + else: + # page 11h (we put page 2 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 8) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + rx_los_list.append(rx_los_data & 0x10 != 0) + rx_los_list.append(rx_los_data & 0x20 != 0) + rx_los_list.append(rx_los_data & 0x40 != 0) + rx_los_list.append(rx_los_data & 0x80 != 0) + + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + if not self.dom_supported: + return None + + tx_fault_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + + #QSFP-DD + else: + return None + + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + + for QSFP, the disable states of each channel which are the lower 4 bits in byte 85 page a0 + for SFP, the TX Disable State and Soft TX Disable Select is ORed as the tx_disable status returned + These two bits are bit 7 & 6 in byte 110 page a2 respectively + """ + if not self.dom_supported: + return None + + tx_disable_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + + #QSFP-DD + else: + if self.dom_rx_tx_power_bias_supported: + # page 11h (we put page 1 to byte 384~512) + offset = 384 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET), QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + tx_disable_list.append(tx_disable_data & 0x10 != 0) + tx_disable_list.append(tx_disable_data & 0x20 != 0) + tx_disable_list.append(tx_disable_data & 0x40 != 0) + tx_disable_list.append(tx_disable_data & 0x80 != 0) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return 0 + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + if not self.dom_supported: + return None + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + else: + return None + else: + return None + + #QSFP-DD + else: + offset = 0 + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TEMPE_OFFSET), QSFP_DD_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + return None + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + if not self.dom_supported: + return None + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + else: + return None + return None + + #QSFP-DD + else: + offset = 0 + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VOLT_OFFSET), QSFP_DD_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + return None + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Bias']['value'])) + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if dom_tx_bias_power_supported: + dom_tx_bias_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_BIAS_OFFSET), QSFP_DD_TX_BIAS_WIDTH) + if dom_tx_bias_raw is not None: + dom_tx_bias_data = sfpd_obj.parse_dom_tx_bias(dom_tx_bias_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX4Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX5Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX6Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX7Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX8Bias']['value'])) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + elif self.sfp_type == QSFP_DD_TYPE: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_rx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_RX_POWER_OFFSET), QSFP_DD_RX_POWER_WIDTH) + if dom_rx_power_raw is not None: + dom_rx_power_data = sfpd_obj.parse_dom_rx_power(dom_rx_power_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX4Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX5Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX6Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX7Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX8Power']['value'])) + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + offset = 384 + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_tx_power_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TX_POWER_OFFSET), QSFP_DD_TX_POWER_WIDTH) + if dom_tx_power_raw is not None: + dom_tx_power_data = sfpd_obj.parse_dom_tx_power(dom_tx_power_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX4Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX5Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX6Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX7Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX8Power']['value'])) + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + # SFP doesn't support this feature + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + + name='port'+str(self.index) + return name + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("serial", "N/A") + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py new file mode 100644 index 0000000000..942e6b7be3 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python + +############################################################################# +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + SYSFS_THERMAL_DIR = ["/sys/bus/i2c/devices/0-0068/", + "/sys/bus/i2c/devices/0-004a/", + "/sys/bus/i2c/devices/0-0049/", + "/sys/bus/i2c/devices/0-004b/", + "/sys/bus/i2c/devices/0-004c/", + "/sys/bus/i2c/devices/0-004f/", + "/sys/bus/i2c/devices/0-0048/", + "/sys/bus/i2c/devices/0-004d/"] + + def __init__(self, thermal_index): + self.index = thermal_index + + # Add thermal name + self.THERMAL_NAME_LIST.append("Switch") + self.THERMAL_NAME_LIST.append("UFRNT1") + self.THERMAL_NAME_LIST.append("UFRNT2") + self.THERMAL_NAME_LIST.append("UFRNT3") + self.THERMAL_NAME_LIST.append("UFRNT4") + self.THERMAL_NAME_LIST.append("UREAR1") + self.THERMAL_NAME_LIST.append("UCPUB") + self.THERMAL_NAME_LIST.append("UFANB") + ThermalBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __get_temp(self, temp_file): + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) + raw_temp = self.__read_txt_file(temp_file_path) + temp = float(raw_temp)/1000 + return "{:.3f}".format(temp) + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_file = "temp1_input" + return float(self.__get_temp(temp_file)) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + :return: A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(3) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + :return: A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(0) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + + temp_file = "temp1_max" + return float(self.__get_temp(temp_file)) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + :return: A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + + temp_file = "temp1_crit" + return float(self.__get_temp(temp_file)) + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + temp_file = "temp1_input" + temp_file_path = os.path.join(self.hwmon_path, temp_file) + return os.path.isfile(temp_file_path) + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + + return True + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py new file mode 100644 index 0000000000..820dd54f95 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +######################################################################## +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + print("INFO: Watchdog __init__") + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + print("ERROR: Platform did not implement arm()") + raise NotImplementedError + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + print("ERROR: Platform did not implement disarm()") + raise NotImplementedError + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + print("ERROR: Platform did not implement is_armed()") + raise NotImplementedError + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + S5232 doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + print("ERROR: Platform did not implement get_remaining_time()") + raise NotImplementedError diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf b/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf new file mode 100644 index 0000000000..795ea43143 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml new file mode 100644 index 0000000000..17ed53abb1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/6512-32_32x400G.config.yaml @@ -0,0 +1,430 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + mac_clk: "1340" + skip_pll_check: "false" + sys_clk: "1720" + mbist_on_init: "true" + ifc_clk: "1200" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - id: "89" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - id: "81" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - id: "73" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - id: "65" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - id: "57" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - id: "49" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - id: "41" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - id: "33" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - id: "153" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - id: "145" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - id: "137" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - id: "129" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - id: "121" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - id: "113" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - id: "105" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - id: "97" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - id: "209" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - id: "217" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - id: "193" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - id: "201" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - id: "177" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - id: "185" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - id: "161" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - id: "169" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - id: "17" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - id: "25" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - id: "1" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - id: "9" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - id: "241" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - id: "249" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - id: "225" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - id: "233" + fec: "KPFEC" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + - id: "257" + fec: "NONE" + lanes: "0:1" + serdes_group: "32" + speed: "10G" + sysport: "257" + type: "mgmt 0" + - id: "258" + fec: "NONE" + lanes: "1:1" + serdes_group: "32" + speed: "10G" + sysport: "258" + type: "mgmt 1" + isg: + - id: "11" + lane_swap: "27163504" + rx_polarity: "01010000" + tx_polarity: "01100000" + - id: "10" + lane_swap: "51604372" + rx_polarity: "11001000" + tx_polarity: "11110000" + - id: "9" + lane_swap: "17032546" + rx_polarity: "10001000" + tx_polarity: "00000100" + - id: "8" + lane_swap: "70435162" + rx_polarity: "11000100" + tx_polarity: "00100101" + - id: "7" + lane_swap: "27053416" + rx_polarity: "00011001" + tx_polarity: "10001000" + - id: "6" + lane_swap: "70635142" + rx_polarity: "10001000" + tx_polarity: "01100001" + - id: "5" + lane_swap: "27053416" + rx_polarity: "00001001" + tx_polarity: "00001000" + - id: "4" + lane_swap: "62405173" + rx_polarity: "11000101" + tx_polarity: "10110000" + - id: "19" + lane_swap: "06152347" + rx_polarity: "11010110" + tx_polarity: "10001110" + - id: "18" + lane_swap: "73614052" + rx_polarity: "11001100" + tx_polarity: "11100001" + - id: "17" + lane_swap: "17053426" + rx_polarity: "10001001" + tx_polarity: "00001000" + - id: "16" + lane_swap: "54216073" + rx_polarity: "10000011" + tx_polarity: "01001010" + - id: "15" + lane_swap: "36072514" + rx_polarity: "10100000" + tx_polarity: "10100001" + - id: "14" + lane_swap: "50763241" + rx_polarity: "00010001" + tx_polarity: "01110001" + - id: "13" + lane_swap: "26071435" + rx_polarity: "00000011" + tx_polarity: "00101001" + - id: "12" + lane_swap: "43510627" + rx_polarity: "11100100" + tx_polarity: "00011101" + - id: "26" + lane_swap: "31427506" + rx_polarity: "10011000" + tx_polarity: "11110001" + - id: "27" + lane_swap: "21735406" + rx_polarity: "01011110" + tx_polarity: "10011100" + - id: "24" + lane_swap: "07162435" + rx_polarity: "10010000" + tx_polarity: "10001010" + - id: "25" + lane_swap: "64501372" + rx_polarity: "11010001" + tx_polarity: "10001010" + - id: "22" + lane_swap: "35071624" + rx_polarity: "00100011" + tx_polarity: "11001011" + - id: "23" + lane_swap: "64705132" + rx_polarity: "11010100" + tx_polarity: "11101000" + - id: "20" + lane_swap: "16270453" + rx_polarity: "00101100" + tx_polarity: "00001001" + - id: "21" + lane_swap: "71356204" + rx_polarity: "01100010" + tx_polarity: "00001011" + - id: "2" + lane_swap: "37260145" + rx_polarity: "10011010" + tx_polarity: "11000000" + - id: "3" + lane_swap: "47512630" + rx_polarity: "10010100" + tx_polarity: "10101101" + - id: "0" + lane_swap: "05462713" + rx_polarity: "01000000" + tx_polarity: "10010010" + - id: "1" + lane_swap: "71605432" + rx_polarity: "00000000" + tx_polarity: "11000101" + - id: "30" + lane_swap: "37251604" + rx_polarity: "11000010" + tx_polarity: "11001000" + - id: "31" + lane_swap: "42736051" + rx_polarity: "10000110" + tx_polarity: "01000010" + - id: "28" + lane_swap: "01245736" + rx_polarity: "10110101" + tx_polarity: "10000001" + - id: "29" + lane_swap: "52706134" + rx_polarity: "00010010" + tx_polarity: "10101010" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml new file mode 100644 index 0000000000..cf505b299d --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.config.yaml @@ -0,0 +1,8 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/6512-32_32x400G.config.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini new file mode 100644 index 0000000000..66220e66a8 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv new file mode 100644 index 0000000000..b9f4e750a8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_1M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_1M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G ,PAM4,,,,,,,ANLT 25G/100G ,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,0,1,130,100,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv new file mode 100644 index 0000000000..b6bbd017e4 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_DAC_3M.csv @@ -0,0 +1,342 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,DAC_3M,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,SPEED,ENCODING,,,,,,,,,, +,,,50G/400G,PAM4,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,10G/40G,NRZ,,,,,,,LT 50G/400G,PAM4,,,,,,,ANLT 25G/100G,NRZ,,,,,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_CTLE_LF,RX_CTLE_HF,RX_CTLE_BW,LINK_TRAINING,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_25G,SD_RESET_THRESHOLD_25G,LINK_TRAINING,AN,AN_ABILITY,FEC +0,0,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +1,0,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +2,0,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +3,0,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +4,0,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +5,0,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +6,0,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +7,0,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +8,1,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +9,1,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +10,1,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +11,1,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +12,1,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +13,1,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +14,1,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +15,1,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +16,2,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +17,2,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +18,2,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +19,2,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +20,2,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +21,2,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +22,2,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +23,2,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +24,3,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +25,3,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +26,3,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +27,3,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +28,3,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +29,3,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +30,3,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +31,3,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +32,4,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +33,4,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +34,4,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +35,4,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +36,4,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +37,4,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +38,4,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +39,4,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +40,5,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +41,5,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +42,5,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +43,5,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +44,5,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +45,5,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +46,5,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +47,5,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +48,6,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +49,6,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +50,6,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +51,6,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +52,6,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +53,6,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +54,6,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +55,6,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +56,7,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +57,7,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +58,7,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +59,7,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +60,7,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +61,7,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +62,7,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +63,7,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +64,8,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +65,8,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +66,8,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +67,8,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +68,8,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +69,8,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +70,8,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +71,8,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +72,9,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +73,9,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +74,9,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +75,9,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +76,9,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +77,9,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +78,9,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +79,9,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +80,10,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +81,10,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +82,10,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +83,10,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +84,10,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +85,10,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +86,10,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +87,10,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +88,11,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +89,11,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +90,11,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +91,11,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +92,11,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +93,11,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +94,11,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +95,11,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +96,12,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +97,12,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +98,12,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +99,12,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +100,12,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +101,12,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +102,12,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +103,12,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +104,13,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +105,13,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +106,13,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +107,13,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +108,13,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +109,13,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +110,13,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +111,13,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +112,14,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +113,14,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +114,14,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +115,14,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +116,14,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +117,14,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +118,14,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +119,14,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +120,15,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +121,15,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +122,15,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +123,15,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +124,15,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +125,15,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +126,15,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +127,15,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +128,16,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +129,16,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +130,16,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +131,16,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +132,16,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +133,16,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +134,16,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +135,16,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +136,17,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +137,17,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +138,17,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +139,17,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +140,17,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +141,17,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +142,17,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +143,17,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +144,18,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +145,18,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +146,18,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +147,18,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +148,18,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +149,18,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +150,18,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +151,18,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +152,19,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +153,19,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +154,19,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +155,19,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +156,19,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +157,19,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +158,19,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +159,19,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +160,20,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +161,20,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +162,20,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +163,20,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +164,20,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +165,20,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +166,20,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +167,20,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +168,21,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +169,21,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +170,21,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +171,21,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +172,21,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +173,21,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +174,21,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +175,21,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +176,22,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +177,22,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +178,22,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +179,22,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +180,22,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +181,22,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +182,22,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +183,22,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +184,23,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +185,23,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +186,23,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +187,23,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +188,23,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +189,23,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +190,23,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +191,23,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +192,24,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +193,24,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +194,24,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +195,24,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +196,24,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +197,24,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +198,24,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +199,24,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +200,25,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +201,25,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +202,25,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +203,25,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +204,25,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +205,25,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +206,25,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +207,25,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +208,26,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +209,26,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +210,26,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +211,26,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +212,26,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +213,26,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +214,26,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +215,26,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +216,27,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +217,27,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +218,27,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +219,27,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +220,27,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +221,27,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +222,27,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +223,27,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +224,28,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +225,28,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +226,28,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +227,28,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +228,28,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +229,28,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +230,28,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +231,28,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +232,29,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +233,29,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +234,29,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +235,29,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +236,29,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +237,29,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +238,29,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +239,29,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +240,30,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +241,30,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +242,30,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +243,30,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +244,30,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +245,30,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +246,30,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +247,30,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +248,31,0,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +249,31,1,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +250,31,2,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +251,31,3,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +252,31,4,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +253,31,5,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +254,31,6,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +255,31,7,0,0,0,0,0,Medium,HIGH,0,2,0,0,0,0,0,0,2,2,130,150,Low,Low,5,TRUE,0,3,2,-2,0,4,0,1,0,0,2,Medium,High,0,10,10,1,0,1,130,100,Low,Low,0,NA,1,1,100GBASE-KR4,NONE +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv new file mode 100644 index 0000000000..758ee73173 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/CSV/TL7_Optics.csv @@ -0,0 +1,289 @@ +VERSION,CABLE TYPE,VENDOR,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +1.2,OPTICS,GENERIC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,SPEED,ENCODING,,,,,,,,,,SPEED,ENCODING,,,,,,,,,,,,,,SPEED,ENCODING,,,,,, +,,,50G/400G,PAM4,,,,,,,,,,25G/100G,NRZ,,,,,,,,,,,,,,10G/40G,NRZ,,,,,, +index,Front Port,lane,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_EQ_COARSE_TUNE_EFFORT_50G,RX_EQ_FINE_TUNE_EFFORT_50G,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,Optical Module CTLE,RX_GAINSHAPE1,RX_GAINSHAPE2,RX_AGC_TARGET,RX_EYE_DISQUALIFY_THRESHOLD_25G,RX_EQ_COARSE_TUNE_EFFORT_25G,RX_EQ_FINE_TUNE_EFFORT_25G,SD_RESET_THRESHOLD,SD_RESET_25G,LINK_TRAINING,TX_EQ_ATTN,TX_EQ_PRE1,TX_EQ_PRE2,TX_EQ_PRE3,TX_EQ_POST,RX_GAINSHAPE1,RX_GAINSHAPE2,LINK_TRAINING +0,0,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +1,0,1,0,4,-1,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +2,0,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +3,0,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +4,0,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +5,0,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +6,0,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +7,0,7,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +8,1,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +9,1,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +10,1,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +11,1,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +12,1,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +13,1,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +14,1,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +15,1,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +16,2,0,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +17,2,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +18,2,2,0,4,0,0,0,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +19,2,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +20,2,4,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +21,2,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +22,2,6,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +23,2,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +24,3,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +25,3,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +26,3,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +27,3,3,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +28,3,4,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +29,3,5,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +30,3,6,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +31,3,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +32,4,0,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,1,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +33,4,1,0,2,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +34,4,2,0,4,0,0,2,4,Medium,High,0,2,0,0,2,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +35,4,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +36,4,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +37,4,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +38,4,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +39,4,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +40,5,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +41,5,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +42,5,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +43,5,3,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +44,5,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +45,5,5,0,2,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +46,5,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +47,5,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +48,6,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +49,6,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +50,6,2,0,4,0,0,2,4,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +51,6,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +52,6,4,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +53,6,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +54,6,6,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +55,6,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +56,7,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +57,7,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +58,7,2,0,4,-1,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +59,7,3,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +60,7,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +61,7,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +62,7,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +63,7,7,0,4,0,0,4,4,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +64,8,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +65,8,1,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +66,8,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +67,8,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +68,8,4,0,4,0,0,4,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +69,8,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +70,8,6,0,2,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +71,8,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +72,9,0,0,4,0,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +73,9,1,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +74,9,2,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +75,9,3,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +76,9,4,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +77,9,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +78,9,6,0,4,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +79,9,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +80,10,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +81,10,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +82,10,2,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +83,10,3,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +84,10,4,0,4,-1,0,4,6,Medium,High,0,2,0,0,4,0,0,4,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +85,10,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +86,10,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +87,10,7,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +88,11,0,0,4,0,0,0,6.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +89,11,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +90,11,2,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +91,11,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +92,11,4,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +93,11,5,0,4,0,0,2,7,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +94,11,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +95,11,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +96,12,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +97,12,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +98,12,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +99,12,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +100,12,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +101,12,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +102,12,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +103,12,7,0,4,0,0,0,5.5,Medium,High,0,2,0,1,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +104,13,0,0,2,0,0,4,4.5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +105,13,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +106,13,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +107,13,3,0,2,0,0,2,4.5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +108,13,4,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +109,13,5,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,1,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +110,13,6,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +111,13,7,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +112,14,0,0,4,0,0,0,5,Medium,High,0,2,0,0,2,0,0,2,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +113,14,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +114,14,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +115,14,3,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +116,14,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +117,14,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +118,14,6,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +119,14,7,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +120,15,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +121,15,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +122,15,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +123,15,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +124,15,4,0,4,-1,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +125,15,5,0,4,0,0,0,5,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +126,15,6,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +127,15,7,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +128,16,0,0,2,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +129,16,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +130,16,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,1,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +131,16,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +132,16,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +133,16,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +134,16,6,0,4,0,0,0,6.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +135,16,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +136,17,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +137,17,1,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +138,17,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +139,17,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +140,17,4,1,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +141,17,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +142,17,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +143,17,7,0,4,0,0,2,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +144,18,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +145,18,1,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +146,18,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +147,18,3,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +148,18,4,0,2,0,0,0,7,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +149,18,5,0,2,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +150,18,6,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +151,18,7,0,4,0,0,4,4,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +152,19,0,0,2,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +153,19,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +154,19,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +155,19,3,0,4,0,0,-2,6,Medium,High,0,2,0,0,4,-1,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +156,19,4,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +157,19,5,0,4,0,0,0,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +158,19,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +159,19,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +160,20,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +161,20,1,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +162,20,2,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +163,20,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +164,20,4,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +165,20,5,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +166,20,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +167,20,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +168,21,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +169,21,1,0,4,-1,0,0,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +170,21,2,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +171,21,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +172,21,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +173,21,5,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +174,21,6,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +175,21,7,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +176,22,0,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +177,22,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +178,22,2,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +179,22,3,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +180,22,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,-1,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +181,22,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +182,22,6,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +183,22,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +184,23,0,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +185,23,1,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +186,23,2,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +187,23,3,0,4,0,0,0,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +188,23,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +189,23,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +190,23,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +191,23,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +192,24,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +193,24,1,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +194,24,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +195,24,3,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +196,24,4,0,4,0,0,4,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +197,24,5,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +198,24,6,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +199,24,7,0,4,0,0,2,4,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +200,25,0,0,4,0,0,0,5.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +201,25,1,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +202,25,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +203,25,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +204,25,4,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +205,25,5,0,4,0,0,0,5,Medium,High,0,2,0,1,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +206,25,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +207,25,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +208,26,0,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,-1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +209,26,1,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +210,26,2,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +211,26,3,0,4,0,0,2,4.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +212,26,4,0,2,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +213,26,5,0,4,0,0,0,5.5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +214,26,6,0,4,0,0,4,3.5,Medium,High,0,2,0,0,2,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +215,26,7,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +216,27,0,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +217,27,1,0,4,0,0,2,6,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +218,27,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +219,27,3,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +220,27,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +221,27,5,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +222,27,6,0,2,0,0,0,6,Medium,High,0,2,0,0,4,0,0,2,5,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +223,27,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +224,28,0,0,4,0,0,0,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +225,28,1,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +226,28,2,0,4,0,0,0,4.5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +227,28,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +228,28,4,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +229,28,5,0,2,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +230,28,6,0,2,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +231,28,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,0,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +232,29,0,0,4,0,0,4,4,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +233,29,1,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +234,29,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +235,29,3,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +236,29,4,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +237,29,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +238,29,6,0,4,0,0,2,5,Medium,High,0,2,0,0,2,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +239,29,7,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +240,30,0,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +241,30,1,0,4,0,0,2,5.5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +242,30,2,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +243,30,3,0,2,0,0,2,6,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +244,30,4,0,4,0,0,2,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +245,30,5,0,4,0,0,4,5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +246,30,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +247,30,7,0,4,0,0,4,5,Medium,High,0,2,0,0,2,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +248,31,0,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +249,31,1,0,4,0,-1,2,5.5,Medium,High,0,2,0,0,4,0,1,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +250,31,2,0,4,0,0,2,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +251,31,3,0,4,0,0,4,4.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +252,31,4,0,4,-1,0,4,5.5,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +253,31,5,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,4,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +254,31,6,0,4,0,0,2,5,Medium,High,0,2,0,0,4,-1,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +255,31,7,0,4,0,0,2,5.5,Medium,High,0,2,0,0,4,0,0,2,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..23445c6ded --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/config_32x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml new file mode 100644 index 0000000000..0c1644ab7d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini new file mode 100644 index 0000000000..66220e66a8 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..2e019733c4 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/config_104x1025G_6x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,972 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "NONE" + id: "193" + lanes: "0:1" + serdes_group: "24" + speed: "10G" + sysport: "193" + type: "eth" + - fec: "NONE" + id: "194" + lanes: "1:1" + serdes_group: "24" + speed: "10G" + sysport: "194" + type: "eth" + - fec: "NONE" + id: "195" + lanes: "2:1" + serdes_group: "24" + speed: "10G" + sysport: "195" + type: "eth" + - fec: "NONE" + id: "196" + lanes: "3:1" + serdes_group: "24" + speed: "10G" + sysport: "196" + type: "eth" + - fec: "NONE" + id: "201" + lanes: "0:1" + serdes_group: "25" + speed: "10G" + sysport: "201" + type: "eth" + - fec: "NONE" + id: "202" + lanes: "1:1" + serdes_group: "25" + speed: "10G" + sysport: "202" + type: "eth" + - fec: "NONE" + id: "203" + lanes: "2:1" + serdes_group: "25" + speed: "10G" + sysport: "203" + type: "eth" + - fec: "NONE" + id: "204" + lanes: "3:1" + serdes_group: "25" + speed: "10G" + sysport: "204" + type: "eth" + - fec: "NONE" + id: "177" + lanes: "0:1" + serdes_group: "22" + speed: "10G" + sysport: "177" + type: "eth" + - fec: "NONE" + id: "178" + lanes: "1:1" + serdes_group: "22" + speed: "10G" + sysport: "178" + type: "eth" + - fec: "NONE" + id: "179" + lanes: "2:1" + serdes_group: "22" + speed: "10G" + sysport: "179" + type: "eth" + - fec: "NONE" + id: "180" + lanes: "3:1" + serdes_group: "22" + speed: "10G" + sysport: "180" + type: "eth" + - fec: "NONE" + id: "185" + lanes: "0:1" + serdes_group: "23" + speed: "10G" + sysport: "185" + type: "eth" + - fec: "NONE" + id: "186" + lanes: "1:1" + serdes_group: "23" + speed: "10G" + sysport: "186" + type: "eth" + - fec: "NONE" + id: "187" + lanes: "2:1" + serdes_group: "23" + speed: "10G" + sysport: "187" + type: "eth" + - fec: "NONE" + id: "188" + lanes: "3:1" + serdes_group: "23" + speed: "10G" + sysport: "188" + type: "eth" + - fec: "NONE" + id: "161" + lanes: "0:1" + serdes_group: "20" + speed: "10G" + sysport: "161" + type: "eth" + - fec: "NONE" + id: "162" + lanes: "1:1" + serdes_group: "20" + speed: "10G" + sysport: "162" + type: "eth" + - fec: "NONE" + id: "163" + lanes: "2:1" + serdes_group: "20" + speed: "10G" + sysport: "163" + type: "eth" + - fec: "NONE" + id: "164" + lanes: "3:1" + serdes_group: "20" + speed: "10G" + sysport: "164" + type: "eth" + - fec: "NONE" + id: "169" + lanes: "0:1" + serdes_group: "21" + speed: "10G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "170" + lanes: "1:1" + serdes_group: "21" + speed: "10G" + sysport: "170" + type: "eth" + - fec: "NONE" + id: "171" + lanes: "2:1" + serdes_group: "21" + speed: "10G" + sysport: "171" + type: "eth" + - fec: "NONE" + id: "172" + lanes: "3:1" + serdes_group: "21" + speed: "10G" + sysport: "172" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:1" + serdes_group: "2" + speed: "10G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "18" + lanes: "1:1" + serdes_group: "2" + speed: "10G" + sysport: "18" + type: "eth" + - fec: "NONE" + id: "19" + lanes: "2:1" + serdes_group: "2" + speed: "10G" + sysport: "19" + type: "eth" + - fec: "NONE" + id: "20" + lanes: "3:1" + serdes_group: "2" + speed: "10G" + sysport: "20" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:1" + serdes_group: "3" + speed: "10G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "26" + lanes: "1:1" + serdes_group: "3" + speed: "10G" + sysport: "26" + type: "eth" + - fec: "NONE" + id: "27" + lanes: "2:1" + serdes_group: "3" + speed: "10G" + sysport: "27" + type: "eth" + - fec: "NONE" + id: "28" + lanes: "3:1" + serdes_group: "3" + speed: "10G" + sysport: "28" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml new file mode 100644 index 0000000000..5e5d2fe668 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_104x1025G_6x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini new file mode 100644 index 0000000000..43e568f6ef --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/port_config.ini @@ -0,0 +1,111 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193 Eth19-1 10000 18 9126 none +Ethernet145 194 Eth19-2 10000 18 9126 none +Ethernet146 195 Eth19-3 10000 18 9126 none +Ethernet147 196 Eth19-4 10000 18 9126 none +Ethernet152 201 Eth20-1 10000 19 9126 none +Ethernet153 202 Eth20-2 10000 19 9126 none +Ethernet154 203 Eth20-3 10000 19 9126 none +Ethernet155 204 Eth20-4 10000 19 9126 none +Ethernet160 177 Eth21-1 10000 20 9126 none +Ethernet161 178 Eth21-2 10000 20 9126 none +Ethernet162 179 Eth21-3 10000 20 9126 none +Ethernet163 180 Eth21-4 10000 20 9126 none +Ethernet168 185 Eth22-1 10000 21 9126 none +Ethernet169 186 Eth22-2 10000 21 9126 none +Ethernet170 187 Eth22-3 10000 21 9126 none +Ethernet171 188 Eth22-4 10000 21 9126 none +Ethernet176 161 Eth23-1 10000 22 9126 none +Ethernet177 162 Eth23-2 10000 22 9126 none +Ethernet178 163 Eth23-3 10000 22 9126 none +Ethernet179 164 Eth23-4 10000 22 9126 none +Ethernet184 169 Eth24-1 10000 23 9126 none +Ethernet185 170 Eth24-2 10000 23 9126 none +Ethernet186 171 Eth24-3 10000 23 9126 none +Ethernet187 172 Eth24-4 10000 23 9126 none +Ethernet192 17 Eth25-1 10000 24 9126 none +Ethernet193 18 Eth25-2 10000 24 9126 none +Ethernet194 19 Eth25-3 10000 24 9126 none +Ethernet195 20 Eth25-4 10000 24 9126 none +Ethernet200 25 Eth26-1 10000 25 9126 none +Ethernet201 26 Eth26-2 10000 25 9126 none +Ethernet202 27 Eth26-3 10000 25 9126 none +Ethernet203 28 Eth26-4 10000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..76171942ee --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/config_24x400G_8x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "KPFEC" + id: "57" + lanes: "0:8" + serdes_group: "7" + speed: "400G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "KPFEC" + id: "137" + lanes: "0:8" + serdes_group: "17" + speed: "400G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "KPFEC" + id: "193" + lanes: "0:8" + serdes_group: "24" + speed: "400G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "NONE" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "NONE" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "NONE" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "NONE" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "NONE" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "NONE" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "NONE" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml new file mode 100644 index 0000000000..8014caa1da --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_24x400G_8x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini new file mode 100644 index 0000000000..c9e1c968c3 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60,61,62,63,64 Eth5 400000 4 9126 rs +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140,141,142,143,144 Eth11 400000 10 9126 rs +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196,197,198,199,200 Eth19 400000 18 9126 rs +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 none +Ethernet200 25,26,27,28 Eth26 100000 25 9126 none +Ethernet208 1,2,3,4 Eth27 100000 26 9126 none +Ethernet216 9,10,11,12 Eth28 100000 27 9126 none +Ethernet224 241,242,243,244 Eth29 100000 28 9126 none +Ethernet232 249,250,251,252 Eth30 100000 29 9126 none +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236 Eth32 100000 31 9126 none diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..78452fa14c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/config_28x400G_4x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,426 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KPFEC" + id: "89" + lanes: "0:8" + serdes_group: "11" + speed: "400G" + sysport: "89" + type: "eth" + - fec: "KPFEC" + id: "81" + lanes: "0:8" + serdes_group: "10" + speed: "400G" + sysport: "81" + type: "eth" + - fec: "KPFEC" + id: "73" + lanes: "0:8" + serdes_group: "9" + speed: "400G" + sysport: "73" + type: "eth" + - fec: "KPFEC" + id: "65" + lanes: "0:8" + serdes_group: "8" + speed: "400G" + sysport: "65" + type: "eth" + - fec: "NONE" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KPFEC" + id: "49" + lanes: "0:8" + serdes_group: "6" + speed: "400G" + sysport: "49" + type: "eth" + - fec: "KPFEC" + id: "41" + lanes: "0:8" + serdes_group: "5" + speed: "400G" + sysport: "41" + type: "eth" + - fec: "KPFEC" + id: "33" + lanes: "0:8" + serdes_group: "4" + speed: "400G" + sysport: "33" + type: "eth" + - fec: "KPFEC" + id: "153" + lanes: "0:8" + serdes_group: "19" + speed: "400G" + sysport: "153" + type: "eth" + - fec: "KPFEC" + id: "145" + lanes: "0:8" + serdes_group: "18" + speed: "400G" + sysport: "145" + type: "eth" + - fec: "NONE" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KPFEC" + id: "129" + lanes: "0:8" + serdes_group: "16" + speed: "400G" + sysport: "129" + type: "eth" + - fec: "KPFEC" + id: "121" + lanes: "0:8" + serdes_group: "15" + speed: "400G" + sysport: "121" + type: "eth" + - fec: "KPFEC" + id: "113" + lanes: "0:8" + serdes_group: "14" + speed: "400G" + sysport: "113" + type: "eth" + - fec: "KPFEC" + id: "105" + lanes: "0:8" + serdes_group: "13" + speed: "400G" + sysport: "105" + type: "eth" + - fec: "KPFEC" + id: "97" + lanes: "0:8" + serdes_group: "12" + speed: "400G" + sysport: "97" + type: "eth" + - fec: "KPFEC" + id: "209" + lanes: "0:8" + serdes_group: "26" + speed: "400G" + sysport: "209" + type: "eth" + - fec: "KPFEC" + id: "217" + lanes: "0:8" + serdes_group: "27" + speed: "400G" + sysport: "217" + type: "eth" + - fec: "NONE" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KPFEC" + id: "201" + lanes: "0:8" + serdes_group: "25" + speed: "400G" + sysport: "201" + type: "eth" + - fec: "KPFEC" + id: "177" + lanes: "0:8" + serdes_group: "22" + speed: "400G" + sysport: "177" + type: "eth" + - fec: "KPFEC" + id: "185" + lanes: "0:8" + serdes_group: "23" + speed: "400G" + sysport: "185" + type: "eth" + - fec: "KPFEC" + id: "161" + lanes: "0:8" + serdes_group: "20" + speed: "400G" + sysport: "161" + type: "eth" + - fec: "KPFEC" + id: "169" + lanes: "0:8" + serdes_group: "21" + speed: "400G" + sysport: "169" + type: "eth" + - fec: "KPFEC" + id: "17" + lanes: "0:8" + serdes_group: "2" + speed: "400G" + sysport: "17" + type: "eth" + - fec: "KPFEC" + id: "25" + lanes: "0:8" + serdes_group: "3" + speed: "400G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "NONE" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml new file mode 100644 index 0000000000..e17792d88d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_28x400G_4x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini new file mode 100644 index 0000000000..a04e89da94 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92,93,94,95,96 Eth1 400000 0 9126 rs +Ethernet8 81,82,83,84,85,86,87,88 Eth2 400000 1 9126 rs +Ethernet16 73,74,75,76,77,78,79,80 Eth3 400000 2 9126 rs +Ethernet24 65,66,67,68,69,70,71,72 Eth4 400000 3 9126 rs +Ethernet32 57,58,59,60 Eth5 100000 4 9126 none +Ethernet40 49,50,51,52,53,54,55,56 Eth6 400000 5 9126 rs +Ethernet48 41,42,43,44,45,46,47,48 Eth7 400000 6 9126 rs +Ethernet56 33,34,35,36,37,38,39,40 Eth8 400000 7 9126 rs +Ethernet64 153,154,155,156,157,158,159,160 Eth9 400000 8 9126 rs +Ethernet72 145,146,147,148,149,150,151,152 Eth10 400000 9 9126 rs +Ethernet80 137,138,139,140 Eth11 100000 10 9126 none +Ethernet88 129,130,131,132,133,134,135,136 Eth12 400000 11 9126 rs +Ethernet96 121,122,123,124,125,126,127,128 Eth13 400000 12 9126 rs +Ethernet104 113,114,115,116,117,118,119,120 Eth14 400000 13 9126 rs +Ethernet112 105,106,107,108,109,110,111,112 Eth15 400000 14 9126 rs +Ethernet120 97,98,99,100,101,102,103,104 Eth16 400000 15 9126 rs +Ethernet128 209,210,211,212,213,214,215,216 Eth17 400000 16 9126 rs +Ethernet136 217,218,219,220,221,222,223,224 Eth18 400000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 none +Ethernet152 201,202,203,204,205,206,207,208 Eth20 400000 19 9126 rs +Ethernet160 177,178,179,180,181,182,183,184 Eth21 400000 20 9126 rs +Ethernet168 185,186,187,188,189,190,191,192 Eth22 400000 21 9126 rs +Ethernet176 161,162,163,164,165,166,167,168 Eth23 400000 22 9126 rs +Ethernet184 169,170,171,172,173,174,175,176 Eth24 400000 23 9126 rs +Ethernet192 17,18,19,20,21,22,23,24 Eth25 400000 24 9126 rs +Ethernet200 25,26,27,28,29,30,31,32 Eth26 400000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228 Eth31 100000 30 9126 none +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers.json.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..a6f5d00d8b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/config_32x100G_wistron_sw_to3200k.yaml @@ -0,0 +1,425 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_B" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KRFEC" + id: "1" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - fec: "KRFEC" + id: "9" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - fec: "KRFEC" + id: "241" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - fec: "KRFEC" + id: "249" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - fec: "KRFEC" + id: "225" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - fec: "KRFEC" + id: "233" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml new file mode 100644 index 0000000000..8ae2b9683d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_32x100G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_B" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini new file mode 100644 index 0000000000..9507616bd5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/port_config.ini @@ -0,0 +1,33 @@ +# name lanes alias speed index mtu fec +Ethernet0 89,90,91,92 Eth1 100000 0 9126 rs +Ethernet8 81,82,83,84 Eth2 100000 1 9126 rs +Ethernet16 73,74,75,76 Eth3 100000 2 9126 rs +Ethernet24 65,66,67,68 Eth4 100000 3 9126 rs +Ethernet32 57,58,59,60 Eth5 100000 4 9126 rs +Ethernet40 49,50,51,52 Eth6 100000 5 9126 rs +Ethernet48 41,42,43,44 Eth7 100000 6 9126 rs +Ethernet56 33,34,35,36 Eth8 100000 7 9126 rs +Ethernet64 153,154,155,156 Eth9 100000 8 9126 rs +Ethernet72 145,146,147,148 Eth10 100000 9 9126 rs +Ethernet80 137,138,139,140 Eth11 100000 10 9126 rs +Ethernet88 129,130,131,132 Eth12 100000 11 9126 rs +Ethernet96 121,122,123,124 Eth13 100000 12 9126 rs +Ethernet104 113,114,115,116 Eth14 100000 13 9126 rs +Ethernet112 105,106,107,108 Eth15 100000 14 9126 rs +Ethernet120 97,98,99,100 Eth16 100000 15 9126 rs +Ethernet128 209,210,211,212 Eth17 100000 16 9126 rs +Ethernet136 217,218,219,220 Eth18 100000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4 Eth27 100000 26 9126 rs +Ethernet216 9,10,11,12 Eth28 100000 27 9126 rs +Ethernet224 241,242,243,244 Eth29 100000 28 9126 rs +Ethernet232 249,250,251,252 Eth30 100000 29 9126 rs +Ethernet240 225,226,227,228 Eth31 100000 30 9126 rs +Ethernet248 233,234,235,236 Eth32 100000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers.json.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 new file mode 100644 index 0000000000..1a31812c26 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_def_lossy.j2 @@ -0,0 +1,38 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "BUFFER_POOL": { + "lossy_pool": { + "size": "56985600", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|0-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 new file mode 100644 index 0000000000..93dac6b199 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/buffers_defaults_t1.j2 @@ -0,0 +1,137 @@ +{# Default values which will be used if no actual configura available #} +{% set default_cable = '40m' %} + +{# Port configuration to cable length look-up table #} +{# Each record describes mapping of DUT (DUT port) role and neighbor role to cable length #} +{# Roles described in the minigraph #} +{% set ports2cable = { + 'torrouter_server' : '5m', + 'leafrouter_torrouter' : '40m', + 'spinerouter_leafrouter' : '300m' + } +%} + +{%- macro cable_length(port_name) %} + {%- set cable_len = [] %} + {%- for local_port in DEVICE_NEIGHBOR %} + {%- if local_port == port_name %} + {%- if DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor = DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[local_port].name] %} + {%- set neighbor_role = neighbor.type %} + {%- set roles1 = switch_role + '_' + neighbor_role %} + {%- set roles2 = neighbor_role + '_' + switch_role %} + {%- set roles1 = roles1 | lower %} + {%- set roles2 = roles2 | lower %} + {%- if roles1 in ports2cable %} + {%- if cable_len.append(ports2cable[roles1]) %}{% endif %} + {%- elif roles2 in ports2cable %} + {%- if cable_len.append(ports2cable[roles2]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else %} + {%- if switch_role.lower() == 'torrouter' %} + {%- for local_port in VLAN_MEMBER %} + {%- if local_port[1] == port_name %} + {%- set roles3 = switch_role + '_' + 'server' %} + {%- set roles3 = roles3 | lower %} + {%- if roles3 in ports2cable %} + {%- if cable_len.append(ports2cable[roles3]) %}{% endif %} + {%- endif %} + {%- endif %} + {%- endfor %} + {%- if cable_len -%} + {{ cable_len.0 }} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- else -%} + {{ default_cable }} + {%- endif %} + {%- endif %} +{%- endmacro %} + +{%- if DEVICE_METADATA is defined %} +{%- set switch_role = DEVICE_METADATA['localhost']['type'] %} +{%- endif -%} + +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + +{ + "CABLE_LENGTH": { + "AZURE": { + {% for port in PORT %} + {% set cable = cable_length(port) -%} + "{{ port }}": "{{ cable }}"{%- if not loop.last -%},{% endif %} + + {% endfor %} + } + }, + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "47218432", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"13440" + }, + "egress_lossless_profile": { + "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "size":"0", + "static_th":"9497600" + }, + "ingress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"0", + "static_th":"9497600" + }, + "egress_lossy_profile": { + "pool":"[BUFFER_POOL|lossy_pool]", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + }, + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|ingress_lossless_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" + } + }, + "BUFFER_QUEUE": { + "{{ port_names }}|3-4": { + "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" + }, + "{{ port_names }}|0-2": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + }, + "{{ port_names }}|5-7": { + "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml new file mode 100644 index 0000000000..5eb611aa7d --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/config_72x25G_6x400G_wistron_sw_to3200k.yaml @@ -0,0 +1,804 @@ +ifcs: + options: + log_level: "info" +nodes: +- node_id: "0" + options: + sd_low_power_mode_global_default: "true" + sku: "configs/sku/innovium.77700_A" + netdev: + - auto_create: "no" + multi_interface: "yes" + buffer_management_mode: "api_driven" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + ecn_stats_enable: "1" + pcie_attn: "10, 0, 0, 0" + pcie_post: "10, 18, 18, 18" + pcie_pre1: "0, 0, 0, 0" + led_cfg_sck_rate: "0x5" + led_refresh_precliff_timer: "0x18eec2" + led_refresh_cliff_timer: "0x15e" + led_cfg_pic_stream_mode: "1" + led_refresh_tmr_ctl_enable: "1" + txring: + - txring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + - txring_id: "3" + desc_count: "1024" + prio: "1" + netdev: "true" + rxring: + - rxring_id: "0" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39" + - rxring_id: "1" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "1, 4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40" + - rxring_id: "2" + desc_count: "1024" + prio: "1" + netdev: "true" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" + - rxring_id: "3" + desc_count: "1024" + prio: "1" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" + + devports: + - id: "0" + sysport: "1000" + type: "cpu" + - fec: "KRFEC" + id: "89" + lanes: "0:1" + serdes_group: "11" + speed: "25G" + sysport: "89" + type: "eth" + - fec: "KRFEC" + id: "90" + lanes: "1:1" + serdes_group: "11" + speed: "25G" + sysport: "90" + type: "eth" + - fec: "KRFEC" + id: "91" + lanes: "2:1" + serdes_group: "11" + speed: "25G" + sysport: "91" + type: "eth" + - fec: "KRFEC" + id: "92" + lanes: "3:1" + serdes_group: "11" + speed: "25G" + sysport: "92" + type: "eth" + - fec: "KRFEC" + id: "81" + lanes: "0:1" + serdes_group: "10" + speed: "25G" + sysport: "81" + type: "eth" + - fec: "KRFEC" + id: "82" + lanes: "1:1" + serdes_group: "10" + speed: "25G" + sysport: "82" + type: "eth" + - fec: "KRFEC" + id: "83" + lanes: "2:1" + serdes_group: "10" + speed: "25G" + sysport: "83" + type: "eth" + - fec: "KRFEC" + id: "84" + lanes: "3:1" + serdes_group: "10" + speed: "25G" + sysport: "84" + type: "eth" + - fec: "KRFEC" + id: "73" + lanes: "0:1" + serdes_group: "9" + speed: "25G" + sysport: "73" + type: "eth" + - fec: "KRFEC" + id: "74" + lanes: "1:1" + serdes_group: "9" + speed: "25G" + sysport: "74" + type: "eth" + - fec: "KRFEC" + id: "75" + lanes: "2:1" + serdes_group: "9" + speed: "25G" + sysport: "75" + type: "eth" + - fec: "KRFEC" + id: "76" + lanes: "3:1" + serdes_group: "9" + speed: "25G" + sysport: "76" + type: "eth" + - fec: "KRFEC" + id: "65" + lanes: "0:1" + serdes_group: "8" + speed: "25G" + sysport: "65" + type: "eth" + - fec: "KRFEC" + id: "66" + lanes: "1:1" + serdes_group: "8" + speed: "25G" + sysport: "66" + type: "eth" + - fec: "KRFEC" + id: "67" + lanes: "2:1" + serdes_group: "8" + speed: "25G" + sysport: "67" + type: "eth" + - fec: "KRFEC" + id: "68" + lanes: "3:1" + serdes_group: "8" + speed: "25G" + sysport: "68" + type: "eth" + - fec: "KRFEC" + id: "57" + lanes: "0:1" + serdes_group: "7" + speed: "25G" + sysport: "57" + type: "eth" + - fec: "KRFEC" + id: "58" + lanes: "1:1" + serdes_group: "7" + speed: "25G" + sysport: "58" + type: "eth" + - fec: "KRFEC" + id: "59" + lanes: "2:1" + serdes_group: "7" + speed: "25G" + sysport: "59" + type: "eth" + - fec: "KRFEC" + id: "60" + lanes: "3:1" + serdes_group: "7" + speed: "25G" + sysport: "60" + type: "eth" + - fec: "KRFEC" + id: "49" + lanes: "0:1" + serdes_group: "6" + speed: "25G" + sysport: "49" + type: "eth" + - fec: "KRFEC" + id: "50" + lanes: "1:1" + serdes_group: "6" + speed: "25G" + sysport: "50" + type: "eth" + - fec: "KRFEC" + id: "51" + lanes: "2:1" + serdes_group: "6" + speed: "25G" + sysport: "51" + type: "eth" + - fec: "KRFEC" + id: "52" + lanes: "3:1" + serdes_group: "6" + speed: "25G" + sysport: "52" + type: "eth" + - fec: "KRFEC" + id: "41" + lanes: "0:1" + serdes_group: "5" + speed: "25G" + sysport: "41" + type: "eth" + - fec: "KRFEC" + id: "42" + lanes: "1:1" + serdes_group: "5" + speed: "25G" + sysport: "42" + type: "eth" + - fec: "KRFEC" + id: "43" + lanes: "2:1" + serdes_group: "5" + speed: "25G" + sysport: "43" + type: "eth" + - fec: "KRFEC" + id: "44" + lanes: "3:1" + serdes_group: "5" + speed: "25G" + sysport: "44" + type: "eth" + - fec: "KRFEC" + id: "33" + lanes: "0:1" + serdes_group: "4" + speed: "25G" + sysport: "33" + type: "eth" + - fec: "KRFEC" + id: "34" + lanes: "1:1" + serdes_group: "4" + speed: "25G" + sysport: "34" + type: "eth" + - fec: "KRFEC" + id: "35" + lanes: "2:1" + serdes_group: "4" + speed: "25G" + sysport: "35" + type: "eth" + - fec: "KRFEC" + id: "36" + lanes: "3:1" + serdes_group: "4" + speed: "25G" + sysport: "36" + type: "eth" + - fec: "KRFEC" + id: "153" + lanes: "0:1" + serdes_group: "19" + speed: "25G" + sysport: "153" + type: "eth" + - fec: "KRFEC" + id: "154" + lanes: "1:1" + serdes_group: "19" + speed: "25G" + sysport: "154" + type: "eth" + - fec: "KRFEC" + id: "155" + lanes: "2:1" + serdes_group: "19" + speed: "25G" + sysport: "155" + type: "eth" + - fec: "KRFEC" + id: "156" + lanes: "3:1" + serdes_group: "19" + speed: "25G" + sysport: "156" + type: "eth" + - fec: "KRFEC" + id: "145" + lanes: "0:1" + serdes_group: "18" + speed: "25G" + sysport: "145" + type: "eth" + - fec: "KRFEC" + id: "146" + lanes: "1:1" + serdes_group: "18" + speed: "25G" + sysport: "146" + type: "eth" + - fec: "KRFEC" + id: "147" + lanes: "2:1" + serdes_group: "18" + speed: "25G" + sysport: "147" + type: "eth" + - fec: "KRFEC" + id: "148" + lanes: "3:1" + serdes_group: "18" + speed: "25G" + sysport: "148" + type: "eth" + - fec: "KRFEC" + id: "137" + lanes: "0:1" + serdes_group: "17" + speed: "25G" + sysport: "137" + type: "eth" + - fec: "KRFEC" + id: "138" + lanes: "1:1" + serdes_group: "17" + speed: "25G" + sysport: "138" + type: "eth" + - fec: "KRFEC" + id: "139" + lanes: "2:1" + serdes_group: "17" + speed: "25G" + sysport: "139" + type: "eth" + - fec: "KRFEC" + id: "140" + lanes: "3:1" + serdes_group: "17" + speed: "25G" + sysport: "140" + type: "eth" + - fec: "KRFEC" + id: "129" + lanes: "0:1" + serdes_group: "16" + speed: "25G" + sysport: "129" + type: "eth" + - fec: "KRFEC" + id: "130" + lanes: "1:1" + serdes_group: "16" + speed: "25G" + sysport: "130" + type: "eth" + - fec: "KRFEC" + id: "131" + lanes: "2:1" + serdes_group: "16" + speed: "25G" + sysport: "131" + type: "eth" + - fec: "KRFEC" + id: "132" + lanes: "3:1" + serdes_group: "16" + speed: "25G" + sysport: "132" + type: "eth" + - fec: "KRFEC" + id: "121" + lanes: "0:1" + serdes_group: "15" + speed: "25G" + sysport: "121" + type: "eth" + - fec: "KRFEC" + id: "122" + lanes: "1:1" + serdes_group: "15" + speed: "25G" + sysport: "122" + type: "eth" + - fec: "KRFEC" + id: "123" + lanes: "2:1" + serdes_group: "15" + speed: "25G" + sysport: "123" + type: "eth" + - fec: "KRFEC" + id: "124" + lanes: "3:1" + serdes_group: "15" + speed: "25G" + sysport: "124" + type: "eth" + - fec: "KRFEC" + id: "113" + lanes: "0:1" + serdes_group: "14" + speed: "25G" + sysport: "113" + type: "eth" + - fec: "KRFEC" + id: "114" + lanes: "1:1" + serdes_group: "14" + speed: "25G" + sysport: "114" + type: "eth" + - fec: "KRFEC" + id: "115" + lanes: "2:1" + serdes_group: "14" + speed: "25G" + sysport: "115" + type: "eth" + - fec: "KRFEC" + id: "116" + lanes: "3:1" + serdes_group: "14" + speed: "25G" + sysport: "116" + type: "eth" + - fec: "KRFEC" + id: "105" + lanes: "0:1" + serdes_group: "13" + speed: "25G" + sysport: "105" + type: "eth" + - fec: "KRFEC" + id: "106" + lanes: "1:1" + serdes_group: "13" + speed: "25G" + sysport: "106" + type: "eth" + - fec: "KRFEC" + id: "107" + lanes: "2:1" + serdes_group: "13" + speed: "25G" + sysport: "107" + type: "eth" + - fec: "KRFEC" + id: "108" + lanes: "3:1" + serdes_group: "13" + speed: "25G" + sysport: "108" + type: "eth" + - fec: "KRFEC" + id: "97" + lanes: "0:1" + serdes_group: "12" + speed: "25G" + sysport: "97" + type: "eth" + - fec: "KRFEC" + id: "98" + lanes: "1:1" + serdes_group: "12" + speed: "25G" + sysport: "98" + type: "eth" + - fec: "KRFEC" + id: "99" + lanes: "2:1" + serdes_group: "12" + speed: "25G" + sysport: "99" + type: "eth" + - fec: "KRFEC" + id: "100" + lanes: "3:1" + serdes_group: "12" + speed: "25G" + sysport: "100" + type: "eth" + - fec: "KRFEC" + id: "209" + lanes: "0:1" + serdes_group: "26" + speed: "25G" + sysport: "209" + type: "eth" + - fec: "KRFEC" + id: "210" + lanes: "1:1" + serdes_group: "26" + speed: "25G" + sysport: "210" + type: "eth" + - fec: "KRFEC" + id: "211" + lanes: "2:1" + serdes_group: "26" + speed: "25G" + sysport: "211" + type: "eth" + - fec: "KRFEC" + id: "212" + lanes: "3:1" + serdes_group: "26" + speed: "25G" + sysport: "212" + type: "eth" + - fec: "KRFEC" + id: "217" + lanes: "0:1" + serdes_group: "27" + speed: "25G" + sysport: "217" + type: "eth" + - fec: "KRFEC" + id: "218" + lanes: "1:1" + serdes_group: "27" + speed: "25G" + sysport: "218" + type: "eth" + - fec: "KRFEC" + id: "219" + lanes: "2:1" + serdes_group: "27" + speed: "25G" + sysport: "219" + type: "eth" + - fec: "KRFEC" + id: "220" + lanes: "3:1" + serdes_group: "27" + speed: "25G" + sysport: "220" + type: "eth" + - fec: "KRFEC" + id: "193" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - fec: "KRFEC" + id: "201" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - fec: "KRFEC" + id: "177" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - fec: "KRFEC" + id: "185" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - fec: "KRFEC" + id: "161" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - fec: "KRFEC" + id: "169" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - fec: "KRFEC" + id: "17" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - fec: "KRFEC" + id: "25" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - fec: "KPFEC" + id: "1" + lanes: "0:8" + serdes_group: "0" + speed: "400G" + sysport: "1" + type: "eth" + - fec: "KPFEC" + id: "9" + lanes: "0:8" + serdes_group: "1" + speed: "400G" + sysport: "9" + type: "eth" + - fec: "KPFEC" + id: "241" + lanes: "0:8" + serdes_group: "30" + speed: "400G" + sysport: "241" + type: "eth" + - fec: "KPFEC" + id: "249" + lanes: "0:8" + serdes_group: "31" + speed: "400G" + sysport: "249" + type: "eth" + - fec: "KPFEC" + id: "225" + lanes: "0:8" + serdes_group: "28" + speed: "400G" + sysport: "225" + type: "eth" + - fec: "KPFEC" + id: "233" + lanes: "0:8" + serdes_group: "29" + speed: "400G" + sysport: "233" + type: "eth" + isg: + - id: "0" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "57234601" + - id: "1" + tx_polarity: "01000101" + rx_polarity: "01110011" + lane_swap: "51364072" + - id: "2" + tx_polarity: "00000000" + rx_polarity: "00000010" + lane_swap: "57043621" + - id: "3" + tx_polarity: "00000110" + rx_polarity: "00100111" + lane_swap: "56024371" + - id: "4" + tx_polarity: "00110101" + rx_polarity: "00010000" + lane_swap: "65137402" + - id: "5" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "61704253" + - id: "6" + tx_polarity: "10010010" + rx_polarity: "00000100" + lane_swap: "64027315" + - id: "7" + tx_polarity: "00000000" + rx_polarity: "10111011" + lane_swap: "60714253" + - id: "8" + tx_polarity: "10100110" + rx_polarity: "00010101" + lane_swap: "67042315" + - id: "9" + tx_polarity: "00000000" + rx_polarity: "11010000" + lane_swap: "20716453" + - id: "10" + tx_polarity: "00010000" + rx_polarity: "00000000" + lane_swap: "57026314" + - id: "11" + tx_polarity: "00000000" + rx_polarity: "00010000" + lane_swap: "37014625" + - id: "12" + tx_polarity: "00100001" + rx_polarity: "00110111" + lane_swap: "50473216" + - id: "13" + tx_polarity: "00001000" + rx_polarity: "11010001" + lane_swap: "16345702" + - id: "14" + tx_polarity: "11010110" + rx_polarity: "01100100" + lane_swap: "64107352" + - id: "15" + tx_polarity: "00100000" + rx_polarity: "01001011" + lane_swap: "46325710" + - id: "16" + tx_polarity: "10011001" + rx_polarity: "00110001" + lane_swap: "54216730" + - id: "17" + tx_polarity: "00001001" + rx_polarity: "11000000" + lane_swap: "25176304" + - id: "18" + tx_polarity: "00001000" + rx_polarity: "01101010" + lane_swap: "73405612" + - id: "19" + tx_polarity: "00110100" + rx_polarity: "10001010" + lane_swap: "25176304" + - id: "20" + tx_polarity: "00000000" + rx_polarity: "00100000" + lane_swap: "45617230" + - id: "21" + tx_polarity: "11100001" + rx_polarity: "00010011" + lane_swap: "46720531" + - id: "22" + tx_polarity: "00000000" + rx_polarity: "11110111" + lane_swap: "47236501" + - id: "23" + tx_polarity: "10100001" + rx_polarity: "00000000" + lane_swap: "76245301" + - id: "24" + tx_polarity: "01000000" + rx_polarity: "00111100" + lane_swap: "47316520" + - id: "25" + tx_polarity: "10111110" + rx_polarity: "00000001" + lane_swap: "61072543" + - id: "26" + tx_polarity: "00100000" + rx_polarity: "01111000" + lane_swap: "51627430" + - id: "27" + tx_polarity: "10101001" + rx_polarity: "00000000" + lane_swap: "24017536" + - id: "28" + tx_polarity: "00000000" + rx_polarity: "10000010" + lane_swap: "26073514" + - id: "29" + tx_polarity: "01001000" + rx_polarity: "00000000" + lane_swap: "43027615" + - id: "30" + tx_polarity: "00000000" + rx_polarity: "11010010" + lane_swap: "47235601" + - id: "31" + tx_polarity: "11111100" + rx_polarity: "00000010" + lane_swap: "46025713" + - id: "32" + tx_polarity: "00000000" + rx_polarity: "00000000" + lane_swap: "01234567" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A new file mode 100644 index 0000000000..84aa419836 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_A @@ -0,0 +1,59 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 6, 5, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 8:0 + ib: 1 + pic_id: 5 + + isg 31: + mode: 8:0 + ib: 0 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B new file mode 100644 index 0000000000..27297b3139 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/innovium.77700_B @@ -0,0 +1,59 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + + ports_per_ib: 32, 32, 32, 32, 20, 20 + recirc_port_num: 32, 32, 32, 32, 32, 32 + cpu_port_num: 33 + cpu_port_ib: 0 + mgmt_port_num: 33 + mgmt_port_ibs: 1,2 + + pics_per_ib: 6, 7, 7, 6, 5, 5 + pic_ports_per_pic: 8 + max_serdes_speed: 50 + + num_shared_pics: 2 + + isg [0-4]: + ib: 0 + pic_id: [0-4] + + isg [5-9]: + ib: 5 + pic_id: [0-4] + + isg [10-14]: + ib: 1 + pic_id: [0-4] + + isg [16-20]: + ib: 3 + pic_id: [0-4] + + isg [21-25]: + ib: 4 + pic_id: [0-4] + + isg [26-30]: + ib: 2 + pic_id: [0-4] + + isg 15: + mode: 4:4 + ib: 1, 3 + pic_id: 5 + + isg 31: + mode: 4:4 + ib: 0, 2 + pic_id: 5 + + isg 32: + mode: 1:1 + ib: 1, 2 + pic_id: 6 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml new file mode 100644 index 0000000000..01fe64ec7b --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/config_72x25G_6x400G_wistron_sw_to3200k.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +IVM_SAI_DATAPATH_CONFIG_FILE: "/usr/share/sonic/hwsku/ivm.sai.datapath.config.yaml" +IVM_SAI_PARAM_A0008: "32" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml new file mode 100644 index 0000000000..891b0b3e28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.datapath.config.yaml @@ -0,0 +1,9 @@ +ISAI_PARAM_P0_0_LS : "4608 4608 4608 4608 2880 2880" +ISAI_PARAM_P0_1_LS : "2226 1946 1946 1890 1218 1218" +ISAI_PARAM_P0_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_0_LS : "1536 1536 1536 1536 960 960" +ISAI_PARAM_P1_0_LL : "3072 3072 3072 3072 1920 1920" +ISAI_PARAM_P1_1_LS : "1778 1498 1498 1442 938 938" +ISAI_PARAM_P1_1_LL : "2478 2478 2478 2478 2478 2478" +ISAI_PARAM_P1_1_ALS : "434 154 154 98 98 98" +ISAI_PARAM_P1_1_ALL : "126 126 126 126 126 126" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini new file mode 100644 index 0000000000..adcb52ab2a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini @@ -0,0 +1,18 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 13440 + 50000 5m 1518 0 21248 1 13440 + 100000 5m 1518 0 34624 1 13440 + 400000 5m 1518 0 117536 1 13440 + 25000 40m 1518 0 16928 1 13440 + 50000 40m 1518 0 23392 1 13440 + 100000 40m 1518 0 38816 1 13440 + 400000 40m 1518 0 135520 1 13440 + 25000 100m 1518 0 18848 1 13440 + 50000 100m 1518 0 27264 1 13440 + 100000 100m 1518 0 46496 1 13440 + 400000 100m 1518 0 166688 1 13440 + 25000 300m 1518 0 25184 1 13440 + 50000 300m 1518 0 40128 1 13440 + 100000 300m 1518 0 72384 1 13440 + 400000 300m 1518 0 268640 1 13440 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini new file mode 100644 index 0000000000..4f3e8d2bd3 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/port_config.ini @@ -0,0 +1,87 @@ +# name lanes alias speed index mtu fec +Ethernet0 89 Eth1-1 25000 0 9126 rs +Ethernet1 90 Eth1-2 25000 0 9126 rs +Ethernet2 91 Eth1-3 25000 0 9126 rs +Ethernet3 92 Eth1-4 25000 0 9126 rs +Ethernet8 81 Eth2-1 25000 1 9126 rs +Ethernet9 82 Eth2-2 25000 1 9126 rs +Ethernet10 83 Eth2-3 25000 1 9126 rs +Ethernet11 84 Eth2-4 25000 1 9126 rs +Ethernet16 73 Eth3-1 25000 2 9126 rs +Ethernet17 74 Eth3-2 25000 2 9126 rs +Ethernet18 75 Eth3-3 25000 2 9126 rs +Ethernet19 76 Eth3-4 25000 2 9126 rs +Ethernet24 65 Eth4-1 25000 3 9126 rs +Ethernet25 66 Eth4-2 25000 3 9126 rs +Ethernet26 67 Eth4-3 25000 3 9126 rs +Ethernet27 68 Eth4-4 25000 3 9126 rs +Ethernet32 57 Eth5-1 25000 4 9126 rs +Ethernet33 58 Eth5-2 25000 4 9126 rs +Ethernet34 59 Eth5-3 25000 4 9126 rs +Ethernet35 60 Eth5-4 25000 4 9126 rs +Ethernet40 49 Eth6-1 25000 5 9126 rs +Ethernet41 50 Eth6-2 25000 5 9126 rs +Ethernet42 51 Eth6-3 25000 5 9126 rs +Ethernet43 52 Eth6-4 25000 5 9126 rs +Ethernet48 41 Eth7-1 25000 6 9126 rs +Ethernet49 42 Eth7-2 25000 6 9126 rs +Ethernet50 43 Eth7-3 25000 6 9126 rs +Ethernet51 44 Eth7-4 25000 6 9126 rs +Ethernet56 33 Eth8-1 25000 7 9126 rs +Ethernet57 34 Eth8-2 25000 7 9126 rs +Ethernet58 35 Eth8-3 25000 7 9126 rs +Ethernet59 36 Eth8-4 25000 7 9126 rs +Ethernet64 153 Eth9-1 25000 8 9126 rs +Ethernet65 154 Eth9-2 25000 8 9126 rs +Ethernet66 155 Eth9-3 25000 8 9126 rs +Ethernet67 156 Eth9-4 25000 8 9126 rs +Ethernet72 145 Eth10-1 25000 9 9126 rs +Ethernet73 146 Eth10-2 25000 9 9126 rs +Ethernet74 147 Eth10-3 25000 9 9126 rs +Ethernet75 148 Eth10-4 25000 9 9126 rs +Ethernet80 137 Eth11-1 25000 10 9126 rs +Ethernet81 138 Eth11-2 25000 10 9126 rs +Ethernet82 139 Eth11-3 25000 10 9126 rs +Ethernet83 140 Eth11-4 25000 10 9126 rs +Ethernet88 129 Eth12-1 25000 11 9126 rs +Ethernet89 130 Eth12-2 25000 11 9126 rs +Ethernet90 131 Eth12-3 25000 11 9126 rs +Ethernet91 132 Eth12-4 25000 11 9126 rs +Ethernet96 121 Eth13-1 25000 12 9126 rs +Ethernet97 122 Eth13-2 25000 12 9126 rs +Ethernet98 123 Eth13-3 25000 12 9126 rs +Ethernet99 124 Eth13-4 25000 12 9126 rs +Ethernet104 113 Eth14-1 25000 13 9126 rs +Ethernet105 114 Eth14-2 25000 13 9126 rs +Ethernet106 115 Eth14-3 25000 13 9126 rs +Ethernet107 116 Eth14-4 25000 13 9126 rs +Ethernet112 105 Eth15-1 25000 14 9126 rs +Ethernet113 106 Eth15-2 25000 14 9126 rs +Ethernet114 107 Eth15-3 25000 14 9126 rs +Ethernet115 108 Eth15-4 25000 14 9126 rs +Ethernet120 97 Eth16-1 25000 15 9126 rs +Ethernet121 98 Eth16-2 25000 15 9126 rs +Ethernet122 99 Eth16-3 25000 15 9126 rs +Ethernet123 100 Eth16-4 25000 15 9126 rs +Ethernet128 209 Eth17-1 25000 16 9126 rs +Ethernet129 210 Eth17-2 25000 16 9126 rs +Ethernet130 211 Eth17-3 25000 16 9126 rs +Ethernet131 212 Eth17-4 25000 16 9126 rs +Ethernet136 217 Eth18-1 25000 17 9126 rs +Ethernet137 218 Eth18-2 25000 17 9126 rs +Ethernet138 219 Eth18-3 25000 17 9126 rs +Ethernet139 220 Eth18-4 25000 17 9126 rs +Ethernet144 193,194,195,196 Eth19 100000 18 9126 rs +Ethernet152 201,202,203,204 Eth20 100000 19 9126 rs +Ethernet160 177,178,179,180 Eth21 100000 20 9126 rs +Ethernet168 185,186,187,188 Eth22 100000 21 9126 rs +Ethernet176 161,162,163,164 Eth23 100000 22 9126 rs +Ethernet184 169,170,171,172 Eth24 100000 23 9126 rs +Ethernet192 17,18,19,20 Eth25 100000 24 9126 rs +Ethernet200 25,26,27,28 Eth26 100000 25 9126 rs +Ethernet208 1,2,3,4,5,6,7,8 Eth27 400000 26 9126 rs +Ethernet216 9,10,11,12,13,14,15,16 Eth28 400000 27 9126 rs +Ethernet224 241,242,243,244,245,246,247,248 Eth29 400000 28 9126 rs +Ethernet232 249,250,251,252,253,254,255,256 Eth30 400000 29 9126 rs +Ethernet240 225,226,227,228,229,230,231,232 Eth31 400000 30 9126 rs +Ethernet248 233,234,235,236,237,238,239,240 Eth32 400000 31 9126 rs diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 new file mode 100644 index 0000000000..104d2d78de --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 @@ -0,0 +1,118 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"0", + "4":"0", + "5":"0", + "6":"0", + "7":"0", + "8":"0", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]" + } + }, + "SCHEDULER": { + "scheduler.7": { + "type": "STRICT" + } + }, + "QUEUE": { + "{{ port_names }}|7": { + "scheduler": "[SCHEDULER|scheduler.7]" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 new file mode 100644 index 0000000000..4b9748c7b5 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_t1.j2 @@ -0,0 +1,114 @@ +{% set port_names_list = [] %} +{% for port in PORT %} + {%- if port_names_list.append(port) %}{% endif %} +{% endfor %} +{% set port_names = port_names_list | join(',') -%} + + +{ + "TC_TO_QUEUE_MAP":{ + "AZURE":{ + "0":"0", + "1":"1", + "2":"2", + "3":"3", + "4":"4", + "5":"5", + "6":"6", + "7":"7" + } + }, + "TC_TO_PRIORITY_GROUP_MAP": { + "AZURE": { + "0": "0", + "1": "0", + "2": "0", + "3": "3", + "4": "4", + "5": "0", + "6": "0", + "7": "0" + } + }, + "DSCP_TO_TC_MAP": { + "AZURE": { + "0":"0", + "1":"0", + "2":"0", + "3":"3", + "4":"4", + "5":"0", + "6":"0", + "7":"0", + "8":"1", + "9":"0", + "10":"0", + "11":"0", + "12":"0", + "13":"0", + "14":"0", + "15":"0", + "16":"0", + "17":"0", + "18":"0", + "19":"0", + "20":"0", + "21":"0", + "22":"0", + "23":"0", + "24":"0", + "25":"0", + "26":"0", + "27":"0", + "28":"0", + "29":"0", + "30":"0", + "31":"0", + "32":"0", + "33":"0", + "34":"0", + "35":"0", + "36":"0", + "37":"0", + "38":"0", + "39":"0", + "40":"0", + "41":"0", + "42":"0", + "43":"0", + "44":"0", + "45":"0", + "46":"0", + "47":"0", + "48":"0", + "49":"0", + "50":"0", + "51":"0", + "52":"0", + "53":"0", + "54":"0", + "55":"0", + "56":"0", + "57":"0", + "58":"0", + "59":"0", + "60":"0", + "61":"0", + "62":"0", + "63":"0" + } + }, + "PORT_QOS_MAP": { + "{{ port_names }}": { + "tc_to_pg_map": "[TC_TO_PRIORITY_GROUP_MAP|AZURE]", + "tc_to_queue_map": "[TC_TO_QUEUE_MAP|AZURE]", + "dscp_to_tc_map": "[DSCP_TO_TC_MAP|AZURE]", + "pfc_enable": "3,4" + } + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "red_min_threshold":"50000" + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile new file mode 100644 index 0000000000..aba4fc81fb --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/sai.profile @@ -0,0 +1 @@ +SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/ivm.sai.config.yaml diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku new file mode 100644 index 0000000000..041c1629fc --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/default_sku @@ -0,0 +1 @@ +Wistron_sw_to3200k t1 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf new file mode 100644 index 0000000000..6af5fa8d97 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf @@ -0,0 +1,4 @@ +CONSOLE_PORT=0x3f8 +CONSOLE_DEV=4 +CONSOLE_SPEED=115200 +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic new file mode 100644 index 0000000000..84083a7415 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_asic @@ -0,0 +1 @@ +innovium diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py new file mode 100644 index 0000000000..9f59510eac --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python + +try: + import os + from sonic_eeprom import eeprom_tlvinfo +except ImportError, e: + raise ImportError (str(e) + "- required module not found") + +def eeprom_check(): + filepath="/sys/bus/i2c/devices/0-0056/eeprom" + if os.path.isfile(filepath): + return 1 #now board, 0x56 + else: + return 0 #now board, 0x57 + +class board(eeprom_tlvinfo.TlvInfoDecoder): + _TLV_INFO_MAX_LEN = 256 + def __init__(self, name, path, cpld_root, ro): + ret=eeprom_check() + if ret==1: + self.eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + else: + self.eeprom_path = "/sys/bus/i2c/devices/47-0057/eeprom" + + super(board, self).__init__(self.eeprom_path, 0, '', True) + diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py new file mode 100644 index 0000000000..2d00aa6282 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/psuutil.py @@ -0,0 +1,59 @@ +#!/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 +# +############################################################################# + +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 = { + 2: "0-0051", + 1: "0-0052", + } + + 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/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py new file mode 100644 index 0000000000..fe59dc7d8c --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py @@ -0,0 +1,186 @@ +# 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""" + SONIC_PORT_NAME_PREFIX = "Ethernet" + PORT_START = 0 + PORT_END = 31 + PORTS_IN_BLOCK = 32 + + BASE_OOM_PATH = "/sys/bus/i2c/devices/0-00{0}/" + BASE_CPLD1_PATH = "/sys/bus/i2c/devices/0-0061/" + BASE_CPLD2_PATH = "/sys/bus/i2c/devices/0-0062/" + + _port_to_is_present = {} + _port_to_lp_mode = {} + + _port_to_eeprom_mapping = {} + _port_to_i2c_mapping = { + 0: [1, 10], + 1: [2, 11], + 2: [3, 12], + 3: [4, 13], + 4: [5, 14], + 5: [6, 15], + 6: [7, 16], + 7: [8, 17], + 8: [9, 18], + 9: [10, 19], + 10: [11, 20], + 11: [12, 21], + 12: [13, 22], + 13: [14, 23], + 14: [15, 24], + 15: [16, 25], + 16: [17, 26], + 17: [18, 27], + 18: [19, 28], + 19: [20, 29], + 20: [21, 30], + 21: [22, 31], + 22: [23, 32], + 23: [24, 33], + 24: [25, 34], + 25: [26, 35], + 26: [27, 36], + 27: [28, 37], + 28: [29, 38], + 29: [30, 39], + 30: [31, 40], + 31: [32, 41], + } + + @property + def port_start(self): + return self.PORT_START + + @property + def port_end(self): + return self.PORT_END + + @property + def qsfp_ports(self): + return range(self.PORT_START, self.PORTS_IN_BLOCK + 1) + + @property + def port_to_eeprom_mapping(self): + return self._port_to_eeprom_mapping + + def is_logical_port(self, port_name): + return True + + def get_logical_to_physical(self, port_name): + if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX): + return None + + port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):]) + port_idx = port_idx // 8 + return [port_idx] + + def __init__(self): + eeprom_path = self.BASE_OOM_PATH + "eeprom1" + + for x in range(0, self.port_end+1): + self.port_to_eeprom_mapping[x] = eeprom_path.format(self._port_to_i2c_mapping[x][1]) + + self._transceiver_presence = self._get_sfp_presence() + 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 + if port_num < 16 : + present_path = self.BASE_CPLD1_PATH + "module_present_" + str(port_num+1) + else: + present_path = self.BASE_CPLD2_PATH + "module_present_" + str(port_num+1) + self.__port_to_is_present = present_path + + try: + val_file = open(self.__port_to_is_present) + content = val_file.readline().rstrip() + val_file.close() + except IOError as e: + print "Error: unable to access file: %s" % str(e) + return False + + 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): + raise NotImplementedError + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, self.port_end+1): + port_pres[port] = self.get_presence(port) + + return port_pres + + def get_transceiver_change_event(self, timeout=0): + start_time = time.time() + port_dict = {} + forever = False + + 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: + change_status = False + + cur_presence = self._get_sfp_presence() + for port in range(0, self.port_end+1): + if cur_presence[port] == 1: + port_dict[port]='1' + else: + port_dict[port]='0' + + if cur_presence[port] != self._transceiver_presence[port]: + change_status = True + + self._transceiver_presence = cur_presence + if change_status: + return True, port_dict + + 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_evt_change_event: Should not reach here." + return False, {} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json new file mode 100644 index 0000000000..94592fa8ce --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/pmon_daemon_control.json @@ -0,0 +1,3 @@ +{ + "skip_ledd": true +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config new file mode 100644 index 0000000000..9a16887e3a --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/sw-to3200k_sonic_serdes.config @@ -0,0 +1,5135 @@ + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eye_disq: "100, 100, 100, 100, 100, 100, 100, 100" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "130, 130, 130, 130, 130, 130, 130, 130" + rx_eye_disq: "200, 200, 200, 200, 200, 200, 200, 200" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "0" + gshape1: "2, 2, 2, 2, 2, 2, 2, 2" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "-1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "2" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "3" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "5" + pre1: "4, 4, 4, 2, 2, 2, 2, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 1, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "6" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "7" + pre1: "4, 4, 2, 4, 2, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "9" + pre1: "2, 2, 2, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 2, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "10" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 2, 2, 4, 2, 6, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "11" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, -1, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 0, 0, 0, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "13" + pre1: "2, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "14" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "-1, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 1, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "15" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 0, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "17" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "18" + pre1: "2, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "19" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 4, 4, 4, 4, 4, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "20" + pre1: "2, 4, 2, 2, 2, 2, 4, 2" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 4, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "21" + pre1: "2, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 4, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "22" + pre1: "4, 2, 4, 4, 4, 2, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "23" + pre1: "4, 4, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "24" + pre1: "4, 2, 4, 2, 4, 2, 2, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "25" + pre1: "4, 2, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 0, 2, 0, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "26" + pre1: "2, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 1, 0, 0, 0, 0, 1" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 2, 2, 0, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 2, 0, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "28" + pre1: "4, 2, 4, 2, 4, 4, 4, 2" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 4, 4, 4, 4, 4" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, -1, 0" + pre3: "0, 1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 2, 4, 4, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "30" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 2, 0" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + - id: "31" + pre1: "4, 4, 4, 4, 2, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 2, 2, 2, 2, 2" + rx_agctgt: "160, 160, 160, 160, 160, 160, 160, 160" + rx_eye_disq: "150, 150, 150, 150, 150, 150, 150, 150" + rx_eq_c_t: "Low" + rx_eq_f_t: "Low" + sd_rst: "True" + sd_rst_th: "5" + gshape1: "1, 1, 1, 1, 1, 1, 1, 1" + gshape2: "1, 1, 1, 1, 1, 1, 1, 1" + + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "1" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "2" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "3" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "4" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "5" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "6" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "7" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "8" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "9" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "10" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "11" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "12" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "13" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "14" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "15" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "16" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "17" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "18" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "19" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "20" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "21" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "22" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "23" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "24" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "25" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "26" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "27" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "28" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "29" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "30" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + - id: "31" + pre1: "0, 0, 0, 0, 0, 0, 0, 0" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "10, 10, 10, 10, 10, 10, 10, 10" + rx_ctle_bw: "10, 10, 10, 10, 10, 10, 10, 10" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "2, 2, 2, 2, 2, 2, 2, 2" + + - id: "0" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "1" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 4, 2, 4, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "2" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "3" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 2, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "4" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, -1, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 0, 0, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "5" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "6" + pre1: "4, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 2, 0, 2, 4, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "7" + pre1: "4, 2, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 0, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "8" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "9" + pre1: "4, 2, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, -2, 0, 0, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "10" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "11" + pre1: "4, 4, 4, 4, 2, 4, 4, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 0, 4, 0, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "12" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 0, 0, 0, 0, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "13" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 2, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "14" + pre1: "2, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, -1" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 0, 0, 2, 2, 4, 0, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "15" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 2, 2, 4, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "16" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 0, 4, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "17" + pre1: "4, 4, 2, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "18" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "1, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 0, 2, 0, 4, 4, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "19" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 0, 2, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "20" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, -1, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "21" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 4, 2, 0, 2, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "22" + pre1: "4, 2, 4, 4, 2, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 4, 0, 2, 2, 4, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "23" + pre1: "4, 4, 4, 4, 4, 4, 2, 4" + pre2: "0, -1, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 0, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "24" + pre1: "4, 4, 4, 4, 2, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 0, 2, 0, 2, 2, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "25" + pre1: "2, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, -2, 0, 0, 2, 0" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "26" + pre1: "2, 4, 4, 4, 4, 2, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 0, 0, 2, 0, 2, 0, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "27" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 1, 0, 0, 0" + post: "0, 0, 0, 0, 0, 0, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "28" + pre1: "4, 4, 4, 2, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "2, 2, 2, 2, 2, 4, 4, 4" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "29" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, -1, 0, 0, 0" + pre3: "0, -1, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 2, 2, 4, 4, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "30" + pre1: "4, 4, 4, 4, 4, 2, 2, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "0, 2, 0, 2, 2, 2, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" + - id: "31" + pre1: "4, 4, 4, 4, 4, 4, 4, 4" + pre2: "0, 0, 0, 0, 0, 0, 0, 0" + pre3: "0, 0, 0, 0, 0, 0, 0, 0" + attn: "0, 0, 0, 0, 0, 0, 0, 0" + post: "4, 4, 2, 2, 2, 4, 2, 2" + rx_eq_c_t: "Medium" + rx_eq_f_t: "High" + rx_ctle_lf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_hf: "0, 0, 0, 0, 0, 0, 0, 0" + rx_ctle_bw: "0, 0, 0, 0, 0, 0, 0, 0" + gshape1: "0, 0, 0, 0, 0, 0, 0, 0" + gshape2: "0, 0, 0, 0, 0, 0, 0, 0" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf new file mode 100644 index 0000000000..795ea43143 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/topo.conf @@ -0,0 +1 @@ +t1 diff --git a/platform/innovium/one-image.mk b/platform/innovium/one-image.mk index bf12670412..2cae779d71 100755 --- a/platform/innovium/one-image.mk +++ b/platform/innovium/one-image.mk @@ -7,6 +7,7 @@ $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(CEL_MIDSTONE_200I_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(DELTA_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NETBERG_AURORA_715_PLATFORM_MODULE) +$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(WISTRON_PLATFORM_MODULE) $(SONIC_ONE_IMAGE)_INSTALLS += $(INVM_DRV) $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES) SONIC_INSTALLERS += $(SONIC_ONE_IMAGE) diff --git a/platform/innovium/platform-modules-wistron.mk b/platform/innovium/platform-modules-wistron.mk new file mode 100644 index 0000000000..ed0c8922c1 --- /dev/null +++ b/platform/innovium/platform-modules-wistron.mk @@ -0,0 +1,19 @@ +# Wistron Platform modules + +WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION = 1.1 +WISTRON_6512_32R_PLATFORM_MODULE_VERSION = 1.1 + +export WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION WISTRON_6512_32R_PLATFORM_MODULE_VERSION + +WISTRON_SW_TO3200K_PLATFORM_MODULE = sonic-platform-wistron-sw-to3200k_$(WISTRON_SW_TO3200K_PLATFORM_MODULE_VERSION)_amd64.deb +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-wistron +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(WISTRON_SW_TO3200K_PLATFORM_MODULE)_PLATFORM = x86_64-wistron_sw_to3200k-r0 + +WISTRON_6512_32R_PLATFORM_MODULE = sonic-platform-wistron-6512-32r_$(WISTRON_6512_32R_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb +$(WISTRON_6512_32R_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-wistron +$(WISTRON_6512_32R_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON) +$(WISTRON_6512_32R_PLATFORM_MODULE)_PLATFORM = x86_64-wistron_6512_32r-r0 + +WISTRON_PLATFORM_MODULE = $(WISTRON_SW_TO3200K_PLATFORM_MODULE) $(WISTRON_6512_32R_PLATFORM_MODULE) +SONIC_DPKG_DEBS += $(WISTRON_PLATFORM_MODULE) diff --git a/platform/innovium/rules.mk b/platform/innovium/rules.mk index 9cf6dd2bf2..39e6955753 100755 --- a/platform/innovium/rules.mk +++ b/platform/innovium/rules.mk @@ -1,6 +1,7 @@ include $(PLATFORM_PATH)/invm-sai.mk include $(PLATFORM_PATH)/platform-modules-cel.mk include $(PLATFORM_PATH)/platform-modules-delta.mk +include $(PLATFORM_PATH)/platform-modules-wistron.mk include $(PLATFORM_PATH)/platform-modules-netberg.mk include $(PLATFORM_PATH)/docker-syncd-invm.mk include $(PLATFORM_PATH)/docker-syncd-invm-rpc.mk diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile new file mode 100644 index 0000000000..86a67f5508 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile @@ -0,0 +1,20 @@ +ifneq ($(KERNELRELEASE),) +obj-m:= wistron_6512_32r_cpld.o wistron_6512_32r_fan.o \ + wistron_6512_32r_oom.o wistron_6512_32r_psu.o \ + wistron_6512_32r_thermal.o \ + wistron_6512_32r_leds.o wistron_6512_32r_syseeprom.o +else +ifeq (,$(KERNEL_SRC)) +#$(error KERNEL_SRC is not defined) +KVERSION=3.16.0-8-amd64 +KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ +KERNELDIR:=$(KERNEL_DIR) +else +KERNELDIR:=$(KERNEL_SRC) +endif +PWD:=$(shell pwd) +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules +clean: + rm -rf *.o *.mod.o *.mod.o *.ko .*cmd *.mod.c *.mod .tmp_versions Module.markers Module.symvers modules.order +endif diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c new file mode 100644 index 0000000000..a6c21966d1 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_cpld.c @@ -0,0 +1,953 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT_NUM 32 +#define SYSLED_NUM 4 +#define FPGA_ADDR 0x30 + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +enum cpld_type { + wistron_fpga, + wistron_cpld1, + wistron_cpld2 +}; + +struct wistron_cpld_data { + enum cpld_type type; + struct device *hwmon_dev; + struct mutex lock; + int version; + int sysled_status[SYSLED_NUM]; + int present[PORT_NUM]; + int reset[PORT_NUM]; + int lpmod[PORT_NUM]; + int modsel[PORT_NUM]; +}; + +static const struct i2c_device_id wistron_cpld_id[] = { + { "wistron_fpga", wistron_fpga }, + { "wistron_cpld1", wistron_cpld1 }, + { "wistron_cpld2", wistron_cpld2 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, wistron_cpld_id); + +#define TRANSCEIVER_PRESENT_ATTR_ID(index) MODULE_PRESENT_##index +#define TRANSCEIVER_RESET_ATTR_ID(index) MODULE_RESET_##index +#define TRANSCEIVER_LPMOD_ATTR_ID(index) MODULE_LPMOD_##index +#define TRANSCEIVER_MODSEL_ATTR_ID(index) MODULE_MODSEL_##index + +enum wistron_cpld_sysfs_attributes { + /* chip version */ + CPLD_VERSION, + /* system led */ + SYSTEM_LED_LOC, + SYSTEM_LED_DIAG, + SYSTEM_LED_FAN, + SYSTEM_LED_PSU, + /* transceiver attributes */ + TRANSCEIVER_PRESENT_ATTR_ID(1), + TRANSCEIVER_PRESENT_ATTR_ID(2), + TRANSCEIVER_PRESENT_ATTR_ID(3), + TRANSCEIVER_PRESENT_ATTR_ID(4), + TRANSCEIVER_PRESENT_ATTR_ID(5), + TRANSCEIVER_PRESENT_ATTR_ID(6), + TRANSCEIVER_PRESENT_ATTR_ID(7), + TRANSCEIVER_PRESENT_ATTR_ID(8), + TRANSCEIVER_PRESENT_ATTR_ID(9), + TRANSCEIVER_PRESENT_ATTR_ID(10), + TRANSCEIVER_PRESENT_ATTR_ID(11), + TRANSCEIVER_PRESENT_ATTR_ID(12), + TRANSCEIVER_PRESENT_ATTR_ID(13), + TRANSCEIVER_PRESENT_ATTR_ID(14), + TRANSCEIVER_PRESENT_ATTR_ID(15), + TRANSCEIVER_PRESENT_ATTR_ID(16), + TRANSCEIVER_PRESENT_ATTR_ID(17), + TRANSCEIVER_PRESENT_ATTR_ID(18), + TRANSCEIVER_PRESENT_ATTR_ID(19), + TRANSCEIVER_PRESENT_ATTR_ID(20), + TRANSCEIVER_PRESENT_ATTR_ID(21), + TRANSCEIVER_PRESENT_ATTR_ID(22), + TRANSCEIVER_PRESENT_ATTR_ID(23), + TRANSCEIVER_PRESENT_ATTR_ID(24), + TRANSCEIVER_PRESENT_ATTR_ID(25), + TRANSCEIVER_PRESENT_ATTR_ID(26), + TRANSCEIVER_PRESENT_ATTR_ID(27), + TRANSCEIVER_PRESENT_ATTR_ID(28), + TRANSCEIVER_PRESENT_ATTR_ID(29), + TRANSCEIVER_PRESENT_ATTR_ID(30), + TRANSCEIVER_PRESENT_ATTR_ID(31), + TRANSCEIVER_PRESENT_ATTR_ID(32), + TRANSCEIVER_RESET_ATTR_ID(1), + TRANSCEIVER_RESET_ATTR_ID(2), + TRANSCEIVER_RESET_ATTR_ID(3), + TRANSCEIVER_RESET_ATTR_ID(4), + TRANSCEIVER_RESET_ATTR_ID(5), + TRANSCEIVER_RESET_ATTR_ID(6), + TRANSCEIVER_RESET_ATTR_ID(7), + TRANSCEIVER_RESET_ATTR_ID(8), + TRANSCEIVER_RESET_ATTR_ID(9), + TRANSCEIVER_RESET_ATTR_ID(10), + TRANSCEIVER_RESET_ATTR_ID(11), + TRANSCEIVER_RESET_ATTR_ID(12), + TRANSCEIVER_RESET_ATTR_ID(13), + TRANSCEIVER_RESET_ATTR_ID(14), + TRANSCEIVER_RESET_ATTR_ID(15), + TRANSCEIVER_RESET_ATTR_ID(16), + TRANSCEIVER_RESET_ATTR_ID(17), + TRANSCEIVER_RESET_ATTR_ID(18), + TRANSCEIVER_RESET_ATTR_ID(19), + TRANSCEIVER_RESET_ATTR_ID(20), + TRANSCEIVER_RESET_ATTR_ID(21), + TRANSCEIVER_RESET_ATTR_ID(22), + TRANSCEIVER_RESET_ATTR_ID(23), + TRANSCEIVER_RESET_ATTR_ID(24), + TRANSCEIVER_RESET_ATTR_ID(25), + TRANSCEIVER_RESET_ATTR_ID(26), + TRANSCEIVER_RESET_ATTR_ID(27), + TRANSCEIVER_RESET_ATTR_ID(28), + TRANSCEIVER_RESET_ATTR_ID(29), + TRANSCEIVER_RESET_ATTR_ID(30), + TRANSCEIVER_RESET_ATTR_ID(31), + TRANSCEIVER_RESET_ATTR_ID(32), + TRANSCEIVER_LPMOD_ATTR_ID(1), + TRANSCEIVER_LPMOD_ATTR_ID(2), + TRANSCEIVER_LPMOD_ATTR_ID(3), + TRANSCEIVER_LPMOD_ATTR_ID(4), + TRANSCEIVER_LPMOD_ATTR_ID(5), + TRANSCEIVER_LPMOD_ATTR_ID(6), + TRANSCEIVER_LPMOD_ATTR_ID(7), + TRANSCEIVER_LPMOD_ATTR_ID(8), + TRANSCEIVER_LPMOD_ATTR_ID(9), + TRANSCEIVER_LPMOD_ATTR_ID(10), + TRANSCEIVER_LPMOD_ATTR_ID(11), + TRANSCEIVER_LPMOD_ATTR_ID(12), + TRANSCEIVER_LPMOD_ATTR_ID(13), + TRANSCEIVER_LPMOD_ATTR_ID(14), + TRANSCEIVER_LPMOD_ATTR_ID(15), + TRANSCEIVER_LPMOD_ATTR_ID(16), + TRANSCEIVER_LPMOD_ATTR_ID(17), + TRANSCEIVER_LPMOD_ATTR_ID(18), + TRANSCEIVER_LPMOD_ATTR_ID(19), + TRANSCEIVER_LPMOD_ATTR_ID(20), + TRANSCEIVER_LPMOD_ATTR_ID(21), + TRANSCEIVER_LPMOD_ATTR_ID(22), + TRANSCEIVER_LPMOD_ATTR_ID(23), + TRANSCEIVER_LPMOD_ATTR_ID(24), + TRANSCEIVER_LPMOD_ATTR_ID(25), + TRANSCEIVER_LPMOD_ATTR_ID(26), + TRANSCEIVER_LPMOD_ATTR_ID(27), + TRANSCEIVER_LPMOD_ATTR_ID(28), + TRANSCEIVER_LPMOD_ATTR_ID(29), + TRANSCEIVER_LPMOD_ATTR_ID(30), + TRANSCEIVER_LPMOD_ATTR_ID(31), + TRANSCEIVER_LPMOD_ATTR_ID(32), + TRANSCEIVER_MODSEL_ATTR_ID(1), + TRANSCEIVER_MODSEL_ATTR_ID(2), + TRANSCEIVER_MODSEL_ATTR_ID(3), + TRANSCEIVER_MODSEL_ATTR_ID(4), + TRANSCEIVER_MODSEL_ATTR_ID(5), + TRANSCEIVER_MODSEL_ATTR_ID(6), + TRANSCEIVER_MODSEL_ATTR_ID(7), + TRANSCEIVER_MODSEL_ATTR_ID(8), + TRANSCEIVER_MODSEL_ATTR_ID(9), + TRANSCEIVER_MODSEL_ATTR_ID(10), + TRANSCEIVER_MODSEL_ATTR_ID(11), + TRANSCEIVER_MODSEL_ATTR_ID(12), + TRANSCEIVER_MODSEL_ATTR_ID(13), + TRANSCEIVER_MODSEL_ATTR_ID(14), + TRANSCEIVER_MODSEL_ATTR_ID(15), + TRANSCEIVER_MODSEL_ATTR_ID(16), + TRANSCEIVER_MODSEL_ATTR_ID(17), + TRANSCEIVER_MODSEL_ATTR_ID(18), + TRANSCEIVER_MODSEL_ATTR_ID(19), + TRANSCEIVER_MODSEL_ATTR_ID(20), + TRANSCEIVER_MODSEL_ATTR_ID(21), + TRANSCEIVER_MODSEL_ATTR_ID(22), + TRANSCEIVER_MODSEL_ATTR_ID(23), + TRANSCEIVER_MODSEL_ATTR_ID(24), + TRANSCEIVER_MODSEL_ATTR_ID(25), + TRANSCEIVER_MODSEL_ATTR_ID(26), + TRANSCEIVER_MODSEL_ATTR_ID(27), + TRANSCEIVER_MODSEL_ATTR_ID(28), + TRANSCEIVER_MODSEL_ATTR_ID(29), + TRANSCEIVER_MODSEL_ATTR_ID(30), + TRANSCEIVER_MODSEL_ATTR_ID(31), + TRANSCEIVER_MODSEL_ATTR_ID(32), +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_lpmod(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_lpmod(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_modsel(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_modsel(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* version */ +static SENSOR_DEVICE_ATTR(version, S_IWUSR | S_IRUGO, get_version, set_version, CPLD_VERSION); + +/* system led */ +static SENSOR_DEVICE_ATTR(loc_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_LOC); +static SENSOR_DEVICE_ATTR(sys_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_DIAG); +static SENSOR_DEVICE_ATTR(fan_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_FAN); +static SENSOR_DEVICE_ATTR(psu_led, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU); + +/* transceiver attributes */ +#define DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_present, S_IWUSR | S_IRUGO, get_status, set_status, MODULE_PRESENT_##index) +#define DECLARE_TRANSCEIVER_PRESENT_ATTR(index) &sensor_dev_attr_port##index##_present.dev_attr.attr + +/*reset*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_reset, S_IWUSR | S_IRUGO, get_mode_reset, set_mode_reset, MODULE_RESET_##index) +#define DECLARE_TRANSCEIVER_RESET_ATTR(index) &sensor_dev_attr_port##index##_reset.dev_attr.attr + +/*lpmod*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_lpmode, S_IWUSR | S_IRUGO, get_mode_lpmod, set_mode_lpmod, MODULE_LPMOD_##index) +#define DECLARE_TRANSCEIVER_LPMOD_ATTR(index) &sensor_dev_attr_port##index##_lpmode.dev_attr.attr + +/*modsel*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_modsel, S_IWUSR | S_IRUGO, get_mode_modsel, set_mode_modsel, MODULE_MODSEL_##index) +#define DECLARE_TRANSCEIVER_MODSEL_ATTR(index) &sensor_dev_attr_port##index##_modsel.dev_attr.attr + +/* transceiver attributes */ +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(1); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(2); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(3); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(4); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(5); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(6); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(7); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(8); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(9); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(10); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(11); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(12); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(13); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(14); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(15); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(16); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(17); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(18); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(19); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(20); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(21); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(22); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(23); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(24); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(25); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(26); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(27); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(28); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(29); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(30); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(31); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_LPMOD_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_MODSEL_ATTR(32); + +static struct attribute *wistron_fpga_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + &sensor_dev_attr_loc_led.dev_attr.attr, + &sensor_dev_attr_sys_led.dev_attr.attr, + &sensor_dev_attr_fan_led.dev_attr.attr, + &sensor_dev_attr_psu_led.dev_attr.attr, + NULL +}; + +static const struct attribute_group wistron_fpga_group = { + .attrs = wistron_fpga_attributes, +}; + +static struct attribute *wistron_cpld1_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(1), + DECLARE_TRANSCEIVER_PRESENT_ATTR(2), + DECLARE_TRANSCEIVER_PRESENT_ATTR(3), + DECLARE_TRANSCEIVER_PRESENT_ATTR(4), + DECLARE_TRANSCEIVER_PRESENT_ATTR(5), + DECLARE_TRANSCEIVER_PRESENT_ATTR(6), + DECLARE_TRANSCEIVER_PRESENT_ATTR(7), + DECLARE_TRANSCEIVER_PRESENT_ATTR(8), + DECLARE_TRANSCEIVER_PRESENT_ATTR(9), + DECLARE_TRANSCEIVER_PRESENT_ATTR(10), + DECLARE_TRANSCEIVER_PRESENT_ATTR(11), + DECLARE_TRANSCEIVER_PRESENT_ATTR(12), + DECLARE_TRANSCEIVER_PRESENT_ATTR(13), + DECLARE_TRANSCEIVER_PRESENT_ATTR(14), + DECLARE_TRANSCEIVER_PRESENT_ATTR(15), + DECLARE_TRANSCEIVER_PRESENT_ATTR(16), + DECLARE_TRANSCEIVER_RESET_ATTR(1), + DECLARE_TRANSCEIVER_RESET_ATTR(2), + DECLARE_TRANSCEIVER_RESET_ATTR(3), + DECLARE_TRANSCEIVER_RESET_ATTR(4), + DECLARE_TRANSCEIVER_RESET_ATTR(5), + DECLARE_TRANSCEIVER_RESET_ATTR(6), + DECLARE_TRANSCEIVER_RESET_ATTR(7), + DECLARE_TRANSCEIVER_RESET_ATTR(8), + DECLARE_TRANSCEIVER_RESET_ATTR(9), + DECLARE_TRANSCEIVER_RESET_ATTR(10), + DECLARE_TRANSCEIVER_RESET_ATTR(11), + DECLARE_TRANSCEIVER_RESET_ATTR(12), + DECLARE_TRANSCEIVER_RESET_ATTR(13), + DECLARE_TRANSCEIVER_RESET_ATTR(14), + DECLARE_TRANSCEIVER_RESET_ATTR(15), + DECLARE_TRANSCEIVER_RESET_ATTR(16), + DECLARE_TRANSCEIVER_LPMOD_ATTR(1), + DECLARE_TRANSCEIVER_LPMOD_ATTR(2), + DECLARE_TRANSCEIVER_LPMOD_ATTR(3), + DECLARE_TRANSCEIVER_LPMOD_ATTR(4), + DECLARE_TRANSCEIVER_LPMOD_ATTR(5), + DECLARE_TRANSCEIVER_LPMOD_ATTR(6), + DECLARE_TRANSCEIVER_LPMOD_ATTR(7), + DECLARE_TRANSCEIVER_LPMOD_ATTR(8), + DECLARE_TRANSCEIVER_LPMOD_ATTR(9), + DECLARE_TRANSCEIVER_LPMOD_ATTR(10), + DECLARE_TRANSCEIVER_LPMOD_ATTR(11), + DECLARE_TRANSCEIVER_LPMOD_ATTR(12), + DECLARE_TRANSCEIVER_LPMOD_ATTR(13), + DECLARE_TRANSCEIVER_LPMOD_ATTR(14), + DECLARE_TRANSCEIVER_LPMOD_ATTR(15), + DECLARE_TRANSCEIVER_LPMOD_ATTR(16), + DECLARE_TRANSCEIVER_MODSEL_ATTR(1), + DECLARE_TRANSCEIVER_MODSEL_ATTR(2), + DECLARE_TRANSCEIVER_MODSEL_ATTR(3), + DECLARE_TRANSCEIVER_MODSEL_ATTR(4), + DECLARE_TRANSCEIVER_MODSEL_ATTR(5), + DECLARE_TRANSCEIVER_MODSEL_ATTR(6), + DECLARE_TRANSCEIVER_MODSEL_ATTR(7), + DECLARE_TRANSCEIVER_MODSEL_ATTR(8), + DECLARE_TRANSCEIVER_MODSEL_ATTR(9), + DECLARE_TRANSCEIVER_MODSEL_ATTR(10), + DECLARE_TRANSCEIVER_MODSEL_ATTR(11), + DECLARE_TRANSCEIVER_MODSEL_ATTR(12), + DECLARE_TRANSCEIVER_MODSEL_ATTR(13), + DECLARE_TRANSCEIVER_MODSEL_ATTR(14), + DECLARE_TRANSCEIVER_MODSEL_ATTR(15), + DECLARE_TRANSCEIVER_MODSEL_ATTR(16), + NULL +}; + +static const struct attribute_group wistron_cpld1_group = { + .attrs = wistron_cpld1_attributes, +}; + +static struct attribute *wistron_cpld2_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(17), + DECLARE_TRANSCEIVER_PRESENT_ATTR(18), + DECLARE_TRANSCEIVER_PRESENT_ATTR(19), + DECLARE_TRANSCEIVER_PRESENT_ATTR(20), + DECLARE_TRANSCEIVER_PRESENT_ATTR(21), + DECLARE_TRANSCEIVER_PRESENT_ATTR(22), + DECLARE_TRANSCEIVER_PRESENT_ATTR(23), + DECLARE_TRANSCEIVER_PRESENT_ATTR(24), + DECLARE_TRANSCEIVER_PRESENT_ATTR(25), + DECLARE_TRANSCEIVER_PRESENT_ATTR(26), + DECLARE_TRANSCEIVER_PRESENT_ATTR(27), + DECLARE_TRANSCEIVER_PRESENT_ATTR(28), + DECLARE_TRANSCEIVER_PRESENT_ATTR(29), + DECLARE_TRANSCEIVER_PRESENT_ATTR(30), + DECLARE_TRANSCEIVER_PRESENT_ATTR(31), + DECLARE_TRANSCEIVER_PRESENT_ATTR(32), + DECLARE_TRANSCEIVER_RESET_ATTR(17), + DECLARE_TRANSCEIVER_RESET_ATTR(18), + DECLARE_TRANSCEIVER_RESET_ATTR(19), + DECLARE_TRANSCEIVER_RESET_ATTR(20), + DECLARE_TRANSCEIVER_RESET_ATTR(21), + DECLARE_TRANSCEIVER_RESET_ATTR(22), + DECLARE_TRANSCEIVER_RESET_ATTR(23), + DECLARE_TRANSCEIVER_RESET_ATTR(24), + DECLARE_TRANSCEIVER_RESET_ATTR(25), + DECLARE_TRANSCEIVER_RESET_ATTR(26), + DECLARE_TRANSCEIVER_RESET_ATTR(27), + DECLARE_TRANSCEIVER_RESET_ATTR(28), + DECLARE_TRANSCEIVER_RESET_ATTR(29), + DECLARE_TRANSCEIVER_RESET_ATTR(30), + DECLARE_TRANSCEIVER_RESET_ATTR(31), + DECLARE_TRANSCEIVER_RESET_ATTR(32), + DECLARE_TRANSCEIVER_LPMOD_ATTR(17), + DECLARE_TRANSCEIVER_LPMOD_ATTR(18), + DECLARE_TRANSCEIVER_LPMOD_ATTR(19), + DECLARE_TRANSCEIVER_LPMOD_ATTR(20), + DECLARE_TRANSCEIVER_LPMOD_ATTR(21), + DECLARE_TRANSCEIVER_LPMOD_ATTR(22), + DECLARE_TRANSCEIVER_LPMOD_ATTR(23), + DECLARE_TRANSCEIVER_LPMOD_ATTR(24), + DECLARE_TRANSCEIVER_LPMOD_ATTR(25), + DECLARE_TRANSCEIVER_LPMOD_ATTR(26), + DECLARE_TRANSCEIVER_LPMOD_ATTR(27), + DECLARE_TRANSCEIVER_LPMOD_ATTR(28), + DECLARE_TRANSCEIVER_LPMOD_ATTR(29), + DECLARE_TRANSCEIVER_LPMOD_ATTR(30), + DECLARE_TRANSCEIVER_LPMOD_ATTR(31), + DECLARE_TRANSCEIVER_LPMOD_ATTR(32), + DECLARE_TRANSCEIVER_MODSEL_ATTR(17), + DECLARE_TRANSCEIVER_MODSEL_ATTR(18), + DECLARE_TRANSCEIVER_MODSEL_ATTR(19), + DECLARE_TRANSCEIVER_MODSEL_ATTR(20), + DECLARE_TRANSCEIVER_MODSEL_ATTR(21), + DECLARE_TRANSCEIVER_MODSEL_ATTR(22), + DECLARE_TRANSCEIVER_MODSEL_ATTR(23), + DECLARE_TRANSCEIVER_MODSEL_ATTR(24), + DECLARE_TRANSCEIVER_MODSEL_ATTR(25), + DECLARE_TRANSCEIVER_MODSEL_ATTR(26), + DECLARE_TRANSCEIVER_MODSEL_ATTR(27), + DECLARE_TRANSCEIVER_MODSEL_ATTR(28), + DECLARE_TRANSCEIVER_MODSEL_ATTR(29), + DECLARE_TRANSCEIVER_MODSEL_ATTR(30), + DECLARE_TRANSCEIVER_MODSEL_ATTR(31), + DECLARE_TRANSCEIVER_MODSEL_ATTR(32), + NULL +}; + +static const struct attribute_group wistron_cpld2_group = { + .attrs = wistron_cpld2_attributes, +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + status = data->present[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + long status=0; + int update_idx, error; + + error = kstrtol(buf, 10, &status); + if (error) + return error; + + update_idx = attr->index - MODULE_PRESENT_1; + + mutex_lock(&data->lock); + data->present[update_idx] = status; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int version; + + mutex_lock(&data->lock); + version = data->version; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", version); +} + +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, version; + + error = kstrtoint(buf, 10, &version); + if (error) + return error; + + mutex_lock(&data->lock); + data->version = version; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, reset = 0; + + update_idx = attr->index - MODULE_RESET_1; + + mutex_lock(&data->lock); + reset = data->reset[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", reset); +} + +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, reset; + int update_idx; + + error = kstrtoint(buf, 10, &reset); + if (error) + return error; + + update_idx = attr->index - MODULE_RESET_1; + + mutex_lock(&data->lock); + data->reset[update_idx] = reset; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - SYSTEM_LED_LOC; + + mutex_lock(&data->lock); + status = data->sysled_status[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", status); +} + +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, status; + int update_idx; + + error = kstrtoint(buf, 10, &status); + if (error) + return error; + + update_idx = attr->index - SYSTEM_LED_LOC; + + mutex_lock(&data->lock); + data->sysled_status[update_idx] = status; + mutex_unlock(&data->lock); + + return count; +} + +static int get_led_status_internal(struct i2c_client *client, int led_type) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + status = data->sysled_status[led_type]; + mutex_unlock(&data->lock); + return status; +} + +static int set_led_status_internal(struct i2c_client *client, int led_type, int light_mode) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + data->sysled_status[led_type] = light_mode; + mutex_unlock(&data->lock); + + return 0; +} + +static ssize_t get_mode_lpmod(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, lpmod = 0; + + update_idx = attr->index - MODULE_LPMOD_1; + + mutex_lock(&data->lock); + lpmod = data->lpmod[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", lpmod); +} + +static ssize_t set_mode_lpmod(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, lpmod; + int update_idx; + + error = kstrtoint(buf, 10, &lpmod); + if (error) + return error; + + update_idx = attr->index - MODULE_LPMOD_1; + + mutex_lock(&data->lock); + data->lpmod[update_idx] = lpmod; + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t get_mode_modsel(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int update_idx, modsel = 0; + + update_idx = attr->index - MODULE_MODSEL_1; + + mutex_lock(&data->lock); + modsel = data->modsel[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", modsel); +} + +static ssize_t set_mode_modsel(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_cpld_data *data = i2c_get_clientdata(client); + int error, modsel; + int update_idx; + + error = kstrtoint(buf, 10, &modsel); + if (error) + return error; + + update_idx = attr->index - MODULE_MODSEL_1; + + mutex_lock(&data->lock); + data->modsel[update_idx] = modsel; + mutex_unlock(&data->lock); + + return count; +} + +static void wistron_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void wistron_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) { + found = 1; + break; + } + } + + if (found) { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +/* + * I2C init/probing/exit functions + */ +static int wistron_cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct wistron_cpld_data *data; + int ret = -ENODEV; + const struct attribute_group *group = NULL; + + data = kzalloc(sizeof(struct wistron_cpld_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + data->type = id->driver_data; + + /* Register sysfs hooks */ + switch (data->type) + { + case wistron_fpga: + group = &wistron_fpga_group; + break; + case wistron_cpld1: + group = &wistron_cpld1_group; + break; + case wistron_cpld2: + group = &wistron_cpld2_group; + break; + default: + break; + } + + if (group) { + ret = sysfs_create_group(&client->dev.kobj, group); + if (ret) + goto exit_free; + } + + wistron_cpld_add_client(client); + return 0; + +exit_free: + kfree(data); + + return ret; +} + +static int wistron_cpld_remove(struct i2c_client *client) +{ + struct wistron_cpld_data *data = i2c_get_clientdata(client); + const struct attribute_group *group = NULL; + + wistron_cpld_remove_client(client); + + /* Remove sysfs hooks */ + switch (data->type) + { + case wistron_fpga: + group = &wistron_fpga_group; + break; + case wistron_cpld1: + group = &wistron_cpld1_group; + break; + case wistron_cpld2: + group = &wistron_cpld2_group; + break; + default: + break; + } + + if (group) + sysfs_remove_group(&client->dev.kobj, group); + + kfree(data); + + return 0; +} + +int wistron_fpga_sysled_get(int led_type) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == FPGA_ADDR) { + ret = get_led_status_internal(cpld_node->client, led_type); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(wistron_fpga_sysled_get); + +int wistron_fpga_sysled_set(int led_type, int light_mode) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == FPGA_ADDR) { + ret = set_led_status_internal(cpld_node->client, led_type, light_mode); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(wistron_fpga_sysled_set); + +static struct i2c_driver wistron_cpld_driver = { + .driver = { + .name = "wistron_cpld", + .owner = THIS_MODULE, + }, + .probe = wistron_cpld_probe, + .remove = wistron_cpld_remove, + .id_table = wistron_cpld_id, +}; + +static int __init wistron_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&wistron_cpld_driver); +} + +static void __exit wistron_cpld_exit(void) +{ + i2c_del_driver(&wistron_cpld_driver); +} + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("Wistron I2C CPLD driver"); +MODULE_LICENSE("GPL"); + +module_init(wistron_cpld_init); +module_exit(wistron_cpld_exit); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c new file mode 100644 index 0000000000..4d57ba729c --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_fan.c @@ -0,0 +1,255 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "wistron_fan" + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum fan_id { + FAN1_ID, + FAN2_ID, + FAN3_ID, + FAN4_ID, + FAN5_ID, + FAN6_ID, + FAN7_ID +}; + +enum sysfs_fan_attributes { + FAN_DUTY_CYCLE_PERCENTAGE, + FAN1_PRESENCE, + FAN2_PRESENCE, + FAN3_PRESENCE, + FAN4_PRESENCE, + FAN5_PRESENCE, + FAN6_PRESENCE, + FAN7_PRESENCE, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, + FAN7_DIRECTION, + FAN1_FRONT_SPEED_RPM, + FAN2_FRONT_SPEED_RPM, + FAN3_FRONT_SPEED_RPM, + FAN4_FRONT_SPEED_RPM, + FAN5_FRONT_SPEED_RPM, + FAN6_FRONT_SPEED_RPM, + FAN7_FRONT_SPEED_RPM, + FAN1_REAR_SPEED_RPM, + FAN2_REAR_SPEED_RPM, + FAN3_REAR_SPEED_RPM, + FAN4_REAR_SPEED_RPM, + FAN5_REAR_SPEED_RPM, + FAN6_REAR_SPEED_RPM, + FAN7_REAR_SPEED_RPM, + FAN_ATTR_MAX +}; + +/* Each client has this additional data */ +struct wistron_fan_data { + struct device *hwmon_dev; + struct mutex update_lock; + int fan_val[FAN_ATTR_MAX]; +}; + +/* Define attributes */ +#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(pwm##index, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DUTY_CYCLE_PERCENTAGE) +#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_pwm##index.dev_attr.attr + +#define DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_present, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_PRESENCE) +#define DECLARE_FAN_PRESENCE_ATTR(index) &sensor_dev_attr_fan##index##_present.dev_attr.attr + +#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DIRECTION) +#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr + +#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index, index2) \ +static SENSOR_DEVICE_ATTR(fan##index##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ +static SENSOR_DEVICE_ATTR(fan##index2##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM) +#define DECLARE_FAN_SPEED_RPM_ATTR(index, index2) \ +&sensor_dev_attr_fan##index##_input.dev_attr.attr, \ +&sensor_dev_attr_fan##index2##_input.dev_attr.attr + +/* 7 fan speed(rpm) attributes in this platform */ +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1, 8); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2, 9); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3, 10); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4, 11); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5, 12); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6, 13); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(7, 14); + +/* 7 fan presence */ +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(7); + +/* 7 fan direction */ +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(7); + +/* 1 fan duty cycle attribute in this platform */ +DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); + +static struct attribute *wistron_fan_attributes[] = { + /* fan related attributes */ + DECLARE_FAN_SPEED_RPM_ATTR(1, 8), + DECLARE_FAN_SPEED_RPM_ATTR(2, 9), + DECLARE_FAN_SPEED_RPM_ATTR(3, 10), + DECLARE_FAN_SPEED_RPM_ATTR(4, 11), + DECLARE_FAN_SPEED_RPM_ATTR(5, 12), + DECLARE_FAN_SPEED_RPM_ATTR(6, 13), + DECLARE_FAN_SPEED_RPM_ATTR(7, 14), + DECLARE_FAN_PRESENCE_ATTR(1), + DECLARE_FAN_PRESENCE_ATTR(2), + DECLARE_FAN_PRESENCE_ATTR(3), + DECLARE_FAN_PRESENCE_ATTR(4), + DECLARE_FAN_PRESENCE_ATTR(5), + DECLARE_FAN_PRESENCE_ATTR(6), + DECLARE_FAN_PRESENCE_ATTR(7), + DECLARE_FAN_DIRECTION_ATTR(1), + DECLARE_FAN_DIRECTION_ATTR(2), + DECLARE_FAN_DIRECTION_ATTR(3), + DECLARE_FAN_DIRECTION_ATTR(4), + DECLARE_FAN_DIRECTION_ATTR(5), + DECLARE_FAN_DIRECTION_ATTR(6), + DECLARE_FAN_DIRECTION_ATTR(7), + DECLARE_FAN_DUTY_CYCLE_ATTR(), + NULL +}; + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_fan_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->update_lock); + value = data->fan_val[attr->index]; + mutex_unlock(&data->update_lock); + + return sprintf(buf, "%d", value); +} + +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf,size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_fan_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) { + printk("fan_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->update_lock); + data->fan_val[attr->index] = value; + mutex_unlock(&data->update_lock); + + return count; +} + +static const struct attribute_group wistron_fan_group = { + .attrs = wistron_fan_attributes, +}; + +static int wistron_fan_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_fan_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_fan_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_fan_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_fan", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_fan_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_fan_remove(struct i2c_client *client) +{ + struct wistron_fan_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_fan_group); + + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { 0x23, I2C_CLIENT_END }; + +static const struct i2c_device_id wistron_fan_id[] = { + { "wistron_fan", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_fan_id); + +static struct i2c_driver wistron_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = wistron_fan_probe, + .remove = wistron_fan_remove, + .id_table = wistron_fan_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(wistron_fan_driver); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_fan driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c new file mode 100644 index 0000000000..a9e143624e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_leds.c @@ -0,0 +1,245 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +extern int wistron_fpga_sysled_get(int led_type); +extern int wistron_fpga_sysled_set(int led_type, int light_mode); +#define SYSLED_NUM 4 + +#define DRVNAME "wistron_led" + +struct wistron_led_data { + struct platform_device *pdev; + struct mutex lock; + int sysled_status[SYSLED_NUM]; +}; + +static struct wistron_led_data *ledctl = NULL; + +enum led_type { + LED_TYPE_LOC, + LED_TYPE_DIAG, + LED_TYPE_FAN, + LED_TYPE_PSU, + LED_TYPE_END +}; + +enum led_light_mode { + LED_MODE_OFF = 0, + LED_MODE_GREEN, + LED_MODE_AMBER, + LED_MODE_BLK_GREEN, + LED_MODE_UNKNOWN +}; + +static void wistron_led_update(void) +{ + int i; + mutex_lock(&ledctl->lock); + for (i = 0; i < LED_TYPE_END; i++) { + ledctl->sysled_status[i] = wistron_fpga_sysled_get(i); + } + mutex_unlock(&ledctl->lock); +} + +static void wistron_led_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode, enum led_type type) +{ + mutex_lock(&ledctl->lock); + wistron_fpga_sysled_set(type, led_light_mode); + mutex_unlock(&ledctl->lock); +} + +static void wistron_led_diag_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); +} + +static enum led_brightness wistron_led_diag_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_DIAG]; +} + +static void wistron_led_loc_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); +} + +static enum led_brightness wistron_led_loc_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_LOC]; +} + +static void wistron_led_fan_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_FAN); +} + +static enum led_brightness wistron_led_fan_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_FAN]; +} + +static void wistron_led_psu_set(struct led_classdev *led_cdev, enum led_brightness led_light_mode) +{ + wistron_led_set(led_cdev, led_light_mode, LED_TYPE_PSU); +} + +static enum led_brightness wistron_led_psu_get(struct led_classdev *cdev) +{ + wistron_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU]; +} + +static struct led_classdev wistron_leds[] = { + [LED_TYPE_DIAG] = { + .name = "wistron_led::sys_led", + .default_trigger = "unused", + .brightness_set = wistron_led_diag_set, + .brightness_get = wistron_led_diag_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_LOC] = { + .name = "wistron_led::loc_led", + .default_trigger = "unused", + .brightness_set = wistron_led_loc_set, + .brightness_get = wistron_led_loc_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_FAN] = { + .name = "wistron_led::fan_led", + .default_trigger = "unused", + .brightness_set = wistron_led_fan_set, + .brightness_get = wistron_led_fan_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU] = { + .name = "wistron_led::psu_led", + .default_trigger = "unused", + .brightness_set = wistron_led_psu_set, + .brightness_get = wistron_led_psu_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, +}; + +static int wistron_led_suspend(struct platform_device *dev, pm_message_t state) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_suspend(&wistron_leds[i]); + } + + return 0; +} + +static int wistron_led_resume(struct platform_device *dev) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_resume(&wistron_leds[i]); + } + + return 0; +} + +static int wistron_led_probe(struct platform_device *pdev) +{ + int ret, i; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + ret = led_classdev_register(&pdev->dev, &wistron_leds[i]); + + if (ret < 0) + break; + } + + /* Check if all LEDs were successfully registered */ + if (i != ARRAY_SIZE(wistron_leds)) { + int j; + + /* only unregister the LEDs that were successfully registered */ + for (j = 0; j < i; j++) { + led_classdev_unregister(&wistron_leds[i]); + } + } + + return ret; +} + +static int wistron_led_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(wistron_leds); i++) { + led_classdev_unregister(&wistron_leds[i]); + } + + return 0; +} + +static struct platform_driver wistron_led_driver = { + .probe = wistron_led_probe, + .remove = wistron_led_remove, + .suspend = wistron_led_suspend, + .resume = wistron_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init wistron_led_init(void) +{ + int ret; + + ret = platform_driver_register(&wistron_led_driver); + if (ret < 0) + goto exit; + + ledctl = kzalloc(sizeof(struct wistron_led_data), GFP_KERNEL); + if (!ledctl) { + ret = -ENOMEM; + platform_driver_unregister(&wistron_led_driver); + goto exit; + } + + mutex_init(&ledctl->lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(ledctl->pdev)) { + ret = PTR_ERR(ledctl->pdev); + platform_driver_unregister(&wistron_led_driver); + kfree(ledctl); + goto exit; + } + +exit: + return ret; +} + +static void __exit wistron_led_exit(void) +{ + platform_device_unregister(ledctl->pdev); + platform_driver_unregister(&wistron_led_driver); + kfree(ledctl); +} + +module_init(wistron_led_init); +module_exit(wistron_led_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c new file mode 100644 index 0000000000..4236373499 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_oom.c @@ -0,0 +1,312 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* QSFP-DD: page0 (low page + high page (128+128 byte)), page 2 (high page (128 byte)), page11 (high page (128 byte))*/ +#define EEPROM_DATA_SIZE 256 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; +#define MAX_PORT_NAME_LEN 20 + +enum sysfs_fan_attributes { + OOM_LP_MODE, + OOM_TEMP, + OOM_EEPROM1, + OOM_EEPROM2, + OOM_PORT_NAME, + OOM_ATTR_MAX +}; + +/* Each client has this additional data */ +struct wistron_oom_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + int lp_mode; + int temp; + unsigned char eeprom1[EEPROM_DATA_SIZE]; + unsigned char eeprom2[EEPROM_DATA_SIZE]; + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info1(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info1(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info2(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static SENSOR_DEVICE_ATTR(lp_mode, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_LP_MODE); +static SENSOR_DEVICE_ATTR(temp, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_TEMP); +static SENSOR_DEVICE_ATTR(eeprom1, S_IWUSR | S_IRUGO, get_oom_info1, set_oom_info1, OOM_EEPROM1); +static SENSOR_DEVICE_ATTR(eeprom2, S_IWUSR | S_IRUGO, get_oom_info2, set_oom_info2, OOM_EEPROM2); +static SENSOR_DEVICE_ATTR(port_name, S_IRUGO | S_IWUSR, get_port_name, set_port_name, OOM_PORT_NAME); + +static struct attribute *wistron_oom_attributes[] = { + &sensor_dev_attr_lp_mode.dev_attr.attr, + &sensor_dev_attr_temp.dev_attr.attr, + &sensor_dev_attr_eeprom1.dev_attr.attr, + &sensor_dev_attr_eeprom2.dev_attr.attr, + &sensor_dev_attr_port_name.dev_attr.attr, + NULL +}; + +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + value = data->lp_mode; + else + value = data->temp; + + mutex_unlock(&data->lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) { + printk("oom_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + data->lp_mode = value; + else + data->temp = value; + + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_oom_info1(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom1, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info1(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom1, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i=0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + + sscanf(str, "%x", &val); + + i = j + i - 1; + + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom1[k] = (unsigned char)val; + k++; + } + } + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_oom_info2(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom2, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom2, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i = 0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + + sscanf(str, "%x", &val); + + i = j + i - 1; + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom2[k]=(unsigned char)val; + k++; + } + } + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + count = sprintf(buf, "%s", data->port_name); + mutex_unlock(&data->lock); + + return count; +} + +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_oom_data *data = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + if (sscanf(buf, "%19s", port_name) != 1) + return -EINVAL; + + mutex_lock(&data->lock); + strcpy(data->port_name, port_name); + mutex_unlock(&data->lock); + + return count; +} + +static const struct attribute_group wistron_oom_group = { + .attrs = wistron_oom_attributes, +}; + +static int wistron_oom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_oom_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_oom_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_oom_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_oom", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: oom '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_oom_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_oom_remove(struct i2c_client *client) +{ + struct wistron_oom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_oom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_oom_id[] = { + { "wistron_oom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_oom_id); + +static struct i2c_driver wistron_oom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_oom", + }, + .probe = wistron_oom_probe, + .remove = wistron_oom_remove, + .id_table = wistron_oom_id, + .address_list = normal_i2c, +}; + +static int __init wistron_oom_init(void) +{ + return i2c_add_driver(&wistron_oom_driver); +} + +static void __exit wistron_oom_exit(void) +{ + i2c_del_driver(&wistron_oom_driver); +} + +module_init(wistron_oom_init); +module_exit(wistron_oom_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_oom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c new file mode 100644 index 0000000000..1ea7764dd4 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_psu.c @@ -0,0 +1,347 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +#define MFR_VENDOR_NAME_LENGTH 16 +#define MFR_MODEL_NAME_LENGTH 16 +#define MFR_SERIAL_NUM_LENGTH 32 + +/* Each client has this additional data */ +struct wistron_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int index; /* PSU index */ + int present; /* PSU present */ + int pwr_good; /* PSU power good */ + int v_in; + int v_out; + int i_in; + int i_out; + int p_in; + int p_out; + int temp_input; + int fault; + u8 mfr_id[MFR_VENDOR_NAME_LENGTH]; + u8 mfr_model[MFR_MODEL_NAME_LENGTH]; + u8 mfr_serial[MFR_SERIAL_NUM_LENGTH]; +}; + +enum psu_index { + wistron_psu1, + wistron_psu2 +}; + +enum wistron_psu_sysfs_attributes { + PSU_PRESENT, + PSU_POWER_GOOD, + PSU_V_IN, + PSU_V_OUT, + PSU_I_IN, + PSU_I_OUT, + PSU_P_IN, + PSU_P_OUT, + PSU_TEMP1_INPUT, + PSU_FAULT, + PSU_MFR_ID, + PSU_MFR_MODEL, + PSU_MFR_SERIAL, +}; + +/* sysfs attributes for hwmon */ +static SENSOR_DEVICE_ATTR(present, S_IWUSR | S_IRUGO, get_status, set_status, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(power_good, S_IWUSR | S_IRUGO, get_status, set_status, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(in1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_IN); +static SENSOR_DEVICE_ATTR(in2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_IN); +static SENSOR_DEVICE_ATTR(curr2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_IN); +static SENSOR_DEVICE_ATTR(power2_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fault, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAULT); +static SENSOR_DEVICE_ATTR(vendor, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_ID); +static SENSOR_DEVICE_ATTR(model, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(sn, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_SERIAL); + + +static struct attribute *wistron_psu_attributes[] = { + &sensor_dev_attr_present.dev_attr.attr, + &sensor_dev_attr_power_good.dev_attr.attr, + &sensor_dev_attr_in1_input.dev_attr.attr, + &sensor_dev_attr_in2_input.dev_attr.attr, + &sensor_dev_attr_curr1_input.dev_attr.attr, + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_power1_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fault.dev_attr.attr, + &sensor_dev_attr_vendor.dev_attr.attr, + &sensor_dev_attr_model.dev_attr.attr, + &sensor_dev_attr_sn.dev_attr.attr, + NULL +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) { + status = data->present; + } else if (attr->index == PSU_POWER_GOOD) { + status = data->pwr_good; + } + + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int error, status; + + error = kstrtoint(buf, 10, &status); + if (error) { + printk("psu_set_status error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) { + data->present = status; + } else if (attr->index == PSU_POWER_GOOD) { + data->pwr_good = status; + } + + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + size_t ret_count = 0; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + ret_count = sprintf(buf, "%d", data->v_in); + break; + case PSU_V_OUT: + ret_count = sprintf(buf, "%d", data->v_out); + break; + case PSU_I_IN: + ret_count = sprintf(buf, "%d", data->i_in); + break; + case PSU_I_OUT: + ret_count = sprintf(buf, "%d", data->i_out); + break; + case PSU_P_IN: + ret_count = sprintf(buf, "%d", data->p_in); + break; + case PSU_P_OUT: + ret_count = sprintf(buf, "%d", data->p_out); + break; + case PSU_TEMP1_INPUT: + ret_count = sprintf(buf, "%d", data->temp_input); + break; + case PSU_FAULT: + ret_count = sprintf(buf, "%d", data->fault); + break; + case PSU_MFR_ID: + ret_count = sprintf(buf, "%s", data->mfr_id); + break; + case PSU_MFR_MODEL: + ret_count = sprintf(buf, "%s", data->mfr_model); + break; + case PSU_MFR_SERIAL: + ret_count = sprintf(buf, "%s", data->mfr_serial); + break; + default: + break; + } + + mutex_unlock(&data->lock); + return ret_count; +} + +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_psu_data *data = i2c_get_clientdata(client); + int error; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + error = kstrtoint(buf, 10, &data->v_in); + if (error) + goto exit_err; + break; + case PSU_V_OUT: + error = kstrtoint(buf, 10, &data->v_out); + if (error) + goto exit_err; + break; + case PSU_I_IN: + error = kstrtoint(buf, 10, &data->i_in); + if (error) + goto exit_err; + break; + case PSU_I_OUT: + error = kstrtoint(buf, 10, &data->i_out); + if (error) + goto exit_err; + break; + case PSU_P_IN: + error = kstrtoint(buf, 10, &data->p_in); + if (error) + goto exit_err; + break; + case PSU_P_OUT: + error = kstrtoint(buf, 10, &data->p_out); + if (error) + goto exit_err; + break; + case PSU_TEMP1_INPUT: + error = kstrtoint(buf, 10, &data->temp_input); + if (error) + goto exit_err; + break; + case PSU_FAULT: + error = kstrtoint(buf, 10, &data->fault); + if (error) + goto exit_err; + break; + case PSU_MFR_ID: + memset(&data->mfr_id, 0x0, sizeof(data->mfr_id)); + strncpy(data->mfr_id, buf, sizeof(data->mfr_id) - 1); + break; + case PSU_MFR_MODEL: + memset(&data->mfr_model, 0x0, sizeof(data->mfr_model)); + strncpy(data->mfr_model, buf, sizeof(data->mfr_model) - 1); + break; + case PSU_MFR_SERIAL: + memset(&data->mfr_serial, 0x0, sizeof(data->mfr_serial)); + strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial) - 1); + break; + default: + break; + } + + mutex_unlock(&data->lock); + return count; + +exit_err: + mutex_unlock(&data->lock); + return error; +} + +static const struct attribute_group wistron_psu_group = { + .attrs = wistron_psu_attributes, +}; + +static int wistron_psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct wistron_psu_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) + return -EIO; + + data = kzalloc(sizeof(struct wistron_psu_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_psu_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_psu", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_psu_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_psu_remove(struct i2c_client *client) +{ + struct wistron_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_psu_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_psu_id[] = { + { "wistron_psu1", wistron_psu1 }, + { "wistron_psu2", wistron_psu2 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_psu_id); + +static struct i2c_driver wistron_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_psu", + }, + .probe = wistron_psu_probe, + .remove = wistron_psu_remove, + .id_table = wistron_psu_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(wistron_psu_driver); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron_psu driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c new file mode 100644 index 0000000000..a281df7196 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_syseeprom.c @@ -0,0 +1,161 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define EEPROM_DATA_SIZE 256 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct wistron_syseeprom_data { + struct device *hwmon_dev; + struct mutex lock; + unsigned char eeprom[EEPROM_DATA_SIZE]; +}; + +static ssize_t get_syseeprom(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + memcpy(buf, data->eeprom, EEPROM_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM_DATA_SIZE; +} + +static ssize_t set_syseeprom(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct i2c_client *client = to_i2c_client(dev); + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + int i = 0, j = 0, k = 0; + unsigned char str[3]; + unsigned int val; + + mutex_lock(&data->lock); + memset(data->eeprom, 0xFF, EEPROM_DATA_SIZE); + memset(str, 0x0, 3); + + if (strlen(buf) >= EEPROM_DATA_SIZE) { + for (i = 0; i < strlen(buf) ; i++) { + for (j = 0; j < 2; j++) { + str[j] = buf[i + j]; + } + sscanf(str, "%x", &val); + + i = j + i - 1; + if (k >= EEPROM_DATA_SIZE) + break; + + data->eeprom[k] = (unsigned char)val; + + k++; + } + } + + mutex_unlock(&data->lock); + return size; +} + +static SENSOR_DEVICE_ATTR(eeprom, S_IWUSR | S_IRUGO, get_syseeprom, set_syseeprom, 0); + +static struct attribute *wistron_syseeprom_attributes[] = { + &sensor_dev_attr_eeprom.dev_attr.attr, + NULL +}; + +static const struct attribute_group wistron_syseeprom_group = { + .attrs = wistron_syseeprom_attributes, +}; + +static int wistron_syseeprom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_syseeprom_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_syseeprom_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_syseeprom_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_syseeprom", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: syseeprom '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_syseeprom_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_syseeprom_remove(struct i2c_client *client) +{ + struct wistron_syseeprom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_syseeprom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id wistron_syseeprom_id[] = { + { "wistron_syseeprom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_syseeprom_id); + +static struct i2c_driver wistron_syseeprom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_syseeprom", + }, + .probe = wistron_syseeprom_probe, + .remove = wistron_syseeprom_remove, + .id_table = wistron_syseeprom_id, + .address_list = normal_i2c, +}; + +static int __init wistron_syseeprom_init(void) +{ + return i2c_add_driver(&wistron_syseeprom_driver); +} + +static void __exit wistron_syseeprom_exit(void) +{ + i2c_del_driver(&wistron_syseeprom_driver); +} + +module_init(wistron_syseeprom_init); +module_exit(wistron_syseeprom_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron syseeprom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c new file mode 100644 index 0000000000..7d841046db --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/wistron_6512_32r_thermal.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct wistron_thermal_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + unsigned int temp1_input; + unsigned int temp1_max; + unsigned int temp1_crit; + unsigned int temp1_max_hyst; +}; + +enum wistron_thermal_sysfs_attributes { + TEMP1_INPUT, + TEMP1_MAX, + TEMP1_CRIT, + TEMP1_MAX_HYST +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX); +static SENSOR_DEVICE_ATTR(temp1_crit, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_CRIT); +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX_HYST); + +static struct attribute *wistron_thermal_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_crit.dev_attr.attr, + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, + NULL +}; + +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_thermal_data *data = i2c_get_clientdata(client); + int status = -EINVAL; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_input); + break; + case TEMP1_MAX: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_max); + break; + case TEMP1_CRIT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_crit); + break; + case TEMP1_MAX_HYST: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_max); // not support in this platform, so return max temp + break; + default : + break; + } + mutex_unlock(&data->lock); + + return status; +} + +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_thermal_data *data = i2c_get_clientdata(client); + long keyin = 0; + int error; + + error = kstrtol(buf, 10, &keyin); + if (error) + return error; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + data->temp1_input = keyin; + break; + case TEMP1_MAX: + data->temp1_max = keyin; + break; + case TEMP1_CRIT: + data->temp1_crit = keyin; + break; + default : + break; + } + + mutex_unlock(&data->lock); + + return size; +} + +static const struct attribute_group wistron_thermal_group = { + .attrs = wistron_thermal_attributes, +}; + +static int wistron_thermal_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_thermal_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_thermal_data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_thermal_group); + if (status) + goto exit_free; + + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_thermal", NULL, NULL, NULL); + if (IS_ERR(data->hwmon_dev)) { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: thermal '%s'\n", dev_name(data->hwmon_dev), client->name); + + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_thermal_group); +exit_free: + kfree(data); + + return status; +} + +static int wistron_thermal_remove(struct i2c_client *client) +{ + struct wistron_thermal_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_thermal_group); + kfree(data); + + return 0; +} + + +static const struct i2c_device_id wistron_thermal_id[] = { + { "wistron_thermal", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_thermal_id); + +static struct i2c_driver wistron_thermal_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_thermal", + }, + .probe = wistron_thermal_probe, + .remove = wistron_thermal_remove, + .id_table = wistron_thermal_id, + .address_list = normal_i2c, +}; + +static int __init wistron_thermal_init(void) +{ + return i2c_add_driver(&wistron_thermal_driver); +} + +static void __exit wistron_thermal_exit(void) +{ + i2c_del_driver(&wistron_thermal_driver); +} + +module_init(wistron_thermal_init); +module_exit(wistron_thermal_exit); + +MODULE_AUTHOR("Wistron"); +MODULE_DESCRIPTION("wistron thermal driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service new file mode 100644 index 0000000000..1842d036cd --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-platform.service @@ -0,0 +1,13 @@ +[Unit] +Description=Wistron 6512-32R Platform Monitoring service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_sync +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service new file mode 100644 index 0000000000..989248c885 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-syseeprom.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron 6512-32R Platform SysEEPROM service +After=platform-modules-6512-32r.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_syseeprom +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service new file mode 100644 index 0000000000..485217dc6e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/platform-modules-6512-32r.service @@ -0,0 +1,14 @@ +[Unit] +Description=Wistron 6512-32R Platform modules +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/wistron_6512_32r_util.py install +ExecStop=/usr/local/bin/wistron_6512_32r_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py new file mode 100644 index 0000000000..3c2888412e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py @@ -0,0 +1,34 @@ +from setuptools import setup + +DEVICE_NAME = 'wistron' +HW_SKU = 'x86_64-wistron_6512_32r-r0' + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Wistron Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='linuxnetdev@microsoft.com', + url='https://github.com/Azure/sonic-buildimage', + maintainer='ChihPei Chang', + maintainer_email='ChihPei_Chang@wistron.com', + packages=[ + 'sonic_platform', + ], + package_dir={ + 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync new file mode 100644 index 0000000000..9c357e7ac7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync @@ -0,0 +1,7 @@ +#!/bin/bash +/usr/local/bin/sonic-fanthrml-monitor & +/usr/local/bin/sonic-led-monitor & +/usr/local/bin/sonic-qsfp-monitor & +/usr/local/bin/sonic-psu-monitor & +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom new file mode 100644 index 0000000000..2db0a921cb --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom @@ -0,0 +1,10 @@ +#!/bin/bash +eeprom_part1=$(ipmitool raw 0x30 0x25 0x00 0xaa 0x80 0x0 2>>/dev/null) +eeprom_part2=$(ipmitool raw 0x30 0x25 0x00 0xaa 0x80 0x80 2>>/dev/null) +eeprom1_full=$eeprom_part1$eeprom_part2 +eeprom1_full=$(echo $eeprom1_full | sed 's/[[:space:]]//g') +eeprom1_path="/sys/bus/i2c/devices/0-0055/eeprom" +eeprom1_full=$(echo $eeprom1_full | sed -e 's/ //g') +echo $eeprom1_full > $eeprom1_path +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor new file mode 100644 index 0000000000..b490dbc8c9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor @@ -0,0 +1,416 @@ +#!/bin/bash + +debug_flag=0 + +fan_val=0 +temp_val=0 +ctrl_mode_val=0 +fan_pwm_val=0 +fan_rpm_val=0 +init_threshold=0 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + + +bmc_sensor_read() +{ + temp_val=$(ipmitool raw 0x30 0x88 2>>/dev/null) + if [ $? -ne 0 ];then + return 1 + fi + + fan_val=$(ipmitool raw 0x30 0x22 2>>/dev/null) + if [ $? -ne 0 ];then + return 1 + fi + + return 0 +} + +#$1=get(0)/set(1), $2=ctrl_mode(1:manual, 0:auto) +#get rtn: ctrl_mode_val, fan_pwm_val +bmc_fan_speed_ctrl() +{ + if [ -e /sys/bus/i2c/devices/0-0044/pwm ];then + if [ $1 -eq 1 ];then + #Set Fan Speed Control + if [ $2 -eq 0 ];then + ipmitool raw 0x30 0x21 0x0 0x0 1>/dev/null 2>/dev/null + else + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0044/pwm | awk '{printf $1}') + fan_pwm_input=$( printf "%d" 0x$fan_pwm_input ) + ipmitool raw 0x30 0x21 0x1 $fan_pwm_input 1>/dev/null 2>/dev/null + fi + else + #Get Fan Speed Control + ctrl_mode_val=$(echo $fan_val | awk '{printf $1}') + fan_pwm_val=$(echo $fan_val | awk '{printf $2}') + byte_hex_test $ctrl_mode_val + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $fan_pwm_val + if [ $? -eq 0 ]; then + return + fi + ctrl_mode_val=$( printf "%d" 0x$ctrl_mode_val ) + fan_pwm_val=$( printf "%d" 0x$fan_pwm_val ) + echo $fan_pwm_val > /sys/bus/i2c/devices/0-0044/pwm + fi + fi +} + +bmc_fan_presence() +{ + if [ -e /sys/bus/i2c/devices/0-0044/fan1_present ];then + for i in $(seq 0 6); + do + p=$((31+i)) + fan_pre_val=$(echo $fan_val | awk '{print $'"$p"'}') + byte_hex_test $fan_pre_val + if [ $? -eq 0 ]; then + return + fi + fan_pre_val=$( printf "%d" 0x$fan_pre_val ) + echo $fan_pre_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_present + done + fi +} + +bmc_fan_speed_rpm() +{ + if [ -e /sys/bus/i2c/devices/0-0044/fan1_input ];then + for i in $(seq 0 6); + do + p1=$((3+i*2)) + p2=$((4+i*2)) + p3=$((17+i*2)) + p4=$((18+i*2)) + + #front + hi_byte=$(echo $fan_val | awk '{print $'"$p1"'}') + lo_byte=$(echo $fan_val | awk '{print $'"$p2"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return + fi + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+1))_input + + #rear + hi_byte=$(echo $fan_val | awk '{print $'"$p3"'}') + lo_byte=$(echo $fan_val | awk '{print $'"$p4"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return + fi + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0044/fan$((i+8))_input + done + fi +} + +do_fan_update() +{ + #fan presence + bmc_fan_presence + + #fan speed rpm + bmc_fan_speed_rpm + + if [ $debug_flag -eq 0 ];then + #Get Fan RPM + bmc_fan_speed_ctrl 0 + else + bmc_fan_speed_ctrl 1 1 + fi +} + +do_thermal_update() +{ + if [ -e /sys/bus/i2c/devices/0-004f/temp1_input ];then + + local check_val=0 + #command return check + for i in $(seq 8 7 57); do + thermal_val=$(echo $temp_val | awk '{print $'"$i"'}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + check_val=$((check_val + thermal_val)) + if [ $check_val -gt 0 ]; then + break + fi + done + + if [ $check_val -eq 0 ]; then + return + fi + + #mcp3425 + thermal_val=$(echo $temp_val | awk '{printf $8}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $15}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $22}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $29}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $36}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $43}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $50}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_input + + thermal_val=$(echo $temp_val | awk '{printf $57}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + # fan tmp75 should be 0x49, but conflict + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_input + fi +} + +do_thermal_threshold_init() +{ + if [ $init_threshold -eq 0 ]; then + if [ -e /sys/bus/i2c/devices/0-004f/temp1_max ];then + #mcp3425 + thermal_val=$(echo $temp_val | awk '{printf $13}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $14}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0068/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $20}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $21}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $27}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $28}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $34}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $35}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $41}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $42}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $48}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $49}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $55}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $56}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0048/temp1_crit + + thermal_val=$(echo $temp_val | awk '{printf $62}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_max + thermal_val=$(echo $temp_val | awk '{printf $63}') + byte_hex_test $thermal_val + if [ $? -eq 0 ]; then + return + fi + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_crit + + init_threshold=1 + fi + fi +} + +FAN_Thermal_monitor() +{ + if [ $debug_flag -eq 1 ];then + fan_pwm_input=100 + echo $fan_pwm_input > /sys/bus/i2c/devices/0-0044/pwm + fi + + while true + do + #get bmc sensor value + bmc_sensor_read + if [ $? -eq 0 ];then + do_fan_update + do_thermal_update + do_thermal_threshold_init + fi + + sleep 1 + done +} + +FAN_Thermal_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor new file mode 100644 index 0000000000..c72d8e0498 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor @@ -0,0 +1,70 @@ +#!/bin/bash + +pre_loc_state=0 +loc=256 +sys=256 +fan=256 +psu=256 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +bmc_led_read() +{ + led_state=0 + val=$(ipmitool raw 0x30 0x25 0x00 0x60 0x1 0x81 2>>/dev/null) + res=$? + val=$(echo $val | awk '{printf $1}') + byte_hex_test $val + if [ $? -eq 0 ]; then + return 0 + fi + val=$( printf "%d" 0x$val ) + loc=$(($val & 0x3)) + sys=$((($val & 0xc) >> 2)) + fan=$((($val & 0x30) >> 4)) + psu=$((($val & 0xc0) >> 6)) + + return 1 +} + +bmc_led_write() +{ + ipmitool raw 0x30 0x42 $1 1>>/dev/null 2>>/dev/null +} + +LED_monitor() +{ + local loc_state=0 + + while true + do + if [ -e /sys/bus/i2c/devices/0-0030/sys_led ];then + loc_state=$(cat /sys/bus/i2c/devices/0-0030/loc_led | awk '{printf $1}') + if [ $loc_state -gt 1 ]; then + loc_state=1 + fi + if [ $loc_state != $pre_loc_state ]; then + bmc_led_write $loc_state + pre_loc_state=$loc_state + fi + + bmc_led_read + if [ $? -eq 1 ];then + echo $sys > /sys/bus/i2c/devices/0-0030/sys_led + echo $fan > /sys/bus/i2c/devices/0-0030/fan_led + echo $psu > /sys/bus/i2c/devices/0-0030/psu_led + fi + fi + + sleep 2 + done +} + +LED_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor new file mode 100644 index 0000000000..180456f6a8 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor @@ -0,0 +1,248 @@ +#!/bin/bash + +debug_flag=0 +val=0 +value=0 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +byte_read(){ + data=$(echo $val | awk '{print $'"$1"'}') + byte_hex_test $data + if [ $? -eq 0 ]; then + return 0 + fi + data=$(printf "%d" 0x$data) + value=$data + return 1 + +} +add_byte(){ + hi_byte=$(echo $val | awk '{print $'"$1"'}') + lo_byte=$(echo $val | awk '{print $'"$2"'}') + byte_hex_test $hi_byte + if [ $? -eq 0 ]; then + return 0 + fi + byte_hex_test $lo_byte + if [ $? -eq 0 ]; then + return 0 + fi + hi_byte=$(printf "%d" 0x$hi_byte) + lo_byte=$(printf "%d" 0x$lo_byte) + ((hi_byte <<= 8)) + value=$((($lo_byte+$hi_byte))) + return 1 +} +# string_read [start byte] [length] +string_read(){ + value="" + len=$(echo $val | awk '{print $'"$1"'}') + byte_hex_test $len + if [ $? -eq 0 ]; then + return 0 + fi + len=$(printf "%d" 0x$len) + s=$(($1 + 1)) + e=$(($1 + len - 1)) + for i in $(seq $s $e) + do + data=$(echo $val | awk '{print $'"$i"'}') + byte_hex_test $data + if [ $? -eq 0 ]; then + return 0 + fi + data=$(printf "%d" 0x$data) + if [ $data -ne 0 ];then + value=$value$(printf "$(printf '\\x%x' $data)") + else + data=0x20 + value=$value$(printf "$(printf '\\x%x' $data)") + fi + done + return 1 +} +#$1=dev_addr, $2=reg, $3=val +get_PSU_information() +{ + val=$(ipmitool raw 0x30 0x89 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-005a/vendor ] && [ -e /sys/bus/i2c/devices/0-0059/vendor ];then + #PSU1 Vin + add_byte 1 2 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/in1_input + fi + #PSU2 Vin + add_byte 3 4 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/in1_input + fi + #PSU 1 Vout + add_byte 5 6 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/in2_input + fi + #PSU 2 Vout + add_byte 7 8 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/in2_input + fi + #PSU 1 Iin + add_byte 9 10 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/curr1_input + fi + #PSU 2 Iin + add_byte 11 12 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/curr1_input + fi + #PSU 1 Iout + add_byte 13 14 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-005a/curr2_input + fi + #PSU 2 Iout + add_byte 15 16 + if [ $? -eq 1 ];then + value=$(($value * 10)) + echo $value > /sys/bus/i2c/devices/0-0059/curr2_input + fi + #PSU 1 Pin + add_byte 17 18 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-005a/power1_input + fi + #PSU 2 Pin + add_byte 19 20 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-0059/power1_input + fi + #PSU 1 Pout + add_byte 21 22 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-005a/power2_input + fi + #PSU 2 Pout + add_byte 23 24 + if [ $? -eq 1 ];then + value=$(($value * 1000000)) + echo $value > /sys/bus/i2c/devices/0-0059/power2_input + fi + #PSU 1 Temp1 + byte_read 25 + if [ $? -eq 1 ];then + value=$(($value * 1000)) + echo $value > /sys/bus/i2c/devices/0-005a/temp1_input + fi + #PSU 2 Temp1 + byte_read 26 + if [ $? -eq 1 ];then + value=$(($value * 1000)) + echo $value > /sys/bus/i2c/devices/0-0059/temp1_input + fi + + byte_read 31 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/present + fi + + byte_read 32 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/present + fi + + #PSU 1 2 PSU power good + byte_read 33 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/power_good + fi + + byte_read 34 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/power_good + fi + + add_byte 35 36 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/fault + fi + + add_byte 37 38 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/fault + fi + fi + + #____________________________________________________________________________ + + val=$(ipmitool raw 0x30 0x8a 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-005a/vendor ] && [ -e /sys/bus/i2c/devices/0-0059/vendor ];then + #PSU1 mfr_ID + string_read 1 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/vendor + fi + #PSU2 mfr_ID + string_read 21 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/vendor + fi + #PSU1 mfr_model + string_read 41 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/model + fi + #PSU2 mfr_model + string_read 61 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/model + fi + #PSU1 mfr_serial + string_read 81 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/sn + fi + #PSU1 mfr_serial + string_read 111 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/sn + fi + fi +} + +#$1=dev_addr, $2=reg, $3=len + +PSU_monitor() +{ + + while true + do + + get_PSU_information + if [ $debug_flag -eq 1 ];then + bmc_fan_speed_ctrl + fi + + sleep 1 + done +} + +PSU_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor new file mode 100644 index 0000000000..645b852885 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor @@ -0,0 +1,479 @@ +#!/bin/bash + +debug_flag=0 +port_map=('00' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '1a' '1b' '1c' '1d' '1e' '1f' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29' '2a' '2b' '2c' '2d' '2e' '2f') +port_1_8_presence=0 +port_9_16_presence=0 +port_17_24_presence=0 +port_25_32_presence=0 +port_1_8_reset=0 +port_9_16_reset=0 +port_17_24_reset=0 +port_25_32_reset=0 + +result=0 +pre_port_1_8_reset=256 +pre_port_9_16_reset=256 +pre_port_17_24_reset=256 +pre_port_25_32_reset=256 +pre_port_1_8_lpmode=256 +pre_port_9_16_lpmode=256 +pre_port_17_24_lpmode=256 +pre_port_25_32_lpmode=256 +pre_port_1_8_modsel=256 +pre_port_9_16_modsel=256 +pre_port_17_24_modsel=256 +pre_port_25_32_modsel=256 + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=val +bmc_write() +{ + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x85 $1 $2 $addr_8b 2 $4 $5 1>>/dev/null 2>>/dev/null + sleep 1 + ipmitool raw 0x30 0x87 1>>/dev/null 2>>/dev/null +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=len +bmc_read() +{ + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x86 $1 $2 $addr_8b $5 $4 1>>/dev/null 2>>/dev/null + sleep 1 + val=$(ipmitool raw 0x30 0x87 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + return 1 + else + return 0 + fi +} + +bmc_qsfp_lpmode_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 1)))) + done + if [ $val -ne $pre_port_1_8_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x50 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_lpmode=$val + fi + val=0 + for i in $(seq 9 16); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 9)))) + done + + if [ $val -ne $pre_port_9_16_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x51 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_lpmode=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 17)))) + done + + if [ $val -ne $pre_port_17_24_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x50 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_lpmode=$val + fi + val=0 + for i in $(seq 25 32); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val=$((val | (lpmode_input << ($i - 25)))) + done + + if [ $val -ne $pre_port_25_32_lpmode ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x51 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_lpmode=$val + fi + + + return 0 +} + +bmc_qsfp_modsel_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 1)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_1_8_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x60 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_modsel=$val + fi + val=0 + for i in $(seq 9 16); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 9)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_9_16_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x61 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_modsel=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 17)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_17_24_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x60 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_modsel=$val + fi + val=0 + for i in $(seq 25 32); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val=$((val | (modsel_input << ($i - 25)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_25_32_modsel ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x61 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_modsel=$val + fi + + + return 0 +} + +bmc_qsfp_presence_read() +{ + a=0 + tmp1=$(ipmitool raw 0x30 0x25 0x00 0x0c 0x1 0x30 2>>/dev/null) + a=$((a+$?)) + tmp1=$(echo $tmp1 | awk '{printf $1}') + sleep 0.05 + tmp2=$(ipmitool raw 0x30 0x25 0x00 0x0c 0x1 0x31 2>>/dev/null) + a=$((a+$?)) + tmp2=$(echo $tmp2 | awk '{printf $1}') + sleep 0.05 + tmp3=$(ipmitool raw 0x30 0x25 0x00 0x0e 0x1 0x30 2>>/dev/null) + a=$((a+$?)) + tmp3=$(echo $tmp3 | awk '{printf $1}') + sleep 0.05 + tmp4=$(ipmitool raw 0x30 0x25 0x00 0x0e 0x1 0x31 2>>/dev/null) + a=$((a+$?)) + tmp4=$(echo $tmp4 | awk '{printf $1}') + sleep 0.05 + if [ $a -eq 0 ];then + byte_hex_test $tmp1 + if [ $? -eq 0 ]; then + return 0 + fi + port_1_8_presence=$( printf "%d" 0x$tmp1 ) + byte_hex_test $tmp2 + if [ $? -eq 0 ]; then + return 0 + fi + port_9_16_presence=$( printf "%d" 0x$tmp2 ) + byte_hex_test $tmp3 + if [ $? -eq 0 ]; then + return 0 + fi + port_17_24_presence=$( printf "%d" 0x$tmp3 ) + byte_hex_test $tmp4 + if [ $? -eq 0 ]; then + return 0 + fi + port_25_32_presence=$( printf "%d" 0x$tmp4 ) + return 1 + fi + + return 0 +} + +bmc_qsfp_reset_write() +{ + + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 1)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_1_8_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x20 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_1_8_reset=$val + fi + val=0 + for i in $(seq 9 16); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 9)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_9_16_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0c 0x0 0x21 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_9_16_reset=$val + fi + + cpld_path="/sys/bus/i2c/devices/0-0007/" + val=0 + for i in $(seq 17 24); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 17)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_17_24_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x20 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_17_24_reset=$val + fi + val=0 + for i in $(seq 25 32); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 25)))) + done + + val=$((0xff - val)) + if [ $val -ne $pre_port_25_32_reset ]; then + ipmitool raw 0x30 0x25 0x00 0x0e 0x0 0x21 $val 1>>/dev/null 2>>/dev/null + sleep 0.05 + pre_port_25_32_reset=$val + fi + + + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_read() +{ + local port=$1 + local eeprom_part1 + local eeprom_part2 + local eeprom_part3 + local eeprom_part4 + local eeprom1_full + local eeprom2_full + + port=`expr $port - 1` + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + 2` + ch=`expr $port % 8` + + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x00 + bmc_read $i2cmux_dev $ch 0x50 0 128 + if [ $? -eq 1 ];then + eeprom_part1=$result + else + return 1 + fi + + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part2=$result + else + return 1 + fi + + #QSFP-DD page2 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x02 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part3=$result + else + return 1 + fi + + #QSFP-DD page11 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x11 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part4=$result + else + return 1 + fi + + sfp_type=$(echo $eeprom_part1 | awk '{printf $1}') + byte_hex_test $sfp_type + if [ $? -eq 0 ]; then + return + fi + sfp_type=$( printf "%d" 0x$sfp_type ) + + #get temperature + temp=$(echo $eeprom_part1 | awk '{printf $15}') + if [ $temp != "" ];then + temp=$( printf "%d" 0x$temp ) + temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp" + echo $temp > $temp_path + fi + + #get lp_mode + lpmod_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/lp_mode" + if [ $sfp_type -eq 24 ];then + lpmod=$(echo $eeprom_part1 | awk '{printf $27}') + if [ $lpmod != "" ];then + state=$((lpmod&0x10)) + if [ $state -eq 16 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + elif [ $sfp_type -eq 17 ];then + lpmod=$(echo $eeprom_part1 | awk '{printf $93}') + if [ $lpmod != "" ];then + state=$((lpmod&0x02)) + if [ $state -eq 2 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + else + lpmod="" + fi + + eeprom1_full=$eeprom_part1$eeprom_part2 + eeprom1_full=$(echo $eeprom1_full | sed 's/[[:space:]]//g') + eeprom2_full=$eeprom_part3$eeprom_part4 + eeprom2_full=$(echo $eeprom2_full | sed 's/[[:space:]]//g') + + if [ $debug_flag -eq 0 ];then + eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1" + eeprom1_full=$(echo $eeprom1_full | sed -e 's/ //g') + echo $eeprom1_full > $eeprom1_path + eeprom2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom2" + eeprom2_full=$(echo $eeprom2_full | sed -e 's/ //g') + echo $eeprom2_full > $eeprom2_path + else + printf "\nPort %d EEPROM:" $1 + printf "-----------------------------------------------\n" + for i in $(seq 1 256); + do + printf "%s " ${eeprom1_full:0:2} + eeprom1_full=$(echo $eeprom1_full | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + fi + + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_clear() +{ + eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1" + echo "" > $eeprom1_path + eeprom2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom2" + echo "" > $eeprom2_path +} + +QSFP_monitor() +{ + while true + do + if [ -e /sys/bus/i2c/devices/0-0006/port1_present ] && [ -e /sys/bus/i2c/devices/0-0007/port32_present ] && [ -e /sys/bus/i2c/devices/0-002f/eeprom1 ];then + bmc_qsfp_presence_read + mod_presence=$((port_25_32_presence<<8)) + mod_presence=`expr $mod_presence + $port_17_24_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_9_16_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_1_8_presence` + + bmc_qsfp_lpmode_write + bmc_qsfp_modsel_write + bmc_qsfp_reset_write + + for i in $(seq 1 32); + do + idx=`expr $i - 1` + check_bit=$((1<<$idx)) + is_presence=$(($mod_presence & $check_bit)) + if [ $i -le 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0006/" + else + cpld_path="/sys/bus/i2c/devices/0-0007/" + fi + + if [ $is_presence -eq 0 ];then + echo 1 > $cpld_path"port"$i"_present" + bmc_qsfp_eeprom_read $i + else + echo 0 > $cpld_path"port"$i"_present" + bmc_qsfp_eeprom_clear $i + fi + done + sleep 2 + else + sleep 1 + fi + done +} + +QSFP_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py new file mode 100644 index 0000000000..030942825d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py @@ -0,0 +1,482 @@ +#!/usr/bin/env python + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes + show : show all systen status + sff : dump SFP eeprom +""" + +import sys, getopt +import subprocess +import logging +import re +import time + +PROJECT_NAME = '6512-32r' +version = '0.0.1' +verbose = False +DEBUG = False +args = [] +ALL_DEVICE = {} +DEVICE_NO = {'led':4, 'fan':7, 'thermal':8, 'psu':2, 'qsfp':32} + +led_prefix ='/sys/devices/platform/wistron_led/leds/wistron_led::' +hwmon_types = {'led': ['sys_led','fan_led','loc_led','psu_led']} +hwmon_nodes = {'led': ['brightness']} +hwmon_prefix ={'led': led_prefix} + +i2c_prefix = '/sys/bus/i2c/devices/' + +i2c_bus = {'fan': ['0-0044'], + 'thermal': ['0-0068', '0-0049','0-004a','0-004b','0-004c','0-004d','0-0048','0-004f'], + 'psu': ['0-005a','0-0059'], + 'qsfp': ['0-0010']} + +i2c_nodes = {'fan': ['front_speed_rpm', 'rear_speed_rpm'], + 'thermal': ['temp1_input'], + 'psu': ['present', 'power_good'], + 'qsfp': ['module_present_']} + +sfp_map = ['10', '11', '12', '13', '14', '15', '16', '17', + '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', + '20', '21', '22', '23', '24', '25', '26', '27', + '28', '29', '2a', '2b', '2c', '2d', '2e', '2f'] + +mknod =[ +'echo wistron_fpga 0x30 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_cpld1 0x6 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_cpld2 0x7 > /sys/bus/i2c/devices/i2c-0/new_device', +# FAN +'echo wistron_fan 0x44 > /sys/bus/i2c/devices/i2c-0/new_device', +# Thermal +'echo wistron_thermal 0x68 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x49 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4b > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4c > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4d > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x48 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_thermal 0x4f > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU +'echo wistron_psu1 0x5a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo wistron_psu2 0x59 > /sys/bus/i2c/devices/i2c-0/new_device', +# EEPROM +'echo wistron_syseeprom 0x55 > /sys/bus/i2c/devices/i2c-0/new_device', +] + +FORCE = 0 +logging.basicConfig(filename= PROJECT_NAME+'.log', filemode='w',level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) + +if DEBUG == True: + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) + +def main(): + global DEBUG + global args + global FORCE + + logging.basicConfig(level=logging.INFO) + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print(options) + print(args) + print(len(sys.argv)) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + do_install() + elif arg == 'clean': + do_uninstall() + elif arg == 'show': + device_traversal() + elif arg == 'sff': + if len(args)!=2: + show_eeprom_help() + elif int(args[1]) > DEVICE_NO['qsfp'] -1: + show_eeprom_help() + else: + show_eeprom(args[1]) + return + else: + show_help() + + + return 0 + +def show_help(): + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) + sys.exit(0) + +def show_eeprom_help(): + cmd = sys.argv[0].split("/")[-1]+ " " + args[0] + print(" use \""+ cmd + " 1-32 \" to dump sfp# eeprom") + sys.exit(0) + +def my_log(txt): + if DEBUG == True: + print("[WISTRON DBG]: "+txt) + return + +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + output = "" + status, output = subprocess.getstatusoutput(cmd) + my_log (cmd +"with result:" + str(status)) + my_log ("cmd:" + cmd) + my_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +def driver_inserted(): + ret, lsmod = log_os_system("lsmod | grep wistron", 0) + if ret != 0: + return False + logging.info('mods:'+lsmod) + if len(lsmod) ==0: + return False + + +kos = [ +'modprobe ipmi_msghandler', +'modprobe ipmi_si', +'modprobe ipmi_devintf', +'modprobe ipmi_watchdog', +'modprobe i2c_dev', +'modprobe at24', +'modprobe wistron_6512_32r_syseeprom', +'modprobe wistron_6512_32r_cpld', +'modprobe wistron_6512_32r_fan', +'modprobe wistron_6512_32r_leds', +'modprobe wistron_6512_32r_psu', +'modprobe wistron_6512_32r_oom', +'modprobe wistron_6512_32r_thermal'] + +kos_wdt = [ +'modprobe iTCO_wdt', + ] + +def driver_install(): + global FORCE + log_os_system("depmod", 1) + + for i in range(0,len(kos_wdt)): + rm = kos_wdt[i].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + + for i in range(0,len(kos)): + status, output = log_os_system(kos[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + return 0 + +def driver_uninstall(): + global FORCE + for i in range(0,len(kos)): + rm = kos[-(i+1)].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + + for i in range(0,len(kos_wdt)): + status, output = log_os_system(kos_wdt[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + + return 0 + +def device_install(): + global FORCE + for i in range(0,len(mknod)): + print("init i2c device instance") + status, output = log_os_system(mknod[i], 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output = log_os_system("echo wistron_oom 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/new_device", 1) + if status: + print(output) + if FORCE == 0: + return status + +# for i in range(0,len(sfp_map)): +# status, output =log_os_system("echo port"+str(i+1)+" > /sys/bus/i2c/devices/0-00"+sfp_map[i]+"/port_name", 1) +# if status: +# print output +# if FORCE == 0: +# return status + + for i in range(0,DEVICE_NO['qsfp']): + if i < 16: + status, output =log_os_system("echo 1 > /sys/bus/i2c/devices/0-0006/port"+ str(i+1) + "_modsel", 1) + if status: + print(output) + if FORCE == 0: + return status + else: + status, output =log_os_system("echo 1 > /sys/bus/i2c/devices/0-0007/port"+ str(i+1) + "_modsel", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def device_uninstall(): + global FORCE + + for i in range(0,len(sfp_map)): + target = "echo 0x"+sfp_map[i]+ " > /sys/bus/i2c/devices/i2c-0/delete_device" + print(target) + status, output =log_os_system(target, 1) + if status: + print(output) + if FORCE == 0: + return status + + nodelist = mknod + + for i in range(len(nodelist)): + target = nodelist[-(i+1)] + temp = target.split() + del temp[1] + temp[-1] = temp[-1].replace('new_device', 'delete_device') + status, output = log_os_system(" ".join(temp), 1) + if status: + print(output) + if FORCE == 0: + return status + + return + +def system_ready(): + if driver_inserted() == False: + return False + if not device_exist(): + print("not device_exist()") + return False + return True + +def do_install(): + if driver_inserted() == False: + status = driver_install() + time.sleep(1) + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" drivers detected....") + + if not device_exist(): + status = device_install() + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" devices detected....") + + status, output = log_os_system( + "/bin/sh /usr/local/bin/platform_api_mgnt.sh init", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def do_uninstall(): + if not device_exist(): + print(PROJECT_NAME.upper() +" has no device installed....") + else: + print("Removing device....") + status = device_uninstall() + if status: + if FORCE == 0: + return status + + if driver_inserted()== False : + print(PROJECT_NAME.upper() +" has no driver installed....") + else: + print("Removing installed driver....") + status = driver_uninstall() + if status: + if FORCE == 0: + return status + + return + +def devices_info(): + global DEVICE_NO + global ALL_DEVICE + global i2c_bus, hwmon_types + for key in DEVICE_NO: + ALL_DEVICE[key]= {} + for i in range(0,DEVICE_NO[key]): + ALL_DEVICE[key][key+str(i+1)] = [] + + for key in i2c_bus: + buses = i2c_bus[key] + nodes = i2c_nodes[key] + for i in range(0,len(buses)): + for j in range(0,len(nodes)): + if 'fan' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + path = i2c_prefix+ buses[i]+"/fan"+str(k+1) if j == 0 else str(k+8) +"_input" + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + elif 'qsfp' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + if k < 16: + path = i2c_prefix+"0-0006/"+ "port"+ str(k+1) + "_present" + else: + path = i2c_prefix+"0-0007/"+ "port"+ str(k+1) + "_present" + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + else: + node = key+str(i+1) + path = i2c_prefix+ buses[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + + for key in hwmon_types: + itypes = hwmon_types[key] + nodes = hwmon_nodes[key] + for i in range(0,len(itypes)): + for j in range(0,len(nodes)): + node = key+"_"+itypes[i] + path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][ key+str(i+1)].append(path) + + #show dict all in the order + if DEBUG == True: + for i in sorted(ALL_DEVICE.keys()): + print(i+": ") + for j in sorted(ALL_DEVICE[i].keys()): + print(" "+j) + for k in (ALL_DEVICE[i][j]): + print(" "+" "+k) + return + +def show_eeprom(index): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + node= "/sys/bus/i2c/devices/0-00"+sfp_map[int(index)-1]+"/eeprom1" + # check if got hexdump command in current environment + ret, log = log_os_system("which hexdump", 0) + ret, log2 = log_os_system("which busybox hexdump", 0) + if len(log): + hex_cmd = 'hexdump' + elif len(log2): + hex_cmd = ' busybox hexdump' + else: + log = 'Failed : no hexdump cmd!!' + logging.info(log) + print(log) + return 1 + + print("node=%s"%node) + ret, log = log_os_system(hex_cmd+" -C " + node, 1) + if ret==0: + print(log) + else: + print("**********device no found**********") + return + +#get digits inside a string. +#Ex: 31 for "sfp31" +def get_value(input): + digit = re.findall('\d+', input) + return int(digit[0]) + +def device_traversal(): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + if len(ALL_DEVICE)==0: + devices_info() + for i in sorted(ALL_DEVICE.keys()): + print("============================================") + print(i.upper()+": ") + print("============================================") + + for j in sorted(ALL_DEVICE[i].keys(), key=get_value): + print(" "+j+":",) + for k in (ALL_DEVICE[i][j]): + ret, log = log_os_system("cat "+k, 0) + func = k.split("/")[-1].strip() + func = re.sub(j+'_','',func,1) + func = re.sub(i.lower()+'_','',func,1) + if ret==0: + print(func+"="+log+" ",) + else: + print(func+"="+"X"+" ",) + print() + print("----------------------------------------------------------------") + + + print() + return + +def device_exist(): + ret1, log = log_os_system("ls "+i2c_prefix+"*0030", 0) + ret2, log = log_os_system("ls "+i2c_prefix+"i2c-0", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main() diff --git a/platform/innovium/sonic-platform-modules-wistron/LICENSE b/platform/innovium/sonic-platform-modules-wistron/LICENSE new file mode 100644 index 0000000000..c14238424a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/LICENSE @@ -0,0 +1,16 @@ +Copyright (C) 2016 Microsoft, Inc +Copyright (C) 2019 Wistron Corporation + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf new file mode 100644 index 0000000000..9c1102dfad --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/cfg/sw-to3200k-modules.conf @@ -0,0 +1,18 @@ +# /etc/modules: kernel modules to load at boot time. +# +# This file contains the names of kernel modules that should be loaded +# at boot time, one per line. Lines beginning with "#" are ignored. + +ipmi_msghandler +ipmi_si +ipmi_devintf +i2c_dev +at24 +wistron_i2c_psu +wistron_sw_to3200k_cpld +wistron_sw_to3200k_fan +wistron_sw_to3200k_leds +wistron_sw_to3200k_psu +wistron_sw_to3200k_oom +wistron_sw_to3200k_thermal + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/classes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile new file mode 100644 index 0000000000..1856dc1691 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/Makefile @@ -0,0 +1,20 @@ +ifneq ($(KERNELRELEASE),) +obj-m:= wistron_sw_to3200k_cpld.o wistron_sw_to3200k_fan.o \ + wistron_sw_to3200k_oom.o wistron_sw_to3200k_psu.o \ + wistron_sw_to3200k_thermal.o wistron_i2c_psu.o \ + wistron_sw_to3200k_leds.o +else +ifeq (,$(KERNEL_SRC)) +#$(error KERNEL_SRC is not defined) +KVERSION=3.16.0-8-amd64 +KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/ +KERNELDIR:=$(KERNEL_DIR) +else +KERNELDIR:=$(KERNEL_SRC) +endif +PWD:=$(shell pwd) +default: + $(MAKE) -C $(KERNELDIR) M=$(PWD) modules +clean: + rm -rf *.o *.mod.o *.mod.o *.ko .*cmd *.mod.c *.mod .tmp_versions Module.markers Module.symvers modules.order +endif diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c new file mode 100644 index 0000000000..746e581486 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_i2c_psu.c @@ -0,0 +1,469 @@ +/* + * An hwmon driver for the Wistron Redundant Power Module + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRIVER_DESCRIPTION_NAME "wistron i2c psu driver" +#define MAX_FAN_DUTY_CYCLE 100 + +/* Addresses scanned + */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data + */ +struct wistron_i2c_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int v_in; + int v_out; + int i_in; + int i_out; + int p_in; + int p_out; + int temp_input; + int fan_fault; + int fan_duty_cycle; + int fan_speed; + int pmbus_revision; + u8 mfr_id[16]; + u8 mfr_model[16]; + u8 mfr_revsion[4]; + u8 mfr_serial[32]; +}; + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum wistron_i2c_psu_sysfs_attributes { + PSU_V_IN, + PSU_V_OUT, + PSU_I_IN, + PSU_I_OUT, + PSU_P_IN, + PSU_P_OUT, + PSU_PMBUS_REVISION, + PSU_TEMP1_INPUT, + PSU_FAN1_FAULT, + PSU_FAN1_DUTY_CYCLE, + PSU_FAN1_SPEED, + PSU_MFR_ID, + PSU_MFR_MODEL, + PSU_MFR_REVISION, + PSU_MFR_SERIAL, +}; + +/* sysfs attributes for hwmon + */ +static SENSOR_DEVICE_ATTR(psu_v_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_IN); +static SENSOR_DEVICE_ATTR(psu_v_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(psu_i_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_IN); +static SENSOR_DEVICE_ATTR(psu_i_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(psu_p_in, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_IN); +static SENSOR_DEVICE_ATTR(psu_p_out, S_IWUSR | S_IRUGO, get_value, set_value, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(psu_pmbus_revision, S_IWUSR | S_IRUGO, get_value, set_value, PSU_PMBUS_REVISION); +static SENSOR_DEVICE_ATTR(psu_temp1_input, S_IWUSR | S_IRUGO, get_value, set_value, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(psu_fan1_fault, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_FAULT); +static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_DUTY_CYCLE); +static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IWUSR | S_IRUGO, get_value, set_value, PSU_FAN1_SPEED); +static SENSOR_DEVICE_ATTR(psu_mfr_id, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_ID); +static SENSOR_DEVICE_ATTR(psu_mfr_model, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_MODEL); +static SENSOR_DEVICE_ATTR(psu_mfr_revision, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_REVISION); +static SENSOR_DEVICE_ATTR(psu_mfr_serial, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_SERIAL); + +/*Duplicate nodes for lm-sensors.*/ +static SENSOR_DEVICE_ATTR(in3_input, S_IRUGO, get_value, NULL, PSU_V_OUT); +static SENSOR_DEVICE_ATTR(curr2_input, S_IRUGO, get_value, NULL, PSU_I_OUT); +static SENSOR_DEVICE_ATTR(power2_input, S_IRUGO, get_value, NULL, PSU_P_OUT); +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, get_value, NULL, PSU_TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_value, NULL, PSU_FAN1_SPEED); + +static struct attribute *wistron_i2c_psu_attributes[] = { + &sensor_dev_attr_psu_v_in.dev_attr.attr, + &sensor_dev_attr_psu_v_out.dev_attr.attr, + &sensor_dev_attr_psu_i_in.dev_attr.attr, + &sensor_dev_attr_psu_i_out.dev_attr.attr, + &sensor_dev_attr_psu_p_in.dev_attr.attr, + &sensor_dev_attr_psu_p_out.dev_attr.attr, + &sensor_dev_attr_psu_pmbus_revision.dev_attr.attr, + &sensor_dev_attr_psu_temp1_input.dev_attr.attr, + &sensor_dev_attr_psu_fan1_fault.dev_attr.attr, + &sensor_dev_attr_psu_fan1_duty_cycle.dev_attr.attr, + &sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr, + &sensor_dev_attr_psu_mfr_id.dev_attr.attr, + &sensor_dev_attr_psu_mfr_model.dev_attr.attr, + &sensor_dev_attr_psu_mfr_revision.dev_attr.attr, + &sensor_dev_attr_psu_mfr_serial.dev_attr.attr, + /*Duplicate nodes for lm-sensors.*/ + &sensor_dev_attr_curr2_input.dev_attr.attr, + &sensor_dev_attr_in3_input.dev_attr.attr, + &sensor_dev_attr_power2_input.dev_attr.attr, + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_fan1_input.dev_attr.attr, + NULL +}; + +static ssize_t get_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + size_t ret_count=0; + + mutex_lock(&data->lock); + switch (attr->index) + { + case PSU_V_IN: + { + ret_count = sprintf(buf, "%d", data->v_in); + break; + } + case PSU_V_OUT: + { + ret_count = sprintf(buf, "%d", data->v_out); + break; + } + case PSU_I_IN: + { + ret_count = sprintf(buf, "%d", data->i_in); + break; + } + case PSU_I_OUT: + { + ret_count = sprintf(buf, "%d", data->i_out); + break; + } + case PSU_P_IN: + { + ret_count = sprintf(buf, "%d", data->p_in); + break; + } + case PSU_P_OUT: + { + ret_count = sprintf(buf, "%d", data->p_out); + break; + } + case PSU_PMBUS_REVISION: + { + ret_count = sprintf(buf, "%d", data->pmbus_revision); + break; + } + case PSU_TEMP1_INPUT: + { + ret_count = sprintf(buf, "%d", data->temp_input); + break; + } + case PSU_FAN1_FAULT: + { + ret_count = sprintf(buf, "%d", data->fan_fault); + break; + } + case PSU_FAN1_DUTY_CYCLE: + { + ret_count = sprintf(buf, "%d", data->fan_duty_cycle); + break; + } + case PSU_FAN1_SPEED: + { + ret_count = sprintf(buf, "%d", data->fan_speed); + break; + } + case PSU_MFR_ID: + { + ret_count = sprintf(buf, "%s", data->mfr_id); + break; + } + case PSU_MFR_MODEL: + { + ret_count = sprintf(buf, "%s", data->mfr_model); + break; + } + case PSU_MFR_REVISION: + { + ret_count = sprintf(buf, "%s", data->mfr_revsion); + break; + } + case PSU_MFR_SERIAL: + { + ret_count = sprintf(buf, "%s", data->mfr_serial); + break; + } + default: + break; + } + mutex_unlock(&data->lock); + return ret_count; +} + +static ssize_t set_value +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + int error, value; + + mutex_lock(&data->lock); + + switch (attr->index) + { + case PSU_V_IN: + { + error = kstrtoint(buf, 10, &data->v_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_V_OUT: + { + error = kstrtoint(buf, 10, &data->v_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_I_IN: + { + error = kstrtoint(buf, 10, &data->i_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_I_OUT: + { + error = kstrtoint(buf, 10, &data->i_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_P_IN: + { + error = kstrtoint(buf, 10, &data->p_in); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_P_OUT: + { + error = kstrtoint(buf, 10, &data->p_out); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_PMBUS_REVISION: + { + error = kstrtoint(buf, 10, &data->pmbus_revision); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_TEMP1_INPUT: + { + error = kstrtoint(buf, 10, &data->temp_input); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_FAN1_FAULT: + { + error = kstrtoint(buf, 10, &data->fan_fault); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_FAN1_DUTY_CYCLE: + { + error = kstrtoint(buf, 10, &value); + if (error) + { + goto exit_err; + } + + if (value < 0 || value > MAX_FAN_DUTY_CYCLE) + { + error = -EINVAL; + goto exit_err; + } + + data->fan_duty_cycle = value; + break; + } + case PSU_FAN1_SPEED: + { + error = kstrtoint(buf, 10, &data->fan_speed); + if (error) + { + goto exit_err; + } + + break; + } + case PSU_MFR_ID: + { + memset(&data->mfr_id, 0x0, sizeof(data->mfr_id)); + strncpy(data->mfr_id, buf, sizeof(data->mfr_id)-1); + break; + } + case PSU_MFR_MODEL: + { + memset(&data->mfr_model, 0x0, sizeof(data->mfr_model)); + strncpy(data->mfr_model, buf, sizeof(data->mfr_model)-1); + break; + } + case PSU_MFR_REVISION: + { + memset(&data->mfr_revsion, 0x0, sizeof(data->mfr_revsion)); + strncpy(data->mfr_revsion, buf, sizeof(data->mfr_revsion)-1); + break; + } + case PSU_MFR_SERIAL: + { + memset(&data->mfr_serial, 0x0, sizeof(data->mfr_serial)); + strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial)-1); + break; + } + default: + break; + } + + mutex_unlock(&data->lock); + return count; + +exit_err: + mutex_unlock(&data->lock); + return error; +} + +static const struct attribute_group wistron_i2c_psu_group = { + .attrs = wistron_i2c_psu_attributes, +}; + +static int wistron_i2c_psu_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct wistron_i2c_psu_data *data; + int status; + + data = kzalloc(sizeof(struct wistron_i2c_psu_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &wistron_i2c_psu_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &wistron_i2c_psu_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int wistron_i2c_psu_remove(struct i2c_client *client) +{ + struct wistron_i2c_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &wistron_i2c_psu_group); + kfree(data); + return 0; +} + +/* Support psu moduel + */ +static const struct i2c_device_id wistron_i2c_psu_id[] = { + { "acbel_fshxxx", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, wistron_i2c_psu_id); + +static struct i2c_driver wistron_i2c_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "wistron_i2c_psu", + }, + .probe = wistron_i2c_psu_probe, + .remove = wistron_i2c_psu_remove, + .id_table = wistron_i2c_psu_id, + .address_list = normal_i2c, +}; + +static int __init wistron_i2c_psu_init(void) +{ + return i2c_add_driver(&wistron_i2c_psu_driver); +} + +static void __exit wistron_i2c_psu_exit(void) +{ + i2c_del_driver(&wistron_i2c_psu_driver); +} + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION(DRIVER_DESCRIPTION_NAME); +MODULE_LICENSE("GPL"); + +module_init(wistron_i2c_psu_init); +module_exit(wistron_i2c_psu_exit); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c new file mode 100644 index 0000000000..52f659eae2 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_cpld.c @@ -0,0 +1,701 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PORT_NUM 32 +#define SYSLED_NUM 5 +#define SW_TO3200K_FPGA_ADDR 0x60 + +static LIST_HEAD(cpld_client_list); +static struct mutex list_lock; + +struct cpld_client_node { + struct i2c_client *client; + struct list_head list; +}; + +enum cpld_type { + sw_to3200k_fpga, + sw_to3200k_cpld1, + sw_to3200k_cpld2 +}; + +struct sw_to3200k_cpld_data { + enum cpld_type type; + struct device *hwmon_dev; + struct mutex lock; + int version; + int sysled_status[SYSLED_NUM]; + int present[PORT_NUM]; + int reset[PORT_NUM]; +}; + +static const struct i2c_device_id sw_to3200k_cpld_id[] = { + { "sw_to3200k_fpga", sw_to3200k_fpga }, + { "sw_to3200k_cpld1", sw_to3200k_cpld1 }, + { "sw_to3200k_cpld2", sw_to3200k_cpld2 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_cpld_id); + +#define TRANSCEIVER_PRESENT_ATTR_ID(index) MODULE_PRESENT_##index +#define TRANSCEIVER_RESET_ATTR_ID(index) MODULE_RESET_##index + +enum sw_to3200k_cpld_sysfs_attributes { + /* chip version */ + CPLD_VERSION, + /* system led */ + SYSTEM_LED_LOC, + SYSTEM_LED_DIAG, + SYSTEM_LED_FAN, + SYSTEM_LED_PSU1, + SYSTEM_LED_PSU2, + /* transceiver attributes */ + TRANSCEIVER_PRESENT_ATTR_ID(1), + TRANSCEIVER_PRESENT_ATTR_ID(2), + TRANSCEIVER_PRESENT_ATTR_ID(3), + TRANSCEIVER_PRESENT_ATTR_ID(4), + TRANSCEIVER_PRESENT_ATTR_ID(5), + TRANSCEIVER_PRESENT_ATTR_ID(6), + TRANSCEIVER_PRESENT_ATTR_ID(7), + TRANSCEIVER_PRESENT_ATTR_ID(8), + TRANSCEIVER_PRESENT_ATTR_ID(9), + TRANSCEIVER_PRESENT_ATTR_ID(10), + TRANSCEIVER_PRESENT_ATTR_ID(11), + TRANSCEIVER_PRESENT_ATTR_ID(12), + TRANSCEIVER_PRESENT_ATTR_ID(13), + TRANSCEIVER_PRESENT_ATTR_ID(14), + TRANSCEIVER_PRESENT_ATTR_ID(15), + TRANSCEIVER_PRESENT_ATTR_ID(16), + TRANSCEIVER_PRESENT_ATTR_ID(17), + TRANSCEIVER_PRESENT_ATTR_ID(18), + TRANSCEIVER_PRESENT_ATTR_ID(19), + TRANSCEIVER_PRESENT_ATTR_ID(20), + TRANSCEIVER_PRESENT_ATTR_ID(21), + TRANSCEIVER_PRESENT_ATTR_ID(22), + TRANSCEIVER_PRESENT_ATTR_ID(23), + TRANSCEIVER_PRESENT_ATTR_ID(24), + TRANSCEIVER_PRESENT_ATTR_ID(25), + TRANSCEIVER_PRESENT_ATTR_ID(26), + TRANSCEIVER_PRESENT_ATTR_ID(27), + TRANSCEIVER_PRESENT_ATTR_ID(28), + TRANSCEIVER_PRESENT_ATTR_ID(29), + TRANSCEIVER_PRESENT_ATTR_ID(30), + TRANSCEIVER_PRESENT_ATTR_ID(31), + TRANSCEIVER_PRESENT_ATTR_ID(32), + TRANSCEIVER_RESET_ATTR_ID(1), + TRANSCEIVER_RESET_ATTR_ID(2), + TRANSCEIVER_RESET_ATTR_ID(3), + TRANSCEIVER_RESET_ATTR_ID(4), + TRANSCEIVER_RESET_ATTR_ID(5), + TRANSCEIVER_RESET_ATTR_ID(6), + TRANSCEIVER_RESET_ATTR_ID(7), + TRANSCEIVER_RESET_ATTR_ID(8), + TRANSCEIVER_RESET_ATTR_ID(9), + TRANSCEIVER_RESET_ATTR_ID(10), + TRANSCEIVER_RESET_ATTR_ID(11), + TRANSCEIVER_RESET_ATTR_ID(12), + TRANSCEIVER_RESET_ATTR_ID(13), + TRANSCEIVER_RESET_ATTR_ID(14), + TRANSCEIVER_RESET_ATTR_ID(15), + TRANSCEIVER_RESET_ATTR_ID(16), + TRANSCEIVER_RESET_ATTR_ID(17), + TRANSCEIVER_RESET_ATTR_ID(18), + TRANSCEIVER_RESET_ATTR_ID(19), + TRANSCEIVER_RESET_ATTR_ID(20), + TRANSCEIVER_RESET_ATTR_ID(21), + TRANSCEIVER_RESET_ATTR_ID(22), + TRANSCEIVER_RESET_ATTR_ID(23), + TRANSCEIVER_RESET_ATTR_ID(24), + TRANSCEIVER_RESET_ATTR_ID(25), + TRANSCEIVER_RESET_ATTR_ID(26), + TRANSCEIVER_RESET_ATTR_ID(27), + TRANSCEIVER_RESET_ATTR_ID(28), + TRANSCEIVER_RESET_ATTR_ID(29), + TRANSCEIVER_RESET_ATTR_ID(30), + TRANSCEIVER_RESET_ATTR_ID(31), + TRANSCEIVER_RESET_ATTR_ID(32), +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_version(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_led_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* version */ +static SENSOR_DEVICE_ATTR(version, S_IWUSR | S_IRUGO, get_version, set_version, CPLD_VERSION); + +/* system led */ +static SENSOR_DEVICE_ATTR(sys_led_loc, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_LOC); +static SENSOR_DEVICE_ATTR(sys_led_diag, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_DIAG); +static SENSOR_DEVICE_ATTR(sys_led_fan, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_FAN); +static SENSOR_DEVICE_ATTR(sys_led_psu1, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU1); +static SENSOR_DEVICE_ATTR(sys_led_psu2, S_IWUSR | S_IRUGO, get_led_status, set_led_status, SYSTEM_LED_PSU2); + +/* transceiver attributes */ +#define DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(index) \ + static SENSOR_DEVICE_ATTR(module_present_##index, S_IWUSR | S_IRUGO, get_status, set_status, MODULE_PRESENT_##index) +#define DECLARE_TRANSCEIVER_PRESENT_ATTR(index) &sensor_dev_attr_module_present_##index.dev_attr.attr + +/*reset*/ +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(index) \ + static SENSOR_DEVICE_ATTR(module_reset_##index, S_IWUSR | S_IRUGO, get_mode_reset, set_mode_reset, MODULE_RESET_##index) +#define DECLARE_TRANSCEIVER_RESET_ATTR(index) &sensor_dev_attr_module_reset_##index.dev_attr.attr + +/* transceiver attributes */ +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(1); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(2); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(3); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(4); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(5); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(6); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(7); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(8); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(9); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(10); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(11); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(12); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(13); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(14); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(15); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(16); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(17); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(18); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(19); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(20); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(21); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(22); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(23); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(24); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(25); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(26); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(27); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(28); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(29); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(30); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(31); +DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(32); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_RESET_ATTR(32); + +static struct attribute *sw_to3200k_fpga_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + &sensor_dev_attr_sys_led_loc.dev_attr.attr, + &sensor_dev_attr_sys_led_diag.dev_attr.attr, + &sensor_dev_attr_sys_led_fan.dev_attr.attr, + &sensor_dev_attr_sys_led_psu1.dev_attr.attr, + &sensor_dev_attr_sys_led_psu2.dev_attr.attr, + NULL +}; + +static const struct attribute_group sw_to3200k_fpga_group = { + .attrs = sw_to3200k_fpga_attributes, +}; + +static struct attribute *sw_to3200k_cpld1_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(1), + DECLARE_TRANSCEIVER_PRESENT_ATTR(2), + DECLARE_TRANSCEIVER_PRESENT_ATTR(3), + DECLARE_TRANSCEIVER_PRESENT_ATTR(4), + DECLARE_TRANSCEIVER_PRESENT_ATTR(5), + DECLARE_TRANSCEIVER_PRESENT_ATTR(6), + DECLARE_TRANSCEIVER_PRESENT_ATTR(7), + DECLARE_TRANSCEIVER_PRESENT_ATTR(8), + DECLARE_TRANSCEIVER_PRESENT_ATTR(9), + DECLARE_TRANSCEIVER_PRESENT_ATTR(10), + DECLARE_TRANSCEIVER_PRESENT_ATTR(11), + DECLARE_TRANSCEIVER_PRESENT_ATTR(12), + DECLARE_TRANSCEIVER_PRESENT_ATTR(13), + DECLARE_TRANSCEIVER_PRESENT_ATTR(14), + DECLARE_TRANSCEIVER_PRESENT_ATTR(15), + DECLARE_TRANSCEIVER_PRESENT_ATTR(16), + DECLARE_TRANSCEIVER_RESET_ATTR(1), + DECLARE_TRANSCEIVER_RESET_ATTR(2), + DECLARE_TRANSCEIVER_RESET_ATTR(3), + DECLARE_TRANSCEIVER_RESET_ATTR(4), + DECLARE_TRANSCEIVER_RESET_ATTR(5), + DECLARE_TRANSCEIVER_RESET_ATTR(6), + DECLARE_TRANSCEIVER_RESET_ATTR(7), + DECLARE_TRANSCEIVER_RESET_ATTR(8), + DECLARE_TRANSCEIVER_RESET_ATTR(9), + DECLARE_TRANSCEIVER_RESET_ATTR(10), + DECLARE_TRANSCEIVER_RESET_ATTR(11), + DECLARE_TRANSCEIVER_RESET_ATTR(12), + DECLARE_TRANSCEIVER_RESET_ATTR(13), + DECLARE_TRANSCEIVER_RESET_ATTR(14), + DECLARE_TRANSCEIVER_RESET_ATTR(15), + DECLARE_TRANSCEIVER_RESET_ATTR(16), + NULL +}; + +static const struct attribute_group sw_to3200k_cpld1_group = { + .attrs = sw_to3200k_cpld1_attributes, +}; + +static struct attribute *sw_to3200k_cpld2_attributes[] = { + &sensor_dev_attr_version.dev_attr.attr, + DECLARE_TRANSCEIVER_PRESENT_ATTR(17), + DECLARE_TRANSCEIVER_PRESENT_ATTR(18), + DECLARE_TRANSCEIVER_PRESENT_ATTR(19), + DECLARE_TRANSCEIVER_PRESENT_ATTR(20), + DECLARE_TRANSCEIVER_PRESENT_ATTR(21), + DECLARE_TRANSCEIVER_PRESENT_ATTR(22), + DECLARE_TRANSCEIVER_PRESENT_ATTR(23), + DECLARE_TRANSCEIVER_PRESENT_ATTR(24), + DECLARE_TRANSCEIVER_PRESENT_ATTR(25), + DECLARE_TRANSCEIVER_PRESENT_ATTR(26), + DECLARE_TRANSCEIVER_PRESENT_ATTR(27), + DECLARE_TRANSCEIVER_PRESENT_ATTR(28), + DECLARE_TRANSCEIVER_PRESENT_ATTR(29), + DECLARE_TRANSCEIVER_PRESENT_ATTR(30), + DECLARE_TRANSCEIVER_PRESENT_ATTR(31), + DECLARE_TRANSCEIVER_PRESENT_ATTR(32), + DECLARE_TRANSCEIVER_RESET_ATTR(17), + DECLARE_TRANSCEIVER_RESET_ATTR(18), + DECLARE_TRANSCEIVER_RESET_ATTR(19), + DECLARE_TRANSCEIVER_RESET_ATTR(20), + DECLARE_TRANSCEIVER_RESET_ATTR(21), + DECLARE_TRANSCEIVER_RESET_ATTR(22), + DECLARE_TRANSCEIVER_RESET_ATTR(23), + DECLARE_TRANSCEIVER_RESET_ATTR(24), + DECLARE_TRANSCEIVER_RESET_ATTR(25), + DECLARE_TRANSCEIVER_RESET_ATTR(26), + DECLARE_TRANSCEIVER_RESET_ATTR(27), + DECLARE_TRANSCEIVER_RESET_ATTR(28), + DECLARE_TRANSCEIVER_RESET_ATTR(29), + DECLARE_TRANSCEIVER_RESET_ATTR(30), + DECLARE_TRANSCEIVER_RESET_ATTR(31), + DECLARE_TRANSCEIVER_RESET_ATTR(32), + NULL +}; + +static const struct attribute_group sw_to3200k_cpld2_group = { + .attrs = sw_to3200k_cpld2_attributes, +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + status = data->present[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + long status=0; + int update_idx, error; + + error = kstrtol(buf, 10, &status); + if (error) + { + return error; + } + + update_idx = attr->index - MODULE_PRESENT_1; + mutex_lock(&data->lock); + data->present[update_idx] = status; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_version(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int version; + + mutex_lock(&data->lock); + version = data->version; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", version); +} + +static ssize_t set_version +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, version; + + error = kstrtoint(buf, 10, &version); + if (error) + { + return error; + } + + mutex_lock(&data->lock); + data->version = version; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_mode_reset(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, reset = 0; + + update_idx = attr->index - MODULE_RESET_1; + mutex_lock(&data->lock); + reset = data->reset[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", reset); +} + +static ssize_t set_mode_reset(struct device *dev, struct device_attribute *da, + const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, reset; + int update_idx; + + error = kstrtoint(buf, 10, &reset); + if (error) + { + return error; + } + + update_idx = attr->index - MODULE_RESET_1; + mutex_lock(&data->lock); + data->reset[update_idx] = reset; + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_led_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int update_idx, status = 0; + + update_idx = attr->index - SYSTEM_LED_LOC; + mutex_lock(&data->lock); + status = data->sysled_status[update_idx]; + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_led_status +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int error, status; + int update_idx; + + error = kstrtoint(buf, 10, &status); + if (error) + { + return error; + } + + update_idx = attr->index - SYSTEM_LED_LOC; + mutex_lock(&data->lock); + data->sysled_status[update_idx] = status; + mutex_unlock(&data->lock); + return count; +} + +static int get_led_status_internal(struct i2c_client *client, int led_type) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + status = data->sysled_status[led_type]; + mutex_unlock(&data->lock); + return status; +} + +static int set_led_status_internal(struct i2c_client *client, int led_type, int light_mode) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + data->sysled_status[led_type] = light_mode; + mutex_unlock(&data->lock); + return 0; +} + +static void sw_to3200k_cpld_add_client(struct i2c_client *client) +{ + struct cpld_client_node *node = kzalloc(sizeof(struct cpld_client_node), GFP_KERNEL); + + if (!node) + { + dev_dbg(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr); + return; + } + + node->client = client; + + mutex_lock(&list_lock); + list_add(&node->list, &cpld_client_list); + mutex_unlock(&list_lock); +} + +static void sw_to3200k_cpld_remove_client(struct i2c_client *client) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int found = 0; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client == client) + { + found = 1; + break; + } + } + + if (found) + { + list_del(list_node); + kfree(cpld_node); + } + + mutex_unlock(&list_lock); +} + +/* + * I2C init/probing/exit functions + */ +static int sw_to3200k_cpld_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct sw_to3200k_cpld_data *data; + int ret = -ENODEV; + const struct attribute_group *group = NULL; + + data = kzalloc(sizeof(struct sw_to3200k_cpld_data), GFP_KERNEL); + if (!data) + { + ret = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->lock); + data->type = id->driver_data; + + /* Register sysfs hooks */ + switch (data->type) + { + case sw_to3200k_fpga: + group = &sw_to3200k_fpga_group; + break; + case sw_to3200k_cpld1: + group = &sw_to3200k_cpld1_group; + break; + case sw_to3200k_cpld2: + group = &sw_to3200k_cpld2_group; + break; + default: + break; + } + + if (group) + { + ret = sysfs_create_group(&client->dev.kobj, group); + if (ret) + { + goto exit_free; + } + } + + sw_to3200k_cpld_add_client(client); + return 0; + +exit_free: + kfree(data); +exit: + return ret; +} + +static int sw_to3200k_cpld_remove(struct i2c_client *client) +{ + struct sw_to3200k_cpld_data *data = i2c_get_clientdata(client); + const struct attribute_group *group = NULL; + + sw_to3200k_cpld_remove_client(client); + + /* Remove sysfs hooks */ + switch (data->type) + { + case sw_to3200k_fpga: + group = &sw_to3200k_fpga_group; + break; + case sw_to3200k_cpld1: + group = &sw_to3200k_cpld1_group; + break; + case sw_to3200k_cpld2: + group = &sw_to3200k_cpld2_group; + break; + default: + break; + } + + if (group) + { + sysfs_remove_group(&client->dev.kobj, group); + } + + kfree(data); + return 0; +} + +int sw_to3200k_fpga_sysled_get(int led_type) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EPERM; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == SW_TO3200K_FPGA_ADDR) { + ret = get_led_status_internal(cpld_node->client, led_type); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(sw_to3200k_fpga_sysled_get); + +int sw_to3200k_fpga_sysled_set(int led_type, int light_mode) +{ + struct list_head *list_node = NULL; + struct cpld_client_node *cpld_node = NULL; + int ret = -EIO; + + mutex_lock(&list_lock); + + list_for_each(list_node, &cpld_client_list) + { + cpld_node = list_entry(list_node, struct cpld_client_node, list); + + if (cpld_node->client->addr == SW_TO3200K_FPGA_ADDR) { + ret = set_led_status_internal(cpld_node->client, led_type, light_mode); + break; + } + } + + mutex_unlock(&list_lock); + + return ret; +} +EXPORT_SYMBOL(sw_to3200k_fpga_sysled_set); + +static struct i2c_driver sw_to3200k_cpld_driver = { + .driver = { + .name = "sw_to3200k_cpld", + .owner = THIS_MODULE, + }, + .probe = sw_to3200k_cpld_probe, + .remove = sw_to3200k_cpld_remove, + .id_table = sw_to3200k_cpld_id, +}; + +static int __init sw_to3200k_cpld_init(void) +{ + mutex_init(&list_lock); + return i2c_add_driver(&sw_to3200k_cpld_driver); +} + +static void __exit sw_to3200k_cpld_exit(void) +{ + i2c_del_driver(&sw_to3200k_cpld_driver); +} + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("Wistron I2C CPLD driver"); +MODULE_LICENSE("GPL"); + +module_init(sw_to3200k_cpld_init); +module_exit(sw_to3200k_cpld_exit); + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c new file mode 100644 index 0000000000..82dfa71b78 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_fan.c @@ -0,0 +1,299 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define DRVNAME "sw_to3200k_fan" + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_fan_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +enum fan_id { + FAN1_ID, + FAN2_ID, + FAN3_ID, + FAN4_ID, + FAN5_ID, + FAN6_ID, + FAN7_ID +}; + +enum sysfs_fan_attributes { + FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */ + FAN1_PRESENCE, + FAN2_PRESENCE, + FAN3_PRESENCE, + FAN4_PRESENCE, + FAN5_PRESENCE, + FAN6_PRESENCE, + FAN7_PRESENCE, + FAN1_ENABLE, + FAN2_ENABLE, + FAN3_ENABLE, + FAN4_ENABLE, + FAN5_ENABLE, + FAN6_ENABLE, + FAN7_ENABLE, + FAN1_DIRECTION, + FAN2_DIRECTION, + FAN3_DIRECTION, + FAN4_DIRECTION, + FAN5_DIRECTION, + FAN6_DIRECTION, + FAN7_DIRECTION, + FAN1_FRONT_SPEED_RPM, + FAN2_FRONT_SPEED_RPM, + FAN3_FRONT_SPEED_RPM, + FAN4_FRONT_SPEED_RPM, + FAN5_FRONT_SPEED_RPM, + FAN6_FRONT_SPEED_RPM, + FAN7_FRONT_SPEED_RPM, + FAN1_REAR_SPEED_RPM, + FAN2_REAR_SPEED_RPM, + FAN3_REAR_SPEED_RPM, + FAN4_REAR_SPEED_RPM, + FAN5_REAR_SPEED_RPM, + FAN6_REAR_SPEED_RPM, + FAN7_REAR_SPEED_RPM, + FAN_ATTR_MAX +}; + +/* Each client has this additional data */ +struct sw_to3200k_fan_data { + struct device *hwmon_dev; + struct mutex update_lock; + int fan_val[FAN_ATTR_MAX]; +}; + +/* Define attributes */ +#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_duty_cycle_percentage, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DUTY_CYCLE_PERCENTAGE) +#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_fan##index##_duty_cycle_percentage.dev_attr.attr + +#define DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_presence, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_PRESENCE) +#define DECLARE_FAN_PRESENCE_ATTR(index) &sensor_dev_attr_fan##index##_presence.dev_attr.attr + +#define DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_enable, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_ENABLE) +#define DECLARE_FAN_ENABLE_ATTR(index) &sensor_dev_attr_fan##index##_enable.dev_attr.attr + +#define DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(index) \ + static SENSOR_DEVICE_ATTR(fan##index##_direction, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_DIRECTION) +#define DECLARE_FAN_DIRECTION_ATTR(index) &sensor_dev_attr_fan##index##_direction.dev_attr.attr + +#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index, index2) \ + static SENSOR_DEVICE_ATTR(fan##index##_front_speed_rpm, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index##_rear_speed_rpm, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_FRONT_SPEED_RPM);\ + static SENSOR_DEVICE_ATTR(fan##index2##_input, S_IWUSR | S_IRUGO, get_fan_value, set_fan_value, FAN##index##_REAR_SPEED_RPM) +#define DECLARE_FAN_SPEED_RPM_ATTR(index, index2) &sensor_dev_attr_fan##index##_front_speed_rpm.dev_attr.attr, \ + &sensor_dev_attr_fan##index##_rear_speed_rpm.dev_attr.attr, \ + &sensor_dev_attr_fan##index##_input.dev_attr.attr, \ + &sensor_dev_attr_fan##index2##_input.dev_attr.attr + +/* 7 fan speed(rpm) attributes in this platform */ +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1,11); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2,12); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3,13); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4,14); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5,15); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(6,16); +DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(7,17); + +/* 7 fan presence */ +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_PRESENCE_SENSOR_DEV_ATTR(7); + +/* 7 fan enable */ +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(1); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(2); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(3); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(4); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(5); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(6); +DECLARE_FAN_ENABLE_SENSOR_DEV_ATTR(7); + +/* 7 fan direction */ +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(1); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(2); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(3); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(4); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(5); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(6); +DECLARE_FAN_DIRECTION_SENSOR_DEV_ATTR(7); + +/* 1 fan duty cycle attribute in this platform */ +DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(); + +static struct attribute *sw_to3200k_fan_attributes[] = { + /* fan related attributes */ + DECLARE_FAN_SPEED_RPM_ATTR(1,11), + DECLARE_FAN_SPEED_RPM_ATTR(2,12), + DECLARE_FAN_SPEED_RPM_ATTR(3,13), + DECLARE_FAN_SPEED_RPM_ATTR(4,14), + DECLARE_FAN_SPEED_RPM_ATTR(5,15), + DECLARE_FAN_SPEED_RPM_ATTR(6,16), + DECLARE_FAN_SPEED_RPM_ATTR(7,17), + DECLARE_FAN_PRESENCE_ATTR(1), + DECLARE_FAN_PRESENCE_ATTR(2), + DECLARE_FAN_PRESENCE_ATTR(3), + DECLARE_FAN_PRESENCE_ATTR(4), + DECLARE_FAN_PRESENCE_ATTR(5), + DECLARE_FAN_PRESENCE_ATTR(6), + DECLARE_FAN_PRESENCE_ATTR(7), + DECLARE_FAN_ENABLE_ATTR(1), + DECLARE_FAN_ENABLE_ATTR(2), + DECLARE_FAN_ENABLE_ATTR(3), + DECLARE_FAN_ENABLE_ATTR(4), + DECLARE_FAN_ENABLE_ATTR(5), + DECLARE_FAN_ENABLE_ATTR(6), + DECLARE_FAN_ENABLE_ATTR(7), + DECLARE_FAN_DIRECTION_ATTR(1), + DECLARE_FAN_DIRECTION_ATTR(2), + DECLARE_FAN_DIRECTION_ATTR(3), + DECLARE_FAN_DIRECTION_ATTR(4), + DECLARE_FAN_DIRECTION_ATTR(5), + DECLARE_FAN_DIRECTION_ATTR(6), + DECLARE_FAN_DIRECTION_ATTR(7), + DECLARE_FAN_DUTY_CYCLE_ATTR(), + NULL +}; + +static ssize_t get_fan_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->update_lock); + value = data->fan_val[attr->index]; + mutex_unlock(&data->update_lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_fan_value +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t count +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) + { + printk("fan_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->update_lock); + data->fan_val[attr->index] = value; + mutex_unlock(&data->update_lock); + return count; +} + +static const struct attribute_group sw_to3200k_fan_group = { + .attrs = sw_to3200k_fan_attributes, +}; + +static int sw_to3200k_fan_probe +( + struct i2c_client *client, + const struct i2c_device_id *dev_id +) +{ + struct sw_to3200k_fan_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_fan_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + mutex_init(&data->update_lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_fan_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: fan '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_fan_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_fan_remove(struct i2c_client *client) +{ + struct sw_to3200k_fan_data *data = i2c_get_clientdata(client); + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_fan_group); + return 0; +} + +/* Addresses to scan */ +static const unsigned short normal_i2c[] = { 0x66, I2C_CLIENT_END }; + +static const struct i2c_device_id sw_to3200k_fan_id[] = { + { "sw_to3200k_fan", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_fan_id); + +static struct i2c_driver sw_to3200k_fan_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = DRVNAME, + }, + .probe = sw_to3200k_fan_probe, + .remove = sw_to3200k_fan_remove, + .id_table = sw_to3200k_fan_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(sw_to3200k_fan_driver); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_fan driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c new file mode 100644 index 0000000000..65be12e9f0 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_leds.c @@ -0,0 +1,293 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + +/* led_type: 0=loc, 1=diag, 2=fan, 3=psu1, 4=psu2 + * light_mode: 0=off, 1=green, 2=amber, 3=blinking green + */ +extern int sw_to3200k_fpga_sysled_get(int led_type); +extern int sw_to3200k_fpga_sysled_set(int led_type, int light_mode); + +#define DRVNAME "wistron_sw_to3200k_led" + +struct wistron_sw_to3200k_led_data { + struct platform_device *pdev; + struct mutex lock; + int sysled_status[5]; +}; + +static struct wistron_sw_to3200k_led_data *ledctl = NULL; + +/* LED related data */ +#define LED_MODE_OFF_VALUE 0 +#define LED_MODE_GREEN_VALUE 1 +#define LED_MODE_AMBER_VALUE 2 +#define LED_MODE_BLK_GREEN_VALUE 3 + +enum led_type { + LED_TYPE_LOC, + LED_TYPE_DIAG, + LED_TYPE_FAN, + LED_TYPE_PSU1, + LED_TYPE_PSU2, + LED_TYPE_END +}; + +enum led_light_mode { + LED_MODE_OFF = 0, + LED_MODE_GREEN, + LED_MODE_AMBER, + LED_MODE_BLK_GREEN, + LED_MODE_UNKNOWN +}; + +static void wistron_sw_to3200k_led_update(void) +{ + int i; + mutex_lock(&ledctl->lock); + for (i = 0; i < LED_TYPE_END; i++) + { + ledctl->sysled_status[i] = sw_to3200k_fpga_sysled_get(i); + } + mutex_unlock(&ledctl->lock); +} + +static void wistron_sw_to3200k_led_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode, + enum led_type type) +{ + mutex_lock(&ledctl->lock); + sw_to3200k_fpga_sysled_set(type, led_light_mode); + mutex_unlock(&ledctl->lock); +} + +static void wistron_sw_to3200k_led_diag_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_DIAG); +} + +static enum led_brightness wistron_sw_to3200k_led_diag_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_DIAG]; +} + +static void wistron_sw_to3200k_led_loc_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_LOC); +} + +static enum led_brightness wistron_sw_to3200k_led_loc_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_LOC]; +} + +static void wistron_sw_to3200k_led_fan_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_FAN); +} + +static enum led_brightness wistron_sw_to3200k_led_fan_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_FAN]; +} + +static void wistron_sw_to3200k_led_psu1_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_PSU1); +} + +static enum led_brightness wistron_sw_to3200k_led_psu1_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU1]; +} + +static void wistron_sw_to3200k_led_psu2_set(struct led_classdev *led_cdev, + enum led_brightness led_light_mode) +{ + wistron_sw_to3200k_led_set(led_cdev, led_light_mode, LED_TYPE_PSU2); +} + +static enum led_brightness wistron_sw_to3200k_led_psu2_get(struct led_classdev *cdev) +{ + wistron_sw_to3200k_led_update(); + return ledctl->sysled_status[LED_TYPE_PSU2]; +} + +static struct led_classdev wistron_sw_to3200k_leds[] = { + [LED_TYPE_DIAG] = { + .name = "wistron_sw_to3200k_led::diag", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_diag_set, + .brightness_get = wistron_sw_to3200k_led_diag_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_LOC] = { + .name = "wistron_sw_to3200k_led::loc", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_loc_set, + .brightness_get = wistron_sw_to3200k_led_loc_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_BLK_GREEN, + }, + [LED_TYPE_FAN] = { + .name = "wistron_sw_to3200k_led::fan", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_fan_set, + .brightness_get = wistron_sw_to3200k_led_fan_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU1] = { + .name = "wistron_sw_to3200k_led::psu1", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_psu1_set, + .brightness_get = wistron_sw_to3200k_led_psu1_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, + [LED_TYPE_PSU2] = { + .name = "wistron_sw_to3200k_led::psu2", + .default_trigger = "unused", + .brightness_set = wistron_sw_to3200k_led_psu2_set, + .brightness_get = wistron_sw_to3200k_led_psu2_get, + .flags = LED_CORE_SUSPENDRESUME, + .max_brightness = LED_MODE_AMBER, + }, +}; + +static int wistron_sw_to3200k_led_suspend(struct platform_device *dev, + pm_message_t state) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_suspend(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static int wistron_sw_to3200k_led_resume(struct platform_device *dev) +{ + int i = 0; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_resume(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static int wistron_sw_to3200k_led_probe(struct platform_device *pdev) +{ + int ret, i; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + ret = led_classdev_register(&pdev->dev, &wistron_sw_to3200k_leds[i]); + + if (ret < 0) + break; + } + + /* Check if all LEDs were successfully registered */ + if (i != ARRAY_SIZE(wistron_sw_to3200k_leds)) + { + int j; + + /* only unregister the LEDs that were successfully registered */ + for (j = 0; j < i; j++) + { + led_classdev_unregister(&wistron_sw_to3200k_leds[i]); + } + } + + return ret; +} + +static int wistron_sw_to3200k_led_remove(struct platform_device *pdev) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(wistron_sw_to3200k_leds); i++) + { + led_classdev_unregister(&wistron_sw_to3200k_leds[i]); + } + + return 0; +} + +static struct platform_driver wistron_sw_to3200k_led_driver = { + .probe = wistron_sw_to3200k_led_probe, + .remove = wistron_sw_to3200k_led_remove, + .suspend = wistron_sw_to3200k_led_suspend, + .resume = wistron_sw_to3200k_led_resume, + .driver = { + .name = DRVNAME, + .owner = THIS_MODULE, + }, +}; + +static int __init wistron_sw_to3200k_led_init(void) +{ + int ret; + + ret = platform_driver_register(&wistron_sw_to3200k_led_driver); + if (ret < 0) + { + goto exit; + } + + ledctl = kzalloc(sizeof(struct wistron_sw_to3200k_led_data), GFP_KERNEL); + if (!ledctl) + { + ret = -ENOMEM; + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + goto exit; + } + + mutex_init(&ledctl->lock); + + ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0); + if (IS_ERR(ledctl->pdev)) + { + ret = PTR_ERR(ledctl->pdev); + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + kfree(ledctl); + goto exit; + } + +exit: + return ret; +} + +static void __exit wistron_sw_to3200k_led_exit(void) +{ + platform_device_unregister(ledctl->pdev); + platform_driver_unregister(&wistron_sw_to3200k_led_driver); + kfree(ledctl); +} + +module_init(wistron_sw_to3200k_led_init); +module_exit(wistron_sw_to3200k_led_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("wistron_sw_to3200k_led driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c new file mode 100644 index 0000000000..6e1df229c9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_oom.c @@ -0,0 +1,397 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* QSFP-DD: page0 (low page (128 byte)), page 0 (high page (128 byte)), page 2 (high page (128 byte)), page11 (high page (128 byte))*/ +#define EEPROM_DATA_SIZE 128 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; +#define MAX_PORT_NAME_LEN 20 + +enum sysfs_fan_attributes { + OOM_LP_MODE, + OOM_TEMP, + OOM_EEPROM_LOW, + OOM_EEPROM_PG0, + OOM_EEPROM_PG1, + OOM_EEPROM_PG2, + OOM_EEPROM_PG3, + OOM_EEPROM_PG11, + OOM_PORT_NAME, + OOM_ATTR_MAX +}; + +/* Each client has this additional data */ +struct sw_to3200k_oom_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + int lp_mode; + int temp; + unsigned char eeproml[EEPROM_DATA_SIZE]; + unsigned char eeprom0[EEPROM_DATA_SIZE]; + unsigned char eeprom1[EEPROM_DATA_SIZE]; + unsigned char eeprom2[EEPROM_DATA_SIZE]; + unsigned char eeprom3[EEPROM_DATA_SIZE]; + unsigned char eeprom11[EEPROM_DATA_SIZE]; + char port_name[MAX_PORT_NAME_LEN]; +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_oom_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static SENSOR_DEVICE_ATTR(lp_mode, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_LP_MODE); +static SENSOR_DEVICE_ATTR(temp, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_TEMP); +static SENSOR_DEVICE_ATTR(eeprom_low, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_LOW); +static SENSOR_DEVICE_ATTR(eeprom_pg0, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG0); +static SENSOR_DEVICE_ATTR(eeprom_pg1, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG1); +static SENSOR_DEVICE_ATTR(eeprom_pg2, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG2); +static SENSOR_DEVICE_ATTR(eeprom_pg3, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG3); +static SENSOR_DEVICE_ATTR(eeprom_pg11, S_IWUSR | S_IRUGO, get_oom_info, set_oom_info, OOM_EEPROM_PG11); +static SENSOR_DEVICE_ATTR(port_name, S_IRUGO | S_IWUSR, get_port_name, set_port_name, OOM_PORT_NAME); + +static struct attribute *sw_to3200k_oom_attributes[] = { + &sensor_dev_attr_lp_mode.dev_attr.attr, + &sensor_dev_attr_temp.dev_attr.attr, + &sensor_dev_attr_eeprom_low.dev_attr.attr, + &sensor_dev_attr_eeprom_pg0.dev_attr.attr, + &sensor_dev_attr_eeprom_pg1.dev_attr.attr, + &sensor_dev_attr_eeprom_pg2.dev_attr.attr, + &sensor_dev_attr_eeprom_pg3.dev_attr.attr, + &sensor_dev_attr_eeprom_pg11.dev_attr.attr, + &sensor_dev_attr_port_name.dev_attr.attr, + NULL +}; + +static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int value = 0; + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + { + value = data->lp_mode; + } + else + { + value = data->temp; + } + mutex_unlock(&data->lock); + return sprintf(buf, "%d", value); +} + +static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int error, value; + + error = kstrtoint(buf, 10, &value); + if (error) + { + printk("oom_set_value error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == OOM_LP_MODE) + { + data->lp_mode = value; + } + else + { + data->temp = value; + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_oom_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + + mutex_lock(&data->lock); + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + memcpy(buf, data->eeproml, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG0: + { + memcpy(buf, data->eeprom0, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG1: + { + memcpy(buf, data->eeprom1, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG2: + { + memcpy(buf, data->eeprom2, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG3: + { + memcpy(buf, data->eeprom3, EEPROM_DATA_SIZE); + break; + } + case OOM_EEPROM_PG11: + { + memcpy(buf, data->eeprom11, EEPROM_DATA_SIZE); + break; + } + default: + break; + } + mutex_unlock(&data->lock); + return EEPROM_DATA_SIZE; +} + +static ssize_t set_oom_info(struct device *dev, struct device_attribute *da, const char *buf, size_t size) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + int i=0, j=0, k=0; + unsigned char str[3]; + unsigned int val; + + k=0; + mutex_lock(&data->lock); + memset(str, 0x0, 3); + if (strlen(buf) >= EEPROM_DATA_SIZE) + { + for (i=0; i < strlen(buf) ; i++) + { + for (j=0;j<2; j++) + { + str[j]=buf[i+j]; + } + sscanf(str, "%x", &val); + i=j+i-1; + if (k>=EEPROM_DATA_SIZE) + { + break; + } + + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + data->eeproml[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG0: + { + data->eeprom0[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG1: + { + data->eeprom1[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG2: + { + data->eeprom2[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG3: + { + data->eeprom3[k]=(unsigned char)val; + break; + } + case OOM_EEPROM_PG11: + { + data->eeprom11[k]=(unsigned char)val; + break; + } + default: + break; + } + + k++; + } + } + else + { + switch (attr->index) + { + case OOM_EEPROM_LOW: + { + memset(&data->eeproml, 0x0, sizeof(data->eeproml)); + break; + } + case OOM_EEPROM_PG0: + { + memset(&data->eeprom0, 0x0, sizeof(data->eeprom0)); + break; + } + case OOM_EEPROM_PG2: + { + memset(&data->eeprom2, 0x0, sizeof(data->eeprom2)); + break; + } + case OOM_EEPROM_PG3: + { + memset(&data->eeprom3, 0x0, sizeof(data->eeprom3)); + break; + } + case OOM_EEPROM_PG11: + { + memset(&data->eeprom11, 0x0, sizeof(data->eeprom11)); + break; + } + default: + break; + } + } + + mutex_unlock(&data->lock); + return size; +} + +static ssize_t get_port_name(struct device *dev, struct device_attribute *da, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + count = sprintf(buf, "%s", data->port_name); + mutex_unlock(&data->lock); + return count; +} + +static ssize_t set_port_name(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + char port_name[MAX_PORT_NAME_LEN]; + + if (sscanf(buf, "%19s", port_name) != 1) + { + return -EINVAL; + } + + mutex_lock(&data->lock); + strcpy(data->port_name, port_name); + mutex_unlock(&data->lock); + return count; +} + +static const struct attribute_group sw_to3200k_oom_group = { + .attrs = sw_to3200k_oom_attributes, +}; + +static int sw_to3200k_oom_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_oom_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_oom_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_oom_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: oom '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_oom_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_oom_remove(struct i2c_client *client) +{ + struct sw_to3200k_oom_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_oom_group); + kfree(data); + + return 0; +} + +static const struct i2c_device_id sw_to3200k_oom_id[] = { + { "sw_to3200k_oom", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_oom_id); + +static struct i2c_driver sw_to3200k_oom_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_oom", + }, + .probe = sw_to3200k_oom_probe, + .remove = sw_to3200k_oom_remove, + .id_table = sw_to3200k_oom_id, + .address_list = normal_i2c, +}; + +static int __init sw_to3200k_oom_init(void) +{ + return i2c_add_driver(&sw_to3200k_oom_driver); +} + +static void __exit sw_to3200k_oom_exit(void) +{ + i2c_del_driver(&sw_to3200k_oom_driver); +} + +module_init(sw_to3200k_oom_init); +module_exit(sw_to3200k_oom_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_oom driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c new file mode 100644 index 0000000000..849ec13154 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_psu.c @@ -0,0 +1,266 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX_MODEL_NAME 16 +#define MAX_SERIAL_NUMBER 19 + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_string(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_string(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { 0x51, 0x52, I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct sw_to3200k_psu_data { + struct device *hwmon_dev; + struct mutex lock; + int index; /* PSU index */ + int present; /* PSU present */ + int pwr_good; /* PSU power good */ + int psu_fan_dir; /* PSU fan direction 0:afo, 1:afi */ + char model_name[MAX_MODEL_NAME]; /* Model name */ + char serial_number[MAX_SERIAL_NUMBER]; +}; + +enum sw_to3200k_psu_sysfs_attributes { + PSU_PRESENT, + PSU_MODEL_NAME, + PSU_POWER_GOOD, + PSU_SERIAL_NUMBER, + PSU_FAN_DIR +}; + +/* sysfs attributes for hwmon */ +static SENSOR_DEVICE_ATTR(psu_present, S_IWUSR | S_IRUGO, get_status, set_status, PSU_PRESENT); +static SENSOR_DEVICE_ATTR(psu_model_name, S_IWUSR | S_IRUGO, get_string, set_string, PSU_MODEL_NAME); +static SENSOR_DEVICE_ATTR(psu_power_good, S_IWUSR | S_IRUGO, get_status, set_status, PSU_POWER_GOOD); +static SENSOR_DEVICE_ATTR(psu_serial_number, S_IWUSR | S_IRUGO, get_string, set_string, PSU_SERIAL_NUMBER); +static SENSOR_DEVICE_ATTR(psu_fan_dir, S_IWUSR | S_IRUGO, get_status, set_status, PSU_FAN_DIR); + +static struct attribute *sw_to3200k_psu_attributes[] = { + &sensor_dev_attr_psu_present.dev_attr.attr, + &sensor_dev_attr_psu_model_name.dev_attr.attr, + &sensor_dev_attr_psu_power_good.dev_attr.attr, + &sensor_dev_attr_psu_serial_number.dev_attr.attr, + &sensor_dev_attr_psu_fan_dir.dev_attr.attr, + NULL +}; + +static ssize_t get_status(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + int status = 0; + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) + { + status = data->present; + } + else if (attr->index == PSU_POWER_GOOD) + { + status = data->pwr_good; + } + else + { + status = data->psu_fan_dir; + } + mutex_unlock(&data->lock); + return sprintf(buf, "%d", status); +} + +static ssize_t set_status(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + int error, status; + + error = kstrtoint(buf, 10, &status); + if (error) + { + printk("psu_set_status error=%d\n", error); + return error; + } + + mutex_lock(&data->lock); + if (attr->index == PSU_PRESENT) + { + data->present = status; + } + else if (attr->index == PSU_POWER_GOOD) + { + data->pwr_good = status; + } + else + { + data->psu_fan_dir = status; + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t get_string(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + ssize_t count; + + mutex_lock(&data->lock); + if (attr->index == PSU_MODEL_NAME) + { + count = sprintf(buf, "%s", data->model_name); + } + else + { + count = sprintf(buf, "%s", data->serial_number); + } + mutex_unlock(&data->lock); + return count; +} + +static ssize_t set_string(struct device *dev, struct device_attribute *da, const char *buf, size_t count) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + char tmp_str[32]; + + memset(&tmp_str, 0x0, sizeof(tmp_str)); + if (attr->index == PSU_MODEL_NAME) + { + if (sscanf(buf, "%16s", tmp_str) != 1) + { + return -EINVAL; + } + } + else + { + if (sscanf(buf, "%19s", tmp_str) != 1) + { + return -EINVAL; + } + } + + mutex_lock(&data->lock); + if (attr->index == PSU_MODEL_NAME) + { + strcpy(data->model_name, tmp_str); + } + else + { + strcpy(data->serial_number, tmp_str); + } + mutex_unlock(&data->lock); + return count; +} + +static const struct attribute_group sw_to3200k_psu_group = { + .attrs = sw_to3200k_psu_attributes, +}; + +static int sw_to3200k_psu_probe(struct i2c_client *client, + const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_psu_data *data; + int status; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) + { + status = -EIO; + goto exit; + } + + data = kzalloc(sizeof(struct sw_to3200k_psu_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_psu_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: psu '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_psu_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_psu_remove(struct i2c_client *client) +{ + struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_psu_group); + kfree(data); + + return 0; +} + +enum psu_index +{ + sw_to3200k_psu1, + sw_to3200k_psu2 +}; + +static const struct i2c_device_id sw_to3200k_psu_id[] = { + { "sw_to3200k_psu1", sw_to3200k_psu1 }, + { "sw_to3200k_psu2", sw_to3200k_psu2 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_psu_id); + +static struct i2c_driver sw_to3200k_psu_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_psu", + }, + .probe = sw_to3200k_psu_probe, + .remove = sw_to3200k_psu_remove, + .id_table = sw_to3200k_psu_id, + .address_list = normal_i2c, +}; + +module_i2c_driver(sw_to3200k_psu_driver); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_psu driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c new file mode 100644 index 0000000000..e96e9d723f --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/modules/wistron_sw_to3200k_thermal.c @@ -0,0 +1,205 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define STRING_TO_DEC_VALUE 10 +#define STRING_TO_HEX_VALUE 16 + +#define TEMP1_MAX_DEFAULT 75000 +#define TEMP1_MAX_HYST_DEFAULT 70000 + +/* Addresses scanned */ +static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; + +/* Each client has this additional data */ +struct sw_to3200k_thermal_data { + struct device *hwmon_dev; + struct mutex lock; + u8 index; + unsigned int temp1_input; + unsigned int temp1_max; + unsigned int temp1_max_hyst; +}; + +enum sw_to3200k_thermal_sysfs_attributes { + TEMP1_INPUT, + TEMP1_MAX, + TEMP1_MAX_HYST +}; + +/* sysfs attributes for hwmon */ +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_temp_info(struct device *dev, struct device_attribute *da, const char *buf, size_t count); + +static SENSOR_DEVICE_ATTR(temp1_input, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_INPUT); +static SENSOR_DEVICE_ATTR(temp1_max, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX); +static SENSOR_DEVICE_ATTR(temp1_max_hyst, S_IWUSR|S_IRUGO, get_temp_info, set_temp_info, TEMP1_MAX_HYST); + +static struct attribute *sw_to3200k_thermal_attributes[] = { + &sensor_dev_attr_temp1_input.dev_attr.attr, + &sensor_dev_attr_temp1_max.dev_attr.attr, + &sensor_dev_attr_temp1_max_hyst.dev_attr.attr, + NULL +}; + +static ssize_t get_temp_info(struct device *dev, struct device_attribute *da, char *buf) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + int status = -EINVAL; + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + status = snprintf(buf, PAGE_SIZE - 1, "%d", data->temp1_input); + break; + case TEMP1_MAX: + status = snprintf(buf, PAGE_SIZE - 1, "%d", TEMP1_MAX_DEFAULT); + break; + case TEMP1_MAX_HYST: + status = snprintf(buf, PAGE_SIZE - 1, "%d", TEMP1_MAX_HYST_DEFAULT); + break; + default : + break; + } + mutex_unlock(&data->lock); + return status; +} + +static ssize_t set_temp_info +( + struct device *dev, + struct device_attribute *da, + const char *buf, + size_t size +) +{ + struct sensor_device_attribute *attr = to_sensor_dev_attr(da); + struct i2c_client *client = to_i2c_client(dev); + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + long keyin = 0; + int error; + + error = kstrtol(buf, STRING_TO_DEC_VALUE, &keyin); + if (error) + { + return error; + } + + mutex_lock(&data->lock); + switch (attr->index) + { + case TEMP1_INPUT: + data->temp1_input = keyin; + break; + default : + break; + } + + mutex_unlock(&data->lock); + return size; +} + +static const struct attribute_group sw_to3200k_thermal_group = { + .attrs = sw_to3200k_thermal_attributes, +}; + +static int sw_to3200k_thermal_probe(struct i2c_client *client, const struct i2c_device_id *dev_id) +{ + struct sw_to3200k_thermal_data *data; + int status; + + data = kzalloc(sizeof(struct sw_to3200k_thermal_data), GFP_KERNEL); + if (!data) + { + status = -ENOMEM; + goto exit; + } + + i2c_set_clientdata(client, data); + data->index = dev_id->driver_data; + mutex_init(&data->lock); + + dev_info(&client->dev, "device found\n"); + + /* Register sysfs hooks */ + status = sysfs_create_group(&client->dev.kobj, &sw_to3200k_thermal_group); + if (status) + { + goto exit_free; + } + + data->hwmon_dev = hwmon_device_register(&client->dev); + if (IS_ERR(data->hwmon_dev)) + { + status = PTR_ERR(data->hwmon_dev); + goto exit_remove; + } + + dev_info(&client->dev, "%s: thermal '%s'\n", dev_name(data->hwmon_dev), client->name); + return 0; + +exit_remove: + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_thermal_group); +exit_free: + kfree(data); +exit: + + return status; +} + +static int sw_to3200k_thermal_remove(struct i2c_client *client) +{ + struct sw_to3200k_thermal_data *data = i2c_get_clientdata(client); + + hwmon_device_unregister(data->hwmon_dev); + sysfs_remove_group(&client->dev.kobj, &sw_to3200k_thermal_group); + kfree(data); + return 0; +} + + +static const struct i2c_device_id sw_to3200k_thermal_id[] = { + { "sw_to3200k_thermal", 0 }, + {} +}; +MODULE_DEVICE_TABLE(i2c, sw_to3200k_thermal_id); + +static struct i2c_driver sw_to3200k_thermal_driver = { + .class = I2C_CLASS_HWMON, + .driver = { + .name = "sw_to3200k_thermal", + }, + .probe = sw_to3200k_thermal_probe, + .remove = sw_to3200k_thermal_remove, + .id_table = sw_to3200k_thermal_id, + .address_list = normal_i2c, +}; + +static int __init sw_to3200k_thermal_init(void) +{ + return i2c_add_driver(&sw_to3200k_thermal_driver); +} + +static void __exit sw_to3200k_thermal_exit(void) +{ + i2c_del_driver(&sw_to3200k_thermal_driver); +} + +module_init(sw_to3200k_thermal_init); +module_exit(sw_to3200k_thermal_exit); + +MODULE_AUTHOR("Haowei Chung "); +MODULE_DESCRIPTION("sw_to3200k_thermal driver"); +MODULE_LICENSE("GPL"); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service new file mode 100644 index 0000000000..0e7a679b91 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/platform-modules-sw-to3200k.service @@ -0,0 +1,14 @@ +[Unit] +Description=Wistron SW-TO3200K Platform modules +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/wistron_sw_to3200k_util.py install +ExecStop=/usr/local/bin/wistron_sw_to3200k_util.py clean +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service new file mode 100644 index 0000000000..6e708518ca --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-led.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron SW-TO3200K Platform LED service +After=platform-modules-sw-to3200k.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_led +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service new file mode 100644 index 0000000000..38aab39739 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-platform.service @@ -0,0 +1,13 @@ +[Unit] +Description=Wistron SW-TO3200K Platform Monitoring service +Before=pmon.service +After=sysinit.target +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_sync +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service new file mode 100644 index 0000000000..8d21131db2 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/to3200k-pld.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron SW-TO3200K Platform PLD service +After=platform-modules-sw-to3200k.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_pld +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py new file mode 100644 index 0000000000..9844d26333 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/setup.py @@ -0,0 +1,32 @@ +from setuptools import setup + + +setup( + name='sonic-platform', + version='1.0', + description='SONiC platform API implementation on Wistron SW-TO3200K Platforms', + license='Apache 2.0', + author='SONiC Team', + author_email='sonic_rd@wistron.com', + url='', + maintainer='Wistron SW-TO3200K', + maintainer_email='', + packages=[ + 'sonic_platform' + ], + package_dir={'sonic_platform': 'sonic_platform'}, + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Environment :: Plugins', + 'Intended Audience :: Developers', + 'Intended Audience :: Information Technology', + 'Intended Audience :: System Administrators', + 'License :: OSI Approved :: Apache Software License', + 'Natural Language :: English', + 'Operating System :: POSIX :: Linux', + 'Programming Language :: Python :: 2.7', + 'Topic :: Utilities', + ], + keywords='sonic SONiC platform PLATFORM', +) + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py new file mode 100644 index 0000000000..0c73278ba9 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/__init__.py @@ -0,0 +1,2 @@ +__all__ = ["platform", "chassis", "sfp", "eeprom", "psu", "thermal", "fan", "watchdog"] +from . import platform diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py new file mode 100644 index 0000000000..4effac20b6 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/chassis.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Chassis information which are available in the platform +# +############################################################################# +try: + import sys + import os + import time + import subprocess + from sonic_platform_base.chassis_base import ChassisBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +NUM_FAN = 14 +NUM_PSU = 2 +NUM_THERMAL = 7 +NUM_SFP = 32 +HOST_REBOOT_CAUSE_PATH = "/host/reboot-cause/" +PMON_REBOOT_CAUSE_PATH = "/usr/share/sonic/platform/api_files/reboot-cause/" +REBOOT_CAUSE_FILE = "reboot-cause.txt" +PREV_REBOOT_CAUSE_FILE = "previous-reboot-cause.txt" +HOST_CHK_CMD = "docker > /dev/null 2>&1" +GET_HWSKU_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.hwsku" +GET_PLATFORM_CMD = "sonic-cfggen -d -v DEVICE_METADATA.localhost.platform" + +class Chassis(ChassisBase): + """Platform-specific Chassis class""" + + def __init__(self): + super(Chassis, self).__init__() + + # Initialize SKU name and Platform name + self.sku_name = self._get_sku_name() + self.platform_name = self._get_platform_name() + self.name = self.sku_name + + self._transceiver_presence = [0] * NUM_SFP + + self.__initialize_fan() + self.__initialize_psu() + self.__initialize_thermals() + self.__initialize_sfp() + self.__initialize_eeprom() + + def __initialize_sfp(self): + from sonic_platform.sfp import Sfp + for index in range(0, NUM_SFP): + sfp_module = Sfp(index, 'QSFP_DD') + self._sfp_list.append(sfp_module) + + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, NUM_FAN): + fan = Fan(fan_index) + self._fan_list.append(fan) + + def __initialize_psu(self): + from sonic_platform.psu import Psu + for index in range(0, NUM_PSU): + psu = Psu(index) + self._psu_list.append(psu) + + def __initialize_thermals(self): + from sonic_platform.thermal import Thermal + for index in range(0, NUM_THERMAL): + thermal = Thermal(index) + self._thermal_list.append(thermal) + + def __initialize_eeprom(self): + from sonic_platform.eeprom import Tlv + self._eeprom = Tlv() + + def __is_host(self): + return os.system(HOST_CHK_CMD) == 0 + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return None + + def _get_sku_name(self): + p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def _get_platform_name(self): + p = subprocess.Popen(GET_PLATFORM_CMD, shell=True, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return self.name + + def get_base_mac(self): + """ + Retrieves the base MAC address for the chassis + Returns: + A string containing the MAC address in the format + 'XX:XX:XX:XX:XX:XX' + """ + return self._eeprom.get_mac() + + def get_serial_number(self): + """ + Retrieves the hardware serial number for the chassis + Returns: + A string containing the hardware serial number for this chassis. + """ + return self._eeprom.get_serial() + + def get_system_eeprom_info(self): + """ + Retrieves the full content of system EEPROM information for the chassis + Returns: + A dictionary where keys are the type code defined in + OCP ONIE TlvInfo EEPROM format and values are their corresponding + values. + """ + return self._eeprom.get_eeprom() + + def get_reboot_cause(self): + """ + Retrieves the cause of the previous reboot + + Returns: + A tuple (string, string) where the first element is a string + containing the cause of the previous reboot. This string must be + one of the predefined strings in this class. If the first string + is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used + to pass a description of the reboot cause. + """ + + reboot_cause_path = (HOST_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE) if self.__is_host( + ) else PMON_REBOOT_CAUSE_PATH + REBOOT_CAUSE_FILE + sw_reboot_cause = self.__read_txt_file( + reboot_cause_path) or "Unknown" + + if sw_reboot_cause != "Unknown": + reboot_cause = self.REBOOT_CAUSE_NON_HARDWARE + description = sw_reboot_cause + else: + reboot_cause = self.REBOOT_CAUSE_HARDWARE_OTHER + description = 'Unknown reason' + + return (reboot_cause, description) + + def is_modular_chassis(self): + """ + Retrieves whether the sonic instance is part of modular chassis + Returns: + A bool value, should return False by default or for fixed-platforms. + Should return True for supervisor-cards, line-cards etc running as part + of modular-chassis. + """ + return False + + def get_sfp(self, index): + sfp = None + try: + sfp = self._sfp_list[index] + except IndexError: + sys.stderr.write("SFP index {} out of range (0-{})\n".format(index, len(self._sfp_list)-1)) + + return sfp + + def _get_sfp_presence(self): + port_pres = {} + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + port_pres[port] = sfp.get_presence() + + return port_pres + + def get_change_event(self, timeout=0): + port_dict = {} + ret_dict = {'sfp': port_dict} + forever = False + change_event = False + + if timeout == 0: + forever = True + elif timeout > 0: + timeout = timeout / float(1000) + else: + return False, ret_dict #Incorrect timeout + + while True: + if forever: + timer = 1 + else: + timer = min(timeout, 1) + start_time = time.time() + + time.sleep(timer) + cur_presence = self._get_sfp_presence() + for port in range(0, NUM_SFP): + + if cur_presence[port] != self._transceiver_presence[port]: + change_event = True + if cur_presence[port] == 1: + port_dict[port] = '1' + else: + port_dict[port] = '0' + + self._transceiver_presence = cur_presence + if change_event == True: + break + + if not forever: + elapsed_time = time.time() - start_time + timeout = round(timeout - elapsed_time, 3) + if timeout <= 0: + break + + for port in range(0, NUM_SFP): + sfp = self._sfp_list[port] + sfp.reinit() + + return True, ret_dict diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py new file mode 100644 index 0000000000..448e083712 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/eeprom.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +############################################################################# +# Platform and model specific eeprom subclass, inherits from the base class, +# and provides the followings: +# - the eeprom format definition +# - specific encoder/decoder if there is special need +############################################################################# + +try: + import os + import sys + import re + if sys.version_info[0] >= 3: + from io import StringIO + else: + from cStringIO import StringIO + from sonic_platform_base.sonic_eeprom import eeprom_tlvinfo +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CACHE_ROOT = '/var/cache/sonic/decode-syseeprom' +CACHE_FILE = 'syseeprom_cache' + + +class Tlv(eeprom_tlvinfo.TlvInfoDecoder): + + EEPROM_DECODE_HEADLINES = 6 + + def __init__(self): + self._eeprom_path = "/sys/bus/i2c/devices/0-0056/eeprom" + super(Tlv, self).__init__(self._eeprom_path, 0, '', True) + self._eeprom = self._load_eeprom() + + def __parse_output(self, decode_output): + decode_output.replace('\0', '') + lines = decode_output.split('\n') + lines = lines[self.EEPROM_DECODE_HEADLINES:] + _eeprom_info_dict = dict() + + for line in lines: + try: + match = re.search( + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) + if match is not None: + idx = match.group(1) + value = match.group(3).rstrip('\0') + + _eeprom_info_dict[idx] = value + except BaseException: + pass + return _eeprom_info_dict + + def _load_eeprom(self): + original_stdout = sys.stdout + sys.stdout = StringIO() + err = self.read_eeprom_db() + if err: + # Failed to read EEPROM information from database. Read from cache file + pass + else: + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + return self.__parse_output(decode_output) + + status = self.check_status() + if status < 'ok': + return False + + if not os.path.exists(CACHE_ROOT): + try: + os.makedirs(CACHE_ROOT) + except OSError: + pass + + # + # only the eeprom classes that inherit from eeprom_base + # support caching. Others will work normally + # + try: + self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) + except OSError: + pass + + e = self.read_eeprom() + if e is None: + return 0 + + try: + self.update_cache(e) + except Exception: + pass + self.decode_eeprom(e) + decode_output = sys.stdout.getvalue() + sys.stdout = original_stdout + + (is_valid, valid_crc) = self.is_checksum_valid(e) + if not is_valid: + return False + + return self.__parse_output(decode_output) + + def get_eeprom(self): + return self._eeprom + + def get_serial(self): + return self._eeprom.get('0x23', "Undefined.") + + def get_mac(self): + return self._eeprom.get('0x24', "Undefined.") diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py new file mode 100644 index 0000000000..f5b7f9e80e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan.py @@ -0,0 +1,192 @@ +#!/usr/bin/env python + +############################################################################# +# +# Module contains an implementation of SONiC Platform Base API and +# provides the fan status which are available in the platform +# +############################################################################# + +import os.path + +try: + from sonic_platform_base.fan_base import FanBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FAN_PATH = "/sys/bus/i2c/devices/0-0066/" +FANTRAY_NAME_LIST = ["FANTRAY-1", "FANTRAY-2", + "FANTRAY-3", "FANTRAY-4", + "FANTRAY-5", "FANTRAY-6", "FANTRAY-7"] +FAN_NAME_LIST = ["fan1_front","fan2_front","fan3_front","fan4_front","fan5_front","fan6_front", "fan7_front",\ +"fan1_rear","fan2_rear","fan3_rear","fan4_rear", "fan5_rear", "fan6_rear", "fan7_rear",] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_index): + self.fan_tray_index = fan_index + self.fan_presence = "fan{}_presence" + self.fan_direction = "fan{}_direction" + self.fan_speed_rpm = "fan{}_{}_speed_rpm" + FanBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __write_txt_file(self, file_path, value): + try: + with open(file_path, 'w') as fd: + fd.write(str(value)) + except BaseException: + return False + return True + + def __search_file_by_name(self, directory, file_name): + for dirpath, dirnames, files in os.walk(directory): + for name in files: + file_path = os.path.join(dirpath, name) + if name in file_name: + return file_path + return None + + def get_direction(self): + """ + Retrieves the direction of fan + Returns: + A string, either FAN_DIRECTION_INTAKE or FAN_DIRECTION_EXHAUST + depending on fan direction + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_direction.format(index1+1)) + raw = self.__read_txt_file(fan_direction_file).strip('\r\n') + direction = self.FAN_DIRECTION_INTAKE if str( + raw).upper() == "1" else self.FAN_DIRECTION_EXHAUST + + return direction + + def get_speed(self): + """ + Retrieves the speed of fan as a percentage of full speed + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 12000 (full speed) + """ + if self.fan_tray_index<=6: + index1=self.fan_tray_index + speed = 0 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"front")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + else: + index1=self.fan_tray_index%7 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"rear")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_target_speed(self): + """ + Retrieves the target (expected) speed of the fan + Returns: + An integer, the percentage of full fan speed, in the range 0 (off) + to 100 (full speed) + """ + if self.fan_tray_index<=6: + index1=self.fan_tray_index + speed = 0 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"front")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + else: + index1=self.fan_tray_index%7 + if self.get_presence(): + fan_speed_file = (FAN_PATH + + self.fan_speed_rpm.format(index1+1,"rear")) + speed = self.__read_txt_file(fan_speed_file).strip('\r\n') + + return int(speed) + + def get_speed_tolerance(self): + """ + Retrieves the speed tolerance of the fan + Returns: + An integer, the percentage of variance from target speed which is + considered tolerable + """ + return 10 + + def set_speed(self, speed): + """ + Sets the fan speed + Args: + speed: An integer, the percentage of full fan speed to set fan to, + in the range 0 (off) to 100 (full speed) + Returns: + A boolean, True if speed is set successfully, False if not + + Note: + Depends on pwm or target mode is selected: + 1) pwm = speed_pc * 255 <-- Currently use this mode. + 2) target_pwm = speed_pc * 100 / 255 + 2.1) set pwm{}_enable to 3 + + """ + return False + + def set_status_led(self, color): + """ + Sets the state of the fan module status LED + Args: + color: A string representing the color with which to set the + fan module status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + fan_name = FAN_NAME_LIST[self.fan_tray_index] + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + index1=self.fan_tray_index + if self.fan_tray_index>6: + index1=self.fan_tray_index%7 + fan_direction_file = (FAN_PATH + + self.fan_presence.format(index1+1)) + present_str = self.__read_txt_file(fan_direction_file) or '1' + + return int(present_str) == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + return self.get_presence() and self.get_speed() > 0 diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py new file mode 100644 index 0000000000..44e03cdadb --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/platform.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the platform information +# +############################################################################# + +try: + from sonic_platform_base.platform_base import PlatformBase + from sonic_platform.chassis import Chassis +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Platform(PlatformBase): + """Platform-specific Platform class""" + + def __init__(self): + PlatformBase.__init__(self) + self._chassis = Chassis() diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py new file mode 100644 index 0000000000..c26b82ee4c --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/psu.py @@ -0,0 +1,278 @@ +#!/usr/bin/env python + +############################################################################# +# Module contains an implementation of SONiC Platform Base API and +# provides the PSU information which are available in the platform +############################################################################# + + +try: + from sonic_platform_base.psu_base import PsuBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +PSU_NAME_LIST = ["PSU-1", "PSU-2"] + +class Psu(PsuBase): + """Platform-specific Psu class""" + + SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/0-0051", + "/sys/bus/i2c/devices/0-0052"] + STATUS_PSU_DIR = ["/sys/bus/i2c/devices/0-0059", + "/sys/bus/i2c/devices/0-005a"] + + def __init__(self, psu_index): + self.PSU_TEMP_MAX = 85 * 1000 + self.PSU_OUTPUT_POWER_MAX = 1300 * 1000 + self.PSU_OUTPUT_VOLTAGE_MIN = 11400 + self.PSU_OUTPUT_VOLTAGE_MAX = 12600 + self.index = psu_index + PsuBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def get_fan(self): + """ + Retrieves object representing the fan module contained in this PSU + Returns: + An object dervied from FanBase representing the fan module + contained in this PSU + """ + # Hardware not supported + return False + + def get_powergood_status(self): + """ + Retrieves the powergood status of PSU + Returns: + A boolean, True if PSU has stablized its output voltages and passed all + its internal self-tests, False if not. + """ + return self.get_status() + + def set_status_led(self, color): + """ + Sets the state of the PSU status LED + Args: + color: A string representing the color with which to set the PSU status LED + Note: Only support green and off + Returns: + bool: True if status LED state is set successfully, False if not + """ + # Hardware not supported + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + return PSU_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + attr_file ='psu_present' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as psu_prs: + status = int(psu_prs.read()) + except IOError: + return False + + return status == 1 + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + attr_file = 'psu_power_good' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + status = 0 + try: + with open(attr_path, 'r') as power_status: + status = int(power_status.read()) + except IOError: + return False + + return status == 1 + + def get_model(self): + """ + Retrieves the part number of the PSU + Returns: + string: Part number of PSU + """ + try: + if self.get_presence(): + attr_file = 'psu_model_name' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_serial(self): + """ + Retrieves the serial number of the PSU + Returns: + string: Serial number of PSU + """ + try: + if self.get_presence(): + attr_file = 'psu_serial_number' + attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_voltage(self): + """ + Retrieves current PSU voltage output + Returns: + A int number, the output voltage in volts. + """ + try: + if self.get_presence(): + attr_file = 'psu_v_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_current(self): + """ + Retrieves present electric current supplied by PSU + Returns: + A int number, electric current in amperes + """ + try: + if self.get_presence(): + attr_file = 'psu_i_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_power(self): + """ + Retrieves current energy supplied by PSU + Returns: + A int number, the power in watts. + """ + try: + if self.get_presence(): + attr_file = 'psu_p_out' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_status_led(self): + """ + Gets the state of the PSU status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings. + """ + # TODO + if self.get_presence(): + if self.get_powergood_status(): + return self.STATUS_LED_COLOR_GREEN + else: + return self.STATUS_LED_COLOR_RED + else: + return None + + def get_temperature(self): + """ + Retrieves current temperature reading from PSU + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + try: + if self.get_presence(): + attr_file = 'psu_temp1_input' + attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return int(val) + except Exception as e: + logger.error(str(e)) + + return None + + def get_temperature_high_threshold(self): + """ + Retrieves the high threshold temperature of PSU + Returns: + A float number, the high threshold temperature of PSU in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return float(self.PSU_TEMP_MAX/1000) + + def get_voltage_high_threshold(self): + """ + Retrieves the high threshold PSU voltage output + Returns: + A float number, the high threshold output voltage in volts, + e.g. 12.1 + """ + return float(self.PSU_OUTPUT_VOLTAGE_MAX/1000) + + def get_voltage_low_threshold(self): + """ + Retrieves the low threshold PSU voltage output + Returns: + A float number, the low threshold output voltage in volts, + e.g. 12.1 + """ + return float(self.PSU_OUTPUT_VOLTAGE_MIN/1000) + + def get_maximum_supplied_power(self): + """ + Retrieves the maximum supplied power by PSU + Returns: + A float number, the maximum power output in Watts. + e.g. 1200.1 + """ + return float(self.PSU_OUTPUT_POWER_MAX/1000) + + def get_position_in_parent(self): + """ + Retrieves 1-based relative physical position in parent device. If the agent cannot determine the parent-relative position + for some reason, or if the associated value of entPhysicalContainedIn is '0', then the value '-1' is returned + Returns: + integer: The 1-based relative physical position in parent device or -1 if cannot determine the position + """ + return -1 + + def is_replaceable(self): + return True diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py new file mode 100644 index 0000000000..004bda2ada --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/sfp.py @@ -0,0 +1,1515 @@ +#!/usr/bin/env python + +############################################################################# +# Sfp contains an implementation of SONiC Platform Base API and +# provides the sfp device status which are available in the platform +############################################################################# +try: + from sonic_platform_base.sfp_base import SfpBase + from sonic_platform_base.sonic_sfp.sff8436 import sff8436InterfaceId + from sonic_platform_base.sonic_sfp.sff8436 import sff8436Dom + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_InterfaceId + from sonic_platform_base.sonic_sfp.qsfp_dd import qsfp_dd_Dom + from sonic_platform_base.sonic_sfp.sffbase import sffbase + from sonic_py_common.logger import Logger + import sys +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +# definitions of the offset and width for values in XCVR info eeprom +XCVR_INTFACE_BULK_OFFSET = 0 +XCVR_INTFACE_BULK_WIDTH_QSFP = 20 +XCVR_INTFACE_BULK_WIDTH_SFP = 21 +XCVR_TYPE_OFFSET = 0 +XCVR_TYPE_WIDTH = 1 +XCVR_EXT_TYPE_OFFSET = 1 +XCVR_EXT_TYPE_WIDTH = 1 +XCVR_CONNECTOR_OFFSET = 2 +XCVR_CONNECTOR_WIDTH = 1 +XCVR_COMPLIANCE_CODE_OFFSET = 3 +XCVR_COMPLIANCE_CODE_WIDTH = 8 +XCVR_ENCODING_OFFSET = 11 +XCVR_ENCODING_WIDTH = 1 +XCVR_NBR_OFFSET = 12 +XCVR_NBR_WIDTH = 1 +XCVR_EXT_RATE_SEL_OFFSET = 13 +XCVR_EXT_RATE_SEL_WIDTH = 1 +XCVR_CABLE_LENGTH_OFFSET = 14 +XCVR_CABLE_LENGTH_WIDTH_QSFP = 5 +XCVR_CABLE_LENGTH_WIDTH_SFP = 6 +XCVR_VENDOR_NAME_OFFSET = 20 +XCVR_VENDOR_NAME_WIDTH = 16 +XCVR_VENDOR_OUI_OFFSET = 37 +XCVR_VENDOR_OUI_WIDTH = 3 +XCVR_VENDOR_PN_OFFSET = 40 +XCVR_VENDOR_PN_WIDTH = 16 +XCVR_HW_REV_OFFSET = 56 +XCVR_HW_REV_WIDTH_OSFP = 2 +XCVR_HW_REV_WIDTH_QSFP = 2 +XCVR_HW_REV_WIDTH_SFP = 4 +XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET = 64 +XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH = 1 +XCVR_VENDOR_SN_OFFSET = 68 +XCVR_VENDOR_SN_WIDTH = 16 +XCVR_VENDOR_DATE_OFFSET = 84 +XCVR_VENDOR_DATE_WIDTH = 8 +XCVR_DOM_CAPABILITY_OFFSET = 92 +XCVR_DOM_CAPABILITY_WIDTH = 2 + +# definitions of the offset and width for values in XCVR_QSFP_DD info eeprom +XCVR_EXT_TYPE_OFFSET_QSFP_DD = 72 +XCVR_EXT_TYPE_WIDTH_QSFP_DD = 2 +XCVR_CONNECTOR_OFFSET_QSFP_DD = 75 +XCVR_CONNECTOR_WIDTH_QSFP_DD = 1 +XCVR_CABLE_LENGTH_OFFSET_QSFP_DD = 74 +XCVR_CABLE_LENGTH_WIDTH_QSFP_DD = 1 +XCVR_HW_REV_OFFSET_QSFP_DD = 36 +XCVR_HW_REV_WIDTH_QSFP_DD = 2 +XCVR_VENDOR_DATE_OFFSET_QSFP_DD = 54 +XCVR_VENDOR_DATE_WIDTH_QSFP_DD = 8 +XCVR_DOM_CAPABILITY_OFFSET_QSFP_DD = 2 +XCVR_DOM_CAPABILITY_WIDTH_QSFP_DD = 1 +XCVR_MEDIA_TYPE_OFFSET_QSFP_DD = 85 +XCVR_MEDIA_TYPE_WIDTH_QSFP_DD = 1 +XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD = 86 +XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD = 32 +XCVR_SECOND_APPLICATION_LIST_OFFSET_QSFP_DD = 351 +XCVR_SECOND_APPLICATION_LIST_WIDTH_QSFP_DD = 28 + +XCVR_INTERFACE_DATA_START = 0 +XCVR_INTERFACE_DATA_SIZE = 92 +SFP_MODULE_ADDRA2_OFFSET = 256 +SFP_MODULE_THRESHOLD_OFFSET = 0 +SFP_MODULE_THRESHOLD_WIDTH = 56 + +QSFP_DOM_BULK_DATA_START = 22 +QSFP_DOM_BULK_DATA_SIZE = 36 +SFP_DOM_BULK_DATA_START = 96 +SFP_DOM_BULK_DATA_SIZE = 10 + +QSFP_DD_DOM_BULK_DATA_START = 14 +QSFP_DD_DOM_BULK_DATA_SIZE = 4 + +# definitions of the offset for values in OSFP info eeprom +OSFP_TYPE_OFFSET = 0 +OSFP_VENDOR_NAME_OFFSET = 129 +OSFP_VENDOR_PN_OFFSET = 148 +OSFP_HW_REV_OFFSET = 164 +OSFP_VENDOR_SN_OFFSET = 166 + +# definitions of the offset for values in QSFP_DD info eeprom +QSFP_DD_TYPE_OFFSET = 0 +QSFP_DD_VENDOR_NAME_OFFSET = 1 +QSFP_DD_VENDOR_PN_OFFSET = 20 +QSFP_DD_VENDOR_SN_OFFSET = 38 +QSFP_DD_VENDOR_OUI_OFFSET = 17 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DOM_REV_OFFSET = 1 +QSFP_DOM_REV_WIDTH = 1 +QSFP_TEMPE_OFFSET = 22 +QSFP_TEMPE_WIDTH = 2 +QSFP_VOLT_OFFSET = 26 +QSFP_VOLT_WIDTH = 2 +QSFP_VERSION_COMPLIANCE_OFFSET = 1 +QSFP_VERSION_COMPLIANCE_WIDTH = 2 +QSFP_CHANNL_MON_OFFSET = 34 +QSFP_CHANNL_MON_WIDTH = 16 +QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH = 24 +QSFP_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_CHANNL_DISABLE_STATUS_WIDTH = 1 +QSFP_CHANNL_RX_LOS_STATUS_OFFSET = 3 +QSFP_CHANNL_RX_LOS_STATUS_WIDTH = 1 +QSFP_CHANNL_TX_FAULT_STATUS_OFFSET = 4 +QSFP_CHANNL_TX_FAULT_STATUS_WIDTH = 1 +QSFP_CONTROL_OFFSET = 86 +QSFP_CONTROL_WIDTH = 8 +QSFP_MODULE_MONITOR_OFFSET = 0 +QSFP_MODULE_MONITOR_WIDTH = 9 +QSFP_POWEROVERRIDE_OFFSET = 93 +QSFP_POWEROVERRIDE_WIDTH = 1 +QSFP_POWEROVERRIDE_BIT = 0 +QSFP_POWERSET_BIT = 1 +QSFP_OPTION_VALUE_OFFSET = 192 +QSFP_OPTION_VALUE_WIDTH = 4 + +QSFP_MODULE_UPPER_PAGE3_START = 384 +QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_WIDTH = 24 +QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_WIDTH = 24 + +#definitions of the offset and width for values in DOM info eeprom +QSFP_DD_CHANNL_STATUS_OFFSET = 26 +QSFP_DD_CHANNL_STATUS_WIDTH = 1 + +QSFP_DD_FLAT_MEM = {'offset': 2, 'width': 1, 'page': 'low'} + +QSFP_DD_MODULE_MON = {'offset': 14, 'width': 4, 'page': 'low'} +QSFP_DD_TEMPE_MON = {'offset': 14, 'width': 2, 'page': 'low'} +QSFP_DD_VOLT_MON = {'offset': 16, 'width': 2, 'page': 'low'} + +QSFP_DD_MON_SUPPORT = {'offset': 159, 'width': 2, 'page': 1 } + +QSFP_DD_CHANNL_MON = {'offset': 154, 'width': 48, 'page': 11 } +QSFP_DD_TX_POWER = {'offset': 154, 'width': 16, 'page': 11 } +QSFP_DD_TX_BIAS = {'offset': 170, 'width': 16, 'page': 11 } +QSFP_DD_RX_POWER = {'offset': 186, 'width': 16, 'page': 11 } + +QSFP_DD_MODULE_THRESHOLD = {'offset': 128, 'width': 72, 'page': 2 } + +QSFP_DD_CHANNL_DISABLE_STATUS = {'offset': 130, 'width': 1, 'page': 10 } +QSFP_DD_CHANNL_RX_LOS_STATUS = {'offset': 147, 'width': 1, 'page': 11 } +QSFP_DD_CHANNL_TX_FAULT_STATUS = {'offset': 135, 'width': 1, 'page': 11 } + +QSFP_TYPE_CODE_LIST = [ + '0d', # QSFP+ or later + '11' # QSFP28 or later +] + +QSFP_DD_TYPE_CODE_LIST = [ + '18' # QSFP-DD Double Density 8X Pluggable Transceiver +] + +qsfp_cable_length_tup = ('Length(km)', 'Length OM3(2m)', + 'Length OM2(m)', 'Length OM1(m)', + 'Length Cable Assembly(m)') + +sfp_cable_length_tup = ('LengthSMFkm-UnitsOfKm', 'LengthSMF(UnitsOf100m)', + 'Length50um(UnitsOf10m)', 'Length62.5um(UnitsOfm)', + 'LengthCable(UnitsOfm)', 'LengthOM3(UnitsOf10m)') + +sfp_compliance_code_tup = ('10GEthernetComplianceCode', 'InfinibandComplianceCode', + 'ESCONComplianceCodes', 'SONETComplianceCodes', + 'EthernetComplianceCodes','FibreChannelLinkLength', + 'FibreChannelTechnology', 'SFP+CableTechnology', + 'FibreChannelTransmissionMedia','FibreChannelSpeed') + +qsfp_compliance_code_tup = ('10/40G Ethernet Compliance Code', 'SONET Compliance codes', + 'SAS/SATA compliance codes', 'Gigabit Ethernet Compliant codes', + 'Fibre Channel link length/Transmitter Technology', + 'Fibre Channel transmission media', 'Fibre Channel Speed') + +QSFP_TYPE = "QSFP" +QSFP_DD_TYPE = "QSFP_DD" + +# Global logger class instance +logger = Logger() +class ext_qsfp_dd(sffbase): + version = '1.0' + + qsfp_dd_mon_capability = { + 'Tx_bias_support': + {'offset': 1, + 'bit': 0, + 'type': 'bitvalue'}, + 'Tx_power_support': + {'offset': 1, + 'bit': 1, + 'type': 'bitvalue'}, + 'Rx_power_support': + {'offset': 1, + 'bit': 2, + 'type': 'bitvalue'}, + 'Voltage_support': + {'offset': 0, + 'bit': 1, + 'type': 'bitvalue'}, + 'Temp_support': + {'offset': 0, + 'bit': 0, + 'type': 'bitvalue'} + } + + def parse_mon_capability(self, sn_raw_data, start_pos): + return sffbase.parse(self, self.qsfp_dd_mon_capability, sn_raw_data, start_pos) + + +class Sfp(SfpBase): + """Platform-specific Sfp class""" + + # Port number + PORT_START = 0 + PORT_END = 31 + + port_to_i2c_mapping = { + 0: 10, + 1: 11, + 2: 12, + 3: 13, + 4: 14, + 5: 15, + 6: 16, + 7: 17, + 8: 18, + 9: 19, + 10: 20, + 11: 21, + 12: 22, + 13: 23, + 14: 24, + 15: 25, + 16: 26, + 17: 27, + 18: 28, + 19: 29, + 20: 30, + 21: 31, + 22: 32, + 23: 33, + 24: 34, + 25: 35, + 26: 36, + 27: 37, + 28: 38, + 29: 39, + 30: 40, + 31: 41, + } + + _sfp_port = range(32, PORT_END + 1) + RESET_1_16_PATH = "/sys/bus/i2c/devices/0-0061/module_reset_{}" + RESET_17_32_PATH = "/sys/bus/i2c/devices/0-0062/module_reset_{}" + PRS_1_16_PATH = "/sys/bus/i2c/devices/0-0061/module_present_{}" + PRS_17_32_PATH = "/sys/bus/i2c/devices/0-0062/module_present_{}" + + def __init__(self, sfp_index, sfp_type): + # Init index + self.index = sfp_index + self.port_num = self.index + 1 + + # Init eeprom path + eeprom_low_path = '/sys/bus/i2c/devices/0-00{}/eeprom_low' + eeprom_0_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg0' + eeprom_1_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg1' + eeprom_2_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg2' + eeprom_3_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg3' + eeprom_11_path = '/sys/bus/i2c/devices/0-00{}/eeprom_pg11' + name_path = '/sys/bus/i2c/devices/0-00{}/port_name' + self.port_to_eeprom_low_mapping = {} + self.port_to_eeprom_0_mapping = {} + self.port_to_eeprom_1_mapping = {} + self.port_to_eeprom_2_mapping = {} + self.port_to_eeprom_3_mapping = {} + self.port_to_eeprom_11_mapping = {} + self.port_to_name_mapping = {} + for x in range(self.PORT_START, self.PORT_END + 1): + p_num = x - 1 if self.PORT_START == 1 else x + self.port_to_eeprom_low_mapping[p_num] = eeprom_low_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_0_mapping[p_num] = eeprom_0_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_1_mapping[p_num] = eeprom_1_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_2_mapping[p_num] = eeprom_2_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_3_mapping[p_num] = eeprom_3_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_eeprom_11_mapping[p_num] = eeprom_11_path.format(self.port_to_i2c_mapping[p_num]) + self.port_to_name_mapping[p_num] = name_path.format(self.port_to_i2c_mapping[p_num]) + + self._detect_sfp_type(sfp_type) + self._dom_capability_detect() + SfpBase.__init__(self) + + def reinit(self): + self._detect_sfp_type(self.sfp_type) + self._dom_capability_detect() + + def get_presence(self): + """ + Retrieves the presence of the SFP + Returns: + bool: True if SFP is present, False if not + """ + presence = False + try: + if self.index < 16: + pres_path=self.PRS_1_16_PATH.format(self.port_num) + else: + pres_path=self.PRS_17_32_PATH.format(self.port_num) + with open(pres_path, 'r') as sfp_presence: + presence = int(sfp_presence.read(), 16) + except IOError: + return False + logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) + return presence + + def _read_eeprom_specific_bytes(self, offset, num_bytes, page = 0): + sysfsfile_eeprom = None + eeprom_raw = [] + for i in range(0, num_bytes): + eeprom_raw.append("0x00") + + if offset < 128: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_low_mapping[self.index] + elif page == 0 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_0_mapping[self.index] + offset = offset - 128 + elif page == 1 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_1_mapping[self.index] + offset = offset - 128 + elif page == 2 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_2_mapping[self.index] + offset = offset - 128 + elif page == 3 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_3_mapping[self.index] + offset = offset - 128 + + elif page == 11 : + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_11_mapping[self.index] + offset = offset - 128 + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom_low_mapping[self.index] + offset = offset - 128 + + try: + sysfsfile_eeprom = open(sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) + sysfsfile_eeprom.seek(offset) + raw = sysfsfile_eeprom.read(num_bytes) + if sys.version_info[0] >= 3: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(raw[n])[2:].zfill(2) + else: + for n in range(0, num_bytes): + eeprom_raw[n] = hex(ord(raw[n]))[2:].zfill(2) + + except BaseException: + pass + finally: + if sysfsfile_eeprom: + sysfsfile_eeprom.close() + + return eeprom_raw + + def _detect_sfp_type(self, sfp_type): + eeprom_raw = [] + eeprom_raw = self._read_eeprom_specific_bytes(XCVR_TYPE_OFFSET, XCVR_TYPE_WIDTH) + if eeprom_raw: + if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: + self.sfp_type = QSFP_TYPE + elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: + self.sfp_type = QSFP_DD_TYPE + else: + # we don't regonize this identifier value, treat the xSFP module as the default type + self.sfp_type = sfp_type + logger.log_info("Identifier value of {} module {} is {} which isn't regonized and will be treated as default type ({})".format( + sfp_type, self.index, eeprom_raw[0], sfp_type + )) + else: + # eeprom_raw being None indicates the module is not present. + # in this case we treat it as the default type according to the SKU + self.sfp_type = sfp_type + + def _dom_capability_detect(self): + + self.dom_channel_monitor_supported = True + self.dom_module_monitor_supported = True + self.dom_channel_treshold_supported = True + self.dom_module_treshold_supported = True + + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_bias_supported = False + self.dom_tx_power_supported = False + self.dom_thresholds_supported =False + + + if self.sfp_type == QSFP_TYPE: + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + offset = 128 + + # QSFP capability byte parse, through this byte can know whether it support tx_power or not. + # TODO: in the future when decided to migrate to support SFF-8636 instead of SFF-8436, + # need to add more code for determining the capability and version compliance + # in SFF-8636 dom capability definitions evolving with the versions. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes((offset + XCVR_DOM_CAPABILITY_OFFSET), XCVR_DOM_CAPABILITY_WIDTH) + if qsfp_dom_capability_raw is not None: + qsfp_version_compliance_raw = self._read_eeprom_specific_bytes(QSFP_VERSION_COMPLIANCE_OFFSET, QSFP_VERSION_COMPLIANCE_WIDTH) + qsfp_version_compliance = int(qsfp_version_compliance_raw[0], 16) + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if qsfp_version_compliance >= 0x08: + self.dom_temp_supported = dom_capability['data']['Temp_support']['value'] == 'On' + self.dom_volt_supported = dom_capability['data']['Voltage_support']['value'] == 'On' + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = dom_capability['data']['Tx_power_support']['value'] == 'On' + else: + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_rx_power_supported = dom_capability['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = True + self.dom_supported = True + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + qsfp_option_value_raw = self._read_eeprom_specific_bytes(QSFP_OPTION_VALUE_OFFSET, QSFP_OPTION_VALUE_WIDTH) + if qsfp_option_value_raw is not None: + optional_capability = sfpd_obj.parse_option_params(qsfp_option_value_raw, 0) + self.dom_tx_disable_supported = optional_capability['data']['TxDisable']['value'] == 'On' + dom_status_indicator = sfpd_obj.parse_dom_status_indicator(qsfp_version_compliance_raw, 1) + self.qsfp_page3_available = dom_status_indicator['data']['FlatMem']['value'] == 'Off' + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + self.qsfp_page3_available = False + + elif self.sfp_type == QSFP_DD_TYPE: + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + self.dom_supported = False + + self.dom_temp_supported = True + self.dom_volt_supported = True + + # two types of QSFP-DD cable types supported: Copper and Optical. + qsfp_dom_capability_raw = self._read_eeprom_specific_bytes(QSFP_DD_FLAT_MEM['offset'], QSFP_DD_FLAT_MEM['width'], QSFP_DD_FLAT_MEM['page']) + if qsfp_dom_capability_raw is not None: + dom_capability = sfpi_obj.parse_qsfp_dom_capability(qsfp_dom_capability_raw, 0) + if dom_capability['data']['Flat_MEM']['value'] == 'Off': + + ext_dd = ext_qsfp_dd() + mon_sup_raw = self._read_eeprom_specific_bytes(QSFP_DD_MON_SUPPORT['offset'], QSFP_DD_MON_SUPPORT['width'], QSFP_DD_MON_SUPPORT['page']) + mon_sup_data = ext_dd.parse_mon_capability(mon_sup_raw, 0) + + self.dom_thresholds_supported = mon_sup_data['data']['Tx_power_support']['value'] == 'On' + self.dom_rx_power_supported = mon_sup_data['data']['Tx_power_support']['value'] == 'On' + self.dom_tx_power_supported = mon_sup_data['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_bias_supported = mon_sup_data['data']['Tx_bias_support']['value'] == 'On' + #self.dom_temp_supported = mon_sup_data['data']['Temp_support']['value'] == 'On' + #self.dom_volt_supported = mon_sup_data['data']['Voltage_support']['value'] == 'On' + self.dom_supported = True + + else: + self.dom_supported = False + self.dom_temp_supported = False + self.dom_volt_supported = False + self.dom_rx_power_supported = False + self.dom_tx_power_supported = False + + def _convert_string_to_num(self, value_str): + if "-inf" in value_str: + return 'N/A' + elif "Unknown" in value_str: + return 'N/A' + elif 'dBm' in value_str: + t_str = value_str.rstrip('dBm') + return float(t_str) + elif 'mA' in value_str: + t_str = value_str.rstrip('mA') + return float(t_str) + elif 'C' in value_str: + t_str = value_str.rstrip('C') + return float(t_str) + elif 'Volts' in value_str: + t_str = value_str.rstrip('Volts') + return float(t_str) + else: + return 'N/A' + + def get_transceiver_info(self): + """ + Retrieves transceiver info of this SFP + + Returns: + A dict which contains following keys/values : + ================================================================================ + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + type |1*255VCHAR |type of SFP + hardware_rev |1*255VCHAR |hardware version of SFP + serial |1*255VCHAR |serial number of the SFP + manufacturer |1*255VCHAR |SFP vendor name + model |1*255VCHAR |SFP model name + connector |1*255VCHAR |connector information + encoding |1*255VCHAR |encoding information + ext_identifier |1*255VCHAR |extend identifier + ext_rateselect_compliance |1*255VCHAR |extended rateSelect compliance + cable_length |INT |cable length in m + mominal_bit_rate |INT |nominal bit rate by 100Mbs + specification_compliance |1*255VCHAR |specification compliance + vendor_date |1*255VCHAR |vendor date + vendor_oui |1*255VCHAR |vendor OUI + application_advertisement |1*255VCHAR |supported applications advertisement + ================================================================================ + """ + transceiver_info_dict = {} + compliance_code_dict = {} + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 128 + vendor_rev_width = XCVR_HW_REV_WIDTH_QSFP + interface_info_bulk_width = XCVR_INTFACE_BULK_WIDTH_QSFP + + sfpi_obj = sff8436InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_interface_bulk_raw = self._read_eeprom_specific_bytes(offset + XCVR_INTERFACE_DATA_START, XCVR_INTERFACE_DATA_SIZE) + if sfp_interface_bulk_raw is None: + return None + + start = XCVR_INTFACE_BULK_OFFSET - XCVR_INTERFACE_DATA_START + end = start + interface_info_bulk_width + sfp_interface_bulk_data = sfpi_obj.parse_sfp_info_bulk(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_NAME_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_NAME_WIDTH + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_PN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_PN_WIDTH + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_HW_REV_OFFSET - XCVR_INTERFACE_DATA_START + end = start + vendor_rev_width + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_SN_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_SN_WIDTH + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_OUI_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_OUI_WIDTH + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_interface_bulk_raw[start : end], 0) + + start = XCVR_VENDOR_DATE_OFFSET - XCVR_INTERFACE_DATA_START + end = start + XCVR_VENDOR_DATE_WIDTH + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_interface_bulk_raw[start : end], 0) + + transceiver_info_dict['type'] = sfp_interface_bulk_data['data']['type']['value'] + transceiver_info_dict['manufacturer'] = sfp_vendor_name_data['data']['Vendor Name']['value'] + transceiver_info_dict['model'] = sfp_vendor_pn_data['data']['Vendor PN']['value'] + transceiver_info_dict['hardware_rev'] = sfp_vendor_rev_data['data']['Vendor Rev']['value'] + transceiver_info_dict['serial'] = sfp_vendor_sn_data['data']['Vendor SN']['value'] + transceiver_info_dict['vendor_oui'] = sfp_vendor_oui_data['data']['Vendor OUI']['value'] + transceiver_info_dict['vendor_date'] = sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value'] + transceiver_info_dict['connector'] = sfp_interface_bulk_data['data']['Connector']['value'] + transceiver_info_dict['encoding'] = sfp_interface_bulk_data['data']['EncodingCodes']['value'] + transceiver_info_dict['ext_identifier'] = sfp_interface_bulk_data['data']['Extended Identifier']['value'] + transceiver_info_dict['ext_rateselect_compliance'] = sfp_interface_bulk_data['data']['RateIdentifier']['value'] + transceiver_info_dict['application_advertisement'] = 'N/A' + + for key in qsfp_cable_length_tup: + if key in sfp_interface_bulk_data['data']: + transceiver_info_dict['cable_type'] = key + transceiver_info_dict['cable_length'] = str(sfp_interface_bulk_data['data'][key]['value']) + + for key in qsfp_compliance_code_tup: + if key in sfp_interface_bulk_data['data']['Specification compliance']['value']: + compliance_code_dict[key] = sfp_interface_bulk_data['data']['Specification compliance']['value'][key]['value'] + sfp_ext_specification_compliance_raw = self._read_eeprom_specific_bytes(offset + XCVR_EXT_SPECIFICATION_COMPLIANCE_OFFSET, XCVR_EXT_SPECIFICATION_COMPLIANCE_WIDTH) + if sfp_ext_specification_compliance_raw is not None: + sfp_ext_specification_compliance_data = sfpi_obj.parse_ext_specification_compliance(sfp_ext_specification_compliance_raw[0 : 1], 0) + if sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] != "Unspecified": + compliance_code_dict['Extended Specification compliance'] = sfp_ext_specification_compliance_data['data']['Extended Specification compliance']['value'] + transceiver_info_dict['specification_compliance'] = str(compliance_code_dict) + transceiver_info_dict['nominal_bit_rate'] = str(sfp_interface_bulk_data['data']['Nominal Bit Rate(100Mbs)']['value']) + + #QSFP-DD + else: + offset = 128 + + sfpi_obj = qsfp_dd_InterfaceId() + if sfpi_obj is None: + print("Error: sfp_object open failed") + return None + + sfp_type_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TYPE_OFFSET), XCVR_TYPE_WIDTH) + if sfp_type_raw is not None: + sfp_type_data = sfpi_obj.parse_sfp_type(sfp_type_raw, 0) + else: + return None + + sfp_vendor_name_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_NAME_OFFSET), XCVR_VENDOR_NAME_WIDTH) + if sfp_vendor_name_raw is not None: + sfp_vendor_name_data = sfpi_obj.parse_vendor_name(sfp_vendor_name_raw, 0) + else: + return None + + sfp_vendor_pn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_PN_OFFSET), XCVR_VENDOR_PN_WIDTH) + if sfp_vendor_pn_raw is not None: + sfp_vendor_pn_data = sfpi_obj.parse_vendor_pn(sfp_vendor_pn_raw, 0) + else: + return None + + sfp_vendor_rev_raw = self._read_eeprom_specific_bytes((offset + XCVR_HW_REV_OFFSET_QSFP_DD), XCVR_HW_REV_WIDTH_QSFP_DD) + if sfp_vendor_rev_raw is not None: + sfp_vendor_rev_data = sfpi_obj.parse_vendor_rev(sfp_vendor_rev_raw, 0) + else: + return None + + sfp_vendor_sn_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_SN_OFFSET), XCVR_VENDOR_SN_WIDTH) + if sfp_vendor_sn_raw is not None: + sfp_vendor_sn_data = sfpi_obj.parse_vendor_sn(sfp_vendor_sn_raw, 0) + else: + return None + + sfp_vendor_oui_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VENDOR_OUI_OFFSET), XCVR_VENDOR_OUI_WIDTH) + if sfp_vendor_oui_raw is not None: + sfp_vendor_oui_data = sfpi_obj.parse_vendor_oui(sfp_vendor_oui_raw, 0) + else: + return None + + sfp_vendor_date_raw = self._read_eeprom_specific_bytes((offset + XCVR_VENDOR_DATE_OFFSET_QSFP_DD), XCVR_VENDOR_DATE_WIDTH_QSFP_DD) + if sfp_vendor_date_raw is not None: + sfp_vendor_date_data = sfpi_obj.parse_vendor_date(sfp_vendor_date_raw, 0) + else: + return None + + sfp_connector_raw = self._read_eeprom_specific_bytes((offset + XCVR_CONNECTOR_OFFSET_QSFP_DD), XCVR_CONNECTOR_WIDTH_QSFP_DD) + if sfp_connector_raw is not None: + sfp_connector_data = sfpi_obj.parse_connector(sfp_connector_raw, 0) + else: + return None + + sfp_ext_identifier_raw = self._read_eeprom_specific_bytes((offset + XCVR_EXT_TYPE_OFFSET_QSFP_DD), XCVR_EXT_TYPE_WIDTH_QSFP_DD) + if sfp_ext_identifier_raw is not None: + sfp_ext_identifier_data = sfpi_obj.parse_ext_iden(sfp_ext_identifier_raw, 0) + else: + return None + + sfp_cable_len_raw = self._read_eeprom_specific_bytes((offset + XCVR_CABLE_LENGTH_OFFSET_QSFP_DD), XCVR_CABLE_LENGTH_WIDTH_QSFP_DD) + if sfp_cable_len_raw is not None: + sfp_cable_len_data = sfpi_obj.parse_cable_len(sfp_cable_len_raw, 0) + else: + return None + + sfp_media_type_raw = self._read_eeprom_specific_bytes(XCVR_MEDIA_TYPE_OFFSET_QSFP_DD, XCVR_MEDIA_TYPE_WIDTH_QSFP_DD) + if sfp_media_type_raw is not None: + sfp_media_type_dict = sfpi_obj.parse_media_type(sfp_media_type_raw, 0) + if sfp_media_type_dict is None: + return None + + host_media_list = "" + sfp_application_type_first_list = self._read_eeprom_specific_bytes((XCVR_FIRST_APPLICATION_LIST_OFFSET_QSFP_DD), XCVR_FIRST_APPLICATION_LIST_WIDTH_QSFP_DD) + possible_application_count = 8 + if sfp_application_type_first_list is not None: + sfp_application_type_list = sfp_application_type_first_list + else: + return None + + for i in range(0, possible_application_count): + if sfp_application_type_list[i * 4] == 'ff': + break + host_electrical, media_interface = sfpi_obj.parse_application(sfp_media_type_dict, sfp_application_type_list[i * 4], sfp_application_type_list[i * 4 + 1]) + host_media_list = host_media_list + host_electrical + ' - ' + media_interface + '\n\t\t\t\t ' + else: + return None + + transceiver_info_dict['type'] = str(sfp_type_data['data']['type']['value']) + transceiver_info_dict['manufacturer'] = str(sfp_vendor_name_data['data']['Vendor Name']['value']) + transceiver_info_dict['model'] = str(sfp_vendor_pn_data['data']['Vendor PN']['value']) + transceiver_info_dict['hardware_rev'] = str(sfp_vendor_rev_data['data']['Vendor Rev']['value']) + transceiver_info_dict['serial'] = str(sfp_vendor_sn_data['data']['Vendor SN']['value']) + transceiver_info_dict['vendor_oui'] = str(sfp_vendor_oui_data['data']['Vendor OUI']['value']) + transceiver_info_dict['vendor_date'] = str(sfp_vendor_date_data['data']['VendorDataCode(YYYY-MM-DD Lot)']['value']) + transceiver_info_dict['connector'] = str(sfp_connector_data['data']['Connector']['value']) + transceiver_info_dict['encoding'] = "Not supported for CMIS cables" + transceiver_info_dict['ext_identifier'] = str(sfp_ext_identifier_data['data']['Extended Identifier']['value']) + transceiver_info_dict['ext_rateselect_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['specification_compliance'] = "Not supported for CMIS cables" + transceiver_info_dict['cable_type'] = "Length Cable Assembly(m)" + transceiver_info_dict['cable_length'] = str(sfp_cable_len_data['data']['Length Cable Assembly(m)']['value']) + transceiver_info_dict['nominal_bit_rate'] = "Not supported for CMIS cables" + transceiver_info_dict['application_advertisement'] = host_media_list + + return transceiver_info_dict + + def get_transceiver_bulk_status(self): + """ + Retrieves transceiver bulk status of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + RX LOS |BOOLEAN |RX lost-of-signal status, + | |True if has RX los, False if not. + TX FAULT |BOOLEAN |TX fault status, + | |True if has TX fault, False if not. + Reset status |BOOLEAN |reset status, + | |True if SFP in reset, False if not. + LP mode |BOOLEAN |low power mode status, + | |True in lp mode, False if not. + TX disable |BOOLEAN |TX disable status, + | |True TX disabled, False if not. + TX disabled channel |HEX |disabled TX channles in hex, + | |bits 0 to 3 represent channel 0 + | |to channel 3. + Temperature |INT |module temperature in Celsius + Voltage |INT |supply voltage in mV + TX bias |INT |TX Bias Current in mA + RX power |INT |received optical power in mW + TX power |INT |TX output power in mW + ======================================================================== + """ + transceiver_dom_info_dict = {} + + dom_info_dict_keys = ['temperature', 'voltage', + 'rx1power', 'rx2power', + 'rx3power', 'rx4power', + 'rx5power', 'rx6power', + 'rx7power', 'rx8power', + 'tx1bias', 'tx2bias', + 'tx3bias', 'tx4bias', + 'tx5bias', 'tx6bias', + 'tx7bias', 'tx8bias', + 'tx1power', 'tx2power', + 'tx3power', 'tx4power', + 'tx5power', 'tx6power', + 'tx7power', 'tx8power' + ] + transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported: + return transceiver_dom_info_dict + + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DOM_BULK_DATA_START), QSFP_DOM_BULK_DATA_SIZE) + if dom_data_raw is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + if self.dom_temp_supported: + start = QSFP_TEMPE_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_TEMPE_WIDTH + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw[start : end], 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + start = QSFP_VOLT_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_VOLT_WIDTH + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw[start : end], 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + start = QSFP_CHANNL_MON_OFFSET - QSFP_DOM_BULK_DATA_START + end = start + QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_data_raw[start : end], 0) + + if self.dom_tx_power_supported: + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + transceiver_dom_info_dict['tx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value']) + transceiver_dom_info_dict['tx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value']) + transceiver_dom_info_dict['tx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value']) + transceiver_dom_info_dict['tx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value']) + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value']) + transceiver_dom_info_dict['rx2power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value']) + transceiver_dom_info_dict['rx3power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value']) + transceiver_dom_info_dict['rx4power'] = self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value']) + + + #QSFP-DD + else: + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_info_dict + + if self.dom_module_monitor_supported: + + if self.dom_temp_supported: + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_TEMPE_MON['offset'], QSFP_DD_TEMPE_MON['width'], QSFP_DD_TEMPE_MON['page']) + dom_temperature_data = sfpd_obj.parse_temperature(dom_data_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + if temp is not None: + transceiver_dom_info_dict['temperature'] = temp + + if self.dom_volt_supported: + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_VOLT_MON['offset'], QSFP_DD_VOLT_MON['width'], QSFP_DD_VOLT_MON['page']) + dom_voltage_data = sfpd_obj.parse_voltage(dom_data_raw, 0) + volt = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + if volt is not None: + transceiver_dom_info_dict['voltage'] = volt + if self.dom_channel_monitor_supported: + + dom_data_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_MON['offset'], QSFP_DD_CHANNL_MON['width'], QSFP_DD_CHANNL_MON['page']) + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw, 0) + if self.dom_rx_power_supported: + transceiver_dom_info_dict['tx1power'] = dom_channel_monitor_data['data']['TX1Power']['value'] + transceiver_dom_info_dict['tx2power'] = dom_channel_monitor_data['data']['TX2Power']['value'] + transceiver_dom_info_dict['tx3power'] = dom_channel_monitor_data['data']['TX3Power']['value'] + transceiver_dom_info_dict['tx4power'] = dom_channel_monitor_data['data']['TX4Power']['value'] + transceiver_dom_info_dict['tx5power'] = dom_channel_monitor_data['data']['TX5Power']['value'] + transceiver_dom_info_dict['tx6power'] = dom_channel_monitor_data['data']['TX6Power']['value'] + transceiver_dom_info_dict['tx7power'] = dom_channel_monitor_data['data']['TX7Power']['value'] + transceiver_dom_info_dict['tx8power'] = dom_channel_monitor_data['data']['TX8Power']['value'] + + if self.dom_rx_power_supported: + transceiver_dom_info_dict['rx1power'] = dom_channel_monitor_data['data']['RX1Power']['value'] + transceiver_dom_info_dict['rx2power'] = dom_channel_monitor_data['data']['RX2Power']['value'] + transceiver_dom_info_dict['rx3power'] = dom_channel_monitor_data['data']['RX3Power']['value'] + transceiver_dom_info_dict['rx4power'] = dom_channel_monitor_data['data']['RX4Power']['value'] + transceiver_dom_info_dict['rx5power'] = dom_channel_monitor_data['data']['RX5Power']['value'] + transceiver_dom_info_dict['rx6power'] = dom_channel_monitor_data['data']['RX6Power']['value'] + transceiver_dom_info_dict['rx7power'] = dom_channel_monitor_data['data']['RX7Power']['value'] + transceiver_dom_info_dict['rx8power'] = dom_channel_monitor_data['data']['RX8Power']['value'] + + if self.dom_tx_bias_supported: + transceiver_dom_info_dict['tx1bias'] = dom_channel_monitor_data['data']['TX1Bias']['value'] + transceiver_dom_info_dict['tx2bias'] = dom_channel_monitor_data['data']['TX2Bias']['value'] + transceiver_dom_info_dict['tx3bias'] = dom_channel_monitor_data['data']['TX3Bias']['value'] + transceiver_dom_info_dict['tx4bias'] = dom_channel_monitor_data['data']['TX4Bias']['value'] + transceiver_dom_info_dict['tx5bias'] = dom_channel_monitor_data['data']['TX5Bias']['value'] + transceiver_dom_info_dict['tx6bias'] = dom_channel_monitor_data['data']['TX6Bias']['value'] + transceiver_dom_info_dict['tx7bias'] = dom_channel_monitor_data['data']['TX7Bias']['value'] + transceiver_dom_info_dict['tx8bias'] = dom_channel_monitor_data['data']['TX8Bias']['value'] + + return transceiver_dom_info_dict + + def get_transceiver_threshold_info(self): + """ + Retrieves transceiver threshold info of this SFP + + Returns: + A dict which contains following keys/values : + ======================================================================== + keys |Value Format |Information + ---------------------------|---------------|---------------------------- + temphighalarm |FLOAT |High Alarm Threshold value of temperature in Celsius. + templowalarm |FLOAT |Low Alarm Threshold value of temperature in Celsius. + temphighwarning |FLOAT |High Warning Threshold value of temperature in Celsius. + templowwarning |FLOAT |Low Warning Threshold value of temperature in Celsius. + vcchighalarm |FLOAT |High Alarm Threshold value of supply voltage in mV. + vcclowalarm |FLOAT |Low Alarm Threshold value of supply voltage in mV. + vcchighwarning |FLOAT |High Warning Threshold value of supply voltage in mV. + vcclowwarning |FLOAT |Low Warning Threshold value of supply voltage in mV. + rxpowerhighalarm |FLOAT |High Alarm Threshold value of received power in dBm. + rxpowerlowalarm |FLOAT |Low Alarm Threshold value of received power in dBm. + rxpowerhighwarning |FLOAT |High Warning Threshold value of received power in dBm. + rxpowerlowwarning |FLOAT |Low Warning Threshold value of received power in dBm. + txpowerhighalarm |FLOAT |High Alarm Threshold value of transmit power in dBm. + txpowerlowalarm |FLOAT |Low Alarm Threshold value of transmit power in dBm. + txpowerhighwarning |FLOAT |High Warning Threshold value of transmit power in dBm. + txpowerlowwarning |FLOAT |Low Warning Threshold value of transmit power in dBm. + txbiashighalarm |FLOAT |High Alarm Threshold value of tx Bias Current in mA. + txbiaslowalarm |FLOAT |Low Alarm Threshold value of tx Bias Current in mA. + txbiashighwarning |FLOAT |High Warning Threshold value of tx Bias Current in mA. + txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. + ======================================================================== + """ + transceiver_dom_threshold_info_dict = {} + + dom_info_dict_keys = ['temphighalarm', 'temphighwarning', + 'templowalarm', 'templowwarning', + 'vcchighalarm', 'vcchighwarning', + 'vcclowalarm', 'vcclowwarning', + 'rxpowerhighalarm', 'rxpowerhighwarning', + 'rxpowerlowalarm', 'rxpowerlowwarning', + 'txpowerhighalarm', 'txpowerhighwarning', + 'txpowerlowalarm', 'txpowerlowwarning', + 'txbiashighalarm', 'txbiashighwarning', + 'txbiaslowalarm', 'txbiaslowwarning' + ] + transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A') + + #QSFP + if self.sfp_type == QSFP_TYPE: + if not self.dom_supported or not self.qsfp_page3_available: + return transceiver_dom_threshold_info_dict + + # Dom Threshold data starts from offset 384 + # Revert offset back to 0 once data is retrieved + offset = 0 + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_MODULE_THRESHOLD_OFFSET), QSFP_MODULE_THRESHOLD_WIDTH, 3) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + dom_channel_threshold_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_THRESHOLD_OFFSET), QSFP_CHANNL_THRESHOLD_WIDTH, 3) + if dom_channel_threshold_raw is None: + return transceiver_dom_threshold_info_dict + dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_channel_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_channel_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_channel_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_channel_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_channel_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_channel_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_channel_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_channel_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_channel_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_channel_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_channel_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_channel_threshold_data['data']['TxPowerLowWarning']['value'] + + #QSFP-DD + else: + if not self.dom_supported: + return transceiver_dom_threshold_info_dict + + if not self.dom_thresholds_supported: + return transceiver_dom_threshold_info_dict + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return transceiver_dom_threshold_info_dict + + # page 02 (we put page 2 to byte 256~384) + dom_module_threshold_raw = self._read_eeprom_specific_bytes(QSFP_DD_MODULE_THRESHOLD['offset'], QSFP_DD_MODULE_THRESHOLD['width'], QSFP_DD_MODULE_THRESHOLD['page']) + if dom_module_threshold_raw is None: + return transceiver_dom_threshold_info_dict + + dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) + + # Threshold Data + if self.dom_module_treshold_supported: + transceiver_dom_threshold_info_dict['temphighalarm'] = dom_module_threshold_data['data']['TempHighAlarm']['value'] + transceiver_dom_threshold_info_dict['temphighwarning'] = dom_module_threshold_data['data']['TempHighWarning']['value'] + transceiver_dom_threshold_info_dict['templowalarm'] = dom_module_threshold_data['data']['TempLowAlarm']['value'] + transceiver_dom_threshold_info_dict['templowwarning'] = dom_module_threshold_data['data']['TempLowWarning']['value'] + transceiver_dom_threshold_info_dict['vcchighalarm'] = dom_module_threshold_data['data']['VccHighAlarm']['value'] + transceiver_dom_threshold_info_dict['vcchighwarning'] = dom_module_threshold_data['data']['VccHighWarning']['value'] + transceiver_dom_threshold_info_dict['vcclowalarm'] = dom_module_threshold_data['data']['VccLowAlarm']['value'] + transceiver_dom_threshold_info_dict['vcclowwarning'] = dom_module_threshold_data['data']['VccLowWarning']['value'] + if self.dom_channel_treshold_supported: + transceiver_dom_threshold_info_dict['rxpowerhighalarm'] = dom_module_threshold_data['data']['RxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerhighwarning'] = dom_module_threshold_data['data']['RxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowalarm'] = dom_module_threshold_data['data']['RxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['rxpowerlowwarning'] = dom_module_threshold_data['data']['RxPowerLowWarning']['value'] + transceiver_dom_threshold_info_dict['txbiashighalarm'] = dom_module_threshold_data['data']['TxBiasHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiashighwarning'] = dom_module_threshold_data['data']['TxBiasHighWarning']['value'] + transceiver_dom_threshold_info_dict['txbiaslowalarm'] = dom_module_threshold_data['data']['TxBiasLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txbiaslowwarning'] = dom_module_threshold_data['data']['TxBiasLowWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerhighalarm'] = dom_module_threshold_data['data']['TxPowerHighAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerhighwarning'] = dom_module_threshold_data['data']['TxPowerHighWarning']['value'] + transceiver_dom_threshold_info_dict['txpowerlowalarm'] = dom_module_threshold_data['data']['TxPowerLowAlarm']['value'] + transceiver_dom_threshold_info_dict['txpowerlowwarning'] = dom_module_threshold_data['data']['TxPowerLowWarning']['value'] + + return transceiver_dom_threshold_info_dict + + def get_reset_status(self): + """ + Retrieves the reset status of SFP + Returns: + A Boolean, True if reset enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_rx_los(self): + """ + Retrieves the RX LOS (lost-of-signal) status of SFP + + Returns: + A Boolean, True if SFP has RX LOS, False if not. + Note : RX LOS status is latched until a call to get_rx_los or a reset. + """ + if not self.dom_supported: + return None + + rx_los_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_RX_LOS_STATUS_OFFSET), QSFP_CHANNL_RX_LOS_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 16) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + + #QSFP-DD + else: + # page 11h (we put page 2 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: #not implement + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_RX_LOS_STATUS['offset'], QSFP_DD_CHANNL_RX_LOS_STATUS['width'], QSFP_DD_CHANNL_RX_LOS_STATUS['page']) + if dom_channel_monitor_raw is not None: + rx_los_data = int(dom_channel_monitor_raw[0], 8) + rx_los_list.append(rx_los_data & 0x01 != 0) + rx_los_list.append(rx_los_data & 0x02 != 0) + rx_los_list.append(rx_los_data & 0x04 != 0) + rx_los_list.append(rx_los_data & 0x08 != 0) + rx_los_list.append(rx_los_data & 0x10 != 0) + rx_los_list.append(rx_los_data & 0x20 != 0) + rx_los_list.append(rx_los_data & 0x40 != 0) + rx_los_list.append(rx_los_data & 0x80 != 0) + + return rx_los_list + + def get_tx_fault(self): + """ + Retrieves the TX fault status of SFP + + Returns: + A Boolean, True if SFP has TX fault, False if not + Note : TX fault status is lached until a call to get_tx_fault or a reset. + """ + if not self.dom_supported: + return None + + tx_fault_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_CHANNL_TX_FAULT_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_fault_data = int(dom_channel_monitor_raw[0], 16) + tx_fault_list.append(tx_fault_data & 0x01 != 0) + tx_fault_list.append(tx_fault_data & 0x02 != 0) + tx_fault_list.append(tx_fault_data & 0x04 != 0) + tx_fault_list.append(tx_fault_data & 0x08 != 0) + + #QSFP-DD + else: + return None + + return tx_fault_list + + def get_tx_disable(self): + """ + Retrieves the tx_disable status of this SFP + + Returns: + A Boolean, True if tx_disable is enabled, False if disabled + + for QSFP, the disable states of each channel which are the lower 4 bits in byte 85 page a0 + for SFP, the TX Disable State and Soft TX Disable Select is ORed as the tx_disable status returned + These two bits are bit 7 & 6 in byte 110 page a2 respectively + """ + if not self.dom_supported: + return None + + tx_disable_list = [] + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_DISABLE_STATUS_OFFSET), QSFP_CHANNL_DISABLE_STATUS_WIDTH) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + + #QSFP-DD + else: + if self.dom_rx_tx_power_bias_supported: #not implement + # page 11h (we put page 1 to byte 384~512) + dom_channel_monitor_raw = self._read_eeprom_specific_bytes(QSFP_DD_CHANNL_DISABLE_STATUS['offset'], QSFP_DD_CHANNL_DISABLE_STATUS['width'], QSFP_DD_CHANNL_DISABLE_STATUS['page']) + if dom_channel_monitor_raw is not None: + tx_disable_data = int(dom_channel_monitor_raw[0], 16) + tx_disable_list.append(tx_disable_data & 0x01 != 0) + tx_disable_list.append(tx_disable_data & 0x02 != 0) + tx_disable_list.append(tx_disable_data & 0x04 != 0) + tx_disable_list.append(tx_disable_data & 0x08 != 0) + tx_disable_list.append(tx_disable_data & 0x10 != 0) + tx_disable_list.append(tx_disable_data & 0x20 != 0) + tx_disable_list.append(tx_disable_data & 0x40 != 0) + tx_disable_list.append(tx_disable_data & 0x80 != 0) + + return tx_disable_list + + def get_tx_disable_channel(self): + """ + Retrieves the TX disabled channels in this SFP + Returns: + A hex of 4 bits (bit 0 to bit 3 as channel 0 to channel 3) to represent + TX channels which have been disabled in this SFP. + As an example, a returned value of 0x5 indicates that channel 0 + and channel 2 have been disabled. + """ + # SFP doesn't support this feature + return 0 + + def get_lpmode(self): + """ + Retrieves the lpmode (low power mode) status of this SFP + Returns: + A Boolean, True if lpmode is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_power_override(self): + """ + Retrieves the power-override status of this SFP + Returns: + A Boolean, True if power-override is enabled, False if disabled + """ + # SFP doesn't support this feature + return False + + def get_temperature(self): + """ + Retrieves the temperature of this SFP + + Returns: + An integer number of current temperature in Celsius + """ + if not self.dom_supported: + return None + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes((offset + QSFP_TEMPE_OFFSET), QSFP_TEMPE_WIDTH) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + else: + return None + else: + return None + + #QSFP-DD + else: + + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_temp_supported: + dom_temperature_raw = self._read_eeprom_specific_bytes(QSFP_DD_TEMPE_MON['offset'], QSFP_DD_TEMPE_MON['width'], QSFP_DD_TEMPE_MON['page']) + if dom_temperature_raw is not None: + dom_temperature_data = sfpd_obj.parse_temperature(dom_temperature_raw, 0) + temp = self._convert_string_to_num(dom_temperature_data['data']['Temperature']['value']) + return temp + return None + + def get_voltage(self): + """ + Retrieves the supply voltage of this SFP + + Returns: + An integer number of supply voltage in mV + """ + if not self.dom_supported: + return None + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes((offset + QSFP_VOLT_OFFSET), QSFP_VOLT_WIDTH) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + else: + return None + return None + + #QSFP-DD + else: + + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_volt_supported: + dom_voltage_raw = self._read_eeprom_specific_bytes(QSFP_DD_VOLT_MON['offset'], QSFP_DD_VOLT_MON['width'], QSFP_DD_VOLT_MON['page']) + if dom_voltage_raw is not None: + dom_voltage_data = sfpd_obj.parse_voltage(dom_voltage_raw, 0) + voltage = self._convert_string_to_num(dom_voltage_data['data']['Vcc']['value']) + return voltage + return None + + def get_tx_bias(self): + """ + Retrieves the TX bias current of this SFP + + Returns: + A list of four integer numbers, representing TX bias in mA + for channel 0 to channel 4. + Ex. ['110.09', '111.12', '108.21', '112.09'] + """ + tx_bias_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Bias']['value'])) + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if dom_tx_bias_power_supported: + dom_tx_bias_raw = self._read_eeprom_specific_bytes(QSFP_DD_TX_BIAS['offset'], QSFP_DD_TX_BIAS['width'], QSFP_DD_TX_BIAS['page']) + if dom_tx_bias_raw is not None: + dom_tx_bias_data = sfpd_obj.parse_dom_tx_bias(dom_tx_bias_raw, 0) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX1Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX2Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX3Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX4Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX5Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX6Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX7Bias']['value'])) + tx_bias_list.append(self._convert_string_to_num(dom_tx_bias_data['data']['TX8Bias']['value'])) + + return tx_bias_list + + def get_rx_power(self): + """ + Retrieves the received optical power for this SFP + + Returns: + A list of four integer numbers, representing received optical + power in mW for channel 0 to channel 4. + Ex. ['1.77', '1.71', '1.68', '1.70'] + """ + rx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['RX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + elif self.sfp_type == QSFP_DD_TYPE: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_rx_power_supported: + dom_rx_power_raw = self._read_eeprom_specific_bytes(QSFP_DD_RX_POWER['offset'], QSFP_DD_RX_POWER['width'], QSFP_DD_RX_POWER['page']) + if dom_rx_power_raw is not None: + dom_rx_power_data = sfpd_obj.parse_dom_rx_power(dom_rx_power_raw, 0) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX1Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX2Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX3Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX4Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX5Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX6Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX7Power']['value'])) + rx_power_list.append(self._convert_string_to_num(dom_rx_power_data['data']['RX8Power']['value'])) + + return rx_power_list + + def get_tx_power(self): + """ + Retrieves the TX power of this SFP + + Returns: + A list of four integer numbers, representing TX power in mW + for channel 0 to channel 4. + Ex. ['1.86', '1.86', '1.86', '1.86'] + """ + tx_power_list = [] + + #QSFP + if self.sfp_type == QSFP_TYPE: + offset = 0 + + sfpd_obj = sff8436Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_CHANNL_MON_OFFSET), QSFP_CHANNL_MON_WITH_TX_POWER_WIDTH) + if dom_channel_monitor_raw is not None: + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params_with_tx_power(dom_channel_monitor_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_channel_monitor_data['data']['TX4Power']['value'])) + else: + return None + else: + return None + + #QSFP-DD + else: + # page 11h (we put page 1 to byte 384~512) + if self.dom_rx_tx_power_bias_supported: + sfpd_obj = qsfp_dd_Dom() + if sfpd_obj is None: + return None + + if self.dom_tx_power_supported: + dom_tx_power_raw = self._read_eeprom_specific_bytes(QSFP_DD_TX_POWER['offset'], QSFP_DD_TX_POWER['width'], QSFP_DD_TX_POWER['page']) + if dom_tx_power_raw is not None: + dom_tx_power_data = sfpd_obj.parse_dom_tx_power(dom_tx_power_raw, 0) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX1Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX2Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX3Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX4Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX5Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX6Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX7Power']['value'])) + tx_power_list.append(self._convert_string_to_num(dom_tx_power_data['data']['TX8Power']['value'])) + + return tx_power_list + + def reset(self): + """ + Reset SFP and return all user module settings to their default srate. + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable(self, tx_disable): + """ + Disable SFP TX for all channels + Args: + tx_disable : A Boolean, True to enable tx_disable mode, False to disable + tx_disable mode. + Returns: + A boolean, True if tx_disable is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def tx_disable_channel(self, channel, disable): + """ + Sets the tx_disable for specified SFP channels + Args: + channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3, + e.g. 0x5 for channel 0 and channel 2. + disable : A boolean, True to disable TX channels specified in channel, + False to enable + Returns: + A boolean, True if successful, False if not + """ + # SFP doesn't support this feature + return False + + def set_lpmode(self, lpmode): + """ + Sets the lpmode (low power mode) of SFP + Args: + lpmode: A Boolean, True to enable lpmode, False to disable it + Note : lpmode can be overridden by set_power_override + Returns: + A boolean, True if lpmode is set successfully, False if not + """ + # SFP doesn't support this feature + return False + + def set_power_override(self, power_override, power_set): + """ + Sets SFP power level using power_override and power_set + Args: + power_override : + A Boolean, True to override set_lpmode and use power_set + to control SFP power, False to disable SFP power control + through power_override/power_set and use set_lpmode + to control SFP power. + power_set : + Only valid when power_override is True. + A Boolean, True to set SFP to low power mode, False to set + SFP to high power mode. + Returns: + A boolean, True if power-override and power_set are set successfully, + False if not + """ + # SFP doesn't support this feature + return False + + def get_name(self): + """ + Retrieves the name of the device + Returns: + string: The name of the device + """ + try: + with open(self.port_to_name_mapping[self.index], 'r') as sfp_name: + name=sfp_name.read() + except IOError: + name="Unknown" + + return name + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("model", "N/A") + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + transceiver_dom_info_dict = self.get_transceiver_info() + return transceiver_dom_info_dict.get("serial", "N/A") + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py new file mode 100644 index 0000000000..f45d930e87 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/thermal.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python + +############################################################################# +# +# Thermal contains an implementation of SONiC Platform Base API and +# provides the thermal device status which are available in the platform +# +############################################################################# + +import os +import os.path + +try: + from sonic_platform_base.thermal_base import ThermalBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + + +class Thermal(ThermalBase): + """Platform-specific Thermal class""" + + THERMAL_NAME_LIST = [] + SYSFS_THERMAL_DIR = ["/sys/bus/i2c/devices/0-004f/", + "/sys/bus/i2c/devices/0-0049/", + "/sys/bus/i2c/devices/0-004a/", + "/sys/bus/i2c/devices/0-004b/", + "/sys/bus/i2c/devices/0-004c/", + "/sys/bus/i2c/devices/0-004d/", + "/sys/bus/i2c/devices/0-004e/"] + + def __init__(self, thermal_index): + self.index = thermal_index + + # Add thermal name + self.THERMAL_NAME_LIST.append("Top-Rear") + self.THERMAL_NAME_LIST.append("Top-Front") + self.THERMAL_NAME_LIST.append("Right-Front") + self.THERMAL_NAME_LIST.append("Top-Center") + self.THERMAL_NAME_LIST.append("Left-Front") + self.THERMAL_NAME_LIST.append("Bottom-Front") + self.THERMAL_NAME_LIST.append("Bottom-Rear") + ThermalBase.__init__(self) + + def __read_txt_file(self, file_path): + try: + with open(file_path, 'r') as fd: + data = fd.read() + return data.strip() + except IOError: + pass + return "" + + def __get_temp(self, temp_file): + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) + raw_temp = self.__read_txt_file(temp_file_path) + temp = float(raw_temp)/1000 + return "{:.3f}".format(temp) + + def __set_threshold(self, file_name, temperature): + temp_file_path = os.path.join(self.hwmon_path, file_name) + try: + with open(temp_file_path, 'w') as fd: + fd.write(str(temperature)) + return True + except IOError: + return False + + def get_temperature(self): + """ + Retrieves current temperature reading from thermal + Returns: + A float number of current temperature in Celsius up to nearest thousandth + of one degree Celsius, e.g. 30.125 + """ + temp_file = "temp1_input" + return float(self.__get_temp(temp_file)) + + def get_low_threshold(self): + """ + Retrieves the low threshold temperature of thermal + :return: A float number, the low threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(9) + + def get_low_critical_threshold(self): + """ + Retrieves the low critical threshold temperature of thermal + :return: A float number, the low critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + return int(7) + + def get_high_threshold(self): + """ + Retrieves the high threshold temperature of thermal + Returns: + A float number, the high threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.index==0: + return int(56) + elif self.index==1: + return int(74) + elif self.index==2: + return int(55) + elif self.index==3: + return int(74) + elif self.index==4: + return int(55) + elif self.index==5: + return int(74) + else: + return int(56) + + def get_high_critical_threshold(self): + """ + Retrieves the high critical threshold temperature of thermal + :return: A float number, the high critical threshold temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + if self.index==0: + return int(58) + elif self.index==1: + return int(76) + elif self.index==2: + return int(57) + elif self.index==3: + return int(76) + elif self.index==4: + return int(57) + elif self.index==5: + return int(76) + else: + return int(58) + + def get_name(self): + """ + Retrieves the name of the thermal device + Returns: + string: The name of the thermal device + """ + return self.THERMAL_NAME_LIST[self.index] + + def get_presence(self): + """ + Retrieves the presence of the PSU + Returns: + bool: True if PSU is present, False if not + """ + temp_file = "temp1_input" + temp_file_path = os.path.join(self.hwmon_path, temp_file) + return os.path.isfile(temp_file_path) + + def get_status(self): + """ + Retrieves the operational status of the device + Returns: + A boolean value, True if device is operating properly, False if not + """ + if not self.get_presence(): + return False + + return True + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py new file mode 100644 index 0000000000..820dd54f95 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/watchdog.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +######################################################################## +# +# Abstract base class for implementing a platform-specific class with +# which to interact with a hardware watchdog module in SONiC +# +######################################################################## + +try: + from sonic_platform_base.watchdog_base import WatchdogBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + print("INFO: Watchdog __init__") + + def arm(self, seconds): + """ + Arm the hardware watchdog with a timeout of seconds. + If the watchdog is currently armed, calling this function will + simply reset the timer to the provided value. If the underlying + hardware does not support the value provided in , this + method should arm the watchdog with the *next greater* + available value. + Returns: + An integer specifying the *actual* number of seconds the + watchdog was armed with. On failure returns -1. + """ + print("ERROR: Platform did not implement arm()") + raise NotImplementedError + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False + if not + """ + print("ERROR: Platform did not implement disarm()") + raise NotImplementedError + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + print("ERROR: Platform did not implement is_armed()") + raise NotImplementedError + + def get_remaining_time(self): + """ + If the watchdog is armed, retrieve the number of seconds + remaining on the watchdog timer + Returns: + An integer specifying the number of seconds remaining on + their watchdog timer. If the watchdog is not armed, returns + -1. + S5232 doesnot have hardware support to show remaining time. + Due to this limitation, this API is implemented in software. + This API would return correct software time difference if it + is called from the process which armed the watchdog timer. + If this API called from any other process, it would return + 0. If the watchdog is not armed, this API would return -1. + """ + print("ERROR: Platform did not implement get_remaining_time()") + raise NotImplementedError diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led new file mode 100644 index 0000000000..9cf2b7adc1 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led @@ -0,0 +1,4 @@ +#!/bin/bash +sudo ipmitool raw 0x06 0x52 0x05 192 0 0x49 0 2>>/dev/null +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld new file mode 100644 index 0000000000..ce5a3dd009 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld @@ -0,0 +1,4 @@ +#!/bin/bash +sudo ipmitool raw 0x30 0x91 0xff 0xff 0xff 0xff +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync new file mode 100644 index 0000000000..9c357e7ac7 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync @@ -0,0 +1,7 @@ +#!/bin/bash +/usr/local/bin/sonic-fanthrml-monitor & +/usr/local/bin/sonic-led-monitor & +/usr/local/bin/sonic-qsfp-monitor & +/usr/local/bin/sonic-psu-monitor & +exit 0 + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor new file mode 100644 index 0000000000..4dcf00781f --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor @@ -0,0 +1,354 @@ +#!/bin/bash + +debug_flag=0 + +ipmi_val=0 +ctrl_mode_val=0 +fan_pwm_val=0 +fan_rpm_val=0 + +bmc_sensor_read() +{ + ipmi_val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + return 0 + fi + + return 1 +} + +#$1=get(0)/set(1), $2=ctrl_mode(1:manual, 0:auto) +#get rtn: ctrl_mode_val, fan_pwm_val +bmc_fan_speed_ctrl() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage ];then + if [ $1 -eq 1 ];then + #Set Fan Speed Control + if [ $2 -eq 0 ];then + ipmitool raw 0x30 0x20 0x0 0x0 1>/dev/null 2>/dev/null + else + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage | awk '{printf $1}') + fan_pwm_input=$( printf "%d" 0x$fan_pwm_input ) + ipmitool raw 0x30 0x20 0x1 $fan_pwm_input 1>/dev/null 2>/dev/null + fi + else + #Get Fan Speed Control + ctrl_mode_val=$(echo $ipmi_val | awk '{printf $1}') + fan_pwm_val=$(echo $ipmi_val | awk '{printf $2}') + ctrl_mode_val=$( printf "%d" 0x$ctrl_mode_val ) + fan_pwm_val=$( printf "%d" 0x$fan_pwm_val ) + echo $fan_pwm_val > /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage + fi + fi +} + +bmc_fan_presence() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_presence ];then + fan_pre_val=$(echo $ipmi_val | awk '{printf $44}') + fan_pre_val=$( printf "%d" 0x$fan_pre_val ) + for i in $(seq 0 6); + do + tmp=$((1 << $i)) + tmp1=$(($fan_pre_val & $tmp)) + if [ $tmp1 -eq 0 ];then + if [ $i == 0 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan1_presence + elif [ $i == 1 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan2_presence + elif [ $i == 2 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan3_presence + elif [ $i == 3 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan4_presence + elif [ $i == 4 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan5_presence + elif [ $i == 5 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan6_presence + else + echo 1 > /sys/bus/i2c/devices/0-0066/fan7_presence + fi + else + if [ $i == 0 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan1_presence + elif [ $i == 1 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan2_presence + elif [ $i == 2 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan3_presence + elif [ $i == 3 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan4_presence + elif [ $i == 4 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan5_presence + elif [ $i == 5 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan6_presence + else + echo 0 > /sys/bus/i2c/devices/0-0066/fan7_presence + fi + fi + done + fi +} + +bmc_fan_enable() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_enable ];then + fan_en_val=$(echo $ipmi_val | awk '{printf $45}') + fan_en_val=$( printf "%d" 0x$fan_en_val ) + for i in $(seq 0 6); + do + tmp=$((1 << $i)) + tmp1=$(($fan_en_val & $tmp)) + if [ $tmp1 -ne 0 ];then + if [ $i == 0 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan1_enable + elif [ $i == 1 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan2_enable + elif [ $i == 2 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan3_enable + elif [ $i == 3 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan4_enable + elif [ $i == 4 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan5_enable + elif [ $i == 5 ];then + echo 1 > /sys/bus/i2c/devices/0-0066/fan6_enable + else + echo 1 > /sys/bus/i2c/devices/0-0066/fan7_enable + fi + else + if [ $i == 0 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan1_enable + elif [ $i == 1 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan2_enable + elif [ $i == 2 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan3_enable + elif [ $i == 3 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan4_enable + elif [ $i == 4 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan5_enable + elif [ $i == 5 ];then + echo 0 > /sys/bus/i2c/devices/0-0066/fan6_enable + else + echo 0 > /sys/bus/i2c/devices/0-0066/fan7_enable + fi + fi + done + fi +} + +bmc_fan_speed_rpm() +{ + if [ -e /sys/bus/i2c/devices/0-0066/fan1_front_speed_rpm ];then + #fan1 front + hi_byte=$(echo $ipmi_val | awk '{printf $1}') + lo_byte=$(echo $ipmi_val | awk '{printf $2}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan1_front_speed_rpm + + #fan1 rear + hi_byte=$(echo $ipmi_val | awk '{printf $15}') + lo_byte=$(echo $ipmi_val | awk '{printf $16}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan1_rear_speed_rpm + + #fan2 front + hi_byte=$(echo $ipmi_val | awk '{printf $3}') + lo_byte=$(echo $ipmi_val | awk '{printf $4}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan2_front_speed_rpm + + #fan2 rear + hi_byte=$(echo $ipmi_val | awk '{printf $17}') + lo_byte=$(echo $ipmi_val | awk '{printf $18}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan2_rear_speed_rpm + + #fan3 front + hi_byte=$(echo $ipmi_val | awk '{printf $5}') + lo_byte=$(echo $ipmi_val | awk '{printf $6}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan3_front_speed_rpm + + #fan3 rear + hi_byte=$(echo $ipmi_val | awk '{printf $19}') + lo_byte=$(echo $ipmi_val | awk '{printf $20}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan3_rear_speed_rpm + + #fan4 front + hi_byte=$(echo $ipmi_val | awk '{printf $7}') + lo_byte=$(echo $ipmi_val | awk '{printf $8}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan4_front_speed_rpm + + #fan4 rear + hi_byte=$(echo $ipmi_val | awk '{printf $21}') + lo_byte=$(echo $ipmi_val | awk '{printf $22}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan4_rear_speed_rpm + + #fan5 front + hi_byte=$(echo $ipmi_val | awk '{printf $9}') + lo_byte=$(echo $ipmi_val | awk '{printf $10}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan5_front_speed_rpm + + #fan5 rear + hi_byte=$(echo $ipmi_val | awk '{printf $23}') + lo_byte=$(echo $ipmi_val | awk '{printf $24}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan5_rear_speed_rpm + + #fan6 front + hi_byte=$(echo $ipmi_val | awk '{printf $11}') + lo_byte=$(echo $ipmi_val | awk '{printf $12}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan6_front_speed_rpm + + #fan6 rear + hi_byte=$(echo $ipmi_val | awk '{printf $25}') + lo_byte=$(echo $ipmi_val | awk '{printf $26}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan6_rear_speed_rpm + + #fan7 front + hi_byte=$(echo $ipmi_val | awk '{printf $13}') + lo_byte=$(echo $ipmi_val | awk '{printf $14}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan7_front_speed_rpm + + #fan7 rear + hi_byte=$(echo $ipmi_val | awk '{printf $27}') + lo_byte=$(echo $ipmi_val | awk '{printf $28}') + hi_byte=$( printf "%d" 0x$hi_byte ) + lo_byte=$( printf "%d" 0x$lo_byte ) + fan_rpm_val=$((hi_byte<<8)) + fan_rpm_val=`expr $fan_rpm_val + $lo_byte` + echo $fan_rpm_val > /sys/bus/i2c/devices/0-0066/fan7_rear_speed_rpm + fi +} + +do_fan_update() +{ + #fan presence + bmc_fan_presence + + #fan enable + bmc_fan_enable + + #fan speed rpm + bmc_fan_speed_rpm + + if [ $debug_flag -eq 0 ];then + #Get Fan RPM + bmc_fan_speed_ctrl 0 + else + bmc_fan_speed_ctrl 1 1 + fi +} + +do_thermal_update() +{ + if [ -e /sys/bus/i2c/devices/0-004f/temp1_input ];then + #lm75_1 + thermal_val=$(echo $ipmi_val | awk '{printf $29}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004f/temp1_input + + #lm75_2 + thermal_val=$(echo $ipmi_val | awk '{printf $30}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-0049/temp1_input + + #lm75_3 + thermal_val=$(echo $ipmi_val | awk '{printf $31}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004a/temp1_input + + #lm75_4 + thermal_val=$(echo $ipmi_val | awk '{printf $32}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004b/temp1_input + + #lm75_5 + thermal_val=$(echo $ipmi_val | awk '{printf $32}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004c/temp1_input + + #lm75_6 + thermal_val=$(echo $ipmi_val | awk '{printf $33}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004d/temp1_input + + #lm75_7 + thermal_val=$(echo $ipmi_val | awk '{printf $34}') + thermal_val=$( printf "%d" 0x$thermal_val ) + thermal_val=`expr $thermal_val \* 1000` + echo $thermal_val > /sys/bus/i2c/devices/0-004e/temp1_input + fi +} + +FAN_Thermal_monitor() +{ + if [ $debug_flag -eq 1 ];then + fan_pwm_input=100 + echo $fan_pwm_input > /sys/bus/i2c/devices/0-0066/fan_duty_cycle_percentage + fi + + while true + do + #get bmc sensor value + bmc_sensor_read + if [ $? -eq 0 ];then + do_fan_update + do_thermal_update + fi + + sleep 1 + done +} + +FAN_Thermal_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor new file mode 100644 index 0000000000..ba4f4c8dae --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor @@ -0,0 +1,201 @@ +#!/bin/bash + +#0=off, 1=green, 2=amber, 3=blk_green +led_state=0 + +#$1=led_no(1=loc, 2=diag, 3=fan, 4=psu1, 5=psu2) +bmc_led_read() +{ + led_state=0 + rtn_state=0 + val=$(ipmitool raw 0x30 0x97 2>>/dev/null) + if [ $? -eq 0 ];then + if [ $1 -eq 1 ];then + rtn_state=$(echo $val | awk '{printf $1}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=2 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=3 + return 1 + fi + + tmp=$(($rtn_state & 4)) + if [ $tmp -eq 4 ];then + led_state=1 + return 1 + fi + + elif [ $1 -eq 2 ];then + rtn_state=$(echo $val | awk '{printf $2}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=2 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=3 + return 1 + fi + + tmp=$(($rtn_state & 4)) + if [ $tmp -eq 4 ];then + led_state=1 + return 1 + fi + + elif [ $1 -eq 3 ];then + rtn_state=$(echo $val | awk '{printf $3}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + elif [ $1 -eq 4 ];then + rtn_state=$(echo $val | awk '{printf $4}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + else + rtn_state=$(echo $val | awk '{printf $5}') + rtn_state=$( printf "%d" 0x$rtn_state ) + if [ $rtn_state -eq 0 ];then + led_state=0 + return 1 + fi + + tmp=$(($rtn_state & 1)) + if [ $tmp -eq 1 ];then + led_state=1 + return 1 + fi + + tmp=$(($rtn_state & 2)) + if [ $tmp -eq 2 ];then + led_state=2 + return 1 + fi + + fi + fi + + return 0 +} + +#$1=led_no(1=loc, 2=diag, 3=fan, 4=psu1, 5=psu2) +#$2=led_val(0=off, 1=green, 2=amber, 3=blk_green) +bmc_led_write() +{ + led_val=$2 + val=$(ipmitool raw 0x30 0x97 2>>/dev/null) + loc_val=$(echo $val | awk '{printf $1}') + diag_val=$(echo $val | awk '{printf $2}') + fan_val=$(echo $val | awk '{printf $3}') + psu1_val=$(echo $val | awk '{printf $4}') + psu2_val=$(echo $val | awk '{printf $5}') + + loc_val=$( printf "%d" 0x$loc_val ) + diag_val=$( printf "%d" 0x$diag_val ) + fan_val=$( printf "%d" 0x$fan_val ) + psu1_val=$( printf "%d" 0x$psu1_val ) + psu2_val=$( printf "%d" 0x$psu2_val ) + + if [ $1 -eq 1 ];then + loc_val=$(($loc_val & $led_val)) + elif [ $1 -eq 2 ];then + diag_val=$(($diag_val & $led_val)) + elif [ $1 -eq 3 ];then + fan_val=$(($fan_val & $led_val)) + elif [ $1 -eq 4 ];then + psu1_val=$(($psu1_val & $led_val)) + else + psu2_val=$(($psu2_val & $led_val)) + fi + + ipmitool raw 0x30 0x96 $loc_val $diag_val $fan_val $psu1_val $psu2_val 1>>/dev/null 2>>/dev/null +} + +LED_monitor() +{ + local loc_state=0 + #default set loc led to off + echo $loc_state > /sys/bus/i2c/devices/0-0060/sys_led_loc + + while true + do + if [ -e /sys/bus/i2c/devices/0-0060/sys_led_diag ];then + loc_state=$(cat /sys/bus/i2c/devices/0-0060/sys_led_loc | awk '{printf $1}') + bmc_led_write 1 $loc_state + + bmc_led_read 2 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_diag + fi + + bmc_led_read 3 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_fan + fi + + bmc_led_read 4 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_psu1 + fi + + bmc_led_read 5 + if [ $? -eq 1 ];then + echo $led_state > /sys/bus/i2c/devices/0-0060/sys_led_psu2 + fi + fi + + sleep 1 + done +} + +LED_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor new file mode 100644 index 0000000000..bcb3502e4a --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor @@ -0,0 +1,328 @@ +#!/bin/bash + +result=0 +debug_flag=0 +bmc_fan_duty_cycle_ctrl() +{ + #control PSU 1 + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-005a/psu_fan1_duty_cycle | awk '{print $1}') + lo_byte_1= $((fan_pwm_input & 0xff)) + hi_byte_1= $((fan_pwm_input >> 8)) + + #control PSU 2 + fan_pwm_input=$(cat /sys/bus/i2c/devices/0-0059/psu_fan1_duty_cycle | awk '{print $1}') + lo_byte_2= $((fan_pwm_input & 0xff)) + hi_byte_2= $((fan_pwm_input >> 8)) + + + ipmitool raw 0x30 0x95 hi_byte_1 lo_byte_1 hi_byte_2 lo_byte_2 + + return 1 +} +byte_read(){ + data=$(echo $val | awk '{print $'"$1"'}') + data=$(printf "%d" 0x$data) + Value=$data + return 1 + +} +add_byte(){ + hi_byte=$(echo $val | awk '{print $'"$1"'}') + lo_byte=$(echo $val | awk '{print $'"$2"'}') + hi_byte=$(printf "%d" 0x$hi_byte) + lo_byte=$(printf "%d" 0x$lo_byte) + ((hi_byte <<= 8)) + Value=$(($lo_byte+$hi_byte)) + return 1 +} +# string_read [start byte] [length] +string_read(){ + Value="" + seqnum=$(($1+$2-1)) + for i in $(seq $1 $seqnum) + do + data=$(echo $val | awk '{print $'"$i"'}') + data=$(printf "%d" 0x$data) + if [ $data -ne 0 ];then + Value=$Value$(printf "$(printf '\\x%x' $data)") + else + data=0x20 + Value=$Value$(printf "$(printf '\\x%x' $data)") + fi + done + return 1 +} +#$1=dev_addr, $2=reg, $3=val +get_PSU_information() +{ + val=$(ipmitool raw 0x30 0x93 2>>/dev/null) + ##################################################################################### + # BMC_command content resultfile algorithm # + # 93 2:5 vin 5a/59 psu_v_in LINEAR_11 # + # 93 6:9 vout 5a/59 psu_v_out LINEAR_16 # + # 93 10:13 Iin 5a/59 psu_i_in LINEAR_11 # + # 93 14:17 Iout 5a/59 psu_i_out LINEAR_11 # + # 93 18:21 Pin 5a/59 psu_p_in LINEAR_11 # + # 93 22:25 Pout 5a/59 psu_p_out LINEAR_11 # + # 93 26:27 temp1 5a/59 psu_temp1_input # + # 93 28:29 temp2 DISCARD # + # 93 30:31 temp3 DISCARD # + # 93 32:33 fan_fault 5a/59 psu_fan1_fault # + # 93 34:37 fan_command 5a/59 psu_fan1_duty_cycle # + # 93 38:41 fan_speed 5a/59 psu_fan1_speed_rpm LINEAR_11 # + # 93 42:43 psu_present 52/51 psu_present # + # 93 44:45 power_good 52/51 psu_power_good # + # 94 2:23 mfr_ID 5a/59 psu_mfr_id # + # 94 24:45 mfr_model 5a/59 psu_mfr_model # + # 94 46:49 mfr_rev 5a/59 psu_mfr_revision # + # 94 50:97 mfr_serial 5a/59 psu_mfr_serial # + # TBD pmbus_rev. 5a/59 psu_pmbus_revision # + # 98 2:21 psu_model_name 52/51 psu_model_name # + # 98 22:59 psu_serial 52/51 psu_serial_number # + ##################################################################################### +#_______________________with _LINEAR11&16 VIN IIN IOUT PIN POUT FAN_SPEED with _LINEAR16 VOUT + if [ -e /sys/bus/i2c/devices/0-005a/psu_mfr_id ] && [ -e /sys/bus/i2c/devices/0-0059/psu_mfr_id ];then + #PSU1 Vin + add_byte 1 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_in + fi + #PSU2 Vin + add_byte 3 4 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_in + fi + #PSU 1 Vout + add_byte 5 6 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_out + fi + #PSU 2 Vout + add_byte 7 8 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_out + fi + #PSU 1 Iin + add_byte 9 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_in + fi + #PSU 2 Iin + add_byte 11 12 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_in + fi + #PSU 1 Iout + add_byte 13 14 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_out + fi + #PSU 2 Iout + add_byte 15 16 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_out + fi + #PSU 1 Pin + add_byte 17 18 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_in + fi + #PSU 2 Pin + add_byte 19 20 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_in + fi + #PSU 1 Pout + add_byte 21 22 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_out + fi + #PSU 2 Pout + add_byte 23 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_out + fi + #PSU 1 Fan speed + add_byte 37 38 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_speed_rpm + fi + #PSU 2 Fan speed + add_byte 39 40 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_speed_rpm + fi +#_______________________with _LINEAR11&16 VIN IIN IOUT PIN POUT FAN_SPEED with _LINEAR16 VOUT +#----------------93->/58/59----psu_fan1_fault psu_temp1_input psu_fan1_duty_cycle + #PSU 1 Temp1 + byte_read 25 + echo $Value > /sys/bus/i2c/devices/0-005a/psu_temp1_input + #PSU 2 Temp1 + byte_read 26 + echo $Value > /sys/bus/i2c/devices/0-0059/psu_temp1_input + if [ $debug_flag -eq 0 ];then + #PSU 1 Fan command + add_byte 33 34 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_duty_cycle + fi + #PSU 2 Fan command + add_byte 35 36 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_duty_cycle + fi + fi + #PSU 1 2 Fan status check fault(0x81,bit 7, 0 for ignormal) + byte_read 31 + ((Value >>= 7)) + echo $Value > /sys/bus/i2c/devices/0-005a/psu_fan1_fault + + #PSU 2 Fan status check fault(0x81,bit 7, 0 for ignormal) + byte_read 32 + ((Value >>= 7)) + echo $Value > /sys/bus/i2c/devices/0-0059/psu_fan1_fault + fi + +#____________________________________ +#----------------93->/50/51 + if [ -e /sys/bus/i2c/devices/0-0051/psu_serial_number ] && [ -e /sys/bus/i2c/devices/0-0052/psu_serial_number ];then + #PSU 1 2 PSU present + byte_read 41 + if [ $Value -eq 0 ];then + Value=1 + else + Value=0 + fi + echo $Value > /sys/bus/i2c/devices/0-0052/psu_present + + byte_read 42 + if [ $Value -eq 0 ];then + Value=1 + else + Value=0 + fi + echo $Value > /sys/bus/i2c/devices/0-0051/psu_present + #PSU 1 2 PSU power good + byte_read 43 + echo $Value > /sys/bus/i2c/devices/0-0052/psu_power_good + + byte_read 44 + echo $Value > /sys/bus/i2c/devices/0-0051/psu_power_good + fi +#____________________________________________________________________________ + + val=$(ipmitool raw 0x30 0x94 2>>/dev/null) +#----------------94->/58/59 + if [ -e /sys/bus/i2c/devices/0-005a/psu_mfr_id ] && [ -e /sys/bus/i2c/devices/0-0059/psu_mfr_id ];then + #PSU1 mfr_ID + string_read 1 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_id + fi + #PSU2 mfr_ID + string_read 12 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_id + fi + #PSU1 mfr_model + string_read 23 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_model + fi + #PSU2 mfr_model + string_read 34 11 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_model + fi + #PSU1 mfr_revision + string_read 45 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_revision + fi + #PSU2 mfr_revision + string_read 47 2 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_revision + fi + #PSU1 mfr_serial + string_read 49 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-005a/psu_mfr_serial + fi + #PSU1 mfr_serial + string_read 73 24 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0059/psu_mfr_serial + fi + fi +#____________________________________________________________________________ +#----------------98->/50/51 + val=$(ipmitool raw 0x30 0x98 2>>/dev/null) + if [ -e /sys/bus/i2c/devices/0-0051/psu_serial_number ] && [ -e /sys/bus/i2c/devices/0-0052/psu_serial_number ];then + #PSU 1 psu_model_name + string_read 1 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0052/psu_model_name + fi + if [ "$(echo $Value |cut -c 5)" == 8 ];then #"082" for f2b "095" for b2f + echo 0 > /sys/bus/i2c/devices/0-0052/psu_fan_dir + else + echo 1 > /sys/bus/i2c/devices/0-0052/psu_fan_dir + fi + #PSU 2 psu_model_name + string_read 11 10 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0051/psu_model_name + fi + if [ "$(echo $Value |cut -c 5)" == 8 ];then #"082" for f2b "095" for b2f + echo 0 > /sys/bus/i2c/devices/0-0051/psu_fan_dir + else + echo 1 > /sys/bus/i2c/devices/0-0051/psu_fan_dir + fi + if [ $(cat /sys/bus/i2c/devices/0-0052/psu_present) -eq 1 ];then + fan_dir=$(cat /sys/bus/i2c/devices/0-0052/psu_fan_dir) + else + fan_dir=$(cat /sys/bus/i2c/devices/0-0051/psu_fan_dir) + fi + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan1_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan2_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan3_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan4_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan5_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan6_direction + echo $fan_dir > /sys/bus/i2c/devices/0-0066/fan7_direction + #PSU 1 psu_serial_number + string_read 21 19 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0052/psu_serial_number + fi + #PSU 2 psu_serial_number + string_read 40 19 + if [ $? -eq 1 ];then + echo $Value > /sys/bus/i2c/devices/0-0051/psu_serial_number + fi + fi + + +#_____________________________________________ + +} + +#$1=dev_addr, $2=reg, $3=len + +PSU_monitor() +{ + + while true + do + + get_PSU_information + if [ $debug_flag -eq 1 ];then + bmc_fan_speed_ctrl + fi + + sleep 1 + done +} + +PSU_monitor diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor new file mode 100644 index 0000000000..1f4ca1d3fe --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor @@ -0,0 +1,399 @@ +#!/bin/bash + +debug_flag=0 +port_map=('00' '10' '11' '12' '13' '14' '15' '16' '17' '18' '19' '20' '21' '22' '23' '24' '25' '26' '27' '28' '29' '30' '31' '32' '33' '34' '35' '36' '37' '38' '39' '40' '41') +port_1_8_presence=0 +port_9_16_presence=0 +port_17_24_presence=0 +port_25_32_presence=0 +port_1_8_reset=0 +port_9_16_reset=0 +port_17_24_reset=0 +port_25_32_reset=0 + +result=0 + +#$1=dev_addr, $2=reg, $3=val +bmc_write() +{ + addr_8b=$(echo $(($1)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x06 0x52 0x05 $addr_8b 0 $2 $3 1>>/dev/null 2>>/dev/null +} + +#$1=dev_addr, $2=reg, $3=len +bmc_read() +{ + addr_8b=$(echo $(($1)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + val=$(ipmitool raw 0x06 0x52 0x05 $addr_8b $3 $2 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + return 1 + else + return 0 + fi +} + +bmc_qsfp_presence_read() +{ + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + port_1_8_presence=$(echo $val | awk '{printf $36}') + port_9_16_presence=$(echo $val | awk '{printf $37}') + port_17_24_presence=$(echo $val | awk '{printf $40}') + port_25_32_presence=$(echo $val | awk '{printf $41}') + + port_1_8_presence=$( printf "%d" 0x$port_1_8_presence ) + port_9_16_presence=$( printf "%d" 0x$port_9_16_presence ) + port_17_24_presence=$( printf "%d" 0x$port_17_24_presence ) + port_25_32_presence=$( printf "%d" 0x$port_25_32_presence ) + return 1 + fi + + return 0 +} + +bmc_qsfp_reset_read() +{ + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + port_1_8_reset=$(echo $val | awk '{printf $38}') + port_9_16_reset=$(echo $val | awk '{printf $39}') + port_17_24_reset=$(echo $val | awk '{printf $42}') + port_25_32_reset=$(echo $val | awk '{printf $43}') + + port_1_8_reset=$( printf "%d" 0x$port_1_8_reset ) + port_9_16_reset=$( printf "%d" 0x$port_9_16_reset ) + port_17_24_reset=$( printf "%d" 0x$port_17_24_reset ) + port_25_32_reset=$( printf "%d" 0x$port_25_32_reset ) + return 1 + fi + + return 0 +} + +#$1=port_no +bmc_qsfp_reset_write() +{ + local port=$1 + + val=$(ipmitool raw 0x30 0x92 2>>/dev/null) + if [ $? -eq 0 ];then + ori_1_8_reset=$(echo $val | awk '{printf $38}') + ori_9_16_reset=$(echo $val | awk '{printf $39}') + ori_17_24_reset=$(echo $val | awk '{printf $42}') + ori_25_32_reset=$(echo $val | awk '{printf $43}') + + ori_1_8_reset=$( printf "%d" 0x$ori_1_8_reset ) + ori_9_16_reset=$( printf "%d" 0x$ori_9_16_reset ) + ori_17_24_reset=$( printf "%d" 0x$ori_17_24_reset ) + ori_25_32_reset=$( printf "%d" 0x$ori_25_32_reset ) + else + return 0 + fi + + port=`expr $port - 1` + port_blk=0 + port_blk=`expr $port / 8` + bit_idx=`expr $port % 8` + bit_idx=$((1<<$bit_idx)) + + if [ $port_blk -eq 1 ];then + tmp_1_8_reset=$(($ori_1_8_reset ^ $bit_idx)) + elif [ $port_blk -eq 2 ];then + tmp_9_16_reset=$(($ori_9_16_reset ^ $bit_idx)) + elif [ $port_blk -eq 3 ];then + tmp_17_24_reset=$(($ori_17_24_reset ^ $bit_idx)) + else + tmp_25_32_reset=$(($ori_25_32_reset ^ $bit_idx)) + fi + + #set to reset state + ipmitool raw 0x30 0x91 $tmp_1_8_reset $tmp_9_16_reset $tmp_17_24_reset $tmp_25_32_reset 1>>/dev/null 2>>/dev/null + + #set back to normal state + ipmitool raw 0x30 0x91 $ori_1_8_reset $ori_9_16_reset $ori_17_24_reset $ori_25_32_reset 1>>/dev/null 2>>/dev/null +} + +#$1=port_no +bmc_qsfp_eeprom_read() +{ + local port=$1 + local eeprom_low + local eeprom_pg0 + local eeprom_pg2 + local eeprom_pg3 + local eeprom_pg11 + + port=`expr $port - 1` + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + $((0x72))` + ch=`expr $port % 8` + ch=$((1<<$ch)) + + bmc_write $i2cmux_dev 0x00 $ch + + bmc_write 0x50 0x7f 0x00 + #QSFP-DD low page + bmc_read 0x50 0 128 + if [ $? -eq 1 ];then + eeprom_low=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page0 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg0=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page1 + bmc_write 0x50 0x7f 0x01 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg1=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page2 + bmc_write 0x50 0x7f 0x02 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg2=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page3 + bmc_write 0x50 0x7f 0x03 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg3=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + #QSFP-DD page11 + bmc_write 0x50 0x7f 0x11 + bmc_read 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_pg11=$result + else + bmc_write $i2cmux_dev 0x00 0x0 + return 1 + fi + + sfp_type=$(echo $eeprom_low | awk '{printf $1}') + sfp_type=$( printf "%d" 0x$sfp_type ) + + #get temperature + temp=$(echo $eeprom_low | awk '{printf $15}') + if [ $temp != "" ];then + temp=$( printf "%d" 0x$temp ) + temp_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/temp" + echo $temp > $temp_path + fi + + #get lp_mode + lpmod_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/lp_mode" + if [ $sfp_type -eq 24 ];then + lpmod=$(echo $eeprom_low | awk '{printf $27}') + if [ $lpmod != "" ];then + state=$((lpmod&0x10)) + if [ $state -eq 16 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + elif [ $sfp_type -eq 17 ];then + lpmod=$(echo $eeprom_low | awk '{printf $93}') + if [ $lpmod != "" ];then + state=$((lpmod&0x02)) + if [ $state -eq 2 ];then + echo 1 > $lpmod_path + else + echo 0 > $lpmod_path + fi + fi + else + lpmod="" + fi + + eeprom_low=$(echo $eeprom_low | sed 's/[[:space:]]//g') + eeprom_pg0=$(echo $eeprom_pg0 | sed 's/[[:space:]]//g') + eeprom_pg1=$(echo $eeprom_pg1 | sed 's/[[:space:]]//g') + eeprom_pg2=$(echo $eeprom_pg2 | sed 's/[[:space:]]//g') + eeprom_pg3=$(echo $eeprom_pg3 | sed 's/[[:space:]]//g') + eeprom_pg11=$(echo $eeprom_pg11 | sed 's/[[:space:]]//g') + + if [ $debug_flag -eq 0 ];then + eeprom_low_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_low" + eeprom_low=$(echo $eeprom_low | sed -e 's/ //g') + echo $eeprom_low > $eeprom_low_path + eeprom_pg0_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg0" + eeprom_pg0=$(echo $eeprom_pg0 | sed -e 's/ //g') + echo $eeprom_pg0 > $eeprom_pg0_path + eeprom_pg1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg1" + eeprom_pg1=$(echo $eeprom_pg1 | sed -e 's/ //g') + echo $eeprom_pg1 > $eeprom_pg1_path + eeprom_pg2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg2" + eeprom_pg2=$(echo $eeprom_pg2 | sed -e 's/ //g') + echo $eeprom_pg2 > $eeprom_pg2_path + eeprom_pg3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg3" + eeprom_pg3=$(echo $eeprom_pg3 | sed -e 's/ //g') + echo $eeprom_pg3 > $eeprom_pg3_path + eeprom_pg11_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg11" + eeprom_pg11=$(echo $eeprom_pg11 | sed -e 's/ //g') + echo $eeprom_pg11 > $eeprom_pg11_path + else + printf "\nPort %d EEPROM:" $1 + printf "\nLow--------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_low:0:2} + eeprom_low=$(echo $eeprom_low | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page0------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg0:0:2} + eeprom_pg0=$(echo $eeprom_pg0 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page1------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg1:0:2} + eeprom_pg0=$(echo $eeprom_pg1 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page2------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg2:0:2} + eeprom_pg2=$(echo $eeprom_pg2 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page3------------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg3:0:2} + eeprom_pg3=$(echo $eeprom_pg3 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + printf "Page11-----------------------------------------\n" + for i in $(seq 1 128); + do + printf "%s " ${eeprom_pg11:0:2} + eeprom_pg11=$(echo $eeprom_pg11 | sed 's/^..//') + + val=`expr $i % 16` + if [ $val -eq 0 ];then + printf "\n" + fi + done + printf "\n-----------------------------------------------\n" + fi + + bmc_write $i2cmux_dev 0x00 0x0 + return 0 +} + +#$1=port_no +bmc_qsfp_eeprom_clear() +{ + eeprom_low_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_low" + echo "" > $eeprom_low_path + eeprom_pg0_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg0" + echo "" > $eeprom_pg0_path + eeprom_pg1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg1" + echo "" > $eeprom_pg1_path + eeprom_pg2_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg2" + echo "" > $eeprom_pg2_path + eeprom_pg3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg3" + echo "" > $eeprom_pg3_path + eeprom_pg11_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom_pg11" + echo "" > $eeprom_pg11_path +} + +QSFP_monitor() +{ + while true + do + if [ -e /sys/bus/i2c/devices/0-0061/module_present_1 ] && [ -e /sys/bus/i2c/devices/0-0062/module_present_32 ] && [ -e /sys/bus/i2c/devices/0-0041/eeprom_low ];then + bmc_qsfp_presence_read + mod_presence=$((port_25_32_presence<<8)) + mod_presence=`expr $mod_presence + $port_17_24_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_9_16_presence` + mod_presence=$((mod_presence<<8)) + mod_presence=`expr $mod_presence + $port_1_8_presence` + + for i in $(seq 1 32); + do + idx=`expr $i - 1` + check_bit=$((1<<$idx)) + is_presence=$(($mod_presence & $check_bit)) + if [ $i -le 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0061/" + else + cpld_path="/sys/bus/i2c/devices/0-0062/" + fi + + if [ $is_presence -eq 0 ];then + bmc_qsfp_eeprom_read $i + if [ $? -eq 0 ];then + echo 1 > $cpld_path"module_present_"$i + fi + else + echo 0 > $cpld_path"module_present_"$i + bmc_qsfp_eeprom_clear $i + fi + done + sleep 5 + else + sleep 1 + fi + done +} + +QSFP_monitor + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py new file mode 100644 index 0000000000..46121e6e7e --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/wistron_sw_to3200k_util.py @@ -0,0 +1,442 @@ +#!/usr/bin/env python + +""" +Usage: %(scriptName)s [options] command object + +options: + -h | --help : this help message + -d | --debug : run with debug mode + -f | --force : ignore error during installation or clean +command: + install : install drivers and generate related sysfs nodes + clean : uninstall drivers and remove related sysfs nodes + show : show all systen status + sff : dump SFP eeprom +""" + +import subprocess +import sys, getopt +import logging +import re +import time + +PROJECT_NAME = 'sw_to3200k' +version = '0.0.1' +verbose = False +DEBUG = False +args = [] +ALL_DEVICE = {} +DEVICE_NO = {'led':5, 'fan':7, 'thermal':7, 'psu':2, 'qsfp':32} + +led_prefix ='/sys/devices/platform/wistron_sw_to3200k_led/leds/wistron_'+PROJECT_NAME+'_led::' +hwmon_types = {'led': ['diag','fan','loc','psu1','psu2']} +hwmon_nodes = {'led': ['brightness']} +hwmon_prefix ={'led': led_prefix} + +i2c_prefix = '/sys/bus/i2c/devices/' + +i2c_bus = {'fan': ['0-0066'], + 'thermal': ['0-0049','0-004a','0-004b','0-004c','0-004d','0-004e','0-004f'], + 'psu': ['0-0051','0-0052'], + 'qsfp': ['0-0061']} + +i2c_nodes = {'fan': ['front_speed_rpm', 'rear_speed_rpm'], + 'thermal': ['temp1_input'], + 'psu': ['psu_present', 'psu_power_good'], + 'qsfp': ['module_present_']} + +sfp_map = [10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41] + +mknod =[ +'echo sw_to3200k_fpga 0x60 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_cpld1 0x61 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_cpld2 0x62 > /sys/bus/i2c/devices/i2c-0/new_device', +# FAN +'echo sw_to3200k_fan 0x66 > /sys/bus/i2c/devices/i2c-0/new_device', +# Thermal +'echo sw_to3200k_thermal 0x49 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4a > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4b > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4c > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4d > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4e > /sys/bus/i2c/devices/i2c-0/new_device', +'echo sw_to3200k_thermal 0x4f > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU-1 eeprom 0x51 +'echo sw_to3200k_psu1 0x51 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo acbel_fshxxx 0x59 > /sys/bus/i2c/devices/i2c-0/new_device', +# PSU-2 eeprom 0x52 +'echo sw_to3200k_psu2 0x52 > /sys/bus/i2c/devices/i2c-0/new_device', +'echo acbel_fshxxx 0x5a > /sys/bus/i2c/devices/i2c-0/new_device', +# EEPROM +'echo 24c02 0x56 > /sys/bus/i2c/devices/i2c-0/new_device', +] + +FORCE = 0 +logging.basicConfig(filename= PROJECT_NAME+'.log', filemode='w',level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) + +if DEBUG == True: + print(sys.argv[0]) + print('ARGV :', sys.argv[1:]) + +def main(): + global DEBUG + global args + global FORCE + + logging.basicConfig(level=logging.INFO) + + if len(sys.argv)<2: + show_help() + + options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help', + 'debug', + 'force', + ]) + if DEBUG == True: + print(options) + print(args) + print(len(sys.argv)) + + for opt, arg in options: + if opt in ('-h', '--help'): + show_help() + elif opt in ('-d', '--debug'): + DEBUG = True + logging.basicConfig(level=logging.INFO) + elif opt in ('-f', '--force'): + FORCE = 1 + else: + logging.info('no option') + for arg in args: + if arg == 'install': + do_install() + elif arg == 'clean': + do_uninstall() + elif arg == 'show': + device_traversal() + elif arg == 'sff': + if len(args)!=2: + show_eeprom_help() + elif int(args[1]) > DEVICE_NO['qsfp'] -1: + show_eeprom_help() + else: + show_eeprom(args[1]) + return + else: + show_help() + + + return 0 + +def show_help(): + print(__doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}) + sys.exit(0) + +def show_eeprom_help(): + cmd = sys.argv[0].split("/")[-1]+ " " + args[0] + print(" use \""+ cmd + " 1-32 \" to dump sfp# eeprom") + sys.exit(0) + +def my_log(txt): + if DEBUG == True: + print("[WISTRON DBG]: "+txt) + return + +def log_os_system(cmd, show): + logging.info('Run :'+cmd) + output = "" + status, output = subprocess.getstatusoutput(cmd) + my_log (cmd +"with result:" + str(status)) + my_log ("cmd:" + cmd) + my_log (" output:"+output) + if status: + logging.info('Failed :'+cmd) + if show: + print('Failed :'+cmd) + return status, output + +def driver_inserted(): + ret, lsmod = log_os_system("lsmod | grep wistron", 0) + logging.info('mods:'+lsmod) + if len(lsmod) ==0: + return False + + +kos = [ +'modprobe ipmi_msghandler', +'modprobe ipmi_si', +'modprobe ipmi_devintf', +'modprobe i2c_dev', +'modprobe at24', +'modprobe wistron_i2c_psu', +'modprobe wistron_sw_to3200k_cpld', +'modprobe wistron_sw_to3200k_fan', +'modprobe wistron_sw_to3200k_leds', +'modprobe wistron_sw_to3200k_psu', +'modprobe wistron_sw_to3200k_oom', +'modprobe wistron_sw_to3200k_thermal'] + +def driver_install(): + global FORCE + log_os_system("depmod", 1) + for i in range(0,len(kos)): + status, output = log_os_system(kos[i], 1) + time.sleep(1) + if status: + if FORCE == 0: + return status + return 0 + +def driver_uninstall(): + global FORCE + for i in range(0,len(kos)): + rm = kos[-(i+1)].replace("modprobe", "modprobe -rq") + lst = rm.split(" ") + print("lst=%s"%lst) + if len(lst) > 3: + del(lst[3]) + rm = " ".join(lst) + status, output = log_os_system(rm, 1) + if status: + if FORCE == 0: + return status + return 0 + +def device_install(): + global FORCE + for i in range(0,len(mknod)): + print("init i2c device instance") + status, output = log_os_system(mknod[i], 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output = log_os_system("echo sw_to3200k_oom 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/new_device", 1) + if status: + print(output) + if FORCE == 0: + return status + + for i in range(0,len(sfp_map)): + status, output =log_os_system("echo port"+str(i+1)+" > /sys/bus/i2c/devices/0-00"+str(sfp_map[i])+"/port_name", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def device_uninstall(): + global FORCE + + for i in range(0,len(sfp_map)): + target = "echo 0x"+str(sfp_map[i])+ " > /sys/bus/i2c/devices/i2c-0/delete_device" + print(target) + status, output =log_os_system(target, 1) + if status: + print(output) + if FORCE == 0: + return status + + nodelist = mknod + + for i in range(len(nodelist)): + target = nodelist[-(i+1)] + temp = target.split() + del temp[1] + temp[-1] = temp[-1].replace('new_device', 'delete_device') + status, output = log_os_system(" ".join(temp), 1) + if status: + print(output) + if FORCE == 0: + return status + + return + +def system_ready(): + if driver_inserted() == False: + return False + if not device_exist(): + print("not device_exist()") + return False + return True + +def do_install(): + if driver_inserted() == False: + status = driver_install() + time.sleep(1) + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" drivers detected....") + + if not device_exist(): + status = device_install() + if status: + if FORCE == 0: + return status + else: + print(PROJECT_NAME.upper()+" devices detected....") + + status, output = log_os_system( + "/bin/sh /usr/local/bin/platform_api_mgnt.sh init", 1) + if status: + print(output) + if FORCE == 0: + return status + return + +def do_uninstall(): + if not device_exist(): + print(PROJECT_NAME.upper() +" has no device installed....") + else: + print("Removing device....") + status = device_uninstall() + if status: + if FORCE == 0: + return status + + if driver_inserted()== False : + print(PROJECT_NAME.upper() +" has no driver installed....") + else: + print("Removing installed driver....") + status = driver_uninstall() + if status: + if FORCE == 0: + return status + + return + +def devices_info(): + global DEVICE_NO + global ALL_DEVICE + global i2c_bus, hwmon_types + for key in DEVICE_NO: + ALL_DEVICE[key]= {} + for i in range(0,DEVICE_NO[key]): + ALL_DEVICE[key][key+str(i+1)] = [] + + for key in i2c_bus: + buses = i2c_bus[key] + nodes = i2c_nodes[key] + for i in range(0,len(buses)): + for j in range(0,len(nodes)): + if 'fan' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + path = i2c_prefix+ buses[i]+"/fan"+str(k+1)+"_"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + elif 'qsfp' == key: + for k in range(0,DEVICE_NO[key]): + node = key+str(k+1) + if k < 16: + path = i2c_prefix+"0-0061/"+ nodes[j]+str(k+1) + else: + path = i2c_prefix+"0-0062/"+ nodes[j]+str(k+1) + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + else: + node = key+str(i+1) + path = i2c_prefix+ buses[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][node].append(path) + + for key in hwmon_types: + itypes = hwmon_types[key] + nodes = hwmon_nodes[key] + for i in range(0,len(itypes)): + for j in range(0,len(nodes)): + node = key+"_"+itypes[i] + path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j] + my_log(node+": "+ path) + ALL_DEVICE[key][ key+str(i+1)].append(path) + + #show dict all in the order + if DEBUG == True: + for i in sorted(ALL_DEVICE.keys()): + print(i+": ") + for j in sorted(ALL_DEVICE[i].keys()): + print(" "+j) + for k in (ALL_DEVICE[i][j]): + print(" "+" "+k) + return + +def show_eeprom(index): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + node= "/sys/bus/i2c/devices/0-00"+str(sfp_map[int(index)-1])+"/eeprom1" + # check if got hexdump command in current environment + ret, log = log_os_system("which hexdump", 0) + ret, log2 = log_os_system("which busybox hexdump", 0) + if len(log): + hex_cmd = 'hexdump' + elif len(log2): + hex_cmd = ' busybox hexdump' + else: + log = 'Failed : no hexdump cmd!!' + logging.info(log) + print(log) + return 1 + + print("node=%s"%node) + ret, log = log_os_system(hex_cmd+" -C " + node, 1) + if ret==0: + print(log) + else: + print("**********device no found**********") + return + +#get digits inside a string. +#Ex: 31 for "sfp31" +def get_value(input): + digit = re.findall('\d+', input) + return int(digit[0]) + +def device_traversal(): + if system_ready()==False: + print("System's not ready.") + print("Please install first!") + return + + if len(ALL_DEVICE)==0: + devices_info() + for i in sorted(ALL_DEVICE.keys()): + print("============================================") + print(i.upper()+": ") + print("============================================") + + for j in sorted(ALL_DEVICE[i].keys(), key=get_value): + print(" "+j+":",) + for k in (ALL_DEVICE[i][j]): + ret, log = log_os_system("cat "+k, 0) + func = k.split("/")[-1].strip() + func = re.sub(j+'_','',func,1) + func = re.sub(i.lower()+'_','',func,1) + if ret==0: + print(func+"="+log+" ",) + else: + print(func+"="+"X"+" ",) + print() + print("----------------------------------------------------------------") + + + print() + return + +def device_exist(): + ret1, log = log_os_system("ls "+i2c_prefix+"*0060", 0) + ret2, log = log_os_system("ls "+i2c_prefix+"i2c-0", 0) + return not(ret1 or ret2) + +if __name__ == "__main__": + main()