From f0f7639fa260005b0a9a295bf83e39b600cd1ac5 Mon Sep 17 00:00:00 2001 From: zhixzhu <44230426+zhixzhu@users.noreply.github.com> Date: Sat, 11 Feb 2023 11:01:49 +0800 Subject: [PATCH 01/57] set cable length to 1m for backplane ports (#13572) Signed-off-by: Zhixin Zhu zhixzhu@cisco.com Why I did it backplane ports cable length need to be specified. How I did it separated handling for the specific port name. --- files/build_templates/buffers_config.j2 | 10 +- .../tests/multi_npu_data/buffers.json.j2 | 3 + .../multi_npu_data/buffers_defaults_t2.j2 | 43 +++++++++ .../sample-chassis-packet-lc-port-config.ini | 70 +++++++------- .../tests/test_multinpu_cfggen.py | 91 +++++++++++++++++++ 5 files changed, 181 insertions(+), 36 deletions(-) create mode 100644 src/sonic-config-engine/tests/multi_npu_data/buffers.json.j2 create mode 100644 src/sonic-config-engine/tests/multi_npu_data/buffers_defaults_t2.j2 diff --git a/files/build_templates/buffers_config.j2 b/files/build_templates/buffers_config.j2 index c8d0aa933204..11e35a7b4dd6 100644 --- a/files/build_templates/buffers_config.j2 +++ b/files/build_templates/buffers_config.j2 @@ -38,6 +38,7 @@ def {%- set ports2cable = defs.ports2cable %} {%- else %} {%- set ports2cable = { + 'internal' : '5m', 'torrouter_server' : '5m', 'leafrouter_torrouter' : '40m', 'spinerouter_leafrouter' : '300m' @@ -93,7 +94,14 @@ def {{ default_cable }} {%- endif %} {%- else -%} - {{ default_cable }} + {%- if port_name.startswith('Ethernet-BP') %} + {%- if 'internal' not in ports2cable %} + {%- set _ = ports2cable.update({'internal': '5m'}) %} + {%- endif -%} + {{ ports2cable['internal'] }} + {%- else -%} + {{ default_cable }} + {%- endif %} {%- endif %} {%- endif %} {%- endmacro %} diff --git a/src/sonic-config-engine/tests/multi_npu_data/buffers.json.j2 b/src/sonic-config-engine/tests/multi_npu_data/buffers.json.j2 new file mode 100644 index 000000000000..d99bc2021569 --- /dev/null +++ b/src/sonic-config-engine/tests/multi_npu_data/buffers.json.j2 @@ -0,0 +1,3 @@ +{%- set default_topo = 't2' %} +{%- include 'buffers_config.j2' %} + diff --git a/src/sonic-config-engine/tests/multi_npu_data/buffers_defaults_t2.j2 b/src/sonic-config-engine/tests/multi_npu_data/buffers_defaults_t2.j2 new file mode 100644 index 000000000000..d726aafb27af --- /dev/null +++ b/src/sonic-config-engine/tests/multi_npu_data/buffers_defaults_t2.j2 @@ -0,0 +1,43 @@ +{%- set default_cable = '300m' %} + +{%- set ports2cable = { + 'internal' : '1m' + } +-%} + +{%- macro generate_buffer_pool_and_profiles() %} + "BUFFER_POOL": { + "ingress_lossless_pool": { + "size": "12766208", + "type": "ingress", + "mode": "dynamic" + }, + "egress_lossless_pool": { + "size": "12766208", + "type": "egress", + "mode": "static" + }, + "egress_lossy_pool": { + "size": "7326924", + "type": "egress", + "mode": "dynamic" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "dynamic_th":"3" + }, + "egress_lossless_profile": { + "pool":"egress_lossless_pool", + "size":"0", + "static_th":"12766208" + }, + "egress_lossy_profile": { + "pool":"egress_lossy_pool", + "size":"1518", + "dynamic_th":"3" + } + }, +{%- endmacro %} diff --git a/src/sonic-config-engine/tests/sample-chassis-packet-lc-port-config.ini b/src/sonic-config-engine/tests/sample-chassis-packet-lc-port-config.ini index 52cb3360a504..296dd8a786ce 100644 --- a/src/sonic-config-engine/tests/sample-chassis-packet-lc-port-config.ini +++ b/src/sonic-config-engine/tests/sample-chassis-packet-lc-port-config.ini @@ -23,38 +23,38 @@ Ethernet43 12,13,14,15 Eth1/1/43 43 100000 Eth43-ASIC1 Ext Ethernet44 8,9,10,11 Eth1/1/44 44 100000 Eth44-ASIC1 Ext Ethernet46 4,5,6,7 Eth1/1/46 46 100000 Eth46-ASIC1 Ext Ethernet47 0,1,2,3 Eth1/1/47 47 100000 Eth47-ASIC1 Ext -Ethernet2320 16,17 Eth2320-ASIC1 2320 100000 Eth2320-ASIC1 Int -Ethernet2452 2052,2053 Eth2452-ASIC1 2452 100000 Eth2452-ASIC1 Int -Ethernet2454 2054,2055 Eth2454-ASIC1 2454 100000 Eth2454-ASIC1 Int -Ethernet2456 2056,2057 Eth2456-ASIC1 2456 100000 Eth2456-ASIC1 Int -Ethernet2458 2058,2059 Eth2458-ASIC1 2458 100000 Eth2458-ASIC1 Int -Ethernet2460 2060,2061 Eth2460-ASIC1 2460 100000 Eth2460-ASIC1 Int -Ethernet2462 2062,2063 Eth2462-ASIC1 2462 100000 Eth2462-ASIC1 Int -Ethernet2464 2064,2065 Eth2464-ASIC1 2464 100000 Eth2464-ASIC1 Int -Ethernet2466 2304,2305 Eth2466-ASIC1 2466 100000 Eth2466-ASIC1 Int -Ethernet2468 2306,2307 Eth2468-ASIC1 2468 100000 Eth2468-ASIC1 Int -Ethernet2470 2308,2309 Eth2470-ASIC1 2470 100000 Eth2470-ASIC1 Int -Ethernet2472 2310,2311 Eth2472-ASIC1 2472 100000 Eth2472-ASIC1 Int -Ethernet2474 2312,2313 Eth2474-ASIC1 2474 100000 Eth2474-ASIC1 Int -Ethernet2476 2314,2315 Eth2476-ASIC1 2476 100000 Eth2476-ASIC1 Int -Ethernet2478 2316,2317 Eth2478-ASIC1 2478 100000 Eth2478-ASIC1 Int -Ethernet2480 2318,2319 Eth2480-ASIC1 2480 100000 Eth2480-ASIC1 Int -Ethernet2482 2320,2321 Eth2482-ASIC1 2482 100000 Eth2482-ASIC1 Int -Ethernet2484 2560,2561 Eth2484-ASIC1 2484 100000 Eth2484-ASIC1 Int -Ethernet2486 2562,2563 Eth2486-ASIC1 2486 100000 Eth2486-ASIC1 Int -Ethernet2488 2564,2565 Eth2488-ASIC1 2488 100000 Eth2488-ASIC1 Int -Ethernet2490 2566,2567 Eth2490-ASIC1 2490 100000 Eth2490-ASIC1 Int -Ethernet2492 2568,2569 Eth2492-ASIC1 2492 100000 Eth2492-ASIC1 Int -Ethernet2494 2570,2571 Eth2494-ASIC1 2494 100000 Eth2494-ASIC1 Int -Ethernet2496 2572,2573 Eth2496-ASIC1 2496 100000 Eth2496-ASIC1 Int -Ethernet2498 2574,2575 Eth2498-ASIC1 2498 100000 Eth2498-ASIC1 Int -Ethernet2500 2576,2577 Eth2500-ASIC1 2500 100000 Eth2500-ASIC1 Int -Ethernet2502 2816,2817 Eth2502-ASIC1 2502 100000 Eth2502-ASIC1 Int -Ethernet2504 2818,2819 Eth2504-ASIC1 2504 100000 Eth2504-ASIC1 Int -Ethernet2506 2820,2821 Eth2506-ASIC1 2506 100000 Eth2506-ASIC1 Int -Ethernet2508 2822,2823 Eth2508-ASIC1 2508 100000 Eth2508-ASIC1 Int -Ethernet2510 2824,2825 Eth2510-ASIC1 2510 100000 Eth2510-ASIC1 Int -Ethernet2512 2826,2827 Eth2512-ASIC1 2512 100000 Eth2512-ASIC1 Int -Ethernet2514 2828,2829 Eth2514-ASIC1 2514 100000 Eth2514-ASIC1 Int -Ethernet2516 2830,2831 Eth2516-ASIC1 2516 100000 Eth2516-ASIC1 Int -Ethernet2518 2832,2833 Eth2518-ASIC1 2518 100000 Eth2518-ASIC1 Int +Ethernet-BP2320 16,17 Eth2320-ASIC1 2320 100000 Eth2320-ASIC1 Int +Ethernet-BP2452 2052,2053 Eth2452-ASIC1 2452 100000 Eth2452-ASIC1 Int +Ethernet-BP2454 2054,2055 Eth2454-ASIC1 2454 100000 Eth2454-ASIC1 Int +Ethernet-BP2456 2056,2057 Eth2456-ASIC1 2456 100000 Eth2456-ASIC1 Int +Ethernet-BP2458 2058,2059 Eth2458-ASIC1 2458 100000 Eth2458-ASIC1 Int +Ethernet-BP2460 2060,2061 Eth2460-ASIC1 2460 100000 Eth2460-ASIC1 Int +Ethernet-BP2462 2062,2063 Eth2462-ASIC1 2462 100000 Eth2462-ASIC1 Int +Ethernet-BP2464 2064,2065 Eth2464-ASIC1 2464 100000 Eth2464-ASIC1 Int +Ethernet-BP2466 2304,2305 Eth2466-ASIC1 2466 100000 Eth2466-ASIC1 Int +Ethernet-BP2468 2306,2307 Eth2468-ASIC1 2468 100000 Eth2468-ASIC1 Int +Ethernet-BP2470 2308,2309 Eth2470-ASIC1 2470 100000 Eth2470-ASIC1 Int +Ethernet-BP2472 2310,2311 Eth2472-ASIC1 2472 100000 Eth2472-ASIC1 Int +Ethernet-BP2474 2312,2313 Eth2474-ASIC1 2474 100000 Eth2474-ASIC1 Int +Ethernet-BP2476 2314,2315 Eth2476-ASIC1 2476 100000 Eth2476-ASIC1 Int +Ethernet-BP2478 2316,2317 Eth2478-ASIC1 2478 100000 Eth2478-ASIC1 Int +Ethernet-BP2480 2318,2319 Eth2480-ASIC1 2480 100000 Eth2480-ASIC1 Int +Ethernet-BP2482 2320,2321 Eth2482-ASIC1 2482 100000 Eth2482-ASIC1 Int +Ethernet-BP2484 2560,2561 Eth2484-ASIC1 2484 100000 Eth2484-ASIC1 Int +Ethernet-BP2486 2562,2563 Eth2486-ASIC1 2486 100000 Eth2486-ASIC1 Int +Ethernet-BP2488 2564,2565 Eth2488-ASIC1 2488 100000 Eth2488-ASIC1 Int +Ethernet-BP2490 2566,2567 Eth2490-ASIC1 2490 100000 Eth2490-ASIC1 Int +Ethernet-BP2492 2568,2569 Eth2492-ASIC1 2492 100000 Eth2492-ASIC1 Int +Ethernet-BP2494 2570,2571 Eth2494-ASIC1 2494 100000 Eth2494-ASIC1 Int +Ethernet-BP2496 2572,2573 Eth2496-ASIC1 2496 100000 Eth2496-ASIC1 Int +Ethernet-BP2498 2574,2575 Eth2498-ASIC1 2498 100000 Eth2498-ASIC1 Int +Ethernet-BP2500 2576,2577 Eth2500-ASIC1 2500 100000 Eth2500-ASIC1 Int +Ethernet-BP2502 2816,2817 Eth2502-ASIC1 2502 100000 Eth2502-ASIC1 Int +Ethernet-BP2504 2818,2819 Eth2504-ASIC1 2504 100000 Eth2504-ASIC1 Int +Ethernet-BP2506 2820,2821 Eth2506-ASIC1 2506 100000 Eth2506-ASIC1 Int +Ethernet-BP2508 2822,2823 Eth2508-ASIC1 2508 100000 Eth2508-ASIC1 Int +Ethernet-BP2510 2824,2825 Eth2510-ASIC1 2510 100000 Eth2510-ASIC1 Int +Ethernet-BP2512 2826,2827 Eth2512-ASIC1 2512 100000 Eth2512-ASIC1 Int +Ethernet-BP2514 2828,2829 Eth2514-ASIC1 2514 100000 Eth2514-ASIC1 Int +Ethernet-BP2516 2830,2831 Eth2516-ASIC1 2516 100000 Eth2516-ASIC1 Int +Ethernet-BP2518 2832,2833 Eth2518-ASIC1 2518 100000 Eth2518-ASIC1 Int diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index 8559c10394a3..be1f677e178e 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -445,6 +445,97 @@ def test_buffers_multi_asic_template(self): } } ) + + def test_buffers_chassis_packet_lc_template(self): + build_root_dir = os.path.join( + self.test_dir, "..", "..", ".." + ) + # using T2 buffer configuration + buffer_template = os.path.join( + build_root_dir, "files", "build_templates", "buffers_config.j2" + ) + minigraph = os.path.join( + self.test_dir, "sample-chassis-packet-lc-graph.xml" + ) + port_config_ini_asic1 = os.path.join( + self.test_dir, "sample-chassis-packet-lc-port-config.ini" + ) + device_config_dir = self.test_data_dir + device_buffer_template = os.path.join( + device_config_dir, "buffers.json.j2" + ) + shutil.copy2(buffer_template, device_config_dir) + # asic1 - mix of front end and back end ports + argument = ["-m", minigraph, "-p", port_config_ini_asic1, "-n", "asic1", "-t", device_buffer_template] + output = json.loads(self.run_script(argument, check_stderr=True)) + os.remove(os.path.join(device_config_dir, "buffers_config.j2")) + self.assertDictEqual( + output['CABLE_LENGTH'], + { + 'AZURE': { + 'Ethernet13': '300m', + 'Ethernet14': '300m', + 'Ethernet16': '300m', + 'Ethernet17': '300m', + 'Ethernet19': '300m', + 'Ethernet20': '300m', + 'Ethernet22': '300m', + 'Ethernet23': '300m', + 'Ethernet25': '300m', + 'Ethernet26': '300m', + 'Ethernet28': '300m', + 'Ethernet29': '300m', + 'Ethernet31': '300m', + 'Ethernet32': '300m', + 'Ethernet34': '300m', + 'Ethernet35': '300m', + 'Ethernet37': '300m', + 'Ethernet38': '300m', + 'Ethernet40': '300m', + 'Ethernet41': '300m', + 'Ethernet43': '300m', + 'Ethernet44': '300m', + 'Ethernet46': '300m', + 'Ethernet47': '300m', + 'Ethernet-BP2320': '1m', + 'Ethernet-BP2452': '1m', + 'Ethernet-BP2454': '1m', + 'Ethernet-BP2456': '1m', + 'Ethernet-BP2458': '1m', + 'Ethernet-BP2460': '1m', + 'Ethernet-BP2462': '1m', + 'Ethernet-BP2464': '1m', + 'Ethernet-BP2466': '1m', + 'Ethernet-BP2468': '1m', + 'Ethernet-BP2470': '1m', + 'Ethernet-BP2472': '1m', + 'Ethernet-BP2474': '1m', + 'Ethernet-BP2476': '1m', + 'Ethernet-BP2478': '1m', + 'Ethernet-BP2480': '1m', + 'Ethernet-BP2482': '1m', + 'Ethernet-BP2484': '1m', + 'Ethernet-BP2486': '1m', + 'Ethernet-BP2488': '1m', + 'Ethernet-BP2490': '1m', + 'Ethernet-BP2492': '1m', + 'Ethernet-BP2494': '1m', + 'Ethernet-BP2496': '1m', + 'Ethernet-BP2498': '1m', + 'Ethernet-BP2500': '1m', + 'Ethernet-BP2502': '1m', + 'Ethernet-BP2504': '1m', + 'Ethernet-BP2506': '1m', + 'Ethernet-BP2508': '1m', + 'Ethernet-BP2510': '1m', + 'Ethernet-BP2512': '1m', + 'Ethernet-BP2514': '1m', + 'Ethernet-BP2516': '1m', + 'Ethernet-BP2518': '1m' + } + } + ) + def test_bgpd_frr_frontendasic(self): self.assertTrue(*self.run_frr_asic_case('bgpd/bgpd.conf.j2', 'bgpd_frr_frontend_asic.conf', "asic0", self.port_config[0])) From ad679a0338e98e3ac26973bc5443040d0ddac5f6 Mon Sep 17 00:00:00 2001 From: spilkey-cisco <110940806+spilkey-cisco@users.noreply.github.com> Date: Fri, 10 Feb 2023 21:34:10 -0800 Subject: [PATCH 02/57] Add asic presence filtering for container checking in system-health (#13497) Why I did it On a supervisor card in a chassis, syncd/teamd/swss/lldp etc dockers are created for each Switch Fabric card. However, not all chassis would have all the switch fabric cards present. In this case, only dockers for Switch Fabrics present would be created. system-health indicates errors in this scenario as it is expecting dockers for all Switch Fabrics (based on NUM_ASIC defined in asic.conf file). system-health process error messages were also altered to indicate which container had the issue; multiple containers may run processes with the same name, which can result in identical system-health error messages, causing ambiguity. How I did it Port container_checker logic from #11442 into service_checker for system-health. How to verify it Bringup Supervisor card with one or more missing fabric cards. Execute 'show system-health summary'. The command should not report failure due to missing dockers for the asics on the fabric cards which are not present. --- .../health_checker/service_checker.py | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/system-health/health_checker/service_checker.py b/src/system-health/health_checker/service_checker.py index df6005cc0f92..9a88a0851bc8 100644 --- a/src/system-health/health_checker/service_checker.py +++ b/src/system-health/health_checker/service_checker.py @@ -71,6 +71,19 @@ def get_expected_running_containers(self, feature_table): """ expected_running_containers = set() container_feature_dict = {} + + # Get current asic presence list. For multi_asic system, multi instance containers + # should be checked only for asics present. + asics_id_presence = multi_asic.get_asic_presence_list() + + # Some services may run all the instances irrespective of asic presence. + # Add those to exception list. + # database service: Currently services have dependency on all database services to + # be up irrespective of asic presence. + # bgp service: Currently bgp runs all instances. Once this is fixed to be config driven, + # it will be removed from exception list. + run_all_instance_list = ['database', 'bgp'] + for feature_name, feature_entry in feature_table.items(): if feature_entry["state"] not in ["disabled", "always_disabled"]: if multi_asic.is_multi_asic(): @@ -80,8 +93,9 @@ def get_expected_running_containers(self, feature_table): if feature_entry["has_per_asic_scope"] == "True": num_asics = multi_asic.get_num_asics() for asic_id in range(num_asics): - expected_running_containers.add(feature_name + str(asic_id)) - container_feature_dict[feature_name + str(asic_id)] = feature_name + if asic_id in asics_id_presence or feature_name in run_all_instance_list: + expected_running_containers.add(feature_name + str(asic_id)) + container_feature_dict[feature_name + str(asic_id)] = feature_name else: expected_running_containers.add(feature_name) container_feature_dict[feature_name] = feature_name @@ -342,7 +356,7 @@ def check_process_existence(self, container_name, critical_process_list, config, process_status = utils.run_command(cmd) if process_status is None: for process_name in critical_process_list: - self.set_object_not_ok('Process', '{}:{}'.format(container_name, process_name), "'{}' is not running".format(process_name)) + self.set_object_not_ok('Process', '{}:{}'.format(container_name, process_name), "Process '{}' in container '{}' is not running".format(process_name, container_name)) self.publish_events(container_name, critical_process_list) return @@ -355,6 +369,6 @@ def check_process_existence(self, container_name, critical_process_list, config, # and it is safe to ignore such process. E.g, radv. So here we only check those processes which are in process_status. if process_name in process_status: if process_status[process_name] != 'RUNNING': - self.set_object_not_ok('Process', '{}:{}'.format(container_name, process_name), "'{}' is not running".format(process_name)) + self.set_object_not_ok('Process', '{}:{}'.format(container_name, process_name), "Process '{}' in container '{}' is not running".format(process_name, container_name)) else: self.set_object_ok('Process', '{}:{}'.format(container_name, process_name)) From 43683d8ceeebb61f591a8e8a65c17318d539a02f Mon Sep 17 00:00:00 2001 From: "Richard.Yu" Date: Sat, 11 Feb 2023 19:32:09 +0800 Subject: [PATCH 03/57] [submodule][sairedis]Advance submodule head (#13724) include sairedis changes 3a960be | [submodule][SAI]ADvance SAI Header (#1206) 7026441 | [Mellanox] Enable DSCP remapping by using SAI attribute (#1188) a2c37b8 | [syncd]: Enable port bulk API (#1197) include SAI changes 7710e24 | [cherry-pick][202211]Enhance the check enum lock script (#1741) (#1742) 0031470 | improve enum values integration check (#1727) (#1737) 4f11c7e | Enable github code scanning to replace LGTM. (#1709) 0fd23d2 | [SAI-PTF] Skip test when hit expected error from sai api (#1699) aba7612 | [SAI-PTF] API Logger - reformat arg values (#1696) 1390cee | [SAI-PTF] API Logger - reformat dict in return value (#1690) 3d96a1d | [SAI-PTF]Add return value in the SAI-PTF log (#1685) Signed-off-by: richardyu-ms --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 0434b6200982..3a960bec9baa 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 0434b620098200ee9024d0f4152b3fe7c2753de2 +Subproject commit 3a960bec9baa16689efa69117f58ed6438d465e7 From ead7925f7dc2222f365a235b84ea3d8e8cd22de1 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sun, 12 Feb 2023 17:20:19 +0800 Subject: [PATCH 04/57] [submodule] Advance sonic-linux-kernel pointer (#13732) 464d2cdb [Mellanox] Update linux kernel for hw-mgmt V.7.0020.4104 (#305) Signed-off-by: Stephen Sun --- src/sonic-linux-kernel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-linux-kernel b/src/sonic-linux-kernel index 6daddcfa6a84..464d2cdbb9d6 160000 --- a/src/sonic-linux-kernel +++ b/src/sonic-linux-kernel @@ -1 +1 @@ -Subproject commit 6daddcfa6a84434840df718272f57fd7d2c7f053 +Subproject commit 464d2cdbb9d6283124babcbb4b0df3aca0b53d68 From 3112997b5a7b757f01892a79161773024eb19596 Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sun, 12 Feb 2023 17:23:47 +0800 Subject: [PATCH 05/57] [Mellanox] Advance hw-mgmt to v.7.0020.4104 (#13372) - Why I did it Advance hw-mgmt service to V.7.0020.4100 Add missing thermal sensors that are supported by hw-mgmt package Delay system health service before hw-mgmt has started on Mellanox platform in order to avoid reading some sensors before ready. Depends on sonic-net/sonic-linux-kernel#305 - How I did it 1. Update hw mgmt version 2. Add missing sensors 3. Delay service - How to verify it Regression test. Signed-off-by: Stephen Sun --- .../x86_64-mlnx_msn2010-r0/platform.json | 3 + .../x86_64-mlnx_msn2100-r0/platform.json | 3 + .../x86_64-mlnx_msn2410-r0/platform.json | 3 + .../x86_64-mlnx_msn2700-r0/platform.json | 3 + .../x86_64-nvidia_sn2201-r0/platform.json | 3 + platform/mellanox/hw-management.mk | 2 +- ...mine-reboot-cause-service-start-afte.patch | 10 ++-- ...02-Disable-hw-mgmt-on-SimX-platforms.patch | 58 ++++++++----------- ...on-upstream-kernel-modules-from-load.patch | 8 +-- ...th-service-starts-after-hw-managemen.patch | 29 ++++++++++ platform/mellanox/hw-management/hw-mgmt | 2 +- 11 files changed, 78 insertions(+), 46 deletions(-) create mode 100644 platform/mellanox/hw-management/0004-Make-system-health-service-starts-after-hw-managemen.patch diff --git a/device/mellanox/x86_64-mlnx_msn2010-r0/platform.json b/device/mellanox/x86_64-mlnx_msn2010-r0/platform.json index 1e8fe747f906..d48b4e8e8fc8 100644 --- a/device/mellanox/x86_64-mlnx_msn2010-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn2010-r0/platform.json @@ -67,6 +67,9 @@ }, { "name": "CPU Core 3 Temp" + }, + { + "name": "SODIMM 1 Temp" } ], "sfps": [ diff --git a/device/mellanox/x86_64-mlnx_msn2100-r0/platform.json b/device/mellanox/x86_64-mlnx_msn2100-r0/platform.json index 74b4397759c1..485a3614b66b 100644 --- a/device/mellanox/x86_64-mlnx_msn2100-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn2100-r0/platform.json @@ -67,6 +67,9 @@ }, { "name": "CPU Core 3 Temp" + }, + { + "name": "SODIMM 1 Temp" } ], "sfps": [ diff --git a/device/mellanox/x86_64-mlnx_msn2410-r0/platform.json b/device/mellanox/x86_64-mlnx_msn2410-r0/platform.json index 6ed5a3a84aa8..98a60a5e898f 100644 --- a/device/mellanox/x86_64-mlnx_msn2410-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn2410-r0/platform.json @@ -114,6 +114,9 @@ }, { "name": "CPU Pack Temp" + }, + { + "name": "SODIMM 1 Temp" } ], "sfps": [ diff --git a/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json b/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json index 063a211e785c..22599926e3fa 100644 --- a/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json +++ b/device/mellanox/x86_64-mlnx_msn2700-r0/platform.json @@ -114,6 +114,9 @@ }, { "name": "CPU Pack Temp" + }, + { + "name": "SODIMM 1 Temp" } ], "sfps": [ diff --git a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json index 83250c75f74e..b0ab14793910 100644 --- a/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json +++ b/device/mellanox/x86_64-nvidia_sn2201-r0/platform.json @@ -101,6 +101,9 @@ }, { "name": "ASIC" + }, + { + "name": "SODIMM 1 Temp" } ], "sfps": [{ diff --git a/platform/mellanox/hw-management.mk b/platform/mellanox/hw-management.mk index 0c8c8c1b548d..a12bd9b32aca 100644 --- a/platform/mellanox/hw-management.mk +++ b/platform/mellanox/hw-management.mk @@ -16,7 +16,7 @@ # # Mellanox HW Management -MLNX_HW_MANAGEMENT_VERSION = 7.0020.3006 +MLNX_HW_MANAGEMENT_VERSION = 7.0020.4104 export MLNX_HW_MANAGEMENT_VERSION diff --git a/platform/mellanox/hw-management/0001-Make-SONiC-determine-reboot-cause-service-start-afte.patch b/platform/mellanox/hw-management/0001-Make-SONiC-determine-reboot-cause-service-start-afte.patch index 11539e606369..f7667ed6c4ea 100644 --- a/platform/mellanox/hw-management/0001-Make-SONiC-determine-reboot-cause-service-start-afte.patch +++ b/platform/mellanox/hw-management/0001-Make-SONiC-determine-reboot-cause-service-start-afte.patch @@ -1,8 +1,8 @@ -From 1a1011b6da491d35001df5a7204d4eecb2769767 Mon Sep 17 00:00:00 2001 +From 489764eb124e03087eb408dec27d769fa4f98459 Mon Sep 17 00:00:00 2001 From: keboliu Date: Fri, 15 Jan 2021 14:41:16 +0800 -Subject: [PATCH] Make SONiC determine-reboot-cause service start after hw-mgmt - service +Subject: [PATCH 1/4] Make SONiC determine-reboot-cause service start after + hw-mgmt service Signed-off-by: Kebo Liu --- @@ -10,7 +10,7 @@ Signed-off-by: Kebo Liu 1 file changed, 1 insertion(+) diff --git a/debian/hw-management.hw-management.service b/debian/hw-management.hw-management.service -index 39a2a54..2104b87 100755 +index 8bdcaef..1c25ffb 100755 --- a/debian/hw-management.hw-management.service +++ b/debian/hw-management.hw-management.service @@ -1,6 +1,7 @@ @@ -22,5 +22,5 @@ index 39a2a54..2104b87 100755 [Service] Type=oneshot -- -1.9.1 +2.20.1 diff --git a/platform/mellanox/hw-management/0002-Disable-hw-mgmt-on-SimX-platforms.patch b/platform/mellanox/hw-management/0002-Disable-hw-mgmt-on-SimX-platforms.patch index c12474712b9b..61aab18090a2 100644 --- a/platform/mellanox/hw-management/0002-Disable-hw-mgmt-on-SimX-platforms.patch +++ b/platform/mellanox/hw-management/0002-Disable-hw-mgmt-on-SimX-platforms.patch @@ -1,59 +1,47 @@ -From 79dadd5b0d2f5e860b525c12d4d3843607b03a9f Mon Sep 17 00:00:00 2001 +From 422b64397f2f33b394d037820f0ceb4c09e3a725 Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Fri, 21 Jan 2022 16:47:19 +0000 -Subject: [PATCH] Disable hw-mgmt on SimX platforms +Subject: [PATCH 2/4] Disable hw-mgmt on SimX platforms --- - usr/usr/bin/hw-management-ready.sh | 31 ++++++++++++++++-------------- + usr/usr/bin/hw-management-ready.sh | 11 +++++++---- usr/usr/bin/hw-management.sh | 9 +++++++++ - 2 files changed, 26 insertions(+), 14 deletions(-) + 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/usr/usr/bin/hw-management-ready.sh b/usr/usr/bin/hw-management-ready.sh -index 5a9698c..364f906 100755 +index 88672a8..7558c68 100755 --- a/usr/usr/bin/hw-management-ready.sh +++ b/usr/usr/bin/hw-management-ready.sh -@@ -51,19 +51,22 @@ if [ -d /var/run/hw-management ]; then +@@ -51,17 +51,20 @@ if [ -d /var/run/hw-management ]; then rm -fr /var/run/hw-management fi -case $board_type in -VMOD0014) -- while [ ! -d /sys/devices/pci0000:00/0000:00:1f.0/NVSN2201:00/mlxreg-hotplug/hwmon ] -- do -- sleep 1 -- done -- ;; ++if [ -z "$(lspci -vvv | grep SimX)" ]; then ++ case $board_type in ++ VMOD0014) + if [ ! -d /sys/devices/pci0000:00/0000:00:1f.0/NVSN2201:00/mlxreg-hotplug/hwmon ]; then + timeout 180 bash -c 'until [ -d /sys/devices/pci0000:00/0000:00:1f.0/NVSN2201:00/mlxreg-hotplug/hwmon ]; do sleep 0.2; done' + fi + ;; -*) -- while [ ! -d /sys/devices/platform/mlxplat/mlxreg-hotplug/hwmon ] -- do -- sleep 1 -- done -- ;; ++ *) + if [ ! -d /sys/devices/platform/mlxplat/mlxreg-hotplug/hwmon ]; then + timeout 180 bash -c 'until [ -d /sys/devices/platform/mlxplat/mlxreg-hotplug/hwmon ]; do sleep 0.2; done' + fi + ;; -esac -+if [ -z "$(lspci -vvv | grep SimX)" ]; then -+ case $board_type in -+ VMOD0014) -+ while [ ! -d /sys/devices/pci0000:00/0000:00:1f.0/NVSN2201:00/mlxreg-hotplug/hwmon ] -+ do -+ sleep 1 -+ done -+ ;; -+ *) -+ while [ ! -d /sys/devices/platform/mlxplat/mlxreg-hotplug/hwmon ] -+ do -+ sleep 1 -+ done -+ ;; -+ esac ++ esac +fi + echo "Start Chassis HW management service." logger -t hw-management -p daemon.notice "Start Chassis HW management service." diff --git a/usr/usr/bin/hw-management.sh b/usr/usr/bin/hw-management.sh -index ebfabb0..c0c038e 100755 +index 1ee05b5..50d922b 100755 --- a/usr/usr/bin/hw-management.sh +++ b/usr/usr/bin/hw-management.sh -@@ -1495,6 +1495,13 @@ do_chip_down() +@@ -2310,6 +2310,13 @@ do_chip_down() /usr/bin/hw-management-thermal-events.sh change hotplug_asic down %S %p } @@ -67,7 +55,7 @@ index ebfabb0..c0c038e 100755 __usage=" Usage: $(basename "$0") [Options] -@@ -1520,6 +1527,8 @@ Options: +@@ -2335,6 +2342,8 @@ Options: force-reload Performs hw-management 'stop' and the 'start. " @@ -77,5 +65,5 @@ index ebfabb0..c0c038e 100755 start) if [ -d /var/run/hw-management ]; then -- -2.17.1 +2.20.1 diff --git a/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch index 496085e9d4d8..ba83bf6764ee 100644 --- a/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch +++ b/platform/mellanox/hw-management/0003-Remove-unused-non-upstream-kernel-modules-from-load.patch @@ -1,14 +1,14 @@ -From 14b06a12802fc0e15116a64f419d002d0d21d695 Mon Sep 17 00:00:00 2001 +From 439639e939f896f9aee42a4dbd5216feb728220c Mon Sep 17 00:00:00 2001 From: Alexander Allen Date: Thu, 17 Feb 2022 04:19:50 +0000 -Subject: [PATCH] Remove unused non-upstream kernel modules from load +Subject: [PATCH 3/4] Remove unused non-upstream kernel modules from load --- usr/etc/modules-load.d/05-hw-management-modules.conf | 2 -- 1 file changed, 2 deletions(-) diff --git a/usr/etc/modules-load.d/05-hw-management-modules.conf b/usr/etc/modules-load.d/05-hw-management-modules.conf -index 39f621e..c0980bc 100644 +index cfcfaa4..dd3b5ca 100644 --- a/usr/etc/modules-load.d/05-hw-management-modules.conf +++ b/usr/etc/modules-load.d/05-hw-management-modules.conf @@ -15,8 +15,6 @@ xdpe12284 @@ -21,5 +21,5 @@ index 39f621e..c0980bc 100644 gpio-pca953x pmbus -- -2.17.1 +2.20.1 diff --git a/platform/mellanox/hw-management/0004-Make-system-health-service-starts-after-hw-managemen.patch b/platform/mellanox/hw-management/0004-Make-system-health-service-starts-after-hw-managemen.patch new file mode 100644 index 000000000000..6af57c842d2d --- /dev/null +++ b/platform/mellanox/hw-management/0004-Make-system-health-service-starts-after-hw-managemen.patch @@ -0,0 +1,29 @@ +From 038bce6bf808ec9d082e96fec4184e060b3a85a9 Mon Sep 17 00:00:00 2001 +From: Stephen Sun +Date: Mon, 28 Nov 2022 03:55:14 +0000 +Subject: [PATCH 4/4] Make system-health service starts after hw-management to + avoid failures + +On SN2410, it can fail to read the file led_status_capability if it starts from ONIE + +Signed-off-by: Stephen Sun +--- + debian/hw-management.hw-management.service | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/debian/hw-management.hw-management.service b/debian/hw-management.hw-management.service +index 1c25ffb..0fbd877 100755 +--- a/debian/hw-management.hw-management.service ++++ b/debian/hw-management.hw-management.service +@@ -1,7 +1,7 @@ + [Unit] + Description=Chassis HW management service of Mellanox systems + Documentation=man:hw-management.service(8) +-Before=determine-reboot-cause.service ++Before=determine-reboot-cause.service system-health.service + + [Service] + Type=oneshot +-- +2.20.1 + diff --git a/platform/mellanox/hw-management/hw-mgmt b/platform/mellanox/hw-management/hw-mgmt index 137109ed15be..9c3f6b2d6ac4 160000 --- a/platform/mellanox/hw-management/hw-mgmt +++ b/platform/mellanox/hw-management/hw-mgmt @@ -1 +1 @@ -Subproject commit 137109ed15be147a99b59ceb9dfa1799688dfb71 +Subproject commit 9c3f6b2d6ac4be2eda936522f369ff8920deb4e2 From 389b279ba9853fee4b264ee1a38cb2d1f5e72219 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 14 Feb 2023 14:26:25 +0800 Subject: [PATCH 06/57] [Mellanox] set select timeout to no more than 1 sec to make sure fast shutdown (#13611) - Why I did it Commit sonic-net/sonic-platform-daemons@153ea47 changed SfpStateUpdateTask from Process to Thread. In this commit, it raises an exception in SfpStateUpdateTask to make shutdown flow fast. But it does not work on Nvidia platform as Nvidia platform is passing timeout parameter of get_change_event to select. Linux select function can not be interrupted by a Python exception. There is no such issue on Nvidia platform before that commit. However, in order to comply with the commit and make shutdown flow fast, we decided to change Nvidia platform API implementation. To fix issue #13591. - How I did it The select call in get_change_event should use no more than 1 second as timeout parameter. Outside the select call, add a while loop to make sure timeout parameter of get_change_event work as expected - How to verify it Manual test --- .../sonic_platform/chassis.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py index e13b90d6c0ca..17d66b2e8f64 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/chassis.py @@ -31,10 +31,10 @@ from . import utils from .device_data import DeviceDataManager import re + import time except ImportError as e: raise ImportError (str(e) + "- required module not found") -MAX_SELECT_DELAY = 3600 RJ45_TYPE = "RJ45" @@ -387,26 +387,30 @@ def get_change_event(self, timeout=0): self.sfp_event.initialize() wait_for_ever = (timeout == 0) + # select timeout should be no more than 1000ms to ensure fast shutdown flow + select_timeout = 1000.0 if timeout >= 1000 else float(timeout) port_dict = {} error_dict = {} - if wait_for_ever: - timeout = MAX_SELECT_DELAY - while True: - status = self.sfp_event.check_sfp_status(port_dict, error_dict, timeout) - if bool(port_dict): + begin = time.time() + while True: + status = self.sfp_event.check_sfp_status(port_dict, error_dict, select_timeout) + if bool(port_dict): + break + + if not wait_for_ever: + elapse = time.time() - begin + if elapse * 1000 > timeout: break - else: - status = self.sfp_event.check_sfp_status(port_dict, error_dict, timeout) if status: if port_dict: self.reinit_sfps(port_dict) - result_dict = {'sfp':port_dict} + result_dict = {'sfp': port_dict} if error_dict: result_dict['sfp_error'] = error_dict return True, result_dict else: - return True, {'sfp':{}} + return True, {'sfp': {}} def reinit_sfps(self, port_dict): """ From 71b5bb6f37358cf1fad795ecef7db750ad2fc92e Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Tue, 14 Feb 2023 14:55:28 +0800 Subject: [PATCH 07/57] [Mellanox] Support per PSU slope value for PSU power threshold (#13757) - Why I did it Support per PSU slope value for PSU power threshold according to hardware team requirement - How I did it Pass the PSU number as a parameter when fetching the slope value of PSU. - How to verify it Running regression and manual test Signed-off-by: Stephen Sun --- platform/mellanox/mlnx-platform-api/sonic_platform/psu.py | 6 ++++-- platform/mellanox/mlnx-platform-api/tests/test_psu.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py index 413eaee9bc5f..521183ca1f19 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/psu.py @@ -220,7 +220,7 @@ class Psu(FixedPsu): FAN_AMBIENT_TEMP = os.path.join(PSU_PATH, "thermal/fan_amb") AMBIENT_TEMP_CRITICAL_THRESHOLD = os.path.join(PSU_PATH, "config/amb_tmp_crit_limit") AMBIENT_TEMP_WARNING_THRESHOLD = os.path.join(PSU_PATH, "config/amb_tmp_warn_limit") - PSU_POWER_SLOPE = os.path.join(PSU_PATH, "config/psu_power_slope") + PSU_POWER_SLOPE = os.path.join(PSU_PATH, "config/psu{}_power_slope") shared_led = None @@ -245,6 +245,8 @@ def __init__(self, psu_index): self.psu_temp = os.path.join(PSU_PATH, 'thermal/psu{}_temp'.format(self.index)) self.psu_temp_threshold = os.path.join(PSU_PATH, 'thermal/psu{}_temp_max'.format(self.index)) + self.psu_power_slope = os.path.join(PSU_PATH, self.PSU_POWER_SLOPE.format(self.index)) + from .fan import PsuFan self._fan_list.append(PsuFan(psu_index, 1, self)) @@ -529,7 +531,7 @@ def _get_psu_power_threshold(self, temp_threshold_path): if ambient_temp < temp_threshold: power_threshold = power_max_capacity else: - slope = utils.read_int_from_file(Psu.PSU_POWER_SLOPE) + slope = utils.read_int_from_file(self.psu_power_slope) power_threshold = power_max_capacity - (ambient_temp - temp_threshold) * slope if power_threshold <= 0: logger.log_warning('Got negative PSU power threshold {} for {}'.format(power_threshold, self.get_name())) diff --git a/platform/mellanox/mlnx-platform-api/tests/test_psu.py b/platform/mellanox/mlnx-platform-api/tests/test_psu.py index 7fff0d548216..00c3bc8623a7 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_psu.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_psu.py @@ -172,7 +172,7 @@ def test_psu_power_threshold(self, mock_read_int_from_file): psu.psu_power_max_capacity: 100000000, psu.AMBIENT_TEMP_CRITICAL_THRESHOLD: 65000, psu.AMBIENT_TEMP_WARNING_THRESHOLD: 55000, - psu.PSU_POWER_SLOPE: 2000 + psu.psu_power_slope: 2000 } normal_data = { psu.PORT_AMBIENT_TEMP: 55000, From e5a294644c4961bbd99f8b6db74ad0e7e774ba92 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Tue, 14 Feb 2023 08:57:19 +0200 Subject: [PATCH 08/57] [dockerd] Force usage of cgo DNS resolver (#13649) Go's runtime (and dockerd inherits this) uses own DNS resolver implementation by default on Linux. It has been observed that there are some DNS resolution issues when executing ```docker pull``` after first boot. Consider the following script: ``` admin@r-boxer-sw01:~$ while :; do date; cat /etc/resolv.conf; ping -c 1 harbor.mellanox.com; docker pull harbor.mellanox.com/sonic/cpu-report:1.0.0 ; sleep 1; done Fri 03 Feb 2023 10:06:22 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=5.99 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.989/5.989/5.989/0.000 ms Error response from daemon: Get "https://harbor.mellanox.com/v2/": dial tcp: lookup harbor.mellanox.com on [::1]:53: read udp [::1]:57245->[::1]:53: read: connection refused Fri 03 Feb 2023 10:06:23 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=5.56 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.561/5.561/5.561/0.000 ms Error response from daemon: Get "https://harbor.mellanox.com/v2/": dial tcp: lookup harbor.mellanox.com on [::1]:53: read udp [::1]:53299->[::1]:53: read: connection refused Fri 03 Feb 2023 10:06:24 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=5.78 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.783/5.783/5.783/0.000 ms Error response from daemon: Get "https://harbor.mellanox.com/v2/": dial tcp: lookup harbor.mellanox.com on [::1]:53: read udp [::1]:55765->[::1]:53: read: connection refused Fri 03 Feb 2023 10:06:25 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=7.17 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 7.171/7.171/7.171/0.000 ms Error response from daemon: Get "https://harbor.mellanox.com/v2/": dial tcp: lookup harbor.mellanox.com on [::1]:53: read udp [::1]:44877->[::1]:53: read: connection refused Fri 03 Feb 2023 10:06:26 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=5.66 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 5.656/5.656/5.656/0.000 ms Error response from daemon: Get "https://harbor.mellanox.com/v2/": dial tcp: lookup harbor.mellanox.com on [::1]:53: read udp [::1]:54604->[::1]:53: read: connection refused Fri 03 Feb 2023 10:06:27 AM UTC nameserver 10.211.0.124 nameserver 10.211.0.121 nameserver 10.7.77.135 search mtr.labs.mlnx labs.mlnx mlnx lab.mtl.com mtl.com PING harbor.mellanox.com (10.7.1.117) 56(84) bytes of data. 64 bytes from harbor.mtl.labs.mlnx (10.7.1.117): icmp_seq=1 ttl=53 time=8.22 ms --- harbor.mellanox.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 8.223/8.223/8.223/0.000 ms 1.0.0: Pulling from sonic/cpu-report 004f1eed87df: Downloading [===================> ] 19.3MB/50.43MB 5d6f1e8117db: Download complete 48c2faf66abe: Download complete 234b70d0479d: Downloading [=========> ] 9.363MB/51.84MB 6fa07a00e2f0: Downloading [==> ] 9.51MB/192.4MB 04a31b4508b8: Waiting e11ae5168189: Waiting 8861a99744cb: Waiting d59580d95305: Waiting 12b1523494c1: Waiting d1a4b09e9dbc: Waiting 99f41c3f014f: Waiting ``` While /etc/resolv.conf has the correct content and ping (and any other utility that uses libc's DNS resolution implementation) works correctly docker is unable to resolve the hostname and falls back to default [::1]:53. This started to happen after PR https://github.com/sonic-net/sonic-buildimage/pull/13516 has been merged. As you can see from the log, dockerd is able to pick up the correct /etc/resolv.conf only after 5 sec since first try. This seems to be somehow related to the logic in Go's DNS resolver https://github.com/golang/go/blob/master/src/net/dnsclient_unix.go#L385. There have been issues like that reported in docker like: - https://github.com/docker/cli/issues/2299 - https://github.com/docker/cli/issues/2618 - https://github.com/moby/moby/issues/22398 Since this starts to happen after inclusion of resolvconf package by above mentioned PR and the fact I can't see any problem with that (ping, nslookup, etc. works) the choice is made to force dockerd to use cgo (libc) resolver. Signed-off-by: Stepan Blyschak --- files/docker/docker.service.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/files/docker/docker.service.conf b/files/docker/docker.service.conf index 7debd85a50ac..73d953ecfdd5 100644 --- a/files/docker/docker.service.conf +++ b/files/docker/docker.service.conf @@ -1,3 +1,4 @@ [Service] +Environment=GODEBUG=netdns=cgo ExecStart= ExecStart=/usr/bin/dockerd -H unix:// --storage-driver=overlay2 --bip=240.127.1.1/24 --iptables=false --ipv6=true --fixed-cidr-v6=fd00::/80 From cdfc5834a5c0d36872263c098c33720d5abacf14 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Tue, 14 Feb 2023 08:58:56 +0200 Subject: [PATCH 09/57] [submodule] Advance sonic-platform-daemons pointer (#13552) Update sonic-platform-daemons submodule pointer to include the following: * 906d198 add data for telemtery enhancement for 'active-active' cable type ([#332](https://github.com/sonic-net/sonic-platform-daemons/pull/332)) Signed-off-by: dprital --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index a931d6c727f4..906d198dea3c 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit a931d6c727f4bf97f893ea52160412a2cb8eca16 +Subproject commit 906d198dea3cddc2d9b864a89028b590bd5c1ff8 From 82069256310e019b501a39914696e2e0955436b6 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 14 Feb 2023 14:59:38 +0800 Subject: [PATCH 10/57] [Build] Change the default mirror version config file (#13786) Why I did it Change the mirror config file Use the files/build/versions/default/versions-mirror only when reproducible build enabled. The config in files/build/versions is only for reproducible build, while snapshot mirror feature does not have the dependency on the reproducible build. How I did it Skip the mirror config in files/build/versions/default/versions-mirror if reproducible build not enabled. How to verify it --- Makefile.work | 1 + scripts/build_mirror_config.sh | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile.work b/Makefile.work index a8d3f759360f..2dda7876cc57 100644 --- a/Makefile.work +++ b/Makefile.work @@ -555,6 +555,7 @@ endif export MIRROR_URLS export MIRROR_SECURITY_URLS +export SONIC_VERSION_CONTROL_COMPONENTS %:: | sonic-build-hooks ifneq ($(filter y, $(MULTIARCH_QEMU_ENVIRON) $(CROSS_BUILD_ENVIRON)),) diff --git a/scripts/build_mirror_config.sh b/scripts/build_mirror_config.sh index a1e5900a48b8..aee56f23ae6a 100755 --- a/scripts/build_mirror_config.sh +++ b/scripts/build_mirror_config.sh @@ -6,7 +6,8 @@ export ARCHITECTURE=$2 export DISTRIBUTION=$3 DEFAULT_MIRROR_URL_PREFIX=http://packages.trafficmanager.net -MIRROR_VERSION_FILE=files/build/versions/default/versions-mirror +MIRROR_VERSION_FILE= +[[ "$SONIC_VERSION_CONTROL_COMPONENTS" == *deb* || $SONIC_VERSION_CONTROL_COMPONENTS == *all* ]] && MIRROR_VERSION_FILE=files/build/versions/default/versions-mirror [ -f target/versions/default/versions-mirror ] && MIRROR_VERSION_FILE=target/versions/default/versions-mirror # The default mirror urls @@ -21,7 +22,7 @@ if [ "$ARCHITECTURE" == "armhf" ]; then fi if [ "$MIRROR_SNAPSHOT" == y ]; then - if [ -f $MIRROR_VERSION_FILE ]; then + if [ -f "$MIRROR_VERSION_FILE" ]; then DEBIAN_TIMESTAMP=$(grep "^debian==" $MIRROR_VERSION_FILE | tail -n 1 | sed 's/.*==//') DEBIAN_SECURITY_TIMESTAMP=$(grep "^debian-security==" $MIRROR_VERSION_FILE | tail -n 1 | sed 's/.*==//') elif [ -z "$DEBIAN_TIMESTAMP" ] || [ -z "$DEBIAN_SECURITY_TIMESTAMP" ]; then From 3757199404dad4415ae63c75e970d98ce1457ecd Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Tue, 14 Feb 2023 21:46:05 +0200 Subject: [PATCH 11/57] [submodule]: Advance sonic-sairedis submodule. (#13802) Update sonic-sairedis submodule pointer to include the following: * 4d86af3 [hash]: Extend VS lib with ECMP/LAG hash (#1192) --- src/sonic-sairedis | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-sairedis b/src/sonic-sairedis index 3a960bec9baa..4d86af3474c7 160000 --- a/src/sonic-sairedis +++ b/src/sonic-sairedis @@ -1 +1 @@ -Subproject commit 3a960bec9baa16689efa69117f58ed6438d465e7 +Subproject commit 4d86af3474c7b4299557293c2ee4516753aff169 From 3097e4258d418bab4df374634bb2d06b58552e55 Mon Sep 17 00:00:00 2001 From: george-deng88 Date: Wed, 15 Feb 2023 04:18:19 +0800 Subject: [PATCH 12/57] Fix Celestica Silverstone addDecapTunnel failed issue (#13235) *Why I did it The current sonic image bringup failed on Silverstone: 4:56:15.957705 sonic NOTICE swss#orchagent: :- addDecapTunnel: Create overlay loopback router interface oid:6000000000520 *How I did it Enable bcm switch Tunnel function on Silverstone. *How to verify it The new sonic image can bringup OK on Silverstone. --- .../Silverstone-128x100/th3-128x100G.config.bcm | 2 ++ .../Silverstone/th3-32x400G.config.bcm | 1 + 2 files changed, 3 insertions(+) diff --git a/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/th3-128x100G.config.bcm b/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/th3-128x100G.config.bcm index 0b66c8b53814..447de2e85b5a 100644 --- a/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/th3-128x100G.config.bcm +++ b/device/celestica/x86_64-cel_silverstone-r0/Silverstone-128x100/th3-128x100G.config.bcm @@ -11,6 +11,8 @@ pll_bypass=1 init_all_modules=0 +sai_tunnel_global_sip_mask_enable=1 + portmap_20=33:100:2 portmap_21=35:100:2 portmap_22=37:100:2 diff --git a/device/celestica/x86_64-cel_silverstone-r0/Silverstone/th3-32x400G.config.bcm b/device/celestica/x86_64-cel_silverstone-r0/Silverstone/th3-32x400G.config.bcm index 5e5fc82aeace..400fbdcf7573 100644 --- a/device/celestica/x86_64-cel_silverstone-r0/Silverstone/th3-32x400G.config.bcm +++ b/device/celestica/x86_64-cel_silverstone-r0/Silverstone/th3-32x400G.config.bcm @@ -12,6 +12,7 @@ pll_bypass=1 init_all_modules=0 +sai_tunnel_global_sip_mask_enable=1 #portmap_38=257:10 From 23dbdf525b97bd88e9f169dab543cac441b14c56 Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Wed, 15 Feb 2023 14:40:09 +0800 Subject: [PATCH 13/57] Enable host services #13800 Why I did it Need to enable host service to suport GNMI native write How I did it Update rules/config How to verify it Run GNMI end2end test --- rules/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/config b/rules/config index c01adc0f5390..0cf5c00dc070 100644 --- a/rules/config +++ b/rules/config @@ -139,7 +139,7 @@ INCLUDE_MGMT_FRAMEWORK = y # ENABLE_HOST_SERVICE_ON_START - enable sonic-host-server for mgmt-framework and/or # telemetry containers to access host functionality by default -ENABLE_HOST_SERVICE_ON_START = n +ENABLE_HOST_SERVICE_ON_START = y # INCLUDE_RESTAPI - build docker-sonic-restapi for configuring the switch using REST APIs INCLUDE_RESTAPI = n From 8a4d1b579760154b0657b31a0d04ec68e0fb4a38 Mon Sep 17 00:00:00 2001 From: mathieulaunay <54592312+mathieulaunay@users.noreply.github.com> Date: Wed, 15 Feb 2023 09:59:03 +0100 Subject: [PATCH 14/57] [build] add an environment variable to run make reset unattended (#12207) previously "make reset" was expecting user input from the terminal to do its job setting UNATTENDED to any non-zero string will allow "make reset" to run without interactive confirmation - Why I did it When doing automated builds of SONiC images, we need to reset the working repositories between each build. - How I did it Adding an environment variable that is read by Makefile.work - How to verify it running UNATTENDED=1 make reset should make an automatic reset of all working directories --- Makefile.work | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/Makefile.work b/Makefile.work index 2dda7876cc57..bea20edb4219 100644 --- a/Makefile.work +++ b/Makefile.work @@ -56,6 +56,10 @@ # * GZ_COMPRESS_PROGRAM: Select pigz to reduce build time # * Default: gzip # * Values: pigz,gzip +# * UNATTENDED: Don't wait for interactive input from terminal, setting this +# * value to anything will enable it +# * Default: unset +# * Value: y # ############################################################################### @@ -611,23 +615,28 @@ init : .ONESHELL : reset reset : - $(Q)echo && echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " - $(Q)read ans && ( - if [ $$ans == y ]; then - echo "Resetting local repository. Please wait..."; - sudo rm -rf fsroot*; - if [ "$(MULTIARCH_QEMU_ENVIRON)" == y ] && [[ "$(CONFIGURED_ARCH)" == "armhf" || "$(CONFIGURED_ARCH)" == "arm64" ]]; then - echo "Stopping march $(CONFIGURED_ARCH) docker" - sudo kill -9 `sudo cat /var/run/march/docker.pid` || true - sudo rm -f /var/run/march/docker.pid || true - fi - git clean -xfdf; - git reset --hard; - git submodule foreach --recursive 'git clean -xfdf || true'; - git submodule foreach --recursive 'git reset --hard || true'; - git submodule foreach --recursive 'git remote update || true'; - git submodule update --init --recursive; - echo "Reset complete!"; - else - echo "Reset aborted"; - fi ) + $(Q)echo && ( + if [ -z "$(UNATTENDED)" ]; then + echo -n "Warning! All local changes will be lost. Proceed? [y/N]: " + @read ans + else + ans=y + fi + if [ $$ans == y ]; then + echo "Resetting local repository. Please wait..."; + sudo rm -rf fsroot*; + if [ "$(MULTIARCH_QEMU_ENVIRON)" == y ] && [[ "$(CONFIGURED_ARCH)" == "armhf" || "$(CONFIGURED_ARCH)" == "arm64" ]]; then + echo "Stopping march $(CONFIGURED_ARCH) docker" + sudo kill -9 `sudo cat /var/run/march/docker.pid` || true + sudo rm -f /var/run/march/docker.pid || true + fi + git clean -xfdf; + git reset --hard; + git submodule foreach --recursive 'git clean -xfdf || true'; + git submodule foreach --recursive 'git reset --hard || true'; + git submodule foreach --recursive 'git remote update || true'; + git submodule update --init --recursive; + echo "Reset complete!"; + else + echo "Reset aborted"; + fi ) From a3225e65e4756d5893757c8f23693f11d41f4d88 Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 15 Feb 2023 22:19:01 +0800 Subject: [PATCH 15/57] [Build] Remove the additional space character in the mirrors.list file (#13812) Why I did it Fix all mirror is commented out in sources.list in slave image issue. It will have an issue when installing more packages in the slave container. It will add additional space character after running add-apt-repository command. For example: The original config in /etc/apt/sources.list #deb [arch=amd64] http://deb.debian.org/debian/ bullseye main contrib non-free Run the following command: add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian bullseye stable" Then the setting changed to: (added a new space character after #) # deb [arch=amd64] http://deb.debian.org/debian/ bullseye main contrib non-free How I did it Fix the regex string to add the space pattern. After fixed, whether there is a space character or not, it will not be an issue. How to verify it --- src/sonic-build-hooks/scripts/buildinfo_base.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index 1e334a4a62da..e10a32303423 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -112,7 +112,7 @@ get_version_cache_option() set_reproducible_mirrors() { # Remove the charater # in front of the line if matched - local expression="s/^#\(.*$REPR_MIRROR_URL_PATTERN\)/\1/" + local expression="s/^#\s*\(.*$REPR_MIRROR_URL_PATTERN\)/\1/" # Add the character # in front of the line, if not match the URL pattern condition local expression2="/^#*deb.*$REPR_MIRROR_URL_PATTERN/! s/^#*deb/#&/" local expression3="\$a#SET_REPR_MIRRORS" @@ -120,7 +120,7 @@ set_reproducible_mirrors() # Add the charater # in front of the line if match expression="s/^deb.*$REPR_MIRROR_URL_PATTERN/#\0/" # Remove the character # in front of the line, if not match the URL pattern condition - expression2="/^#*deb.*$REPR_MIRROR_URL_PATTERN/! s/^#(#*deb)/\1/" + expression2="/^#*deb.*$REPR_MIRROR_URL_PATTERN/! s/^#\s*(#*deb)/\1/" expression3="/#SET_REPR_MIRRORS/d" fi From c5a7ce0cf4c03f01a266775aa7e33b38f404f8b8 Mon Sep 17 00:00:00 2001 From: Yaqiang Zhu Date: Thu, 16 Feb 2023 02:23:39 +0800 Subject: [PATCH 16/57] [dhcp_relay] Remove exist check while adding dhcpv6 relay (#13822) Why I did it DHCPv6 relay config entry is not useful while del dhcpv6 relay config. How I did it Remove dhcpv6_relay entry if it is empty and not check entry exist while adding dhcpv6 relay --- .../cli-plugin-tests/conftest.py | 13 +++++- .../test_config_dhcp_relay.py | 40 ++++++++++++++++++- .../cli/config/plugins/dhcp_relay.py | 18 ++++++--- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/dockers/docker-dhcp-relay/cli-plugin-tests/conftest.py b/dockers/docker-dhcp-relay/cli-plugin-tests/conftest.py index 37aec0b8b251..5f0b981ccaee 100644 --- a/dockers/docker-dhcp-relay/cli-plugin-tests/conftest.py +++ b/dockers/docker-dhcp-relay/cli-plugin-tests/conftest.py @@ -19,14 +19,23 @@ def mock_cfgdb(): } def get_entry(table, key): + if table not in CONFIG or key not in CONFIG[table]: + return {} return CONFIG[table][key] def set_entry(table, key, data): CONFIG[table].setdefault(key, {}) - CONFIG[table][key] = data + + if data is None: + CONFIG[table].pop(key) + else: + CONFIG[table][key] = data + + def get_keys(table): + return CONFIG[table].keys() cfgdb.get_entry = mock.Mock(side_effect=get_entry) cfgdb.set_entry = mock.Mock(side_effect=set_entry) + cfgdb.get_keys = mock.Mock(side_effect=get_keys) yield cfgdb - diff --git a/dockers/docker-dhcp-relay/cli-plugin-tests/test_config_dhcp_relay.py b/dockers/docker-dhcp-relay/cli-plugin-tests/test_config_dhcp_relay.py index 2c9a5c19a93b..a42d5cce7a8a 100644 --- a/dockers/docker-dhcp-relay/cli-plugin-tests/test_config_dhcp_relay.py +++ b/dockers/docker-dhcp-relay/cli-plugin-tests/test_config_dhcp_relay.py @@ -111,9 +111,25 @@ def test_plugin_registration(self): cli = mock.MagicMock() dhcp_relay.register(cli) - def test_config_dhcp_relay_add_del_with_nonexist_vlanid(self, ip_version, op): + def test_config_dhcp_relay_add_del_with_nonexist_vlanid_ipv4(self, op): runner = CliRunner() + ip_version = "ipv4" + with mock.patch("utilities_common.cli.run_command") as mock_run_command: + result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version] + .commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]] + .commands[op], ["1001", IP_VER_TEST_PARAM_MAP[ip_version]["ips"][0]]) + print(result.exit_code) + print(result.stdout) + assert result.exit_code != 0 + assert "Error: Vlan1001 doesn't exist" in result.output + assert mock_run_command.call_count == 0 + + def test_config_dhcp_relay_del_with_nonexist_vlanid_ipv6(self): + runner = CliRunner() + + op = "del" + ip_version = "ipv6" with mock.patch("utilities_common.cli.run_command") as mock_run_command: result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version] .commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]] @@ -262,3 +278,25 @@ def test_config_add_del_duplicate_dhcp_relay(self, mock_cfgdb, ip_version, op): assert result.exit_code != 0 assert "Error: Find duplicate DHCP relay ip {} in {} list".format(test_ip, op) in result.output assert mock_run_command.call_count == 0 + + def test_config_add_dhcp_relay_ipv6_with_non_entry(self, mock_cfgdb): + op = "add" + ip_version = "ipv6" + test_ip = IP_VER_TEST_PARAM_MAP[ip_version]["ips"][0] + runner = CliRunner() + db = Db() + db.cfgdb = mock_cfgdb + table = IP_VER_TEST_PARAM_MAP[ip_version]["table"] + db.cfgdb.set_entry(table, "Vlan1000", None) + assert db.cfgdb.get_entry(table, "Vlan1000") == {} + assert len(db.cfgdb.get_keys(table)) == 0 + + with mock.patch("utilities_common.cli.run_command") as mock_run_command: + result = runner.invoke(dhcp_relay.dhcp_relay.commands[ip_version] + .commands[IP_VER_TEST_PARAM_MAP[ip_version]["command"]] + .commands[op], ["1000", test_ip], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + assert db.cfgdb.get_entry(table, "Vlan1000") == {"dhcpv6_servers": [test_ip]} + assert mock_run_command.call_count == 3 diff --git a/dockers/docker-dhcp-relay/cli/config/plugins/dhcp_relay.py b/dockers/docker-dhcp-relay/cli/config/plugins/dhcp_relay.py index 57848161f653..aea8e491f05b 100644 --- a/dockers/docker-dhcp-relay/cli/config/plugins/dhcp_relay.py +++ b/dockers/docker-dhcp-relay/cli/config/plugins/dhcp_relay.py @@ -22,11 +22,13 @@ def validate_ips(ctx, ips, ip_version): ctx.fail("{} is not IPv{} address".format(ip, ip_version)) -def get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str): - table = db.cfgdb.get_entry(table_name, vlan_name) - if len(table.keys()) == 0: - ctx.fail("{} doesn't exist".format(vlan_name)) +def get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str, check_is_exist=True): + if check_is_exist: + keys = db.cfgdb.get_keys(table_name) + if vlan_name not in keys: + ctx.fail("{} doesn't exist".format(vlan_name)) + table = db.cfgdb.get_entry(table_name, vlan_name) dhcp_servers = table.get(dhcp_servers_str, []) return dhcp_servers, table @@ -49,7 +51,10 @@ def add_dhcp_relay(vid, dhcp_relay_ips, db, ip_version): ctx = click.get_current_context() # Verify ip addresses are valid validate_ips(ctx, dhcp_relay_ips, ip_version) - dhcp_servers, table = get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str) + + # It's unnecessary for DHCPv6 Relay to verify entry exist + check_config_exist = True if ip_version == 4 else False + dhcp_servers, table = get_dhcp_servers(db, vlan_name, ctx, table_name, dhcp_servers_str, check_config_exist) added_ips = [] for dhcp_relay_ip in dhcp_relay_ips: @@ -100,6 +105,9 @@ def del_dhcp_relay(vid, dhcp_relay_ips, db, ip_version): else: table[dhcp_servers_str] = dhcp_servers + if ip_version == 6 and len(table.keys()) == 0: + table = None + db.cfgdb.set_entry(table_name, vlan_name, table) click.echo("Removed DHCP relay address [{}] from {}".format(",".join(dhcp_relay_ips), vlan_name)) try: From b0e0b23d2a4d85820693b0fb29dcfe7085b19999 Mon Sep 17 00:00:00 2001 From: byu343 Date: Wed, 15 Feb 2023 10:25:49 -0800 Subject: [PATCH 17/57] [arista] Add tuning values for phys on 7280cr3 (#10084) Why I did it This change specifies the tuning values for each lane of the B52 phy chips. These values can be different for different ports. The values being set are under the assumption of optical transceivers. This change depends on the change to sonic-swss: sonic-net/sonic-swss#2158. How to verify it We verified the values are correctly set on the B52 chips of Arista 7280cr3, by reading them from the debug cli of the B52 driver. --- .../Arista-7280CR3-C40/gearbox_config.json | 384 ++++++++++++++++-- 1 file changed, 352 insertions(+), 32 deletions(-) diff --git a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json index 5a1fd88d49ad..11ba880428ed 100644 --- a/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json +++ b/device/arista/x86_64-arista_7280cr3mk_32p4/Arista-7280CR3-C40/gearbox_config.json @@ -119,224 +119,544 @@ "index": 1, "phy_id": 1, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet4", "index": 2, "phy_id": 1, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet8", "index": 3, "phy_id": 1, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet12", "index": 4, "phy_id": 1, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet16", "index": 5, "phy_id": 2, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet20", "index": 6, "phy_id": 2, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet24", "index": 7, "phy_id": 2, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet28", "index": 8, "phy_id": 2, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet32", "index": 9, "phy_id": 3, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet36", "index": 10, "phy_id": 3, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet40", "index": 11, "phy_id": 3, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet44", "index": 12, "phy_id": 3, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet48", "index": 13, "phy_id": 4, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet52", "index": 14, "phy_id": 4, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-5], + "system_tx_fir_main": [11,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet56", "index": 15, "phy_id": 4, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet60", "index": 16, "phy_id": 4, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet64", "index": 17, "phy_id": 5, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet68", "index": 18, "phy_id": 5, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet72", "index": 19, "phy_id": 5, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet76", "index": 20, "phy_id": 5, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-3,-3], + "system_tx_fir_main": [11,11], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet80", "index": 21, "phy_id": 6, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet84", "index": 22, "phy_id": 6, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet88", "index": 23, "phy_id": 6, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet92", "index": 24, "phy_id": 6, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-4,-4], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet96", "index": 25, "phy_id": 7, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet100", "index": 26, "phy_id": 7, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet104", "index": 27, "phy_id": 7, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet108", "index": 28, "phy_id": 7, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet112", "index": 29, "phy_id": 8, "system_lanes": [4,5], - "line_lanes": [20,21,22,23] + "line_lanes": [20,21,22,23], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet116", "index": 30, "phy_id": 8, "system_lanes": [6,7], - "line_lanes": [8,9,10,11] + "line_lanes": [8,9,10,11], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet120", "index": 31, "phy_id": 8, "system_lanes": [0,1], - "line_lanes": [12,13,14,15] + "line_lanes": [12,13,14,15], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] }, { "name": "Ethernet124", "index": 32, "phy_id": 8, "system_lanes": [2,3], - "line_lanes": [16,17,18,19] + "line_lanes": [16,17,18,19], + "system_tx_fir_pre2": [1,1], + "system_tx_fir_pre1": [-5,-5], + "system_tx_fir_main": [14,14], + "system_tx_fir_post1": [0,0], + "system_tx_fir_post2": [0,0], + "line_tx_fir_pre2": [0,0,0,0], + "line_tx_fir_pre1": [-1,-1,-1,-1], + "line_tx_fir_main": [13,13,13,13], + "line_tx_fir_post1": [-5,-5,-5,-5], + "line_tx_fir_post2": [0,0,0,0] } ] } From 5ce1b8e4b7e0729870b1103da82278b926e55955 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Wed, 15 Feb 2023 10:31:59 -0800 Subject: [PATCH 18/57] [Arista] Disable ATA NCQ for a few products (#13739) Why I did it Some products might experience an occasional IO failure in the communication between CPU and SSD. Based on some research it could be attributable to some device not handling ATA NCQ (Native Command Queue). This issue currently affect 4 products: DCS-7170-32C* DCS-7170-64C DCS-7060DX4-32 DCS-7260CX3-64 How I did it This change disable NCQ on the affected drive for a small set of products. How to verify it When the fix is applied, these 2 patterns can be found in the dmesg. ata1.00: FORCE: horkage modified (noncq) NCQ (not used) Test results using: fio --direct=1 --rw=randrw --bs=64k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=4 with NCQ (ata1.00: 61865984 sectors, multi 1: LBA48 NCQ (depth 32), AA) READ: bw=33.9MiB/s (35.6MB/s), 33.9MiB/s-33.9MiB/s (35.6MB/s-35.6MB/s), io=4073MiB (4270MB), run=120078-120078msec WRITE: bw=34.1MiB/s (35.8MB/s), 34.1MiB/s-34.1MiB/s (35.8MB/s-35.8MB/s), io=4100MiB (4300MB), run=120078-120078msec without NCQ (ata1.00: 61865984 sectors, multi 1: LBA48 NCQ (not used)) READ: bw=31.7MiB/s (33.3MB/s), 31.7MiB/s-31.7MiB/s (33.3MB/s-33.3MB/s), io=3808MiB (3993MB), run=120083-120083msec WRITE: bw=31.9MiB/s (33.4MB/s), 31.9MiB/s-31.9MiB/s (33.4MB/s-33.4MB/s), io=3830MiB (4016MB), run=120083-120083msec Which release branch to backport (provide reason below if selected) --- files/Aboot/boot0.j2 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index de7bfc3d662f..650e3178667a 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -621,6 +621,10 @@ write_platform_specific_cmdline() { cmdline_add intel_idle.max_cstate=0 read_system_eeprom fi + if in_array "$platform" "rook"; then + # Currently applies to Alhambra, Blackhawk, Gardena and Mineral + cmdline_add libata.force=1.00:noncq + fi if in_array "$platform" "crow" "magpie"; then cmdline_add amd_iommu=off cmdline_add modprobe.blacklist=snd_hda_intel,hdaudio From 373f0919e95da1ea6552ee2350664db9c4ea8aaa Mon Sep 17 00:00:00 2001 From: Qi Luo Date: Wed, 15 Feb 2023 14:15:52 -0800 Subject: [PATCH 19/57] [sonic-snmpagent] Update submodule (#13806) #### Why I did it Include below commits: ``` 4622b8d 2023-02-14 | Fix: zero route may have empty nexthop (#276) [Qi Luo] ``` --- src/sonic-snmpagent | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-snmpagent b/src/sonic-snmpagent index 4f55473f4af1..4622b8df01e6 160000 --- a/src/sonic-snmpagent +++ b/src/sonic-snmpagent @@ -1 +1 @@ -Subproject commit 4f55473f4af1115d86feb1a9ed3ab48dee75d8f8 +Subproject commit 4622b8df01e6cfa818568b5a78a1a56ab555097d From e673c1dcaf08cc0630ccc37fe4b0c7d311af3a3a Mon Sep 17 00:00:00 2001 From: ganglv <88995770+ganglyu@users.noreply.github.com> Date: Thu, 16 Feb 2023 11:07:27 +0800 Subject: [PATCH 20/57] Add yang models for GNMI #13716 Why I did it Add missing yang models. How I did it Add sonic-gnmi.yang and unit test. How to verify it Run unit test for sonic-yang-models. --- src/sonic-yang-models/setup.py | 2 + .../tests/files/sample_config_db.json | 12 +++ .../tests/yang_model_tests/tests/gnmi.json | 17 ++++ .../yang_model_tests/tests_config/gnmi.json | 66 ++++++++++++++++ .../yang-models/sonic-gnmi.yang | 78 +++++++++++++++++++ 5 files changed, 175 insertions(+) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/gnmi.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/gnmi.json create mode 100644 src/sonic-yang-models/yang-models/sonic-gnmi.yang diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 2afc3c85f0ac..60043cf998fe 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -148,6 +148,7 @@ def run(self): './yang-models/sonic-system-tacacs.yang', './yang-models/sonic-system-radius.yang', './yang-models/sonic-telemetry.yang', + './yang-models/sonic-gnmi.yang', './yang-models/sonic-tunnel.yang', './yang-models/sonic-types.yang', './yang-models/sonic-versions.yang', @@ -226,6 +227,7 @@ def run(self): './cvlyang-models/sonic-system-aaa.yang', './cvlyang-models/sonic-system-tacacs.yang', './cvlyang-models/sonic-telemetry.yang', + './cvlyang-models/sonic-gnmi.yang', './cvlyang-models/sonic-types.yang', './cvlyang-models/sonic-versions.yang', './cvlyang-models/sonic-vlan.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index f9945175cf48..d4ab7d9021f9 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1183,6 +1183,18 @@ "port": "50051" } }, + "GNMI": { + "certs": { + "ca_crt": "/etc/sonic/credentials/dsmsroot.cer", + "server_crt": "/etc/sonic/credentials/server.cer", + "server_key": "/etc/sonic/credentials/server.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50052" + } + }, "TUNNEL": { "MuxTunnel0": { "dscp_mode": "uniform", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/gnmi.json b/src/sonic-yang-models/tests/yang_model_tests/tests/gnmi.json new file mode 100644 index 000000000000..5938290f8a96 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/gnmi.json @@ -0,0 +1,17 @@ +{ + "GNMI_TABLE_WITH_INCORRECT_CERT": { + "desc": "TABLE_WITH_INCORRECT_CERT failure.", + "eStrKey": "Pattern" + }, + "GNMI_TABLE_WITH_INCORRECT_CLIENT_AUTH": { + "desc": "TABLE_WITH_INCORRECT_CLIENT_AUTH failure", + "eStrKey": "InvalidValue" + }, + "GNMI_TABLE_WITH_INCORRECT_PORT": { + "desc": "TABLE_WITH_INCORRECT_PORT failure.", + "eStrKey": "InvalidValue" + }, + "GNMI_TABLE_WITH_VALID_CONFIG": { + "desc": "TABLE WITH VALID CONFIG." + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/gnmi.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/gnmi.json new file mode 100644 index 000000000000..db121ae3944c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/gnmi.json @@ -0,0 +1,66 @@ +{ + "GNMI_TABLE_WITH_INCORRECT_CERT": { + "sonic-gnmi:sonic-gnmi": { + "sonic-gnmi:GNMI": { + "certs": { + "ca_crt": "abcd.config", + "server_crt": "a/b/c", + "server_key": "123" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50052" + } + } + } + }, + "GNMI_TABLE_WITH_INCORRECT_CLIENT_AUTH": { + "sonic-gnmi:sonic-gnmi": { + "sonic-gnmi:GNMI": { + "certs": { + "ca_crt": "/etc/sonic/credentials/dsmsroot.cer", + "server_crt": "/etc/sonic/credentials/server.cer", + "server_key": "/etc/sonic/credentials/server.key" + }, + "gnmi": { + "client_auth": "up", + "log_level": "2", + "port": "50052" + } + } + } + }, + "GNMI_TABLE_WITH_INCORRECT_PORT": { + "sonic-gnmi:sonic-gnmi": { + "sonic-gnmi:GNMI": { + "certs": { + "ca_crt": "/etc/sonic/credentials/dsmsroot.cer", + "server_crt": "/etc/sonic/credentials/server.cer", + "server_key": "/etc/sonic/credentials/server.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "abc" + } + } + } + }, + "GNMI_TABLE_WITH_VALID_CONFIG": { + "sonic-gnmi:sonic-gnmi": { + "sonic-gnmi:GNMI": { + "certs": { + "ca_crt": "/etc/sonic/credentials/dsmsroot.cer", + "server_crt": "/etc/sonic/credentials/server.cer", + "server_key": "/etc/sonic/credentials/server.key" + }, + "gnmi": { + "client_auth": "true", + "log_level": "2", + "port": "50052" + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-gnmi.yang b/src/sonic-yang-models/yang-models/sonic-gnmi.yang new file mode 100644 index 000000000000..1d6b228266b8 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-gnmi.yang @@ -0,0 +1,78 @@ +module sonic-gnmi { + + yang-version 1.1; + + namespace "http://github.com/sonic-net/sonic-gnmi"; + prefix gnmi; + + import ietf-inet-types { + prefix inet; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description "GNMI YANG Module for SONiC OS"; + + revision 2023-02-10 { + description "First Revision"; + } + + container sonic-gnmi { + + container GNMI { + + description "GNMI TABLE part of config_db.json"; + + container certs { + + leaf ca_crt { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).cer'; + } + description "Local path for ca_crt."; + } + + leaf server_crt { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).cer'; + } + description "Local path for server_crt."; + } + + leaf server_key { + type string { + pattern '(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).key'; + } + description "Local path for server_key."; + } + + } + + container gnmi { + + leaf client_auth { + type boolean; + description "Flag for requiring client auth."; + } + + leaf log_level { + type uint8 { + range 0..100; + } + description "Log level for gnmi."; + } + + leaf port { + type inet:port-number; + description "Port gnmi runs on."; + } + + } + + } + } +} From aee97a69c6ecf59277e9963e10a97c33a7e6fb7b Mon Sep 17 00:00:00 2001 From: Kebo Liu Date: Thu, 16 Feb 2023 15:51:04 +0800 Subject: [PATCH 21/57] [Mellanox] Enhance MFT make file to download source code from any valid URL (#13801) - Why I did it Currently, when building MFT, it can only download the source code from the official download site: http://www.mellanox.com/downloads/MFT/, it's not possible to integrate an internal version that has not been officially released yet. The intention of this PR is to make it possible to download the source code from any valid link. - How I did it Add a new parameter "MLNX_MFT_INTERNAL_SOURCE_BASE_URL", if an URL is given, it will download the source code from the given URL, otherwise, it downloads from the default official site. - How to verify it Specify a valid URL in the make file, the MFT debs should be built successfully. Signed-off-by: Kebo Liu --- platform/mellanox/mft.mk | 10 +++++++++- platform/mellanox/mft/Makefile | 8 +++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/platform/mellanox/mft.mk b/platform/mellanox/mft.mk index 047e87b09086..be37064b9403 100644 --- a/platform/mellanox/mft.mk +++ b/platform/mellanox/mft.mk @@ -19,7 +19,15 @@ MFT_VERSION = 4.21.0 MFT_REVISION = 100 -export MFT_VERSION MFT_REVISION +MLNX_MFT_INTERNAL_SOURCE_BASE_URL = + +ifneq ($(MLNX_MFT_INTERNAL_SOURCE_BASE_URL), ) +MFT_FROM_INTERNAL = y +else +MFT_FROM_INTERNAL = n +endif + +export MFT_VERSION MFT_REVISION MFT_FROM_INTERNAL MLNX_MFT_INTERNAL_SOURCE_BASE_URL MFT = mft_$(MFT_VERSION)-$(MFT_REVISION)_$(CONFIGURED_ARCH).deb $(MFT)_SRC_PATH = $(PLATFORM_PATH)/mft diff --git a/platform/mellanox/mft/Makefile b/platform/mellanox/mft/Makefile index 4c454028b0e0..3139e874cc08 100644 --- a/platform/mellanox/mft/Makefile +++ b/platform/mellanox/mft/Makefile @@ -27,6 +27,12 @@ endif MFT_NAME = mft-$(MFT_VERSION)-$(MFT_REVISION)-$(MFT_ARCH)-deb MFT_TGZ = $(MFT_NAME).tgz +ifeq ($(MFT_FROM_INTERNAL),y) +MFT_TGZ_URL = $(MLNX_MFT_INTERNAL_SOURCE_BASE_URL)$(MFT_TGZ) +else +MFT_TGZ_URL = http://www.mellanox.com/downloads/MFT/$(MFT_TGZ) +endif + SRC_DEB = kernel-mft-dkms_$(MFT_VERSION)-$(MFT_REVISION)_all.deb MOD_DEB = kernel-mft-dkms-modules-$(KVERSION)_$(MFT_VERSION)_$(CONFIGURED_ARCH).deb @@ -38,7 +44,7 @@ DKMS_TMP := $(shell mktemp -u -d -t dkms.XXXXXXXXXX) $(addprefix $(DEST)/, $(MAIN_TARGET)): $(DEST)/% : rm -rf $(MFT_NAME) - wget -O $(MFT_TGZ) http://www.mellanox.com/downloads/MFT/$(MFT_TGZ) + wget -O $(MFT_TGZ) $(MFT_TGZ_URL) tar xzf $(MFT_TGZ) pushd $(MFT_NAME)/SDEBS From 22e46207c833bc8e7a061bd50f086ff4aac63767 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Thu, 16 Feb 2023 21:58:14 +0800 Subject: [PATCH 22/57] [ci] Kill hanged docker build process to avoid build timeout issue. (#13726) Why I did it Docker build has a low rate of hanging up. It hangs on different steps. So, it looks like a bug in docker daemon. How I did it Start a daemon process to scan running time more than 1 hours, and kill the process. How to verify it --- .azure-pipelines/azure-pipelines-build.yml | 1 + .azure-pipelines/cleanup.yml | 7 +++++++ .azure-pipelines/template-daemon.yml | 24 ++++++++++++++++++++++ .azure-pipelines/template-variables.yml | 1 + 4 files changed, 33 insertions(+) create mode 100644 .azure-pipelines/template-daemon.yml diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index 09a46573fe0f..ba3227a349d0 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -109,6 +109,7 @@ jobs: buildSteps: - template: template-skipvstest.yml + - template: template-daemon.yml - bash: | set -ex if [ $(GROUP_NAME) == vs ]; then diff --git a/.azure-pipelines/cleanup.yml b/.azure-pipelines/cleanup.yml index 6569c8ed0bf3..4f74de0f413a 100644 --- a/.azure-pipelines/cleanup.yml +++ b/.azure-pipelines/cleanup.yml @@ -1,5 +1,11 @@ steps: - script: | + set -x + # kill daemon process + ps $(cat /tmp/azp_daemon_kill_docker_pid) + sudo kill $(cat /tmp/azp_daemon_kill_docker_pid) + rm /tmp/azp_daemon_kill_docker_pid + if sudo [ -f /var/run/march/docker.pid ] ; then pid=`sudo cat /var/run/march/docker.pid` ; sudo kill $pid fi @@ -11,4 +17,5 @@ steps: pid=`sudo cat dockerfs/var/run/docker.pid` ; sudo kill $pid fi sudo rm -rf $(ls -A1) + condition: always() displayName: "Clean Workspace" diff --git a/.azure-pipelines/template-daemon.yml b/.azure-pipelines/template-daemon.yml new file mode 100644 index 000000000000..b0915557ced2 --- /dev/null +++ b/.azure-pipelines/template-daemon.yml @@ -0,0 +1,24 @@ +steps: +- bash: | + ( + while true + do + sleep 120 + now=$(date +%s) + pids=$(ps -C docker -o pid,etime,args | grep "docker build" | cut -d" " -f1) + for pid in $pids + do + start=$(date --date="$(ls -dl /proc/$pid --time-style full-iso | awk '{print$6,$7}')" +%s) + time_s=$(($now-$start)) + if [[ $time_s -gt $(DOCKER_BUILD_TIMEOUT) ]]; then + echo =========== $(date +%F%T) $time_s &>> target/daemon.log + ps $pid &>> target/daemon.log + sudo kill $pid + fi + done + done + ) & + daemon_pid=$! + ps $daemon_pid + echo $daemon_pid >> /tmp/azp_daemon_kill_docker_pid + displayName: start daemon to kill hang docker diff --git a/.azure-pipelines/template-variables.yml b/.azure-pipelines/template-variables.yml index ce2ec6874315..42d46182d263 100644 --- a/.azure-pipelines/template-variables.yml +++ b/.azure-pipelines/template-variables.yml @@ -5,3 +5,4 @@ variables: SONIC_BUILD_RETRY_COUNT: 3 SONIC_BUILD_RETRY_INTERVAL: 600 DOCKER_BUILDKIT: 0 + DOCKER_BUILD_TIMEOUT: 3600 From fd49bc1f2753cb1ad34e1847d7e9d3a4eca80f4a Mon Sep 17 00:00:00 2001 From: rupesh-k <53595165+rupesh-k@users.noreply.github.com> Date: Fri, 17 Feb 2023 00:52:37 +0530 Subject: [PATCH 23/57] [Yang-models] Modify mirror yang model src_port to match CONFIG_DB (#13578) Fixes Mirror Yang model src_port to match CONFIG_DB #### Why I did it Fixes issue https://github.com/sonic-net/sonic-buildimage/issues/12397#issuecomment-1343109874 --- .../tests/files/sample_config_db.json | 6 +- .../tests/mirror_session.json | 8 --- .../tests_config/mirror_session.json | 64 +------------------ .../yang-models/sonic-mirror-session.yang | 11 +--- 4 files changed, 7 insertions(+), 82 deletions(-) diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index d4ab7d9021f9..3e3ebb47a9f8 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2041,11 +2041,7 @@ "direction": "RX", "type": "SPAN", "dst_port": "Ethernet2", - "src_port": [ - "Ethernet3", - "Ethernet4" - ] - + "src_port": "Ethernet3,Ethernet4" } }, diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json b/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json index c54ca3d9595a..0affa83c40a9 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/mirror_session.json @@ -72,10 +72,6 @@ "MIRROR_ERSPAN_ENTRY_VALID_SRC_PORTCHANNEL": { "desc": "Configuring ERSPAN entry with valid source portchannel" }, - "MIRROR_ERSPAN_ENTRY_INVALID_SRC_PORT": { - "desc": "Configuring ERSPAN entry with invalid source port", - "eStrKey" : "InvalidValue" - }, "MIRROR_SPAN_ENTRY_WITH_VALID_VALUES": { "desc": "Configuring SPAN entry with valid source and destination ports" }, @@ -90,10 +86,6 @@ "MIRROR_SPAN_ENTRY_VALID_DST_PORT_CPU": { "desc": "Configuring SPAN entry with valid destination port CPU" }, - "MIRROR_SPAN_ENTRY_INVALID_SRC_PORT": { - "desc": "Configuring SPAN entry with invalid destination ports", - "eStrKey" : "InvalidValue" - }, "MIRROR_SPAN_ENTRY_INVALID_DIRECTION": { "desc": "Configuring SPAN entry with invalid direction", "eStrKey": "InvalidValue" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json index 5e820b5f5fdf..93a5afcdc76a 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mirror_session.json @@ -316,9 +316,7 @@ "gre_type": "0x1234", "dscp": "10", "ttl": "63", - "src_port": [ - "Ethernet0" - ] + "src_port": "Ethernet0" } ] } @@ -346,29 +344,7 @@ "gre_type": "0x1234", "dscp": "10", "ttl": "63", - "src_port": [ - "PortChannel5" - ] - } - ] - } - } - }, - "MIRROR_ERSPAN_ENTRY_INVALID_SRC_PORT": { - "sonic-mirror-session:sonic-mirror-session": { - "MIRROR_SESSION": { - "MIRROR_SESSION_LIST": [ - { - "name": "erspan", - "type": "ERSPAN", - "dst_ip": "11.1.1.1", - "src_ip": "10.1.1.1", - "gre_type": "0x1234", - "dscp": "10", - "ttl": "63", - "src_port": [ - "Ethernet0" - ] + "src_port": "PortChannel5" } ] } @@ -415,10 +391,7 @@ "name": "span", "type": "SPAN", "dst_port": "Ethernet0", - "src_port": [ - "Ethernet4", - "Ethernet8" - ], + "src_port": "Ethernet4,Ethernet8", "direction": "RX" } ] @@ -479,37 +452,6 @@ } } }, - "MIRROR_SPAN_ENTRY_INVALID_SRC_PORT": { - "sonic-port:sonic-port": { - "sonic-port:PORT": { - "PORT_LIST": [ - { - "admin_status": "up", - "alias": "eth0", - "description": "Ethernet0", - "lanes": "1", - "mtu": 9000, - "name": "Ethernet0", - "speed": 25000 - } - ] - } - }, - "sonic-mirror-session:sonic-mirror-session": { - "MIRROR_SESSION": { - "MIRROR_SESSION_LIST": [ - { - "name": "span", - "type": "SPAN", - "dst_port": "Ethernet0", - "src_port": [ - "Ethernet4" - ] - } - ] - } - } - }, "MIRROR_SPAN_ENTRY_INVALID_DIRECTION": { "sonic-port:sonic-port": { "sonic-port:PORT": { diff --git a/src/sonic-yang-models/yang-models/sonic-mirror-session.yang b/src/sonic-yang-models/yang-models/sonic-mirror-session.yang index 98e0e9dfac8d..b3e82f2d0c67 100644 --- a/src/sonic-yang-models/yang-models/sonic-mirror-session.yang +++ b/src/sonic-yang-models/yang-models/sonic-mirror-session.yang @@ -154,14 +154,9 @@ module sonic-mirror-session { "Destination port configuration for port mirroring(SPAN)."; } - leaf-list src_port { - type union { - type leafref { - path "/port:sonic-port/port:PORT/port:PORT_LIST/port:name"; - } - type leafref { - path "/lag:sonic-portchannel/lag:PORTCHANNEL/lag:PORTCHANNEL_LIST/lag:name"; - } + leaf src_port { + type string { + length 1..2048; } description "Source port configuration for mirroring. Can be configured for both SPAN/ERSPAN. From 56d732a0a06a9241c26dd8d56f38913bf922aee9 Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Thu, 16 Feb 2023 19:13:39 -0800 Subject: [PATCH 24/57] Use tmpfs for /var/log on Arista 7050CX3-32S (#13805) This is to reduce writes to the SSD on the device. Signed-off-by: Saikrishna Arcot --- files/Aboot/boot0.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index 650e3178667a..ca9f8fc2efc4 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -524,6 +524,7 @@ write_platform_specific_cmdline() { fi if [ "$sid" = "Lodoga" ]; then aboot_machine=arista_7050cx3_32s + cmdline_add logs_inram=on fi if [ "$sid" = "Marysville" ]; then aboot_machine=arista_7050sx3_48yc8 From 8437e893b4765e91b2df04528b4d5581770e2479 Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 17 Feb 2023 13:51:17 -0800 Subject: [PATCH 25/57] [Arista] Update platform library submodules (#13870) add SEU reporting on chassis fix fallback logic for Clearlake eeprom identification fix fan speed reporting for a specific model move pcie timeout configuration for Upperlake in platform code (deprecates hwsku-init) --- platform/barefoot/sonic-platform-modules-arista | 2 +- platform/broadcom/sonic-platform-modules-arista | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/barefoot/sonic-platform-modules-arista b/platform/barefoot/sonic-platform-modules-arista index 4851b192fb3a..7deff3f0256a 160000 --- a/platform/barefoot/sonic-platform-modules-arista +++ b/platform/barefoot/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 4851b192fb3a4a498d33fb648cb5223cf565ef08 +Subproject commit 7deff3f0256a5d0c905d8fde1df0b466a4065104 diff --git a/platform/broadcom/sonic-platform-modules-arista b/platform/broadcom/sonic-platform-modules-arista index 4851b192fb3a..7deff3f0256a 160000 --- a/platform/broadcom/sonic-platform-modules-arista +++ b/platform/broadcom/sonic-platform-modules-arista @@ -1 +1 @@ -Subproject commit 4851b192fb3a4a498d33fb648cb5223cf565ef08 +Subproject commit 7deff3f0256a5d0c905d8fde1df0b466a4065104 From a81ffeb5c29698a35ff6508f744a687a5176b0d6 Mon Sep 17 00:00:00 2001 From: Stepan Blyshchak <38952541+stepanblyschak@users.noreply.github.com> Date: Sat, 18 Feb 2023 03:31:14 +0200 Subject: [PATCH 26/57] [systemd-sonic-generator] Fix overlapping strings being passed to strcpy/strcat (#13647) #### Why I did it Fix an issue that services do not start automatically on first boot and start only after hostcfgd enables them. This is due to a bug in systemd-sonic-generator: ``` admin@arc-switch1004:~$ /usr/lib/systemd/system-generators/systemd-sonic-generator dir Failed to open file /usr/lib/systemd/system/database.servcee Error parsing targets for database.servcee Error parsing database.servcee Failed to open file /usr/lib/systemd/system/bgp.servcee Error parsing targets for bgp.servcee Error parsing bgp.servcee Failed to open file /usr/lib/systemd/system/lldp.servcee Error parsing targets for lldp.servcee Error parsing lldp.servcee Failed to open file /usr/lib/systemd/system/swss.servcee Error parsing targets for swss.servcee Error parsing swss.servcee Failed to open file /usr/lib/systemd/system/teamd.servcee Error parsing targets for teamd.servcee Error parsing teamd.servcee Failed to open file /usr/lib/systemd/system/syncd.servcee Error parsing targets for syncd.servcee Error parsing syncd.servcee ``` A wrong file name is generated (e.g database.**servcee**). #### How I did it Fixed overlapping strings being passed to strcpy/strcat that receive restirct* pointers (strings should not overlap). #### How to verify it Perform first boot and observe services start immidiatelly after boot. --- src/systemd-sonic-generator/systemd-sonic-generator.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/systemd-sonic-generator/systemd-sonic-generator.c b/src/systemd-sonic-generator/systemd-sonic-generator.c index 273fd5452b74..74f08fe39612 100644 --- a/src/systemd-sonic-generator/systemd-sonic-generator.c +++ b/src/systemd-sonic-generator/systemd-sonic-generator.c @@ -608,11 +608,14 @@ int ssg_main(int argc, char **argv) { for (int i = 0; i < num_unit_files; i++) { unit_instance = strdup(unit_files[i]); if ((num_asics == 1) && strstr(unit_instance, "@") != NULL) { - prefix = strtok_r(unit_instance, "@", &saveptr); - suffix = strtok_r(NULL, "@", &saveptr); + prefix = strdup(strtok_r(unit_instance, "@", &saveptr)); + suffix = strdup(strtok_r(NULL, "@", &saveptr)); strcpy(unit_instance, prefix); strcat(unit_instance, suffix); + + free(prefix); + free(suffix); } num_targets = get_install_targets(unit_instance, targets); From a82e45a192c7881004d0d67134e6902e4ae63852 Mon Sep 17 00:00:00 2001 From: Oleksandr Ivantsiv Date: Sun, 19 Feb 2023 08:43:17 +0100 Subject: [PATCH 27/57] [DNS] yang model for static DNS (#13834) - Why I did it Add SONiC YANG model for DNS to provide the possibility to configure static DNS entries in Config DB. - How I did it Added sonic-dns.yang file that contains the YANG model for the static DNS configuration. - How to verify it This PR extends YANG model tests to cover DNS configuration. To run the test sonic_yang_models-1.0-py3-none-any.whl should be compiled. --- src/sonic-yang-models/doc/Configuration.md | 18 ++++++- src/sonic-yang-models/setup.py | 1 + .../tests/files/sample_config_db.json | 4 ++ .../tests/yang_model_tests/tests/dns.json | 13 +++++ .../yang_model_tests/tests_config/dns.json | 47 +++++++++++++++++++ .../yang-models/sonic-dns.yang | 45 ++++++++++++++++++ 6 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/dns.json create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/dns.json create mode 100644 src/sonic-yang-models/yang-models/sonic-dns.yang diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 6fd6bbd1125c..69635053245b 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -66,8 +66,9 @@ Table of Contents * [LOGGER](#logger) * [WRED_PROFILE](#wred_profile) * [PASSWORD_HARDENING](#password_hardening) - * [SYSTEM_DEFAULTS table](#systemdefaults-table) - * [RADIUS](#radius) + * [SYSTEM_DEFAULTS table](#systemdefaults-table) + * [RADIUS](#radius) + * [Static DNS](#static-dns) * [For Developers](#for-developers) * [Generating Application Config by Jinja2 Template](#generating-application-config-by-jinja2-template) * [Incremental Configuration by Subscribing to ConfigDB](#incremental-configuration-by-subscribing-to-configdb) @@ -2096,6 +2097,19 @@ The RADIUS and RADIUS_SERVER tables define RADIUS configuration parameters. RADI } ``` +### Static DNS + +The DNS_NAMESERVER table introduces static DNS nameservers configuration. + +```json +{ + "DNS_NAMESERVER": { + "1.1.1.1": {}, + "fe80:1000:2000:3000::1": {} + }, +} +``` + #### 5.2.3 Update value directly in db memory For Developers diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 60043cf998fe..2736465ead3e 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -107,6 +107,7 @@ def run(self): './yang-models/sonic-device_neighbor_metadata.yang', './yang-models/sonic-dhcp-server.yang', './yang-models/sonic-dhcpv6-relay.yang', + './yang-models/sonic-dns.yang', './yang-models/sonic-events-bgp.yang', './yang-models/sonic-events-common.yang', './yang-models/sonic-events-dhcp-relay.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 3e3ebb47a9f8..1d0d04b3f9b5 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -8,6 +8,10 @@ "192.0.0.8": {}, "192.0.0.8": {} }, + "DNS_NAMESERVER": { + "1.1.1.1": {}, + "fe80:1000:2000:3000::1": {} + }, "BUFFER_POOL": { "ingress_lossy_pool": { "mode": "static", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/dns.json b/src/sonic-yang-models/tests/yang_model_tests/tests/dns.json new file mode 100644 index 000000000000..538eee4de72c --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/dns.json @@ -0,0 +1,13 @@ +{ + "DNS_NAMESERVER_TEST" : { + "desc": "DNS nameserver configuration in DNS_NAMESERVER table." + }, + "DNS_NAMESERVER_TEST_INVALID_IP" : { + "desc": "DNS nameserver configuration with invalid IP value in DNS_NAMESERVER table.", + "eStr": "Invalid value" + }, + "DNS_NAMESERVER_TEST_MAX_IP_NUMBER" : { + "desc": "DNS nameserver configuration exceeds the maximum IPs in DNS_NAMESERVER table.", + "eStr": "Too many elements." + } +} diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/dns.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/dns.json new file mode 100644 index 000000000000..da14e8566c45 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/dns.json @@ -0,0 +1,47 @@ +{ + "DNS_NAMESERVER_TEST": { + "sonic-dns:sonic-dns": { + "sonic-dns:DNS_NAMESERVER": { + "DNS_NAMESERVER_LIST": [ + { + "ip": "192.168.1.1" + }, + { + "ip": "fe80:1000:2000:3000::1" + } + ] + } + } + }, + "DNS_NAMESERVER_TEST_INVALID_IP": { + "sonic-dns:sonic-dns": { + "sonic-dns:DNS_NAMESERVER": { + "DNS_NAMESERVER_LIST": [ + { + "ip": "1.x.2.x" + } + ] + } + } + }, + "DNS_NAMESERVER_TEST_MAX_IP_NUMBER": { + "sonic-dns:sonic-dns": { + "sonic-dns:DNS_NAMESERVER": { + "DNS_NAMESERVER_LIST": [ + { + "ip": "192.168.1.1" + }, + { + "ip": "fe80:1000:2000:3000::2" + }, + { + "ip": "192.168.1.3" + }, + { + "ip": "fe80:1000:2000:3000::4" + } + ] + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-dns.yang b/src/sonic-yang-models/yang-models/sonic-dns.yang new file mode 100644 index 000000000000..87366d60e82a --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-dns.yang @@ -0,0 +1,45 @@ +module sonic-dns { + + namespace "http://github.com/sonic-net/sonic-dns"; + yang-version 1.1; + prefix dns; + + import ietf-inet-types { + prefix inet; + } + + organization + "SONiC"; + + contact + "SONiC"; + + description "DNS YANG module for SONiC OS"; + + revision 2023-02-14 { + description "Initial version"; + } + + container sonic-dns { + + container DNS_NAMESERVER { + + description "DNS_NAMESERVER part of config_db.json"; + + list DNS_NAMESERVER_LIST { + max-elements 3; + description "List of nameservers IPs"; + + key "ip"; + + leaf ip { + description "IP as DHCP_SERVER"; + type inet:ip-address; + } + } /* end of list DNS_NAMESERVER_LIST */ + + } /* end of container DNS_NAMESERVER */ + + } /* end of container sonic-dns */ + +} /* end of module sonic-dns */ From 1cd090277f920e9ef04158b436f3a5b9772341ee Mon Sep 17 00:00:00 2001 From: Stephen Sun <5379172+stephenxs@users.noreply.github.com> Date: Sun, 19 Feb 2023 15:44:56 +0800 Subject: [PATCH 28/57] [Mellanox] Non upstream patches for hw-mgmt V.4.0020.4104 (#13792) - Why I did it Add non-upstream kernel patches for the Nvidia platforms These patches are not yet upstream but needed for new technology. A flow to upstream them is in progress and once they will be approved they will be moved officially to sonic-linux-kernel. Till then to include them in the build (not must) the build option INCLUDE_EXTERNAL_PATCH_TAR=y should be included - How I did it Zip all the patches in to a tar.gz tarball. - How to verify it Manually test Signed-off-by: Stephen Sun --- .../non-upstream-patches/patches.tar.gz | Bin 0 -> 83191 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 platform/mellanox/non-upstream-patches/patches.tar.gz diff --git a/platform/mellanox/non-upstream-patches/patches.tar.gz b/platform/mellanox/non-upstream-patches/patches.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ea77e556ed0df8eddf44910896e43f9051f584ad GIT binary patch literal 83191 zcmV(=K-s?^iwFoM81G{M18`wmVIUlNH^Q|Ud8XxKAuz`{7Thor*h4c(BG2kh%)}l&Y4Q=_qp2#C zlBVej{VpmRD@9q=B>9P?Dw?F}sv=8I;1>KnL1H85cl=D_#EcMn5+`^v!a=;Kp5smK z1D*T+97W+6sXfQmWy>~2xu*fIB+1bnv5!Sj@AWmQ?>JV^(H#+;h5@?36C~+K6!+;L zl7X!)0%jlmVmjU!otZ$(C@}v-udm6C$&bOc=Xhq<4#x+rcV>e3(NW}ekb>S}8`{ef zlB9jLzpqMYPXu_ai>dVm+sQuq{p|4a?T0@QmC${ZiztBbZcr+th{`Ae8AbFdVlp~S zaNKI0N|+YP=aP&GU9DtAkzk99WS^-Nr;jWMG?NW>@c{-LE?o$2gM;r;05wxWRJ|?3Ol4e z2hwe|F1)J%J3{EXf_2-B!sqzf!!u|^8vKtJdFafG{tVIUFK}I|Spk0Rgy_N^dE+tm z(QD5MV|!GpF9<>lb-Ue{0Zv|G7*s?qptf%Y;mu2m^vj$_T^pf)kglP<^dn@S7Lt(b z0V(;YK^pqV3t}7*(!@J^ZF(uurl9L3FXvDR+V@&X6n zAV-x<*KsYU+g0>_-w|c2ha@_u5t3|xOABbR2|hpmh=iWrkyNzD3b+BXmv}acWAATl zB&aC52_8=j5YgFAoJ3PQ0dih@pb5KBc3S8ud=UARo*J3%pj~oVtO(4C(5^Lg+b#6p zmhhA}tf~vzt*RAz)7o2B`=(l(^a-kxm|lP*BXoBtDrf>$_lW6TTM2u7RXN1FaM#nJ6fsW&3|9h4D~!h~6Y zg9a!>8~P&E239oC20(g+Mm%k#4o@F-VVk-@`0}U^ThIqdR5}B+$BG8}5XFfRCjfbw zLNwF}aL^{g?#$8q>^-;(}1cKAM(;-U|F&(V98`IOZ z!~v3fy@iX3J7^yOzpMT+5c3*1i@XHiuLjaC%Ni)lDh+n=GG_;2S#e-|-9wjnu#8%v zg=^>`qFwDyDCkGc+dS?y?IXsddGkYW*P@q8DiX>IUA}^~!)cIE707`s7Wd^qR>ZL? z<2wEH?&p)Cas2V!@UwAx{1NT(@iFNklJm_%Ua}^2q#mdRE0@nwMb&7uifOuxd0fXd z)(k7EYQ|6J)nHeuADw(nGnF(NEB;PYhK!P_3>|M-WnjQR9bODedQ+n_(&ma{MO0B} z-&|1?QK8EeUN*BIHrOH0HvQ#>q+uxQ>7)5rsU+WnX(&o04z5cAlZ+w^bE@yeRAg$z zv?%3F&@Yb8jLRX|kq^i3KN!Cro`38hE+rL5ipsH~GdX5uGdad%99`kSzFj5AO{e=u zQGOKVm7;uja(I5aRF-v^izSd{R>G}C0_>X>_E$%a8v63zg|D(O4Ch7w5KYVg`{+NS zLW6QJh;)&%GK8O3Tpq3eN>C_!lZ3UDw{Rp$-B0#+Kyv6R=10L zgMn^ornq79ZVr0Q^xeE6aUN7rqAnjV>y|IPLF)fmFqG7RNFV(j2G~fwiRABc#EO2v zkC=e1@&bdv$JNJ|ABN|rhbP9bLvU0tjd#PN!=Fzs+5RkdQqgN9wuxW$^eO~(fIAcw zaGpb=E4+K^P~|mB2-a37JHDBv6zPIs0qFhKUK5b}0FLPM&KI!f9(erHEA#~&yaC|o ziy+X=h7ycvPy=O$Q4xLVAR8_yC5ju>EZvkQSg|5=`^xMh5q+|yC zxp%xNn|X5}j&LwBBe2f-*cWm>Z^Syyzc=DNufBls72r)c&zn>@TLF}FR}faQu+Vg# zjp@Usd@NK-8L83D;DIKy$#33X6&YB^tolfH*6aM9s!gNVP%Ph5t!|!9qR^t7r!m_- z6$)G;12r=F*eg8AFiK5SaVOc1(qtlz4oMe^@Ly0QracM`(@wx0fUjgDoPD7o3`#k@ zM|W-qy2f{I*Qedn^{E&8?LulSS;fMwl#&%8UqYY-B%&~0?xGk|uLOao;XxC0es&rY zCWvVFC9PB1koOHjE`z!yB&NnNN>g9v2g$bH?|qQ8TMFST7lx{NV>p~1y*)QT&@PPA z!_Ot#HW>7%whXjQwS^&nd|?dF&v&Rx!o@zN(%I#C{)`QGp-RA@JhJ#e-09&HY^EP` z(;NXBS4oqiUiO@f6gb1-EB&9di~xdp1`sBfoT%(&1zGGUee$}3EOk_IGcpy3RG7aC zpOc_bqmZ-j{VI6tLS30Ch5*U*ZYg~hH(yvUO)&4o3%(6QCyQiS|!VgD7Q zygmkLH%l-n_ff>9j&87ew|rd3z9m>>U99E{gU_%a`#PNCC0}BJ0nd7=Td$PB?`KwJ zo(R-V=hPJz(6Zh~;6$8Da~ zE84V#o@p1ADhnp2{dFer)B&8E!P>=%t=d)HsI!Kg;6&WfS{-e5stSO{}pvz)8^v8lJpq= zy^jx#|4LF{Qxw@5*p{ofx@|c!c6zeo+E#C%+E~T11K;}JJpQY!8UH0Ric%RxAfq&_ z%aWHtM#E`jV-onCua`R#pm8zNI6g-^JFw=MjXZlqPGtxK|F#ujA77i`nb4?lKq9Y# z@3|OV%skM7&w`8&FOJ{FU34*>Ou~p&1Vm%Z9-x^S0~CS>4H^R}#$JLf(dmn}C@Gex zqMc`alpNnv9!acp(u!FZ&)S$GLNa})z; ztDvN<-dpDdxR}2=`i%?JT0L50t)TI=a~Hik8&x_Z6wXSwws7 zNH&jPOY(q5bV#WYr~NwgoOJt@Qj-BRCQ#J5?)i0_Zn6(QpM5&NG%kKS{pr)mPCXpD zm=@@3PD_=Sy(_SyQ-SQEa|@c^7YcM3xPYx^%kXdi=sqFML<2&SvuJPI^AyHl628@2J*w5rK9zFAi=F3o_9HqRPcxl!#yR3hm zrAY!YX-{IWML5|)`vLcJvrXJ?cVLOOqq+Kqv(2{lbM-!bcbXL1cDJxtzC7nZF=77w z+3|Vl?Zx%PYTJ^up779(KSd=p1J`94&1lS`M4vP&vzxAjnQf#bXgc~*EV)PqMudOe z{#n1zXr=e-Xmz*Uvy^a^6L-D?2^xU82dWI@S_!H|)&3PSly0as6ryeK;ME6+L`jr+ z{0F!p96FA`XfCib4oSivoo)oz!@d&>WaWy3WQ*}1nFM?C_>V&3KTtl#f9~T$<3Hep z>9Va^T5ka2pg4}L_f*}oY|HN1JuD4W$&v^5x6l7mSHyonME4QMD0;?(^cg>ilkC+{ zDMd_5Q7Waa);o6kW=vB5OqTW+5+%v@c4A}(4jP%)cn&HL;R=fCfek zE4+VDAEg<6^T~W_HJ4AlYoLSm+RVG6b-ANw4kQq~p5%19x~tocrMUL`jvj;9+`nV> z+2*7K-ifS|-AR50w=tQ$t5%Nh0FbCj;i)3;07Beic8c&iNW2ln z4w6;iX1m;BY)oJ|>-uIqn(MasjCB5SI<`P>LN{%jU$UV?bwsP99or0$1zHCVEG)#W zTjb(d+N|B(XeQJj;X7z3Kx>8Y|s8*PGMTo3-({z7xjIm$@$;e{zySa z5tq?yuczi2wdVYlL1tmDP2Y1&V%oas1QQ2n4Fm)VC-2phqi(ptj*_<*Rl28tNi zHG@Q~5l#39I|WNsQfTEACn7?yxWoyc{nLdiz|3;{;hHD+6CV5kX6G;T9PJD*KY)jE zF}yU+KKzDWzef3uiw}qA!*@^|A6>TF#iMq_e0@t^vNk@Ezqdo4`An9h8D802ZuCvr z(po<|u!pYrrwP6>{1Ddp&*vMHvu)@@{x&D+xxUu#?D~%`F^4ovZ%ij?E}hz=XHThV zoHnQ4RYp5#Gy@%kFL-%qzJv19B}lYZk!jp_8XK0E#I?bYhauL)jLdN?985yrvu{yd zewW#r<3#$ zjk8a`4$sLKa(Qz6_BZ+pHhTV?tIiq?4}ZS=#1ou8o)|=@hUZY@;ytOggKrYk{D@( zrnqecHwycf?FSWcl4i%pyjr*y5bIUe-bMt6 z32A^_ATPiR0iFr5A0|RTV^hNR&VNufNiW2IRI>lmd))uIpAU`y^laI+G|@CwMYq&` zukT7d%j#RMCCbjgaaF}q9p@g-f9N&Y|6wwUh>Yeh=&(Z?@C*?dMNCH7j!mmoY_M}` z2Idten?vXlk0&^Sl^@K==NwQwheTVWc!F)uy(Nb~(0wEVo(34Y=n}q9rqLvfF$vWs zBQNHSJo*A0UmTE=DR4~h5ENP&&Lkj30zvf5iUKYyYlx&CGs6J#8Q(&SaolYkL7N~9 zgvtXNMtV{FA&VDi8hC$Av44v^ha6b}n6YX$jK9VEpoz{tX$s>?8kh12l=#CSWI-H{o~3qGb4p*n&v};< zfcKUI62IYT!gF~=)dPg@oYZ*djMyv94)?SO3^cgC9hEWaEReQC4K~Rs$&p z4bQk;e6np}T1VSBH+5^aL8zb4S2C5JOF$Yn?uvJjHM}1=sAo9mK*8zH`L4_Kloef; zOA1`&dz#$Y^rZym=kGAyzD7jt*(sC^-=e2Y4$-3Je^wrQnc3rcPP`{sP8lEQfeA}_ zTEw7(U_hAtX9u>f((xs&(V{~|<~iId{M5x#W*52rfGOAhzTL`-|Sqw^mk&{b5X?&jKzGL>Jb@Dj^0^1J@wkr4cmpGhd z3wOIc*|vIpTXXI+ak$@8$vY`~v}6a~)#QyPwmHePf_hbjtWlkjKNpR6!=vMmLrUK{ z@9Oy7+^v)0M+$)?ndU!po5kc>dkFL-3&WuuaUY$UUVyC7jGT6tK2MWPkJA<}TmQ%2 zoAsvBpaP$<+{wao)Y6gRD!=7O;?_1&_oj=I1sA{g%{F^ZI)N$S|p{EcfqV{rX<@9KhMJ0FIPkj10ISaNc} z@pDDto}TVGuBW`Q)x29rdIe*i_BzXyI&9{jSRv}TPSd9U`|j$g^nXs<*W&*)QUB+) zzUcp+;)D9XVRz_+k=F?aoo2^xMUmU=dd_GRj>FI&gh4ZMM#C@~Ji7j`RZ9Q&-Bn5b zAFYt4|NCw;eV?iXtk^VItdGK4z>2B`R7YN13s_Q)@UI|zcNF|GSf${_)k-@n6L){6i$~ za1a@bat$bs5EpqjRjM*rCh*Rbs<0HbhE#>F?juQ6U__Zx6?F`Qa24q?5bzfMjy{zf z92*h{JsBIi@6b&O;Uswp+IGF=(`Vt`U;@msFc8D0T0!0Q+Q# zmD7&Ho8m$Wquf>R6)%RX5DQ52WH*8gS!6efHPZz+n+`gR)1e>aifz(*$rjrr2cUIo z7svoO(*!cwW+*I>v7xVCIq}-o1|PRxQ%vR|0h0g4KaT6PEb^aMC&y1_|LruJzA66+ zTEQ3j&r^I@{=c9b3 zGFiD~cTUkB_%R*4kZc9R2X*1nyBSp-X0bc|t z+zF;+E{e_JJ)jnf2HEn+{vd`nS_)_Kq@sb;{7Jqg5Z+ zve@Uu9C)vHd3AB7SaOs@H%M2x9ny)K5~4hE9Z&#@Ys%O;nUDopZ9y$4JIbtCjs6GW z?0uiHXDmsd7z(Qnub)&3DMXKy4QRVTkLwxLj8woS~F30^kcv7|RG4v3qD)cJ4{hBF4Bh;#dN{U*83*%&R5&)axrOL9d*=am+e;t? zKJA@bl=TZN3c{3$|4xgQFO7oog# zTTqR#SilWS>8W1Oh}xonR02bRd|?^<})T0!nQ0HELnju)ePF}JX zc8Atx>)>}WdY=!rD2~kO@Xunv>?@&yaf*TBAe4Vu6nix7wpidgm)?Z+K9_pQf;pw$ zvNW_Pe%Xpm3sY`eC_Vq&??nHbKJ@&+AHDy1o^t+z90x<@v9BCw9GSiVnU+GXI9&6{cQd4xUcIlG zPk}o^CT($t;SiJru0V=J{#Nb6$BF`b$19~=_bla{6sa~ASkc+Pzh_*Ts361R(A&Tn zod5}^Q`}U*+mh(xFj}l3w}WzHLtPHNNm`~)+3f#kOpxnUE`FqU#FN)OgD-!|yPvr5 zH5x;=I~usH!T2ffe$AHe!`%*CG0?X@neg%YZ}tn;!%b8E?Teo0O`>e4+*YPD|+7jeKSEXzPWLWs_{z&eHE_xOzDk}wgD4q zPzcdtD}B-v@cCO~P_-I|GoI-5Nc|NKaW)3kn}MfQrZ-(-y2S3GH}i#n+Z8_Db>9z?Y9sKJ1z7KmZMmLyKxMQ^k5l0c5ea2?V~(f*e7KJ{xzaRt*t zPO|6z8E0*jQ6UOdl=0(fMScaX%WeyXv}E0?d8Ugn%y*O7LIW?6Q$r6-FYA&$aAJ zwrP}Yggq3-|ClH0{Xgh+em>+Y)CYUKefmb~v49}gv=yMU{{GEn|IfXv^WLeP_gA=F zpD4hFjH=OScmv9b1kL8Qh6B5Zjo)m6*=m)4=f>nN8k#xY32|uUPqZD^Te0Gr!?-TU$6Rj+^Z*UMi2``+;t z1Sx%e(j&k9R^iE-MdwBi=1&+gT!smUh%S-ifmrm@MhtIvaF0~^cSSq%?6%`~A)t=NoQxX_o4vSG5S)LO< zf8?}>-e@?c7b|Z(9*#$0r##_{TP;rW;yNNh0-!Yiwy_2xU+Qofg=@nG^-iz^2++@v zzVXq020Ww~2!xSBfSOEXqJV+>Us;;av6wua4pS;F8;z*jaa+DKep35Y*Ku1Ii;ewY z5&_h%nd_vI48z(pi)K)Y{JT(6vW6Zfv>G&RRatgam1SZon!fSsf@u^vU^+p~a}hFK zr{;B297I{itjSfMUO)QdX}G#gsA<#8P+5J5X*D17k*$=R0kMjgjhz=naVNs(+z^3s z6B^-6Qq|{|13$HOp)c*QL8t)a#W)X#FpP)6pEj(Z&4mE3tte|dMQm_mdZwvba}94( z>KQ896l+^H@DyuX1J|=Ov!H7w$#GT^1Ld?bIn+Y~e`LrzlE0Y`Rel0!ZS2{3XhCbG zH@;Q}K!3|tsu`73%;Vq&Vy({$>9jFd?Xc3&Q;g$X40#@hz;!&Q%c!2``D#RwEn&Tv zSos7HjA3ZglYmsFCn7JVPEXvR^meOiyBwO;xK&0YQrpDW=137e!J6pJ>mI3tws5kZ zFF_IY<|pzx8f@N4z1kO(fzRXPxUR$X|3dy>zYJF^rs_w+Qy*<$4eOU@#~0VqC}5ZN z-@ao1?K`0VZ@JDF{r^*ZSpN5xH;(*at23lL=5RcA+g=ofQD+d0ov;%GonX+6{Ah>z z{}lUgFUS5{py&~FvQjdM6NaM%aa6GhfINQ{0uqTz1*=GvJ+C(ZFarrMs|R$P+(y#{ z=<=uY*}D~}kI}FI_0>p6lZxIlQQ|%ytK_Y-djCcsB%RGBxoK)tKLdrT)S@;TLDOk= zM!|3k+s~c&o;u9;)JaQ?sMsW9ZlJ>6r<@Jq#>U}%Wm+3kL0$sxan=cf&;b0ZIW?<;cS1y0mK)bg;fxtvB$OJOns>TImQmt~o z<)Ukqw*(V2F>TsHP0Scu>}{k2D~{1c66*$XlJnlx@lCJa`>}U^lhR;h-)>JPqLOl{ zMxz~cLeGna!IPTV2OSs9zu{Xk|4slZ(;%Fds1el$+$&@PF4um08}N)KN*RIU4AQK? zp_47lz@gd~JMe$K5551niv9QTXoQB|Xop%~&+D4Tl4_+j9K2Kkz;Hdo*?)KmT91i2pCx_DFkd zG>Oi#>aJMLx+@jEm9Ig=BjjYrflyNTwQ5963rz0lVImEQD?;wJz75y(ia8^Lh+a@< zGdl2SMBom|jHYj5UtqLb4yPZ&doWdIHq({KSo5C+xjYL2wS-hEtF^E)rh@^4Xv|*C zjgaPWCVrT#q6$7>B7MC#bNph|u|w`;c*}=hQ4Pbn7F{(64`=smPM?>vE#p`Cjh22Y z#KoIwd@*h57t<{+qTBLBk`Zb&x}%8hr$Kj%5ath3+jU*8w(Dl3qkcN&lx3r#?&-|j zV5Hy%E2+7%4M1>vVwx5e7Sp4Vd_9_>%=*k(B6|LNiu_kNfYCd2v>blmk? z4kp8O=801Ou(R{O-SPv^JpWt%m-vrQ@?rAdX1m?(bjIxtU4-tSJ8Cw^Zg<%2_)*lM zOEzwLZmT(HKf3(aFChPw{$DYUqGfNKHAQ$!q30Hp_J+%M8(GUt2#(lciQSdV^PHd3ctV3O81w1kZPSt;=F9h$*h`6=jFrSMX3iISi~|EOSyEbu zah1_|OGL{6PcrGYwc^8B-Oe}DkunmXON-n4)nrI{qGTM7iY*QY&@&?<$Y<=^Xj!bCALpiKjs^sl*>l9CRBNNc(CA-N<^rFFLl$NbFEyGVr z(Wl9`)56S1t@iFSBk9IY>qqSDT z74r=Jksn6F6I8}ETr#05hB&Kh(@Z_XSXTmM&ly>Mj(iI&Pl+~c6pXdUwhY@dqUkKZ z36`?0#ZtCOiQm6W$~IdDw!8#dS;s@HcK>|Sx9K_AwwrD0upT{?o9Do$u6nNjID0$$ zcvQmr!xd^fE|FK_cVlP|uV#n*2RkXZ@3at;m^%h`V0N?%qdn1;B>QhJa6R$*6f>d8 z9hy>)udmz2_4Pd40s8>>8^^z7Zxbi2NoQ>wm)eO!12}UiFTq3)kHJse=P_$-qw9J7 zrR>O<#Eh-s7Dc0wU!j%gO8h^_xpHG=md3 zT299IgpOYg>dW<%D>9md?`Cs|6iK_34g`2~;K{u0a`QDtP}0%#U!NR*e|B*WH)!%4 zI;Bm_v{Lrff5`Il)l?9zW{yQI5)Vtq1{*qP_+Ueb4kN?e=B~GC?=P1ZS2z9Zzn*<} zak`({Cc9~+cB|ivX7q({4ho4qUGf7*xv>>Aej4taQZ6 z#=S9@C3fXuKrk<{aXxvCMi0*&fF%rprE9j|w<2_H5e|MjS7@ry8PV62Ia@CUtQ3#wd1G z`b#arVUa>O_=VYTV(4tYNa|lnXT4@iD3md%B6UQ_-+?De5(&{ zE|x~5C&QGSE}LDF3yXUNi%soD5pTWeWcI!veO&j!!Q_yoNkT%vavggJ@J>Pk_Xo~( zoSwA!0k^f!BkwV;S+@lmooe8;Yo7B6tM+@Lb5(EOuv6ZFTS;{njalS>kL0=HlyRX* z;@Q)Cu}JEuKo`NvVVuVf#Y83_r^v?l$l-VzzGIHQ#VT7arYTKYRhgna7Lzb;8y+ZN zLdZj7%joa49BYz0`S?g3gP_T%<95KJd;Q&fJty-GvRJ=c?~NK>Cy#S0f09}!1->;cCKeK0yWX01!=+J8(&u3^6t`vq&8mUnmko8i}$M+w|6*A~zBG78n z_0l4NZRf!Hdmf&Z%6KG1qbAPCMh@hCJN+6ZN|-g7(E5opDy8FDqG$mo@pH|tgdUM@ ztL6n1#eBEswRW2b%fzyNKW=cf1z}ZW@aedw$#(M5jhGlG!%r5xpXX>Al6%u81&S5+ zF-M)?76fxm zo3suz7dkm;z$wBmus{-*Z9u@!L=6YbiN|B%ge34l-dt@qyI|0&6Osq-d`*d4v5(_O zQuR{!_?3>3yFf+GQfV!xB8_#}MG<8uD57m|n>2QtB}=)(ZQE4t9S(WYj2j%gAF;1; z7r15{J6dU%ZB&rzfxe z+CP4KbMZnFp!|K8Nui~#lS3pXP30O+r`ho|YeaUUt6&tV3|kI}0!|4{%V}{1*A5pX z?Yd@dIRCnK8?Kn)3d;{roWHShDmglcJ;}@*F3g@agWvVQ3Cgt~);4#610cgNQ~&E!xqH+0Jj5oph7VK_(z6Gppqx5<)q_(9EW=CQsd zmojN}WNjQ6UB7=izrRR| z5wOlWg47$T1rI%_gw|_7XqRr-ifHFyxX@NJ zE67(lyda_vwhoNdOW`4Hc64f6oGzp6-`KI@u>u`ZSKs6q4{NP}QOiw_mI6b-{!hnO z=e0P64v=>U=pXC~K)C`BrM+U|q?Eg8Oo>@6sRQ*wl1jBjS$T(K0oZly1MI;qW{@Ao zBNPf~Wid`jA!#Z;Pc%CxFq1G(6sx6EftFLu7QmRXX6q&2aH-Ws2bESg(;i{Vb%rj7 z^Vxbb+e8fNd)fwgNg-d&!~7SvRWMLkgONsKCAVLyi3FHAl&x)N0-4@vF%1jdk(6+C z99JV;N{}i!qz~b8#>cgpiCCNa8LGbnwmh9eUL#k3^%I?;!iWAUjf$B*9{hp z&_(TC$8Tx0P-nlXF99j8I7)s04Sj!*HEW(TJUzFZL%6-HDje1>25l*X@`B zs)sGARTe0keF?S#ce- zj_vwx+G;!ubXkUf89gw@z&N+0NNc(7--U}Zc7G3U$?njUF#LP)a=2_c0xrGX83YQf zgJ?Au_M6%6pkK7D>Mfn4|v_-9Qp8Wm+~Zzu0=6_qI&&!^M*2XM|BPnMK}gHFh11rOqE z34#qrA1=zTqa6(8WR{dm`8Ar}lg*-0VGi04Q)_SsDK6HKxea%$(BLj%TADahmBBA^ za-T4Nif$*^?E)3uBl+|Rl3?tJJQZvzUEjAW;>3hTuH)oWr;^jR>z zTTybGD(ZUWnk6n-nNpTCc3b7GQza_}Doba5B{5qJJ9eeAk{*~-O8c1;N(xQY(bzgq zonCfRPAn2GF{MPCFSbd$DTqbkAii-09#n1=x}H05!%m~&_#?+_ciPSag36T%=c`mg z;#Lb<^gyXKL9JOyi45=}@q*bErgKY=5JKoh3PV+7+!el|!vwyg8TClq$> zR2=x?Ddd4W7NTX3c^6W&9g3aO*rc7wopvh$$cF91MF5slDeVH7bM>Pw86zFjmMl6n zR(QKxg$M;+f|uu2_|3u_41;0NY_=MW=4jju!scMx6qTakl6MPH4MQ8aAW5vkSJ!H9 zgM~Ft9-?qUhU^u;yif!#T(HI$&)HY2&Xl>5rn@*x8pL4>b)#jt-q2kV z4^MiLn*lie0K+)@L96hhW3<(1HoX5ATJ_`8K)= zmEr1kkoPj5O$dGWAtLYQYl7jel!aoMKEN1A$bK0Xe1*FWF@yZ}8~F+-F2j>d8&DgX zGR$26L$w1dU*FN2$T9s@UO$hAo@f2}InRr4TXkab5*afqz0u-qAI0!lmKQm%z43TB z9)YORb%L=w2)D_95w}`=XT^2UnWqa%m}WP{aQBWejPpe_vq>80_kpPjVpRk)$^Uvu zcpQ}l9U+j%gBOWjydOWD3atD0{;geb%BBSpcIU{lZ{v zHP#KY{3fx4Qxd3v89xL;D#6!c_u00J7TN7{Sq4ovQDj?KRv@E|R1&4w_ew2;1U578 zahomG)cr17Q}9PYc4g$-BYL8dY&Z+iFjsWg@VnJSkPC)JG?uB4_^d&0A9+cTXEjm= zW+HH2Q z;kS*dt`_`0BXm3KXY&&|3Clb#0&pDYgK8XxL~ByI!|5@caiLm(qNBBvUHmy}8xG zi*rjmQv`kiX;m^O#A^l^xynbh<(i`!mfrz><=MRD)HDp)anZ0Y+@C=8Y^t^W+ z&U&)%lpVVL&1|)Zp(v-x0V=5cDj8S91d2HTV{=)+m{TJLpE)Ee3{~SG2DYHZz!tO$ zfvrGZfyV}%ad#;N!tA;+FiB#dIygzBoSxFmh(WaF;a!z|tNXXqE$CselNNL zuRJM-3eTq%t5%e-LJw%&N!Z}0+x2*xQ%A3v~r`#;wgsn)SovX0qaEVVT)2L zhcZO%L8m)tc1E5XdPCnI`ffKIMeZQ%wA$osJ|oxBg1BwsI7j#&@#wNvpqXM>;a`XA z=!o2aV}cuy*U^wR;JK9VI%>9$JbDm0w86^tX7D%48Xb|JFOP3t{qPGT9Y=UkKOziC znPUYfa+vQVMp6Rq#gN^;g6Zv7mCDU+q*cJX+GIu6;p%-f!gvDW)f_dbkieX*Hp5#I zt{`mWnv%?l;^o1u&_X&8lqoa_b`dT4z9DeTF7L1*=xDfEE~D9cdS6+sY2T3Ehs_x~CAmTagcxi=@MwP4B^zq;eP1CI)jlKWKje zqo4=q{-hB#nEM7{jIMLgs8o(uB!n_>$HO5B2r&TBt``8F8pNrc4xGK<~))j{t14C*bcj3p$ z-R3UttHSE75bn?~o#{1ZPpZ$yCxhPPUIdOfI+ zMx#+Qk3IeTMm*0aRpnF1PldQ-3~7gkx8dwvM4{p~+Z1@KXo)DeUp=UiR*Q_HX~Z7X z4=NAve<-E5#|r$qG>*oD?qJ|}jfNMtTE5c^+7Ix5D6Ow&l~_heRMo>5H&(GnmO*QH zFr6rBPnry#|N9FT+|95T1D$({{O1M4XS0t7Fu%`s+dowfEw*kEHNk<3D6>FssTbs% zLvp#CuPI?%k*}54U-QV(nSfA!|NM)XT4JnpWYvtR;h@8heQn?bLtGm>lO%Q~j1e24 zW%~0m#&ug^<&)WPx*16aIZ4)d6%8se5G_E7>6uYAV<`^f-vE~?g-bOpj7GUk_7;zo ziJD?b#B*e6x!7;aQ^vx>I~YSHaD5)Xun6~DAm+n%X@x}4LDqrAvYES{*d7-!a+bV( znj6GHrJBIZQhuS;_!^?RBr1y^_xp=Ay9VHfjv7h4+9oFw*DmNTu!sSkj~L*09+>*( z@v`=$?=b0#B>uolX(GjscIjvNejLE}Y7n$|r0H#^4IAvMedz8v+3(%_(7)8v&HRw zeRWF#H2R-ss8nPCWRJ+;o}PBo^<*(+mzGr;$Z*Fr1D1lweHfWwTar9~N&cS!fZs|$ zBn}K#FXaecO)qWPJc+301v6N&lua$$0VHHbB+rbtqr|Heux;) zHH9R&_aK5Zf;RDd-DMfiTwYO&f3(wN7tD^lQ|nTUbi2$uY3B&3L06xGmcXSj+7Rox zWL;)i^fRKGX$dhfcCzaN)ojOFb~^T>$On{phi9hqQoy;T%xb2VjxsAI7h7_%KXgMlWZ+E;5le{O8#1M=H%h*I>k|CLenE2HcI7t^)z|$k%DY-tL34_;Ur=3 zN?-Psec1(+#PUCjAvKu|DJ!^&kmhpxJFI7dP}H5zwgV)^UjfI|8h3Vkz-o2p3&2K` zD3mdPE!K)(SujSogIRw%c|4Id*TsXA4rFmf$sQkvFG@*cvuEa%;xWx#WavAPRnps0 z;)T+DQJJ$d1*waq_t=i1FLcswdw>dUTWaPGJvD;aS1P$Hvw;lRmon_!>?4}bf@Kbf zVF9LluXfsjo@feCtYYHW!xK`l;UNAVf~N>>OCwK>Cg{V;N@}xr82=v|OuCm8+R&EF z?X)>wjb}vH{<52inlHR z!d8nT;Z7spDW*TWi+KL12v=B2%w#l-m;WQ6SBfk6N^xk*zYEt{^so6Lq=nWxcCiIb};fjR$e5V5zn-u0AWukVJbtQ40{UMICl2oMxy6^+z(T^wA z)5A#KBh#sP>pdN*QnveU(f~1sVW(a5JKP7m<3G~QNzK^vm?Whj5rH{reg-Y>4!E5E$fq6gH=WyFhcxq4B~$i5KkHz{7pjLpncDi zbJn;2-+r+uf-Gh@9JIM~h}k$+LH|>Q|Hp164uVwy^O3|TN=qp|earBwUdL78S(B4X zrZ~*kd*>Hty)*84QnhPIl+A%nX6+3`chHC=5L?0jvZF<>n4Ko<;-YgE2WpzzSS{&= zCe57REhbCD%=!DvlPhWFY=sZpCM^zmYS!Ya5zbmlZh4Pr@5?){(SxJ3c`wuj^IqOY zX8fF(ZHPy(nHggMauRr9yv>oM zx|bl&CTh|Zl;tdFoFtCPm^cZZD#9EX)tKZ|)ntjO_1MXgfQs#U$>=*fe(Wk>!-!L6 zWYlkNJZ=$>*zWqiRjBm|l13t>yQVbhYZdxmGfOzYTGa^dc(~q#Q)ZQ;M`K`QZi1U? z5JB(>5{}neFb4WE9Ihw7hU-Y7Xy*Cs{E|R5ox%}^9GN8Qfw?Q=06?gox2BI&OBgT9 zC$>x-aBeory2fqW2U%=*)+CiY7!->e=r)@+LDU10G#e$4R6Cf&-rCIM?qXX%o{41# z#@EDAL-Be!2I4T#S;Q7wgT-A7-zXMUTE=@K#n>!wNhOY#X|Zh-XnFTu3_ zl|PQ_25S7Tv-z))7X1qmb5&8=iuc!E6 z{I6~_=nj0h?S-D-88tg@XXJIgX5@_qt${Ocbz1ao;JS|=|Ep6d{udyr7R-wwDT$F3 zIH!;@P8jVfst_=|f~!WQ@^%#|Z{!PPz?Ay*25IR4!hu!bp#6qf;4xEbTgoLeT+UY@ z>}6rW?&ip=@lasvd1V=GxK*|`0wsXW=Nrf>2(&m>Jd#y1kd+^pajabD)5o!r!K)gL zZZHah(ZCHqO&lxN>7dy-e)}1A&;=!YBvVX>K{6Hbx+R8>#w%wi)(rgumn|m5XNthA z8f%*59o42cum<5ty}}l{n8=%W&A512%%1I668%c7vY6HML8V1VYmbRS#>3L)9uAIhC;HrBKrZ3&MmW!})AHdAEUJIaoh)g~)f&c#fxY z2mvmK!)S$va5eTFMM1F=4s*gB=-`_9L6fl9!J$C{w~(U?3+maz0=uZq(s;sdwNke> zdBmQlEbWnbv$pi43lEY)2D|uRXTk`!(OUt#x_8>P*hUZB=4FxtGo4fpO;r}Y9OQN{ zWhi=Sr}w|6a{uG$ORpEx$-4e73YUZV$2x#{5>6-oKnAwN#ZUB+egA6*Uemb$dF^KN z%l+>uK6w8NMs9O7YL8ppL8lw~ZKv(K1E(___+!_P=&NSe9lD+FK2ugp}n0hm! z?^y+Kyu~u}aYa;KMpHPD2+n{&?&HZ|vyLdIGr@2!^wRfAgo)<9HL(M|XvC}xK%uwJ z1?@NvnOvD809S<4rXhGr;6a&)uX-KcMYaYv^ae|3A5K?uqXjj@>QA?D--9*{_>RF8 zN*w7G7NR=jaM2H01R5Pgje97oz{OT3E4(B|0F(v~h*8_dfDrL z-#fng?&2@~*C##j&aJZut1&WFAJ8C5LnLBy|JGsx5zAIcvi;U=^-sOg)a_MxXDP6d zws|=lrCMMM7-Bax=TY{s9^Du=i0Yco_Q_DJ_fAJ{vIeVP7sTfC1{t?Z```VHk_Eb2*b_=6Jbuk9wwlmDI5l{|@7l|}i z7CchNYl=YAsJez{l4_*e_9R+J3O2Jx7Sog*p@-VQ3+osJV6=6tfBSAZ-z-3)1}4AB zH!rN^8^F@8Ow`7Qe6_on`mE!&Ow)`qi>+-ZmiX91hc@X9k)vwyAUb-a=8O#k0>f~K#?e*(z=gr-GIJ}I?c||rI*FWmjC!p3HcAt0w$1D&He>pAeq>t z!UE}Y83z}NWJy^<0+NHNkcx2jgJt<*q-X`H4Iq+#B}WEBehrtC`DP`$CFA*Krio#= zXhdWg1KNyTaVi#pG~zUtmkh%hxeb4fq|`*TTqAT8WHXyi-baRv2mZXTK+ORpV;Dsv zKAF4uuaNglig04f{N-jgla>p74iyc6+DulFmPhQC3y+up47-T1TqV}d3?hmPU=03i zIGLg@2*$*1*OV$GQKhn($x2)t6b`@~M9gq_JBfZ}DHN6w&xr<0B6E-NWM;JUSg@47 z*iiKw5}!jnvqhmfK|OV_mzaGmVuCRRD|xpZ1!3eX5ME-!xv!I_=GTDob7Fl%hi}8KUy7} zS+{ffPA*a(Z(~H>)U>ggr4IR355SAD-+jpPS8aMVuayX`DL|nblBhBZTar6bCo|1m zQShas6+M8>WO6GILiF{*EYRWY{KLKhQJK4o$>GxQ{}6tv1zGI4!DeiWkDzR-!^D%9 zGHx#&JLHug?_=X>`?4lC-$B~$(`7Mc1NZXr{R+2*@1q5tN-~=mI zliO66L0M#K=Jrp{Bc?RMdPce)rb*?bpNd|R&B#_-6M^F#Q8vtG%K~dNl7ulm`B$zd zD<59Mp_MiZ{;aHZO*F(qXY*7e5I97Q(V4nYKrWiTS-znABcnUO{|m}L4CP&?S%Xj? zu2<_8L3zrp_c3Ag9~c8y{u)lj-bii~X4KX}hd{5T zr3Bd)0TdT)kw)>e-i^uqsA{+%^Gv)qnfdXqwju&Qa1i)GM`P7(z#oUR{&I2m<-B=} z^JcudGj`OQ>oe`VQBuOXO-!N#{+mS>4FeKrm+j5PRZlJ(<^VwGCy8E% z?Ypj%yM&7mU-sN1?YUuM&%H|9bDo0>=DBXM1^eT3D1W#WOXWM{uJb&MVqNw84mW4W zHe2I5>h+g}eA4TclwBG7u+ClPtmBNCHB#4^G|o>+uemK6VUy4s%DqQPqp_UKWuz)Y z@3SkHtSGKth`X%-Ll%4OHqQf}L4s8L{c`+29vTl!>&%<)uC&XWg3Ps;6@Vl_ur`l@ z-@~CsP)m3)>d{@T$){n=Q*w4?EX)T3{qy^*u+=?v!=v43`sHB%FRZes;QV z|0qXGmY1oFsjyOF8f)0?$lRII=e0(z-(2=@di4B(&~1H4DWsNKVA}#?1D9cJvsD~p zqq}JNE}9MRzo6_Flzj}8Jw83YI!njdF4sA?)STFCyl9P!1DS?{X!?a2GBH$<&*owR z@DC(c5Go=vnnhD2p{%&#%Dq}F>5#_zgUy(py291(KOBEU4^~AI%3_)YEf+Lq)u4@e zJ?JCFD<_@^bE|+gX6OG8Kb>8i_m6LGu9!y!;#%*lclCYm973#fghQoyJsFBbX*e8> za$Ov3@rrYsur8|5Z)Z$W{^Fu*l48VB(_eteI*%(|rV2Q0l-M{4qmoz*&nR2`x7AwR z*S|ca%wGWX@mF#d7~*=W(2UTA=+k(ENh z3$(SlUyWBntpmYVb6V6gPN+DhE}*&CmUdoP8)5jvQ<_*YtaLYN4aHq$x=u>>hEjf$ zg`2RFD;_Lj2lwq^n2;O2I=(b++<25FWPi<08}!UAR5zz{v?bu9+zqvr7v@m7blQ~> zqI1U)xuGk5SzNK(qUi-mcc_6?D$}LibQx^a*NoHRAVYp55hgm7FO0J~WU_rFN07`X zkN4UH|K1Vs7!Pki}t ziZ{ovez>>>q*KdCQUcPwbvV48_c0(=M4prHPHvRe4-U|nxFDXELDVcveRF)?zq&lr zN~%0Jb0+;H!+LZ4_VgxeU=+5Tt|2xAP1IDhKx5JR)Yx$O(^)ny0KTVU!qWqsj<*1) zOAxVAAvn^=Sau_iOUUx_*QA)bYq@F=FWYVn0_wK9_`S2BCFGE3OcA&=h0|pej_%23 zJ(*7a!Q8Kyn-H>l5ZGrH4Z$01eY>1*-rcfxfHRSn`viw1X?6sx>UXYxo@ z7`0iTr!b4@Tq2KQk>n+l4GLDS;OSpLU}V7?V|LYe6Io_hwa(D4ud>ZDWn5}Pv|Vyg zsQvn+JRH-%sb>KL%cmaEtE&@a@6<7U(gC3W@v{Qa>G5~H)6Zi>uv(fV{}YcVDeW}} zML1j2cEI$j+VO6uu}RG77VOZwthPMRSdnh3D8uc9Xn3x?L8Qg%0yMmckYRi z$8WO8XUz`Z^*aI}$%#W%FC2%ez9%P~TbfjrI8jxrS40Y1!_xy6uc38C_E=nneQ`mP zZE>bhT`1Z-`~HvI*#Ke6ubMhSX=s-;()%7Ft4R~R7Z$N%!fi?&NR3czh}ggEZfu$+ zeOOM`kwp{E&@SlU6&eDIF@5IF&~8tM*h2)AS<*(Xb;NU2ICZn`c6-QIi-|tiKK>mi(Z+2*nTpuB zgF~d5%zjvzWcE_CH(rh>*GBT8bQ*_><7}rAtPaIP3DRO@-ZV-`cYaYy_3BTIDn;*W z58xLIE>u|BqxV_Ma!9DQnUzE&!K@I1v7|A71lF>7BaoHSMxfpb^2d-;x)2;nL{uyk zBC%w3Hb%XXl;K+9ES8G^sl{0=6QEHHviKO|;c3m}#$mLT&y2%p-E8UIDDSiC+Ph>0 zc*meRjrsMLME-{Rmyk*JA$`E>j_t$VUcGwwOgZz1)OF|R9h>21@(fd zkdy0sa^3G;UG2xWB(4ZxsB=kAE&cTi4H?*TCBZG4&=^Z>g<%#EO_s&Xz;*(gA6+wn zwnv8DPHq&<;-zDPwA;v=)nrsk*;UnY=EaFm^{FHhppu6K}sGyGPwv+KcPiE^S#ou96hfGy<$dz~((RHcQgBQ~Q9$k=E& zqjoe32V?is#b#_e5a++?h!8a?K>{si?W@>B2C_&RPBV7f1q|pPZ-^J%1;HNckLfrd zI6>RbjZKgfUazu)NIBAWC0_!2V7jXok49C^u9xUr$t|k4D0N$p80V_Ir7&|YRV;*K zcTyIkzndTXr9gzZFYEpJuea-UFz2K1?j}Cg6E8SPE}e1I7gJPHBNv?hg&PJM& z?8uNuS;J;qSuT$^YG^>nig9Cd&VvFZsWo388`0XdY&coI!VOaoxN zW3O`604Hmn*Q&Bu&go=Ck}ckbk{+JXQg&KE&ZKvfU!$3P%Vh8g3BPD)vSLY~R_q1< z>8zO4e}(R;kjK2nGj`EFD~kAkZc6nbNtHveZ!ZVBJsy4F#oJrb0B40z)gllWE5KU8jl~@-)?#}Kh=3{E3g9>p+f4bm&Am}>)wwiuX@Z2;pic#+P^IWKrhI&y85qJYfUEu?QBurS zF-ih=tx)}9RcE`ZE#N?M7lBj99S)$6gV~quNii*x9x;y(%48hqFLK;HQg^R1+Svbt zLF^5ro1JggnNVvm7?{FWIeaE)HC=vEM)ULJ7xI!%E0Z~-%;N-;J(_V!G+)_tj4bWz zYO!a{B8aAEEEBQ1NToVKI+c2mi1l;ua7|JuzzKy)WjUrYD0R^hzUw^_l*+iJl27cG znlAGe%GrFGchZTq&_=9Qf64bt%~u=kP~!bBU>)wbZdaB6g1~@MeIWrx1KJt=TMENg z_4T~I+AMY^|MlIb?j~ktfNu&{l}cL2CrqQp_6eYT%{6FS1#%+bGM&;FJxr}D(DY9nCA|za`=0j*`#6;1e#2lxyBFN4~ zqYAv7%(xU;$blQ=dNaJ0Wud(x?G_pvZI-~_Fxg%OPMb+Mo%{n?L$EL>%jj&3XYg*J)d|D+m43-ZPL5z z8i28xDJ=4hGCKk3@q9y@owN0boA~z`Thrk%TCG@2vlVNyf)@4c^rC?I_n9J==jGwK zwf%U#)mCCyF#~?ObZD;yFxW7gf4X+PaCoaBGU37aS3KI<8UyX>i>ISxWf3kZ56Bi= z_78B`05Y&mfoNs4#I^ulNj~80HY=tESwW2IioDIwyQm4uVQxa+jM zu{&%u+U+pt1YxterP3j8x}@46u81N^7i8gG5%xo4p?OJeLZs%Z5N`l4`$Dv}{s(s^ zwKlR|(#tmdv*Oo;n;&{tXUC`g^S5XHo2!${YZ(oPryn8o!gbpOATt2CrP#1d!$OGRu;Q2|e4bFpZ-{`JlAO%D=i{PM8Hu9sSix@9f$ zThP{`ZeNRZd^rR{`odHM(H3qe?`|Uy@e13P?0q52vkmh53z=3I0)@G)rWSNZp9aEm z)!!`OAht=9iN!QW80C;d((7GbU7UgR>O(}{&DZQuC$T9Y83PLn7ex`}lV8cv3=+lJ z$V>w4C6;4SQNo8CuS0`86;|T=#z^bRt9(ZKn+u=LJC=3hA zi^J^!@w|o7D(Y*f*7^gI18lJ|ut}kB+U$A!2 zta%Wpui4Z?iYq}zOceTurrJmc_<^CIus5d)+KX`^OfGF@R}c9Ql*qFV4mjP&E}v0| zb8hgj)@(A>p2;psfC+*-+T7jU^WC6qjCfxlYiJw}Y~2m{dQs=K7c$Et9R|c+l9-}# z!#}g1zr^_zd2yI^YFQ$6o)o7RA;{5C^20;NgYaS>vxCj)>-lm`R*UImeb9(mLfKdS zTUOr;Bf6)Qh@E2i)T-)R%}SdMTe}eLCHexw!=Qn$qr2haUL6tg$u%Lj(XJvZCd??_0F*kt5t@Gz$x zw+3>gb~mW`-9qFusTNKp8-)nyYHJFbO%es&EJir4dpifRoMuB(XL5m*I^048tU+{r21gh)lZ}?KRXobn6?+-WoGq3!mLpD? zwheAd%w9QfODhLjL7VZ6t&(QT$Bku(CHI|uJ=8oUD$d%NE`_W~wrOI`a%Ta8nkHnM zju<;Nu?R`xV4%sS;)sRi!BK<_n*6fG^m7@e$uDx2U)ebxOu;;vZK8y^LX!DrK4uD6 zfG&5QQ}Y~B?f9LV=cbANwmBJGC{?a)kL zG$bX=cq)aKXv=C@Ps>=UnPai9vl5liwzuu^94)CA%w$ z*k+d3X`!)qr_)hApA({te-vO28&leeCDJy2Olc}+$Z|O{wU){*r48Rw zB!#8Y2ClG5Nv294xmq-ntC;1rG8+-J&l*@pMM-Ea6xR{s#x znXP}lo_7wKhd>5er5uJTvcE_kZix<3aLabW=}nj9VPg1h!NruRT>6~J<789{SAdn- z{Sqb_n(QGx=Az>=C-pFCu{`2bK;6Kv!S(~Agq9u-q*x)uoI@qXn_IK=i1ikQ3%Tof9oWjQ(`?te+pTLN`-5$HnLTiv_95joP~lRf zpal%+lTP-o-Kf+1wiV0iSw)Z|zBbCa0J>CWqF@7-l4QZC!>z&`N`N8$s?+w^^>d5e zD0|ke|E!%egFrk~aF){J<|zIfsSKpaV1yG-9>iM{PF0h-0(?>`*?1EMfhJ}?b)61} zfJHr1ggG&}hJx6+B_b6?;w=$ycUTrz;m;_A0@Z@RKYH>v0s7rmt@RM-?_pZ7-|@6p zP#|%d^613L85ghg$4wSOPhZF8|8)(zcNy->a3U%0`o;RliT~vVEyMrI_nKe)znJJ#hrNVlFzAw1%_$MkRJHt!ZM9meBG4r1j6U3vc8?K)V}C6 ze?ng=C~vIFcsl=puroY}%w#9%?oNCB#-^j!l@; zg_1G8(&*MimuCY8nozDkn1 zgq>(O>WriC(>ghII&HLR$8T?!DxH*k=erPA7SrnFl+&bWslvKMNS0zFU=vRnd}s7@M5?Lqa!8!acqku z)kWLI(ILP6M(Z02v+9Ea^MFK7i_23@kIPdi9*+`=N3knP)$fsf?HJQYw3v@%tLC+K zt${470jsL!P`@*G$5@u1y~ERKn?@!6nI~M<`c+~^?gApa*HKqH@~G-V#9SXkxOba=ZP$pqogR%mK;uy_t>$9t4D?Xxwt{RB6wy}^b%hJ+ zcph`cTkCjShe8Eqj4dC$inrGC6qcdqNy1|eBq_nEHF58R`607JpV=a-ABLTv z<3;UZ&}oNG=yu1>s5NSi#!hS4cEYgfbw|GQ6#1W<+r$ zsx0aWmBn6~62Xzdns%knsGItXOyP9GnJHJk?ulw48B}KOy(*Ok_@|rs#B(mXC7PL^+Np z*~Gb+vWl3>D$6nfcI6AwnX@)=~e9`1pjA`cP9UH0$+{)A2=ZY3)-zO^1r9}p#0At`^})!ae}bZ z9kj=T$Zd|pt`~)!R;M*~I)iT4891FMkpHzx$^Sr{r$l@Q2^=6P$j9X4iXOxq@>ViA zATRrDI{f$9Gj2PnSUK9P8$}5o*S#X+x@%^DAi#@0hIfmp9!H-UHZrpM?_H4!fP`x` zv^3omQhookmH(9x zx?#BX7Rk3_bUjo47kobQKPmKUGy>0UHk%`V{AuNXZQsE>Nc78Q#At+^DIBwm-A`#X zOew32yZ-y)yoWKr&yUY~W+2-7-fFg3(g&2AVYOrDM)o&d(Ps?DS%?2IdWP3Ol9Vr0 zi7Pp7s}upb+~OThhyO8Bd&Ntkwc%REXrk#VD%WpDms;DJ{6l!**i^K!f|hq(5uuz@ zB$H_cq*Ry7N?K^b2(eCbOk(rVNi&Hpk5BZPP!^wfj}oCQoU@8ib_RGGlu|p!1-3U` z%NkL6tjg@wz$?u}Y#YSN!>d%Z`ojB{|4{zlxAFgPS5ciZF~fBo)`lL~b?(YpXUn(R z9slpOytc{zxBV~t|C4+e{~vfwHyX6tV}IOq!l5^6wu4T)HTL~st2ye7ykXmky2Hok z|J$Ybe~P38krdf_@Y>->%B3PKBN2i00AK}BInx6}O6MxbNCZqDWv9&sfB=F(cpT1L zO8k^Ry=OHNt%nhvYlsQ2l*_|p#wq7Bk%>#@cd88V(!j&aV(ug^!U zyVBXS226IuW?Q*K$0hVJ(}v5yAj8e`dBX$9w-wK_V$AXh^Db?{ME^#7Qnm8$G5e0( zyZ8BU?~-M2G(yh_yRO&y#EF*NfH}1XZi@O8GJPBF`jgSeA~wn29Fk*npJP6Y+RaqK z!Ei>=muKoT@D>9sn*!(KtE=O`_ODO=ySJ~ieWH~PYJ zmLUMMUdQqnXmg!2vRDD3_-%hj)uD+CR|JyErl`$){jn==mR{o&R*# zLb6k4qfw{JBh3N-QOXHC=lu8mrsDq{xRC#oR`_!MKg9>n|7Odl=lgi%HN#PpvH=5n z_6N;TyWJg8PM}SfWk?BFD|r0#zf=1BXGlu8A(5H5lgaxC-Nf(Kx0T9Ow3vn>*Jmr>b7qLQs+kw=#s1LX-yaf?Gklu~tD3v)ll|TL|PH4?tXSM>1t>U!+1=AIkqV zL8L=>$@@CJA=de&7!+7BIe*wKIwGIByZ+Y$){_iP1EdEd6 zjard6aGcO|ZS&abNAT>-hs;|?Iz z_$Z=8Z+?%RF^w}liozKPP*DB@BbY&5OgInfU&RY!f$7+>^9nnr8l=a^3BhPULWAaj z^D);illiZ49r}JP2hIciz~oj7%FouAih4F*Lmqat=d;LkG8MDPAWmk(>1GrmXTsB>!a^# z7WljfurGZ$fme)E(cV!GMzxR^XaV+T8{Z?+e2TxHPFCywE#&@!U)C3}h5D&)R|EbI zlT`+otFl?^BuA|}3&hpe%W#q2IKF+ioNw~VEGYXnjF!Aq)iyh}7tIoPn>AfU@pjdp z&WG>ONn){_ufcdjugN4(8gHopo*Xjhi^e}P>)F*TT&!+^(-^65ldFmU@{E<}_}=WK zLUPlAAYt=x)E|cw>qkc}PZYqPGQVr}F;k<#BWCkB#!N?jV2{{O1uS&0FW5H0pVB;h zL22O6&M&0j52r{q_Ro7auX{iCk55m&KR*!u87N5f+vr6Sc#u6hiNr{mRR=Hco(k(c2+eSmSp#zc0|zDUx4(G|3K#xHH)@%NwEVAQ@NW{qkCdOFBB{W zvoysw-y#*4zt9baZctFIa;N;jaTx?%pT)&RX}t=+ez;y!P%Va&{$ku;MXI%D4CF)g zuNr|~ATiK#F72Gb-DWYakpUfz6u!c0X7%{%7Cla<(Xy847QTPAbf3Dihvt($JAU_5 zRyDSw*49?m78%*9+I;0}exRFEjfW$C0mv{TXS~!>eVsNmeMq#1k`PxQ1OpLeI+oFD zh1j#|BL?zf^ktNMr&U@HMGfnjXFa0_nXmZ?I2?DnL*MO;8;$YUX@{d`w`D&8t&Qjh zp|uEZ1`mT9!50hnu5Bq0y8%P@PrT((dUSen{^$Oyv)BC}ddH_XKlHD9mlszzy{rCB z@A{^OX8CHVtK%DRptz}Fx@O?cMw`0@vu{t7yQbxA&(C{5S)ae|oz~E>UVTG<^j;lb zy)M$LENkgmzO(c$-|-Qk1_t}SzfSMYb?|nWVud}InJhGpHETX z{&+JR0#DVSP5G;z#XJ!q-@H9%n5?*BTEJg_B-M!|E zXeKNZ!XbUSB4dybz~6A$BzW5-;h3I#l`4_V#E0Pl+AcK6^=5cWrt^37HaaB($}Uf6 zZB&Dym4I9X5c2_!X+)!WGO#^XN*@R`HMyF8APizDFJ-~%)VME4*zBn?Q`le-Ap z|0YI)4ZD zVX{+Do2QKI{NiS-(IrN<^}s45-VuGgu2cwJD*|gZLn#d8;)X>e?=~Sz6CKf~_po7j z%wc-$Vz>|3E>bSj5J9*YixWU%srbS~Nl?u2&M*OX^7<)DuwbvfzaT-m{_ELy7pML2 zFHiTC1{m?sS^JI2$SVzEWI_;~%PY_*8nVpX^n{f#tbZ%sGvfz-hm4d0@JI>FsQ1^W zFr~M&;cY|#CfpFhg>viTPgsTl9HEwVyWdwJXu0?( z486K;0B+`vjkzlN3s}H-P|#S7ur)y(=-{QOF3C`FIkAvfK_ zyxr}~nXn87_)z#CR_!B-??RPo;{F895ANB;Ci{xUwrtiVO^cJ6e=%e(t$6*X_s`r);ezCmZDD%j979OjJ`x2Kk&Ucqc%N*Wm;( zvE_dBk&bDVci$}n%9P>hizYE5d1Y2dTox%5oXg!!Q@lAG9x`l<_dWjoa|W0C3tu|m zQ}yA~YYcE{FcSK*NK5F#nkxoiNVkVa1Rm=9Nz`HjF4mxI;pO(rz)({PA~@#7ByscTKOUd%1eY?2pJ?)3 zG~=?lL-@DAKFFtyi5SPphLUHjO@fqr+FF(oSAw~YE0QR2h8dzsyBuDK*KM*-l zNAhkuAB0nELySQ07_Jvm|ADOPXtG*v7RbTUQ32yxhYQ@Q0j+!!8w(|%aM7oi&Oh%J zfUj1vX{4c+NCY?MWz+{C=zK74YN3PCLd)|4tM~oEW;`Z`tM`L+Qb01fiprE=`)W;Yj?CyDpg@1I zUjFR19YOUIGn-H7d7dOAb0Dz@ad1x>l%@p|z_!KX4p8~`u+xDMIS)mxr15DCfg zWI9a@;BNI!$)cWpHA$AR;FnU?s_vn1VQd6UXQCEI#aZA6_nFw!_s6KzYCLDYL^ z*WZKtN}R_*-QpX{q0z}sBi5r3e8f?mP|!?EfgQkR8HsMhW4PI1%`8E_q-Ojso7p^l zB>)l4Myzp|lOjc7p_z=TM@q#Z@H8=J@UD4Z2s^!;aDNiMH4Yn@TuTM2=Cf#`d$r|BKg)kT~?7k`)`(y%8>VIG%aKw8b%SqoG>euDJf zv6YwSW^vpU0W%qX@@E1~m(gN+&t@gK*;44Vxm#EeDn6R`v`djV1K~0^z(a62D2i7( zR#a%svJUYAG8{m#w|6Vf_emkcbPf^Ag@qN097Z2Sz)BsnlCm_(OjY+N8I;mppoP&$ zrG}gcN+hvR!&tccm8p5q4qPz(TTf;iehji2pb&`uzHcQSWJQOJkLVImTzbzvL)qC% z*M50lURszGX2&$Nh!7ix4Uqm5TOsjyk3Oqb**!>|=^noZJ!mf$-HkEL@7=I+-|Ykb zP?~tq&=@^g5?;@yx9|^aA=s>DTc>CJH~lk8g-&dhl})^7Y~xb$QRU{niIIT6!WExy z)+#__fd5`f6pM&+q+W8&4rzO|uOqp2(rzMvd&>5N!(#MN;l>bcr_s#Ni5YZgHAue_ zq~8Q$Ax%h zIX^w_UtXM^y!vbZ>iGQo-ab5d+fk{HYPg2~BG;?x(aubI}vKOW!!63EPA)KC^ zo!nd-L-_9G=FLg(^fkQ;7)`R`{U47{PhMku9AJ39`Q}gTL%{L`{(i|m6fg8nncd3i z@sAg8uMje%fp)E|_qT3~{9dzH0_&?wVSQD;>UBm{iV0~|DZ_Sib#Z!1VO_Giv;iwT zR?QyFQmYkY)uM}Bu8y?&N>-!nbN~A0>g4?U)Y_)$SlLDlO<5{bzxn1{_93p@aXM}@ z^gF)WXfz(=x+Bv9BsVy6%_|7Bj3O~*lh0*>2^PxU_ZhutJG#WKbaQm~Hkb_QCHcO0 ze%e2NeRgu*zwBL|;nr>#lBSnwk|rpPu*RdP0T;uRd*S!YG<2^4_X+)swq7}S0Ej?$ zzhUGS^NM33Rv~}js-TYiCK%?_`BkOu>mWjQXcGNO8ADJqK-95cC)4O1{hOIRq1EH> z02Bt}Bs{LaV~~KiJmq>M7U4DB`i#z@6)(l)S2yH0+q>6q&o22P((Pa_jE)z(7h4ar zK8rk_=^4V}ruEn8MbU@fAW5XWD_Ej2h$@G^>NR4q;sYZ|h2unv6v=u$#}>J%&mJ5p z{n(B$?m~L@AjgneOk*UoTjbtAmO}ljS8tVqqs3%FK>LhLh|+%-kPGj#ri&T z9VLJ|9s`hY!7DT0oL+ToE-=i*W+_ld>_o(=?4tVqF3@&NH+U);O2d+Cpb{_v*1$vi zwoa?vt~Jg0QZYfp4i>lfEA|T<{4G|1HeVxM5r?XbZw}F(HmMHcj76QiVn4)6iUPtC zcke$XYr=o9r?MdwFdT7<-1=$}4Z*(_vMNPOv}~S?AZ^+hjGO0U)Z{1nNEt(H8-T96 zJaybieNX#tuqMD{nOOwW^OCYj_w4OtMlWFzCAhk&@IFMG z8bt|oD!H7A(VCk3Vynxc%GjmP-Y@gB4nX6$UQ5P*0S}hwjvi@B%ojYFR+IS*d~k}# ze9`*Ij{g!g15b(n;{BWBxo!7L{Ff*BVEmVX6Z+0LaNJ?o9JRV*e>iG)LT4~;jYe+J zcE{~7qJKtt@n13{jPSsJx0@RAT@m=jp-mn6%_9c_|GAlgUnFuW5+fBkE0vQOnJ-6_ zQ!*mB%xB}tyA7l>n@-6rih$2rtwD}WrxT)Z8T4sL)oGP<2N8<;=c)q0-z%~g9;lri{ZghW%Mfqlc7Lukhcq3Nv)19jWxAf z7RcO0Mv7Y{4@e1)hx9sx(WgzgpGf49y#oLB&2Sop;2bEtOILib zJUaB?UKvtl4p#|gN*v>o3I~=$nv5VQCY{y}JPNx~|BK{DDZE;!nmf(|wZ()&)Qs1(eDM<$h$ueiU zIb_&n+dLphTDTmmP*I%$4+$jf2|>IFe`#t=Ssr8|5lTcN#khh&7N1(6%IctGoDBx! z^c-^Vq}{Vw@EI(%(kwDCy)iuPYY}e5IQdU-enXVFInbMW#IHPXd02dO}rZXALvk}low8~DitO4T5r;Lx~Rm&J&Vt}eZfDuN-FBbI&4#qy}P4;!i zWs(Lk{d83#;y|m4SC0j7iKKPbLCVy0(3HMsUXtfVm7gcS#QrKJp<0oyU|KIKj5Fqf zt|}6Q(ghfyz)uj&?`w4tR_(J`m~eKCR9(N79VwxduNzU^nTYPrM5OnPYSoZ_MsDl% zL<)L6>E*J#p7fG7uP37|)$1u)S@U|*jWaT!p}0qpGVW0%-93uoK@&ruxPI5Ixy_6q zC?)YA;m1@Yj2%CyEK(el%}wX?_nSp=v7k-nk!c5)c2M#|5J+8Vic*xIs7WiCNI0EH z7Aa~J8_Pr3uO9S8NvA)29#H_TQ; zs&E_Z!$sFmIiLhNx4KKGHlS55cDSLXQn}-;;34+qRQlXc zrDCwv50wY(q6Ed{T-d|+7n{A4LgKexDtaLQ_FKwc!>x#SL8b ztxLPjlJG-pr@j#7&Lstl^G>F{%;V*)ZYTKVfcex1jCmbieGU<&QqC$_i~X6nO<_=) zIH+<;cma&Sz%kMyw1>x>+A19MYw}O-L7OrD7pn zQmf{Nbg@<~9@53Eo*&Z1UL!B0OIoe0kS^9bg`=@pYnKh_Vq#yxkS_Jd3F(p=V8*^+ z##D9?52n-Zps%_UwDh3d+r)#(41z*R20*TDkb*7E@`vXQ+hc^9-S@?G#8fLuWy#jc5i5w^Md<*lk%?rypKHBv zfnVB73Ekh5EL(O+RI3QKE#tcraR>@B6enOAVP1*@or9NMvbxQn z#*BU*4&Tf$cxH=8y3=F-XiiR)(YcP+dKiZJOyfj~L;>1EZ_t=sL1|%Tc%U7+S}}gF zkd$2A(l6Rc}Nzs1K`R*RDQvt2^~)0dE6JN`JX z*UpUp6%N<*?q0{GdzAQJPOI&x@xOeC|J7`IU*dl~#Rubmb-Uf68+1Y^bh}|IYz@1u z(O}pdv|4V{>oi9lXXtfCQFjONzkY%UIxX^l!x@DCa*5kIa{Qyf-zxkU!%Y?{MTD>7 zA)4s@1`@{bFjuVfidSfm9#=_#yD6iPEUHljMe&Pp7_qQcf|7`!RVZT`hl=vV!aEVF(L`ZZg&fa2_n8N0WJ42J~{&NxvJFz8#R% z+d*o)h;0Hf7PD~I2KSA<9vy~Y%j<0KgWEOCz5>s*o(pZQ3E69M04#gccn5+vn8 z@|eO7E4|m{?t2WIKeH>IfNE~I?zB~&%yzuar4A3a(saOYK{UNo-yiJ2UU!!W7%%t#I{5;<|99m5KOBwfVCqs| z&lL#(s{|HH^>dZSS{jE3!Y+xO{3 zY#dR%qX;J$-tQcIwMJW;PNIAgs4mk;kE8?T52bMRuTu z_zu`rI_k(vpUAlM}lzY#yk6hYMS zQz2d=?y_fwU2c&bM_rauh(^O71;c3Ib)DTrU1lL@=$9p8v;OFVBAkdr9cl5Gl@eP-Zmt&b5=o0)DvwjNrC`$zT5R4y$0F$XUl6&pn(RKl z^%k=_m60Y2#Eyaqr<;Q%SL#9LU}W3Sr4P91%G+(DF$nyq>ko$y3^Uhtn(Ut2%nY-I zOShfhOjg9GL=QaHzd%wE0!zn6?i`dGFiNcz8)_tDHWi9jg@|ZxF^*uB8pNqYK%XumcCBKI$ULSm;y$M=>vNBqrGf89=*DJdz4w=_4V=5AIRF_%g6jU zuGfw2Kg1okF82cZSW|jc=l9ZWOhB^bKW?+_`HK7}0QnDP^S;P`p5lY@pYdqebwS|M z9X6wY{_OhW_NX0p+TO?;wVJJwJ947-cn9_$Z=S>WSZWi`2*K&mdD>*|?czUViW zc=i}p9;8i*q_+ZVkX$nl7hECp(_2~0JY3Vxqehy$7PCm%N~7U4yMt)d3U`y-s)fnD z;mamwk$3~llf^*8^rV87?k}UizfgSTwn&sjc9AFvr`Kjuq_&r9)>1zG5h@9$>9=W&nhL-lQtDjXVmgBu6fG`$zT%N^n$ax?XzSB{YAJ8?-1x_st_Kt8Tioa zANp@E(Hs2Y$KKUXS0`vvasB7L?@n&^-2=<0K%Y0CCDRJU`<p0C(39hkK``eTAHy0QMK!!8L;E43E@n#@*9*0D3%rJBK9g*r;MQ6LOvc#AIk*YE*M)XE^oAF4V{wXV>3fpZs@EbtqOJCNvJ4b)T~RqiLim z8S+y_JT%WmW~ztuR1T@#yt#;hB6BvRO@OXkgSJMyU_06#T2b&*8Sy`!19xN#tC-b$ zdU^%=GDSh6g$b!tjaHA8ibDu(F}2n$7jIBZKR4*0%pLkTAqP!@VRxlYBi6}y5?`e( zv%ZhiSfOBQhS*YS zMw?K`a7rAC8p;?%L{E%4N}>HHzDf}GC2i~TDk7^4{#Kx{S0bxSGRo&RJ3BMAjJdmu zTp@)}~G&v5&RI+jgb$X4f>vrB)i75@3lHQX3Q5TG9(mJTZBVFkD0ln|g@%_PQNQsW)cRSrt%WIFlVd#va$F%=%9=Yxjc&F#s|9@_3;FN)})<nc-vx9tBviLEg-lB>EUatOK46o0FT64l-O0<{wclSV1*OgWNy~ z{0)&$rz0rIB)X#p%NfMI1UMKL^VMoHm`o?@dpfB~xTcKUEgc>GM+_Cc1L7H|0i17@ zFwPBfN{QbRpbhO~cta3v3lOnEaq0411nT9<>W(lM20c#0B3!LVSQ*ltNOAEQ#gfH* z27w;nBzz`h<~&g7J^a@F9@xlXJ`5_4pqd9mzakMB!1p0vH{U80gTbbo?-(u+JJ7{T z1$?97v<5AA=#JXE(ZxHpF6iQ&n(O8%;~yMw!O-Vh5<)X95k3-DZKa~`Pa64a{Fr_ob$8)<*F{SeZwY(%(%d3<~*YXN&GY4kwa5%gOub>$ltGe)f1+;FVyaPS7 z8}PiOK`W49;6HcIi3bN!%tdW$)L_2c);Z@WYIHzIypi#Qg;+tkN-+}vc?=jJK#TYE zF%|{|7i{D~!+206`pM@NtYya*3DOLq(HMloZZPzR?(QuTnyoHV%Xhhow~StXck1@E zS~hiinrfatJ$come_!7eROYi9CEI7ZHnc_Xy+Y+-3ZI|BfV2{5H0YJX4aR{JKG>pEkaOF&sv+2B{UupnI_%na7|;(}P?^Jg0-{CJ0$% z@4@6z)2k9GPaw_Uhv7 z^5VRAek0Gwyq?m>nW=D2Nk5Th*TV0JdB|1Fd?hF6NeYH#7+oZky|@XZyT$rmRZJ)s z0S#)-gHRL+d_g?T(r@u;)`)$?nwBeF)1(ps9J;Zs1>cqAZmLGMxrAP~6heJghEg79 z_*r{a;XV=PHA6Cxso4;;ulu@_>~@9^mdex|2$vBgQn0+vo9%fLaS zA{urUwW2BJOH71)9J6k1IYF(JqlA)U+_ia}dST9?o@I>TG7G1XP)pT9HgGET*4UT# zFMX_YLjhCR!H92;VW55*A%whbjumO#76Z!DD6=;Dq;Z?wy3LqU;`Gr@i3AAMw8E@N z!W7PWi0DJLQxNZ9n{%cp<5Fb*#U^dJyDu(U%82v}kF!G_$1ti%tdNC!*52hI?ZY{r zigozg8ce5JY^3r%%{D&(y8%D=cRZf704M1@LLvSjZDmWE+?HV$x=stl@?DV2w^dNd z(LGS`8)LkdV2W&=iGvhMFtrD{igEw;Ax&@^tzbN7sZ>-%HSA(A>>|E(J-557%t{YU zm1L=IPn8r0WBsZCW&I?nmAbCuGx&P#TCgJk?=rQLrY(qbND3vlJ&B6hN?L{`RfBNE zL*5yQBY8ipydft!LZvd)&=l0MvH@!Wg@trBgrfFl77nJU_Qo1K?9LxriLxzIQmLBk zbVjZ~AyTlL#+#)SHo}$$(9Xp(A|+vAEoe&QUJ{F#)ym;2$^Yz@zwtJW)9zR^=*ebz zBE2-)`)EO#lOr|K;>BxRG+?fR%Zvf~v}(DmXxquzKM>4GQm(CV$)(V9H!702QcDq& z=B&KFrLx{ZDqVKqcwKhjPzDmun=MkR?M$P|Y-~%#RWEv!Z_k3oHML}D4@`LZ6mgXt z*LUl8(~m1iW&EywJQ~$6=gak~eikkk6eH@8=y+X!HJ^5YWr4D}YB@99H@;|xl zwqgJ2x4bX$pP%G|_Mg$P6LsB@?>WQHa5x-v!cnu^YWX9Nes^3a3Y%dx9PA?h6UP7X zx^V(1r*jlEkDP8={2#>4BSMk$h*0b#h@FIEC#KNr3B2g~mzSqk{nPKzN~HfCy-HvH@K^8(I6fsu#5oXZ z00^#(_*O52rw|vXUiyR89**JAN(Pp*>y8M&q5uRs?Vr3R&c~+XewSY4w0BO+cnPM7DuBK5ei@_+S(?paXZD8gW}S(y??N;T@Co5VZUz$-v$qCu3&5J)m0r;5oowl<*aG9o-6R77`rG#xd_#cX;HvFf8=L)rvV;k9B?s!#K$ zi@Z5T5zZ~B5#M3Cxf63+eVAaQ*YolEL%56xrFQeBm>|r{K1mq%ui^}T>yB63_4H{U0sxe5SOJhS|MW@os|ibVGW%LCG~atGY%Sh+blaX@ zlIz}0JP$J1z~tyuH}q~wTb_>7wz`X?~ z%o~B_QVf^(*p5~bk#D|$G4f^6;d}K{9()z>b|iGsgioQw49!r=Z|?P8|Mf-x{Nkqn zeeb+?1sr$pM{W(1ELy6}^~w47r*YBWEr_q|X=SUz#VC_XmH?03e01-52f9_4_0YnB z6*#q+S|bI};*uOg=f8Vb7lH)yCfVK9s2g{Iwym=F__?)Oq?eBDg^W`4{%0>pajIa+ zD7EPC>~c)E-er#;(UhefZRpmyoNnHI^LDnNUwrZ9@l47d&sYODn>>_RriB#=XZP`b zr`QDRz7ZZCu;W5k!{{|8=}0YkOFx0%6Q~CM?p8u{nL~J#5hV~93>1#3F4?B1~_~D z`oCgwj4p`i>-cvp3;dhX4rk?9+Nkv;+A67YncKdXniDB`+lR8B>bfuQ_>IP>={xRV z)EYnKb>DToE=%oUg?l>M*aC%SQy|nUp#}5yAUM6Y)pNP zwo);tB=7u)T=h~&`Jg+$%2|{~Wt16=qSa){Z=7m!GPsk0o9~QWL7*{gmKnCCFhM9io&ynL`a_VA%)p6k0tAJ%HVt|7Z`snVh*sbjNS`jdVNfw=E3VQh z%flySzy_aXfJTZ|$CIT}kWV^w@I_YD7?2_fu#8^aB}{l0OPheoavFrc8EvKu!pIH= zW#Zu_po~J~u`NhbDX9A-;>jaRu0=dNoJL2ZL+U&f(wLaY$@vLmaOlucloheT!#h;{ z(&tM3l0#H#!WdmAb&P^wYXiK#os45iKn&gea14JBBEWg2kAsrK6P?PjIhk~v9Uc}E ze$_jE{a2Kj;V%p2W+k%U_O7ljuB?=FI%It(R`2u`uFw1fG6JyQ@8DV}f^@**0(%Fn z1&01W&(b$|vdI@b!pUH>gxCU;F)ah&3zzq0!6}9*!0C0QfK8oEoGe_M%bTCbZMZ^P zuxSK7v1@j3c-7#R0$lXXW1f{98|ze#tZhZYTUcy{OxXHa__sM~be44?qNU>!faCOt zo4*Y=%O!9yVnea<{fPLALgf#@&TvL#zT}(;oYs`LDLENsoH!#+fZbMdN|V_HjCi9y zA2oLL_EBaemVe7hnIjc5bK;5FHf8MhW!ae0A-(_I+c$5HPcQnxUjoPZ-m(XiMLU1- ziWYTSe{osaD`;4Y;J-!4$Rzm^>w>U^>$p|Fp}nIjy&f zunjIv7YxVGZMEWV^;*hs68&Tz4T9&jQj zcd7V&F5*AY@d#sop3PRh5^vy7K;+?32H-)shr6QA@nB)#4O5QHMRZ z)llG`tfsuQ)iswU*??KX)=Io;iR$u|S?_m~vNBWR`G*-7=x7W&6TFBU5?Y&M$p*QA zi}HubisB)?f6;wG*H;>s3w=3D*p6}*Y-m56&7od;!)3W8W%L&QQ@e*KR@T@Dmuc~f zZhTYHbl~DNFMGw)?A!Uk?DwPbhyERKND8k+nK+%9C<_$cWFA`sF1*U*qS zZ!@}HZ3asB*PB88ZdXH)O)JN~7)1fi%$2s;)m)gYHp^ZU51kC}K zI1p8klV+{tt`s3=Jd_PPdAC=vTXdEEq(kz;zN9*nL|vHP_u-M z0>|@6){oyMYJ&TSHevJ~(P5BmP56|XiPq{HYnd(kG>QkJ#v%BuTD--5{oi>X6~1elZLC|WP;JPrLgqt6*<19 zbgJOW{&u zX)rF-zl-jMi~Ig~IlnWernID3-kiO84VE`&^VwuQ$KY)A$a)W^<&$9`0e7J9<=PIGX0SD9*stKI2ersr~SmHA9MiB^aFkbo?-d%;Ny<$ z=&Vz%LSE%rg(MJmJG+o9%a9U?o?)%=N?L39sU`BPHHNihn~6sjYmMP!Y1xNGwd}+G zl54Q9A}|Qyx4|+78?>+GYAwAEx)wppu&*haG#iu}FiKqJbB7qUjDzWet_l+zyj#-M z6&64%71K%%RU3#LbZpF@X|Ik`DJtX!ponWIe(e*V1gmk;v)K|25c-DDOn?-pcO`A zXB>8&K{)hw!T;ZG=po{W#6J#kJ4aso$lr$lXV^&qJBh$fllA}Z)s4+ob}fnzSQ|sy z#)<%IhsWm+^A%WqR^rnZJEYVav@*OdOG~qcN5k9A?EMPt7Vg52le^6wasT|?V_zIx z3caEi2Ppf=e8k0dq0#7c2cFw?olj{r&U2)HdZTeb&3bWs-r{DEX)a!H3qTVO+y<%F z3JL*ntpJH}N(pwY2vS_g?*_wlE!k+|QQ}@f>pjlB0tZy&UI8OOO$Wrz;ytW4;Z!x~ zgjZnaIk<;J48m$tSVmz%u@Hs5pxFpz&x#GIn__$jBb_fy11A9M#bv*Db$kt4wUhqI z+41*1i|IHo`1<(fxPNnXe183=cZEjda7}@IK}3)H$8iMuTFc%SIlbh zn)ceVmtrz>2;B4bI$Xg$t2oO{KXrMU=@fgoRt*hU?_YNt<0^ zB+Yh^uz#Zh@~8zD3)t}7*R{u^7D$f=;gTSY@>dZ$-Va&kk2zMx zc0PnF5`Bz@o3&!NJ6_%OSqvq#sAQ*5$+^sVkOG)WGu12>cQJFK1?&Xp-f)Sw+}hqy ztU6a49Km=qo!;YsnZ*lity%PO4a%d##KzjQVkkqZ{^jx24I(#1LeGMPyx8gSH7k~0 zgl#2A|8Ux4SWhR^TQ2F?>U22w!nJ=1F$BOY^205fPOrHsG6q`68Y*rUwpY*lZ?8oc zr+|AY0IQ){Hg-4SjQc#siDR z3q!}ZP+ZMWtSB{Ces6!dl9V)<7RflLHEZmoLqwFi(9R)f>u- z=zJ1JW@YBIrYrxScOW(^ebb^$OcBmn***!`?Nj_WtM{1x498A)5Do?{x7&)Eo_zwD3b_F4L0FO$|4lp z@fc?nEy8i7aw7Azi{fzgi`C#vtvUmbS$fSv61zdS_W1^Hx8b@`dAo|zGDCbLLR}vK z?U%=ap0XTsxQhVyLl#y}jMoUryjWprOv+AaJ_N{P$>ixN@%Tn6XW{z@CCQlG+$Yt7 z^>9u@o;{tebG1aZTV5@IH0c%6Xf!g*$LIhZ{zlsErbR5y+R5r09O3C|-^pROI@o`a zanoD#LXMlXV7e_cd3)FG>LPf0n}Q%35&XShKd2C%G2ss6GE6>R7-%XGwh-;hWiBRL z7sa`Nzti>FUf_2e$l2QVT2AN&Zg>) zq9CuIjKINvJc*V^I@*-~OwM^EW5-zJYwotBb4N!CqBxnuw0`it-nn zgDZL!IeN*q?VM4ha5(Lcr<4tTAKkC$!~dz&`OQv$4IWVtuaZ}bX1~(rtA&fwcD2Is zqU(dS%&PyxPiGhB2c*gd-oO2DH=h-#cJo8;>g@P5t_VwU7fzw71%Q{YP7d~B04|0T zTCg-aa_UhG30Pr~K6pTR<&N)m8VxUKjRwu2vxTmSH(4AJc?Cejjt4AzN2ZumSac|* z<`@=?I_eo-n9p&A$RU0uUh-8Shx`XzptJ%KHR90u$u4j~F`(rkh9`sqTB?z|@MB-T zL9xa71NWtv%=&0>6s=Y~FAd8|6VzNcedhF1#^Bk<6dNENrl;h99mUQWzSnTLG3pX^#G$FI9Q0fvJ8-zsooH%MK=g((ltj{kx`u0j2D{Py%_&-oZQ zkf2D(K*w<(;KtG=|{j!Bgy8Zh=rty#`M(#0|p4xDT=*zL>ApX<*+1 zy0SS2Vm0kqHKpVcZ&mG+ZQc5}kTvTd7Lz4kDz#vm&;{T2tZ89uOHZ}FQNI2yeJCoy zdsc(3V8>;9q}#=F{>c__Gc&PHPRqc`BPlhFVQS1UV;z%wLV*?R)D+;#T@1xpLK&@( z@Lhw4EIwew+H(Rtr#z?SDM{Mw&{SrhNy%zF`EQ)|WDzdIyA_B$Hv@WoxmBQ-1k+*} z6$cf`K~7Q_IrCAG0j$XZ*7kP_FlCrAxMX!>sHO1p0f?A~bGbMs8eoTDvW4wf!lKqk ztgv7ShtZ%t3ZrhLG4hAaQOE0aw`2*+*dOrGw>EGofby3sH$_Pp3Z{ zYC9|g<5k{3dQZH14_J35}H7h={Q{1vAAx}_6hHZ1-5 zVue}06o7r0FW>)t6K$eCe{lHW?}-&MF%##V#ZZV}FWBM_=bPC&b={SD(QBMKM|*j> zeyg9IUlfp~?uHn1gbq@64f?WNWVE|A^L-=psI8Qf<7Y)#SSRi;!c#e>bjF<`=X6BB z=t20$?%Qm2x)^_3zP)vLD;AAeykbI3u8mXCVY43R@LHui#b0r_l&~ zFBnE%;3Jdr4JH2H%r?_$Ne)Eo7>-k?=75wGgyjGEpOxx2-=qslzq@{2_v^2wA!L-g zxRQcXu;_U;U)(Pz?{3#*e|W$&IOji}ygoUmZPlXAufMQ)!RY5UD*;adWbzMW5jL~MEH`P~I51`V6I#M~K_=u+Bz{X7Uj#9kRI9>Z zOZ1u2AY^3b>-F=5AqU)5#Y1}WMnq|_h-)u3$VkgBk|++?#?7ll8J1a9v$oPGeG<0F z*4h_U%`2N+A@g`qCa*9(^=}Oh5jkUapqb3H;GSWzD1~CnWuT7{X@<8{Q@S=x`BVua zw1W0V+BM%a)gj7xtBDSE7^jbn+pt;2Chrm0wvlF9d2KAAg>g}G1CJq{cCiJFyV9d4 zj>G8+mnS0yF?JI-V3te<-dQK;h?e%a3?WHl-Ni4ZWI39nZVoNpp`G?A+<)8>!&4MK z$vvCi7Ta$s)Rd}>oMf-GR#o6oy?1i{!%d9N^$u^827y*caglZiG1&SCd1AN6oXSijDL|*lsS0dzc1|K2MqfPrw@;w zC>|-HNM%hCKlO!8!ovwWo~oh(3xk?Y>(#)3lA=CW9mt-m;cz*?p2xA{pYx#S&v|rP zQ9_H-{al%zEMeQ?5`khH3(I3=13rIF>^qZAUJdrore#y$rBItyd{T-fK*U#9VNW}dnKEy_ zS;x~sTDr|}GYPLwP8eWlw?`6wn^_tJ#fmY8CPm=0I~hR+E3J|sq8jliVr)ZZEk~b6 z8&!TvSx;b<6dDE}g}I`@==}u^2d@8m_T9zler6wrze*YiDbDxl&AJ@bPM3`(h;~ZR z#ObvYMmG)=o5|?b*qQi9{H`3~!*IcJrX}$q`#>H~KE`eh1-S@%@*@}(W`Qq*ekA@=(FkaaWR@|2ald(JJr~T{R4PaUS z?3xb#;`KfQDWxrM=3tjT6M4^6 z*7N!E3X282e<-}s5<4f=bNIL4cx460EcMNur?G`4_8VjTzKS8ery-`e*m9OoK}jZx z)um(#FIGre0Rqz<>Y{QBTLl|7RbPhG)6z-yZZAl2ZP!SJMzJqN{)}JKXuOW~!{Eos zWzaecB+G&+h|^}Ih^Y!pGMbXP@p{FjPMR5ZwZ{`X~599>LlI7witaHmCtLDDx_ zp%<(|_vA%Q4)jl{?Fc+oyVQU|o01(!{AIV8hZE5hDry87i9N96N_K#K$6(3dMz0=F` z?g?o2(U2u!OWY_Ge3w|R3(-e0#XD?`k@-^H5) zMT4+PbWgC`-JXrKs$@{bcjP(5egTW)SR|z)bfs#PNt#0!+;t^11SZRqDREJ@R-U*; z_9^yYzDb@!QkiWgSYp^EC#d6t`}Z)N)b9D4K@%`{_GVA!p|5pm;1Ahnp!9 zk-fn(3g5>>?vKowDHr-bHjgH7nY~U&WNYM8eO1+^{^pQe^X#$|&2GcRBAPL;qCE=y z>H2m#-@LnhQKU0=@E+|7jFvMua|n7M)&~uPhk=b_z~=J;{|cM{KeN>{D8;ZFb%1Q3Vplv2BDnRmBxdUZII8VmZYVn6;My zxYh1G1?-IN&;%kDOLl+^+OY`J*;EVl7${1q7dAWfl*I!tMH3|O=p|ClhTK3IS4vpJ zhQh8Uiz+X%u(CVS?1J&7QkddjT2cC{mhelot#b(%yK=fltHSO5RQ|Bz(q8z;vT%J7STG#~ z+2^EXFEamV%87$F;eFC)A;Si|jAb`Z>ZWCLD_}iXd7#N)oPaIOQmm-aU=A2dxeo7@ zplW+LH0`q>Q)yewf?T%k#bk!LrkQ`xUA!$!VsqEj{cQI`DehPPM2PqR?0Ycq^1xLX zR7Jt`=C~RRJGGwhRX~%bO&tISR`e!HS7grDjxKq4%|N8BBtX`LX3e|f< z@9G%-@|pB{+pCAAf)H ziab02@$?maT78y%o`~B>i36oT?1sm`tZ5gV@nm`TA%p>oUkQP+^yC)qSJ03&m*EC& zm~r>glN6EVbL@3-z>skT}=xCkvKqXg;fN7AuwwU_70F;Q4geImZ(W_XX(sqscNF zQXXGC&@>4-`^IXdW}1#zgo|Kp0@0hY%uQZNSsWj7+yP3a5J~>$*|Xfe{p^39)%4KU zn0g9Y9z=w4SgQ$T=Kg1<8xT9O)K|U2s}_j@V$8Jig{36m#$9wb+AQ|t!YsdxUO9m# z%V-*ft4J=BtZzdi)~042tl$zC)-9t*4|v39$H!^5CN_ZOmE1D%1_I7)y_`m~OezPY zO7V=tihokJVQd%;8By*Q`wUchP1ckq4q{$wGNY6Xa2sgKicx?#s)Vqk(}@6%qHaDF zVhqNXsb;d|TjHqhjBG}N4hX_?pm^M6k4lvs*?k`r0(n5hLhWfJF5d!J3!xxVc30IJ?ZRRDyA4`Cw^kSl={{H4)LdzPx4V%7#)7CRTa(la+O0RpPwVZ8UYXh9R+do(jWL`sT^%CNESwVns6|*;t0J?(i4Z z_tNIyHuKLgXq_rF!xY21)a?7qlPl?TTgbda+*Bn3$BeT|XaJf(Wxo^w9P1Y4ZhQna zdaS;vl=R4DIi=(*as@x;2!xTh90SusEB{s$g@8~}%c&}UV(~LZzf^$J`G_bu7G6^= zCa)C;b)+XYhktQ(XC204v>jFIvgh181Rc`XQYoOB!suo<7V<;OC_yasG9Ug<-?F1v z21MI`W?er<^m09$E|tVf*|d~-}~4@3~H;~Pq`plWqs*ly|^ZupLxKUpjFQ| z>rm1MQKJo3S>9S(PzN>Ew-^wgvw?`}zBOriqLm{#sd^oz^evlOy>5&DkO&BE8@vuS zc7UPSNI?UAm3bwxnDGIlEs*tud9uiy+^yP5^wKw>vm>mr$M@d~b=27YNq-D`(Naia zjmvHus&zr1Ec|J_pn0qKqVNhn1R7wf1PO}B3e$&C-fT6zjUZqpk4wBFARXhn0v`TS zjRrrSZdSMb`G>#nA7lb^m+@Vn2#Cc1n9gD9guVbdve6%e=-I{VwpjarA!cp_Q!9v0io{!wA63gS z>MOe>tA)%ru+Xg0#Hw)dl~g;h*)vh{@y*2<6Snf;5BN?evWZoY+{9`Dbe1m*Ca2!l zVJ>YLq`b^n6YQCixSRe@7gvAYf6iYs+$n(U2F~=w3CDJV+MKf7DZmD^;?i3?BLTsK zx3(P6!}fJNuSeh1va5&eXw~`Lww)DQ^ewhCCSKomFKfQ-Wj1o|8hoC+SWHy@Fm^Ft zijuon$LsQ2*m~l-{l$7gnX~a+J@!*!jG2#cRr#8(7mGC$=di#eGt4Y_P@%*C`3}!v ze23TeSQ;ID)2>2DpGy&E7*U=kqhEn&YC4#joRZa%njxzSNcKb~R;P@9k1_O+u#l%b zzrO7Ee(as!2oLlmQ&c0DZ(sM6^y-!>na5y_yuN;Y{iV67MJ(xvZ;;rzQ0l$ zLt6ma*z5U+8Mi%njXBH6HFNEIh3SgfT~u!jaSdDXJ(oB0-DDQhu3teSiyIMs z{13g4(Qvb-SKA(=y~#!q19_t!Z}buplJZnyJbkjQ>gCz#rKn1$#S(?`6*?b(=Z`Bbs>w4^$x=cu3hi7%P4&#o;bZzU6MYtZ`7VE>o z-ABLOR;%sf-;Up6-;UdCHiLh21Ha|A+JPUm|IP6NCvg6aIFCGc{A?&?T@vzdlrS!C zquDC0+-S0Ris3x<=go3{N5&pKH^Wxb4?2`!w*8@go;F*gz4yr$N$)$B zocGYXXJ(=AIA#+1j!Z(of-Lk;nVM1NV{9~{;i&5l2A$#4rezPvVF^(oEjo-nU{(ogG_kUXt;h5 z`0a79Wu8v0@dxJ1YPA7B=)Y?2$=xKJvD~8+Ekn87Cy1i45qC;DiMRkuiC}%j5GsC0 z9+ol%WxALjKB&14sdihnrfZiQTiP#}O(S!R1u|s_!E>5HHiE0LdsG4ED8mVAn2=Au zDiA__D7~PDd4bavC!10+324*I6Ka@is$sz{5%V)8kxD9{Evueo`u_O=J3UzaBSKs5 z*+Rg4NIOBF{I=Q~de@&(-BRqy!qU)jG#TUaB@FeE-{Z0hkegAi+in5|~U z`N?>WiLLb2%eV|NXJ*m$DeI+vl0aSgb181w>_Vb{+Ris0JVrI}jqH$!2Lr1x3s&qhU zMm&Wgng%tNR%<$K@~{wa0JFeFePht^@?f@Qd`Pn6a9<=X+!rzOWm@3RIC!FRNfoo9 zBL?96I2Xy$>Xh`lZ;8_oq#Z3lrM1WhypK_s5aYcq+@W>O$X1Uo{TZh*k*xVihT zsD-nIfITfdu#ICaW_VrSW>M;?i^4# zzpdzh>%EWbXf~=dd3k-lSk(vj^<{K7|23+wqG>c-N2B^;zFhB4{|o=c`roGWZ;t1; zo6Rr!->3MX{?}>w!_aBA+rwz!`ORjh6EvI6QMVO(LD&wQ&>K4bU^K|n|Na<`CU@jA zq_AAh!uRA)zrursMGgED=psFjypD!k4ct2NT1NrBZ~{(bs)3IPLsG6BMlcfVe5~ksCqjXY3S)ZE-$vLv+SSn0>^7v0h2%qcPyed$#v$Ir zuOU6ZS>t!%Y(weGeM5{08oA~c^TzPP8H{Cp8?NK7SJ)04c{qjf8KXztG!LxtsLJOd z;o9eJtVb@ZyN2o=Qm(e*8}S=)6H4p~@l6G`@97HcZ57sKw3Sjv=>@IPpc!<=jfOV} z#@$X347OBQm(@%P2aHbJK|@IRrU0YQl#>gvMucxBN}!fOLsZm6n5c~U`68RbxXL4;KCC=^vmx4UIw~^1 zc-p6Balg>@U&DMLQc7Vh|5e{SWGADg8~DM0bAqU=jQzY(t~hky(P)ir$z$~ ziq(LYoKNvQD1!CG06neGmFCbjHpS&{L{oK&9VYr?jv?~rr}4;?ZkUt+HV1**84sdQ zlytaE(jn`_ZqdM~XfWiVxJUA7jZ6+OX)1@z zJ_E^w2P@Mn^VL=BTFe%VMdQK0vrqy^=QdCgu1yC_yW{(eclG^Fph-k+(>2&61g!q;zBpf?5gF|v%_fk))BL7)aZ(U#GQj+VAU=NhW{H%HNIJsIB<%4U9; ztZz}+C%Ycp(<7RBj)+mPezXf>te>Md#RGC1O&8GlTUEgeBV{>xz$2h?d3N*qJ2_BH zg*J&+Pa+I-JBB>2zJ*5%cWJ2>tavw>P42=e^J*a!9}3pf1c_zpVVbhZV7q!BJ+)rT zlvR2OXPfR$oNcy~T?&C^qtWU_W5;QS+dA89DZ30h%%no_e#Yg1$yojwn~7<%7xfRg zgmT6oWiT->4{x+Hkzfc> zx5eZ-ilg&3eCh3;v)OaEdhSMNooKJMou}(cQZ~H`7ZWHP%U}0?JUu!8a~}!!o73YT zFWz4DFMs&!^~tN_Q%y*kT~Y;~AZGBkmgb`&y9O+}F{!-S#sil>PJIa8NP6ZJj4+v8EuDI=7;b4{GLuxx>1yJqi7g7;T9;h69t^#?E+TuZ=0RB zuH4CrPL{Z5DELFsOwtA5sevevZ;6Y(a`@^+5gZdrnbJsRt*BxdR^X>X{aY31^oyWT z5GF#tF&P;Pk5eAaV&P7~rIi%~<%*gu*Y!P$W=_``bVJwK2F>DTOQ2a?i5Y%5oNG%% zvdJI=%O(SfW|Kh@&;D7ORMBR(#UpFYqU1^|7q@r&fw6Ncm5N^+Xq+9L?Uty7^1d?5 z2NeV=`R>3AoBpWL7>qk%GibM4+oBRSTNahD5>hOu(?p8JzOBf_6uEucq8*<;N_6_T z6KwjpEi&0EJ^+_Krl8WtG)($~D^VSKY;pbHGJ01(nXQ);V8f_>7S6(VEdJX~bcZ4R zHqt*J8tpFro6~lhrvA@w2dyvqzo+=1{x591-B#154knb7 zm{4Bnii-rnBS5qO@iV1z?d+!a>Wb{=wQ6njph0eKC#$%z=;LC(q6N^gK&>$!!?Oy% zD1@^SS>4kbcVw+}wxXyA>UMInX0H4rS`+NuAn_MOxC7lF_%?}5Uy0iDCG;Jx(b7cMhdOQE%}YK+R6BJ!Ue!(InSh4jh20=2LS7~*x`v~`5E5n4m`K( zI^#xT=nf-i5O`ad{jnB{AK$DzJGs3s1|(xYSONxiLM0MpG0DIpyr0g)5uVY9v&~(9 zKIT_c#%qgbAjF8Rx#Gsu*Qgob4a%Td;B1H6rk=MOQ#NCj9FqD&KG*^qL($Dg5}OYj zv28$j@r{||8KW3LkNuO^#Q8`uB9X;9E^^vCr)64BdWq}a`SrzB|LpjZ7jAYiH;F9v zy7%VfytjY1j)u#cWemw@v>g`lgsu;+CRFWD=??ER;(!w)ry&?@;{$GUz&w;zB>Xj; zO!2BYQE3O*TR<=qGNu%twQ)SeWcTFig2Rf9<>aP!=6m}P!JY7dE8SDx>!U*%F}DTh zfMuwxSRW0vSwH6}Cu3exjJ&Nj3*h%6G{1!58{Q2jfTFyS z8u>m7mxK97S}0l%S>6A-esd`}N6{IO(HWX%V3VV=lUFAsX78j;UWyc1FW0e6$i8z# zHyT}&!5lPT`Y2AINbW!sc_kf2P$OQaMgq$)C=U|F(eyLqUi|s4CWI3HC#?` z-++W{Bu-uh^?7-qJ(C%>_HG%@Hd9(}eGkL)J?M1BhE13Id=8EZvl;UY#N6TQc+gnN zJtEia!AhfIcTosl(CBOk1rvboe|K`zKfby;{;LgHDew@=og{(LX;w{S0FyUK^t4pe z2JynAoKA{9nOSnjJ^pv^>Ov5|`25iV^cmX*)ycATT~+;i!EvUXqi%~FYG^1G)%Z%K zaq$~^_*!vTaac1R)1z5^q94r(3TYh8Jd!{>6xN`Mgvs`lx7Oy;CO{juz9KIb6ZIUT zVs?l&>%dxk_v%LHEUY2tB{MAOKlmE0@Ek*w0f&F*z zMgH?NAC&*NQRue@LATY4Ja^O`HM`wW*p7n8r=-kp1)YFC_1(^n?Y~`LiT~godEFxj z5M3bt0~mh;l48hoj-=uiBW=KCAx2=M*{=#q$VA8o$b?znqg~cMWv_22nO|&{aGeyF z$MIxI$vK41n&2UUnW5;kur($vH%7Iph;4A}_C*^nDwo}wAEum6n% zR+(3cc6i1J*CV`UBHKf=yOUrUeAFev=wk&gH0uVVAQ%nYu+bQL?cpf!whfxWn=KjA zpH;$O{vH|z!&lRfMQ3d5uZ1J}V*Vjo!XHrqV>>{TH^%PnjJF9Z=me2z~*Khw+?(q5iEdgLtk@ z6FjBkM1YCn+(KJ@PT_zc7GBnRu5ljHncjrnOr}$a&1jr+BwQ}T`vwmzXKnZWkfkoP z44&&a>1y#*hJWr|o%d2^z*|&7SMQx)ob}FLh(TU+i3%+WeQzNWfzZl_ASz0ciO>^k zI;79>wB=X@#rfTlKvF+?AkjM+HU!MwTF5H*7?gOWmw95?L(-vFPj!@a;=YI*sJ|5b z{|6o33*qq%@}id@l;T0|;O{@Z)Y^IeoI8XY3xb7Z;`rD(+$PjwX8IB}p_eKjkMIpo zuHDa*Y8CF6gNYI^Tu&E}PQVPh#N<7Shc5?85W4VlhF{{9jWyc>mUc1wF z8V%oX4ZBg)Y(L;wE^BDaD`93BIF!3J7t+GWC^NL~8a&l05LtR6^F zhW(QtOWKCx&kT$c34-kyf(y64rTqHsd^%dCMg7t6!$1yfmthC~ru$YFg})D>4`Hv5 z8LB*t#;zIbvx!Q!g27|oVv0(C)1SNpwQDOx$zdeM4PwhtxDNkVe9DWbp-KWlDp||X zAKX)3=3O2q8T%%rQ<29J#5r!@D)v7h{!uJ{AWi5srU|XHG@}d&}z2)(QwpsU9atoTkWtLwcBpcZ4ZazVcYLI?Jx{RyU71| zbGxY#uSwoS11|V+j@V3%dFYnv<_m ztz-ZN>jm+57v?ds6-0T&CkEnUTlvVJYAZwME=*-o3}K)IGk$Sh$8P;H8m()|MiY+` zrZ2RfvX+KHMY;in)gA%IU|3MlyI#_O0y<@2QM%>JoYQeyw`y~W1xY8_G3F_St2g#> z1@=045vLdB*Y%&~kls@3{o*pGYuTVQ840W%V|u%|=bzxu2X-AdDf$MRA>MZ~x7eEJ zARxL40b<7W&GF6K>;A=`Yn;K?Q3UI8h~bqOw7o*;pUjvJ>S2_O^UZ~ZE+4`b+%VR~ zEnFBzVc$5xR~m3_6TG7Ya6Yn4@T_<9!^P|Vf4%Kp{k4|*`ll;804oSs%jMRG)saK@ z=>Kg9$$-?Kj7p=uQdjhXhGVRk6jE||{MXZqokwNb+@i5iYynA{HT}s^*Ng$`g#yPqCpEvuc5{<{IB< zKJD;IqdMBl4BX^Mp%u@xf`IkbOXC<1HP{Mk8OZvL!8YK^@-6&KLNpanMto>{ZGAny zwH+}iWMjjy9AowDCfPVl3nxVP6ay#y5X-V}GHa;|sMk~9*lMy>)a$Tkw$jQz)vMqt zO;YOcb49NKVEu-jsAi4$I7qLeV~x(MB{!_i?CACD|H|Xl{tKC>hgcrv86PqBOdLKM zs|7v*3t;V|6;qauqSa&>jkqOJx5>C)&k4MpS|V`^BT~%5sH&S26*oH44V^~O7dxcK z`Z#XjDfT~ccANU;az2Ra+*bh2fs~Yz_37^NzqI_oG2}mi)B2MC%Rm=lerH95n~s!C<%p`Oll>gffUNMgHR-xy>V|n;%qP?d?QZ>vr-$Vk#}=4|CLeW*u^UPNJ%tE zmqfq&?}YEb0cbTruA+BG&*r%ZJjK$>fNRAEbjcc5phSbH1LD+u7|sZt-gp|WZlh7m z0yAi^=Wrcg(810gH!}=3GQl8@%r+%ct0R|)MR0T>g{<*`?h}?OuG2ANC3bcaD{-p; zJTmG|qtWd8LE9O*Pn_R^r^*S`fR0_Pavfef2y9U3OuU|N(dLnmpdR6?()RFj_fLEyK?LATLp zdrmlNjXK_znohOxlKM`yDjFjNkm8yep9RRfax`qvs*74Yj#Y zvYwfJQ6S7XoJ{k(tJ;x(le2%?P>JDC6_kCrOobwK$|7bcKsD|TzF>a~O>Q-z@;55> z8PP73TO)6nqL_JkX6k<=-hIl@M@w7E0^5YxMBFyXK`fc=f$Ku%l8yUjs`fR{?acIZlu8D6^F8?OEgy@WE8xy4}^uHRROY zw~yvPOVfUNbCp#V&9P*1)3jMI)QJsh5XZw2-LJ5Bp2uKYp}m+oSwT#(C&dt_QqAx1 zNE*c`qt$HMRGE-%m-FUEQE}8SnjSpmRM3%{<3GZSp7lDY4miqLAt2QF`IwWjvL^6; zFG46*r6@&#wCk}^Wmcl}>YhnFHl{CnHWy&3y|-1gm%bRrGhXNJ~(XIk!qw zg(QEE#YW>fH^&s&%VVG?#D=sL))U)0Y?CD{HB}p0Qyie@PFKw}b==Mzudv({BYw_D zr6fIi9)pd(SKz9Z(a1NFn)t0jc{qWUt+Fu>D202kz#{YTQQ?xHfRqK-hoc@OdBFOe z=M3LhmM3BQSAbTm$`Ol#=wF0Z)X3rbZt)@}u=LK?hZz5TdIN%N&EZ(=3zwf8okg8;KjiHiro_8cU3z;R#^}^P@`6- z%{?=KvzD?N%&F?BfLxh|c9NxzAq1-G;tgcvq$3sfvvrrSA$1Q2(p77XJU-3@%_R^bW7Y%Kps6qRkcD zlW0#zGSh-=Pn1Bbto?Z4^4S5zOD#dewj^O1iAix0vjKtIe+MoGYizn{fj^T2+D{RZ z#L^MvXxa@RiLCwvAQi*J{kNH=?LZCkECEdiLD}*1K&gmKzW~z?%qGh_+Vb5zU>3?F zpd2(xuCAAgZG(P5$LC)xg<8Fk6Tv={)2Qy9oS)qEPfxCI&?;mU zzrMeo3z3bQ7F2k4>}g3;;8LoCX}(yo1U4-fnS!>X$CI|5=>^h<#No-)#i~RBtvw-( za?)6>O&)$}$QS7x#LFuRTM+g4FQx(|K8_pscKv@3L+Eh>fcl%C>Rc~W2fb*0v^)L3 z*V5v@1{nXRpW=i1|Bl!04*a3l_Q&C{({lW7FdlS0Z`gK*zTfJ0{iro|I_+Kg zf4C0$zndA?|2L0(58A0ZUJ3m_!%m?ufAbUJ*vYi^>~RHSVpJ+D+66P}0=^UjXJ~cC ziY0&&8gg>Cn6ls*s&Mfg=5CxXpsg`@Wp5U!yGJ7`o*6RSN-1AjyY2)@caVD06U22A zi3o#TDA#wVqLq5tMq@bWw7qfH?R*w0TCiWBU%vY(G_;voRc5p&yjsT}`gh^q=F1n# z-;pq82x)>4xaT56PvH60W?w&;D>&ADQf zQ~Z#JsZ|8o%Trlz7NZoG^9QJ`?amI_s%&mL4gZ!V3lbqS$&v{rCjC%=;&Uu z@fFu_?-IHNprX?A61wm&dhZA8y$y}_a~t}@b7;IFSPbh6;45q|B-2qyN1nOav$W%= zKhTdG9Ku0)%oAJ-S_e<A6av z*qap{&ul&3r_I;Mv;WvM@V{p@Bn|I@-T%7m6@16IqPG0rj{3OfKVICOl)x*sIM5Lf1syP-LrdxxU znZD!ITvNYgj07zK3MT7R7A@CQlr43-g3>S(O&eZXGb!gzF}-_S)UbDEal934X9THn zKx8VJGl)`QC9|}^NYyW6iEO6SFdfwFDKgfppbnU24DNsq)o)Q`^LDL7{XI5H;B}Ne zGoMZGF}-0tebbm7UUN7;e@+>3Rgo+q{MF02jB($-Kd@LbD9EURxqRcQv1xiISx4KR zhPEooCOL&z?^-PgSlh_Wc^z1|dJT&d7%}|?=BR1A8NP=JOrI}SCV=1(^FVAUtDXd; z@)9tr!Hi<`u=$#VW+fu`%fj!X)S~niEJefM0aDp^QJ@z4M?6F^_Q=W%#|;8C{&$=J z4sYspM&|0$*JxEb`gflE-*X%-{!Utf|4ZXHI96gHvU*{-rj=W9*|35YJ8*_nU*cp4mt<=n$lpAZ8h6VR-gptqf&`-V$%y;!p{Th*Ud?Cp zdkr3b(rb`Bo6X~np6OGdBie8uKuAf41AkP%z9D+&Swm2l^bh=v@DS7$ksAqXaSG2I z2$LV_Qs^gK0llWFt!VGW6|jtsLTV;jooMVh?Qqy=jGIlT?RK|y9xJVn;97_-27sjh zx=z9q5YG#g6dLF1Z4^$|x0G?fBtc7ZNH0fYdhed1Nfu$R6Vm%=_A9+h&eUsREc<7o zTZzDZ;lL$Y0L45n#E=?I<6b~Kh0Eo9O?UMwMt^LV1^CxW)eb3(SP}qdcP<9D^tfVB3EP?^iPBFquH|Cus3^E)8{EzeY(> zmHuc`D7)5+6l#dZ$cr)IMF9~R*)uuwU41sqtiahfc+Z;+HI!EitGm zVhBA}jb(5en<_gZT=o!)QH6EFvw3kYW4Qwk>0s5vq~mc+&eYEa3KK`TDo~5fnkn z{1qMV@NR)cYi7ZN1M=H%qUiotqPedU#Z<|qIy*GqE~28+_eC+0v<#z4%zK80H;Zr? z-mM@45`5dLr3%>4G&g7OC4_3ZYi>=K&13TQMYH|UWJ!tW{_}Y2u?bKdpeJabt(S@# zB91Kz4ba+E-WKb+RKk*?yXda3??G;ma23gc?u#GHK1{KaPU5X{QXH`DFW~bs19)Ov zCe;yq83kZujaXk2KVsYB{Iq}Fy8-=L|Lpqv{@KOreL)+ay^^CD%_)lldH0Z;d!~x{ z!GpGUeiQqOG9yZX>#UHnKPZV;K`Phqg8-_w>5wwhwpgP_5}?9TGasaeOQ;sf*$Q02 z-xgBFoLpOp{P9T*CCKltCCitoMdVe{&PQ?&)5T-YG z+@jr~+r;J=CAm{~W`~^kza-+M)zB2sc3?b3)+*K=7_QDrLGJCGcTznBwG*cG)_zhpfOS#b*V*4lKA7J8l~b|1g5Z{IWIDU1n|L)jF`t->{Zo43PZ7 zVFxkb`iuE=GQ3al_q?!F?A6G|_sB#s2tggg48)Uq!?dLhBtV(gxZy>cMP_R?TTD30 zh9oMjm*Ij9BH}3uqNPRS7!O33_gh7*v1C zp@k|VS(oqq%$x!G-!RBsCn+!(cI)8M4u^kgVPYWFnvi2SW+ zVGGlk1(ld+b_IJR<)*8a(B0^Dg$7tPrFF}XG&~F9{Pj!@06LfzGrgd9C`dpwBL7D} zlAzKNzlRWQvK0EDou*(C3#RhcHKU`&at=H=MCw{e3oo1nD$pF}(c!sHhow2$HL?MS zWc*D!hWTbWj8?Jx5zYpkMZ|1`n-ObdvOconSg}LVTzVDLq^Cwcvi;7Yo}?}Hkx*yx z5dzJS*E=4`1O5;*6Yr3rI^qk_anT*rrQd8J%(Guvi{i(A`oQE`sIAFUgaa!<2>4pr zD2Tkq$=*Kkx}~pz&_N2bH1d=o++^IgM#Fc;jx!3K@M%N11t_!va*)~UD;o-Y9`+EM$<t(i&{w4|eGjDy-gOdy`T z^&J%Dor_5}^F^DooN~!Tp8B)A{=RscYsd>dt<|o09kn;Jl2Se{%4QxPtvre$#&Xul zgk7gJus;{M&02$&J9J0wMq?a~2hq@Ljr7fLug&(k{T*_RUB)va>s}%M&P$R%LDBJa z{-Hk~k6{jt+i%s^n{YAthPJc$7&oXDVDCP%WRCPz)qEweAM4SYJd(Y^D?@^V>;Cc8 z)$w2Z*C+qoBmYAIzTfW~#ZFJoDC>B3{1 zvuHUP_9qyT5+Z0HVqoh6GT1tKgKE&XObv=pBS<-dX#)Op{Nac!=93xbSD1_J%Zws` z87b;bSyfQQVz2)xrJ+Ymp9&%lk-8Z>lTDzTl&uN5>5i0Y@#R`pfzk|0zQ??wgMv_^ zz0j5?OYNE_Rn-kB@J*!%1pg_OCP|X{;e`=JMuNtCp$VhmatnTREY|v6xT3fHFHW`p zk{`znnqdDk{!sruTGuH`)-SJ5Ue{4>QQxd4vv>9RqCTOR5`|!hP+x?r)h_eDxh<#F zHtc`=An?A}|2)M9?SG=-xYcY9+{p92?%4C&tue)mp*IXi&bZ^!<1-vKN6}zc_CJB* z{_7lh%_F~=;r4KJF!`yG50tZy;@&1J@@~$IhAM-Idk;q=kz1bLF7NqR&b~jnibHinFQC2!U%d&1 z!zP@vxa3N&4RQ@8L1-&v&JS!1A8Z*tuJDsG8RDD^>GHrM1~1vaPhsD4UFs`iXD4U>M)T8guDT|sSlFGRTyb0CK+s3 z7wF6+q;Wi0lAx(1K~A;OR?1p7!-m0nmB1`kgX8#MIHDK2uIn}$^xiNUjopF2C64oU zOX4}Nh4CdFj4ugamUAUmI*OIZI|9w1jnV}&wZ&Bq9?*3jf1u3g2$H#1AK03So?51Q ziP~nb#Plu&C)#o7^-&IXD1XY5BDaj(n487IY$nxI5|_pG&~?zYMqGR#5LK&5{5et0 zCynVTMJF9=ofLT{e35}PW^Qo5a1)EkDM|%6h=ebc)QzEk?ma>j-eiC+y zDibU89SCqQK!AJ6c(=O%I9zJ?CunU)Cge}V7&U!ZtsZC&2?~G=BPX_4XtIh>~rasT(zA4)#UlFqKaYBj8p0|NrXgHUlCY%vX z3nQ0m;VC3&P3#G8on34JZ&G{3y<^Whb-0Sg9FlEu%z+A&2t2fk34C9R30)Q=jP*~h z{t+t!Os04#9vLG$ViqU@?njBnZOElGAHPmkoluyom7dUtO**bM8l9o*b)0smtYGPZ zK5U&X5;XYoT&ouwm^ko=b|h>E#tiL`q6~g=9-oS)LI+H(6$% zaMEB79x8YeLMMKwj?1X7A(HMS9KXy`DIzHo;H6|!O6BrGsy*xNDn(4Sm%LeJ394Mj z>!7mV3G^$4W!h}(qZ3SVcB+)jO6lxQ7`kQ%uPl4OCdIO>T)H?beWh%2Edx3Q1YAZ9 zyQGV*MiYe^PRnDmu57=t977q4t&xrT$o*~G@IFidNSp+R=0|EE{gmYV;&h55goFY&*hgrli|KD%hR%luMuG#OK@xUI0k=Y-FVbpRQx9fH+&xxZr zupdhQ?-|Dg=BWQSySt9F3(ogzrTyAYUe^ z&W9l0L&gc!K;*&OY#Mu`gz#&#`E(XsVcd@ESZ#QrWc>beJq)jF@eL0oLL-IG$J7`h z=uejmKK6bLb_CcPxGUfor5WX7NY zPX27QetD!|;029pg2&RECOCHNkc*~c+nSVW(OqMH8*+VPUR@I*6U5?Ym*@ES zbtZDVx;w`4IGo-3U>?o^K!vN= ziB8m_3RPB%Pl|SBu_T50Nb_zg#r0lW#v*7wv|4QOy()4M-{lnAO2Zln%rkjeOv0C-~)<`uu!h-A{?18(Ef3SDC2Z*9X1g=gUxTLO{ zyqs_QOrZI^YYTQQA%QT>`E*1zLgG#izw(V7(tRBAO(kxfkniCT2WF=KJ?iew4IQmD#nTQT24fhwRfc~Xt8#5ctZO;$B4 z@XVD|;z}4T`yKYj$MeI>-Xrdhe8ig_?(?i@AG58ZpwE--wmo@9?msPZ^DufM zga5no_cTHqUc)L8a4lD_coWe}-FEtQWjP;is@u}f=N+<^FoQfJK$}9$%IH5^x}olr z-%H5BL>n2@wQ`OOsWAq%vT8EQr;^8_Em9ZOSjtMM3Qo|wVeiLPa>&)%59IBFNf?hR zoo&xY+w;+eN8A41$$sx>)xq`E(KEte&?}U!ej^YZMx*R}@yK4aw5DvS#Gcn$b{! zNA=Or@@Yf-?pO*8UNEgGaO-7tg`(LE@K`VHmKIBEF@joJjg_k_rckS|(iI#9QrXeE z!AVzA&#IwJ*EtnZr-YrHQ^HQpDWPCf({WYx9N0n6ft_N{0s1mMFtWMRH4-kHdDlOh zNL)D5R^**3Tk3TZY&~Ec+I)(wiYF^evY}qb3sG34`}t93$DIng6&Xrd7r}y*FWn>5 z&8p0#k`*I2#)unmq9hG{km(u`su$0wBy zu!-x-5IDRTg@0Ybj35&`t)gY9WJW4;x0lvJ-wT$#Q{u(@zmhHqxSo=$Wn`IuB?d z`>Gd|eJ#0t7fqRN44!(C2AgxuG`r;kZ7U(~Vy(h(b~PIbAhrS}^?~%$Yn>t9FO-e- zx;)dtCmu|n16GMhgV3`*gr4US+NAYR%^&d9pqFL#$;eMagOU`%ktYl&N9987p-YfO z0Mmi)QCB4ob`1UVAME&OT5h|*|1Zr14zV5v(|IF%M-c77{Qqp*b8OZB&wBR%dzugW z|5@FB5PJi!+wKIe6WC-)Ivv*u!)~|R_quju#%`amJ`a}v+cy4Bzykn#yQZ~kw$^n3 zOw)YBg@#A;#g_&RA6H}kWyWGocwKY|td<)b{q5%HUYEMfCGi5{3zNQT=+0-rRRCiD z#u3B|p2UzGW0blgUd4+9oCH4)lOZ86ua=YSM^po^KD<`PuZ9!)rn8ZvreG7Jt=EMvZHZ4XoSc(9@FIKh^iOikX zXWiA2heD-1dBhcPYQ3C035)dmCyQfRKi$qcBg*F`GQNo?ggpMUZ#SV}-FTT@O}@*TqA7^+;!0&==ne`sgi?*~)Kd&61RB-hWGPCg$|@G$H}x{J zf--g1QA)`*!l?OlH0lRgLTACqqPD|d?&?A2^Ql2bIkFeyau|v-%fH}OD{f^f=iui9ocXs&BI^V=3WlMUEX(Jyc4 zHHs4XnhNWm2A5rV`U0p{h!YJ+Jt@jYDg6@%u$!7kv*;UCotP zNP)bP38WbSTXm4Iv`up9FHsTB3FCKLZS|xek(#FH)vgLv$q=~$A{eU+=k&Q)6x?X8 zF;guUJezWbUEs6GjP@DMW?v*V!v!a^$`6OD-l%84cdj zU#}ncTxQq&iU%?+t%a8E{9VbT{-)bPsej7q3zVp;E2Epq)Men714^9UkkC;MXe~Vh+My=sb?Hy(Ar%S{>s$Z_wOf^<@w)PdExAs zPDZ!J%a_JqvQdg>U_{PKc+D2{7ZMVx@vn- zwPGT+!3-26$}dv=G*JSly_8X$E-|p&Z<<0+OCw(K|0<@V->Ey!kLA6WgxH`oEtRBj9fryMYJGON~Ou`-x&NW0PpbR@X|jz zytwq=lkK=!d|0v_FTDTqFVYs85BguG^H2X;#>;r~g)-k4X*e9V(WD0WCbygxrbn<` zw?jdvRZUbv&|F6Xw+l1=xOaZypPoPg!ZO6;+2VH9v~lEW)*p3wXxbm>0BJy$zek5V z1voe~b_`2*rGr~Nn`}0T*Bnr7(5PCj*Qz`BgcP&&5&NLR{I5+_wMqaeu%EI4W%^h& z)~=#w$O#hhcivVO9;=qJI~gA-2TsCBi?3N@0+Nw-nLZ=q`ZCLB%GL%E!3ogAyrg9) z@49lUs&0q9AJ0zDFa3+3j=w)W+ALpN8q4h~(hvS_C{Q=H7m%u}K%(p?!GJ3eNV&DH z8#z=!Tmbe%#082BteRk#nBfAmd8NA=f6EXKPFVO z$HI>u9iH^|_s$P4d~$gB-+ut_EK=sEM=JgCECo%=?FjaNjlC#pU?lWGKp2?R?2m^3 zhr@dqjE27wX5qo?|18tCUBUjZ{l84xX_H6K_J2?CLHoZ>)Ecy-z_qM?%kI0bXGVQ1 z?)N+WR;L~HLoaYTEypy=?EiiUqT$#$3lfZ^|H=5T&+uTTF#|k?JEG+n2XV;E0PS7R z-F3hW&@3?n+%*W28X1zN)_>IYPDE0OuRn=uMie*X$F&-?0pe%Slp2HOBt#oErL7R6 z@Fxaytje{UYqnXdU0%nq%f}!Dn(jV`04d1_QD*HEHl%S`+0B9jhQsnthhM*nLVtkvRh^WrCq|JOYYMw;_xm@Nb96BD+^^-ZwiD~*>zM;+=dEGqgt>6 z(vu_8Ly?N6lty0r-vsJVB4#MSHHA0}=q7iC7E(7iiopni8()0Sh4WpSUDIxLndj$&4vZ-Xu$7m}n)*yhU~JIh1V_lf)R$V^_64-8 z;+_?Es*!7V5szp7mta0&i>2{d%vmg?ofK7OptY%2s6{SpQugqNfh-Jwt>26?ATA#b&E zVtlBU7fT~-8OlnUCE(R#xH(OxWP6dX2pa=54VlKNS*BfDV<{@a`T;@8BzE-IA5U`j zpYbs*w=4Sp0^W^-QMnxO;pBgwYqvA`U&}=KpVfMn|2@SA<$o=^Z%2XGb^6^nwoKRV zn^DUP+x?CkcL#3Eal7p}j5-e||NDsUqBbFTw^aUT+q+(S*XbHNrc>qy%y4wI9I&Pl z*xgwU$a(}ZT~JLBX!L^cS{C31Niq$GAOyn%qv&W1@v1%tlSNJJp-xkV64vR~V3GaO z5&Sxxu$hLz75N6Ux{8B&e|i%qwE^L<`uTzz1XX?jV-kI|RlHZe?G)4?zvMaH)f zm*QKHwqkMatX}(;9>0+zB1%Hxujy+7U$*K_twC#3?q80fYNf))?Pp6h3@6Gp3SR zh-@{D(+O>lQ0L?}0fi*a1uqe#@$vBLdI1>uYdoLcO{)Cx`ES`=xCGj=yBZO6UIGo} z9z+D4^}mMbH?71((Q&6`hCvj2&1R<)*n^f6cJ3&O&YE6R9Gz7J#=48XpWT)w(XEU< zC|!O{4VpBCkbLI^6@062&&YdfUbL!X9V}Fw7@6=ZGzs29V&Hq zi)YF2+u?Ldw&#^k&W?DLFfsJy``-ES-VtVk!!XQXUz5+t%g3^q4`&Aaqt-w9aO_{6 zAD&$l*F`vP!>-O*6Uap}$q&M5lHiWR3n_uYHQB=C8sR70UW>KF+W^{|MtT#ljp;1_1JVaiovb<3! z+KqE#z%(5-yrz2>oHpoa;5om`WWGRxuEJ=L-2t)mLRIaeJ&@A2xb+~Ko7au>xg?O| z_(WPSmKE`SQo}c~!@Lw4mX0nNtQZd*C--mUhMCC-Gb>XuZr@AN)*3_94kBA58MP3z zAOq&C$sY8F3!kAH6c=_8gq)X(GGSq^V1OX`6jE%;w^BDU3{xv^i6(Y>+{;y=0%E!l zf*qRxBdI)<2W4_y9b#o9=?TYY*$C9VjWk^WXzAV*0kKt?(9lSvMOqi}jJUfh^I?^lcRc_yD!c+B zqEfWrtX2_y74kg_hOL1#4}%aD^}BpPRdl?0=A&58t3$$KU9Y-F)-;XI$39T;?SZXc zA3!UdUsv%gQtD?XQNCK~Nu;TwHK<-+Rjt)h=P)WO!58Bx_0)7TX<(o_-j|Wnaz*w- zBb{_=|1OGb4e=Qw%@K9i+Ve(XCKc_qz|(~idLJqRHWui!vGYY zl&P=Kc6MACdS8wdd$wnOia<18c-N&0ZmX43a916pUi+)%BJ=9&735jEE8JC?t+}Oh zBd&Cz7QfPDG9^>VH^F5hCN)L0?T)I-t_s6k9O&Xs^K7D)dTdrvd`dvZ}~yB~K3q2~rc z)Quy{3B#DYeRTb=Ygf_#B91-8A6r&LH@kcHp%b05s%~f75whN?=7lSRz{iX zl%3T&i?_A0#d9iB$5lg% zI}Z_BJRQp#%1Ks*sY_eIz;*_1+io@kyKT9xFbwXfF69lcsVwEyklCZGUKbg?n(<8( z4*;F0itqi$W61w}d3o-i_0Ii^-pR%3x#5%)qi(Q9yQJ8=-ro85r#~8QZAVw`p!b7+ zvUl7ACmGOD8deK9^1>$fPd}Vo8k^#CI^GM^aMIV?D<`&N{Da1(5ew1TRA_`v8yW$? zx_A?Dox0!=MeQ%H;su0coKxxECNjuWxdLCACo? z^D1!Wm9^N4v5kL(mt3Ekb|Sn>PZZ_8^l;CpDR4C>oA1AfSi5sE$`VcLQj5>ilvx7Rc)2r+;3-T z4zf(lleMU;qw6Hg=cBxBe3zy3p~Kh#5f{XN<9GIiWiab62X*6xc=G<$be8{^yuc(_ zl2e6#3ZmGsyitSKkwW7zETW+vyRZ*-THS6gD3bpT=< zqs*~T%?+z9lv@-;Na71S zfXi~Z?9qq2Hf3azO(Y7NV$Pc_Bkh&zH^4|HtQ*;sQn;`biBi8?l4%Ifj3^g*y$YC0 z_Q(x}RHepBdBcr@hIh4Z#WgH7%}^1&vSCIQ^wy70*rTeUMUfA9M!WA}I`I^QTSH$n z0$yS&fsq0w?1EuSs4ocK^LY61>nz(mR6yUmTRhOIRIztZ&+%ewhdkC4+d9ZNT4d=U zF8+P>$ilhvP}U3T3RSXQP%8gz zq(uImRnp=ZiJ@JB26gszGp7z6_#W`cP)T3>nkeyG*y8>xOCdJ6#JUy{2uc z(RSBZ&RU)ZA5u!lIC z$KXxTp!x??{xe6s26e=1fE(e1>HnQp+cOpYziZjvv;O}nKB)h9+HueycyVZ2wiQ}| zXLjv@+i_ZE--#^S>;$$Qw>MD?)7OiJe*%;&+a5rl+jMwlXcirRM& zh7RLMh>3_XZ)%1?wf1Zz)Fn5T%mV5(ayWEF#zuMvnam8@#=b}sg}se~o8fpl7J7yH zVh~1f*rh#_cFuB*llS3hNp60$<0(SgxDF=K2qJWoQH|&u)&oY+XQ z*VE-F68a$3YP0LxWC&oyA{1okRy~hpg9+a9Q1x|A?hz-mir$#*qh@IQ+pxQis)EOM zR297K+NuiPv+k>d&jwOW;hmOGlYDn=Z{W3^X4C72p6NN!9pYwYtyWjPXLW!bvt3O7 zMgF*^pc2wB^8-wi!hVeT&o`(iY$nS-X?F??G}Wja`)@y<_kQp%K74IYo=MeT!Hv(xu)}{#F~kgvm88-^9)5rj?*{BV43C5jh#|?a@*$Eyq^{SoKt5QN zBH%JLv(NO*skA5uM4waK+y$KjnZlA@x>X48WIDj2PO>58d*H14SOA{{PTC!%tMIHp zosO8*R!&%{%t!q3^DnQp?)Geog5sNOA74;f<#0$Gas!5lr%(nBa$yyp7!rIoBw?<8 zjK!nn?owNHO=DmRlFF|K(@o9v$#-fOphpYo*BgVD z_CbuiNxyHc*nsIBm)7SR`7sr7NV;`VD=3ed3RcXz+7uQ+jXTD#oJLSuly8+aDYvK5 zm}xr{dQwv%@^E*U<;P{g?lemg$1}p7u2>9?zJ$~-$W~w#jO{r7I@gI!h>xDHSjkf8 zYGqQd;?*(qMfmy1fgJS{FRiszIpir>HWXTeqcN82gN=+{~Sxt8EuRkj3$ zYaqObhRK@TECL#a?>D+0E?tk7TS&U*v5-Pkw?~$aZEO!l!4+l{`bw4rN6o;S+Ybf6 z(yY;nW=g1*Xndqy66aK|ZT{hQhcNQ>*J4#WrAJ8Va_}M` z3>YW!PGKw4qG{v0%7K#nVOK^!^7U6{RXY#8GL7$M)6p=z)vi#tTerI8vPF)5#}d~F zxl=TVjH0=Qqth$_5Hn+&CErMv;k7~TuF({tn322tlw1P`qv;pw>_A!t9ynt~Y2DAk zXc;&0`zr!}w4>vLNbfdW2d;wvL}~&?>TWfSoib9CvB5=_a1>13oFSc&2@1^@T@f?zi@)+$Ck;-&UUBo%-j2i^+YL#9hbm(n0P2$@a#NQeX0p41k;)1Q zZq{jvVx%+l8>o%M-ZR85O)8OHSnoDM-Qg{6BN;53q4NVhBbtrx`28_^%Pc2yCAK6> zSeE+Hb};OlO%5H)$&s?VBP~~%Dd$86?bo>?SxaDPCSA9+r00!r1ur81Is496+vvBK z7wu+_YQ|~yRE!+?t3g9O?f}hwtK@u2LsYURAyQ;83YR15Rh1Z<-k`HTmkhD|Re49H%+ z=B4>9Raabi_nOHiA^GhNJ^1KLY*%Emz=#2K z?F#&29stZo5jysclW(=_ZJW&AvIxyHA7lRXC<7F2QOviL@m&y=$f@7_(?*xTT=9D80c!mh7A@ja@5W zM|v=knXHG#z{$!CuEaR6$=U8a3brxhGM4w6{I}oRl-EsGzZl;MyDU|mY{`bKhbKSm z9m!VJ>CKont*)bZDPRD~V~{eEH;NuaS6F1jYHHqNt+l+o=F7>tt8VDDJ^D3ex0{kl zHmqVu(%}`uGQ0ZfI#Hbl*4;9>^o47q^a@p?sIsk;SnzRN0N3#N8{gC04~~-z0Hqhd zj6|-Lv9OUz9$w}*a-C-)Y)~U-%~r38ISDmwsrPVUxm%5-|I%n?eFDE zTl|tO+1{&DVFPIB60qyW%3N>dm&)BmxYPZ&u_^m@Y#H0xg<718sI)hBb8yH}f=^@0 zFruB(DzK1^z(KLGu@V+?A6v+1so{JZg3Ym9J`3kdc!jrMDl}bkeLXPvg0+-vV}-Xt z#Uj3fpd;1P3#Rhoj?ACex`U8(wj+t)iq;iM!uq}DCi&b1yAU4eWJqs+4S>l$(ofNn zj7FzHb2m&8&rB-H%3>x7T7zb_N`Yr8z{>-vu~CFmKM#Rj8@|pKU3b+;VOZP>ffOQF z2BpRdD5dV38xO+JYz(s%TFtr;l24JQ%4{_~>5oy~en~MpNEwf+fateWoRGV|YAeAd zmSRVv0l4uU#gRs1OTYx_ZdPG|adkzL@jUGyC5kA-ZoV=l!mm>@ppKQU)03lz;9OGx zBfauwRm0rxW@BjRcxUDknx`bYDsa9!*hoxr^^L;-vW`3=DUl+1V;%_+AuTtx^WdRm~C#UnJ-nu zoPv<~%Mdhn<#neM)$mtU;b<-}!r3Oy#rSVNUlnj!3khHo7N@j>FNLw2)>Y7gDauf- zC2PW($~dL5u$x@5Bq*P&T})(Kg5**Lr|kMDsbbT|GDhaZQH5hYM%nriMhdFHO3yVQa z6oOyRR%$CF+{!cy=Lsipb|Yj1@>5!Yn|Q)$FK#Nh!wq4N4Ju!hDaigwLH5srBl@2y zyw*RX0gu>0S4kMj4zV4T9;Em#@U}H2T7Uqf9D|$PR7f8R!y?0+G0hCIvIqk@R1}P` zGf7WDpn=E zY$Yl9)~KKQf{qC{KfhfuaTPIi6X$H=osmL2olK6S={iG@T-+30@ht3Ao*Id(m%BY1 zI(n85SfFmUElm{8jL^yK3w8aY_P9a|lH^*xb&DfjRY2CqteUwrR}B>-j|RglGR7%- zXz~W-$JN3dn3iV?@&6mtJGViQ1A~A!cue#LIOsMo7D@wMg&)lS-)!5i=>KnH{D04V z_Wys15BmT22c1sfnqen0opv|2!nhN(!q5!t{=gk{9dFPz9kU%ibo_rW^Zz$HyIyzK za!dUG0Y`Va3pqhjj9#Ax?x$Ylh@{M)eO^m_&uRSo*>Vnn)PXsj#9z{vMguONgu;(sd> zbzEboa;2di(n#)WbTkWxv<^>?jni_`-#igxzN`M`t%nHtzE-gJ)X}^XT6V{5cdTYJ z==S@r({b8&3-i8qfOqaJj;v&a@*+lo6Wx2C8XGLqB~;V^}3jMP47Hi z6Qr>4Cm;TuMPT_K=Ko@BAal04JzLED#XOiKa(cB-!lY*E93Wv3w@>Cca-a(gR*KxQvrM$lo7GkW~Ph=sv z;$(9hP-ttDh7ry1xLS0$>O)Oqqf3Qhn{M;1Rs1^jQ@JakaTBr1z@Mx0#rGI?U=!9j zMHB$vZ4NlxwL&xd#SNoo>mbL!Iq%Bt8 zm$W?QWN=_V?!X_tZiE!|Md%hGowVH~A1a|Cq`PZlZE;Za6?n@k=`j}s^()@jv-fvK zUd?rpK!BHluWt+vgVcC$d)%Mi+yVP2GgNKuu`I*BsNc6*VQhQNX55LpmgSgthyisR+hAI|^fec%6~4F6LP=r3i6-su4V6f zof7#E!BLv{ks&Fn#zjd@VsIp_)tHzF&THVx*+m6qM3^^nzMN%}9dgIxZSnw;vp5_M zhGFe`x|ofYSF8iLPg1W^P-`kF3aRX(Sv#9g$(&Om(&72vX;Bz%uJ5LC1n&-`)YY^$ zqxB(D;e5KhqB$dHq+8O!7{l!tE9YJ5Y8_+ta$GN`0xbV!W@u~EW)B}`M(Vd!d7cPnlyo=tRyqKgN*3T*8zS9APkw; z={S8i?mXpn0JA8iiT_xTPvgG`-YrStas+j=~?S239@VIyS;nF|8=Mktl*yn{f2R}Nf2R6TkW9tcJIT{rB7%C8An@J-B1TyJi^MM(&o<;OU`&?E;zv3$u%5|2F|Q$k4}Q2!fjBlci#f z7ACB3TYLea0+$Z%GGRNpY4=Cd@Y8Gd8or}h%5G|Gh0oC32KAa>D2bT`3Ch=(WUI`L zQE-b9T-PqU$bsgE)bPfqx`|O{nJWBxI#>9P_U3AR?3HS#4Q897cK| zP}8*RmA{P)~BSB)Yp~ zkeRyBK7++{JPdvOtu9F#O)|ex&wG0Zggm|5^uy6GhBPYFNgk68vVTYMWXt%Ujejr^ z4z7ylwZ%XHcNez^aa_3X9I*A@NwK47sHh$BeGXpW@ufavtwOTlw5f6A!vkhbk;=~h z0uQOdjMt)5>~!j#wq8mA^F=MbA|%w#fw@!BfDKQ=7$`3socM4-x~7fI<334;|TJ-8}UsXE@@hLGJiY{6QNH!CfW+?xsH7OYH*v& zgo1K11%Y`7>^R{W<7mdV z5}HG($!7lb7LD9RH_`=zeTIgGNJnE?ud`O>mSoUM*cAWd^rTm4Lk@G62u49>G^^x+V))zD>DGU5}Ss6;9Unt$%rb`0icr+<&`wbaZ&~j@-8K@x}YS z^WH(7i330~_<~o<7O~965XZrJ$EIpz$i{6TJN(xOLnAT2)gtp#>D&SKNTm~4@$lsE zk`kHT0q)--T-P%U@&?ew(I`ayqMU7d9FP6jr)ZJty-xx0_;*dwMT=+<4aA`EGR?EhlXUi!_rwzqt^Jzb|Rfh+Z!#1`V zr!Dh}BHBTaG+KzIM%I@kXEUgs2v$zQTT+Mg6f0$QjY<3yr2~W`%t|z+dkc3*0c2p1+oBf#_h3+{ zjA~0l#$wteLQRT6C19bhIQJ|>!E6-NznJw}m@XMNsR{4p)hmF>S#_Xo16 z1_lh-J3Cxc-IwoUwf(o{c`n!gwQP89wLQmt*8e@l2lam)v)c`welYL`9jiNt23Dut zZ?(hFi6awCOq`Y(4mzF3)&Duxu47lU|3*DsrhFqv3hF+5O1_InYnJYI3-3w&81BEz zghqb-mSu7Jmfa?v$|@UzcITB>nd<6pnyb58H>W1e&1PV?!dBGjm``inY?%(tXXHT z`~#eQKz)_`pJ)Rj*nKp(n)};D`u})#%e9=K(+UP*WJRrh z(FR20p;N0By`c#t^S(RW%tLV1sVS~H z#-$`2PW6*|>ko1j8x23jHLZIP8AB8|vIouDN60K8$*du-DHqt*xtNP3nq(Xe@!v3o&;l>hD;rwYm``$uu0I?F#D7qyXvx#+s)RcO=58Ju7*~fh|QKso9n@zhN4ElB_c7Kmdl%CzDh7|3(-O=mY)`$UMtaQ;Y z(!!1Xye6sSjLu8Og+o94`bN*&DVp5-dHV8TK2h{9C6>>@!QazRK4L7^RA`%V3X+VD z%D1WYm6Ss^+iW!bBDaD__Z-9UrZ%AD8zb!xF6WpTQ;jNu(P&^MEPB&m%7O~f*29oAjt~j zBvFSfj_|jyG_-`*!JXSOyOJDK=WWHu%YHJ!E1)vkWq_oW1-y~B!j?`NJ7%(2@&>f< z(i?aHfN$nDv`{Gbu1-gTw&>7WnxsOuSI1&G*TM}dd!?CfzjprlkNzS2e@nyvqyB9W zke!5P;F&mR$aQoN=l|boTeiUex6%LKv7Y(=r}!ZMZ<~EPiduGi;M#G!8*~O??3j_= zjodH}TJE6La#|kY(jS%ocgQ5F|1%_&GYAfM(O|w@fc=1;OufBXH3)9RGBSZUk#H z>;@0=sn0QSH3bd_u&#uk(xjNs`?_&XFS`zK(;8|lsL9PBa{kl{O|d$u5=}`;kZ_N% zO0d%fnZP2)+A1BJNziYgW`*8oa4a?cJ-CY;%|F-V_&rx*O;5fQ# z9A>fl1aELaQiCC>k&t_Kcuhn9;S2fzF5~1zOg8MOZDyJh& z497N3FW#OREU(pMI%%L^9kfda3E#qC7KG5@bWpRsX6v#)BiDDVuH$JGkD8=juWmXmxDuxnjw%(sZh=F2p?ZEzM*hwFU!NWAUHbcHM+g4V**^Hl)bvf^Ed^X?YAHkGc3&u*vMd_Yvb>>-1GW30!k|el zx%;5Pn9n{E(3}8<_sh`Y-I?p3pJvU6Wfd;Y4*mW2CrAE8@2IzrRh*I$eLV2@k9vE; za)s@xRX&~xwaT{Z#{s$8q3?Z&7(|cTj?G6?+^Wx!|%U8qWG8vPr%p- z`f5L%9$iA`AI=WsN?zS?iz>Y%^TNVuX)_m|AuFBk-K@B^VnkqHzrT0pe}4!tFx`@3 z>Y$6-BHdAFx@hredn=*2|K9d{m+$@K(}NF3d*>S)MOd=`-jNHs#U)+2q*p{Kq4V>- z{lEDa9}fu|wy|M#zyR{qwsDe1B_K!xp(FxuGc=Ar{3y8IvC|&n6BObbso@{=ez+jx zrBLbMIb@TAsEbe`ogITXdpTwt4fyB`=gij@E`-R6O^hBBhAV-VA@%d+B2 zc{6Zna1Xe20wD3KX*4pRicvji01XJ5#v*^fziez^@usYVP<*_E#H};~3*>1bKhMV=`K>3XK4II}b9wib$ z!$k_vK`0gZ$s#5xSl|Wa`JyG6|#y$6_*>}N5fjYQboh%AQH!`fN5s~<#gn(J&!Q~m4%YA zCMMpP%&7~NxLw)%FZ1Cd_NSB4ZB~a20KAJ)IO6-m=@{^HOGp2+3TRA{H8G4vu@4^G ziSQ721`}`=!k-qM_-Wz2^Ygu*FhbAfs(P5P=(qa%fRO0cLjc9TA5g~0#I|m3)&huH zCj|yWM?*x%)GJybx_L~*1Y%USnf5Ze31_3opM9C9oAZBIz;PN9$hOROy{lN|m&A8b zTPJf!l40WaM?n<(%uN!FmLL>?4;O7^4UbMg`g`x*F}9KX(h>|lZJ-x2@l80fDA<_d z9JE7@=b(+5`9o+-w<||MKOT`MFQBAFioOt$s_ceB%fjqQVZs({nlw9C^BO30Gmq3K z=je;C>73g3qq$OFR|V3>okNK6sP3VhiP z%q`6g;W(0|ur73{!POO{GsG!KW6gHx$va?UN+EN0@j(X{sVtP~{YY7LS_8(?mC(!u=ZseD zD`uUmx<%{8qfyZU;EHAN*MeVNRpZ}9@AprSdq1XqYB^S+-=kBt=ZZY8hP4O#F&@a5 zGqZW;fYm$~r#BEpLb``DR=?|_?}1}>th#G!y$`B&KnNNsn2@`a+)oOAE+K1!r_Zkzz||o&~iTPyhoP6e|Ki<_MvtpEw+>RNLnzGRUF}? zjikNaNB}0`lx+Xo^1*=2Y5(-(^8EDZF#+?K!&w_TUn<;;?lKT}UAR2fK)k|%z%Dn$ zfgsNM5Yy71^c^9=JsSuRFyavaO9+uoB?4OgKWtum@XIEsqfRnq5_ z!`@V2@0KCKqm9I>K9XcM^uz1P$WP)?999^LqO&R<3=_@`1xZ~6tfbCiRyjV>NNJXY zi>~eA2}b7Is#~UjiJBH#cyn+b|#@&^L zRdslIX{qU*6@_y;?Fz-$YP`2*>%Hn=LB46fdU;aza2-I>@>25@bJ{M&oK{;30`??` zlh@dqrhkv2d!aE-Nppso7#W9@>Puo~H!7)2=4O zkA1+!%%lasF9G;UD8<)9Qy!1}$jH~RDe`sXP?k@DdtV13`O2w-+ocQC>be!E!{;ga zHGHNH&(z^TsDo#xIpnr0@7D;~n$ekx@*%p21*GV_@`b}h(LGu2>aVMHZs zCVJ;Arp~%at*BtHTR{&tCSbiI*y6=Cw`nR{H$m1%I&WD9z4KOwF&{BC#A;LG(IGfz zn=5b*MoDkdMRQ<5SP=QR6$VTluQocVJ%3k*bCtUmkdLbjpp*V^0a}9&%FI6pBl*EN zxJez($V1!ns5Bld5B3yA!B;(7p(8ylXfeMsb zQ(k;s=QCwkrqz+;_9xbwEXTf5bCtFv*T`1dH%y>lmEl!dt^zu&-b4HS{!Xk7{kJHa$^NG!*yAPmEezW?dM-#gelyX>9&Cm)Vqi*=VbtXhek z9k(~!Qfn)UQ(Yag3OB=|p`KRi2sPCpR>B~j&*KPf`D!${m(~XEXW9Jw{ERXQWd26O zuznF6AE6pF9giSt=1MTJG!s7;)DVT!Vl8lz($oNzJ};VjWSi)by=vEfi6Hzt(lUFC zI%)kLca4Tk?>5Dg+uhZD|ofLjAvux;P{YiMZ)%M!nf~F z_s$RelfC0!-FWfC@#%qSn%x&vMe&=WmnfKphJbJ(JN)3mBP#T4nJ=gm9*g#V1WqWc zaCUxr@PRzJ_}d3k zE`s%+AtBowgTyp2ap=Rvf3r=yrTTw6?z8{*lYG$sJ97FKApv3B3Y|f}Z`z^L9fY08 zj=KZfjl=%HZMC{>r_BHRcu0=vcw}5$-x9|DzsB@ua$OVv&c(*4|F^m8TDva9e|D<+ ze-k7%ijXwRZriNY_R)`*aBbm~Fd4|4LM_6XFUHe}znopo!782A8?uVVBpAoWVp=Qe zBk!nO2>|Eu=VAPX)OrlpW@D#OmRJCONAW1epN+?MWlsH2|C z+t^`$*EdU$y%mZq6LPjnaA-F2b{0B3W6E}=WFE&V7-w8C(~QirsLXD{)LC0SpV@!L z4>|waje}{p9LJLd#&~S(eSe7Oe-tO-d^p2r(}BtoJly&3xR#Lr!8I}dt7Si*|4;Fu z`G341Y)8?+@&-=FbX#V>8(Zyx8QWpE8w8!$ZMWiqGkE0lzqM;xMd!bSqOS;w(&Jyi zQSf6Wk7{eN1WNriIfNSH5DL3|QVt;pqE`uCUSE-m?I3B;!?QupzQ%A$xCPhP*=cC_ z1zQew0uMODkmNarb^GnFTZ3^DW*1VFM8Tlh3_{Oz;*J~3oW#2AQm$g%T0C2k<Z6~#n?6!8t>BVge}v^XFeoHqLqtx-_a8uxEWw?k_? z_is19m&pbL%C)g^GW{H5@B`a~a0q{cpaY{H2w#dz?={Vuu@4#H3HjP6*u4A>LwE0k z;LiSZ+`9p;js{795!YFHSUdW@&KpXd{jmfq2)t{wM1lrj4G4WC5E(8o*$nk6W?;tV zmn=>rt3vxtVV1>u;zh~We!wUSa2=r(XB-EUgr;uCG|s~8Ort^bpMM!9gkY1(r{K9g zox}#%m8N;!Er_IxAVOL^9LF%58MHN7(8v&@Tc{3YMr0wxZkm63u9xtCoyzh5Ch^Up zaTQPEd9Zje{tsfywG{r(wMemN{_hDs$p5*a+wtPoz=Ld@gzXDjU8`?~u@{UQyYF8m1`n3b!UPcBOy9r>4pwcas2M`0 zE>66bX*O&0FHkbiYT5?G>dS)Cu+k8)B7$f&te1-!ndW>sZnzi)uUR_;(lkjU5-w*z zTU+i8bl)f4Z}u+VZyAH-Xhi5>Gz4aqj4l{uVGE5Jgnl8jsnIBfXM4w_b*lVC7On~T z%=k%=1|)2`#`grYx6mK`V%Rq>4N@4Avmj|=6h$_VFM%9EaWDj33K;?f@U}l-bQDN5 z@HP$>g!(5Cp0MQ#ArDiKJhyIXoI*?5W06BNf#TL37R3g613)+vYA$hj^7eG|MKnv? zmiYpVExoRSFRRK1X<5kxuG-iL{~>_P$oFKsp<~mIKvx4mZJ8Fvx_9lm?cBrD7U1$F z%m-d72J~7@(+yZ2)`^t0s<=UG1KZ@IIrZleLRw?3lp%uoi&!PU?;+gH@x{rH5 z7kSN+_UwC&+**I+)}2PK!_3NyDMzJ|(KQ1GDFw@jB2n8$H%iOy*mbu=>#B`e1v_7i zRYfyQm0+Z{B>@Yo#k~?t{r+^}uL|e>pdoiw5s3!}^4Av+Yt{6hBV$#Xz@wmJkPO2| z1QN(}{P(@RBXY|t0~VIO6R4C)l;ac4ubV$5YIhIt3B+3r>sb^6Dkbv#)Ntsj;W$p+ zYTYZws5*qoQJ2)9PjUfR7hB2?U-|LmaUv0^F=$rAe91+w zDzSFc4F{LNwz@PFk>mazOVFwwz>F%GgV3LT5={ZuGx1wDJeFI$1cd3c{OP0|_V3Q* zkUNe;Iey1=y}DyQIn1r#Rqp=@xG-@!g^3gobIMk?d zE5?Cb%m#*mK znK8A`?w$Wx?w#oA_cc0p+U*X_YVVmceSHeYPRm-)u~Q-ucXjD>*7MPnomifIHJ?A4 zPZH0EaiP)M!+c8oKiW>K4fcO++j3f7+xuT+cX{@+|HqSjOtaes+xFy3gUYbL2)glh zc+>bC%!fcC8{p)Sp#3L(N!=)@{b$XzOjE26=5FI))Hsi!S_ApLq!EPVWi*^zH5OB7 zk9^DOTl)Ht6uU9)C(}{9h#Pxnhd6|PE#vtu_#tKWZB`$Qx%Z-|F}|7&=YC^0kHKY$ zba?#k?C`uX7{;S0A-#;jdP}J92>tVZmyotMPLhChMyM#^nS~0j&>^J0okWe}%j2^K z4^GnnL$Agp{?bTB(?w%~#y5?uzNf4I{dwj3ElvIX!@bJ&+uHi4C#xIC>UZ+>&yLra ze^=8#E>S@Pbmh|emV|Ke;sV{HSlY^ zL*vg;zUm77>O`0JA+0f{^W$5O)qJb^-SZA~n8b^&L%pw6Vq;U)%tWtwH%0 zFrCB(N5ibXE7m^-bQNpIp8>raWdD&N;5^8zNPAg*FTde0W}_iky9V?A^ris}(J&Yd ze?@!ItYRx)QJnsSz)Bc4=@tzfv-<6PeZkNi)^8Tf3E2P?7)}_u5hmU#?4SOiHY^l- z_*^^Y7`A`)Vw0uD9c6Xe)GJ=pwf+d4ai_Zb$QoV(7Rnu$?>oWhW@-AfAnYd1(nQS z!O9BF&-_?Z7AVd%S@`~@2@})AA8BT)x%!)at=;mkz$Uq3?p4R^%n$no`Nekc-Q>rx z^A6{&iQdk0uDf%;LuL9A@zFh66La!}M zzPEOk*Wq&qmdz4af0Jh#f2KpSe13s<)_y;~ZL4#%Enh9voUpg~<@A$Bn{-a^D0DEt za{uE6Ro;}Zb4y>nzdU70?`NRXWB&hs$kKQBZ>EU3-t&Vhk^)5qeIYih^)DLmt#`R8 z7+j*{A+S_{b<;21+P{aDToxLfd9~ftWKJcQU%KaFejBbLp^y%V;Fwddii4&V{Qhst zdUwNX!`Sm{W>u7=EeU40mufSw@%SMlS+SQ^Yu|T?@a$Hp2~~P~tL4LiC(CbbUafTJ z6zhJLf0-&*w|`}@pY8wKP~F^OLW%z5#{Nye`u5fJ2XVRmykD17v#hUz_kz0VqBZ+U zGSU`E_cT4(wQ-KCLkoxQ?1^=*?=HByNY^NyIlu(WS-UN4G8TMIWxlI@qG)oimqZW4 zneQhVr>R`pbKSwjj8h^gY=3Nk{anTc(oY3`SUX+X^h>t%sHmT-g?-Cn?bYjTjlFMs zzOGLDcV?YI*BZOyyA7W-u%+e5HB0K>&k2~xc}hCuTywj3Sp4xdU#D|^yDXuj{=&}L zKi121J?GXFAI?3lFyG=Vv*QK-ajO&=@i39=_llqH+ZbmSyy@$vMe~e&-*{!r+oo5r zG0r=9aZT>!U%JaT-InjTAbsVd>g)e;iHozo^H>M&UVi)0<^`{Re*RPW&!&E!{rUON Y&wqYSB=>*h{Qvw)%lL8`fLAU808gxpFaQ7m literal 0 HcmV?d00001 From bceb1548116d324d3e54656bf44135f783ff0e63 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Sun, 19 Feb 2023 15:37:29 +0200 Subject: [PATCH 29/57] [submodule] Advance sonic-utilities pointer (#13882) Update sonic-utilities submodule pointer to include the following: * 33e85d37 [dhcp_relay] Remove add field of vlanid to DHCP_RELAY table while add vlan ([#2678](https://github.com/sonic-net/sonic-utilities/pull/2678)) * 36824e40 Add support of secure warm-boot ([#2532](https://github.com/sonic-net/sonic-utilities/pull/2532)) * 556d0c68 [doc] Add docs for dhcp_relay show/clear cli ([#2649](https://github.com/sonic-net/sonic-utilities/pull/2649)) * 2a6a06cf [portstat CLI] don't print reminder if use json format ([#2670](https://github.com/sonic-net/sonic-utilities/pull/2670)) * ee6d213f [generate_dump] Revert Revert generate_dump optimization PR's 2599, add fixes for empty /dump forder and symbolic links ([#2645](https://github.com/sonic-net/sonic-utilities/pull/2645)) * 784a15cc [vlan] Refresh dhcpv6_relay config while adding/deleting a vlan ([#2660](https://github.com/sonic-net/sonic-utilities/pull/2660)) * 7e94c5fa [GCU] protect loopback0 from deletion ([#2638](https://github.com/sonic-net/sonic-utilities/pull/2638)) Signed-off-by: dprital --- src/sonic-utilities | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-utilities b/src/sonic-utilities index 9126e7f8ab66..33e85d37f6ab 160000 --- a/src/sonic-utilities +++ b/src/sonic-utilities @@ -1 +1 @@ -Subproject commit 9126e7f8ab66427096b16c6e305d075767be49eb +Subproject commit 33e85d37f6abd4e7707d4c2436c9014239ce8d06 From cac95c2b4a37dc747cc8bf5ebeb71ad0a9d5aa6d Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Mon, 20 Feb 2023 21:24:26 +0800 Subject: [PATCH 30/57] Add PYTHON3_SWSSCOMMON as build time dependency to Mellanox platform API (#13847) - Why I did it Add PYTHON3_SWSSCOMMON as build time dependency to Mellanox platform API to avoid issue like: 19:34:11 ImportError while loading conftest '/sonic/platform/mellanox/mlnx-platform-api/tests/conftest.py'. 19:34:11 tests/conftest.py:28: in 19:34:11 from sonic_platform import utils 19:34:11 sonic_platform/__init__.py:18: in 19:34:11 from sonic_platform import * 19:34:11 sonic_platform/platform.py:28: in 19:34:11 raise ImportError(str(e) + "- required module not found") 19:34:11 E ImportError: No module named 'swsscommon'- required module not found- required module not found 19:34:11 [ FAIL LOG END ] [ target/python-wheels/bullseye/mlnx_platform_api-1.0-py3-none-any.whl ] The issue only happens when calling below command: make target/python-wheels/bullseye/mlnx_platform_api-1.0-py3-none-any.whl - How I did it Add PYTHON3_SWSSCOMMON as build time dependency to Mellanox platform API - How to verify it Run build --- platform/mellanox/mlnx-platform-api.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/platform/mellanox/mlnx-platform-api.mk b/platform/mellanox/mlnx-platform-api.mk index ecd8b8532e6d..a8846e26f855 100644 --- a/platform/mellanox/mlnx-platform-api.mk +++ b/platform/mellanox/mlnx-platform-api.mk @@ -21,6 +21,7 @@ SONIC_PLATFORM_API_PY3 = mlnx_platform_api-1.0-py3-none-any.whl $(SONIC_PLATFORM_API_PY3)_SRC_PATH = $(PLATFORM_PATH)/mlnx-platform-api $(SONIC_PLATFORM_API_PY3)_PYTHON_VERSION = 3 $(SONIC_PLATFORM_API_PY3)_DEPENDS = $(SONIC_PY_COMMON_PY3) $(SONIC_PLATFORM_COMMON_PY3) $(SONIC_CONFIG_ENGINE_PY3) $(SONIC_PLATFORM_API_PY2) +$(SONIC_PLATFORM_API_PY3)_DEBS_DEPENDS = $(PYTHON3_SWSSCOMMON) SONIC_PYTHON_WHEELS += $(SONIC_PLATFORM_API_PY3) export mlnx_platform_api_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY3))" From b349051e77d621a1268ad5764cba63c4b8f2c2ef Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Tue, 21 Feb 2023 12:47:44 +0800 Subject: [PATCH 31/57] [Build] Clean up the debian preference config file (#13885) Why I did it Support to upgrade packages, do better cleanup after the build. How I did it Remove the no use preference version control file after the build. How to verify it --- src/sonic-build-hooks/scripts/post_run_cleanup | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sonic-build-hooks/scripts/post_run_cleanup b/src/sonic-build-hooks/scripts/post_run_cleanup index 5e4ec23aec79..8fcc43c57e8d 100755 --- a/src/sonic-build-hooks/scripts/post_run_cleanup +++ b/src/sonic-build-hooks/scripts/post_run_cleanup @@ -38,3 +38,4 @@ set_reproducible_mirrors -d # Remove the version deb preference rm -f $VERSION_DEB_PREFERENCE +rm -f /etc/apt/preferences.d/01-versions-deb From 331b97e2aa9dd4a9289eaa075b1aca6986ca78a4 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Tue, 21 Feb 2023 14:14:29 +0800 Subject: [PATCH 32/57] [Mellanox] Fix issue: cannot find label port for logical port when logical port number is larger than 64 (#13710) - Why I did it sfp_event.py gets a PMPE message when a cable event is available. In PMPE message, there is no label port available. Current sfp_event.py is using sx_api_port_device_get to get 64 logical ports attributes, and find the label port from those 64 attributes. However, if there are more than 64 ports, sfp_event.py might not be able to find the label port and drop the PMPE message. - How I did it Don't use hardcoded 64, get logical port number instead. - How to verify it Manual test --- .../sonic_platform/sfp_event.py | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py index eec88e1786df..c390e9a4d341 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/sfp_event.py @@ -332,11 +332,9 @@ def on_pmpe(self, fd_p): pkt = new_uint8_t_arr(pkt_size) recv_info_p = new_sx_receive_info_t_p() pmpe_t = sx_event_pmpe_t() - port_attributes_list = new_sx_port_attributes_t_arr(64) port_cnt_p = new_uint32_t_p() - uint32_t_p_assign(port_cnt_p,64) + uint32_t_p_assign(port_cnt_p, 0) label_port_list = [] - label_port = None module_state = 0 rc = sx_lib_host_ifc_recv(fd_p, pkt, pkt_size_p, recv_info_p) @@ -352,31 +350,44 @@ def on_pmpe(self, fd_p): module_state = pmpe_t.module_state error_type = pmpe_t.error_type module_id = pmpe_t.module_id - slot_id = pmpe_t.slot_id # For non-modular chassis, it should return 0 + slot_id = pmpe_t.slot_id # For non-modular chassis, it should return 0 if module_state == SDK_SFP_STATE_ERR: logger.log_error("Receive PMPE error event on module {}: status {} error type {}".format(module_id, module_state, error_type)) elif module_state == SDK_SFP_STATE_DIS: - logger.log_info("Receive PMPE disable event on module {}: status {}".format(module_id, module_state)) + logger.log_notice("Receive PMPE disable event on module {}: status {}".format(module_id, module_state)) elif module_state == SDK_SFP_STATE_IN or module_state == SDK_SFP_STATE_OUT: - logger.log_info("Receive PMPE plug in/out event on module {}: status {}".format(module_id, module_state)) + logger.log_notice("Receive PMPE plug in/out event on module {}: status {}".format(module_id, module_state)) elif module_state == SDK_SFP_STATE_UNKNOWN: unknown = True else: logger.log_error("Receive PMPE unknown event on module {}: status {}".format(module_id, module_state)) - for i in range(port_list_size): - logical_port = sx_port_log_id_t_arr_getitem(logical_port_list, i) - rc = sx_api_port_device_get(self.handle, 1 , 0, port_attributes_list, port_cnt_p) + # Call sx_api_port_device_get with port_cnt_p=0, SDK will return the logical port number + rc = sx_api_port_device_get(self.handle, 1, 0, None, port_cnt_p) + if rc != SX_STATUS_SUCCESS: + logger.log_error("Failed to get logical port number") + status = False + else: port_cnt = uint32_t_p_value(port_cnt_p) - for i in range(port_cnt): - port_attributes = sx_port_attributes_t_arr_getitem(port_attributes_list,i) - if port_attributes.log_port == logical_port: - label_port = slot_id * DeviceDataManager.get_linecard_max_port_count() + port_attributes.port_mapping.module_port - break - - if label_port is not None: - label_port_list.append(label_port) + port_attributes_list = new_sx_port_attributes_t_arr(port_cnt) + rc = sx_api_port_device_get(self.handle, 1, 0, port_attributes_list, port_cnt_p) + if rc != SX_STATUS_SUCCESS: + logger.log_error("Failed to get logical port attributes") + status = False + else: + for i in range(port_list_size): + label_port = None + logical_port = sx_port_log_id_t_arr_getitem(logical_port_list, i) + for j in range(port_cnt): + port_attributes = sx_port_attributes_t_arr_getitem(port_attributes_list,j) + if port_attributes.log_port == logical_port: + label_port = slot_id * DeviceDataManager.get_linecard_max_port_count() + port_attributes.port_mapping.module_port + break + + if label_port is not None: + label_port_list.append(label_port) + delete_sx_port_attributes_t_arr(port_attributes_list) if unknown: SFP_ports_with_unknown_event = set(label_port_list) - self.RJ45_port_set @@ -389,7 +400,9 @@ def on_pmpe(self, fd_p): delete_uint32_t_p(pkt_size_p) delete_uint8_t_arr(pkt) delete_sx_receive_info_t_p(recv_info_p) - delete_sx_port_attributes_t_arr(port_attributes_list) delete_uint32_t_p(port_cnt_p) + if not label_port_list: + logger.log_error('Dropping PMPE event due to label port not found') + return status, label_port_list, module_state, error_type From fd122efb4005be9bb34f36dd009463d0a954d26c Mon Sep 17 00:00:00 2001 From: Lior Avramov <73036155+liorghub@users.noreply.github.com> Date: Tue, 21 Feb 2023 08:52:51 +0200 Subject: [PATCH 33/57] [Mellanox] [ECMP calculator] Add support for 4600/4600C/2201 platforms with different interface naming method (#13814) - Why I did it Add support for systems 4600/4600C/2201 that are using sonic interface names aligned to 4 instead of 8 (which is the max number of lanes per port). Improve DB access calls, now we use Python library functions. - How I did it Use addition information taken from Config DB in order to create map from SDK logical index to sonic interface name. - How to verify it Run ECMP calculator on 4600, 4600C and 2201 platforms. --- .../ecmp_calculator/ecmp_calc.py | 48 ++++++----- .../docker-syncd-mlnx/lib/port_utils.py | 83 ++++++++++++++++--- 2 files changed, 99 insertions(+), 32 deletions(-) diff --git a/platform/mellanox/docker-syncd-mlnx/ecmp_calculator/ecmp_calc.py b/platform/mellanox/docker-syncd-mlnx/ecmp_calculator/ecmp_calc.py index 280275529b73..2fbcef86993e 100755 --- a/platform/mellanox/docker-syncd-mlnx/ecmp_calculator/ecmp_calc.py +++ b/platform/mellanox/docker-syncd-mlnx/ecmp_calculator/ecmp_calc.py @@ -23,14 +23,18 @@ PORT, VPORT, VLAN, SX_ENTRY_NOT_FOUND from packet_scheme import PACKET_SCHEME from port_utils import sx_get_ports_map, is_lag +from swsscommon.swsscommon import ConfigDBConnector, DBConnector, Table IP_VERSION_IPV4 = 1 IP_VERSION_IPV6 = 2 -PORT_CHANNEL_IDX = 1 +PORT_CHANNEL_IDX = 0 VRF_NAME_IDX = 1 IP_VERSION_MAX_MASK_LEN = {IP_VERSION_IPV4: 32, IP_VERSION_IPV6: 128} +APPL_DB_NAME = 'APPL_DB' INTF_TABLE = 'INTF_TABLE' +VRF_TABLE = 'VRF_TABLE' +LAG_MEMBER_TABLE = 'LAG_MEMBER_TABLE' HASH_CALC_PATH = '/usr/bin/sx_hash_calculator' HASH_CALC_INPUT_FILE = "/tmp/hash_calculator_input.json" HASH_CALC_OUTPUT_FILE = "/tmp/hash_calculator_output.json" @@ -113,6 +117,8 @@ def __init__(self): self.egress_ports = [] self.debug = False + self.config_db = ConfigDBConnector() + self.appl_db = DBConnector(APPL_DB_NAME, 0) self.open_sdk_connection() self.init_ports_map() self.get_active_vrids() @@ -137,7 +143,7 @@ def debug_print(self, *args, **kwargs): print(*args, **kwargs) def init_ports_map(self): - self.ports_map = sx_get_ports_map(self.handle) + self.ports_map = sx_get_ports_map(self.handle, self.config_db) def validate_ingress_port(self, interface): if interface not in self.ports_map.values(): @@ -156,16 +162,12 @@ def validate_args(self, interface, packet, vrf, debug): if not self.validate_vrf(): raise ValueError("VRF validation failed: VRF {} does not exist".format(self.user_vrf)) - def validate_vrf(self): - query_output = exec_cmd(['/usr/bin/redis-cli', '-n', '0', 'keys','*VRF*']).strip() - if not query_output: - return False + def validate_vrf(self): + vrf_table = Table(self.appl_db, VRF_TABLE) + vrf_table_keys = vrf_table.getKeys() - vrf_entries= query_output.split('\n') - for entry in vrf_entries: - vrf = entry.split(':')[VRF_NAME_IDX] - if vrf == self.user_vrf: - return True + if self.user_vrf in vrf_table_keys: + return True return False @@ -289,26 +291,30 @@ def print_egress_port(self): def is_port_bind_to_user_vrf(self, port_type, port, vlan_id = 0): if port_type == PORT: # INTF_TABLE:Ethernet0 - entry = '{}:{}'.format(INTF_TABLE, port) + entry = '{}'.format(port) elif port_type == VPORT: # INTF_TABLE:Ethernet0.300 - entry = '{}:{}.{}'.format(INTF_TABLE, port, vlan_id) + entry = '{}.{}'.format(port, vlan_id) elif port_type == VLAN: # INTF_TABLE:Vlan300 - entry = '{}:Vlan{}'.format(INTF_TABLE, vlan_id) + entry = 'Vlan{}'.format(vlan_id) + + vrf_table = Table(self.appl_db, INTF_TABLE) + (_, port_vrf) = vrf_table.hget(entry, 'vrf_name') - port_vrf = exec_cmd(['/usr/bin/redis-cli', '-n', '0', 'hget', entry, 'vrf_name']) if self.user_vrf == port_vrf.strip(): return True return False # Get port-channel name for given port-channel member port - def get_port_channel_name(self, port): - query_output = exec_cmd(['/usr/bin/redis-cli', '-n', '0', 'keys','*LAG_MEMBER_TABLE*']) - for line in query_output.split('\n'): - if str(port) in line: - port_channel = line.split(':')[PORT_CHANNEL_IDX] + def get_port_channel_name(self, port): + lag_member_table = Table(self.appl_db, LAG_MEMBER_TABLE) + lag_member_table_keys = lag_member_table.getKeys() + + for key in lag_member_table_keys: + if port in key: + port_channel = key.split(':')[PORT_CHANNEL_IDX] return port_channel raise KeyError("Failed to get port-channel name for interface {}".format(port)) @@ -368,7 +374,7 @@ def get_lag_member(self, logical, flood_case = False): member_index = self.get_lag_member_index(len(lag_members), flood_case) lag_member = lag_members[member_index] - self.debug_print("Lag member from which trafic will egress: {}".format(lag_member)) + self.debug_print("Lag members: {}\nLag member from which trafic will egress: {}".format(lag_members, lag_member)) return lag_member def call_hash_calculator(self, input_dict): diff --git a/platform/mellanox/docker-syncd-mlnx/lib/port_utils.py b/platform/mellanox/docker-syncd-mlnx/lib/port_utils.py index cce63298cf9a..f00d22d5426c 100755 --- a/platform/mellanox/docker-syncd-mlnx/lib/port_utils.py +++ b/platform/mellanox/docker-syncd-mlnx/lib/port_utils.py @@ -2,27 +2,86 @@ from python_sdk_api.sx_api import * import inspect +import re DEVICE_ID = 1 SWITCH_ID = 0 +PORT_TABLE = 'PORT' +FIRST_LANE_INDEX = 0 ETHERNET_PREFIX = 'Ethernet' -ASIC_MAX_LANES = {SX_CHIP_TYPE_SPECTRUM: 4, SX_CHIP_TYPE_SPECTRUM2: 4, - SX_CHIP_TYPE_SPECTRUM3: 8, SX_CHIP_TYPE_SPECTRUM4: 8} -def sx_get_ports_map(handle): +def get_ports_lanes_map(config_db): + """ Get lane number of the first lane in use by port for all existing ports. + + Args: + config_db (ConfigDBConnector): Config DB connector + + Returns: + dict: key is lane number of the first lane in use by port, value is SONiC port index (124 for Ethernet124) + """ + lanes_map = {} + config_db.connect() + + ports_table = config_db.get_table(PORT_TABLE) + if ports_table is None: + raise Exception("Can't read {} table".format(PORT_TABLE)) + + ports_table_keys = config_db.get_keys(PORT_TABLE) + for port in ports_table_keys: + port_data = ports_table.get(port) + if port_data is not None: + lanes = port_data.get('lanes') + first_lane = lanes.split(',')[FIRST_LANE_INDEX] + port_idx = re.sub(r"\D", "", port) + lanes_map[int(first_lane)] = int(port_idx) + + return lanes_map + +def get_port_max_width(handle): + """ Get max number of lanes in port according to chip type + + Args: + handle (sx_api_handle_t): SDK handle + + Returns: + int: max lanes in port + """ + # Get chip type + chip_type = sx_get_chip_type(handle) + + limits = rm_resources_t() + modes = rm_modes_t() + + rc = rm_chip_limits_get(chip_type, limits) + sx_check_rc(rc) + max_width = limits.port_map_width_max + + # SPC2 ports have 8 lanes but SONiC is using 4 + if chip_type == SX_CHIP_TYPE_SPECTRUM2: + max_width = 4 + + return max_width + +def sx_get_ports_map(handle, config_db): """ Get ports map from SDK logical index to SONiC index Args: handle (sx_api_handle_t): SDK handle - + config_db (ConfigDBConnector): Config DB connector + Returns: - dict : Dictionary of ports indices. Key is SDK logical index, value is SONiC index (4 for Ethernet4) + dict: key is SDK logical index, value is SONiC index (4 for Ethernet4) """ try: ports_map = {} + port_attributes_list = None + port_cnt_p = None - # Get chip type - chip_type = sx_get_chip_type(handle) + # Get lanes map + lanes_map = get_ports_lanes_map(config_db) + + # Get max number of lanes in port + port_max_width = get_port_max_width(handle) # Get ports count port_cnt_p = new_uint32_t_p() @@ -45,10 +104,12 @@ def sx_get_ports_map(handle): continue # Calculate sonic index (sonic index=4 for Ethernet4) - lane_index = get_lane_index(lane_bmap, ASIC_MAX_LANES[chip_type]) + lane_index = get_lane_index(lane_bmap, port_max_width) assert lane_index != -1, "Failed to calculate port index" - sonic_index = label_port * ASIC_MAX_LANES[chip_type] + lane_index; + first_lane = label_port * port_max_width + lane_index; + sonic_index = lanes_map[first_lane] + sonic_interface = ETHERNET_PREFIX + str(sonic_index) ports_map[logical_port] = sonic_interface @@ -65,7 +126,7 @@ def sx_get_chip_type(handle): handle (sx_api_handle_t): SDK handle Returns: - sx_chip_types_t : Chip type + sx_chip_types_t: Chip type """ try: device_info_cnt_p = new_uint32_t_p() @@ -95,7 +156,7 @@ def get_lane_index(lane_bmap, max_lanes): max_lanes (int): Max lanes in module Returns: - int : index of the first bit set to 1 in lane_bmap + int: index of the first bit set to 1 in lane_bmap """ for lane_idx in range(0, max_lanes): if (lane_bmap & 0x1 == 1): From 38c9d3a53d7fbc64e8eed0ac4801523932d20cde Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Mon, 20 Feb 2023 23:45:16 -0800 Subject: [PATCH 34/57] [Arista] update sensors.conf to ignore sensors (#12529) Why I did it The sensors and sensord processes were reporting data on unused sensors. This lead to ALARM messages or erroneous values that could be misinterpreted. How I did it Ignore the affected sensors in the sensors.conf How to verify it Check that there are no longer ALARM messages from sensord in the syslog or in the output of sensors --- device/arista/x86_64-arista_7050_qx32s/sensors.conf | 9 +++++++++ device/arista/x86_64-arista_7050cx3_32s/sensors.conf | 9 +++++++++ device/arista/x86_64-arista_7060_cx32s/sensors.conf | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/device/arista/x86_64-arista_7050_qx32s/sensors.conf b/device/arista/x86_64-arista_7050_qx32s/sensors.conf index 6030de90eea5..c130e4191274 100644 --- a/device/arista/x86_64-arista_7050_qx32s/sensors.conf +++ b/device/arista/x86_64-arista_7050_qx32s/sensors.conf @@ -11,6 +11,9 @@ bus "i2c-7" "SCD 0000:02:00.0 SMBus master 0 bus 5" chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" +chip "fam15h_power-pci-00c4" + ignore power1 + chip "max6658-i2c-2-4c" label temp1 "Board temp sensor" set temp1_max 55 @@ -34,7 +37,13 @@ chip "pmbus-i2c-6-58" label temp2 "Power supply 1 inlet temp sensor" label temp3 "Power supply 1 sensor" + ignore fan2 + ignore fan3 + chip "pmbus-i2c-5-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" label temp3 "Power supply 2 sensor" + + ignore fan2 + ignore fan3 diff --git a/device/arista/x86_64-arista_7050cx3_32s/sensors.conf b/device/arista/x86_64-arista_7050cx3_32s/sensors.conf index c63a526124d0..24798a802f98 100644 --- a/device/arista/x86_64-arista_7050cx3_32s/sensors.conf +++ b/device/arista/x86_64-arista_7050cx3_32s/sensors.conf @@ -10,6 +10,9 @@ bus "i2c-14" "SCD 0000:02:00.0 SMBus master 1 bus 4" chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" +chip "fam15h_power-pci-00c4" + ignore power1 + chip "max6658-i2c-2-4c" label temp1 "Cpu board temp sensor" set temp1_max 75 @@ -33,7 +36,13 @@ chip "pmbus-i2c-13-58" label temp2 "Power supply 1 inlet temp sensor" label temp3 "Power supply 1 sensor" + ignore fan2 + ignore fan3 + chip "pmbus-i2c-14-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" label temp3 "Power supply 2 sensor" + + ignore fan2 + ignore fan3 diff --git a/device/arista/x86_64-arista_7060_cx32s/sensors.conf b/device/arista/x86_64-arista_7060_cx32s/sensors.conf index 57e785881912..73349200ec5c 100644 --- a/device/arista/x86_64-arista_7060_cx32s/sensors.conf +++ b/device/arista/x86_64-arista_7060_cx32s/sensors.conf @@ -11,6 +11,9 @@ bus "i2c-7" "SCD 0000:02:00.0 SMBus master 0 bus 5" chip "k10temp-pci-00c3" label temp1 "Cpu temp sensor" +chip "fam15h_power-pci-00c4" + ignore power1 + chip "max6697-i2c-2-1a" label temp1 "Board sensor" set temp1_max 95 @@ -45,7 +48,13 @@ chip "pmbus-i2c-6-58" label temp2 "Power supply 1 inlet temp sensor" label temp3 "Power supply 1 exhaust temp sensor" + ignore fan2 + ignore fan3 + chip "pmbus-i2c-5-58" label temp1 "Power supply 2 hotspot sensor" label temp2 "Power supply 2 inlet temp sensor" label temp3 "Power supply 2 exhaust temp sensor" + + ignore fan2 + ignore fan3 From f6d3615bb9b9406373be30bad2bbd2150791eda9 Mon Sep 17 00:00:00 2001 From: Junchao-Mellanox <57339448+Junchao-Mellanox@users.noreply.github.com> Date: Wed, 22 Feb 2023 01:40:16 +0800 Subject: [PATCH 35/57] [Mellanox] Check system eeprom existence in a retry manner (#13884) - Why I did it On Mellanox platform, system EEPROM is a soft link provided by hw-management. There is chance that config-setup service accessing the EEPROM before hw-management creating it. It causes errors. The PR is aim to fix it. - How I did it Waiting EEPROM creation in platform API up to 10 seconds. - How to verify it Manual test --- .../sonic_platform/eeprom.py | 8 +++++--- .../mlnx-platform-api/sonic_platform/utils.py | 19 +++++++++++++++++++ .../mlnx-platform-api/tests/test_eeprom.py | 3 ++- .../mlnx-platform-api/tests/test_utils.py | 16 ++++++++++++++++ 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/eeprom.py b/platform/mellanox/mlnx-platform-api/sonic_platform/eeprom.py index 17f14b04430f..f5b13f0ae4a5 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/eeprom.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/eeprom.py @@ -31,13 +31,13 @@ raise ImportError (str(e) + "- required module not found") from .device_data import DeviceDataManager -from .utils import default_return, is_host +from .utils import default_return, is_host, wait_until logger = Logger() # # this is mlnx-specific -# should this be moved to chass.py or here, which better? +# should this be moved to chassis.py or here, which better? # EEPROM_SYMLINK = "/var/run/hw-management/eeprom/vpd_info" platform_name = DeviceDataManager.get_platform_name() @@ -51,10 +51,12 @@ os.makedirs(os.path.dirname(EEPROM_SYMLINK)) subprocess.check_call(['/usr/bin/xxd', '-r', '-p', 'syseeprom.hex', EEPROM_SYMLINK], cwd=platform_path) +WAIT_EEPROM_READY_SEC = 10 + class Eeprom(eeprom_tlvinfo.TlvInfoDecoder): def __init__(self): - if not os.path.exists(EEPROM_SYMLINK): + if not wait_until(predict=os.path.exists, timeout=WAIT_EEPROM_READY_SEC, path=EEPROM_SYMLINK): logger.log_error("Nowhere to read syseeprom from! No symlink found") raise RuntimeError("No syseeprom symlink found") diff --git a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py index 634078c9a077..83063b5c368e 100644 --- a/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py +++ b/platform/mellanox/mlnx-platform-api/sonic_platform/utils.py @@ -19,6 +19,7 @@ import subprocess import json import sys +import time import os from sonic_py_common import device_info from sonic_py_common.logger import Logger @@ -266,3 +267,21 @@ def extract_RJ45_ports_index(): return RJ45_port_index_list if bool(RJ45_port_index_list) else None + +def wait_until(predict, timeout, interval=1, *args, **kwargs): + """Wait until a condition become true + + Args: + predict (object): a callable such as function, lambda + timeout (int): wait time in seconds + interval (int, optional): interval to check the predict. Defaults to 1. + + Returns: + _type_: _description_ + """ + while timeout > 0: + if predict(*args, **kwargs): + return True + time.sleep(interval) + timeout -= interval + return False diff --git a/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py b/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py index 5f0a30dbf519..b07f9327d098 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_eeprom.py @@ -49,6 +49,7 @@ def test_chassis_eeprom(self, mock_eeprom_info): assert chassis.get_serial() == 'MT2019X13878' assert chassis.get_system_eeprom_info() == mock_eeprom_info.return_value + @patch('sonic_platform.eeprom.wait_until', MagicMock(return_value=False)) def test_eeprom_init(self): # Test symlink not exist, there is an exception with pytest.raises(RuntimeError): @@ -83,7 +84,7 @@ def side_effect(key, field): @patch('os.path.exists', MagicMock(return_value=True)) @patch('os.path.islink', MagicMock(return_value=True)) - def test_get_system_eeprom_info_from_hardware(self): + def test_get_system_eeprom_info_from_hardware(self): eeprom = Eeprom() eeprom.p = os.path.join(test_path, 'mock_eeprom_data') eeprom._redis_hget = MagicMock() diff --git a/platform/mellanox/mlnx-platform-api/tests/test_utils.py b/platform/mellanox/mlnx-platform-api/tests/test_utils.py index c4c8d0c000a9..5e01fc70dc0e 100644 --- a/platform/mellanox/mlnx-platform-api/tests/test_utils.py +++ b/platform/mellanox/mlnx-platform-api/tests/test_utils.py @@ -18,6 +18,8 @@ import os import pytest import sys +import threading +import time if sys.version_info.major == 3: from unittest import mock else: @@ -125,3 +127,17 @@ def test_run_command(self): def test_extract_RJ45_ports_index(self): rj45_list = utils.extract_RJ45_ports_index() assert rj45_list is None + + def test_wait_until(self): + values = [] + assert utils.wait_until(lambda: len(values) == 0, timeout=1) + assert not utils.wait_until(lambda: len(values) > 0, timeout=1) + + def thread_func(items): + time.sleep(3) + items.append(0) + + t = threading.Thread(target=thread_func, args=(values, )) + t.start() + assert utils.wait_until(lambda: len(values) > 0, timeout=5) + t.join() From cf4a1724866cc5b2911604370081f709f98271c8 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Tue, 21 Feb 2023 14:22:04 -0500 Subject: [PATCH 36/57] [Nokia][sonic-platform] Update Nokia sonic-platform submodule (#13522) d768d19 Remove warning msg when a transceiver op takes > 200ms 7451689 Support the module.py in IMM to query the Supervisor card eeprom info Signed-off-by: mlok --- platform/broadcom/sonic-platform-modules-nokia | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/broadcom/sonic-platform-modules-nokia b/platform/broadcom/sonic-platform-modules-nokia index 81a9c77a22bd..d768d199bdd0 160000 --- a/platform/broadcom/sonic-platform-modules-nokia +++ b/platform/broadcom/sonic-platform-modules-nokia @@ -1 +1 @@ -Subproject commit 81a9c77a22bd4147e4041a7359e211d7f51b60a8 +Subproject commit d768d199bdd0247135f2135214a92d81953d4795 From 2c22d9affca4391c1af2a7923c816b398be9aef3 Mon Sep 17 00:00:00 2001 From: "Marty Y. Lok" <76118573+mlok-nokia@users.noreply.github.com> Date: Tue, 21 Feb 2023 14:23:22 -0500 Subject: [PATCH 37/57] [Chassis][multiasic] Fix the sonic-db-cli core files issue on multiasic platform after the c++ implementation of sonic-db-cli (#13207) Fixe #12047. After the c++ implementation of the sonic-db-cli, sonic-db-cli PING command tries to initialize the global database for all instances database starting. If all instance database-config.json are not ready yet. it will crash and generate core file. PR sonic-net/sonic-swss-common#701 only fix the crash and the process abortion. Signed-off-by: mlok --- files/build_templates/docker_image_ctl.j2 | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/files/build_templates/docker_image_ctl.j2 b/files/build_templates/docker_image_ctl.j2 index ec94fd420303..cb48e6b5f924 100644 --- a/files/build_templates/docker_image_ctl.j2 +++ b/files/build_templates/docker_image_ctl.j2 @@ -155,11 +155,13 @@ function waitForAllInstanceDatabaseConfigJsonFilesReady() fi done done - fi + fi + # Delay a second to allow all instance database_config.json files to be completely generated and fully accessible. + # This delay is needed to make sure that the database_config.json files are correctly rendered from j2 template + # files ( renderning takes some time ) + sleep 1 fi } -# delay a second to allow the file to be fully accessible -sleep 1 {%- endif %} function postStartAction() @@ -225,6 +227,10 @@ function postStartAction() # then we catch python exception of file not valid # that comes to syslog which is unwanted so wait till database # config is ready and then ping + # sonic-db-cli try to initialize the global database. If in multiasic platform, inital global + # database will try to access to all other instance database-config.json. If other instance + # database-config.json files are not ready yet, it will generate the sonic-db-cli core files. + waitForAllInstanceDatabaseConfigJsonFilesReady until [[ ($(docker exec -i database$DEV pgrep -x -c supervisord) -gt 0) && ($($SONIC_DB_CLI PING | grep -c PONG) -gt 0) && ($(docker exec -i database$DEV sonic-db-cli PING | grep -c PONG) -gt 0) ]]; do sleep 1; @@ -234,11 +240,7 @@ function postStartAction() mv $WARM_DIR/dump.rdb $WARM_DIR/dump.rdb.old else # If there is a config_db.json dump file, load it. - if [ -r /etc/sonic/config_db$DEV.json ]; then - - # For multi-asic, all /var/run/redis$DEV/sonic-db/database_config.json need to ready - # for loading config with --write-to-db - waitForAllInstanceDatabaseConfigJsonFilesReady + if [ -r /etc/sonic/config_db$DEV.json ]; then if [ -r /etc/sonic/init_cfg.json ]; then $SONIC_CFGGEN -j /etc/sonic/init_cfg.json -j /etc/sonic/config_db$DEV.json --write-to-db @@ -678,4 +680,4 @@ case "$1" in echo "Usage: $0 {start namespace(optional)|wait namespace(optional)|stop namespace(optional)}" exit 1 ;; -esac \ No newline at end of file +esac From bc2cb46ec50c31b8dc10688ad58742a879feb019 Mon Sep 17 00:00:00 2001 From: judyjoseph <53951155+judyjoseph@users.noreply.github.com> Date: Tue, 21 Feb 2023 11:35:38 -0800 Subject: [PATCH 38/57] Voq Chassis: Add the Recirc ports to the INTERFACES table to make it routed intf (#13779) * VOQ: Add the Recirc ports to the INTERFACES table to make it routed intf * Add a test to cover Recir port generation in INTERFACE table --- src/sonic-config-engine/minigraph.py | 5 ++++- src/sonic-config-engine/tests/test_cfggen.py | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index e5f6869b0a58..094d62bf2674 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1749,12 +1749,15 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if inband_port in ports.keys(): ports[inband_port]['admin_status'] = 'up' - # bring up the recirc port for voq chassis + # bring up the recirc port for voq chassis, Set it as routed interface for port, port_attributes in ports.items(): port_role = port_attributes.get('role', None) if port_role == 'Rec': ports[port]['admin_status'] = 'up' + #Add the Recirc ports to the INTERFACES table to make it routed intf + results['INTERFACE'].update({port : {}}) + results['PORT'] = ports results['CONSOLE_PORT'] = console_ports diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index f1704250539a..9b1d0b721983 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -959,6 +959,14 @@ def test_minigraph_voq_recirc_ports(self): "admin_status": "up" }) + argument = ["-j", self.macsec_profile, "-m", self.sample_graph_voq, "-p", self.voq_port_config, "--var-json", "INTERFACE"] + output = self.run_script(argument) + output_dict = utils.to_dict(output.strip()) + self.assertDictEqual( + output_dict['Ethernet-Rec0'], + {} + ) + def test_minigraph_dhcp(self): argument = ['-m', self.sample_graph_simple_case, '-p', self.port_config, '-v', 'DHCP_RELAY'] output = self.run_script(argument) From 5e4826ebf791f3e784ee77c9a36f78e79fd657aa Mon Sep 17 00:00:00 2001 From: xumia <59720581+xumia@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:18:09 +0800 Subject: [PATCH 39/57] [Ci] Support to use the same snapshot for all platform builds (#13913) IBGP --- .../azure-pipelines-UpgrateVersion.yml | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml index 33f802b0d56c..1d2a0fbae6dc 100644 --- a/.azure-pipelines/azure-pipelines-UpgrateVersion.yml +++ b/.azure-pipelines/azure-pipelines-UpgrateVersion.yml @@ -42,12 +42,32 @@ parameters: - mellanox stages: +- stage: Prepare + jobs: + - job: Prepare + steps: + - script: | + DEFAULT_MIRROR_URL_PREFIX=http://packages.trafficmanager.net + DEBIAN_TIMESTAMP=$(curl $DEFAULT_MIRROR_URL_PREFIX/snapshot/debian/latest/timestamp) + DEBIAN_SECURITY_TIMESTAMP=$(curl $DEFAULT_MIRROR_URL_PREFIX/snapshot/debian-security/latest/timestamp) + echo "DEBIAN_TIMESTAMP=$DEBIAN_TIMESTAMP, DEBIAN_SECURITY_TIMESTAMP=$DEBIAN_SECURITY_TIMESTAMP" + echo "##vso[task.setvariable variable=DEBIAN_TIMESTAMP;isOutput=true]$DEBIAN_TIMESTAMP" + echo "##vso[task.setvariable variable=DEBIAN_SECURITY_TIMESTAMP;isOutput=true]$DEBIAN_SECURITY_TIMESTAMP" + name: SetVersions + displayName: 'Set snapshot versions' - stage: Build + dependsOn: Prepare variables: - name: CACHE_MODE value: none - name: VERSION_CONTROL_OPTIONS value: 'SONIC_VERSION_CONTROL_COMPONENTS=' + - name: SKIP_CHECKOUT + value: true + - name: DEBIAN_TIMESTAMP + value: $[ stageDependencies.Prepare.Prepare.outputs['SetVersions.DEBIAN_TIMESTAMP'] ] + - name: DEBIAN_SECURITY_TIMESTAMP + value: $[ stageDependencies.Prepare.Prepare.outputs['SetVersions.DEBIAN_SECURITY_TIMESTAMP'] ] - template: .azure-pipelines/template-variables.yml@buildimage jobs: - template: azure-pipelines-build.yml @@ -56,6 +76,21 @@ stages: buildOptions: '${{ variables.VERSION_CONTROL_OPTIONS }} ENABLE_DOCKER_BASE_PULL=n SONIC_BUILD_JOBS=$(nproc) ENABLE_IMAGE_SIGNATURE=y' preSteps: - template: .azure-pipelines/template-clean-sonic-slave.yml@buildimage + - checkout: self + submodules: recursive + fetchDepth: 0 + path: s + displayName: 'Checkout code' + - script: | + echo "DEBIAN_TIMESTAMP=$DEBIAN_TIMESTAMP, DEBIAN_SECURITY_TIMESTAMP=$DEBIAN_SECURITY_TIMESTAMP" + if [ "$MIRROR_SNAPSHOT" == y ]; then + mkdir -p target/versions/default/ + echo "debian==$DEBIAN_TIMESTAMP" > target/versions/default/versions-mirror + echo "debian-security==$DEBIAN_SECURITY_TIMESTAMP" >> target/versions/default/versions-mirror + cat target/versions/default/versions-mirror + fi + displayName: 'Set snapshot versions' + - stage: UpgradeVersions jobs: - job: UpgradeVersions From 5a2a95998c4cb63da17925e6dfd68ae3615466da Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Wed, 22 Feb 2023 13:00:06 +0800 Subject: [PATCH 40/57] [ci] Fix docker hang issue and change template reference branch (#13894) Why I did it Azure pipeline change. Use common template to make it easy to change common steps. Fix docker hang issue. How I did it --- .azure-pipelines/azure-pipelines-build.yml | 6 +++--- .azure-pipelines/azure-pipelines-image-template.yml | 4 ++-- .azure-pipelines/template-daemon.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.azure-pipelines/azure-pipelines-build.yml b/.azure-pipelines/azure-pipelines-build.yml index ba3227a349d0..92897231dab9 100644 --- a/.azure-pipelines/azure-pipelines-build.yml +++ b/.azure-pipelines/azure-pipelines-build.yml @@ -108,8 +108,8 @@ jobs: platform_rpc: nephos buildSteps: - - template: template-skipvstest.yml - - template: template-daemon.yml + - template: .azure-pipelines/template-skipvstest.yml@buildimage + - template: .azure-pipelines/template-daemon.yml@buildimage - bash: | set -ex if [ $(GROUP_NAME) == vs ]; then @@ -169,4 +169,4 @@ jobs: make $BUILD_OPTIONS target/sonic-$(GROUP_NAME).bin fi displayName: "Build sonic image" - - template: check-dirty-version.yml + - template: .azure-pipelines/check-dirty-version.yml@buildimage diff --git a/.azure-pipelines/azure-pipelines-image-template.yml b/.azure-pipelines/azure-pipelines-image-template.yml index 67d75abc6887..d4d2c96e1c61 100644 --- a/.azure-pipelines/azure-pipelines-image-template.yml +++ b/.azure-pipelines/azure-pipelines-image-template.yml @@ -25,7 +25,7 @@ jobs: jobFilters: ${{ parameters.jobFilters }} jobVariables: ${{ parameters.jobVariables }} preSteps: - - template: cleanup.yml + - template: .azure-pipelines/cleanup.yml@buildimage - ${{ parameters.preSteps }} - script: | if [ -n "$(CACHE_MODE)" ] && echo $(PLATFORM_AZP) | grep -E -q "^(vs|broadcom|mellanox|marvell-armhf)$"; then @@ -67,6 +67,6 @@ jobs: artifactName: 'sonic-buildimage.$(GROUP_NAME)$(GROUP_EXTNAME)' publishPrefix: '$(Build.DefinitionName)/$(Build.SourceBranchName)/$(GROUP_NAME)' - ${{ parameters.postSteps }} - - template: cleanup.yml + - template: .azure-pipelines/cleanup.yml@buildimage jobGroups: ${{ parameters.jobGroups }} buildSteps: ${{ parameters.buildSteps }} diff --git a/.azure-pipelines/template-daemon.yml b/.azure-pipelines/template-daemon.yml index b0915557ced2..903e10c2d5c6 100644 --- a/.azure-pipelines/template-daemon.yml +++ b/.azure-pipelines/template-daemon.yml @@ -5,7 +5,7 @@ steps: do sleep 120 now=$(date +%s) - pids=$(ps -C docker -o pid,etime,args | grep "docker build" | cut -d" " -f1) + pids=$(ps -C docker -o pid,etime,args | grep "docker build" | cut -d" " -f2) for pid in $pids do start=$(date --date="$(ls -dl /proc/$pid --time-style full-iso | awk '{print$6,$7}')" +%s) From 5ad78abea0302585e646081898e1c3fa4ecd1aee Mon Sep 17 00:00:00 2001 From: Andriy Yurkiv <70649192+ayurkiv-nvda@users.noreply.github.com> Date: Wed, 22 Feb 2023 20:25:54 +0200 Subject: [PATCH 41/57] [Dual-ToR] add default value for ACL rule for mellanox platform (#13547) - Why I did it Need to add the possibility to choose between dropping packets (using ACL) on ingress or egress in Dual ToR scenario - How I did it Add new attribute "mux_tunnel_ingress_acl" to SYSTEM_DEFAULTS table - How to verify it check that new attribute exists in redis: admin@sonic:~$ redis-cli -n 4 127.0.0.1:6379[4]> HGETALL SYSTEM_DEFAULTS|mux_tunnel_ingress_acl 1."state" 2."false" Signed-off-by: Andriy Yurkiv --- files/build_templates/init_cfg.json.j2 | 11 +++++++++++ .../tests/files/sample_config_db.json | 4 ++++ .../tests_config/system_defaults.json | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/files/build_templates/init_cfg.json.j2 b/files/build_templates/init_cfg.json.j2 index b490dc424b0a..39e180a1179d 100644 --- a/files/build_templates/init_cfg.json.j2 +++ b/files/build_templates/init_cfg.json.j2 @@ -133,5 +133,16 @@ "digits_class": "true", "special_class": "true" } + }, + "SYSTEM_DEFAULTS" : { +{%- if include_mux == "y" %} + "mux_tunnel_egress_acl": { +{%- if sonic_asic_platform == "mellanox" %} + "status": "enabled" +{% else %} + "status": "disabled" +{% endif %} + } +{% endif %} } } diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 1d0d04b3f9b5..a05b35c48295 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2227,6 +2227,10 @@ "SYSTEM_DEFAULTS": { "tunnel_qos_remap": { "status": "enabled" + }, + "mux_tunnel_egress_acl": + { + "status": "enabled" } }, "LOSSLESS_TRAFFIC_PATTERN": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json index a8ccc13c099d..da9a3e752bf7 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/system_defaults.json @@ -6,6 +6,10 @@ { "name": "tunnel_qos_remap", "status": "enabled" + }, + { + "name": "mux_tunnel_egress_acl", + "status": "enabled" } ] } @@ -18,6 +22,10 @@ { "name": "tunnel_qos_remap", "status": "invalid_status" + }, + { + "name": "mux_tunnel_egress_acl", + "status": "invalid_status" } ] } From f8a393c3a176d120bc6472f3b56936ef85916d4a Mon Sep 17 00:00:00 2001 From: Ikki Zhu <79439153+qnos@users.noreply.github.com> Date: Thu, 23 Feb 2023 02:55:55 +0800 Subject: [PATCH 42/57] add psu fans status led available config (#13926) Why I did it Seastone does not have the psu fans' status led, need to reflect it in platform.json. How I did it Set the psu fans status led available to false. How to verify it Verify it with platform_tests/api/test_psu_fans.py::TestPsuFans::test_set_fans_led case. --- device/celestica/x86_64-cel_seastone-r0/platform.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/device/celestica/x86_64-cel_seastone-r0/platform.json b/device/celestica/x86_64-cel_seastone-r0/platform.json index a3778ae81aef..e72c00fea5bd 100644 --- a/device/celestica/x86_64-cel_seastone-r0/platform.json +++ b/device/celestica/x86_64-cel_seastone-r0/platform.json @@ -266,6 +266,9 @@ "name": "PSU-1 FAN-1", "speed": { "controllable": false + }, + "status_led": { + "available": false } } ] @@ -281,6 +284,9 @@ "name": "PSU-2 FAN-1", "speed": { "controllable": false + }, + "status_led": { + "available": false } } ] From d15f5201e9262c59d0fddeb5fadeaea2c2368b21 Mon Sep 17 00:00:00 2001 From: Nazarii Hnydyn Date: Thu, 23 Feb 2023 08:18:01 +0200 Subject: [PATCH 43/57] [buildsystem]: Fix error 'chown: missing operand after'. (#13569) Fixes: #13395 This fix resolves ownership configuration for vcache: Step 24/40 : RUN pip3 install j2cli ---> Running in fcc39df62a98 chown: missing operand after '/sonic/target/vcache/docker-base-bullseye' Try 'chown --help' for more information. Originally the issue was introduced here: #13287 - Why I did it To fix ownership configuration - How I did it Removed redundant stuff Signed-off-by: Nazarii Hnydyn --- src/sonic-build-hooks/scripts/buildinfo_base.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sonic-build-hooks/scripts/buildinfo_base.sh b/src/sonic-build-hooks/scripts/buildinfo_base.sh index e10a32303423..a04dbc150df5 100755 --- a/src/sonic-build-hooks/scripts/buildinfo_base.sh +++ b/src/sonic-build-hooks/scripts/buildinfo_base.sh @@ -28,8 +28,7 @@ else PKG_CACHE_PATH=/sonic/target/vcache/${IMAGENAME} fi PKG_CACHE_FILE_NAME=${PKG_CACHE_PATH}/cache.tgz -$SUDO mkdir -p ${PKG_CACHE_PATH} -$SUDO chown $USER $PKG_CACHE_PATH +mkdir -p ${PKG_CACHE_PATH} . ${BUILDINFO_PATH}/scripts/utils.sh From 729eb07d5f92288e51e397c0b254ec5f9534d72b Mon Sep 17 00:00:00 2001 From: Oren Reiss <59409845+orenreiss@users.noreply.github.com> Date: Thu, 23 Feb 2023 08:18:42 +0200 Subject: [PATCH 44/57] Add script to upload packages to web server (#13545) - Why I did it The flow of SONiC reproducible build assumes that web packages (retrieved by curl and wget) are located in a single web file. server. Currently there is no way to easily download the packages from the various file servers where they are currently deployed. In this change we offer a utility to download all relevant packages and upload them to a specific file server. - How I did it We implemented python script that parse the various version files (generated by SONIC reproducible build compilation) and identify all relevant packages. Later the script downloads the file and then upload them to the destination server pointed by the user. - How to verify it Script is running and was verified manually Which release branch to backport (provide reason below if selected) Feature will be added to master only Signed-off-by: oreiss --- scripts/populate_file_web_server.py | 295 ++++++++++++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 scripts/populate_file_web_server.py diff --git a/scripts/populate_file_web_server.py b/scripts/populate_file_web_server.py new file mode 100644 index 000000000000..955ad9c8a7f9 --- /dev/null +++ b/scripts/populate_file_web_server.py @@ -0,0 +1,295 @@ +#!/usr/bin/env python3 + +import sys +import os +import time +import argparse +from http import HTTPStatus +try: + import requests +except ImportError: + print("requests module is not installed. script will fail to execute") + +#debug print level +PRINT_LEVEL_ERROR = "err" +PRINT_LEVEL_WARN = "warn" +PRINT_LEVEL_INFO = "info" +PRINT_LEVEL_VERBOSE = "verbose" + +PRINT_LEVEL_LUT = {PRINT_LEVEL_ERROR : 1, + PRINT_LEVEL_WARN : 2, + PRINT_LEVEL_INFO : 3, + PRINT_LEVEL_VERBOSE : 4 } + +#return code +RET_CODE_SUCCESS = 0 +RET_CODE_CANNOT_CREATE_FILE = -1 +RET_CODE_CANNOT_OPEN_FILE = -2 +RET_CODE_HTTP_SERVER_ERROR = -3 +RET_CODE_CANNOT_WRITE_FILE = -4 + +#constants +RESOURCES_FILE_NAME = 'versions-web' +EXCLUDE_DIRECTORES = ['fsroot', 'target'] +HASH_SEPARATOR = '-' +DEFAULT_INVALID_INPUT = 'none' + +# global variables +g_current_print_level = PRINT_LEVEL_INFO + +#Script debug features (disabled by default) +g_delete_resources_in_cache = True + + +# global Classes +class Resource: + def __init__(self, line, file): + self.file = file + temp=line.split("==") + assert(2==len(temp)) + self.url=temp[0].strip() + self.hash=temp[1].strip() + temp=self.url.split("/") + assert(len(temp)>0) + self.name=temp[len(temp)-1] + #handle special scenarios + if 0 != self.name.count('?') == True: + temp = self.name.split("?") + self.name = temp[0] + + def get_unique_name(self): + return self.name + HASH_SEPARATOR + self.hash + + def get_url(self): + return self.url + + def __str__(self): + ret_val = "Resource name: " + self.name + "\n" + ret_val += "File: " + self.file + "\n" + ret_val += "Hash: " + self.hash + "\n" + ret_val += "Full URL: " + self.url + return ret_val + +# Helper functions + +def print_msg(print_level, msg, print_in_place=False): + if PRINT_LEVEL_LUT[g_current_print_level] >= PRINT_LEVEL_LUT[print_level]: + if True == print_in_place: + print(msg, end='\r') + else: + print(msg) + +def create_dir_if_not_exist(dir): + if not os.path.exists(dir): + try: + os.makedirs(dir) + except: + print_msg(PRINT_LEVEL_WARN, "Cannot create directory " + dir) + +def delete_file_if_exist(file): + if os.path.exists(file): + try: + os.remove(file) + except: + print_msg(PRINT_LEVEL_WARN, "Cannot delete " + file) + +# Logic functions + +def generate_output_file(resources, dest_url_valid, dest_url, output_file_name): + try: + with open(output_file_name, 'w') as f: + for unique_name in resources.keys(): + resource = resources[unique_name] + if True == dest_url_valid: + line = dest_url + else: + line = resource.get_url() + if line[-1] != '/': + line += '/' + line += resource.name + "==" + resource.hash + f.write(line + '\n') + except: + print_msg(PRINT_LEVEL_WARN, output_file_name + " cannot be created") + return RET_CODE_CANNOT_CREATE_FILE + + return RET_CODE_SUCCESS + +def upload_resource_to_server(resource_path, resource_name, user, key, server_url): + url_full_path = server_url + "/" + resource_name + + try: + f = open(resource_path, 'rb') + except: + err_print("Cannot open " + resource_path) + return RET_CODE_CANNOT_OPEN_FILE + + headers = {'Content-type': 'application', 'Slug': resource_name} + response = requests.put(url_full_path, data=f, + headers=headers, auth=(user, key)) + + f.close() + + if response.status_code != HTTPStatus.CREATED.value: + err_print(f"HTTP request returned status code {response.status_code}, expected {HTTPStatus.CREATED.value}") + return RET_CODE_HTTP_SERVER_ERROR + + # JSON response empty only when status code is 204 + reported_md5 = response.json().get('checksums', {}).get('md5') + file_md5 = resource_name.split(HASH_SEPARATOR)[-1] + + # Check if server reports checksum, if so compare reported sum and the one + # specified in filename + if reported_md5 != None and reported_md5 != file_md5: + print_msg(PRINT_LEVEL_WARN, f"Server reported file's chsum {reported_md5}, expected {file_md5}") + + + return RET_CODE_SUCCESS + +def download_external_resouce(resource, cache_path): + resource_path_in_cache = cache_path + os.sep + resource.get_unique_name() + + r = requests.get(resource.get_url(), allow_redirects=True) + + try: + f = open(resource_path_in_cache, 'wb') + f.write(r.content) + f.close() + except: + print_msg(PRINT_LEVEL_ERROR, "Cannot write " + resource_path_in_cache + " to cache") + resource_path_in_cache = "" #report error + + return resource_path_in_cache + +def get_resources_list(resource_files_list): + resource_list = list() + + for file_name in resource_files_list: + try: + with open(file_name, 'r') as f: + for line in f: + resource_list.append(Resource(line, file_name)) + except: + print_msg(PRINT_LEVEL_WARN, file_name + " cannot be opened") + + return resource_list + +def filter_out_dir(subdir): + ret_val = False + + for exclude in EXCLUDE_DIRECTORES: + if exclude in subdir.split(os.sep): + ret_val = True + break + + return ret_val + +def get_resource_files_list(serach_path): + resource_files_list = list() + + for subdir, dirs, files in os.walk(serach_path): + for file in files: + if False == filter_out_dir(subdir) and RESOURCES_FILE_NAME == file: + file_full_path = os.path.join(subdir, file) + print_msg(PRINT_LEVEL_VERBOSE, "Found resource file :" + file_full_path) + resource_files_list.append(file_full_path) + + return resource_files_list + +def parse_args(): + parser = argparse.ArgumentParser(description='Various pre-steps for build compilation') + + parser.add_argument('-s', '--source', default=".", + help='Search path for ' + RESOURCES_FILE_NAME + ' files') + + parser.add_argument('-c', '--cache', default="." + os.sep + "tmp", + help='Path to cache for storing content before uploading to server') + + parser.add_argument('-p', '--print', default=PRINT_LEVEL_INFO, + choices=[PRINT_LEVEL_ERROR, PRINT_LEVEL_WARN, PRINT_LEVEL_INFO, PRINT_LEVEL_VERBOSE], + help='Print level verbosity') + + parser.add_argument('-o', '--output', default=DEFAULT_INVALID_INPUT, + help='Output file name to hold the list of packages') + + parser.add_argument('-u', '--user', default=DEFAULT_INVALID_INPUT, + help='User for server authentication') + + parser.add_argument('-k', '--key', default=DEFAULT_INVALID_INPUT, + help='API key server authentication') + + parser.add_argument('-d', '--dest', default=DEFAULT_INVALID_INPUT, + help='URL for destination web file server') + + return parser.parse_args() + +def main(): + global g_current_print_level + ret_val = RET_CODE_SUCCESS + resource_counter = 0.0 + resource_dict = dict() + + args = parse_args() + + g_current_print_level = args.print + + resource_files_list = get_resource_files_list(args.source) + + resource_list = get_resources_list(resource_files_list) + + #remove duplications + for resource in resource_list: + unique_name = resource.get_unique_name() + if not unique_name in resource_dict.keys(): + resource_dict[unique_name] = resource + + print_msg(PRINT_LEVEL_INFO, "Found " + str(len(resource_files_list)) + " version files and " + str(len(resource_dict.keys())) + " unique resources") + + if args.dest != DEFAULT_INVALID_INPUT: + upload_files_to_server = True + print_msg(PRINT_LEVEL_INFO, "Upload files to URL - " + args.dest) + else: + upload_files_to_server = False + print_msg(PRINT_LEVEL_INFO, "Skipping files upload to server") + + #create cache directory if not exist + create_dir_if_not_exist(args.cache) + + #download content to cache and then upload to web server + for unique_name in resource_dict.keys(): + + resource = resource_dict[unique_name] + + print_msg(PRINT_LEVEL_VERBOSE, resource) + + resource_counter += 1.0 + + #download content to cache + file_in_cache = download_external_resouce(resource, args.cache) + + if "" == file_in_cache: + return RET_CODE_CANNOT_WRITE_FILE + + if True == upload_files_to_server: + #upload content to web server + ret_val = upload_resource_to_server(file_in_cache, unique_name, args.user, args.key, args.dest) + if ret_val != RET_CODE_SUCCESS: + return ret_val + + if True == g_delete_resources_in_cache: + delete_file_if_exist(file_in_cache) + + print_msg(PRINT_LEVEL_INFO, "Downloading Data. Progress " + str(int(100.0*resource_counter/len(resource_dict.keys()))) + "%", True) #print progress bar + + # generate version output file as needed + if args.output != DEFAULT_INVALID_INPUT: + ret_val = generate_output_file(resource_dict, upload_files_to_server, args.dest, args.output) + print_msg(PRINT_LEVEL_INFO, "Generate output file " + args.output) + + return ret_val + +# Entry function +if __name__ == '__main__': + + ret_val = main() + + sys.exit(ret_val) From 3e0df173ff33261e8e754c7b4b41223f27cc8084 Mon Sep 17 00:00:00 2001 From: Liu Shilong Date: Thu, 23 Feb 2023 14:21:30 +0800 Subject: [PATCH 45/57] Remove deprecated LGTM badge in README.md. (#13895) Why I did it LGTM is deprecated. LGTM's badge doesn't work now. Github code scanning shows alerts in Security tab. It doesn't have a badge. How I did it Remove LGTM badge. How to verify it --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index 0aa24bebfb67..05c9f5102c98 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,3 @@ -*static analysis*: - -[![Total alerts](https://img.shields.io/lgtm/alerts/g/Azure/sonic-buildimage.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Azure/sonic-buildimage/alerts/) -[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/Azure/sonic-buildimage.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/Azure/sonic-buildimage/context:python) - *master builds*: [![Barefoot](https://dev.azure.com/mssonic/build/_apis/build/status/barefoot/Azure.sonic-buildimage.official.barefoot?branchName=master&label=Barefoot)](https://dev.azure.com/mssonic/build/_build/latest?definitionId=146&branchName=master) From ee1b6b37513d6cca8aebc6cf528d49c70f0971e9 Mon Sep 17 00:00:00 2001 From: DavidZagury <32644413+DavidZagury@users.noreply.github.com> Date: Thu, 23 Feb 2023 08:25:34 +0200 Subject: [PATCH 46/57] Remove support to Mellanox SPC4 ASIC (#13932) - Why I did it FW for Spectrum-4 ASIC not yet available - How I did it Remove in Mellanox fw make files to Spectrum-4 ASIC firmware binaries. Remove from firmware upgrade scripts to be able Spectrum-4 ASIC. - How to verify it Run regression test --- files/build_templates/sonic_debian_extension.j2 | 1 - platform/mellanox/fw.dep | 4 ---- platform/mellanox/fw.mk | 8 +------- platform/mellanox/mlnx-fw-upgrade.j2 | 6 ------ 4 files changed, 1 insertion(+), 18 deletions(-) diff --git a/files/build_templates/sonic_debian_extension.j2 b/files/build_templates/sonic_debian_extension.j2 index 8edf79553d7e..1dc8bfe1e69e 100644 --- a/files/build_templates/sonic_debian_extension.j2 +++ b/files/build_templates/sonic_debian_extension.j2 @@ -932,7 +932,6 @@ sudo mkdir -p $FILESYSTEM_ROOT/etc/mlnx/ sudo cp $files_path/$MLNX_SPC_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC.mfa sudo cp $files_path/$MLNX_SPC2_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC2.mfa sudo cp $files_path/$MLNX_SPC3_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC3.mfa -sudo cp $files_path/$MLNX_SPC4_FW_FILE $FILESYSTEM_ROOT/etc/mlnx/fw-SPC4.mfa sudo cp $files_path/$ISSU_VERSION_FILE $FILESYSTEM_ROOT/etc/mlnx/issu-version sudo cp $files_path/$MLNX_FFB_SCRIPT $FILESYSTEM_ROOT/usr/bin/mlnx-ffb.sh sudo cp $files_path/$MLNX_ONIE_FW_UPDATE $FILESYSTEM_ROOT/usr/bin/$MLNX_ONIE_FW_UPDATE diff --git a/platform/mellanox/fw.dep b/platform/mellanox/fw.dep index f57bad8eb9b0..228f6dc87e36 100644 --- a/platform/mellanox/fw.dep +++ b/platform/mellanox/fw.dep @@ -14,7 +14,3 @@ $(MLNX_SPC2_FW_FILE)_DEP_FILES := $(DEP_FILES) $(MLNX_SPC3_FW_FILE)_CACHE_MODE := GIT_CONTENT_SHA $(MLNX_SPC3_FW_FILE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) $(MLNX_SPC3_FW_FILE)_DEP_FILES := $(DEP_FILES) - -$(MLNX_SPC4_FW_FILE)_CACHE_MODE := GIT_CONTENT_SHA -$(MLNX_SPC4_FW_FILE)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST) -$(MLNX_SPC4_FW_FILE)_DEP_FILES := $(DEP_FILES) diff --git a/platform/mellanox/fw.mk b/platform/mellanox/fw.mk index 6ce3c8faabca..77e4daf589b6 100644 --- a/platform/mellanox/fw.mk +++ b/platform/mellanox/fw.mk @@ -44,12 +44,7 @@ MLNX_SPC3_FW_FILE = fw-SPC3-rel-$(subst .,_,$(MLNX_SPC3_FW_VERSION))-EVB.mfa $(MLNX_SPC3_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) $(MLNX_SPC3_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC3_FW_FILE) -MLNX_SPC4_FW_VERSION = 34.2010.4150 -MLNX_SPC4_FW_FILE = fw-SPC4-rel-$(subst .,_,$(MLNX_SPC4_FW_VERSION))-EVB.mfa -$(MLNX_SPC4_FW_FILE)_PATH = $(MLNX_FW_BASE_PATH) -$(MLNX_SPC4_FW_FILE)_URL = $(MLNX_FW_BASE_URL)/$(MLNX_SPC4_FW_FILE) - -MLNX_FW_FILES = $(MLNX_SPC_FW_FILE) $(MLNX_SPC2_FW_FILE) $(MLNX_SPC3_FW_FILE) $(MLNX_SPC4_FW_FILE) +MLNX_FW_FILES = $(MLNX_SPC_FW_FILE) $(MLNX_SPC2_FW_FILE) $(MLNX_SPC3_FW_FILE) ifeq ($(FW_FROM_URL),n) SONIC_COPY_FILES += $(MLNX_FW_FILES) @@ -62,4 +57,3 @@ MLNX_FILES += $(MLNX_FW_FILES) export MLNX_SPC_FW_FILE export MLNX_SPC2_FW_FILE export MLNX_SPC3_FW_FILE -export MLNX_SPC4_FW_FILE diff --git a/platform/mellanox/mlnx-fw-upgrade.j2 b/platform/mellanox/mlnx-fw-upgrade.j2 index 86fd32e6a89a..1c650fd5ce63 100755 --- a/platform/mellanox/mlnx-fw-upgrade.j2 +++ b/platform/mellanox/mlnx-fw-upgrade.j2 @@ -28,7 +28,6 @@ declare -r LIST_CONTENT_FILE="/tmp/mlxfwmanager-list-content.log" declare -r SPC1_ASIC="spc1" declare -r SPC2_ASIC="spc2" declare -r SPC3_ASIC="spc3" -declare -r SPC4_ASIC="spc4" declare -r UNKN_ASIC="unknown" declare -r UNKN_MST="unknown" @@ -36,7 +35,6 @@ declare -rA FW_FILE_MAP=( \ [$SPC1_ASIC]="/etc/mlnx/fw-SPC.mfa" \ [$SPC2_ASIC]="/etc/mlnx/fw-SPC2.mfa" \ [$SPC3_ASIC]="/etc/mlnx/fw-SPC3.mfa" \ - [$SPC4_ASIC]="/etc/mlnx/fw-SPC4.mfa" \ ) IMAGE_UPGRADE="${NO_PARAM}" @@ -162,7 +160,6 @@ function GetAsicType() { local -r SPC1_PRODUCT_ID="cb84" local -r SPC2_PRODUCT_ID="cf6c" local -r SPC3_PRODUCT_ID="cf70" - local -r SPC4_PRODUCT_ID="cf80" if lspci -n | grep "${VENDOR_ID}:${SPC1_PRODUCT_ID}" &>/dev/null; then echo "${SPC1_ASIC}" @@ -173,9 +170,6 @@ function GetAsicType() { elif lspci -n | grep "${VENDOR_ID}:${SPC3_PRODUCT_ID}" &>/dev/null; then echo "${SPC3_ASIC}" exit "${EXIT_SUCCESS}" - elif lspci -n | grep "${VENDOR_ID}:${SPC4_PRODUCT_ID}" &>/dev/null; then - echo "${SPC4_ASIC}" - exit "${EXIT_SUCCESS}" fi echo "${UNKN_ASIC}" From 95ce31971cecd3d02107b83e4acfb7010e05b50f Mon Sep 17 00:00:00 2001 From: Tapash Das <48195098+tapashdas@users.noreply.github.com> Date: Thu, 23 Feb 2023 12:19:16 +0530 Subject: [PATCH 47/57] Added vni field in VRF Yang for VxLAN L3 VNI Support #13456 (#13735) Why I did it Added vni field in VRF Yang for VxLAN L3 VNI Support. The VRF table schema as per EVPN HLD is below https://github.com/sonic-net/SONiC/blob/master/doc/vxlan/EVPN/EVPN_VXLAN_HLD.md Addresses Issue #13456 --- src/sonic-yang-models/doc/Configuration.md | 4 +++- .../tests/files/sample_config_db.json | 1 + .../tests/yang_model_tests/tests/vrf.json | 7 ++++++ .../yang_model_tests/tests_config/vrf.json | 22 +++++++++++++++++++ .../yang-models/sonic-vrf.yang | 8 +++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/sonic-yang-models/doc/Configuration.md b/src/sonic-yang-models/doc/Configuration.md index 69635053245b..a7726d8b5695 100644 --- a/src/sonic-yang-models/doc/Configuration.md +++ b/src/sonic-yang-models/doc/Configuration.md @@ -1883,6 +1883,7 @@ table allow to change properties of a virtual router. Attributes: packets with IP options - 'l3_mc_action' contains packet action. Defines the action for unknown L3 multicast packets +- 'vni' contains L3 VNI value. VNI associated Virtual router instance. The packet action could be: @@ -1904,7 +1905,8 @@ The packet action could be: 'src_mac': '02:04:05:06:07:08', 'ttl_action': 'copy', 'ip_opt_action': 'deny', - 'l3_mc_action': 'drop' + 'l3_mc_action': 'drop', + 'vni': '100' } ``` diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index a05b35c48295..375f7d24e4b5 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -2,6 +2,7 @@ "SAMPLE_CONFIG_DB_JSON": { "VRF": { "Vrf_blue": { + "vni" : "100" } }, "DHCP_SERVER": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/vrf.json b/src/sonic-yang-models/tests/yang_model_tests/tests/vrf.json index a9d9bb0f9d9c..73e31ee109cc 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests/vrf.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/vrf.json @@ -8,5 +8,12 @@ }, "VRF_TEST_WITH_FALLBACK": { "desc": "Configure VRF with fallback in VRF table." + }, + "VRF_TEST_WITH_VNI": { + "desc": "Configure VRF with VNI in VRF table." + }, + "VRF_TEST_WITH_VNI_OOR": { + "desc": "Configure VRF with out of range VNI in VRF table.", + "eStrKey": "Range" } } diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vrf.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vrf.json index f34d3fbdd52d..082ec022f81b 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vrf.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vrf.json @@ -28,5 +28,27 @@ }] } } + }, + + "VRF_TEST_WITH_VNI": { + "sonic-vrf:sonic-vrf": { + "sonic-vrf:VRF": { + "VRF_LIST": [{ + "name": "Vrf_blue", + "vni": "100" + }] + } + } + }, + + "VRF_TEST_WITH_VNI_OOR": { + "sonic-vrf:sonic-vrf": { + "sonic-vrf:VRF": { + "VRF_LIST": [{ + "name": "Vrf_blue", + "vni": "16777216" + }] + } + } } } diff --git a/src/sonic-yang-models/yang-models/sonic-vrf.yang b/src/sonic-yang-models/yang-models/sonic-vrf.yang index ff9fc5b5a4cc..5387aad2cc80 100644 --- a/src/sonic-yang-models/yang-models/sonic-vrf.yang +++ b/src/sonic-yang-models/yang-models/sonic-vrf.yang @@ -43,6 +43,14 @@ module sonic-vrf { "Enable/disable fallback feature which is useful for specified VRF user to access internet through global/main route."; } + leaf vni { + type uint32 { + range "0..16777215"; + } + default 0; + description + "VNI mapped to VRF"; + } } /* end of list VRF_LISt */ } /* end of container VRf */ } /* end of container sonic-vrf */ From 690fa2e93684dd6db33ef9a8a12fbcf06209cbb8 Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Thu, 23 Feb 2023 15:02:53 +0200 Subject: [PATCH 48/57] [submodule] Advance sonic-platform-daemons pointer (#13951) Update sonic-platform-daemons submodule pointer to include the following: * 05dd3bd Update CMIS module types for 2x100G AOC support ([#339](https://github.com/sonic-net/sonic-platform-daemons/pull/339)) * f132d12 [ycabled] add more coverage to ycabled; add minor name change for vendor API CLI return key-values pairs ([#338](https://github.com/sonic-net/sonic-platform-daemons/pull/338)) Signed-off-by: dprital --- src/sonic-platform-daemons | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-daemons b/src/sonic-platform-daemons index 906d198dea3c..05dd3bd3e6b3 160000 --- a/src/sonic-platform-daemons +++ b/src/sonic-platform-daemons @@ -1 +1 @@ -Subproject commit 906d198dea3cddc2d9b864a89028b590bd5c1ff8 +Subproject commit 05dd3bd3e6b3c94cf64e36302f735a101a60ea53 From 33db298d70081efd7d815ec860b0b9856b32a693 Mon Sep 17 00:00:00 2001 From: RogerX87 Date: Fri, 24 Feb 2023 01:08:13 +0800 Subject: [PATCH 49/57] [devices]: Update the Wistron platform support in master branch (#12110) * Update the Wistron platform support in master branch Signed-off-by: RogerX87 --- .../CSV/TL7_DAC_1M.csv | 342 +++++++ .../CSV/TL7_DAC_3M.csv | 342 +++++++ .../CSV/TL7_Optics.csv | 261 ++++++ .../x86_64-wistron_6512_32r-r0/installer.conf | 2 +- .../x86_64-wistron_6512_32r-r0/pcie.yaml | 495 ++++++++++ .../x86_64-wistron_6512_32r-r0/platform.json | 848 ++++++++++++++++++ .../plugins/sfputil.py | 29 +- .../sonic_platform/fan.py | 182 ---- .../sonic_platform/psu.py | 248 ----- .../sonic_platform/watchdog.py | 73 -- .../system_health_monitoring_config.json | 11 + .../6512-32_32x400G.config.yaml | 39 +- .../wistron_6512_32r/buffers.json.j2 | 144 ++- .../buffers_defaults_def_lossy.j2 | 24 +- .../wistron_6512_32r/buffers_defaults_t1.j2 | 77 +- .../wistron_6512_32r/hwsku.json | 132 +++ .../wistron_6512_32r/innovium.77700_A | 1 + .../wistron_6512_32r/innovium.77700_B | 1 + .../wistron_6512_32r/ivm.sai.config.yaml | 3 +- .../ivm.sai.datapath.config.yaml | 12 +- .../wistron_6512_32r/pg_profile_lookup.ini | 36 +- .../wistron_6512_32r/qos.json.j2 | 165 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../wistron_6512_32r/qos_defaults_t1.j2 | 155 ++-- .../6512-32_32x100G.config.yaml | 419 +++++++++ .../wistron_6512_32r_32x100/buffers.json.j2 | 162 ++++ .../buffers_defaults_def_lossy.j2 | 42 + .../buffers_defaults_t1.j2 | 162 ++++ .../wistron_6512_32r_32x100/hwsku.json | 132 +++ .../wistron_6512_32r_32x100/innovium.77700_A | 60 ++ .../wistron_6512_32r_32x100/innovium.77700_B | 60 ++ .../ivm.sai.config.yaml | 9 + .../ivm.sai.datapath.config.yaml | 9 + .../pg_profile_lookup.ini | 22 + .../wistron_6512_32r_32x100/port_config.ini | 33 + .../wistron_6512_32r_32x100/qos.json.j2 | 129 +++ .../qos_defaults_def_lossy.j2 | 121 +++ .../qos_defaults_t1.j2 | 129 +++ .../wistron_6512_32r_32x100/sai.profile | 1 + .../Wistron_sw_to3200k/buffers.json.j2 | 144 ++- .../buffers_defaults_def_lossy.j2 | 24 +- .../Wistron_sw_to3200k/buffers_defaults_t1.j2 | 77 +- .../config_32x400G_wistron_sw_to3200k.yaml | 6 +- .../Wistron_sw_to3200k/hwsku.json | 132 +++ .../Wistron_sw_to3200k/innovium.77700_A | 1 + .../Wistron_sw_to3200k/innovium.77700_B | 1 + .../Wistron_sw_to3200k/ivm.sai.config.yaml | 2 +- .../ivm.sai.datapath.config.yaml | 12 +- .../Wistron_sw_to3200k/pg_profile_lookup.ini | 36 +- .../Wistron_sw_to3200k/qos.json.j2 | 224 +++-- .../qos_defaults_def_lossy.j2 | 17 +- .../Wistron_sw_to3200k/qos_defaults_t1.j2 | 218 +++-- .../buffers.json.j2 | 142 ++- .../buffers_defaults_def_lossy.j2 | 20 +- .../buffers_defaults_t1.j2 | 67 +- .../hwsku.json | 132 +++ .../innovium.77700_A | 1 + .../innovium.77700_B | 1 + .../ivm.sai.config.yaml | 2 +- .../pg_profile_lookup.ini | 36 +- .../qos.json.j2 | 165 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../qos_defaults_t1.j2 | 155 ++-- .../buffers.json.j2 | 142 ++- .../buffers_defaults_def_lossy.j2 | 20 +- .../buffers_defaults_t1.j2 | 66 +- .../hwsku.json | 132 +++ .../innovium.77700_A | 1 + .../innovium.77700_B | 1 + .../ivm.sai.config.yaml | 2 +- .../pg_profile_lookup.ini | 36 +- .../qos.json.j2 | 165 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../qos_defaults_t1.j2 | 155 ++-- .../buffers.json.j2 | 142 ++- .../buffers_defaults_def_lossy.j2 | 20 +- .../buffers_defaults_t1.j2 | 67 +- .../hwsku.json | 132 +++ .../innovium.77700_A | 1 + .../innovium.77700_B | 1 + .../ivm.sai.config.yaml | 2 +- .../pg_profile_lookup.ini | 36 +- .../qos.json.j2 | 165 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../qos_defaults_t1.j2 | 155 ++-- .../Wistron_sw_to3200k_32x100/buffers.json.j2 | 73 +- .../buffers_defaults_def_lossy.j2 | 24 +- .../buffers_defaults_t1.j2 | 73 +- .../config_32x100G_wistron_sw_to3200k.yaml | 5 +- .../Wistron_sw_to3200k_32x100/hwsku.json | 132 +++ .../innovium.77700_B | 1 + .../ivm.sai.config.yaml | 2 +- .../pg_profile_lookup.ini | 36 +- .../Wistron_sw_to3200k_32x100/qos.json.j2 | 155 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../qos_defaults_t1.j2 | 155 ++-- .../buffers.json.j2 | 142 ++- .../buffers_defaults_def_lossy.j2 | 20 +- .../buffers_defaults_t1.j2 | 67 +- .../Wistron_sw_to3200k_72x25_6x400/hwsku.json | 132 +++ .../innovium.77700_A | 1 + .../innovium.77700_B | 1 + .../ivm.sai.config.yaml | 2 +- .../pg_profile_lookup.ini | 36 +- .../qos.json.j2 | 165 ++-- .../qos_defaults_def_lossy.j2 | 17 +- .../qos_defaults_t1.j2 | 155 ++-- .../installer.conf | 2 +- .../libplatform.so | Bin 0 -> 26640 bytes .../x86_64-wistron_sw_to3200k-r0/pcie.yaml | 375 ++++++++ .../platform.json | 844 +++++++++++++++++ .../platform_components.json | 14 + .../plugins/eeprom.py | 6 +- .../plugins/sfputil.py | 10 +- .../x86_64-wistron_sw_to3200k-r0/smartd.conf | 150 ++++ .../system_health_monitoring_config.json | 11 + .../watchdog-control.service | 10 + .../6512-32r/modules/Makefile | 2 +- .../6512-32r/modules/i2c-imc.c | 515 +++++++++++ .../6512-32r/modules/wistron_6512_32r_cpld.c | 141 +++ .../6512-32r/modules/wistron_6512_32r_oom.c | 376 +++++++- .../6512-32r/modules/wistron_6512_32r_psu.c | 42 +- .../modules/wistron_6512_32r_syseeprom.c | 4 +- .../service/6512-32r-firmware_ver.service | 12 + .../service/6512-32r-platform.service | 3 +- .../6512-32r/setup.py | 7 +- .../6512-32r}/sonic_platform/__init__.py | 2 +- .../6512-32r}/sonic_platform/chassis.py | 167 +++- .../6512-32r/sonic_platform/component.py | 269 ++++++ .../6512-32r}/sonic_platform/eeprom.py | 21 +- .../6512-32r/sonic_platform/fan.py | 263 ++++++ .../6512-32r/sonic_platform/fan_drawer.py | 120 +++ .../6512-32r}/sonic_platform/platform.py | 0 .../6512-32r/sonic_platform/psu.py | 324 +++++++ .../6512-32r}/sonic_platform/sfp.py | 607 ++++++++++--- .../6512-32r}/sonic_platform/thermal.py | 88 +- .../6512-32r/sonic_platform/watchdog.py | 184 ++++ .../6512-32r/utils/platform_firmware_version | 17 + .../6512-32r/utils/platform_sync | 2 + .../6512-32r/utils/platform_syseeprom | 19 +- .../6512-32r/utils/sonic-fanthrml-monitor | 0 .../6512-32r/utils/sonic-led-monitor | 0 .../6512-32r/utils/sonic-psu-monitor | 45 +- .../6512-32r/utils/sonic-qsfp-eeprom-monitor | 596 ++++++++++++ .../6512-32r/utils/sonic-qsfp-monitor | 798 +++++++++------- .../6512-32r/utils/sonic-send-temp-to-bmc | 51 ++ .../6512-32r/utils/wistron_6512_32r_util.py | 23 +- .../debian/changelog | 5 + .../debian/compat | 1 + .../debian/control | 14 + .../debian/rules | 143 +++ .../sonic-platform-wistron-6512-32r.install | 3 + .../sonic-platform-wistron-6512-32r.postinst | 41 + .../sonic-platform-wistron-sw-to3200k.install | 4 + ...sonic-platform-wistron-sw-to3200k.postinst | 43 + .../sw-to3200k/modules/wistron_i2c_psu.c | 10 +- .../modules/wistron_sw_to3200k_fan.c | 42 +- .../modules/wistron_sw_to3200k_oom.c | 12 +- .../modules/wistron_sw_to3200k_psu.c | 4 +- .../modules/wistron_sw_to3200k_thermal.c | 2 +- .../service/sw-to3200k-firmware_ver.service | 12 + .../sw-to3200k/sonic_platform/__init__.py | 2 +- .../sw-to3200k/sonic_platform/chassis.py | 122 ++- .../sw-to3200k/sonic_platform/component.py | 240 +++++ .../sw-to3200k/sonic_platform/eeprom.py | 17 +- .../sw-to3200k/sonic_platform/fan.py | 266 ++++-- .../sw-to3200k/sonic_platform/fan_drawer.py | 119 +++ .../sw-to3200k/sonic_platform/psu.py | 98 +- .../sw-to3200k/sonic_platform/sfp.py | 86 +- .../sw-to3200k/sonic_platform/thermal.py | 127 ++- .../utils/platform_firmware_version | 24 + .../sw-to3200k/utils/platform_led | 0 .../sw-to3200k/utils/platform_pld | 0 .../sw-to3200k/utils/platform_sync | 0 .../sw-to3200k/utils/sonic-fanthrml-monitor | 0 .../sw-to3200k/utils/sonic-led-monitor | 40 +- .../sw-to3200k/utils/sonic-psu-monitor | 18 +- .../sw-to3200k/utils/sonic-qsfp-monitor | 0 .../sw-to3200k/utils/sw_to3200k_watchdog.sh | 5 + .../utils/wistron_sw_to3200k_util.py | 18 +- 180 files changed, 14449 insertions(+), 2836 deletions(-) create mode 100755 device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_DAC_1M.csv create mode 100755 device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_DAC_3M.csv create mode 100755 device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_Optics.csv create mode 100755 device/wistron/x86_64-wistron_6512_32r-r0/pcie.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/platform.json delete mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py delete mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py delete 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/system_health_monitoring_config.json create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/hwsku.json create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/6512-32_32x100G.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/hwsku.json create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_A create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_B create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/ivm.sai.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/ivm.sai.datapath.config.yaml create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/pg_profile_lookup.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/port_config.ini create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos.json.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_def_lossy.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_t1.j2 create mode 100644 device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/sai.profile create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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_104x1025_6x100/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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_24x400_8x100/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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_28x400_4x100/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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_32x100/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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_72x25_6x400/hwsku.json mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/ivm.sai.config.yaml mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos.json.j2 mode change 100644 => 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/qos_defaults_def_lossy.j2 mode change 100644 => 100755 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/libplatform.so create mode 100755 device/wistron/x86_64-wistron_sw_to3200k-r0/pcie.yaml create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/platform.json create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/platform_components.json create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/smartd.conf create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/system_health_monitoring_config.json create mode 100644 device/wistron/x86_64-wistron_sw_to3200k-r0/watchdog-control.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/i2c-imc.c create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-firmware_ver.service rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/__init__.py (70%) mode change 100644 => 100755 rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/chassis.py (55%) mode change 100644 => 100755 create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/component.py rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/eeprom.py (81%) mode change 100644 => 100755 create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan_drawer.py rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/platform.py (100%) mode change 100644 => 100755 create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/psu.py rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/sfp.py (72%) mode change 100644 => 100755 rename {device/wistron/x86_64-wistron_6512_32r-r0 => platform/innovium/sonic-platform-modules-wistron/6512-32r}/sonic_platform/thermal.py (61%) mode change 100644 => 100755 create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/watchdog.py create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_firmware_version mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-fanthrml-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-led-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-psu-monitor create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-eeprom-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-monitor create mode 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-send-temp-to-bmc mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/wistron_6512_32r_util.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/changelog create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/compat create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/control create mode 100755 platform/innovium/sonic-platform-modules-wistron/debian/rules create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.install create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.postinst create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.install create mode 100644 platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.postinst create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/sw-to3200k-firmware_ver.service create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/component.py create mode 100644 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan_drawer.py create mode 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_firmware_version mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_led mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_pld mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_sync mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-fanthrml-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-led-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-psu-monitor mode change 100644 => 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sonic-qsfp-monitor create mode 100755 platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sw_to3200k_watchdog.sh mode change 100644 => 100755 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/CSV/TL7_DAC_1M.csv b/device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_DAC_1M.csv new file mode 100755 index 000000000000..b9f4e750a8df --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-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_6512_32r-r0/CSV/TL7_DAC_3M.csv b/device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_DAC_3M.csv new file mode 100755 index 000000000000..b6bbd017e483 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-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_6512_32r-r0/CSV/TL7_Optics.csv b/device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_Optics.csv new file mode 100755 index 000000000000..a652f33e78b9 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/CSV/TL7_Optics.csv @@ -0,0 +1,261 @@ +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,8,4,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +1,0,1,0,4,0,0,8,5,Medium,High,0,2,0,0,2,0,0,8,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,8,3.5,Medium,High,0,2,0,0,2,0,0,4,5,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +3,0,3,0,4,0,0,6,6.5,Medium,High,0,2,0,0,6,0,0,6,4,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +4,0,4,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +5,0,5,0,2,0,0,10,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +6,0,6,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +7,0,7,0,4,0,0,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,High,High,NA,FALSE,0,0,0,0,0,0,0,0,0 +8,1,0,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 +9,1,1,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +10,1,2,0,4,0,0,6,4.5,Medium,High,0,2,0,0,4,0,0,6,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,8,3.5,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +12,1,4,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +13,1,5,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,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,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +15,1,7,0,4,0,0,4,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +16,2,0,0,2,0,0,6,5,Medium,High,0,2,0,0,2,0,0,6,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,6,4,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 +18,2,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 +19,2,3,0,4,0,0,6,5.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 +20,2,4,0,6,0,0,6,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +21,2,5,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,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,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +23,2,7,0,6,0,0,6,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +24,3,0,0,4,0,0,6,4,Medium,High,0,2,0,0,4,0,0,6,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +25,3,1,0,4,0,0,4,6,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 +26,3,2,0,4,0,0,4,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 +27,3,3,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 +28,3,4,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +29,3,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +30,3,6,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +31,3,7,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +32,4,0,0,4,0,0,4,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 +33,4,1,0,4,0,0,6,5,Medium,High,0,2,0,0,4,0,0,6,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,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 +35,4,3,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 +36,4,4,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +37,4,5,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +38,4,6,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +39,4,7,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +40,5,0,0,4,0,0,4,4.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 +41,5,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 +42,5,2,0,4,0,0,4,4.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 +43,5,3,0,4,0,0,6,4,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 +44,5,4,0,4,0,0,6,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +45,5,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +46,5,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +47,5,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +48,6,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 +49,6,1,0,6,0,0,6,4,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +50,6,2,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 +51,6,3,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 +52,6,4,0,6,0,0,6,3.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +53,6,5,0,6,0,0,6,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +54,6,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +55,6,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +56,7,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 +57,7,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 +58,7,2,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 +59,7,3,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 +60,7,4,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +61,7,5,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +62,7,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,0,0,0,0,0,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,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +64,8,0,0,4,0,0,6,5,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +65,8,1,0,4,0,0,6,6.5,Medium,High,0,2,0,0,4,0,0,8,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,6,5.5,Medium,High,0,2,0,0,4,0,0,6,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,10,4,Medium,High,0,2,0,0,4,0,0,10,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +68,8,4,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +69,8,5,0,4,0,0,10,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +70,8,6,0,4,0,0,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +71,8,7,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +72,9,0,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +73,9,1,0,4,0,0,4,7,Medium,High,0,2,0,0,4,0,0,6,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,8,4.5,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +75,9,3,0,4,0,0,8,5,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +76,9,4,0,4,0,0,6,6.5,Medium,High,0,2,0,0,0,0,0,0,0,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,7,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +78,9,6,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +79,9,7,0,4,0,0,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +80,10,0,0,4,0,0,6,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 +81,10,1,0,4,0,0,8,5,Medium,High,0,2,0,0,4,0,0,6,5,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,6,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 +83,10,3,0,4,0,0,6,6,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +84,10,4,0,4,0,0,4,7,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +85,10,5,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +86,10,6,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +87,10,7,0,4,0,0,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +88,11,0,0,4,0,0,4,6,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 +89,11,1,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +90,11,2,0,4,0,0,4,5.5,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +91,11,3,0,6,0,0,6,4.5,Medium,High,0,2,0,0,6,0,0,8,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +92,11,4,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +93,11,5,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +94,11,6,0,4,0,0,4,7.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +95,11,7,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +96,12,0,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 +97,12,1,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +98,12,2,0,4,0,0,4,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 +99,12,3,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +100,12,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +101,12,5,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,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,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +103,12,7,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +104,13,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 +105,13,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 +106,13,2,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 +107,13,3,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 +108,13,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,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,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +110,13,6,0,4,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +111,13,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +112,14,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 +113,14,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 +114,14,2,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 +115,14,3,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 +116,14,4,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +117,14,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +118,14,6,0,4,0,0,4,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +119,14,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +120,15,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 +121,15,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 +122,15,2,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 +123,15,3,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 +124,15,4,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +125,15,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +126,15,6,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +127,15,7,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +128,16,0,0,4,0,0,4,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 +129,16,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 +130,16,2,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 +131,16,3,0,4,0,0,4,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 +132,16,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +133,16,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +134,16,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +135,16,7,0,4,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +136,17,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 +137,17,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 +138,17,2,0,4,0,0,4,4.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 +139,17,3,0,6,0,0,6,3.5,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +140,17,4,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +141,17,5,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +142,17,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +143,17,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +144,18,0,0,4,0,0,6,4,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 +145,18,1,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 +146,18,2,0,4,0,0,4,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 +147,18,3,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 +148,18,4,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +149,18,5,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +150,18,6,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,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,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +152,19,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 +153,19,1,0,6,0,0,6,4,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +154,19,2,0,4,0,0,4,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 +155,19,3,0,4,0,0,4,6,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +156,19,4,0,4,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +157,19,5,0,4,0,0,4,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +158,19,6,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +159,19,7,0,6,0,0,6,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +160,20,0,0,4,0,0,4,6,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 +161,20,1,0,4,0,0,6,5.5,Medium,High,0,2,0,0,4,0,0,6,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,6,5,Medium,High,0,2,0,0,4,0,0,6,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,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +164,20,4,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +165,20,5,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +166,20,6,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +167,20,7,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +168,21,0,0,4,0,0,6,4,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 +169,21,1,0,4,0,0,6,5,Medium,High,0,2,0,0,4,0,0,6,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,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 +171,21,3,0,6,0,0,6,4,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +172,21,4,0,4,0,0,4,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +173,21,5,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +174,21,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +175,21,7,0,4,0,0,4,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +176,22,0,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +177,22,1,0,4,0,0,8,4.5,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +178,22,2,0,4,0,0,8,4,Medium,High,0,2,0,0,4,0,0,8,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +179,22,3,0,4,0,0,10,3,Medium,High,0,2,0,0,4,0,0,10,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +180,22,4,0,4,0,0,10,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +181,22,5,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +182,22,6,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +183,22,7,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +184,23,0,0,6,0,0,6,4,Medium,High,0,2,0,0,6,0,0,6,3,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,7,Medium,High,0,2,0,0,4,0,0,8,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,6,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 +187,23,3,0,4,0,0,6,5.5,Medium,High,0,2,0,0,4,0,0,6,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,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +189,23,5,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +190,23,6,0,4,0,0,8,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +191,23,7,0,4,0,0,8,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +192,24,0,0,4,0,0,4,4.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 +193,24,1,0,4,0,0,4,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 +194,24,2,0,4,0,0,4,4.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 +195,24,3,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 +196,24,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +197,24,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +198,24,6,0,4,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +199,24,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +200,25,0,0,4,0,0,4,4.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 +201,25,1,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 +202,25,2,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 +203,25,3,0,4,0,0,4,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 +204,25,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +205,25,5,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +206,25,6,0,4,0,0,4,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +207,25,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +208,26,0,0,4,0,0,6,3.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 +209,26,1,0,4,0,0,6,4.5,Medium,High,0,2,0,0,4,0,0,6,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,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 +211,26,3,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 +212,26,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +213,26,5,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,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,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +215,26,7,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +216,27,0,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 +217,27,1,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 +218,27,2,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 +219,27,3,0,6,0,0,6,4.5,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +220,27,4,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +221,27,5,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +222,27,6,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +223,27,7,0,6,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +224,28,0,0,4,0,0,4,4.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 +225,28,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 +226,28,2,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 +227,28,3,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 +228,28,4,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +229,28,5,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +230,28,6,0,4,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +231,28,7,0,4,0,0,6,4.5,Medium,High,0,2,0,0,0,0,0,0,0,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,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 +233,29,1,0,6,0,0,6,4,Medium,High,0,2,0,0,6,0,0,6,3,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +234,29,2,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 +235,29,3,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 +236,29,4,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +237,29,5,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +238,29,6,0,4,0,0,4,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +239,29,7,0,6,0,0,4,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +240,30,0,0,4,0,0,4,5.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 +241,30,1,0,4,0,0,6,6,Medium,High,0,2,0,0,4,0,0,6,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,6,4,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 +243,30,3,0,4,0,0,4,6,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 +244,30,4,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +245,30,5,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +246,30,6,0,4,0,0,8,4,Medium,High,0,2,0,0,0,0,0,0,0,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,6.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +248,31,0,0,6,-1,0,4,4.5,Medium,High,0,2,0,0,6,0,0,6,2,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +249,31,1,0,4,0,0,6,5,Medium,High,0,2,0,0,4,0,0,6,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,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 +251,31,3,0,4,0,0,4,6.5,Medium,High,0,2,0,0,4,0,0,6,4,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +252,31,4,0,4,0,0,6,6,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +253,31,5,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +254,31,6,0,4,0,0,6,5,Medium,High,0,2,0,0,0,0,0,0,0,0,0,100,100,LOW,LOW,NA,FALSE,0,0,0,0,0,0,0,0,0 +255,31,7,0,4,0,0,6,5.5,Medium,High,0,2,0,0,0,0,0,0,0,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_6512_32r-r0/installer.conf b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf index d5f9419d77ff..0bd1a8bae86f 100644 --- a/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf +++ b/device/wistron/x86_64-wistron_6512_32r-r0/installer.conf @@ -1,4 +1,4 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=0 CONSOLE_SPEED=115200 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off intel_iommu=off" diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/pcie.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/pcie.yaml new file mode 100755 index 000000000000..227f7cb249bf --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/pcie.yaml @@ -0,0 +1,495 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 6f00 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 (rev 05)' +- bus: '00' + dev: '01' + fn: '0' + id: 6f02 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 (rev 05)' +- bus: '00' + dev: '01' + fn: '1' + id: 6f03 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 (rev 05)' +- bus: '00' + dev: '02' + fn: '0' + id: 6f04 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 (rev 05)' +- bus: '00' + dev: '02' + fn: '2' + id: 6f06 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 (rev 05)' +- bus: '00' + dev: '02' + fn: '3' + id: 6f07 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 (rev 05)' +- bus: '00' + dev: '03' + fn: '0' + id: 6f08 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 05)' +- bus: '00' + dev: '03' + fn: '1' + id: 6f09 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 05)' +- bus: '00' + dev: '03' + fn: '2' + id: 6f0a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 05)' +- bus: '00' + dev: '03' + fn: '3' + id: 6f0b + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 05)' +- bus: '00' + dev: '04' + fn: '0' + id: 6f20 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 0 (rev 05)' +- bus: '00' + dev: '04' + fn: '1' + id: 6f21 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 1 (rev 05)' +- bus: '00' + dev: '04' + fn: '2' + id: 6f22 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 2 (rev 05)' +- bus: '00' + dev: '04' + fn: '3' + id: 6f23 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 3 (rev 05)' +- bus: '00' + dev: '04' + fn: '4' + id: 6f24 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 4 (rev 05)' +- bus: '00' + dev: '04' + fn: '5' + id: 6f25 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 5 (rev 05)' +- bus: '00' + dev: '04' + fn: '6' + id: 6f26 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 6 (rev 05)' +- bus: '00' + dev: '04' + fn: '7' + id: 6f27 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Crystal Beach DMA Channel 7 (rev 05)' +- bus: '00' + dev: '05' + fn: '0' + id: 6f28 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Map/VTd_Misc/System Management (rev 05)' +- bus: '00' + dev: '05' + fn: '1' + id: 6f29 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Hot Plug (rev 05)' +- bus: '00' + dev: '05' + fn: '2' + id: 6f2a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO RAS/Control Status/Global Errors (rev 05)' +- bus: '00' + dev: '05' + fn: '4' + id: 6f2c + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev 05)' +- bus: '00' + dev: '05' + fn: '6' + id: 6f39 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IO Performance Monitoring (rev 05)' +- bus: '00' + dev: '06' + fn: '0' + id: 6f10 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '1' + id: 6f11 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '2' + id: 6f12 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '3' + id: 6f13 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '4' + id: 6f14 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '5' + id: 6f15 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '6' + id: 6f16 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '06' + fn: '7' + id: 6f17 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '07' + fn: '0' + id: 6f18 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '07' + fn: '1' + id: 6f19 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '07' + fn: '2' + id: 6f1a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '07' + fn: '3' + id: 6f1b + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '07' + fn: '4' + id: 6f1c + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Debug (rev 05)' +- bus: '00' + dev: '14' + fn: '0' + id: 8c31 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI (rev 05)' +- bus: '00' + dev: '16' + fn: '0' + id: 8c3a + name: 'Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 (rev 04)' +- bus: '00' + dev: '16' + fn: '1' + id: 8c3b + name: 'Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #2 (rev 04)' +- bus: '00' + dev: '1c' + fn: '0' + id: 8c10 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d5)' +- bus: '00' + dev: '1c' + fn: '7' + id: 8c1e + name: 'Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #8 (rev d5)' +- bus: '00' + dev: '1d' + fn: '0' + id: 8c26 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family USB EHCI #1 (rev 05)' +- bus: '00' + dev: '1f' + fn: '0' + id: 8c54 + name: 'Intel Corporation C224 Series Chipset Family Server Standard SKU LPC Controller (rev 05)' +- bus: '00' + dev: '1f' + fn: '2' + id: 8c02 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] (rev 05)' +- bus: '00' + dev: '1f' + fn: '3' + id: 8c22 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller (rev 05)' +- bus: '02' + dev: '00' + fn: '0' + id: 1b58 + name: 'Device 1d98:1b58 (rev 10)' +- bus: '04' + dev: '00' + fn: '0' + id: 15a7 + name: 'Intel Corporation Device 15a7' +- bus: '04' + dev: '00' + fn: '1' + id: 15a7 + name: 'Intel Corporation Device 15a7' +- bus: '05' + dev: '00' + fn: '0' + id: 15a7 + name: 'Intel Corporation Device 15a7' +- bus: '05' + dev: '00' + fn: '1' + id: 15a7 + name: 'Intel Corporation Device 15a7' +- bus: '0b' + dev: '00' + fn: '0' + id: 1533 + name: 'Intel Corporation I210 Gigabit Network Connection (rev 03)' +- bus: 'ff' + dev: '0b' + fn: '0' + id: 6f81 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 05)' +- bus: 'ff' + dev: '0b' + fn: '1' + id: 6f36 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 05)' +- bus: 'ff' + dev: '0b' + fn: '2' + id: 6f37 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 05)' +- bus: 'ff' + dev: '0b' + fn: '3' + id: 6f76 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link Debug (rev 05)' +- bus: 'ff' + dev: '0c' + fn: '0' + id: 6fe0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0c' + fn: '1' + id: 6fe1 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0c' + fn: '2' + id: 6fe2 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0c' + fn: '3' + id: 6fe3 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0f' + fn: '0' + id: 6ff8 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0f' + fn: '4' + id: 6ffc + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0f' + fn: '5' + id: 6ffd + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '0f' + fn: '6' + id: 6ffe + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 05)' +- bus: 'ff' + dev: '10' + fn: '0' + id: 6f1d + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 05)' +- bus: 'ff' + dev: '10' + fn: '1' + id: 6f34 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 05)' +- bus: 'ff' + dev: '10' + fn: '5' + id: 6f1e + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 05)' +- bus: 'ff' + dev: '10' + fn: '6' + id: 6f7d + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 05)' +- bus: 'ff' + dev: '10' + fn: '7' + id: 6f1f + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 05)' +- bus: 'ff' + dev: '12' + fn: '0' + id: 6fa0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 05)' +- bus: 'ff' + dev: '12' + fn: '1' + id: 6f30 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 05)' +- bus: 'ff' + dev: '12' + fn: '2' + id: 6f70 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 Debug (rev 05)' +- bus: 'ff' + dev: '13' + fn: '0' + id: 6fa8 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 05)' +- bus: 'ff' + dev: '13' + fn: '1' + id: 6f71 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 05)' +- bus: 'ff' + dev: '13' + fn: '2' + id: 6faa + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 05)' +- bus: 'ff' + dev: '13' + fn: '3' + id: 6fab + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 05)' +- bus: 'ff' + dev: '13' + fn: '4' + id: 6fac + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 05)' +- bus: 'ff' + dev: '13' + fn: '5' + id: 6fad + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 05)' +- bus: 'ff' + dev: '13' + fn: '6' + id: 6fae + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Broadcast (rev 05)' +- bus: 'ff' + dev: '13' + fn: '7' + id: 6faf + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast (rev 05)' +- bus: 'ff' + dev: '14' + fn: '0' + id: 6fb0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Thermal Control (rev 05)' +- bus: 'ff' + dev: '14' + fn: '1' + id: 6fb1 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Thermal Control (rev 05)' +- bus: 'ff' + dev: '14' + fn: '2' + id: 6fb2 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Error (rev 05)' +- bus: 'ff' + dev: '14' + fn: '3' + id: 6fb3 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Error (rev 05)' +- bus: 'ff' + dev: '14' + fn: '4' + id: 6fbc + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 05)' +- bus: 'ff' + dev: '14' + fn: '5' + id: 6fbd + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 05)' +- bus: 'ff' + dev: '14' + fn: '6' + id: 6fbe + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 05)' +- bus: 'ff' + dev: '14' + fn: '7' + id: 6fbf + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 05)' +- bus: 'ff' + dev: '15' + fn: '0' + id: 6fb4 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Thermal Control (rev 05)' +- bus: 'ff' + dev: '15' + fn: '1' + id: 6fb5 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Thermal Control (rev 05)' +- bus: 'ff' + dev: '15' + fn: '2' + id: 6fb6 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Error (rev 05)' +- bus: 'ff' + dev: '15' + fn: '3' + id: 6fb7 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Error (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '0' + id: 6f98 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '1' + id: 6f99 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '2' + id: 6f9a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '3' + id: 6fc0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '4' + id: 6f9c + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1e' + fn: '7' + id: 6f9f + name: 'Intel Corporation Device 6f9f (rev 05)' +- bus: 'ff' + dev: '1f' + fn: '0' + id: 6f88 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' +- bus: 'ff' + dev: '1f' + fn: '2' + id: 6f8a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 05)' diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/platform.json b/device/wistron/x86_64-wistron_6512_32r-r0/platform.json new file mode 100644 index 000000000000..f978e6190513 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/platform.json @@ -0,0 +1,848 @@ +{ + "chassis": { + "name": "wistron_6512_32r", + "components": [ + { + "name": "BIOS" + }, + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "MB_FPGA" + }, + { + "name": "CPU_FPGA" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "FAN-1F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-1R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "fan_drawers": [ + { + "name": "FanTray1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-1F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-1R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray2", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-2F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray3", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-3F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray4", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-4F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray5", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-5F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray6", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-6F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray7", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-7F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU-1", + "fans": [ + { + "name": "PSU-1 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "status_led": { + "controllable": false + } + }, + { + "name": "PSU-2", + "fans": [ + { + "name": "PSU-2 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "status_led": { + "controllable": false + } + } + ], + "thermals": [ + { + "name": "Switch", + "controllable": false + }, + { + "name": "UCPUB", + "controllable": false + }, + { + "name": "UFANB", + "controllable": false + }, + { + "name": "UFRNT1", + "controllable": false + }, + { + "name": "UFRNT2", + "controllable": false + }, + { + "name": "UFRNT3", + "controllable": false + }, + { + "name": "UFRNT4", + "controllable": false + }, + { + "name": "UREAR1", + "controllable": false + } + ], + "sfps": [ + { + "name": "port1" + }, + { + "name": "port2" + }, + { + "name": "port3" + }, + { + "name": "port4" + }, + { + "name": "port5" + }, + { + "name": "port6" + }, + { + "name": "port7" + }, + { + "name": "port8" + }, + { + "name": "port9" + }, + { + "name": "port10" + }, + { + "name": "port11" + }, + { + "name": "port12" + }, + { + "name": "port13" + }, + { + "name": "port14" + }, + { + "name": "port15" + }, + { + "name": "port16" + }, + { + "name": "port17" + }, + { + "name": "port18" + }, + { + "name": "port19" + }, + { + "name": "port20" + }, + { + "name": "port21" + }, + { + "name": "port22" + }, + { + "name": "port23" + }, + { + "name": "port24" + }, + { + "name": "port25" + }, + { + "name": "port26" + }, + { + "name": "port27" + }, + { + "name": "port28" + }, + { + "name": "port29" + }, + { + "name": "port30" + }, + { + "name": "port31" + }, + { + "name": "port32" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0,0,0,0,0", + "lanes": "89,90,91,92,93,94,95,96", + "breakout_modes": { + "1x400G[100G]": ["Eth1"], + "1x100G(4)": ["Eth1"], + "4x25G[10G](4)": ["Eth1-1", "Eth1-2", "Eth1-3", "Eth1-4"], + "4x10G[25G](4)": ["Eth1-1", "Eth1-2", "Eth1-3", "Eth1-4"] + } + }, + "Ethernet8": { + "index": "1,1,1,1,1,1,1,1", + "lanes": "81,82,83,84,85,86,87,88", + "breakout_modes": { + "1x400G[100G]": ["Eth2"], + "1x100G(4)": ["Eth2"], + "4x25G[10G](4)": ["Eth2-1", "Eth2-2", "Eth2-3", "Eth2-4"], + "4x10G[25G](4)": ["Eth2-1", "Eth2-2", "Eth2-3", "Eth2-4"] + } + }, + "Ethernet16": { + "index": "2,2,2,2,2,2,2,2", + "lanes": "73,74,75,76,77,78,79,80", + "breakout_modes": { + "1x400G[100G]": ["Eth3"], + "1x100G(4)": ["Eth3"], + "4x25G[10G](4)": ["Eth3-1", "Eth3-2", "Eth3-3", "Eth3-4"], + "4x10G[25G](4)": ["Eth3-1", "Eth3-2", "Eth3-3", "Eth3-4"] + } + }, + "Ethernet24": { + "index": "3,3,3,3,3,3,3,3", + "lanes": "65,66,67,68,69,70,71,72", + "breakout_modes": { + "1x400G[100G]": ["Eth4"], + "1x100G(4)": ["Eth4"], + "4x25G[10G](4)": ["Eth4-1", "Eth4-2", "Eth4-3", "Eth4-4"], + "4x10G[25G](4)": ["Eth4-1", "Eth4-2", "Eth4-3", "Eth4-4"] + } + }, + "Ethernet32": { + "index": "4,4,4,4,4,4,4,4", + "lanes": "57,58,59,60,61,62,63,64", + "breakout_modes": { + "1x400G[100G]": ["Eth5"], + "1x100G(4)": ["Eth5"], + "4x25G[10G](4)": ["Eth5-1", "Eth5-2", "Eth5-3", "Eth5-4"], + "4x10G[25G](4)": ["Eth5-1", "Eth5-2", "Eth5-3", "Eth5-4"] + } + }, + "Ethernet40": { + "index": "5,5,5,5,5,5,5,5", + "lanes": "49,50,51,52,53,54,55,56", + "breakout_modes": { + "1x400G[100G]": ["Eth6"], + "1x100G(4)": ["Eth6"], + "4x25G[10G](4)": ["Eth6-1", "Eth6-2", "Eth6-3", "Eth6-4"], + "4x10G[25G](4)": ["Eth6-1", "Eth6-2", "Eth6-3", "Eth6-4"] + } + }, + "Ethernet48": { + "index": "6,6,6,6,6,6,6,6", + "lanes": "41,42,43,44,45,46,47,48", + "breakout_modes": { + "1x400G[100G]": ["Eth7"], + "1x100G(4)": ["Eth7"], + "4x25G[10G](4)": ["Eth7-1", "Eth7-2", "Eth7-3", "Eth7-4"], + "4x10G[25G](4)": ["Eth7-1", "Eth7-2", "Eth7-3", "Eth7-4"] + } + }, + "Ethernet56": { + "index": "7,7,7,7,7,7,7,7", + "lanes": "33,34,35,36,37,38,39,40", + "breakout_modes": { + "1x400G[100G]": ["Eth8"], + "1x100G(4)": ["Eth8"], + "4x25G[10G](4)": ["Eth8-1", "Eth8-2", "Eth8-3", "Eth8-4"], + "4x10G[25G](4)": ["Eth8-1", "Eth8-2", "Eth8-3", "Eth8-4"] + } + }, + "Ethernet64": { + "index": "8,8,8,8,8,8,8,8", + "lanes": "153,154,155,156,157,158,159,160", + "breakout_modes": { + "1x400G[100G]": ["Eth9"], + "1x100G(4)": ["Eth9"], + "4x25G[10G](4)": ["Eth9-1", "Eth9-2", "Eth9-3", "Eth9-4"], + "4x10G[25G](4)": ["Eth9-1", "Eth9-2", "Eth9-3", "Eth9-4"] + } + }, + "Ethernet72": { + "index": "9,9,9,9,9,9,9,9", + "lanes": "145,146,147,148,149,150,151,152", + "breakout_modes": { + "1x400G[100G]": ["Eth10"], + "1x100G(4)": ["Eth10"], + "4x25G[10G](4)": ["Eth10-1", "Eth10-2", "Eth10-3", "Eth10-4"], + "4x10G[25G](4)": ["Eth10-1", "Eth10-2", "Eth10-3", "Eth10-4"] + } + }, + "Ethernet80": { + "index": "10,10,10,10,10,10,10,10", + "lanes": "137,138,139,140,141,142,143,144", + "breakout_modes": { + "1x400G[100G]": ["Eth11"], + "1x100G(4)": ["Eth11"], + "4x25G[10G](4)": ["Eth11-1", "Eth11-2", "Eth11-3", "Eth11-4"], + "4x10G[25G](4)": ["Eth11-1", "Eth11-2", "Eth11-3", "Eth11-4"] + } + }, + "Ethernet88": { + "index": "11,11,11,11,11,11,11,11", + "lanes": "129,130,131,132,133,134,135,136", + "breakout_modes": { + "1x400G[100G]": ["Eth12"], + "1x100G(4)": ["Eth12"], + "4x25G[10G](4)": ["Eth12-1", "Eth12-2", "Eth12-3", "Eth12-4"], + "4x10G[25G](4)": ["Eth12-1", "Eth12-2", "Eth12-3", "Eth12-4"] + } + }, + "Ethernet96": { + "index": "12,12,12,12,12,12,12,12", + "lanes": "121,122,123,124,125,126,127,128", + "breakout_modes": { + "1x400G[100G]": ["Eth13"], + "1x100G(4)": ["Eth13"], + "4x25G[10G](4)": ["Eth13-1", "Eth13-2", "Eth13-3", "Eth13-4"], + "4x10G[25G](4)": ["Eth13-1", "Eth13-2", "Eth13-3", "Eth13-4"] + } + }, + "Ethernet104": { + "index": "13,13,13,13,13,13,13,13", + "lanes": "113,114,115,116,117,118,119,120", + "breakout_modes": { + "1x400G[100G]": ["Eth14"], + "1x100G(4)": ["Eth14"], + "4x25G[10G](4)": ["Eth14-1", "Eth14-2", "Eth14-3", "Eth14-4"], + "4x10G[25G](4)": ["Eth14-1", "Eth14-2", "Eth14-3", "Eth14-4"] + } + }, + "Ethernet112": { + "index": "14,14,14,14,14,14,14,14", + "lanes": "105,106,107,108,109,110,111,112", + "breakout_modes": { + "1x400G[100G]": ["Eth15"], + "1x100G(4)": ["Eth15"], + "4x25G[10G](4)": ["Eth15-1", "Eth15-2", "Eth15-3", "Eth15-4"], + "4x10G[25G](4)": ["Eth15-1", "Eth15-2", "Eth15-3", "Eth15-4"] + } + }, + "Ethernet120": { + "index": "15,15,15,15,15,15,15,15", + "lanes": "97,98,99,100,101,102,103,104", + "breakout_modes": { + "1x400G[100G]": ["Eth16"], + "1x100G(4)": ["Eth16"], + "4x25G[10G](4)": ["Eth16-1", "Eth16-2", "Eth16-3", "Eth16-4"], + "4x10G[25G](4)": ["Eth16-1", "Eth16-2", "Eth16-3", "Eth16-4"] + } + }, + "Ethernet128": { + "index": "16,16,16,16,16,16,16,16", + "lanes": "209,210,211,212,213,214,215,216", + "breakout_modes": { + "1x400G[100G]": ["Eth17"], + "1x100G(4)": ["Eth17"], + "4x25G[10G](4)": ["Eth17-1", "Eth17-2", "Eth17-3", "Eth17-4"], + "4x10G[25G](4)": ["Eth17-1", "Eth17-2", "Eth17-3", "Eth17-4"] + } + }, + "Ethernet136": { + "index": "17,17,17,17,17,17,17,17", + "lanes": "217,218,219,220,221,222,223,224", + "breakout_modes": { + "1x400G[100G]": ["Eth18"], + "1x100G(4)": ["Eth18"], + "4x25G[10G](4)": ["Eth18-1", "Eth18-2", "Eth18-3", "Eth18-4"], + "4x10G[25G](4)": ["Eth18-1", "Eth18-2", "Eth18-3", "Eth18-4"] + } + }, + "Ethernet144": { + "index": "18,18,18,18,18,18,18,18", + "lanes": "193,194,195,196,197,198,199,200", + "breakout_modes": { + "1x400G[100G]": ["Eth19"], + "1x100G(4)": ["Eth19"], + "4x25G[10G](4)": ["Eth19-1", "Eth19-2", "Eth19-3", "Eth19-4"], + "4x10G[25G](4)": ["Eth19-1", "Eth19-2", "Eth19-3", "Eth19-4"] + } + }, + "Ethernet152": { + "index": "19,19,19,19,19,19,19,19", + "lanes": "201,202,203,204,205,206,207,208", + "breakout_modes": { + "1x400G[100G]": ["Eth20"], + "1x100G(4)": ["Eth20"], + "4x25G[10G](4)": ["Eth20-1", "Eth20-2", "Eth20-3", "Eth20-4"], + "4x10G[25G](4)": ["Eth20-1", "Eth20-2", "Eth20-3", "Eth20-4"] + } + }, + "Ethernet160": { + "index": "20,20,20,20,20,20,20,20", + "lanes": "177,178,179,180,181,182,183,184", + "breakout_modes": { + "1x400G[100G]": ["Eth21"], + "1x100G(4)": ["Eth21"], + "4x25G[10G](4)": ["Eth21-1", "Eth21-2", "Eth21-3", "Eth21-4"], + "4x10G[25G](4)": ["Eth21-1", "Eth21-2", "Eth21-3", "Eth21-4"] + } + }, + "Ethernet168": { + "index": "21,21,21,21,21,21,21,21", + "lanes": "185,186,187,188,189,190,191,192", + "breakout_modes": { + "1x400G[100G]": ["Eth22"], + "1x100G(4)": ["Eth22"], + "4x25G[10G](4)": ["Eth22-1", "Eth22-2", "Eth22-3", "Eth22-4"], + "4x10G[25G](4)": ["Eth22-1", "Eth22-2", "Eth22-3", "Eth22-4"] + } + }, + "Ethernet176": { + "index": "22,22,22,22,22,22,22,22", + "lanes": "161,162,163,164,165,166,167,168", + "breakout_modes": { + "1x400G[100G]": ["Eth23"], + "1x100G(4)": ["Eth23"], + "4x25G[10G](4)": ["Eth23-1", "Eth23-2", "Eth23-3", "Eth23-4"], + "4x10G[25G](4)": ["Eth23-1", "Eth23-2", "Eth23-3", "Eth23-4"] + } + }, + "Ethernet184": { + "index": "23,23,23,23,23,23,23,23", + "lanes": "169,170,171,172,173,174,175,176", + "breakout_modes": { + "1x400G[100G]": ["Eth24"], + "1x100G(4)": ["Eth24"], + "4x25G[10G](4)": ["Eth24-1", "Eth24-2", "Eth24-3", "Eth24-4"], + "4x10G[25G](4)": ["Eth24-1", "Eth24-2", "Eth24-3", "Eth24-4"] + } + }, + "Ethernet192": { + "index": "24,24,24,24,24,24,24,24", + "lanes": "17,18,19,20,21,22,23,24", + "breakout_modes": { + "1x400G[100G]": ["Eth25"], + "1x100G(4)": ["Eth25"], + "4x25G[10G](4)": ["Eth25-1", "Eth25-2", "Eth25-3", "Eth25-4"], + "4x10G[25G](4)": ["Eth25-1", "Eth25-2", "Eth25-3", "Eth25-4"] + } + }, + "Ethernet200": { + "index": "25,25,25,25,25,25,25,25", + "lanes": "25,26,27,28,29,30,31,32", + "breakout_modes": { + "1x400G[100G]": ["Eth26"], + "1x100G(4)": ["Eth26"], + "4x25G[10G](4)": ["Eth26-1", "Eth26-2", "Eth26-3", "Eth26-4"], + "4x10G[25G](4)": ["Eth26-1", "Eth26-2", "Eth26-3", "Eth26-4"] + } + }, + "Ethernet208": { + "index": "26,26,26,26,26,26,26,26", + "lanes": "1,2,3,4,5,6,7,8", + "breakout_modes": { + "1x400G[100G]": ["Eth27"], + "1x100G(4)": ["Eth27"], + "4x25G[10G](4)": ["Eth27-1", "Eth27-2", "Eth27-3", "Eth27-4"], + "4x10G[25G](4)": ["Eth27-1", "Eth27-2", "Eth27-3", "Eth27-4"] + } + }, + "Ethernet216": { + "index": "27,27,27,27,27,27,27,27", + "lanes": "9,10,11,12,13,14,15,16", + "breakout_modes": { + "1x400G[100G]": ["Eth28"], + "1x100G(4)": ["Eth28"], + "4x25G[10G](4)": ["Eth28-1", "Eth28-2", "Eth28-3", "Eth28-4"], + "4x10G[25G](4)": ["Eth28-1", "Eth28-2", "Eth28-3", "Eth28-4"] + } + }, + "Ethernet224": { + "index": "28,28,28,28,28,28,28,28", + "lanes": "241,242,243,244,245,246,247,248", + "breakout_modes": { + "1x400G[100G]": ["Eth29"], + "1x100G(4)": ["Eth29"], + "4x25G[10G](4)": ["Eth29-1", "Eth29-2", "Eth29-3", "Eth29-4"], + "4x10G[25G](4)": ["Eth29-1", "Eth29-2", "Eth29-3", "Eth29-4"] + } + }, + "Ethernet232": { + "index": "29,29,29,29,29,29,29,29", + "lanes": "249,250,251,252,253,254,255,256", + "breakout_modes": { + "1x400G[100G]": ["Eth30"], + "1x100G(4)": ["Eth30"], + "4x25G[10G](4)": ["Eth30-1", "Eth30-2", "Eth30-3", "Eth30-4"], + "4x10G[25G](4)": ["Eth30-1", "Eth30-2", "Eth30-3", "Eth30-4"] + } + }, + "Ethernet240": { + "index": "30,30,30,30,30,30,30,30", + "lanes": "225,226,227,228,229,230,231,232", + "breakout_modes": { + "1x400G[100G]": ["Eth31"], + "1x100G(4)": ["Eth31"], + "4x25G[10G](4)": ["Eth31-1", "Eth31-2", "Eth31-3", "Eth31-4"], + "4x10G[25G](4)": ["Eth31-1", "Eth31-2", "Eth31-3", "Eth31-4"] + } + }, + "Ethernet248": { + "index": "31,31,31,31,31,31,31,31", + "lanes": "233,234,235,236,237,238,239,240", + "breakout_modes": { + "1x400G[100G]": ["Eth32"], + "1x100G(4)": ["Eth32"], + "4x25G[10G](4)": ["Eth32-1", "Eth32-2", "Eth32-3", "Eth32-4"], + "4x10G[25G](4)": ["Eth32-1", "Eth32-2", "Eth32-3", "Eth32-4"] + } + } + } +} 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 index 8dbc6ba8519a..c38b792bb9ca 100644 --- a/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py +++ b/device/wistron/x86_64-wistron_6512_32r-r0/plugins/sfputil.py @@ -111,6 +111,7 @@ def get_presence(self, port_num): val_file.close() except IOError as e: print("Error: unable to access file: %s" % str(e)) + val_file.close() return False if content == "1": @@ -134,6 +135,7 @@ def get_low_power_mode(self, port_num): val_file.close() except IOError as e: print("Error: unable to access file: %s" % str(e)) + val_file.close() return False if content == "1": @@ -158,10 +160,35 @@ def set_low_power_mode(self, port_num, lpmode): return True except IOError as e: print("Error: unable to open file: %s" % str(e)) + val_file.close() return False def reset(self, port_num): - raise NotImplementedError + if port_num < self.port_start or port_num > self.port_end: + return False + if not self.get_presence(port_num): + return False # Port is not present, unable to set reset + + if port_num < 16: + reset_path = self.BASE_CPLD1_PATH + "port" + str(port_num+1) + "_reset" + else: + reset_path = self.BASE_CPLD2_PATH + "port" + str(port_num+1) + "_reset" + + self.__port_to_mod_rst = reset_path + + try: + val_file = open(self.__port_to_mod_rst, 'w') + val_file.write('1') + time.sleep(1) + val_file.write('0') + time.sleep(1) + val_file.close() + return True + except IOError as e: + print("Error: unable to open file: %s" % str(e)) + val_file.close() + return False + def _get_sfp_presence(self): port_pres = {} 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 deleted file mode 100644 index aec7e23be5c0..000000000000 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/fan.py +++ /dev/null @@ -1,182 +0,0 @@ -#!/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/psu.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py deleted file mode 100644 index dc13cc1ed824..000000000000 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/psu.py +++ /dev/null @@ -1,248 +0,0 @@ -#!/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/watchdog.py b/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py deleted file mode 100644 index 820dd54f954a..000000000000 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/watchdog.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/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/system_health_monitoring_config.json b/device/wistron/x86_64-wistron_6512_32r-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..0e0eec971cac --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["asic"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "red", + "normal": "green", + "booting": "green_blinking" + } +} 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 index 17ed53abb1d0..cc5bebd7f719 100644 --- 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 @@ -9,16 +9,17 @@ nodes: 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" + wred_cr_ip_proto_list: "17" + cr_assignment_mode: "1" max_lossless_tc: "2" ilpm_enable: "1" forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" - ecn_stats_enable: "1" + 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" @@ -41,22 +42,24 @@ nodes: desc_count: "1024" prio: "1" netdev: "true" - queues: "0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44" + 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, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45" + 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, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46" + queues: "2, 5, 8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 47" - rxring_id: "3" desc_count: "1024" prio: "1" - netdev: "true" - queues: "3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47" + queues: "42, 43, 44, 45, 46" + sys_clk: "1720" + ifc_clk: "1200" + mac_clk: "1340" devports: - id: "0" sysport: "1000" @@ -285,20 +288,6 @@ nodes: 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" 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 index 1a31812c26b1..b9265c62eb8f 100644 --- 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 @@ -1,3 +1,63 @@ +{# Default values which will be used if no actual configuration 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 %} @@ -5,34 +65,98 @@ {% 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": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, "lossy_pool": { - "size": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"135520", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..79dbf9b2864b 100644 --- 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 @@ -7,7 +7,7 @@ { "BUFFER_POOL": { "lossy_pool": { - "size": "56985600", + "size": "61458432", "type": "egress", "mode": "dynamic", "xoff": "0" @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..b9265c62eb8f 100644 --- 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 @@ -1,4 +1,4 @@ -{# Default values which will be used if no actual configura available #} +{# Default values which will be used if no actual configuration available #} {% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} @@ -76,7 +76,7 @@ }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "47218432", + "size": "51691264", "type": "ingress", "mode": "dynamic", "xoff": "17708800" @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"38816", + "pool":"ingress_lossless_pool", + "xoff":"135520", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/hwsku.json b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/hwsku.json new file mode 100644 index 000000000000..7157f361663e --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index cf505b299dd8..e3db67a5ccc5 100644 --- 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 @@ -3,6 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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 index 891b0b3e2834..a539d6c70040 100644 --- 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 @@ -1,9 +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_0_LS : "864 864 720 720 720 720" +ISAI_PARAM_P0_1_LS : "770 490 434 378 378 378" 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_0_LS : "288 288 240 240 240 240" +ISAI_PARAM_P1_0_LL : "576 576 480 480 480 480" +ISAI_PARAM_P1_1_LS : "686 406 364 308 308 308" +ISAI_PARAM_P1_1_LL : "574 574 574 574 574 574" 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 index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 index 104d2d78de87..b03078465730 100644 --- 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 @@ -32,87 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, - "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 104d2d78de87..c1170619bc6c 100644 --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 index 4b9748c7b594..b03078465730 100644 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/6512-32_32x100G.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/6512-32_32x100G.config.yaml new file mode 100644 index 000000000000..f22016d7be80 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/6512-32_32x100G.config.yaml @@ -0,0 +1,419 @@ +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" + wred_cr_ip_proto_list: "17" + cr_assignment_mode: "1" + max_lossless_tc: "2" + ilpm_enable: "1" + forward_profile: "IFCS_FORWARD_PROFILE_ID_PROFILE_E" + 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" + - id: "89" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "11" + speed: "100G" + sysport: "89" + type: "eth" + - id: "81" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "10" + speed: "100G" + sysport: "81" + type: "eth" + - id: "73" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "9" + speed: "100G" + sysport: "73" + type: "eth" + - id: "65" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "8" + speed: "100G" + sysport: "65" + type: "eth" + - id: "57" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "7" + speed: "100G" + sysport: "57" + type: "eth" + - id: "49" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "6" + speed: "100G" + sysport: "49" + type: "eth" + - id: "41" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "5" + speed: "100G" + sysport: "41" + type: "eth" + - id: "33" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "4" + speed: "100G" + sysport: "33" + type: "eth" + - id: "153" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "19" + speed: "100G" + sysport: "153" + type: "eth" + - id: "145" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "18" + speed: "100G" + sysport: "145" + type: "eth" + - id: "137" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "17" + speed: "100G" + sysport: "137" + type: "eth" + - id: "129" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "16" + speed: "100G" + sysport: "129" + type: "eth" + - id: "121" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "15" + speed: "100G" + sysport: "121" + type: "eth" + - id: "113" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "14" + speed: "100G" + sysport: "113" + type: "eth" + - id: "105" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "13" + speed: "100G" + sysport: "105" + type: "eth" + - id: "97" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "12" + speed: "100G" + sysport: "97" + type: "eth" + - id: "209" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "26" + speed: "100G" + sysport: "209" + type: "eth" + - id: "217" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "27" + speed: "100G" + sysport: "217" + type: "eth" + - id: "193" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "24" + speed: "100G" + sysport: "193" + type: "eth" + - id: "201" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "25" + speed: "100G" + sysport: "201" + type: "eth" + - id: "177" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "22" + speed: "100G" + sysport: "177" + type: "eth" + - id: "185" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "23" + speed: "100G" + sysport: "185" + type: "eth" + - id: "161" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "20" + speed: "100G" + sysport: "161" + type: "eth" + - id: "169" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "21" + speed: "100G" + sysport: "169" + type: "eth" + - id: "17" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "2" + speed: "100G" + sysport: "17" + type: "eth" + - id: "25" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "3" + speed: "100G" + sysport: "25" + type: "eth" + - id: "1" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "0" + speed: "100G" + sysport: "1" + type: "eth" + - id: "9" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "1" + speed: "100G" + sysport: "9" + type: "eth" + - id: "241" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "30" + speed: "100G" + sysport: "241" + type: "eth" + - id: "249" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "31" + speed: "100G" + sysport: "249" + type: "eth" + - id: "225" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "28" + speed: "100G" + sysport: "225" + type: "eth" + - id: "233" + fec: "KRFEC" + lanes: "0:4" + serdes_group: "29" + speed: "100G" + sysport: "233" + type: "eth" + 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_32x100/buffers.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers.json.j2 new file mode 100644 index 000000000000..020656fdb8f5 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers.json.j2 @@ -0,0 +1,162 @@ +{# 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": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_def_lossy.j2 new file mode 100644 index 000000000000..79dbf9b2864b --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_def_lossy.j2 @@ -0,0 +1,42 @@ +{% 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": "61458432", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + } + }, + "BUFFER_PROFILE": { + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + }, + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_t1.j2 new file mode 100644 index 000000000000..020656fdb8f5 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/buffers_defaults_t1.j2 @@ -0,0 +1,162 @@ +{# 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": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, + "lossy_pool": { + "size": "18874368", + "type": "egress", + "mode": "dynamic", + "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" + } + }, + "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, + "ingress_lossy_profile": { + "pool":"lossy_pool", + "size":"0", + "static_th":"10243072" + }, + "egress_lossy_profile": { + "pool":"lossy_pool", + "size":"1518", + "dynamic_th":"2" + } + }, + "BUFFER_PG": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + + "BUFFER_QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/hwsku.json b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/hwsku.json new file mode 100644 index 000000000000..4116ae2ba5f1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_A b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_A new file mode 100644 index 000000000000..ec13307805e1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_A @@ -0,0 +1,60 @@ +sku: innovium.77700_A + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + ib_active: 0,1,2,3,4,5 + + 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_32x100/innovium.77700_B b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_B new file mode 100644 index 000000000000..57ba52cbc3bc --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/innovium.77700_B @@ -0,0 +1,60 @@ +sku: innovium.77700_B + +device_id: 0x1b58 + +# Hardware constraint information +hardware: + num_ibs: 6 + ib_active: 0,1,2,3,4,5 + + 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_32x100/ivm.sai.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/ivm.sai.config.yaml new file mode 100644 index 000000000000..1f90f4de88dd --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/ivm.sai.config.yaml @@ -0,0 +1,9 @@ +IFCS_INIT_FILE : "/usr/share/sonic/hwsku/6512-32_32x100G.config.yaml" +IFCS_SKU_FILE : "/usr/share/sonic/hwsku/innovium.77700_A" +IFCS_INNO_CLI_PORT : "9999" +IFCS_TARGET : "device" +INNOVIUM_DIR : "/innovium" +PLATFORM_LIBRARY: "/usr/share/sonic/platform/lib_ivm_serdes_pltfm.so" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" +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_32x100/ivm.sai.datapath.config.yaml b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/ivm.sai.datapath.config.yaml new file mode 100644 index 000000000000..891b0b3e2834 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_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_6512_32r-r0/wistron_6512_32r_32x100/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/pg_profile_lookup.ini new file mode 100644 index 000000000000..0d881737cfa1 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/pg_profile_lookup.ini @@ -0,0 +1,22 @@ +# PG lossless profiles. +# speed cable size xon xoff threshold xon_offset + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/port_config.ini b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/port_config.ini new file mode 100644 index 000000000000..9507616bd5c2 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_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_6512_32r-r0/wistron_6512_32r_32x100/qos.json.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos.json.j2 new file mode 100644 index 000000000000..b03078465730 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos.json.j2 @@ -0,0 +1,129 @@ +{% 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" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_def_lossy.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_def_lossy.j2 new file mode 100644 index 000000000000..c1170619bc6c --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_def_lossy.j2 @@ -0,0 +1,121 @@ +{% 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": "1", + "4": "2", + "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": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "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_32x100/qos_defaults_t1.j2 b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_t1.j2 new file mode 100644 index 000000000000..b03078465730 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/qos_defaults_t1.j2 @@ -0,0 +1,129 @@ +{% 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" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" + } + } +} diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/sai.profile b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_32x100/sai.profile new file mode 100644 index 000000000000..aba4fc81fb17 --- /dev/null +++ b/device/wistron/x86_64-wistron_6512_32r-r0/wistron_6512_32r_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/buffers.json.j2 b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/buffers.json.j2 index 1a31812c26b1..b9265c62eb8f 100644 --- 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 @@ -1,3 +1,63 @@ +{# Default values which will be used if no actual configuration 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 %} @@ -5,34 +65,98 @@ {% 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": "51691264", + "type": "ingress", + "mode": "dynamic", + "xoff": "17708800" + }, "lossy_pool": { - "size": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"135520", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"10243072" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..79dbf9b2864b 100644 --- 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 @@ -7,7 +7,7 @@ { "BUFFER_POOL": { "lossy_pool": { - "size": "56985600", + "size": "61458432", "type": "egress", "mode": "dynamic", "xoff": "0" @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..b9265c62eb8f 100644 --- 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 @@ -1,4 +1,4 @@ -{# Default values which will be used if no actual configura available #} +{# Default values which will be used if no actual configuration available #} {% set default_cable = '40m' %} {# Port configuration to cable length look-up table #} @@ -76,7 +76,7 @@ }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "47218432", + "size": "51691264", "type": "ingress", "mode": "dynamic", "xoff": "17708800" @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", - "xoff":"38816", + "pool":"ingress_lossless_pool", + "xoff":"135520", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 23445c6dede5..b96146517adb 100644 --- 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 @@ -10,13 +10,11 @@ nodes: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" + wred_cr_ip_proto_list: "17" + cr_assignment_mode: "1" 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" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/hwsku.json new file mode 100644 index 000000000000..7157f361663e --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index 0c1644ab7d72..ed98d89bfac6 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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 index 891b0b3e2834..a539d6c70040 100644 --- 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 @@ -1,9 +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_0_LS : "864 864 720 720 720 720" +ISAI_PARAM_P0_1_LS : "770 490 434 378 378 378" 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_0_LS : "288 288 240 240 240 240" +ISAI_PARAM_P1_0_LL : "576 576 480 480 480 480" +ISAI_PARAM_P1_1_LS : "686 406 364 308 308 308" +ISAI_PARAM_P1_1_LL : "574 574 574 574 574 574" 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 index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 104d2d78de87..0f1ecd1106d0 --- 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 @@ -18,6 +18,18 @@ "7":"7" } }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "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", @@ -32,87 +44,149 @@ }, "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]" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "SCHEDULER": { - "scheduler.7": { - "type": "STRICT" + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" } }, "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" +{% for port in port_names_list %} + "{{ port }}|3": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|4": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|2": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|6": { + "scheduler": "scheduler.0" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "PORT_QOS_MAP": { +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_to_queue_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..0f1ecd1106d0 --- 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 @@ -18,6 +18,18 @@ "7":"7" } }, + "MAP_PFC_PRIORITY_TO_QUEUE": { + "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", @@ -32,83 +44,149 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" + } + }, + "SCHEDULER": { + "scheduler.0": { + "type" : "DWRR", + "weight": "1" + }, + "scheduler.1": { + "type" : "DWRR", + "weight": "1" } }, + "QUEUE": { +{% for port in port_names_list %} + "{{ port }}|3": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|4": { + "scheduler" : "scheduler.1", + "wred_profile" : "AZURE_LOSSLESS" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|2": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5": { + "scheduler": "scheduler.0" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|6": { + "scheduler": "scheduler.0" + }{% if not loop.last %},{% endif %} + +{% endfor %} + }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_to_queue_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 1a31812c26b1..794b5c854689 100644 --- 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 @@ -1,3 +1,63 @@ +{# 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 %} @@ -5,34 +65,98 @@ {% 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": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"9497600" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..abb756c7d4ef 100644 --- 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 @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..17b85f08443a 100644 --- 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 @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"9497600" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/hwsku.json new file mode 100644 index 000000000000..c874d4d0b9ba --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet152": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet160": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet168": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet176": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet184": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet192": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet200": { + "default_brkout_mode": "4x10G[25G](4)", + "fec": "none" + }, + "Ethernet208": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet232": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet240": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet248": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index 5e5d2fe66861..b9f2cc4061d1 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_104x1025_6x100/pg_profile_lookup.ini index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 104d2d78de87..b03078465730 --- 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 @@ -32,87 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, - "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 1a31812c26b1..794b5c854689 100644 --- 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 @@ -1,3 +1,63 @@ +{# 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 %} @@ -5,34 +65,98 @@ {% 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": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"9497600" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..abb756c7d4ef 100644 --- 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 @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..1479f78fed9e 100644 --- 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 @@ -86,52 +86,76 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "type": "egress" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"9497600" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/hwsku.json new file mode 100644 index 000000000000..c597c7248c87 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet200": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet208": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet216": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet224": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet232": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet240": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet248": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index 8014caa1da4d..3a18ade8f2b2 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_24x400_8x100/pg_profile_lookup.ini index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 104d2d78de87..b03078465730 --- 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 @@ -32,87 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, - "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 1a31812c26b1..794b5c854689 100644 --- 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 @@ -1,3 +1,63 @@ +{# 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 %} @@ -5,34 +65,98 @@ {% 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": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"9497600" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..abb756c7d4ef 100644 --- 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 @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..17b85f08443a 100644 --- 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 @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"9497600" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/hwsku.json new file mode 100644 index 000000000000..ac524d6920ce --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet40": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet88": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet152": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x100G(4)", + "fec": "none" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index e17792d88daa..36fd34a546c4 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_28x400_4x100/pg_profile_lookup.ini index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 104d2d78de87..b03078465730 --- 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 @@ -32,87 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, - "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 93dac6b1992a..020656fdb8f5 100644 --- 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 @@ -76,7 +76,7 @@ }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "47218432", + "size": "51691264", "type": "ingress", "mode": "dynamic", "xoff": "17708800" @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..79dbf9b2864b 100644 --- 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 @@ -7,7 +7,7 @@ { "BUFFER_POOL": { "lossy_pool": { - "size": "56985600", + "size": "61458432", "type": "egress", "mode": "dynamic", "xoff": "0" @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..020656fdb8f5 100644 --- 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 @@ -76,7 +76,7 @@ }, "BUFFER_POOL": { "ingress_lossless_pool": { - "size": "47218432", + "size": "51691264", "type": "ingress", "mode": "dynamic", "xoff": "17708800" @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "70565632", + "type": "egress", + "mode": "static" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", - "static_th":"9497600" + "static_th":"10243072" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index a6f5d00d8b34..a0faac84625e 100644 --- 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 @@ -10,12 +10,11 @@ nodes: - auto_create: "no" multi_interface: "yes" buffer_management_mode: "api_driven" + wred_cr_ip_proto_list: "17" + cr_assignment_mode: "1" 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" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/hwsku.json new file mode 100644 index 000000000000..4116ae2ba5f1 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + } + } +} 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index 8ae2b9683d49..7bc06c952692 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_32x100/pg_profile_lookup.ini index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 index 1a31812c26b1..794b5c854689 100644 --- 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 @@ -1,3 +1,63 @@ +{# 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 %} @@ -5,34 +65,98 @@ {% 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": "56985600", + "size": "18874368", "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { + "ingress_lossless_profile": { + "pool":"ingress_lossless_pool", + "xoff":"38816", + "size":"1518", + "dynamic_th":"1", + "xon_offset":"9408" + }, + "egress_lossless_profile": { + "pool":"ingress_lossless_pool", + "size":"0", + "static_th":"9497600" + }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } 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 index 1a31812c26b1..abb756c7d4ef 100644 --- 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 @@ -15,24 +15,28 @@ }, "BUFFER_PROFILE": { "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"1518", "dynamic_th":"2" } }, "BUFFER_PG": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|ingress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} }, "BUFFER_QUEUE": { - "{{ port_names }}|0-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% for port in port_names_list %} + "{{ port }}|0-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} +{% endfor %} } } 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 index 93dac6b1992a..17b85f08443a 100644 --- 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 @@ -86,52 +86,77 @@ "type": "egress", "mode": "dynamic", "xoff": "0" + }, + "egress_lossless_pool": { + "size": "66092800", + "mode": "static", + "type": "egress" } }, "BUFFER_PROFILE": { "ingress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "xoff":"38816", "size":"1518", "dynamic_th":"1", - "xon_offset":"13440" + "xon_offset":"9408" }, "egress_lossless_profile": { - "pool":"[BUFFER_POOL|ingress_lossless_pool]", + "pool":"ingress_lossless_pool", "size":"0", "static_th":"9497600" }, "ingress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "pool":"lossy_pool", "size":"0", "static_th":"9497600" }, "egress_lossy_profile": { - "pool":"[BUFFER_POOL|lossy_pool]", + "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]" - } +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "ingress_lossless_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|1-2": { + "profile" : "ingress_lossy_profile" + }, +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "ingress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, + "BUFFER_QUEUE": { - "{{ port_names }}|3-4": { - "profile" : "[BUFFER_PROFILE|egress_lossless_profile]" +{% for port in port_names_list %} + "{{ port }}|3-4": { + "profile" : "egress_lossless_profile" }, - "{{ port_names }}|0-2": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|0-2": { + "profile" : "egress_lossy_profile" }, - "{{ port_names }}|5-7": { - "profile" : "[BUFFER_PROFILE|egress_lossy_profile]" - } +{% endfor %} +{% for port in port_names_list %} + "{{ port }}|5-7": { + "profile" : "egress_lossy_profile" + }{% if not loop.last %},{% endif %} + +{% endfor %} } } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/hwsku.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/hwsku.json new file mode 100644 index 000000000000..6472483dc248 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/hwsku.json @@ -0,0 +1,132 @@ +{ + "interfaces": { + "Ethernet0": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet8": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet16": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet24": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet32": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet40": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet48": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet56": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet64": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet72": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet80": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet88": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet96": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet104": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet112": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet120": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet128": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet136": { + "default_brkout_mode": "4x25G[10G](4)", + "fec": "rs" + }, + "Ethernet144": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet152": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet160": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet168": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet176": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet184": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet192": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet200": { + "default_brkout_mode": "1x100G(4)", + "fec": "rs" + }, + "Ethernet208": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet216": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet224": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet232": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet240": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + }, + "Ethernet248": { + "default_brkout_mode": "1x400G[100G]", + "fec": "rs" + } + } +} 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 index 84aa41983606..ec13307805e1 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 index 27297b313959..57ba52cbc3bc 100644 --- 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 @@ -5,6 +5,7 @@ device_id: 0x1b58 # Hardware constraint information hardware: num_ibs: 6 + ib_active: 0,1,2,3,4,5 ports_per_ib: 32, 32, 32, 32, 20, 20 recirc_port_num: 32, 32, 32, 32, 32, 32 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 old mode 100644 new mode 100755 index 01fe64ec7bc9..36da27953d49 --- 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 @@ -3,7 +3,7 @@ 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" +PYTHONPATH : "$INNOVIUM_DIR:$INNOVIUM_DIR/cmds:$INNOVIUM_DIR/scripts:$INNOVIUM_DIR/test/:$INNOVIUM_DIR/test/utils:$INNOVIUM_DIR/utils:$INNOVIUM_DIR/pyctypes:$INNOVIUM_DIR/ifcs_cmds:$INNOVIUM_DIR/testutil" 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/pg_profile_lookup.ini b/device/wistron/x86_64-wistron_sw_to3200k-r0/Wistron_sw_to3200k_72x25_6x400/pg_profile_lookup.ini index adcb52ab2a29..0d881737cfa1 100644 --- 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 @@ -1,18 +1,22 @@ # 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 + 25000 5m 1518 0 15680 1 9408 + 50000 5m 1518 0 21248 1 9408 + 100000 5m 1518 0 34624 1 9408 + 200000 5m 1518 0 62368 1 9408 + 400000 5m 1518 0 117536 1 9408 + 25000 40m 1518 0 16928 1 9408 + 50000 40m 1518 0 23392 1 9408 + 100000 40m 1518 0 38816 1 9408 + 200000 40m 1518 0 71904 1 9408 + 400000 40m 1518 0 135520 1 9408 + 25000 100m 1518 0 18848 1 9408 + 50000 100m 1518 0 27264 1 9408 + 100000 100m 1518 0 46496 1 9408 + 200000 100m 1518 0 87168 1 9408 + 400000 100m 1518 0 166688 1 9408 + 25000 300m 1518 0 25184 1 9408 + 50000 300m 1518 0 40128 1 9408 + 100000 300m 1518 0 72384 1 9408 + 200000 300m 1518 0 138112 1 9408 + 400000 300m 1518 0 268640 1 9408 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 old mode 100644 new mode 100755 index 104d2d78de87..b03078465730 --- 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 @@ -32,87 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", + "pfc_enable": "3,4" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, - "QUEUE": { - "{{ port_names }}|7": { - "scheduler": "[SCHEDULER|scheduler.7]" + "WRED_PROFILE": { + "AZURE_LOSSLESS" : { + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } 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 old mode 100644 new mode 100755 index 104d2d78de87..c1170619bc6c --- 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 @@ -23,8 +23,8 @@ "0": "0", "1": "0", "2": "0", - "3": "3", - "4": "4", + "3": "1", + "4": "2", "5": "0", "6": "0", "7": "0" @@ -99,11 +99,14 @@ } }, "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]" - } +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE" + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "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 old mode 100644 new mode 100755 index 4b9748c7b594..b03078465730 --- 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 @@ -32,83 +32,98 @@ }, "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" + "0" : "1", + "1" : "1", + "2" : "1", + "3" : "3", + "4" : "4", + "5" : "2", + "6" : "1", + "7" : "1", + "8" : "0", + "9" : "1", + "10": "1", + "11": "1", + "12": "1", + "13": "1", + "14": "1", + "15": "1", + "16": "1", + "17": "1", + "18": "1", + "19": "1", + "20": "1", + "21": "1", + "22": "1", + "23": "1", + "24": "1", + "25": "1", + "26": "1", + "27": "1", + "28": "1", + "29": "1", + "30": "1", + "31": "1", + "32": "1", + "33": "1", + "34": "1", + "35": "1", + "36": "1", + "37": "1", + "38": "1", + "39": "1", + "40": "1", + "41": "1", + "42": "1", + "43": "1", + "44": "1", + "45": "1", + "46": "5", + "47": "1", + "48": "6", + "49": "1", + "50": "1", + "51": "1", + "52": "1", + "53": "1", + "54": "1", + "55": "1", + "56": "1", + "57": "1", + "58": "1", + "59": "1", + "60": "1", + "61": "1", + "62": "1", + "63": "1" } }, "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]", +{% for port in port_names_list %} + "{{ port }}": { + "tc_to_pg_map": "AZURE", + "tc_to_queue_map": "AZURE", + "dscp_to_tc_map": "AZURE", "pfc_enable": "3,4" - } + }{% if not loop.last %},{% endif %} + +{% endfor %} }, "WRED_PROFILE": { "AZURE_LOSSLESS" : { - "red_min_threshold":"50000" + "wred_green_enable" : "true", + "wred_yellow_enable" : "true", + "wred_red_enable" : "true", + "ecn" : "ecn_all", + "green_max_threshold" : "2097152", + "green_min_threshold" : "1048576", + "yellow_max_threshold" : "2097152", + "yellow_min_threshold" : "1048576", + "red_max_threshold" : "2097152", + "red_min_threshold" : "1048576", + "green_drop_probability" : "5", + "yellow_drop_probability": "5", + "red_drop_probability" : "5" } } } diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf index 6af5fa8d979b..d7d410dae704 100644 --- a/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/installer.conf @@ -1,4 +1,4 @@ CONSOLE_PORT=0x3f8 CONSOLE_DEV=4 CONSOLE_SPEED=115200 -ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off" +ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pcie_aspm=off intel_iommu=off" diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/libplatform.so b/device/wistron/x86_64-wistron_sw_to3200k-r0/libplatform.so new file mode 100644 index 0000000000000000000000000000000000000000..1ca41771ff2dd58339f90189c280eb1b1e5e6ffa GIT binary patch literal 26640 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 F{~wL=Fn9m} literal 0 HcmV?d00001 diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/pcie.yaml b/device/wistron/x86_64-wistron_sw_to3200k-r0/pcie.yaml new file mode 100755 index 000000000000..ef4b521c66d3 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/pcie.yaml @@ -0,0 +1,375 @@ +- bus: '00' + dev: '00' + fn: '0' + id: 6f00 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DMI2 (rev 03)' +- bus: '00' + dev: '01' + fn: '0' + id: 6f02 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 (rev 03)' +- bus: '00' + dev: '01' + fn: '1' + id: 6f03 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 1 (rev 03)' +- bus: '00' + dev: '02' + fn: '0' + id: 6f04 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 (rev 03)' +- bus: '00' + dev: '02' + fn: '2' + id: 6f06 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 2 (rev 03)' +- bus: '00' + dev: '03' + fn: '0' + id: 6f08 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '1' + id: 6f09 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '2' + id: 6f0a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 03)' +- bus: '00' + dev: '03' + fn: '3' + id: 6f0b + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D PCI Express Root Port 3 (rev 03)' +- bus: '00' + dev: '05' + fn: '0' + id: 6f28 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Map/VTd_Misc/System Management (rev 03)' +- bus: '00' + dev: '05' + fn: '1' + id: 6f29 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO Hot Plug (rev 03)' +- bus: '00' + dev: '05' + fn: '2' + id: 6f2a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D IIO RAS/Control Status/Global Errors (rev 03)' +- bus: '00' + dev: '05' + fn: '4' + id: 6f2c + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D I/O APIC (rev 03)' +- bus: '00' + dev: '14' + fn: '0' + id: 8c31 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI (rev 05)' +- bus: '00' + dev: '1c' + fn: '0' + id: 8c10 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 (rev d5)' +- bus: '00' + dev: '1c' + fn: '6' + id: 8c1c + name: 'Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #7 (rev d5)' +- bus: '00' + dev: '1c' + fn: '7' + id: 8c1e + name: 'Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #8 (rev d5)' +- bus: '00' + dev: '1f' + fn: '0' + id: 8c54 + name: 'Intel Corporation C224 Series Chipset Family Server Standard SKU LPC Controller (rev 05)' +- bus: '00' + dev: '1f' + fn: '3' + id: 8c22 + name: 'Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller (rev 05)' +- bus: '03' + dev: '00' + fn: '0' + id: 6f50 + name: 'Intel Corporation Xeon Processor D Family QuickData Technology Register DMA Channel 0' +- bus: '03' + dev: '00' + fn: '1' + id: 6f51 + name: 'Intel Corporation Xeon Processor D Family QuickData Technology Register DMA Channel 1' +- bus: '03' + dev: '00' + fn: '2' + id: 6f52 + name: 'Intel Corporation Xeon Processor D Family QuickData Technology Register DMA Channel 2' +- bus: '03' + dev: '00' + fn: '3' + id: 6f53 + name: 'Intel Corporation Xeon Processor D Family QuickData Technology Register DMA Channel 3' +- bus: '04' + dev: '00' + fn: '0' + id: 15ac + name: 'Intel Corporation Ethernet Connection X552 10 GbE SFP+' +- bus: '04' + dev: '00' + fn: '1' + id: 15ac + name: 'Intel Corporation Ethernet Connection X552 10 GbE SFP+' +- bus: '06' + dev: '00' + fn: '0' + id: 1b58 + name: 'Device 1d98:1b58 (rev 10)' +- bus: '07' + dev: '00' + fn: '0' + id: 9100 + name: 'Solid State Storage Technology Corporation Device 9100 (rev 03)' +- bus: '0b' + dev: '00' + fn: '0' + id: e001 + name: 'Altera Corporation Device e001 (rev 09)' +- bus: '0c' + dev: '00' + fn: '0' + id: 1533 + name: 'Intel Corporation I210 Gigabit Network Connection (rev 03)' +- bus: 'ff' + dev: '0b' + fn: '0' + id: 6f81 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 03)' +- bus: 'ff' + dev: '0b' + fn: '1' + id: 6f36 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 03)' +- bus: 'ff' + dev: '0b' + fn: '2' + id: 6f37 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link 0/1 (rev 03)' +- bus: 'ff' + dev: '0b' + fn: '3' + id: 6f76 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R3 QPI Link Debug (rev 03)' +- bus: 'ff' + dev: '0c' + fn: '0' + id: 6fe0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0c' + fn: '1' + id: 6fe1 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0c' + fn: '2' + id: 6fe2 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0c' + fn: '3' + id: 6fe3 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0f' + fn: '0' + id: 6ff8 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0f' + fn: '4' + id: 6ffc + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0f' + fn: '5' + id: 6ffd + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '0f' + fn: '6' + id: 6ffe + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Caching Agent (rev 03)' +- bus: 'ff' + dev: '10' + fn: '0' + id: 6f1d + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 03)' +- bus: 'ff' + dev: '10' + fn: '1' + id: 6f34 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D R2PCIe Agent (rev 03)' +- bus: 'ff' + dev: '10' + fn: '5' + id: 6f1e + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 03)' +- bus: 'ff' + dev: '10' + fn: '6' + id: 6f7d + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 03)' +- bus: 'ff' + dev: '10' + fn: '7' + id: 6f1f + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Ubox (rev 03)' +- bus: 'ff' + dev: '12' + fn: '0' + id: 6fa0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 03)' +- bus: 'ff' + dev: '12' + fn: '1' + id: 6f30 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Home Agent 0 (rev 03)' +- bus: 'ff' + dev: '13' + fn: '0' + id: 6fa8 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: 'ff' + dev: '13' + fn: '1' + id: 6f71 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Target Address/Thermal/RAS (rev 03)' +- bus: 'ff' + dev: '13' + fn: '2' + id: 6faa + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: 'ff' + dev: '13' + fn: '3' + id: 6fab + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: 'ff' + dev: '13' + fn: '4' + id: 6fac + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: 'ff' + dev: '13' + fn: '5' + id: 6fad + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel Target Address Decoder (rev 03)' +- bus: 'ff' + dev: '13' + fn: '6' + id: 6fae + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Broadcast (rev 03)' +- bus: 'ff' + dev: '13' + fn: '7' + id: 6faf + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Global Broadcast (rev 03)' +- bus: 'ff' + dev: '14' + fn: '0' + id: 6fb0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Thermal Control (rev 03)' +- bus: 'ff' + dev: '14' + fn: '1' + id: 6fb1 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Thermal Control (rev 03)' +- bus: 'ff' + dev: '14' + fn: '2' + id: 6fb2 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 0 Error (rev 03)' +- bus: 'ff' + dev: '14' + fn: '3' + id: 6fb3 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 1 Error (rev 03)' +- bus: 'ff' + dev: '14' + fn: '4' + id: 6fbc + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 03)' +- bus: 'ff' + dev: '14' + fn: '5' + id: 6fbd + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 03)' +- bus: 'ff' + dev: '14' + fn: '6' + id: 6fbe + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 03)' +- bus: 'ff' + dev: '14' + fn: '7' + id: 6fbf + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D DDRIO Channel 0/1 Interface (rev 03)' +- bus: 'ff' + dev: '15' + fn: '0' + id: 6fb4 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Thermal Control (rev 03)' +- bus: 'ff' + dev: '15' + fn: '1' + id: 6fb5 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Thermal Control (rev 03)' +- bus: 'ff' + dev: '15' + fn: '2' + id: 6fb6 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 2 Error (rev 03)' +- bus: 'ff' + dev: '15' + fn: '3' + id: 6fb7 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Memory Controller 0 - Channel 3 Error (rev 03)' +- bus: 'ff' + dev: '1e' + fn: '0' + id: 6f98 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1e' + fn: '1' + id: 6f99 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1e' + fn: '2' + id: 6f9a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1e' + fn: '3' + id: 6fc0 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1e' + fn: '4' + id: 6f9c + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1f' + fn: '0' + id: 6f88 + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' +- bus: 'ff' + dev: '1f' + fn: '2' + id: 6f8a + name: 'Intel Corporation Xeon E7 v4/Xeon E5 v4/Xeon E3 v4/Xeon D Power Control Unit (rev 03)' \ No newline at end of file diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/platform.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform.json new file mode 100644 index 000000000000..18dcca800329 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform.json @@ -0,0 +1,844 @@ +{ + "chassis": { + "name": "Wistron_sw_to3200k", + "components": [ + { + "name": "BIOS" + }, + { + "name": "CPLD1" + }, + { + "name": "CPLD2" + }, + { + "name": "MB_FPGA" + }, + { + "name": "FAN_CPLD" + }, + { + "name": "BMC" + } + ], + "fans": [ + { + "name": "FAN-1F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-1R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "fan_drawers": [ + { + "name": "FanTray1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-1F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-1R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray2", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-2F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-2R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray3", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-3F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-3R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray4", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-4F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-4R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray5", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-5F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-5R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray6", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-6F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-6R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + }, + { + "name": "FanTray7", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + }, + "fans": [ + { + "name": "FAN-7F", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + }, + { + "name": "FAN-7R", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ] + } + ], + "psus": [ + { + "name": "PSU-1", + "fans": [ + { + "name": "PSU-1 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "status_led": { + "controllable": false + } + }, + { + "name": "PSU-2", + "fans": [ + { + "name": "PSU-2 FAN-1", + "speed": { + "controllable": false + }, + "status_led": { + "controllable": false + } + } + ], + "status_led": { + "controllable": false + } + } + ], + "thermals": [ + { + "name": "Bottom-Front", + "controllable": false + }, + { + "name": "Bottom-Rear", + "controllable": false + }, + { + "name": "Left-Front", + "controllable": false + }, + { + "name": "Right-Front", + "controllable": false + }, + { + "name": "Top-Center", + "controllable": false + }, + { + "name": "Top-Front", + "controllable": false + }, + { + "name": "Top-Rear", + "controllable": false + } + ], + "sfps": [ + { + "name": "port1" + }, + { + "name": "port2" + }, + { + "name": "port3" + }, + { + "name": "port4" + }, + { + "name": "port5" + }, + { + "name": "port6" + }, + { + "name": "port7" + }, + { + "name": "port8" + }, + { + "name": "port9" + }, + { + "name": "port10" + }, + { + "name": "port11" + }, + { + "name": "port12" + }, + { + "name": "port13" + }, + { + "name": "port14" + }, + { + "name": "port15" + }, + { + "name": "port16" + }, + { + "name": "port17" + }, + { + "name": "port18" + }, + { + "name": "port19" + }, + { + "name": "port20" + }, + { + "name": "port21" + }, + { + "name": "port22" + }, + { + "name": "port23" + }, + { + "name": "port24" + }, + { + "name": "port25" + }, + { + "name": "port26" + }, + { + "name": "port27" + }, + { + "name": "port28" + }, + { + "name": "port29" + }, + { + "name": "port30" + }, + { + "name": "port31" + }, + { + "name": "port32" + } + ] + }, + "interfaces": { + "Ethernet0": { + "index": "0,0,0,0,0,0,0,0", + "lanes": "89,90,91,92,93,94,95,96", + "breakout_modes": { + "1x400G[100G]": ["Eth1"], + "1x100G(4)": ["Eth1"], + "4x25G[10G](4)": ["Eth1-1", "Eth1-2", "Eth1-3", "Eth1-4"], + "4x10G[25G](4)": ["Eth1-1", "Eth1-2", "Eth1-3", "Eth1-4"] + } + }, + "Ethernet8": { + "index": "1,1,1,1,1,1,1,1", + "lanes": "81,82,83,84,85,86,87,88", + "breakout_modes": { + "1x400G[100G]": ["Eth2"], + "1x100G(4)": ["Eth2"], + "4x25G[10G](4)": ["Eth2-1", "Eth2-2", "Eth2-3", "Eth2-4"], + "4x10G[25G](4)": ["Eth2-1", "Eth2-2", "Eth2-3", "Eth2-4"] + } + }, + "Ethernet16": { + "index": "2,2,2,2,2,2,2,2", + "lanes": "73,74,75,76,77,78,79,80", + "breakout_modes": { + "1x400G[100G]": ["Eth3"], + "1x100G(4)": ["Eth3"], + "4x25G[10G](4)": ["Eth3-1", "Eth3-2", "Eth3-3", "Eth3-4"], + "4x10G[25G](4)": ["Eth3-1", "Eth3-2", "Eth3-3", "Eth3-4"] + } + }, + "Ethernet24": { + "index": "3,3,3,3,3,3,3,3", + "lanes": "65,66,67,68,69,70,71,72", + "breakout_modes": { + "1x400G[100G]": ["Eth4"], + "1x100G(4)": ["Eth4"], + "4x25G[10G](4)": ["Eth4-1", "Eth4-2", "Eth4-3", "Eth4-4"], + "4x10G[25G](4)": ["Eth4-1", "Eth4-2", "Eth4-3", "Eth4-4"] + } + }, + "Ethernet32": { + "index": "4,4,4,4,4,4,4,4", + "lanes": "57,58,59,60,61,62,63,64", + "breakout_modes": { + "1x400G[100G]": ["Eth5"], + "1x100G(4)": ["Eth5"], + "4x25G[10G](4)": ["Eth5-1", "Eth5-2", "Eth5-3", "Eth5-4"], + "4x10G[25G](4)": ["Eth5-1", "Eth5-2", "Eth5-3", "Eth5-4"] + } + }, + "Ethernet40": { + "index": "5,5,5,5,5,5,5,5", + "lanes": "49,50,51,52,53,54,55,56", + "breakout_modes": { + "1x400G[100G]": ["Eth6"], + "1x100G(4)": ["Eth6"], + "4x25G[10G](4)": ["Eth6-1", "Eth6-2", "Eth6-3", "Eth6-4"], + "4x10G[25G](4)": ["Eth6-1", "Eth6-2", "Eth6-3", "Eth6-4"] + } + }, + "Ethernet48": { + "index": "6,6,6,6,6,6,6,6", + "lanes": "41,42,43,44,45,46,47,48", + "breakout_modes": { + "1x400G[100G]": ["Eth7"], + "1x100G(4)": ["Eth7"], + "4x25G[10G](4)": ["Eth7-1", "Eth7-2", "Eth7-3", "Eth7-4"], + "4x10G[25G](4)": ["Eth7-1", "Eth7-2", "Eth7-3", "Eth7-4"] + } + }, + "Ethernet56": { + "index": "7,7,7,7,7,7,7,7", + "lanes": "33,34,35,36,37,38,39,40", + "breakout_modes": { + "1x400G[100G]": ["Eth8"], + "1x100G(4)": ["Eth8"], + "4x25G[10G](4)": ["Eth8-1", "Eth8-2", "Eth8-3", "Eth8-4"], + "4x10G[25G](4)": ["Eth8-1", "Eth8-2", "Eth8-3", "Eth8-4"] + } + }, + "Ethernet64": { + "index": "8,8,8,8,8,8,8,8", + "lanes": "153,154,155,156,157,158,159,160", + "breakout_modes": { + "1x400G[100G]": ["Eth9"], + "1x100G(4)": ["Eth9"], + "4x25G[10G](4)": ["Eth9-1", "Eth9-2", "Eth9-3", "Eth9-4"], + "4x10G[25G](4)": ["Eth9-1", "Eth9-2", "Eth9-3", "Eth9-4"] + } + }, + "Ethernet72": { + "index": "9,9,9,9,9,9,9,9", + "lanes": "145,146,147,148,149,150,151,152", + "breakout_modes": { + "1x400G[100G]": ["Eth10"], + "1x100G(4)": ["Eth10"], + "4x25G[10G](4)": ["Eth10-1", "Eth10-2", "Eth10-3", "Eth10-4"], + "4x10G[25G](4)": ["Eth10-1", "Eth10-2", "Eth10-3", "Eth10-4"] + } + }, + "Ethernet80": { + "index": "10,10,10,10,10,10,10,10", + "lanes": "137,138,139,140,141,142,143,144", + "breakout_modes": { + "1x400G[100G]": ["Eth11"], + "1x100G(4)": ["Eth11"], + "4x25G[10G](4)": ["Eth11-1", "Eth11-2", "Eth11-3", "Eth11-4"], + "4x10G[25G](4)": ["Eth11-1", "Eth11-2", "Eth11-3", "Eth11-4"] + } + }, + "Ethernet88": { + "index": "11,11,11,11,11,11,11,11", + "lanes": "129,130,131,132,133,134,135,136", + "breakout_modes": { + "1x400G[100G]": ["Eth12"], + "1x100G(4)": ["Eth12"], + "4x25G[10G](4)": ["Eth12-1", "Eth12-2", "Eth12-3", "Eth12-4"], + "4x10G[25G](4)": ["Eth12-1", "Eth12-2", "Eth12-3", "Eth12-4"] + } + }, + "Ethernet96": { + "index": "12,12,12,12,12,12,12,12", + "lanes": "121,122,123,124,125,126,127,128", + "breakout_modes": { + "1x400G[100G]": ["Eth13"], + "1x100G(4)": ["Eth13"], + "4x25G[10G](4)": ["Eth13-1", "Eth13-2", "Eth13-3", "Eth13-4"], + "4x10G[25G](4)": ["Eth13-1", "Eth13-2", "Eth13-3", "Eth13-4"] + } + }, + "Ethernet104": { + "index": "13,13,13,13,13,13,13,13", + "lanes": "113,114,115,116,117,118,119,120", + "breakout_modes": { + "1x400G[100G]": ["Eth14"], + "1x100G(4)": ["Eth14"], + "4x25G[10G](4)": ["Eth14-1", "Eth14-2", "Eth14-3", "Eth14-4"], + "4x10G[25G](4)": ["Eth14-1", "Eth14-2", "Eth14-3", "Eth14-4"] + } + }, + "Ethernet112": { + "index": "14,14,14,14,14,14,14,14", + "lanes": "105,106,107,108,109,110,111,112", + "breakout_modes": { + "1x400G[100G]": ["Eth15"], + "1x100G(4)": ["Eth15"], + "4x25G[10G](4)": ["Eth15-1", "Eth15-2", "Eth15-3", "Eth15-4"], + "4x10G[25G](4)": ["Eth15-1", "Eth15-2", "Eth15-3", "Eth15-4"] + } + }, + "Ethernet120": { + "index": "15,15,15,15,15,15,15,15", + "lanes": "97,98,99,100,101,102,103,104", + "breakout_modes": { + "1x400G[100G]": ["Eth16"], + "1x100G(4)": ["Eth16"], + "4x25G[10G](4)": ["Eth16-1", "Eth16-2", "Eth16-3", "Eth16-4"], + "4x10G[25G](4)": ["Eth16-1", "Eth16-2", "Eth16-3", "Eth16-4"] + } + }, + "Ethernet128": { + "index": "16,16,16,16,16,16,16,16", + "lanes": "209,210,211,212,213,214,215,216", + "breakout_modes": { + "1x400G[100G]": ["Eth17"], + "1x100G(4)": ["Eth17"], + "4x25G[10G](4)": ["Eth17-1", "Eth17-2", "Eth17-3", "Eth17-4"], + "4x10G[25G](4)": ["Eth17-1", "Eth17-2", "Eth17-3", "Eth17-4"] + } + }, + "Ethernet136": { + "index": "17,17,17,17,17,17,17,17", + "lanes": "217,218,219,220,221,222,223,224", + "breakout_modes": { + "1x400G[100G]": ["Eth18"], + "1x100G(4)": ["Eth18"], + "4x25G[10G](4)": ["Eth18-1", "Eth18-2", "Eth18-3", "Eth18-4"], + "4x10G[25G](4)": ["Eth18-1", "Eth18-2", "Eth18-3", "Eth18-4"] + } + }, + "Ethernet144": { + "index": "18,18,18,18,18,18,18,18", + "lanes": "193,194,195,196,197,198,199,200", + "breakout_modes": { + "1x400G[100G]": ["Eth19"], + "1x100G(4)": ["Eth19"], + "4x25G[10G](4)": ["Eth19-1", "Eth19-2", "Eth19-3", "Eth19-4"], + "4x10G[25G](4)": ["Eth19-1", "Eth19-2", "Eth19-3", "Eth19-4"] + } + }, + "Ethernet152": { + "index": "19,19,19,19,19,19,19,19", + "lanes": "201,202,203,204,205,206,207,208", + "breakout_modes": { + "1x400G[100G]": ["Eth20"], + "1x100G(4)": ["Eth20"], + "4x25G[10G](4)": ["Eth20-1", "Eth20-2", "Eth20-3", "Eth20-4"], + "4x10G[25G](4)": ["Eth20-1", "Eth20-2", "Eth20-3", "Eth20-4"] + } + }, + "Ethernet160": { + "index": "20,20,20,20,20,20,20,20", + "lanes": "177,178,179,180,181,182,183,184", + "breakout_modes": { + "1x400G[100G]": ["Eth21"], + "1x100G(4)": ["Eth21"], + "4x25G[10G](4)": ["Eth21-1", "Eth21-2", "Eth21-3", "Eth21-4"], + "4x10G[25G](4)": ["Eth21-1", "Eth21-2", "Eth21-3", "Eth21-4"] + } + }, + "Ethernet168": { + "index": "21,21,21,21,21,21,21,21", + "lanes": "185,186,187,188,189,190,191,192", + "breakout_modes": { + "1x400G[100G]": ["Eth22"], + "1x100G(4)": ["Eth22"], + "4x25G[10G](4)": ["Eth22-1", "Eth22-2", "Eth22-3", "Eth22-4"], + "4x10G[25G](4)": ["Eth22-1", "Eth22-2", "Eth22-3", "Eth22-4"] + } + }, + "Ethernet176": { + "index": "22,22,22,22,22,22,22,22", + "lanes": "161,162,163,164,165,166,167,168", + "breakout_modes": { + "1x400G[100G]": ["Eth23"], + "1x100G(4)": ["Eth23"], + "4x25G[10G](4)": ["Eth23-1", "Eth23-2", "Eth23-3", "Eth23-4"], + "4x10G[25G](4)": ["Eth23-1", "Eth23-2", "Eth23-3", "Eth23-4"] + } + }, + "Ethernet184": { + "index": "23,23,23,23,23,23,23,23", + "lanes": "169,170,171,172,173,174,175,176", + "breakout_modes": { + "1x400G[100G]": ["Eth24"], + "1x100G(4)": ["Eth24"], + "4x25G[10G](4)": ["Eth24-1", "Eth24-2", "Eth24-3", "Eth24-4"], + "4x10G[25G](4)": ["Eth24-1", "Eth24-2", "Eth24-3", "Eth24-4"] + } + }, + "Ethernet192": { + "index": "24,24,24,24,24,24,24,24", + "lanes": "17,18,19,20,21,22,23,24", + "breakout_modes": { + "1x400G[100G]": ["Eth25"], + "1x100G(4)": ["Eth25"], + "4x25G[10G](4)": ["Eth25-1", "Eth25-2", "Eth25-3", "Eth25-4"], + "4x10G[25G](4)": ["Eth25-1", "Eth25-2", "Eth25-3", "Eth25-4"] + } + }, + "Ethernet200": { + "index": "25,25,25,25,25,25,25,25", + "lanes": "25,26,27,28,29,30,31,32", + "breakout_modes": { + "1x400G[100G]": ["Eth26"], + "1x100G(4)": ["Eth26"], + "4x25G[10G](4)": ["Eth26-1", "Eth26-2", "Eth26-3", "Eth26-4"], + "4x10G[25G](4)": ["Eth26-1", "Eth26-2", "Eth26-3", "Eth26-4"] + } + }, + "Ethernet208": { + "index": "26,26,26,26,26,26,26,26", + "lanes": "1,2,3,4,5,6,7,8", + "breakout_modes": { + "1x400G[100G]": ["Eth27"], + "1x100G(4)": ["Eth27"], + "4x25G[10G](4)": ["Eth27-1", "Eth27-2", "Eth27-3", "Eth27-4"], + "4x10G[25G](4)": ["Eth27-1", "Eth27-2", "Eth27-3", "Eth27-4"] + } + }, + "Ethernet216": { + "index": "27,27,27,27,27,27,27,27", + "lanes": "9,10,11,12,13,14,15,16", + "breakout_modes": { + "1x400G[100G]": ["Eth28"], + "1x100G(4)": ["Eth28"], + "4x25G[10G](4)": ["Eth28-1", "Eth28-2", "Eth28-3", "Eth28-4"], + "4x10G[25G](4)": ["Eth28-1", "Eth28-2", "Eth28-3", "Eth28-4"] + } + }, + "Ethernet224": { + "index": "28,28,28,28,28,28,28,28", + "lanes": "241,242,243,244,245,246,247,248", + "breakout_modes": { + "1x400G[100G]": ["Eth29"], + "1x100G(4)": ["Eth29"], + "4x25G[10G](4)": ["Eth29-1", "Eth29-2", "Eth29-3", "Eth29-4"], + "4x10G[25G](4)": ["Eth29-1", "Eth29-2", "Eth29-3", "Eth29-4"] + } + }, + "Ethernet232": { + "index": "29,29,29,29,29,29,29,29", + "lanes": "249,250,251,252,253,254,255,256", + "breakout_modes": { + "1x400G[100G]": ["Eth30"], + "1x100G(4)": ["Eth30"], + "4x25G[10G](4)": ["Eth30-1", "Eth30-2", "Eth30-3", "Eth30-4"], + "4x10G[25G](4)": ["Eth30-1", "Eth30-2", "Eth30-3", "Eth30-4"] + } + }, + "Ethernet240": { + "index": "30,30,30,30,30,30,30,30", + "lanes": "225,226,227,228,229,230,231,232", + "breakout_modes": { + "1x400G[100G]": ["Eth31"], + "1x100G(4)": ["Eth31"], + "4x25G[10G](4)": ["Eth31-1", "Eth31-2", "Eth31-3", "Eth31-4"], + "4x10G[25G](4)": ["Eth31-1", "Eth31-2", "Eth31-3", "Eth31-4"] + } + }, + "Ethernet248": { + "index": "31,31,31,31,31,31,31,31", + "lanes": "233,234,235,236,237,238,239,240", + "breakout_modes": { + "1x400G[100G]": ["Eth32"], + "1x100G(4)": ["Eth32"], + "4x25G[10G](4)": ["Eth32-1", "Eth32-2", "Eth32-3", "Eth32-4"], + "4x10G[25G](4)": ["Eth32-1", "Eth32-2", "Eth32-3", "Eth32-4"] + } + } + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_components.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_components.json new file mode 100644 index 000000000000..304fbcb52557 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/platform_components.json @@ -0,0 +1,14 @@ +{ + "chassis": { + "Wistron_sw_to3200k": { + "component": { + "BIOS": { }, + "CPLD1": { }, + "CPLD2": { }, + "MB_FPGA": { }, + "FAN_CPLD": { }, + "BMC": { } + } + } + } +} 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 index 9f59510eac28..b7724886eea4 100644 --- a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/eeprom.py @@ -3,16 +3,16 @@ try: import os from sonic_eeprom import eeprom_tlvinfo -except ImportError, e: +except ImportError as e: raise ImportError (str(e) + "- required module not found") def eeprom_check(): - filepath="/sys/bus/i2c/devices/0-0056/eeprom" + 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): 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 index fe59dc7d8ce5..8983579016b4 100644 --- a/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/plugins/sfputil.py @@ -111,7 +111,7 @@ def get_presence(self, port_num): content = val_file.readline().rstrip() val_file.close() except IOError as e: - print "Error: unable to access file: %s" % str(e) + print("Error: unable to access file: %s" % str(e)) return False if content == "1": @@ -145,13 +145,13 @@ def get_transceiver_change_event(self, timeout=0): elif timeout > 0: timeout = timeout / float(1000) # Convert to secs else: - print "get_transceiver_change_event:Invalid timeout value", timeout + 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 + print('get_transceiver_change_event:' \ + 'time wrap / invalid timeout value', timeout) return False, {} # Time wrap or possibly incorrect timeout @@ -182,5 +182,5 @@ def get_transceiver_change_event(self, timeout=0): if timeout > 0: time.sleep(timeout) return True, {} - print "get_evt_change_event: Should not reach here." + print("get_evt_change_event: Should not reach here.") return False, {} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/smartd.conf b/device/wistron/x86_64-wistron_sw_to3200k-r0/smartd.conf new file mode 100644 index 000000000000..c3877d93ee28 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/smartd.conf @@ -0,0 +1,150 @@ +# Sample configuration file for smartd. See man smartd.conf. + +# Home page is: http://www.smartmontools.org + +# smartd will re-read the configuration file if it receives a HUP +# signal + +# The file gives a list of devices to monitor using smartd, with one +# device per line. Text after a hash (#) is ignored, and you may use +# spaces and tabs for white space. You may use '\' to continue lines. + +# You can usually identify which hard disks are on your system by +# looking in /proc/ide and in /proc/scsi. + +# The word DEVICESCAN will cause any remaining lines in this +# configuration file to be ignored: it tells smartd to scan for all +# ATA and SCSI devices. DEVICESCAN may be followed by any of the +# Directives listed below, which will be applied to all devices that +# are found. Most users should comment out DEVICESCAN and explicitly +# list the devices that they wish to monitor. +#DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runner + +# Alternative setting to ignore temperature and power-on hours reports +# in syslog. +#DEVICESCAN -I 194 -I 231 -I 9 + +# Alternative setting to report more useful raw temperature in syslog. +#DEVICESCAN -R 194 -R 231 -I 9 + +# Alternative setting to report raw temperature changes >= 5 Celsius +# and min/max temperatures. +#DEVICESCAN -I 194 -I 231 -I 9 -W 5 + +# First ATA/SATA or SCSI/SAS disk. Monitor all attributes, enable +# automatic online data collection, automatic Attribute autosave, and +# start a short self-test every day between 2-3am, and a long self test +# Saturdays between 3-4am. +#/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) + +# Monitor SMART status, ATA Error Log, Self-test log, and track +# changes in all attributes except for attribute 194 +#/dev/sdb -H -l error -l selftest -t -I 194 + +# Monitor all attributes except normalized Temperature (usually 194), +# but track Temperature changes >= 4 Celsius, report Temperatures +# >= 45 Celsius and changes in Raw value of Reallocated_Sector_Ct (5). +# Send mail on SMART failures or when Temperature is >= 55 Celsius. +#/dev/sdc -a -I 194 -W 4,45,55 -R 5 -m admin@example.com + +# An ATA disk may appear as a SCSI device to the OS. If a SCSI to +# ATA Translation (SAT) layer is between the OS and the device then +# this can be flagged with the '-d sat' option. This situation may +# become common with SATA disks in SAS and FC environments. +# /dev/sda -a -d sat + +# A very silent check. Only report SMART health status if it fails +# But send an email in this case +#/dev/sdc -H -C 0 -U 0 -m admin@example.com + +# First two SCSI disks. This will monitor everything that smartd can +# monitor. Start extended self-tests Wednesdays between 6-7pm and +# Sundays between 1-2 am +#/dev/sda -d scsi -s L/../../3/18 +#/dev/sdb -d scsi -s L/../../7/01 + +# Monitor 4 ATA disks connected to a 3ware 6/7/8000 controller which uses +# the 3w-xxxx driver. Start long self-tests Sundays between 1-2, 2-3, 3-4, +# and 4-5 am. +# NOTE: starting with the Linux 2.6 kernel series, the /dev/sdX interface +# is DEPRECATED. Use the /dev/tweN character device interface instead. +# For example /dev/twe0, /dev/twe1, and so on. +#/dev/sdc -d 3ware,0 -a -s L/../../7/01 +#/dev/sdc -d 3ware,1 -a -s L/../../7/02 +#/dev/sdc -d 3ware,2 -a -s L/../../7/03 +#/dev/sdc -d 3ware,3 -a -s L/../../7/04 + +# Monitor 2 ATA disks connected to a 3ware 9000 controller which +# uses the 3w-9xxx driver (Linux, FreeBSD). Start long self-tests Tuesdays +# between 1-2 and 3-4 am. +#/dev/twa0 -d 3ware,0 -a -s L/../../2/01 +#/dev/twa0 -d 3ware,1 -a -s L/../../2/03 + +# Monitor 2 SATA (not SAS) disks connected to a 3ware 9000 controller which +# uses the 3w-sas driver (Linux). Start long self-tests Tuesdays +# between 1-2 and 3-4 am. +# On FreeBSD /dev/tws0 should be used instead +#/dev/twl0 -d 3ware,0 -a -s L/../../2/01 +#/dev/twl0 -d 3ware,1 -a -s L/../../2/03 + +# Same as above for Windows. Option '-d 3ware,N' is not necessary, +# disk (port) number is specified in device name. +# NOTE: On Windows, DEVICESCAN works also for 3ware controllers. +#/dev/hdc,0 -a -s L/../../2/01 +#/dev/hdc,1 -a -s L/../../2/03 +# +# Monitor 2 disks connected to the first HP SmartArray controller which +# uses the cciss driver. Start long tests on Sunday nights and short +# self-tests every night and send errors to root +#/dev/cciss/c0d0 -d cciss,0 -a -s (L/../../7/02|S/../.././02) -m root +#/dev/cciss/c0d0 -d cciss,1 -a -s (L/../../7/03|S/../.././03) -m root + +# Monitor 3 ATA disks directly connected to a HighPoint RocketRAID. Start long +# self-tests Sundays between 1-2, 2-3, and 3-4 am. +#/dev/sdd -d hpt,1/1 -a -s L/../../7/01 +#/dev/sdd -d hpt,1/2 -a -s L/../../7/02 +#/dev/sdd -d hpt,1/3 -a -s L/../../7/03 + +# Monitor 2 ATA disks connected to the same PMPort which connected to the +# HighPoint RocketRAID. Start long self-tests Tuesdays between 1-2 and 3-4 am +#/dev/sdd -d hpt,1/4/1 -a -s L/../../2/01 +#/dev/sdd -d hpt,1/4/2 -a -s L/../../2/03 + +# HERE IS A LIST OF DIRECTIVES FOR THIS CONFIGURATION FILE. +# PLEASE SEE THE smartd.conf MAN PAGE FOR DETAILS +# +# -d TYPE Set the device type: ata, scsi, marvell, removable, 3ware,N, hpt,L/M/N +# -T TYPE set the tolerance to one of: normal, permissive +# -o VAL Enable/disable automatic offline tests (on/off) +# -S VAL Enable/disable attribute autosave (on/off) +# -n MODE No check. MODE is one of: never, sleep, standby, idle +# -H Monitor SMART Health Status, report if failed +# -l TYPE Monitor SMART log. Type is one of: error, selftest +# -f Monitor for failure of any 'Usage' Attributes +# -m ADD Send warning email to ADD for -H, -l error, -l selftest, and -f +# -M TYPE Modify email warning behavior (see man page) +# -s REGE Start self-test when type/date matches regular expression (see man page) +# -p Report changes in 'Prefailure' Normalized Attributes +# -u Report changes in 'Usage' Normalized Attributes +# -t Equivalent to -p and -u Directives +# -r ID Also report Raw values of Attribute ID with -p, -u or -t +# -R ID Track changes in Attribute ID Raw value with -p, -u or -t +# -i ID Ignore Attribute ID for -f Directive +# -I ID Ignore Attribute ID for -p, -u or -t Directive +# -C ID Report if Current Pending Sector count non-zero +# -U ID Report if Offline Uncorrectable count non-zero +# -W D,I,C Monitor Temperature D)ifference, I)nformal limit, C)ritical limit +# -v N,ST Modifies labeling of Attribute N (see man page) +# -a Default: equivalent to -H -f -t -l error -l selftest -C 197 -U 198 +# -F TYPE Use firmware bug workaround. Type is one of: none, samsung +# -P TYPE Drive-specific presets: use, ignore, show, showall +# # Comment: text after a hash sign is ignored +# \ Line continuation character +# Attribute ID is a decimal integer 1 <= ID <= 255 +# except for -C and -U, where ID = 0 turns them off. +# All but -d, -m and -M Directives are only implemented for ATA devices +# +# If the test string DEVICESCAN is the first uncommented text +# then smartd will scan for devices. +# DEVICESCAN may be followed by any desired Directives. +/dev/nvme0n1 -a diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/system_health_monitoring_config.json b/device/wistron/x86_64-wistron_sw_to3200k-r0/system_health_monitoring_config.json new file mode 100644 index 000000000000..0e0eec971cac --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/system_health_monitoring_config.json @@ -0,0 +1,11 @@ +{ + "services_to_ignore": [], + "devices_to_ignore": ["asic"], + "user_defined_checkers": [], + "polling_interval": 60, + "led_color": { + "fault": "red", + "normal": "green", + "booting": "green_blinking" + } +} diff --git a/device/wistron/x86_64-wistron_sw_to3200k-r0/watchdog-control.service b/device/wistron/x86_64-wistron_sw_to3200k-r0/watchdog-control.service new file mode 100644 index 000000000000..02ffe8ce9189 --- /dev/null +++ b/device/wistron/x86_64-wistron_sw_to3200k-r0/watchdog-control.service @@ -0,0 +1,10 @@ +[Unit] +Description=watchdog control service +After=swss.service + +[Service] +Type=simple +ExecStart=/usr/local/bin/sw_to3200k_watchdog.sh + +[Install] +WantedBy=multi-user.target diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile index 86a67f55089b..4e7a7e8191b7 100644 --- a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/Makefile @@ -1,7 +1,7 @@ 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_thermal.o i2c-imc.o \ wistron_6512_32r_leds.o wistron_6512_32r_syseeprom.o else ifeq (,$(KERNEL_SRC)) diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/i2c-imc.c b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/i2c-imc.c new file mode 100644 index 000000000000..a650f3cf1923 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/modules/i2c-imc.c @@ -0,0 +1,515 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* + * Intel Memory Controller iMC SMBus Driver to DIMMs. + * + * Copyright (c) 2013-2016 Andrew Lutomirski + * Copyright (c) 2020 Stefan Schaeckeler , Cisco Systems + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +/* iMC Main, PCI dev 0x13, fn 0, 8086.6fa8 */ +#define PCI_DEVICE_ID_INTEL_BROADWELL_IMC_TA 0x6fa8 + +/* Register offsets for channel pairs 0+1 and 2+3 */ +#define SMBSTAT(i) (0x180 + 0x10*(i)) +#define SMBCMD(i) (0x184 + 0x10*(i)) +#define SMBCNTL(i) (0x188 + 0x10*(i)) + +/* SMBSTAT fields */ +#define SMBSTAT_RDO (1U << 31) /* Read Data Valid */ +#define SMBSTAT_WOD (1U << 30) /* Write Operation Done */ +#define SMBSTAT_SBE (1U << 29) /* SMBus Error */ +#define SMBSTAT_SMB_BUSY (1U << 28) /* SMBus Busy State */ +#define SMBSTAT_RDATA_MASK 0xffff /* Result of a read */ + +/* SMBCMD fields */ +#define SMBCMD_TRIGGER (1U << 31) /* CMD Trigger */ +#define SMBCMD_WORD_ACCESS (1U << 29) /* Word (vs byte) access */ +#define SMBCMD_TYPE_READ (0U << 27) /* Read */ +#define SMBCMD_TYPE_WRITE (1U << 27) /* Write */ +#define SMBCMD_SA_SHIFT 24 +#define SMBCMD_BA_SHIFT 16 + +/* SMBCNTL fields */ +#define SMBCNTL_DTI_MASK 0xf0000000 /* Slave Address low bits */ +#define SMBCNTL_DTI_SHIFT 28 /* Slave Address low bits */ +#define SMBCNTL_DIS_WRT (1U << 26) /* Disable Write */ +#define SMBCNTL_TSOD_PRES_MASK 0xff /* DIMM Present mask */ + +/* For sanity check: bits that might randomly change if we race with firmware */ +#define SMBCMD_OUR_BITS (~(u32)SMBCMD_TRIGGER) +#define SMBCNTL_OUR_BITS (SMBCNTL_DTI_MASK) + + +/* System Address Decoder, PCI dev 0xf fn 5, 8086.6ffd */ +#define PCI_DEVICE_ID_INTEL_BROADWELL_IMC_SAD 0x6ffd + +/* Register offsets */ +#define SADCNTL 0xf4 + +/* SADCNTL fields */ +#define SADCNTL_LOCAL_NODEID_MASK 0xf /* Local NodeID of socket */ + + +/* Power Control Unit, PCI dev 0x1e fn 1, 8086.6f99 */ +#define PCI_DEVICE_ID_INTEL_BROADWELL_IMC_PCU 0x6f99 + +/* Register offsets */ +#define TSODCNTL 0xe0 + +/* TSODCNTL fields */ + + +/* DIMMs hold jc42 thermal sensors starting at i2c address 0x18 */ +#define DIMM_SENSOR_DRV "jc42" +#define DIMM_SENSOR_BASE_ADR 0x18 + + +#define sanitycheck 1 + +struct imc_channelpair { + struct i2c_adapter adapter; + bool can_write, cltt; +}; + +struct imc_pcu { + struct pci_dev *pci_dev; + u32 tsod_polling_interval; + struct mutex mutex; /* see imc_channelpair_claim() */ +}; + +struct imc_priv { + struct pci_dev *pci_dev; + struct imc_channelpair channelpair[2]; + struct imc_pcu pcu; + bool suspended; +}; + +static int imc_channelpair_claim(struct imc_priv *priv, int i) +{ + if (priv->suspended) + return -EIO; + + /* + * i2c controllers need exclusive access to a psu register and wait + * then for 10ms before starting their transaction. + * + * Possible optimization: Once an i2c controller modified the psu + * register and waits, the other controller does not need to wait for + * the whole 10ms, but then only this other controller has to clean up + * the psu register. + */ + mutex_lock(&priv->pcu.mutex); + + if (priv->channelpair[i].cltt) { + pci_write_config_dword(priv->pcu.pci_dev, TSODCNTL, 0); + usleep_range(10000, 10500); + } + return 0; +} + +static void imc_channelpair_release(struct imc_priv *priv, int i) +{ + if (priv->channelpair[i].cltt) { + /* set tosd_control.tsod_polling_interval to previous value */ + pci_write_config_dword(priv->pcu.pci_dev, TSODCNTL, + priv->pcu.tsod_polling_interval); + } + mutex_unlock(&priv->pcu.mutex); +} + +static bool imc_wait_for_transaction(struct imc_priv *priv, int i, u32 *stat) +{ + int j; + static int busywaits = 1; + + /* + * Distribution of transaction time from 10000 collected samples: + * + * 70us: 1, 80us: 12, 90us: 34, 100us: 132, 110us: 424, 120us: 1138, + * 130us: 5224, 140us: 3035. + * + */ + usleep_range(131, 140); + + /* Don't give up, yet */ + for (j = 0; j < 20; j++) { + pci_read_config_dword(priv->pci_dev, SMBSTAT(i), stat); + if (!(*stat & SMBSTAT_SMB_BUSY)) { + if (j > busywaits) { + busywaits = j; + dev_warn(&priv->pci_dev->dev, + "Discovered surprisingly long transaction time (%d)\n", + busywaits); + } + return true; + } + udelay(9); + } + return false; +} + +/* + * The iMC supports five access types. The terminology is rather inconsistent. + * These are the types: + * + * "Write to pointer register SMBus": I2C_SMBUS_WRITE, I2C_SMBUS_BYTE + * + * Read byte/word: I2C_SMBUS_READ, I2C_SMBUS_{BYTE|WORD}_DATA + * + * Write byte/word: I2C_SMBUS_WRITE, I2C_SMBUS_{BYTE|WORD}_DATA + */ + +static u32 imc_func(struct i2c_adapter *adapter) +{ + int i; + struct imc_channelpair *cp; + struct imc_priv *priv = i2c_get_adapdata(adapter); + + i = (adapter == &priv->channelpair[0].adapter ? 0 : 1); + cp = &priv->channelpair[i]; + + if (cp->can_write) + return I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA; + else + return I2C_FUNC_SMBUS_READ_BYTE_DATA | + I2C_FUNC_SMBUS_READ_WORD_DATA; +} + +static s32 imc_smbus_xfer(struct i2c_adapter *adap, u16 addr, + unsigned short flags, char read_write, u8 command, + int size, union i2c_smbus_data *data) +{ + int ret, i; + u32 cmd = 0, cntl, stat; +#ifdef sanitycheck + u32 final_cmd, final_cntl; +#endif + struct imc_channelpair *cp; + struct imc_priv *priv = i2c_get_adapdata(adap); + + i = (adap == &priv->channelpair[0].adapter ? 0 : 1); + cp = &priv->channelpair[i]; + + /* Encode CMD part of addresses and access size */ + cmd |= ((u32)addr & 0x7) << SMBCMD_SA_SHIFT; + cmd |= ((u32)command) << SMBCMD_BA_SHIFT; + if (size == I2C_SMBUS_WORD_DATA) + cmd |= SMBCMD_WORD_ACCESS; + + /* Encode read/write and data to write */ + if (read_write == I2C_SMBUS_READ) { + cmd |= SMBCMD_TYPE_READ; + } else { + cmd |= SMBCMD_TYPE_WRITE; + cmd |= (size == I2C_SMBUS_WORD_DATA + ? swab16(data->word) + : data->byte); + } + + ret = imc_channelpair_claim(priv, i); + if (ret) + return ret; + + pci_read_config_dword(priv->pci_dev, SMBCNTL(i), &cntl); + cntl &= ~SMBCNTL_DTI_MASK; + cntl |= ((u32)addr >> 3) << SMBCNTL_DTI_SHIFT; + pci_write_config_dword(priv->pci_dev, SMBCNTL(i), cntl); + + cmd |= SMBCMD_TRIGGER; + pci_write_config_dword(priv->pci_dev, SMBCMD(i), cmd); + + if (!imc_wait_for_transaction(priv, i, &stat)) { + dev_warn(&priv->pci_dev->dev, "smbus transaction did not complete.\n"); + ret = -ETIMEDOUT; + goto xfer_out_release; + } + +#ifdef sanitycheck /* This is a young driver. Keep the checks for now */ + pci_read_config_dword(priv->pci_dev, SMBCMD(i), &final_cmd); + pci_read_config_dword(priv->pci_dev, SMBCNTL(i), &final_cntl); + if (((cmd ^ final_cmd) & SMBCMD_OUR_BITS) || + ((cntl ^ final_cntl) & SMBCNTL_OUR_BITS)) { + dev_err(&priv->pci_dev->dev, + "Access to channel pair %d-%d raced with hardware: cmd 0x%08X->0x%08X, cntl 0x%08X->0x%08X\n", + 2*i, 2*i+1, cmd, final_cmd, cntl, final_cntl); + ret = -EIO; + goto xfer_out_release; + } +#endif + + if (stat & SMBSTAT_SBE) { + /* + * While SBE is set hardware TSOD polling is disabled. This is + * very bad as this bit is RO-V and will only be cleared after + * a further software initiated transaction finishes + * successfully. + */ + dev_err(&priv->pci_dev->dev, + "smbus error: sbe is set 0x%x\n", stat); + ret = -ENXIO; + goto xfer_out_release; + } + + if (read_write == I2C_SMBUS_READ) { + if (!(stat & SMBSTAT_RDO)) { + dev_warn(&priv->pci_dev->dev, + "Unexpected read status 0x%08X\n", stat); + ret = -EIO; + goto xfer_out_release; + } + /* + * The iMC SMBus controller thinks of SMBus words as being + * big-endian (MSB first). Linux treats them as little-endian, + * so we need to swap them. + */ + if (size == I2C_SMBUS_WORD_DATA) + data->word = swab16(stat & SMBSTAT_RDATA_MASK); + else + data->byte = stat & 0xFF; + } else { + if (!(stat & SMBSTAT_WOD)) { + dev_warn(&priv->pci_dev->dev, + "Unexpected write status 0x%08X\n", stat); + ret = -EIO; + } + } + +xfer_out_release: + imc_channelpair_release(priv, i); + + return ret; +} + +static const struct i2c_algorithm imc_smbus_algorithm = { + .smbus_xfer = imc_smbus_xfer, + .functionality = imc_func, +}; + +static void imc_instantiate_sensors(struct i2c_adapter *adapter, u8 presence) +{ + struct i2c_board_info info = {}; + + strcpy(info.type, DIMM_SENSOR_DRV); + info.addr = DIMM_SENSOR_BASE_ADR; + + /* + * Presence is a bit vector. Bits from right to left map into i2c slave + * addresses starting 0x18. + */ + while (presence) { + if (presence & 0x1) + i2c_new_client_device(adapter, &info); + info.addr++; + presence >>= 1; + } +} + +static int imc_init_channelpair(struct imc_priv *priv, int i, int socket) +{ + int err; + u32 val; + struct imc_channelpair *cp = &priv->channelpair[i]; + + i2c_set_adapdata(&cp->adapter, priv); + cp->adapter.owner = THIS_MODULE; + cp->adapter.algo = &imc_smbus_algorithm; + cp->adapter.dev.parent = &priv->pci_dev->dev; + + pci_read_config_dword(priv->pci_dev, SMBCNTL(i), &val); + cp->can_write = !(val & SMBCNTL_DIS_WRT); + + /* + * A TSOD polling interval of > 0 tells us if CLTT mode is enabled on + * some channel pair. + * + * Is there a better way to check for CLTT mode? In particular, is + * there a way to distingush the mode on a channel pair basis? + */ + cp->cltt = (priv->pcu.tsod_polling_interval > 0); + + snprintf(cp->adapter.name, sizeof(cp->adapter.name), + "iMC socket %d for channel pair %d-%d", socket, 2*i, 2*i+1); + err = i2c_add_adapter(&cp->adapter); + if (err) + return err; + + /* For reasons unknown, TSOD_PRES_MASK is only set in CLTT mode. */ + if (cp->cltt) { + dev_info(&priv->pci_dev->dev, + "CLTT is enabled on channel pair %d-%d. Thermal sensors will be automatically enabled\n", + 2*i, 2*i+1); + } else { + dev_info(&priv->pci_dev->dev, + "CLTT is disabled on channel pair %d-%d. Thermal sensors need to be manually enabled\n", + 2*i, 2*i+1); + } + + imc_instantiate_sensors(&cp->adapter, val & SMBCNTL_TSOD_PRES_MASK); + + return 0; +} + +static void imc_free_channelpair(struct imc_priv *priv, int i) +{ + struct imc_channelpair *cp = &priv->channelpair[i]; + + i2c_del_adapter(&cp->adapter); +} + +static struct pci_dev *imc_get_related_device(struct pci_bus *bus, + unsigned int devfn, u16 devid) +{ + struct pci_dev *dev = pci_get_slot(bus, devfn); + + if (!dev) + return NULL; + + if (dev->vendor != PCI_VENDOR_ID_INTEL || dev->device != devid) { + pci_dev_put(dev); + return NULL; + } + return dev; +} + +static int imc_probe(struct pci_dev *dev, const struct pci_device_id *id) +{ + int i, j, err; + struct imc_priv *priv; + struct pci_dev *sad; /* System Address Decoder */ + u32 sadcntl; + + /* Sanity check. This device is always at 0x13.0 */ + if (dev->devfn != PCI_DEVFN(0x13, 0)) + return -ENODEV; + + priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + priv->pci_dev = dev; + pci_set_drvdata(dev, priv); + + /* + * From sad, we learn the local node id of the socket. + * + * The socket will not change at runtime and so we throw away sad. + */ + sad = imc_get_related_device(dev->bus, PCI_DEVFN(0x0f, 5), + PCI_DEVICE_ID_INTEL_BROADWELL_IMC_SAD); + if (!sad) { + err = -ENODEV; + goto probe_out_free; + } + pci_read_config_dword(sad, SADCNTL, &sadcntl); + pci_dev_put(sad); + + /* + * From pcu, we access the CLTT polling interval. + * + * The polling interval is set by BIOS. We assume it will not change at + * runtime and cache the initial value. + */ + priv->pcu.pci_dev = imc_get_related_device(dev->bus, PCI_DEVFN(0x1e, 1), + PCI_DEVICE_ID_INTEL_BROADWELL_IMC_PCU); + if (!priv->pcu.pci_dev) { + err = -ENODEV; + goto probe_out_free; + } + pci_read_config_dword(priv->pcu.pci_dev, TSODCNTL, + &priv->pcu.tsod_polling_interval); + + mutex_init(&priv->pcu.mutex); + + for (i = 0; i < 2; i++) { + err = imc_init_channelpair(priv, i, + sadcntl & SADCNTL_LOCAL_NODEID_MASK); + if (err) + goto probe_out_free_channelpair; + } + + return 0; + +probe_out_free_channelpair: + for (j = 0; j < i; j++) + imc_free_channelpair(priv, j); + + mutex_destroy(&priv->pcu.mutex); + +probe_out_free: + kfree(priv); + return err; +} + +static void imc_remove(struct pci_dev *dev) +{ + int i; + struct imc_priv *priv = pci_get_drvdata(dev); + + for (i = 0; i < 2; i++) + imc_free_channelpair(priv, i); + + /* set tosd_control.tsod_polling_interval to initial value */ + pci_write_config_dword(priv->pcu.pci_dev, TSODCNTL, + priv->pcu.tsod_polling_interval); + + mutex_destroy(&priv->pcu.mutex); +} + +static int imc_suspend(struct pci_dev *dev, pm_message_t mesg) +{ + struct imc_priv *priv = pci_get_drvdata(dev); + + /* BIOS is in charge. We should finish any pending transaction */ + priv->suspended = true; + + return 0; +} + +static int imc_resume(struct pci_dev *dev) +{ + struct imc_priv *priv = pci_get_drvdata(dev); + + priv->suspended = false; + + return 0; +} + +static const struct pci_device_id imc_ids[] = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, + PCI_DEVICE_ID_INTEL_BROADWELL_IMC_TA) }, + { 0, } +}; +MODULE_DEVICE_TABLE(pci, imc_ids); + +static struct pci_driver imc_pci_driver = { + .name = "imc_smbus", + .id_table = imc_ids, + .probe = imc_probe, + .remove = imc_remove, + .suspend = imc_suspend, + .resume = imc_resume, +}; + +static int __init i2c_imc_init(void) +{ + return pci_register_driver(&imc_pci_driver); +} +module_init(i2c_imc_init); + +static void __exit i2c_imc_exit(void) +{ + pci_unregister_driver(&imc_pci_driver); +} +module_exit(i2c_imc_exit); + +MODULE_AUTHOR("Stefan Schaeckeler "); +MODULE_DESCRIPTION("iMC SMBus driver"); +MODULE_LICENSE("GPL v2"); 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 index a6c21966d1cf..e66d95a52290 100644 --- 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 @@ -37,6 +37,7 @@ struct wistron_cpld_data { int reset[PORT_NUM]; int lpmod[PORT_NUM]; int modsel[PORT_NUM]; + int data_rdy[PORT_NUM]; }; static const struct i2c_device_id wistron_cpld_id[] = { @@ -51,6 +52,7 @@ MODULE_DEVICE_TABLE(i2c, wistron_cpld_id); #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 +#define TRANSCEIVER_DATA_RDY_ATTR_ID(index) MODULE_DATA_RDY_##index enum wistron_cpld_sysfs_attributes { /* chip version */ @@ -189,6 +191,38 @@ enum wistron_cpld_sysfs_attributes { TRANSCEIVER_MODSEL_ATTR_ID(30), TRANSCEIVER_MODSEL_ATTR_ID(31), TRANSCEIVER_MODSEL_ATTR_ID(32), + TRANSCEIVER_DATA_RDY_ATTR_ID(1), + TRANSCEIVER_DATA_RDY_ATTR_ID(2), + TRANSCEIVER_DATA_RDY_ATTR_ID(3), + TRANSCEIVER_DATA_RDY_ATTR_ID(4), + TRANSCEIVER_DATA_RDY_ATTR_ID(5), + TRANSCEIVER_DATA_RDY_ATTR_ID(6), + TRANSCEIVER_DATA_RDY_ATTR_ID(7), + TRANSCEIVER_DATA_RDY_ATTR_ID(8), + TRANSCEIVER_DATA_RDY_ATTR_ID(9), + TRANSCEIVER_DATA_RDY_ATTR_ID(10), + TRANSCEIVER_DATA_RDY_ATTR_ID(11), + TRANSCEIVER_DATA_RDY_ATTR_ID(12), + TRANSCEIVER_DATA_RDY_ATTR_ID(13), + TRANSCEIVER_DATA_RDY_ATTR_ID(14), + TRANSCEIVER_DATA_RDY_ATTR_ID(15), + TRANSCEIVER_DATA_RDY_ATTR_ID(16), + TRANSCEIVER_DATA_RDY_ATTR_ID(17), + TRANSCEIVER_DATA_RDY_ATTR_ID(18), + TRANSCEIVER_DATA_RDY_ATTR_ID(19), + TRANSCEIVER_DATA_RDY_ATTR_ID(20), + TRANSCEIVER_DATA_RDY_ATTR_ID(21), + TRANSCEIVER_DATA_RDY_ATTR_ID(22), + TRANSCEIVER_DATA_RDY_ATTR_ID(23), + TRANSCEIVER_DATA_RDY_ATTR_ID(24), + TRANSCEIVER_DATA_RDY_ATTR_ID(25), + TRANSCEIVER_DATA_RDY_ATTR_ID(26), + TRANSCEIVER_DATA_RDY_ATTR_ID(27), + TRANSCEIVER_DATA_RDY_ATTR_ID(28), + TRANSCEIVER_DATA_RDY_ATTR_ID(29), + TRANSCEIVER_DATA_RDY_ATTR_ID(30), + TRANSCEIVER_DATA_RDY_ATTR_ID(31), + TRANSCEIVER_DATA_RDY_ATTR_ID(32), }; /* sysfs attributes for hwmon */ @@ -204,6 +238,8 @@ static ssize_t get_mode_lpmod(struct device *dev, struct device_attribute *da, c 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); +static ssize_t get_mode_data_rdy(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_mode_data_rdy(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); @@ -234,6 +270,10 @@ static SENSOR_DEVICE_ATTR(psu_led, S_IWUSR | S_IRUGO, get_led_status, set_led_s 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 +#define DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(index) \ + static SENSOR_DEVICE_ATTR(port##index##_data_rdy, S_IWUSR | S_IRUGO, get_mode_data_rdy, set_mode_data_rdy, MODULE_DATA_RDY_##index) +#define DECLARE_TRANSCEIVER_DATA_RDY_ATTR(index) &sensor_dev_attr_port##index##_data_rdy.dev_attr.attr + /* transceiver attributes */ DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(1); DECLARE_TRANSCEIVER_PRESENT_SENSOR_DEVICE_ATTR(2); @@ -363,6 +403,38 @@ 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); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(1); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(2); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(3); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(4); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(5); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(6); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(7); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(8); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(9); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(10); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(11); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(12); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(13); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(14); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(15); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(16); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(17); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(18); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(19); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(20); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(21); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(22); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(23); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(24); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(25); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(26); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(27); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(28); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(29); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(30); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(31); +DECLARE_TRANSCEIVER_SENSOR_DEVICE_DATA_RDY_ATTR(32); static struct attribute *wistron_fpga_attributes[] = { &sensor_dev_attr_version.dev_attr.attr, @@ -443,6 +515,22 @@ static struct attribute *wistron_cpld1_attributes[] = { DECLARE_TRANSCEIVER_MODSEL_ATTR(14), DECLARE_TRANSCEIVER_MODSEL_ATTR(15), DECLARE_TRANSCEIVER_MODSEL_ATTR(16), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(1), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(2), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(3), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(4), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(5), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(6), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(7), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(8), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(9), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(10), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(11), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(12), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(13), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(14), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(15), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(16), NULL }; @@ -516,6 +604,22 @@ static struct attribute *wistron_cpld2_attributes[] = { DECLARE_TRANSCEIVER_MODSEL_ATTR(30), DECLARE_TRANSCEIVER_MODSEL_ATTR(31), DECLARE_TRANSCEIVER_MODSEL_ATTR(32), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(17), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(18), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(19), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(20), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(21), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(22), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(23), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(24), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(25), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(26), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(27), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(28), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(29), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(30), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(31), + DECLARE_TRANSCEIVER_DATA_RDY_ATTR(32), NULL }; @@ -758,6 +862,43 @@ static ssize_t set_mode_modsel(struct device *dev, struct device_attribute *da, return count; } +static ssize_t get_mode_data_rdy(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, data_rdy = 0; + + update_idx = attr->index - MODULE_DATA_RDY_1; + + mutex_lock(&data->lock); + data_rdy = data->data_rdy[update_idx]; + mutex_unlock(&data->lock); + + return sprintf(buf, "%d", data_rdy); +} + +static ssize_t set_mode_data_rdy(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, data_rdy; + int update_idx; + + error = kstrtoint(buf, 10, &data_rdy); + if (error) + return error; + + update_idx = attr->index - MODULE_DATA_RDY_1; + + mutex_lock(&data->lock); + data->data_rdy[update_idx] = data_rdy; + 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); 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 index 4236373499b2..0ad2e2ca1ae0 100644 --- 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 @@ -10,19 +10,56 @@ #include #include -/* QSFP-DD: page0 (low page + high page (128+128 byte)), page 2 (high page (128 byte)), page11 (high page (128 byte))*/ +#define QSFP28_TYPE 0x11 +#define QSFP_DD_TYPE 0x18 + +#define LOWER_PAGE_OFFSET 0x0 +#define PAGE0_OFFSET 0x80 +#define PAGE1_OFFSET 0x0 +#define PAGE2_OFFSET 0x80 +#define PAGE3_OFFSET 0x0 +#define PAGE10_OFFSET 0x80 +#define PAGE11_OFFSET 0x100 + +#define QSFP_DD_CHAN_MON_OFFSET 0x1a +#define QSFP_DD_TEMP_OFFSET 0xe +#define QSFP_DD_VOLT_OFFSET 0x10 +#define QSFP_DD_RX_LOS_OFFSET 0x13 +#define QSFP_DD_TX_FAULT_OFFSET 0x7 +#define QSFP_DD_DISABLE_OFFSET 0x2 + +#define QSFP28_DOM_BULK_DATA_OFFSET 0x16 +#define QSFP28_RX_LOS_OFFSET 0x3 +#define QSFP28_TX_FAULT_OFFSET 0x4 +#define QSFP28_DISABLE_OFFSET 0x56 + + +/* QSFP-DD: page0 (low page + high page (128+128 byte)), page 1/2/3/10/11 (high page (128 byte))*/ #define EEPROM_DATA_SIZE 256 +#define EEPROM3_DATA_SIZE 384 /* Addresses scanned */ static const unsigned short normal_i2c[] = { I2C_CLIENT_END }; #define MAX_PORT_NAME_LEN 20 +#define TEMP_DATA_SIZE 2 +#define VOLT_DATA_SIZE 2 +#define QSFP_DD_CHAN_MON_DATA_SIZE 0x30 +#define QSFP_DOM_BULK_DATA_SIZE 0x24 -enum sysfs_fan_attributes { +enum sysfs_oom_attributes { OOM_LP_MODE, OOM_TEMP, OOM_EEPROM1, OOM_EEPROM2, + OOM_EEPROM3, OOM_PORT_NAME, + OOM_TEMP_E, + OOM_VOLT_E, + OOM_QSFPDD_CHAN_MON, + OOM_QSFP_DOM_BULK, + OOM_CHAN_RX_LOS, + OOM_CHAN_TX_FAULT, + OOM_CHAN_DISABLE, OOM_ATTR_MAX }; @@ -35,7 +72,16 @@ struct wistron_oom_data { int temp; unsigned char eeprom1[EEPROM_DATA_SIZE]; unsigned char eeprom2[EEPROM_DATA_SIZE]; + unsigned char eeprom3[EEPROM3_DATA_SIZE]; char port_name[MAX_PORT_NAME_LEN]; + + unsigned char qsfp_dd_chan_mon[QSFP_DD_CHAN_MON_DATA_SIZE]; + unsigned char qsfp_dom_bulk[QSFP_DOM_BULK_DATA_SIZE]; + unsigned char tempe[TEMP_DATA_SIZE]; + unsigned char volte[VOLT_DATA_SIZE]; + int rx_los; + int tx_fault; + int disable; }; /* sysfs attributes for hwmon */ @@ -45,20 +91,46 @@ static ssize_t get_oom_info1(struct device *dev, struct device_attribute *da, ch 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_oom_info3(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_oom_info3(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 ssize_t get_t_v_e(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_t_v_e(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_qsfp_dd_chan_mon(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_qsfp_dd_chan_mon(struct device *dev, struct device_attribute *da, const char *buf, size_t count); +static ssize_t get_qsfp_dom_bulk(struct device *dev, struct device_attribute *da, char *buf); +static ssize_t set_qsfp_dom_bulk(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(eeprom3, S_IWUSR | S_IRUGO, get_oom_info3, set_oom_info3, OOM_EEPROM3); static SENSOR_DEVICE_ATTR(port_name, S_IRUGO | S_IWUSR, get_port_name, set_port_name, OOM_PORT_NAME); +static SENSOR_DEVICE_ATTR(qsfp_dd_chan_mon, S_IWUSR | S_IRUGO, get_qsfp_dd_chan_mon, set_qsfp_dd_chan_mon, OOM_QSFPDD_CHAN_MON); +static SENSOR_DEVICE_ATTR(qsfp_dom_bulk, S_IWUSR | S_IRUGO, get_qsfp_dom_bulk, set_qsfp_dom_bulk, OOM_QSFP_DOM_BULK); +static SENSOR_DEVICE_ATTR(tempe, S_IWUSR | S_IRUGO, get_t_v_e, set_t_v_e, OOM_TEMP_E); +static SENSOR_DEVICE_ATTR(volte, S_IWUSR | S_IRUGO, get_t_v_e, set_t_v_e, OOM_VOLT_E); +static SENSOR_DEVICE_ATTR(rx_los, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_CHAN_RX_LOS); +static SENSOR_DEVICE_ATTR(tx_fault, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_CHAN_TX_FAULT); +static SENSOR_DEVICE_ATTR(disable, S_IWUSR | S_IRUGO, get_oom_value, set_oom_value, OOM_CHAN_DISABLE); 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_eeprom3.dev_attr.attr, &sensor_dev_attr_port_name.dev_attr.attr, + &sensor_dev_attr_qsfp_dd_chan_mon.dev_attr.attr, + &sensor_dev_attr_qsfp_dom_bulk.dev_attr.attr, + &sensor_dev_attr_tempe.dev_attr.attr, + &sensor_dev_attr_volte.dev_attr.attr, + &sensor_dev_attr_rx_los.dev_attr.attr, + &sensor_dev_attr_tx_fault.dev_attr.attr, + &sensor_dev_attr_disable.dev_attr.attr, NULL }; @@ -70,10 +142,27 @@ static ssize_t get_oom_value(struct device *dev, struct device_attribute *da, ch int value = 0; mutex_lock(&data->lock); - if (attr->index == OOM_LP_MODE) - value = data->lp_mode; - else - value = data->temp; + switch (attr->index) { + case OOM_LP_MODE: + value = data->lp_mode; + break; + case OOM_TEMP: + value = data->temp; + break; + case OOM_CHAN_RX_LOS: + value = data->rx_los; + break; + case OOM_CHAN_TX_FAULT: + value = data->tx_fault; + break; + case OOM_CHAN_DISABLE: + value = data->disable; + break; + default: + value = data->temp; + break; + + } mutex_unlock(&data->lock); return sprintf(buf, "%d", value); @@ -93,10 +182,38 @@ static ssize_t set_oom_value(struct device *dev, struct device_attribute *da, co } mutex_lock(&data->lock); - if (attr->index == OOM_LP_MODE) - data->lp_mode = value; - else - data->temp = value; + switch (attr->index) { + case OOM_LP_MODE: + data->lp_mode = value; + break; + case OOM_TEMP: + data->temp = value; + break; + case OOM_CHAN_RX_LOS: + data->rx_los = value; + if (data->eeprom1[0] == QSFP_DD_TYPE) + data->eeprom3[PAGE11_OFFSET + QSFP_DD_RX_LOS_OFFSET] = value; + if (data->eeprom1[0] == QSFP28_TYPE) + data->eeprom1[LOWER_PAGE_OFFSET + QSFP28_RX_LOS_OFFSET] = value; + break; + case OOM_CHAN_TX_FAULT: + data->tx_fault = value; + if (data->eeprom1[0] == QSFP_DD_TYPE) + data->eeprom3[PAGE11_OFFSET + QSFP_DD_TX_FAULT_OFFSET] = value; + if (data->eeprom1[0] == QSFP28_TYPE) + data->eeprom1[LOWER_PAGE_OFFSET + QSFP28_TX_FAULT_OFFSET] = value; + break; + case OOM_CHAN_DISABLE: + data->disable = value; + if (data->eeprom1[0] == QSFP_DD_TYPE) + data->eeprom3[PAGE10_OFFSET + QSFP_DD_DISABLE_OFFSET] = value; + if (data->eeprom1[0] == QSFP28_TYPE) + data->eeprom1[LOWER_PAGE_OFFSET + QSFP28_DISABLE_OFFSET] = value; + break; + default: + data->temp = value; + break; + } mutex_unlock(&data->lock); return count; @@ -123,8 +240,8 @@ static ssize_t set_oom_info1(struct device *dev, struct device_attribute *da, co unsigned int val; mutex_lock(&data->lock); - memset(data->eeprom1, 0xFF, EEPROM_DATA_SIZE); - memset(str, 0x0, 3); + memzero_explicit(data->eeprom1, EEPROM_DATA_SIZE); + memzero_explicit(str, sizeof(str)); if (strlen(buf) >= EEPROM_DATA_SIZE) { for (i=0; i < strlen(buf) ; i++) { @@ -170,8 +287,8 @@ static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, co unsigned int val; mutex_lock(&data->lock); - memset(data->eeprom2, 0xFF, EEPROM_DATA_SIZE); - memset(str, 0x0, 3); + memzero_explicit(data->eeprom2, EEPROM_DATA_SIZE); + memzero_explicit(str, sizeof(str)); if (strlen(buf) >= EEPROM_DATA_SIZE) { for (i = 0; i < strlen(buf) ; i++) { @@ -195,6 +312,52 @@ static ssize_t set_oom_info2(struct device *dev, struct device_attribute *da, co return size; } +static ssize_t get_oom_info3(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->eeprom3, EEPROM3_DATA_SIZE); + mutex_unlock(&data->lock); + + return EEPROM3_DATA_SIZE; +} + +static ssize_t set_oom_info3(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); + memzero_explicit(data->eeprom3, EEPROM3_DATA_SIZE); + memzero_explicit(str, sizeof(str)); + + if (strlen(buf) >= EEPROM3_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 >= EEPROM3_DATA_SIZE) + break; + + data->eeprom3[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); @@ -224,6 +387,191 @@ static ssize_t set_port_name(struct device *dev, struct device_attribute *da, co return count; } +static ssize_t get_t_v_e(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); + + mutex_lock(&data->lock); + if (attr->index == OOM_TEMP_E) + memcpy(buf, data->tempe, TEMP_DATA_SIZE); + else + memcpy(buf, data->volte, VOLT_DATA_SIZE); + mutex_unlock(&data->lock); + + return (attr->index == OOM_TEMP_E) ? TEMP_DATA_SIZE : VOLT_DATA_SIZE; +} + +static ssize_t set_t_v_e(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_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); + if (attr->index == OOM_TEMP_E) { + memzero_explicit(data->tempe, TEMP_DATA_SIZE); + memzero_explicit(str, sizeof(str)); + + if (strlen(buf) >= TEMP_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 >= TEMP_DATA_SIZE) + break; + + data->tempe[k]=(unsigned char)val; + + if (k == 0) + data->temp = data->tempe[k]; + k++; + } + } + + if (data->eeprom1[0] == QSFP_DD_TYPE) + memcpy(&data->eeprom1[LOWER_PAGE_OFFSET + QSFP_DD_TEMP_OFFSET], data->tempe, TEMP_DATA_SIZE); + } + else { + memzero_explicit(data->volte, VOLT_DATA_SIZE); + memzero_explicit(str, sizeof(str)); + + if (strlen(buf) >= VOLT_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 >= VOLT_DATA_SIZE) + break; + + data->volte[k]=(unsigned char)val; + k++; + } + } + + if (data->eeprom1[0] == QSFP_DD_TYPE) + memcpy(&data->eeprom1[LOWER_PAGE_OFFSET + QSFP_DD_VOLT_OFFSET], data->volte, VOLT_DATA_SIZE); + } + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_qsfp_dd_chan_mon(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->qsfp_dd_chan_mon, QSFP_DD_CHAN_MON_DATA_SIZE); + mutex_unlock(&data->lock); + + return QSFP_DD_CHAN_MON_DATA_SIZE; +} + +static ssize_t set_qsfp_dd_chan_mon(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); + memzero_explicit(data->qsfp_dd_chan_mon, QSFP_DD_CHAN_MON_DATA_SIZE); + memzero_explicit(str, sizeof(str)); + + if (strlen(buf) >= QSFP_DD_CHAN_MON_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 >= QSFP_DD_CHAN_MON_DATA_SIZE) + break; + + data->qsfp_dd_chan_mon[k] = (unsigned char)val; + k++; + } + } + + if (data->eeprom1[0] == QSFP_DD_TYPE) + memcpy(&data->eeprom3[PAGE11_OFFSET + QSFP_DD_CHAN_MON_OFFSET], data->qsfp_dd_chan_mon, QSFP_DD_CHAN_MON_DATA_SIZE); + + mutex_unlock(&data->lock); + + return size; +} + +static ssize_t get_qsfp_dom_bulk(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->qsfp_dom_bulk, QSFP_DOM_BULK_DATA_SIZE); + mutex_unlock(&data->lock); + + return QSFP_DOM_BULK_DATA_SIZE; +} + +static ssize_t set_qsfp_dom_bulk(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); + memzero_explicit(data->qsfp_dom_bulk, QSFP_DOM_BULK_DATA_SIZE); + memzero_explicit(str, sizeof(str)); + + if (strlen(buf) >= QSFP_DOM_BULK_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 >= QSFP_DOM_BULK_DATA_SIZE) + break; + + data->qsfp_dom_bulk[k] = (unsigned char)val; + k++; + } + } + + if (data->eeprom1[0] == QSFP28_TYPE) { + memcpy(&data->eeprom1[LOWER_PAGE_OFFSET + QSFP28_DOM_BULK_DATA_OFFSET], data->qsfp_dom_bulk, QSFP_DOM_BULK_DATA_SIZE); + data->temp = data->qsfp_dom_bulk[0]; + } + + mutex_unlock(&data->lock); + + return size; +} + static const struct attribute_group wistron_oom_group = { .attrs = wistron_oom_attributes, }; 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 index 1ea7764dd430..fa48e9ce5d41 100644 --- 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 @@ -21,6 +21,7 @@ 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 +#define MFR_REV_LENGTH 10 /* Each client has this additional data */ struct wistron_psu_data { @@ -33,13 +34,15 @@ struct wistron_psu_data { int v_out; int i_in; int i_out; - int p_in; - int p_out; + long p_in; + long p_out; int temp_input; + int pwm; int fault; u8 mfr_id[MFR_VENDOR_NAME_LENGTH]; u8 mfr_model[MFR_MODEL_NAME_LENGTH]; u8 mfr_serial[MFR_SERIAL_NUM_LENGTH]; + u8 mfr_rev[MFR_REV_LENGTH]; }; enum psu_index { @@ -57,10 +60,12 @@ enum wistron_psu_sysfs_attributes { PSU_P_IN, PSU_P_OUT, PSU_TEMP1_INPUT, + PSU_PWM, PSU_FAULT, PSU_MFR_ID, PSU_MFR_MODEL, PSU_MFR_SERIAL, + PSU_MFR_REV, }; /* sysfs attributes for hwmon */ @@ -73,10 +78,12 @@ static SENSOR_DEVICE_ATTR(curr2_input, S_IWUSR | S_IRUGO, get_value, set_valu 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(pwm, S_IWUSR | S_IRUGO, get_value, set_value, PSU_PWM); 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 SENSOR_DEVICE_ATTR(rev, S_IWUSR | S_IRUGO, get_value, set_value, PSU_MFR_REV); static struct attribute *wistron_psu_attributes[] = { @@ -89,10 +96,12 @@ static struct attribute *wistron_psu_attributes[] = { &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_pwm.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, + &sensor_dev_attr_rev.dev_attr.attr, NULL }; @@ -162,14 +171,17 @@ static ssize_t get_value(struct device *dev, struct device_attribute *da, char * ret_count = sprintf(buf, "%d", data->i_out); break; case PSU_P_IN: - ret_count = sprintf(buf, "%d", data->p_in); + ret_count = sprintf(buf, "%ld", data->p_in); break; case PSU_P_OUT: - ret_count = sprintf(buf, "%d", data->p_out); + ret_count = sprintf(buf, "%ld", data->p_out); break; case PSU_TEMP1_INPUT: ret_count = sprintf(buf, "%d", data->temp_input); break; + case PSU_PWM: + ret_count = sprintf(buf, "%d", data->pwm); + break; case PSU_FAULT: ret_count = sprintf(buf, "%d", data->fault); break; @@ -182,6 +194,9 @@ static ssize_t get_value(struct device *dev, struct device_attribute *da, char * case PSU_MFR_SERIAL: ret_count = sprintf(buf, "%s", data->mfr_serial); break; + case PSU_MFR_REV: + ret_count = sprintf(buf, "%s", data->mfr_rev); + break; default: break; } @@ -222,12 +237,12 @@ static ssize_t set_value(struct device *dev, struct device_attribute *da, const goto exit_err; break; case PSU_P_IN: - error = kstrtoint(buf, 10, &data->p_in); + error = kstrtol(buf, 10, &data->p_in); if (error) goto exit_err; break; case PSU_P_OUT: - error = kstrtoint(buf, 10, &data->p_out); + error = kstrtol(buf, 10, &data->p_out); if (error) goto exit_err; break; @@ -236,23 +251,32 @@ static ssize_t set_value(struct device *dev, struct device_attribute *da, const if (error) goto exit_err; break; + case PSU_PWM: + error = kstrtoint(buf, 10, &data->pwm); + 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)); + memzero_explicit(&data->mfr_id, 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)); + memzero_explicit(&data->mfr_model, 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)); + memzero_explicit(&data->mfr_serial, sizeof(data->mfr_serial)); strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial) - 1); break; + case PSU_MFR_REV: + memzero_explicit(&data->mfr_rev, sizeof(data->mfr_rev)); + strncpy(data->mfr_rev, buf, sizeof(data->mfr_rev) - 1); + break; default: break; } 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 index a281df719677..578aa3c1d5ef 100644 --- 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 @@ -43,8 +43,8 @@ static ssize_t set_syseeprom(struct device *dev, struct device_attribute *da, co unsigned int val; mutex_lock(&data->lock); - memset(data->eeprom, 0xFF, EEPROM_DATA_SIZE); - memset(str, 0x0, 3); + memzero_explicit(data->eeprom, EEPROM_DATA_SIZE); + memzero_explicit(str, sizeof(str)); if (strlen(buf) >= EEPROM_DATA_SIZE) { for (i = 0; i < strlen(buf) ; i++) { diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-firmware_ver.service b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-firmware_ver.service new file mode 100644 index 000000000000..42a4d4e50f61 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/service/6512-32r-firmware_ver.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron 6512-32R Platform firmware version service +After=platform-modules-6512-32r.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_firmware_version +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target 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 index 1842d036cda4..ab8effcc4096 100644 --- 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 @@ -1,7 +1,6 @@ [Unit] Description=Wistron 6512-32R Platform Monitoring service -Before=pmon.service -After=sysinit.target +After=platform-modules-6512-32r.service DefaultDependencies=no [Service] diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py index 3c2888412e90..3b92de8c129c 100644 --- a/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/setup.py @@ -1,7 +1,5 @@ from setuptools import setup -DEVICE_NAME = 'wistron' -HW_SKU = 'x86_64-wistron_6512_32r-r0' setup( name='sonic-platform', @@ -16,9 +14,8 @@ packages=[ 'sonic_platform', ], - package_dir={ - 'sonic_platform': '../../../../device/{}/{}/sonic_platform'.format(DEVICE_NAME, HW_SKU)}, - classifiers=[ + package_dir={'sonic_platform': 'sonic_platform'}, + classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Plugins', 'Intended Audience :: Developers', diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/__init__.py old mode 100644 new mode 100755 similarity index 70% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/__init__.py index 29dfc92139ef..cc568450a400 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/__init__.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/__init__.py @@ -1,2 +1,2 @@ -__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp', 'thermal', 'fan', 'watchdog'] +__all__ = ['chassis', 'eeprom', 'platform', 'psu', 'sfp', 'thermal', 'fan', 'component', 'watchdog'] from . import platform diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/chassis.py old mode 100644 new mode 100755 similarity index 55% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/chassis.py index 232ca0ca5fe3..d27b26b98f62 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/chassis.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/chassis.py @@ -8,7 +8,6 @@ ############################################################################# try: import sys - import os import time import subprocess from sonic_platform_base.chassis_base import ChassisBase @@ -16,16 +15,19 @@ raise ImportError(str(e) + "- required module not found") NUM_FAN = 14 +NUM_FANTRAY = 7 NUM_PSU = 2 NUM_THERMAL = 8 NUM_SFP = 32 +NUM_COMPONENT = 6 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" +HOST_CHK_CMD = ["docker"] +GET_HWSKU_CMD = ["sonic-cfggen", "-d", "-v", "DEVICE_METADATA.localhost.hwsku"] +GET_PLATFORM_CMD = ["sonic-cfggen", "-d", "-v", "DEVICE_METADATA.localhost.platform"] +EEPROM_BOOT_TIME_INIT_DONE='/tmp/eeprom_init_done' class Chassis(ChassisBase): """Platform-specific Chassis class""" @@ -43,6 +45,7 @@ def __init__(self): self.__initialize_fan() self.__initialize_psu() self.__initialize_thermals() + self.__initialize_components() self.__initialize_sfp() self.__initialize_eeprom() @@ -54,10 +57,11 @@ def __initialize_sfp(self): 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) + from sonic_platform.fan_drawer import FanDrawer + for fan_index in range(0, NUM_FANTRAY): + fandrawer = FanDrawer(fan_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) def __initialize_psu(self): from sonic_platform.psu import Psu @@ -75,8 +79,14 @@ def __initialize_eeprom(self): from sonic_platform.eeprom import Tlv self._eeprom = Tlv() + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + def __is_host(self): - return os.system(HOST_CHK_CMD) == 0 + return subprocess.call(HOST_CHK_CMD) == 0 def __read_txt_file(self, file_path): try: @@ -96,7 +106,7 @@ def get_base_mac(self): """ return self._eeprom.get_mac() - def get_serial_number(self): + def get_serial(self): """ Retrieves the hardware serial number for the chassis Returns: @@ -141,15 +151,28 @@ def get_reboot_cause(self): return (reboot_cause, description) def _get_sku_name(self): - p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + p = subprocess.Popen(GET_HWSKU_CMD, 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) + p = subprocess.Popen(GET_PLATFORM_CMD, stdout=subprocess.PIPE) out, err = p.communicate() return out.decode().rstrip('\n') + def get_watchdog(self): + """ + Retreives hardware watchdog device on this chassis + Returns: + An object derived from WatchdogBase representing the hardware + watchdog device + """ + if self._watchdog is None: + from sonic_platform.watchdog import Watchdog + self._watchdog = Watchdog() + + return self._watchdog + def get_name(self): """ Retrieves the name of the device @@ -171,10 +194,22 @@ 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() + port_pres[port] = 1 if sfp.get_presence() else 0 return port_pres + def _read_sfp_eeprom_to_buffer(self, port): + sfp = self._sfp_list[port] + #if os.path.exists(EEPROM_BOOT_TIME_INIT_DONE): + # return sfp.read_eeprom_buffer() + c = sfp._read_eeprom_specific_bytes(0,1) + return c != ['ff'] and c != ['00'] + + def _clear_sfp_eeprom_buffer(self, port): + sfp = self._sfp_list[port] + return sfp.clear_eeprom_buffer() + + def get_change_event(self, timeout=0): port_dict = {} ret_dict = {'sfp': port_dict} @@ -201,12 +236,19 @@ def get_change_event(self, timeout=0): if cur_presence[port] != self._transceiver_presence[port]: change_event = True if cur_presence[port] == 1: - port_dict[port] = '1' + if self._read_sfp_eeprom_to_buffer(port): + port_dict[port] = '1' + self._transceiver_presence[port] = 1 + else: + cur_presence[port] = 0 + self._transceiver_presence[port] = 0 else: port_dict[port] = '0' + self._clear_sfp_eeprom_buffer(port) + self._transceiver_presence[port] = 0 - self._transceiver_presence = cur_presence - if change_event == True: + #self._transceiver_presence = cur_presence + if change_event is True: break if not forever: @@ -220,3 +262,96 @@ def get_change_event(self, timeout=0): sfp.reinit() return True, ret_dict + + 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 initizalize_system_led(self): + self.system_led = "" + return True + + def set_status_led(self, color): + """ + Sets the state of the system LED + + Args: + color: A string representing the color with which to set the + system LED + + Returns: + bool: True if system LED state is set successfully, False if not + """ + self.system_led = color + return True + + def get_status_led(self): + """ + Gets the state of the system LED + + Returns: + A string, one of the valid LED color strings which could be vendor + specified. + """ + return self.system_led + + + def get_presence(self): + """ + Retrieves the presence of the Chassis + Returns: + bool: True if Chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_model() + + 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 True + + 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): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + + return '0' + + def get_thermal_manager(self): + raise NotImplementedError diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/component.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/component.py new file mode 100755 index 000000000000..40a0ba551be2 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/component.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python + +import subprocess +from shlex import split +from collections import namedtuple +from functools import reduce + + +try: + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + "CPLD1": "0-0006", + "CPLD2": "0-0007", +} + +FPGA_ADDR_MAPPING = { + "MB_FPGA": "0-0030", +} + +proc_output = namedtuple('proc_output', 'stdout stderr') +GET_CPU_FPGA_VER_CMD = ["i2cget", "-f", "-y", "0", "0x10", "0x0"] +#GET_BMC_VER_CMD= "ipmitool mc info | grep 'Firmware Revision' | awk '{printf $4}'" +SYSFS_PATH = "/sys/bus/i2c/devices/" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("BIOS", "Basic Input/Output System"), + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("MB_FPGA", "MB FPGA"), + ("CPU_FPGA", "CPU FPGA"), + ("BMC", "baseboard management controller") +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + + def pipeline(self, starter_command, *commands): + if not commands: + try: + starter_command, *commands = starter_command.split('|') + except AttributeError: + pass + starter_command = self._parse(starter_command) + starter = subprocess.Popen(starter_command, stdout=subprocess.PIPE) + last_proc = reduce(self._create_pipe, map(self._parse, commands), starter) + return proc_output(*last_proc.communicate()) + + def _create_pipe(self, previous, command): + proc = subprocess.Popen(command, stdin=previous.stdout, stdout=subprocess.PIPE) + previous.stdout.close() + return proc + + def _parse(self, cmd): + try: + return split(cmd) + except Exception: + return cmd + + 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_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def __get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_ADDR_MAPPING: + try: + cpld_path = "{}{}{}".format(SYSFS_PATH, CPLD_ADDR_MAPPING[cpld_name], '/version') + cpld_version_raw= int(self.__read_txt_file(cpld_path), 10) + cpld_version[cpld_name] = "{} {}".format("MP" if (cpld_version_raw & 0x10) else "Proto", cpld_version_raw & 0xf) + except Exception as e: + print('Get exception when read cpld') + cpld_version[cpld_name] = 'None' + + return cpld_version + + def __get_cpu_fpga_ver(self): + try: + p = subprocess.Popen(GET_CPU_FPGA_VER_CMD, stdout=subprocess.PIPE) + out, err = p.communicate() + return out.decode().rstrip('\n') + except Exception as e: + print('Get exception when read cpu fpga') + return 'None' + + def __get_bmc_version(self): + try: + #GET_BMC_VER_CMD + out, err = self.pipeline("ipmitool mc info", "grep 'Firmware Revision'", "awk '{printf $4}'") + return out.decode().rstrip('\n') + except Exception as e: + print('Get exception when read bmc') + return 'None' + + def __get_fpga_version(self): + # Retrieves the fpga firmware version + fpga_version = dict() + try: + fpga_path = "{}{}{}".format(SYSFS_PATH, FPGA_ADDR_MAPPING['MB_FPGA'], '/version') + fpga_version_raw= int(self.__read_txt_file(fpga_path), 10) + fpga_version["MB_FPGA"] = "{} {}.{}".format("Formal" if (fpga_version_raw & 0x80) else "Test", ((fpga_version_raw & 0x70) >> 4), fpga_version_raw & 0xf) + except Exception as e: + print('Get exception when read fpga') + fpga_version["MB_FPGA"] = 'None' + + fpga_version_raw= int(self.__get_cpu_fpga_ver(), 16) + fpga_version["CPU_FPGA"] = "{} {}.{}".format("Formal" if (fpga_version_raw & 0x80) else "Test", ((fpga_version_raw & 0x70) >> 4), fpga_version_raw & 0xf) + + return fpga_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self.__get_bios_version() + elif "CPLD" in self.name: + cpld_version = self.__get_cpld_version() + fw_version = cpld_version.get(self.name) + elif "FPGA" in self.name: + fpga_version = self.__get_fpga_version() + fw_version = fpga_version.get(self.name) + elif "BMC" in self.name: + fw_version = self.__get_bmc_version() + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + 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 True + + 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): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + Note: the firmware version will be read from image + Args: + image_path: A string, path to firmware image + Returns: + A string containing the available firmware version of the component + """ + return "N/A" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + Args: + image_path: A string, path to firmware image + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return "None" + + def update_firmware(self, image_path): + """ + Updates firmware of the component + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + Args: + image_path: A string, path to firmware image + Raises: + RuntimeError: update failed + """ + return False diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/eeprom.py old mode 100644 new mode 100755 similarity index 81% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/eeprom.py index 9d01b1f866b8..7db38ead60a5 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/eeprom.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/eeprom.py @@ -41,12 +41,19 @@ def __parse_output(self, decode_output): for line in lines: try: match = re.search( - '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) - if match is not None: + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+[\s]+[\S]+)', line) + if match is not None and match.group(1) == '0x25': idx = match.group(1) value = match.group(3).rstrip('\0') + _eeprom_info_dict[idx] = value + else: + 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 - _eeprom_info_dict[idx] = value except BaseException: pass return _eeprom_info_dict @@ -70,7 +77,7 @@ def _load_eeprom(self): if not os.path.exists(CACHE_ROOT): try: os.makedirs(CACHE_ROOT) - except OSError: + except Exception: pass # @@ -79,7 +86,7 @@ def _load_eeprom(self): # try: self.set_cache_name(os.path.join(CACHE_ROOT, CACHE_FILE)) - except OSError: + except Exception: pass e = self.read_eeprom() @@ -90,6 +97,7 @@ def _load_eeprom(self): self.update_cache(e) except Exception: pass + self.decode_eeprom(e) decode_output = sys.stdout.getvalue() sys.stdout = original_stdout @@ -108,3 +116,6 @@ def get_serial(self): def get_mac(self): return self._eeprom.get('0x24', "Undefined.") + + def get_model(self): + return self._eeprom.get('0x21', "Undefined.") diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan.py new file mode 100755 index 000000000000..e6e2ff599524 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan.py @@ -0,0 +1,263 @@ +############################################################################# +# +# 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") + +SPEED_TOLERANCE = 15 +SYSFS_PATH = "/sys/bus/i2c/devices/0-0044" +SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/0-005a", + "/sys/bus/i2c/devices/0-0059"] + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", + "FAN-3F", "FAN-3R", "FAN-4F", "FAN-4R", + "FAN-5F", "FAN-5R", "FAN-6F", "FAN-6R", + "FAN-7F", "FAN-7R"] + +class Fan(FanBase): + """Platform-specific Fan class""" + + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + + if self.is_psu_fan: + self.psu_index = psu_index + + FanBase.__init__(self) + + def __search_hwmon_dir_name(self, directory): + try: + dirs = os.listdir(directory) + for file in dirs: + if file.startswith("hwmon"): + return file + except IOError: + pass + return '' + + 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 __write_txt_file(self, file_path, data): + try: + with open(file_path, 'w') as fd: + fd.write(data) + except IOError: + pass + 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 + """ + direction = 0 + if self.is_psu_fan: + # psu fan direction should be the same as fan tray + path= "{}/fan1_direction".format(SYSFS_PATH) + direction=self.__read_txt_file(path) + if direction is None: + return self.FAN_DIRECTION_EXHAUST + elif self.get_presence(): + path= "{}/fan{}_direction".format(SYSFS_PATH, self.fan_tray_index + 1) + direction=self.__read_txt_file(path) + if direction is None: + return self.FAN_DIRECTION_EXHAUST + + return self.FAN_DIRECTION_EXHAUST if int(direction) == 0 else self.FAN_DIRECTION_INTAKE + + + 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 100 (full speed) + + """ + speed = 0 + if self.is_psu_fan: + fan_path="{}/pwm".format(SYSFS_PSU_DIR[self.psu_index]) + speed = self.__read_txt_file(fan_path) + if speed is not None: + return int(speed) + else: + return 0 + elif self.get_presence(): + path= "{}/pwm".format(SYSFS_PATH) + speed=self.__read_txt_file(path) + if speed is None: + return 0 + + 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) + + Note: + speed_pc = pwm_target/255*100 + + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + return self.get_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 SPEED_TOLERANCE + + 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 + + """ + + 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 #Not supported + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_presence() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) + + 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*2 + self.fan_index] \ + if not self.is_psu_fan \ + else "PSU-{} FAN-{}".format(self.psu_index+1, self.fan_index+1) + + return fan_name + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + + if self.is_psu_fan: + present_path="{}/present".format(SYSFS_PSU_DIR[self.psu_index]) + else: + present_path="{}/fan{}_present".format(SYSFS_PATH, self.fan_tray_index + 1) + + val=self.__read_txt_file(present_path) + if val is not None: + return int(val, 10)==1 + else: + return False + + 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 self.is_psu_fan: + status_path = "{}/power_good".format(SYSFS_PSU_DIR[self.psu_index]) + val=self.__read_txt_file(status_path) + if val is not None: + return int(val, 10)==1 + else: + return False + else: + status=self.get_presence() + if status is None: + return False + return status + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + 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 (self.fan_tray_index * 2 + self.fan_index + 1) \ + if not self.is_psu_fan else (self.psu_index + 1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan_drawer.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..78d54f5dec25 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/fan_drawer.py @@ -0,0 +1,120 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 +MAX_FAN_WATT = 40.32 + + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + 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._fan_list[0].get_status() + + def set_status_led(self, color): + """ + Sets the state of the fan drawer status LED + Args: + color: A string representing the color with which to set the + fan drawer status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return self._fan_list[0].set_status_led(color) + def get_status_led(self): + """ + Gets the state of the fan drawer LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + return self._fan_list[0].get_status_led() + + 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 (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return MAX_FAN_WATT + diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/platform.py old mode 100644 new mode 100755 similarity index 100% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/platform.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/platform.py diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/psu.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/psu.py new file mode 100755 index 000000000000..2ec59298a4d0 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/psu.py @@ -0,0 +1,324 @@ +#!/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._fan_list = [] + 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) + self.__initialize_fan() + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, 1): + fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) + self._fan_list.append(fan) + + 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, index): + """ + Retrieves object representing the fan module contained in this PSU + Returns: + An object dervied from FanBase representing the fan module + contained in this PSU + """ + return self._fan_list[index] + + 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] +'/' + 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] +'/' + 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 + """ + try: + if self.get_presence(): + attr_file = 'model' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + return None + + 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 + """ + try: + if self.get_presence(): + attr_file = 'vendor' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as e: + return None + + 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 + """ + try: + if self.get_presence(): + attr_file = 'sn' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return str(val) + except Exception as 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 = 'in2_input' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return float(val) / 1000.0 + except Exception as 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 = 'curr2_input' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return float(val) / 1000.0 + except Exception as 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 = 'power2_input' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return float(val) / 1000000.0 + except Exception as 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 = 'temp1_input' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + val = self.__read_txt_file(attr_path) + return float(val) / 1000.0 + except Exception as 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 self.index + 1 + + def is_replaceable(self): + return True + + def get_revision(self): + """ + Retrieves the hardware revision of the device + Returns: + string: Revision value of device + """ + try: + if self.get_presence(): + attr_file = 'rev' + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file + with open(attr_path, 'r') as revision: + val = revision.read() + return val.strip() + except IOError: + return None + + def get_num_fans(self): + """ + Retrieves the number of fan modules available on this PSU + + Returns: + An integer, the number of fan modules available on this PSU + """ + return len(self._fan_list) + + def get_all_fans(self): + """ + Retrieves all fan modules available on this PSU + + Returns: + A list of objects derived from FanBase representing all fan + modules available on this PSU + """ + return self._fan_list diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/sfp.py old mode 100644 new mode 100755 similarity index 72% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/sfp.py index 7664999e56b8..53ca1e970500 --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/sfp.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/sfp.py @@ -10,8 +10,14 @@ 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_platform_base.sonic_sfp.sff8024 import type_abbrv_name + from sonic_platform_base.sonic_sfp.sff8024 import type_of_media_interface from sonic_py_common.logger import Logger import sys + import time + import subprocess + import os except ImportError as e: raise ImportError(str(e) + "- required module not found") @@ -133,9 +139,9 @@ QSFP_OPTION_VALUE_WIDTH = 4 QSFP_MODULE_UPPER_PAGE3_START = 384 -QSFP_MODULE_THRESHOLD_OFFSET = 128 +QSFP_MODULE_THRESHOLD_OFFSET = 0 QSFP_MODULE_THRESHOLD_WIDTH = 24 -QSFP_CHANNL_THRESHOLD_OFFSET = 176 +QSFP_CHANNL_THRESHOLD_OFFSET = 48 QSFP_CHANNL_THRESHOLD_WIDTH = 24 #definitions of the offset and width for values in DOM info eeprom @@ -149,9 +155,13 @@ QSFP_DD_RX_POWER_WIDTH = 16 QSFP_DD_TX_POWER_OFFSET = 26 QSFP_DD_TX_POWER_WIDTH = 16 +QSFP_DD_CHANNL_FLAGS_SUPPORT_OFFSET = 29 +QSFP_DD_CHANNL_FLAGS_SUPPORT_WIDTH = 2 +QSFP_DD_CHANNL_MON_SUPPORT_OFFSET = 31 +QSFP_DD_CHANNL_MON_SUPPORT_WIDTH = 2 QSFP_DD_CHANNL_MON_OFFSET = 154 QSFP_DD_CHANNL_MON_WIDTH = 48 -QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET = 86 +QSFP_DD_CHANNL_DISABLE_STATUS_OFFSET = 2 QSFP_DD_CHANNL_DISABLE_STATUS_WIDTH = 1 QSFP_DD_CHANNL_RX_LOS_STATUS_OFFSET = 19 QSFP_DD_CHANNL_RX_LOS_STATUS_WIDTH = 1 @@ -193,8 +203,52 @@ QSFP_TYPE = "QSFP" QSFP_DD_TYPE = "QSFP_DD" +PAUSE_EEPROM_SERVICE_STAMP='/tmp/pause_eeprom_polling' + # 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'} + } + + qsfp_dd_flags_capability = { + 'tx_fault': + {'offset': 0, + 'bit': 0, + 'type': 'bitvalue'}, + 'rx_los': + {'offset': 1, + 'bit': 1, + '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) + + def parse_flags_capability(self, sn_raw_data, start_pos): + return sffbase.parse(self, self.qsfp_dd_flags_capability, sn_raw_data, start_pos) class Sfp(SfpBase): """Platform-specific Sfp class""" @@ -243,19 +297,24 @@ class Sfp(SfpBase): 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" + LPMODE_1_16_PATH = "/sys/bus/i2c/devices/0-0006/port{}_lpmode" + LPMODE_17_32_PATH = "/sys/bus/i2c/devices/0-0007/port{}_lpmode" def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index + 1 + self.abbrv = None # Init eeprom path eeprom_path_prefix = '/sys/bus/i2c/devices/0-00' self.port_to_eeprom1_mapping = {} self.port_to_eeprom2_mapping = {} + self.port_to_eeprom3_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.port_to_eeprom3_mapping[x] = eeprom_path_prefix + self.port_to_i2c_mapping[x] + '/eeprom3' self._detect_sfp_type(sfp_type) self._dom_capability_detect() @@ -282,7 +341,153 @@ def get_presence(self): except IOError: return False logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) - return presence + return presence == 1 + + def _get_eeprom_by_bmc(self): + eeprom_path_prefix = '/sys/bus/i2c/devices/0-00' + mux = int((0x70 + self.index / 8) * 2) + chan = 1 << (self.index % 8) + sel_ch_cmd = 'ipmitool raw 0x30 0x25 0x1 {} 0x0 {} 2>/dev/null'.format(mux, chan) + desel_ch_cmd = 'ipmitool raw 0x30 0x25 0x1 {} 0x0 0x0 2>/dev/null'.format(mux) + desel_all_ch_cmd = 'ipmitool raw 0x30 0x25 0x1 0xe0 0x0 0x0 2>/dev/null; ipmitool raw 0x30 0x25 0x1 0xe2 0x0 0x0 2>/dev/null; ipmitool raw 0x30 0x25 0x1 0xe4 0x0 0x0 2>/dev/null; ipmitool raw 0x30 0x25 0x1 0xe6 0x0 0x0 2>/dev/null' + sel_page_cmd = 'ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f {} 2>/dev/null' + read_lower_cmd = 'ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x0 2>/dev/null' + read_upper_cmd = 'ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>/dev/null' + + try: + subprocess.Popen(sel_ch_cmd, stdout=subprocess.PIPE) + subprocess.Popen(sel_page_cmd.format(0), stdout=subprocess.PIPE) + time.sleep(0.05) + p = subprocess.Popen(read_lower_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + # retry if error occurred + i = 0 + while out == b'' and i < 3: + subprocess.Popen(desel_all_ch_cmd, stdout=subprocess.PIPE) + time.sleep(0.05) + subprocess.Popen(sel_ch_cmd, stdout=subprocess.PIPE) + subprocess.Popen(sel_page_cmd.format(0), stdout=subprocess.PIPE) + time.sleep(0.05) + p = subprocess.Popen(read_lower_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + i = i + 1 + if out == b'': + return False + + data_lower = out.decode().strip().replace("\n", "") + + i = 0 + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + while out == b'' and i < 3: + time.sleep(0.05) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + i = i + 1 + if out == b'': + return False + + data_upper_page_0 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0x1), stdout=subprocess.PIPE) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + data_upper_page_1 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0x2), stdout=subprocess.PIPE) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + data_upper_page_2 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0x3), stdout=subprocess.PIPE) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + data_upper_page_3 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0x10), stdout=subprocess.PIPE) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + data_upper_page_10 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0x11), stdout=subprocess.PIPE) + p = subprocess.Popen(read_upper_cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + data_upper_page_11 = out.decode().strip().replace("\n", "") + + subprocess.Popen(sel_page_cmd.format(0), stdout=subprocess.PIPE) + subprocess.Popen(desel_ch_cmd, stdout=subprocess.PIPE) + + eeprom1 = data_lower + " " + data_upper_page_0 + eeprom2 = data_upper_page_1 + " " + data_upper_page_2 + eeprom3 = data_upper_page_3 + " " + data_upper_page_10 + " " + data_upper_page_11 + + os.remove(PAUSE_EEPROM_SERVICE_STAMP) + + eeprom_raw_lower = [int(x, 16) for x in data_lower.split()] + if eeprom_raw_lower[0] in QSFP_TYPE_CODE_LIST: + temp = eeprom_raw_lower[22] + if temp > 128: + return False + elif eeprom_raw_lower[0] in QSFP_DD_TYPE_CODE_LIST: + temp = eeprom_raw_lower[14] + if temp > 128: + return False + + eeprom1 = eeprom1.replace(" ","") + eeprom2 = eeprom2.replace(" ","") + eeprom3 = eeprom3.replace(" ","") + + for i in range(0, 3): + sysfs_sfp_i2c_client_temp_path = eeprom_path_prefix + self.port_to_i2c_mapping[self.index] + '/temp' + if i == 0: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom1_mapping[self.index] + eeprom = eeprom1 + elif i == 1: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom2_mapping[self.index] + eeprom = eeprom2 + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom3_mapping[self.index] + eeprom = eeprom3 + + try: + with open(sysfs_sfp_i2c_client_eeprom_path, 'w') as fd: + fd.write(eeprom) + fd.close() + if i == 0: + with open(sysfs_sfp_i2c_client_temp_path, 'w') as fd: + fd.write(temp) + fd.close() + except IOError: + fd.close() + return True + except Exception: + return False + + def read_eeprom_buffer(self): + with open(PAUSE_EEPROM_SERVICE_STAMP, 'w') as f: + f.write("") + f.close() + + time.sleep(0.2) + rc = self._get_eeprom_by_bmc() + + + return rc + + def clear_eeprom_buffer(self): + for i in range(0, 3): + if i == 0: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom1_mapping[self.index] + elif i == 1: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom2_mapping[self.index] + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom3_mapping[self.index] + try: + with open(sysfs_sfp_i2c_client_eeprom_path, 'w') as fd: + fd.write(" ") + fd.close() + except IOError: + fd.close() def _read_eeprom_specific_bytes(self, offset, num_bytes): sysfsfile_eeprom = None @@ -292,9 +497,12 @@ def _read_eeprom_specific_bytes(self, offset, num_bytes): if offset < 256: sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom1_mapping[self.index] - else: + elif offset < 512: sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom2_mapping[self.index] offset = offset - 256 + else: + sysfs_sfp_i2c_client_eeprom_path = self.port_to_eeprom3_mapping[self.index] + offset = offset - 512 try: sysfsfile_eeprom = open(sysfs_sfp_i2c_client_eeprom_path, mode="rb", buffering=0) @@ -321,8 +529,10 @@ def _detect_sfp_type(self, sfp_type): if eeprom_raw: if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: self.sfp_type = QSFP_TYPE + self.abbrv = type_abbrv_name[eeprom_raw[0]] elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: self.sfp_type = QSFP_DD_TYPE + self.abbrv = type_abbrv_name[eeprom_raw[0]] else: # we don't regonize this identifier value, treat the xSFP module as the default type self.sfp_type = sfp_type @@ -333,6 +543,7 @@ def _detect_sfp_type(self, sfp_type): # 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 + self.abbrv = type_abbrv_name['18'] def _dom_capability_detect(self): if not self.get_presence(): @@ -342,17 +553,23 @@ def _dom_capability_detect(self): 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_channel_monitor_supported = True self.dom_module_monitor_supported = True - self.dom_channel_treshold_supported = False - self.dom_module_treshold_supported =False + self.dom_channel_threshold_supported = True + self.dom_module_threshold_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: self.calibration = 1 @@ -369,7 +586,7 @@ def _dom_capability_detect(self): 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) + dom_capability = sfpi_obj.parse_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' @@ -405,33 +622,36 @@ def _dom_capability_detect(self): if sfpi_obj is None: self.dom_supported = False - offset = 0 + self.dom_temp_supported = True + self.dom_volt_supported = True + self.dom_tx_fault_supported = False + self.dom_rx_los_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 + + ext_dd = ext_qsfp_dd() + offset = 256 + mon_sup_raw = self._read_eeprom_specific_bytes(offset + QSFP_DD_CHANNL_MON_SUPPORT_OFFSET, QSFP_DD_CHANNL_MON_SUPPORT_WIDTH) + 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_supported = True + + flags_sup_raw = self._read_eeprom_specific_bytes(offset + QSFP_DD_CHANNL_FLAGS_SUPPORT_OFFSET, QSFP_DD_CHANNL_FLAGS_SUPPORT_WIDTH) + flags_sup_data = ext_dd.parse_flags_capability(flags_sup_raw, 0) + + self.dom_tx_fault_supported = flags_sup_data['data']['tx_fault']['value'] == 'On' + self.dom_rx_los_supported = flags_sup_data['data']['rx_los']['value'] == 'On' else: self.dom_supported = False @@ -486,8 +706,19 @@ def get_transceiver_info(self): application_advertisement |1*255VCHAR |supported applications advertisement ================================================================================ """ + self.reinit() + info_dict_keys = [ + 'type', 'hardware_rev', 'serial', 'manufacturer', + 'model', 'connector', 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', 'cable_length', + 'nominal_bit_rate', 'specification_compliance', 'vendor_date', + 'vendor_oui', 'application_advertisement', 'type_abbrv_name'] + transceiver_info_dict = {} compliance_code_dict = {} + transceiver_info_dict = dict.fromkeys(info_dict_keys, "NA") + transceiver_info_dict["specification_compliance"] = '{}' + transceiver_info_dict['type_abbrv_name'] = self.abbrv #QSFP if self.sfp_type == QSFP_TYPE: @@ -636,6 +867,7 @@ def get_transceiver_info(self): if sfp_media_type_dict is None: return None + transceiver_info_dict['specification_compliance'] = type_of_media_interface[sfp_media_type_raw[0]] 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 @@ -663,7 +895,6 @@ def get_transceiver_info(self): 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" @@ -700,6 +931,7 @@ def get_transceiver_bulk_status(self): TX power |INT |TX output power in mW ======================================================================== """ + self.reinit() transceiver_dom_info_dict = {} dom_info_dict_keys = ['temperature', 'voltage', @@ -754,6 +986,10 @@ def get_transceiver_bulk_status(self): 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']) @@ -765,38 +1001,64 @@ def get_transceiver_bulk_status(self): 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) + offset = 0 + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_TEMPE_OFFSET), QSFP_DD_TEMPE_WIDTH) + 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: - 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) + offset = 0 + dom_data_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_VOLT_OFFSET), QSFP_DD_VOLT_WIDTH) + 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: + + offset = 768 + dom_data_raw = self._read_eeprom_specific_bytes(offset + (QSFP_DD_CHANNL_MON_OFFSET - 128), QSFP_DD_CHANNL_MON_WIDTH) + dom_channel_monitor_data = sfpd_obj.parse_channel_monitor_params(dom_data_raw, 0) + if self.dom_tx_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 @@ -831,6 +1093,7 @@ def get_transceiver_threshold_info(self): txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. ======================================================================== """ + self.reinit() transceiver_dom_threshold_info_dict = {} dom_info_dict_keys = ['temphighalarm', 'temphighwarning', @@ -851,9 +1114,7 @@ def get_transceiver_threshold_info(self): 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 + offset = 512 sfpd_obj = sff8436Dom() if sfpd_obj is None: return transceiver_dom_threshold_info_dict @@ -871,7 +1132,7 @@ def get_transceiver_threshold_info(self): dom_channel_threshold_data = sfpd_obj.parse_channel_threshold_values(dom_channel_threshold_raw, 0) # Threshold Data - if self.dom_module_treshold_supported: + if self.dom_module_threshold_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'] @@ -880,7 +1141,7 @@ def get_transceiver_threshold_info(self): 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: + if self.dom_channel_threshold_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'] @@ -906,8 +1167,8 @@ def get_transceiver_threshold_info(self): if sfpd_obj is None: return transceiver_dom_threshold_info_dict - # page 02 (we put page 2 to byte 256~384) - offset = 256 + # page 02 (we put page 2 to byte 384~511) + offset = 384 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 @@ -915,7 +1176,7 @@ def get_transceiver_threshold_info(self): dom_module_threshold_data = sfpd_obj.parse_module_threshold_values(dom_module_threshold_raw, 0) # Threshold Data - if self.dom_module_treshold_supported: + if self.dom_module_threshold_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'] @@ -924,7 +1185,7 @@ def get_transceiver_threshold_info(self): 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: + if self.dom_channel_threshold_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'] @@ -974,12 +1235,12 @@ def get_rx_los(self): #QSFP-DD else: - # page 11h (we put page 2 to byte 384~512) - if self.dom_rx_tx_power_bias_supported: - offset = 384 + # page 11h (we put page 11 to byte 768~895) + if self.dom_rx_los_supported: + offset = 768 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_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) @@ -999,6 +1260,7 @@ def get_tx_fault(self): 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. """ + self.reinit() if not self.dom_supported: return None @@ -1016,7 +1278,20 @@ def get_tx_fault(self): #QSFP-DD else: - return None + # page 11h (we put page 11 to byte 768~895) + if self.dom_tx_fault_supported: + offset = 768 + dom_channel_monitor_raw = self._read_eeprom_specific_bytes((offset + QSFP_DD_CHANNL_TX_FAULT_STATUS_OFFSET), QSFP_DD_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) + tx_fault_list.append(tx_fault_data & 0x10 != 0) + tx_fault_list.append(tx_fault_data & 0x20 != 0) + tx_fault_list.append(tx_fault_data & 0x40 != 0) + tx_fault_list.append(tx_fault_data & 0x80 != 0) return tx_fault_list @@ -1031,6 +1306,7 @@ def get_tx_disable(self): 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 """ + self.reinit() if not self.dom_supported: return None @@ -1048,20 +1324,19 @@ def get_tx_disable(self): #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) + # page 10h (we put page 10 to byte 640~767) + offset = 640 + 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 @@ -1083,8 +1358,17 @@ def get_lpmode(self): Returns: A Boolean, True if lpmode is enabled, False if disabled """ - # SFP doesn't support this feature - return False + lpmode = False + try: + if self.index < 16: + lpmode_path=self.LPMODE_1_16_PATH.format(self.port_num) + else: + lpmode_path=self.LPMODE_17_32_PATH.format(self.port_num) + with open(lpmode_path, 'r') as sfp_lpmode: + lpmode = int(sfp_lpmode.read(), 16) + except IOError: + return False + return lpmode == 1 def get_power_override(self): """ @@ -1102,6 +1386,7 @@ def get_temperature(self): Returns: An integer number of current temperature in Celsius """ + self.reinit() if not self.dom_supported: return None #QSFP @@ -1146,6 +1431,7 @@ def get_voltage(self): Returns: An integer number of supply voltage in mV """ + self.reinit() if not self.dom_supported: return None @@ -1192,6 +1478,7 @@ def get_tx_bias(self): for channel 0 to channel 4. Ex. ['110.09', '111.12', '108.21', '112.09'] """ + self.reinit() tx_bias_list = [] #QSFP @@ -1212,25 +1499,24 @@ def get_tx_bias(self): #QSFP-DD else: - # page 11h (we put page 1 to byte 384~512) - if self.dom_rx_tx_power_bias_supported: - offset = 384 + # page 11h (we put page 1 to byte 768~895) + if dom_tx_bias_power_supported: + offset = 768 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'])) + 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 @@ -1243,6 +1529,7 @@ def get_rx_power(self): power in mW for channel 0 to channel 4. Ex. ['1.77', '1.71', '1.68', '1.70'] """ + self.reinit() rx_power_list = [] #QSFP @@ -1268,25 +1555,24 @@ def get_rx_power(self): #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 + # page 11h (we put page 11 to byte 768~895) + if self.dom_rx_power_supported: + offset = 768 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'])) + 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 @@ -1299,6 +1585,7 @@ def get_tx_power(self): for channel 0 to channel 4. Ex. ['1.86', '1.86', '1.86', '1.86'] """ + self.reinit() tx_power_list = [] #QSFP @@ -1324,25 +1611,24 @@ def get_tx_power(self): #QSFP-DD else: - # page 11h (we put page 1 to byte 384~512) - if self.dom_rx_tx_power_bias_supported: - offset = 384 + # page 11h (we put page 11 to byte 768~895) + if self.dom_tx_power_supported: + offset = 768 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'])) + 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 @@ -1352,8 +1638,22 @@ def reset(self): Returns: A boolean, True if successful, False if not """ - # SFP doesn't support this feature - return False + try: + if self.index < 16: + file_path=self.RESET_1_16_PATH.format(self.port_num) + else: + file_path=self.RESET_17_32_PATH.format(self.port_num) + + with open(file_path, 'w') as fd: + fd.write(str(1)) + time.sleep(1) + fd.write(str(0)) + time.sleep(1) + + except IOError: + return False + + return True def tx_disable(self, tx_disable): """ @@ -1390,8 +1690,18 @@ def set_lpmode(self, lpmode): Returns: A boolean, True if lpmode is set successfully, False if not """ - # SFP doesn't support this feature - return False + try: + if self.index < 16: + lpmode_path=self.LPMODE_1_16_PATH.format(self.port_num) + else: + lpmode_path=self.LPMODE_17_32_PATH.format(self.port_num) + val_file = open(lpmode_path, 'w') + val_file.write('1' if lpmode else '0') + val_file.close() + return True + except IOError: + val_file.close() + return False def set_power_override(self, power_override, power_set): """ @@ -1420,7 +1730,7 @@ def get_name(self): string: The name of the device """ - name='port'+str(self.index) + name='port'+str(self.index + 1) return name def get_model(self): @@ -1441,3 +1751,40 @@ def get_serial(self): transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("serial", "N/A") + 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 not self.get_reset_status() + + def get_position_in_parent(self): + """ + Returns: + Temp return 0 + """ + return 0 + + def is_replaceable(self): + """ + Retrieves if replaceable + Returns: + A boolean value, True if replaceable + """ + return True + + def get_error_description(self): + """ + Get error description + + Args: + error_code: The error code returned by _get_error_code + + Returns: + The error description + """ + if self.get_presence(): + return self.SFP_STATUS_OK + else: + return self.SFP_STATUS_UNPLUGGED diff --git a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/thermal.py old mode 100644 new mode 100755 similarity index 61% rename from device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py rename to platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/thermal.py index 942e6b7be347..73228ce8f0ac --- a/device/wistron/x86_64-wistron_6512_32r-r0/sonic_platform/thermal.py +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/thermal.py @@ -15,7 +15,6 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") - class Thermal(ThermalBase): """Platform-specific Thermal class""" @@ -42,6 +41,8 @@ def __init__(self, thermal_index): self.THERMAL_NAME_LIST.append("UCPUB") self.THERMAL_NAME_LIST.append("UFANB") ThermalBase.__init__(self) + self.minimum_thermal = self.get_temperature() + self.maximum_thermal = self.get_temperature() def __read_txt_file(self, file_path): try: @@ -50,13 +51,24 @@ def __read_txt_file(self, file_path): return data.strip() except IOError: pass - return "" + return None 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) + if raw_temp is not None: + return float(raw_temp)/1000 + else: + return 0.0 + + def __set_threshold(self, file_name, temperature): + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], 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): """ @@ -74,7 +86,8 @@ def get_low_threshold(self): :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) + # work temperatur is 0~40, hyst is 2 + return 2.0 def get_low_critical_threshold(self): """ @@ -82,7 +95,8 @@ def get_low_critical_threshold(self): :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) + # work temperatur is 0~40 + return 0.0 def get_high_threshold(self): """ @@ -120,7 +134,7 @@ def get_presence(self): bool: True if PSU is present, False if not """ temp_file = "temp1_input" - temp_file_path = os.path.join(self.hwmon_path, temp_file) + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) return os.path.isfile(temp_file_path) def get_status(self): @@ -134,3 +148,63 @@ def get_status(self): return True + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return "None" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "None" + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False + + 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 self.index + 1 + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp < self.minimum_thermal: + self.minimum_thermal = tmp + return self.minimum_thermal + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp > self.maximum_thermal: + self.maximum_thermal = tmp + return self.maximum_thermal + diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/watchdog.py b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/watchdog.py new file mode 100755 index 000000000000..fb7987bdd682 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/sonic_platform/watchdog.py @@ -0,0 +1,184 @@ +#!/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: + import subprocess + from sonic_platform_base.watchdog_base import WatchdogBase + from shlex import split + from collections import namedtuple + from functools import reduce +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +proc_output = namedtuple('proc_output', 'stdout stderr') + +WDT_COMMON_ERROR = -1 + +IPMI_WDT_EN_KICK_CMD = ["ipmitool", "mc", "watchdog", "reset"] +IPMI_WDT_OFF_CMD = ["ipmitool", "mc", "watchdog", "off"] +IPMI_WDT_SET_TIMEOUT_CMD = ["ipmitool", "raw", "0x6", "0x24", "0x4", "0x0", "0x0", "0x0"] +#IPMI_WDT_GET_TIMEOUT_CMD = "ipmitool mc watchdog get | grep Present | awk '{print $3}'" +#IPMI_WDT_GET_STATUS_CMD = "ipmitool mc watchdog get | grep 'Timer Is' | awk '{printf $4}'" + +class Watchdog(WatchdogBase): + """ + Abstract base class for interfacing with a hardware watchdog module + """ + + def __init__(self): + # Set default value + self.armed = self._get_status() + self.timeout = self._gettimeout() + + def pipeline(self, starter_command, *commands): + if not commands: + try: + starter_command, *commands = starter_command.split('|') + except AttributeError: + pass + starter_command = self._parse(starter_command) + starter = subprocess.Popen(starter_command, stdout=subprocess.PIPE) + last_proc = reduce(self._create_pipe, map(self._parse, commands), starter) + return proc_output(*last_proc.communicate()) + + def _create_pipe(self, previous, command): + proc = subprocess.Popen(command, stdin=previous.stdout, stdout=subprocess.PIPE) + previous.stdout.close() + return proc + + def _parse(self, cmd): + try: + return split(cmd) + except Exception: + return cmd + + def _get_status(self): + #IPMI_WDT_GET_STATUS_CMD + out, err = self.pipeline("ipmitool mc watchdog get", "grep 'Timer Is'", "awk '{print $4}'") + status_str = out.decode().rstrip('\n') + + if "Running" in status_str: + return True + + return False + + def _enable(self): + """ + Turn on the watchdog timer + """ + p = subprocess.Popen(IPMI_WDT_EN_KICK_CMD, stdout=subprocess.PIPE) + p.communicate() + return 0 + + def _disable(self): + """ + Turn off the watchdog timer + """ + p = subprocess.Popen(IPMI_WDT_OFF_CMD, stdout=subprocess.PIPE) + p.communicate() + return 0 + + def _keepalive(self): + """ + Keep alive watchdog timer + """ + p = subprocess.Popen(IPMI_WDT_EN_KICK_CMD, stdout=subprocess.PIPE) + p.communicate() + return 0 + + def _settimeout(self, seconds): + """ + Set watchdog timer timeout + @param seconds - timeout in seconds + @return is the actual set timeout + """ + ipmi_timeout = seconds * 10; + cmd = ["ipmitool", "raw", "0x6", "0x24", "0x4", "0x0", "0x0", "0x0"] + cmd.append(str(ipmi_timeout % 256)) + cmd.append(str(int(ipmi_timeout / 256))) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + p.communicate() + + return seconds + + def _gettimeout(self): + #IPMI_WDT_GET_TIMEOUT_CMD + out, err = self.pipeline("ipmitool mc watchdog get", "grep Present", "awk '{print $3}'") + return int(out.decode().rstrip('\n'), 10) + + 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. + """ + ret = WDT_COMMON_ERROR + + if seconds < 0 or seconds > 500: + return ret + + try: + if self.timeout != seconds: + self.timeout = self._settimeout(seconds) + + if self.armed: + self._keepalive() + else: + self._enable() + + ret = self.timeout + except IOError as e: + print("Error: unable to enable wdt due to : {}".format(e)) + + return ret + + def disarm(self): + """ + Disarm the hardware watchdog + Returns: + A boolean, True if watchdog is disarmed successfully, False if not + """ + disarmed = False + try: + self._disable() + self.armed = False + disarmed = True + except IOError as e: + print("Error: unable to disable wdt due to : {}".format(e)) + return disarmed + + def is_armed(self): + """ + Retrieves the armed state of the hardware watchdog. + Returns: + A boolean, True if watchdog is armed, False if not + """ + return self.armed + + 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 thei + watchdog timer. If the watchdog is not armed, returns -1. + """ + + timeleft = WDT_COMMON_ERROR + + if self.armed: + return self._gettimeout() + + return timeleft diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_firmware_version b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_firmware_version new file mode 100755 index 000000000000..1fe70c7f4310 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_firmware_version @@ -0,0 +1,17 @@ +#!/bin/bash +cpld1_ver=$(ipmitool raw 0x30 0x25 0x0 0xc 0x1 0x0 2>>/dev/null | awk '{printf $1}') +cpld2_ver=$(ipmitool raw 0x30 0x25 0x0 0xe 0x1 0x0 2>>/dev/null | awk '{printf $1}') +fpga_ver=$(ipmitool raw 0x30 0x25 0x0 0x60 0x1 0x0 2>>/dev/null | awk '{printf $1}') +cpld1_ver=$( printf "%d" 0x$cpld1_ver ) +cpld2_ver=$( printf "%d" 0x$cpld2_ver ) +fpga_ver=$( printf "%d" 0x$fpga_ver ) +cpld1_ver_path="/sys/bus/i2c/devices/0-0006/version" +cpld2_ver_path="/sys/bus/i2c/devices/0-0007/version" +fpga_ver_path="/sys/bus/i2c/devices/0-0030/version" + +echo $cpld1_ver > $cpld1_ver_path +echo $cpld2_ver > $cpld2_ver_path +echo $fpga_ver > $fpga_ver_path + +exit 0 + 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 old mode 100644 new mode 100755 index 9c357e7ac7e8..071339cac9d3 --- a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_sync @@ -3,5 +3,7 @@ /usr/local/bin/sonic-led-monitor & /usr/local/bin/sonic-qsfp-monitor & /usr/local/bin/sonic-psu-monitor & +/usr/local/bin/sonic-qsfp-eeprom-monitor & +/usr/local/bin/sonic-send-temp-to-bmc & 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 old mode 100644 new mode 100755 index 2db0a921cb9a..4a19db909864 --- a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/platform_syseeprom @@ -1,10 +1,15 @@ #!/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 +board_ver=$(i2cget -f -y 0 0x55 0x0 1>/dev/null 2>/dev/null; echo $?) + +if [ $board_ver != 0 ]; then + 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 +fi + 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 index 180456f6a8aa..793e022823cb --- 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 @@ -44,13 +44,8 @@ add_byte(){ # 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)) + len=$2 + s=$(($1)) e=$(($1 + len - 1)) for i in $(seq $s $e) do @@ -189,6 +184,17 @@ get_PSU_information() if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-0059/fault fi + + byte_read 41 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/pwm + fi + + byte_read 42 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/pwm + fi + fi #____________________________________________________________________________ @@ -196,35 +202,46 @@ get_PSU_information() 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 + string_read 1 20 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-005a/vendor fi #PSU2 mfr_ID - string_read 21 + string_read 21 20 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-0059/vendor fi #PSU1 mfr_model - string_read 41 + string_read 41 20 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-005a/model fi #PSU2 mfr_model - string_read 61 + string_read 61 20 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-0059/model fi #PSU1 mfr_serial - string_read 81 + string_read 81 30 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-005a/sn fi - #PSU1 mfr_serial - string_read 111 + #PSU2 mfr_serial + string_read 111 30 if [ $? -eq 1 ];then echo $value > /sys/bus/i2c/devices/0-0059/sn fi + + #PSU1 mfr_rev + string_read 141 2 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-005a/rev + fi + #PSU2 mfr_serial + string_read 143 2 + if [ $? -eq 1 ];then + echo $value > /sys/bus/i2c/devices/0-0059/rev + fi fi } diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-eeprom-monitor b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-eeprom-monitor new file mode 100755 index 000000000000..a7213e3a9260 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-qsfp-eeprom-monitor @@ -0,0 +1,596 @@ +#!/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_init=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) + +port_sfp_type=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) + +board_ver=$(ipmitool raw 0x30 0x25 0x1 0xe0 0x1 0x0 1>/dev/null 2>/dev/null; echo $?) #error will get 1 means EVT, otherwise DVT + + +byte_hex_test() +{ + if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then + return 0 + else + return 1 + fi +} + +pmon_status_check() +{ + output=$( docker inspect -f '{{.State.Status}}' pmon 2>/dev/null) + if [ $? -eq 0 ]; then + if [ $output == 'running' ]; then + return 1 + else + return 0 + fi + else + return 0 + fi +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=val +bmc_write() +{ + if [ $board_ver == 1 ]; then + 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 + else + pmon_status_check + if [ $? -eq 1 ]; then + while [ $(docker exec pmon bash -c 'if [ -e /tmp/pause_eeprom_polling ]; then echo 1; else echo 0; fi') == '1' ]; do + sleep 0.1; + done + fi + mux_addr=$(((0x70 + $1 - 2) * 2)) + chan=$((1 << $2)) + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null + ipmitool raw 0x30 0x25 0x1 $addr_8b 0x0 $4 $5 1>>/dev/null 2>>/dev/null + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + fi +} + +#$1=mux $2=channel $3=dev_addr, $4=reg, $5=len +bmc_read() +{ + if [ $board_ver == 1 ]; then + 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 + else + mux_addr=$(((0x70 + $1 - 2) * 2)) + chan=$((1 << $2)) + addr_8b=$(echo $(($3)) | awk '{printf $1}') + addr_8b=`expr $addr_8b \\* 2` + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 $addr_8b $5 $4 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + return 1 + else + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + return 0 + fi + fi +} + + +bmc_dump() +{ + err=0 + mux_addr=$(((0x70 + $1 - 2) * 2)) + chan=$((1 << $2)) + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x0 2>>/dev/null) + if [ $? -eq 0 ];then + result1=$val + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result2=$val + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x1 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result3=$val + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x2 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result4=$val + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x3 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result5=$val + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x10 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result6=$val + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x11 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x80 0x80 2>>/dev/null) + if [ $? -eq 0 ];then + result7=$val + else + err=1 + fi + + + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + + if [ $err -eq 0 ];then + return 1 + else + return 0 + fi +} + +bmc_update_dynamic() +{ + local port=$1 + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + 2` + ch=`expr $port % 8` + + if [ ${port_sfp_type[$port]} -eq 17 ]; then + err=0 + mux_addr=$(((0x70 + $i2cmux_dev - 2) * 2)) + chan=$((1 << $ch)) + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x3 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/rx_los" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x4 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tx_fault" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x56 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/disable" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x24 0x16 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + result=$(echo $result | sed 's/[[:space:]]//g') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/qsfp_dom_bulk" + result=$(echo $result | sed -e 's/ //g') + echo $result > $result_path + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + + if [ $err -eq 0 ];then + return 1 + else + return 0 + fi + + elif [ ${port_sfp_type[$port]} -eq 24 ]; then + err=0 + mux_addr=$(((0x70 + $i2cmux_dev - 2) * 2)) + chan=$((1 << $ch)) + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 $chan 1>>/dev/null 2>>/dev/null + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x0 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x2 0xe 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + result=$(echo $result | sed 's/[[:space:]]//g') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tempe" + result=$(echo $result | sed -e 's/ //g') + echo $result > $result_path + else + err=1 + fi + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x2 0x10 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + result=$(echo $result | sed 's/[[:space:]]//g') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/volte" + result=$(echo $result | sed -e 's/ //g') + echo $result > $result_path + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x10 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x82 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/disable" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 0xa0 0x0 0x7f 0x11 1>>/dev/null 2>>/dev/null + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x87 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/tx_fault" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x1 0x93 2>>/dev/null) + if [ $? -eq 0 ];then + result=$(echo $val | awk '{printf $1}') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/rx_los" + result=$( printf "%d" 0x$result ) + echo $result > $result_path + else + err=1 + fi + + val=$(ipmitool raw 0x30 0x25 0x1 0xa0 0x30 0x9a 2>>/dev/null) + if [ $? -eq 0 ];then + result=$val + result=$(echo $result | sed 's/[[:space:]]//g') + result_path="/sys/bus/i2c/devices/0-00"${port_map[$((port + 1))]}"/qsfp_dd_chan_mon" + result=$(echo $result | sed -e 's/ //g') + echo $result > $result_path + else + err=1 + fi + + ipmitool raw 0x30 0x25 0x1 $mux_addr 0x0 0x0 1>>/dev/null 2>>/dev/null + + if [ $err -eq 0 ];then + return 1 + else + return 0 + fi + fi +} + +#$1=port_no +bmc_qsfp_eeprom_read() +{ + local port=$1 + local eeprom_part1 + local eeprom_part2 + local eeprom_part3 + local eeprom_part4 + local eeprom_part5 + local eeprom_part6 + local eeprom_part7 + local eeprom1_full + local eeprom2_full + local eeprom3_full + + port=`expr $port - 1` + i2cmux_dev=0 + i2cmux_dev=`expr $port / 8` + i2cmux_dev=`expr $i2cmux_dev + 2` + ch=`expr $port % 8` + if [ ${port_init[$port]} -eq 0 ]; then + if [ $board_ver == 1 ]; then + 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 page1 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x01 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part3=$result + else + return 1 + fi + + #QSFP-DD page2 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x2 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part4=$result + else + return 1 + fi + + #QSFP-DD page3 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x3 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part5=$result + else + return 1 + fi + + #QSFP-DD page10 + bmc_write $i2cmux_dev $ch 0x50 0x7f 0x10 + bmc_read $i2cmux_dev $ch 0x50 128 128 + if [ $? -eq 1 ];then + eeprom_part6=$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_part7=$result + else + return 1 + fi + else + #pmon_status_check + #if [ $? -eq 1 ]; then + # while [ $(docker exec pmon bash -c 'if [ -e /tmp/pause_eeprom_polling ]; then echo 1; else echo 0; fi') == '1' ]; do + # sleep 0.1; + # done + #fi + + bmc_dump $i2cmux_dev $ch + if [ $? -eq 1 ];then + eeprom_part1=$result1 + eeprom_part2=$result2 + eeprom_part3=$result3 + eeprom_part4=$result4 + eeprom_part5=$result5 + eeprom_part6=$result6 + eeprom_part7=$result7 + else + return 1 + fi + fi + fi + + if [ ${port_init[$port]} -eq 1 ]; then + + eeprom1_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom1" + check=$(od -An -tx1 -w1 -v $eeprom1_path | head -n 1) + if [ $check != '00' ] && [ $check != 'ff' ] ; then + if [ -e /tmp/plugin_module_event ]; then + return + fi + + bmc_update_dynamic $port + if [ $? -eq 0 ];then + return 1 + fi + else + port_init[$port]=0 + fi + fi + + + if [ ${port_init[$port]} -eq 0 ]; then + 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 ) + port_sfp_type[$((i - 1))]=$sfp_type + #get temperature + if [ $sfp_type -eq 24 ];then + 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 + elif [ $sfp_type -eq 17 ];then + temp=$(echo $eeprom_part1 | awk '{printf $23}') + 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 + 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') + eeprom3_full=$eeprom_part5$eeprom_part6$eeprom_part7 + eeprom3_full=$(echo $eeprom3_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 + eeprom3_path="/sys/bus/i2c/devices/0-00"${port_map[$1]}"/eeprom3" + eeprom3_full=$(echo $eeprom3_full | sed -e 's/ //g') + echo $eeprom3_full > $eeprom3_path + else + printf "\nPort %d EEPROM:" $1 + printf "\n-----------------------------------------------\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 + + if [ $board_ver == 0 ]; then + port_init[$port]=1 + if [ $port -lt 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0006/" + else + cpld_path="/sys/bus/i2c/devices/0-0007/" + fi + echo 1 > $cpld_path"port"$((port + 1))"_data_rdy" + fi + fi + + return 0 +} + +TRANSCEIVER_DATA_READ() +{ + first_detect=0 + loop_after_plugin=0 + + 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 + if [ $first_detect == 0 ]; then + ipmitool raw 0x30 0x25 0x1 0xe0 0x0 0x0 1>>/dev/null 2>>/dev/null + ipmitool raw 0x30 0x25 0x1 0xe2 0x0 0x0 1>>/dev/null 2>>/dev/null + ipmitool raw 0x30 0x25 0x1 0xe4 0x0 0x0 1>>/dev/null 2>>/dev/null + ipmitool raw 0x30 0x25 0x1 0xe6 0x0 0x0 1>>/dev/null 2>>/dev/null + fi + for i in $(seq 1 32); + do + if [ $i -le 16 ];then + cpld_path="/sys/bus/i2c/devices/0-0006/" + else + cpld_path="/sys/bus/i2c/devices/0-0007/" + fi + + pre=$(cat $cpld_path"port"$i"_present") + if [ $pre == 1 ]; then + bmc_qsfp_eeprom_read $i + if [ $first_detect == 0 ]; then + first_detect=1 + fi + else + port_init[$((i - 1))]=0 + port_sfp_type[$((i - 1))]=0 + fi + done + + if [ $first_detect == 1 ]; then + touch /tmp/eeprom_init_done + fi + + if [ -e /tmp/plugin_module_event ]; then + loop_after_plugin=$((loop_after_plugin + 1)) + + if [ $loop_after_plugin -gt 2 ]; then + rm /tmp/plugin_module_event + loop_after_plugin=0 + fi + fi + + pmon_status_check + if [ $? -eq 1 ]; then + if [ $first_detect == 1 ]; then + docker exec pmon bash -c 'echo "" > /tmp/eeprom_init_done' + fi + else + first_detect=0 + fi + + sleep 1; + fi + done +} + +TRANSCEIVER_DATA_READ 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 old mode 100644 new mode 100755 index 645b8528851f..f2eb928346d7 --- 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 @@ -1,7 +1,7 @@ #!/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') +board_ver=$(ipmitool raw 0x30 0x25 0x1 0xe0 0x1 0x0 1>/dev/null 2>/dev/null; echo $?) #error will get 1 means EVT, otherwise DVT + port_1_8_presence=0 port_9_16_presence=0 port_17_24_presence=0 @@ -10,6 +10,14 @@ port_1_8_reset=0 port_9_16_reset=0 port_17_24_reset=0 port_25_32_reset=0 +port_1_8_lpmode=0 +port_9_16_lpmode=0 +port_17_24_lpmode=0 +port_25_32_lpmode=0 +port_1_8_modsel=0 +port_9_16_modsel=0 +port_17_24_modsel=0 +port_25_32_modsel=0 result=0 pre_port_1_8_reset=256 @@ -25,6 +33,8 @@ pre_port_9_16_modsel=256 pre_port_17_24_modsel=256 pre_port_25_32_modsel=256 +port_pre_present=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) + byte_hex_test() { if ! [[ $1 =~ ^[0-9A-Fa-f]{2}$ ]] ; then @@ -34,405 +44,517 @@ byte_hex_test() 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() +bmc_read_low_speed_signal_status() { - 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 + val=$(ipmitool raw 0x30 0x8d 2>/dev/null); + if [ $? -ne 0 ];then return 0 fi -} -bmc_qsfp_lpmode_write() -{ + port_1_8_presence=$(echo $val | awk '{printf $1}') + byte_hex_test $port_1_8_presence + if [ $? -eq 0 ]; then + return 0 + fi + port_1_8_presence=$( printf "%d" 0x$port_1_8_presence ) - 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 + port_9_16_presence=$(echo $val | awk '{printf $2}') + byte_hex_test $port_9_16_presence + if [ $? -eq 0 ]; then + return 0 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 + port_9_16_presence=$( printf "%d" 0x$port_9_16_presence ) - 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 + port_17_24_presence=$(echo $val | awk '{printf $9}') + byte_hex_test $port_17_24_presence + if [ $? -eq 0 ]; then + return 0 fi + port_17_24_presence=$( printf "%d" 0x$port_17_24_presence ) - 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 + port_25_32_presence=$(echo $val | awk '{printf $10}') + byte_hex_test $port_25_32_presence + if [ $? -eq 0 ]; then + return 0 + fi + port_25_32_presence=$( printf "%d" 0x$port_25_32_presence ) - 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 + port_1_8_reset=$(echo $val | awk '{printf $3}') + byte_hex_test $port_1_8_reset + if [ $? -eq 0 ]; then + return 0 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 + port_1_8_reset=$( printf "%d" 0x$port_1_8_reset ) - 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 + port_9_16_reset=$(echo $val | awk '{printf $4}') + byte_hex_test $port_9_16_reset + if [ $? -eq 0 ]; then + return 0 fi + port_9_16_reset=$( printf "%d" 0x$port_9_16_reset ) + port_17_24_reset=$(echo $val | awk '{printf $11}') + byte_hex_test $port_17_24_reset + if [ $? -eq 0 ]; then + return 0 + fi + port_17_24_reset=$( printf "%d" 0x$port_17_24_reset ) - return 0 -} + port_25_32_reset=$(echo $val | awk '{printf $12}') + byte_hex_test $port_25_32_reset + if [ $? -eq 0 ]; then + return 0 + fi + port_25_32_reset=$( printf "%d" 0x$port_25_32_reset ) -bmc_qsfp_modsel_write() -{ + port_1_8_lpmode=$(echo $val | awk '{printf $5}') + byte_hex_test $port_1_8_lpmode + if [ $? -eq 0 ]; then + return 0 + fi + port_1_8_lpmode=$( printf "%d" 0x$port_1_8_lpmode ) - 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 + port_9_16_lpmode=$(echo $val | awk '{printf $6}') + byte_hex_test $port_9_16_lpmode + if [ $? -eq 0 ]; then + return 0 + fi + port_9_16_lpmode=$( printf "%d" 0x$port_9_16_lpmode ) - 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 + port_17_24_lpmode=$(echo $val | awk '{printf $13}') + byte_hex_test $port_17_24_lpmode + if [ $? -eq 0 ]; then + return 0 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 + port_17_24_lpmode=$( printf "%d" 0x$port_17_24_lpmode ) - 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 + port_25_32_lpmode=$(echo $val | awk '{printf $14}') + byte_hex_test $port_25_32_lpmode + if [ $? -eq 0 ]; then + return 0 fi + port_25_32_lpmode=$( printf "%d" 0x$port_25_32_lpmode ) - 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 + port_1_8_modsel=$(echo $val | awk '{printf $7}') + byte_hex_test $port_1_8_modsel + if [ $? -eq 0 ]; then + return 0 + fi + port_1_8_modsel=$( printf "%d" 0x$port_1_8_modsel ) - 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 + port_9_16_modsel=$(echo $val | awk '{printf $8}') + byte_hex_test $port_9_16_modsel + if [ $? -eq 0 ]; then + return 0 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 + port_9_16_modsel=$( printf "%d" 0x$port_9_16_modsel ) - 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 + port_17_24_modsel=$(echo $val | awk '{printf $15}') + byte_hex_test $port_17_24_modsel + if [ $? -eq 0 ]; then + return 0 fi + port_17_24_modsel=$( printf "%d" 0x$port_17_24_modsel ) + port_25_32_modsel=$(echo $val | awk '{printf $16}') + byte_hex_test $port_25_32_modsel + if [ $? -eq 0 ]; then + return 0 + fi + port_25_32_modsel=$( printf "%d" 0x$port_25_32_modsel ) - return 0 + return 1 } -bmc_qsfp_presence_read() +bmc_qsfp_lpmode_write() { - 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 + + if [ $board_ver == 1 ]; then + 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 - port_1_8_presence=$( printf "%d" 0x$tmp1 ) - byte_hex_test $tmp2 - if [ $? -eq 0 ]; then - return 0 + 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 - port_9_16_presence=$( printf "%d" 0x$tmp2 ) - byte_hex_test $tmp3 - if [ $? -eq 0 ]; then - return 0 + + 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 - port_17_24_presence=$( printf "%d" 0x$tmp3 ) - byte_hex_test $tmp4 - if [ $? -eq 0 ]; then - return 0 + 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 - port_25_32_presence=$( printf "%d" 0x$tmp4 ) - return 1 + + else + 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 + val2=0 + for i in $(seq 9 16); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val2=$((val2 | (lpmode_input << ($i - 9)))) + done + + if [ $val -ne $port_1_8_lpmode ] || [ $val2 -ne $port_9_16_lpmode ]; then + ipmitool raw 0x30 0x8c 0x0 0x1 $val $val2 1>>/dev/null 2>>/dev/null + 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 + + val2=0 + for i in $(seq 25 32); + do + lpmode_path=$cpld_path"port"$i"_lpmode" + lpmode_input=$(cat $lpmode_path | awk '{printf $1}') + val2=$((val2 | (lpmode_input << ($i - 25)))) + done + + if [ $val -ne $port_17_24_lpmode ] || [ $val2 -ne $port_25_32_lpmode ]; then + ipmitool raw 0x30 0x8c 0x1 0x1 $val $val2 1>>/dev/null 2>>/dev/null + fi + fi return 0 } -bmc_qsfp_reset_write() +bmc_qsfp_modsel_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 + if [ $board_ver == 1 ]; then + 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_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_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_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 + 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 - reset_path=$cpld_path"port"$i"_reset" - reset_input=$(cat $reset_path | awk '{printf $1}') - val=$((val | (reset_input << ($i - 17)))) - done + 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_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_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_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 + 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 + else + 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)) + + val2=0 + for i in $(seq 9 16); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val2=$((val2 | (modsel_input << ($i - 9)))) + done + + val2=$((0xff - val2)) + if [ $val -ne $port_1_8_modsel ] || [ $val2 -ne $port_9_16_modsel ]; then + ipmitool raw 0x30 0x8c 0x0 0x2 $val $val2 1>>/dev/null 2>>/dev/null + 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)) + + val2=0 + for i in $(seq 25 32); + do + modsel_path=$cpld_path"port"$i"_modsel" + modsel_input=$(cat $modsel_path | awk '{printf $1}') + val2=$((val2 | (modsel_input << ($i - 25)))) + done + + val2=$((0xff - val2)) + if [ $val -ne $port_17_24_modsel ] || [ $val2 -ne $port_25_32_modsel ]; then + ipmitool raw 0x30 0x8c 0x1 0x2 $val $val2 1>>/dev/null 2>>/dev/null + fi + fi return 0 } -#$1=port_no -bmc_qsfp_eeprom_read() +bmc_qsfp_presence_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 + if [ $board_ver == 1 ]; then + 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 - bmc_read $i2cmux_dev $ch 0x50 128 128 - if [ $? -eq 1 ];then - eeprom_part2=$result + return 0 else - return 1 + bmc_read_low_speed_signal_status + if [ $? -eq 0 ]; then + return 0 + fi 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 +bmc_qsfp_reset_write() +{ - #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 + if [ $board_ver == 1 ]; then + 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 - 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 + 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 - #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 + 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 - 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 + + 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 - else - lpmod="" - 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 - 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 + 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 else - printf "\nPort %d EEPROM:" $1 - printf "-----------------------------------------------\n" - for i in $(seq 1 256); + cpld_path="/sys/bus/i2c/devices/0-0006/" + val=0 + for i in $(seq 1 8); do - printf "%s " ${eeprom1_full:0:2} - eeprom1_full=$(echo $eeprom1_full | sed 's/^..//') + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val=$((val | (reset_input << ($i - 1)))) + done - val=`expr $i % 16` - if [ $val -eq 0 ];then - printf "\n" - fi + val=$((0xff - val)) + val2=0 + for i in $(seq 9 16); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val2=$((val2 | (reset_input << ($i - 9)))) done - printf "\n-----------------------------------------------\n" + + val2=$((0xff - val2)) + if [ $val -ne $port_1_8_reset ] || [ $val2 -ne $port_9_16_reset ]; then + ipmitool raw 0x30 0x8c 0x0 0x0 $val $val2 1>>/dev/null 2>>/dev/null + 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)) + val2=0 + for i in $(seq 25 32); + do + reset_path=$cpld_path"port"$i"_reset" + reset_input=$(cat $reset_path | awk '{printf $1}') + val2=$((val2 | (reset_input << ($i - 25)))) + done + + val2=$((0xff - val2)) + if [ $val -ne $port_17_24_reset ] || [ $val2 -ne $port_25_32_reset ]; then + ipmitool raw 0x30 0x8c 0x1 0x0 $val $val2 1>>/dev/null 2>>/dev/null + fi 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 @@ -463,16 +585,24 @@ QSFP_monitor() if [ $is_presence -eq 0 ];then echo 1 > $cpld_path"port"$i"_present" - bmc_qsfp_eeprom_read $i + if [ $board_ver == 0 ]; then + if [ -e /tmp/eeprom_init_done ] && [ ${port_pre_present[$((i - 1))]} -eq 0 ]; then + touch /tmp/plugin_module_event + fi + + port_pre_present[$((i - 1))]=1 + fi else echo 0 > $cpld_path"port"$i"_present" - bmc_qsfp_eeprom_clear $i + echo 0 > $cpld_path"port"$i"_data_rdy" + if [ $board_ver == 0 ]; then + port_pre_present[$((i - 1))]=0 + fi fi done - sleep 2 - else - sleep 1 fi + + sleep 0.2 done } diff --git a/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-send-temp-to-bmc b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-send-temp-to-bmc new file mode 100755 index 000000000000..4f2c1be21ab1 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/6512-32r/utils/sonic-send-temp-to-bmc @@ -0,0 +1,51 @@ +#!/bin/bash +board_ver=$(ipmitool raw 0x30 0x25 0x1 0xe0 0x1 0x0 1>/dev/null 2>/dev/null; echo $?) #error will get 1 means EVT, otherwise DVT + +send_temp_to_bmc() +{ + c_path=$(ls /sys/devices/platform/coretemp.0/hwmon/) + c_temp=$(cat /sys/class/hwmon/$c_path/temp1_input) + cputemp=`expr $c_temp / 1000` + + transceiver_temp="" + for i in $(seq 1 32); + do + index=$((i + 15)); + path="/sys/bus/i2c/devices/0-00$(printf "%x" $index)/temp"; + t_temp=$(cat $path) + transceiver_temp+="$transcevicer_temp $t_temp" + done + + m2_temp=$(smartctl -A /dev/sda | egrep ^194 | awk '{print $10}') + + d_dev=$(find /sys/devices/ -name 1-00\*) + d_path=$(ls $d_dev/hwmon/) + d_temp=$(cat /sys/class/hwmon/$d_path/temp1_input) + dimm_temp=`expr $d_temp / 1000` + + ipmitool raw 0x30 0x8b $cputemp $transceiver_temp $m2_temp $dimm_temp +} + +SEND_TEMP() +{ + boot_time_barrier=1 + 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 + + if [ $board_ver == 0 ]; then + if [ $boot_time_barrier == 1 ]; then + if [ -e /tmp/eeprom_init_done ]; then + boot_time_barrier=0 + fi + else + send_temp_to_bmc + fi + fi + + sleep 1; + fi + done +} + +SEND_TEMP 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 old mode 100644 new mode 100755 index 030942825df0..31cf25f4cbe9 --- 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 @@ -68,8 +68,6 @@ # 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 @@ -173,6 +171,7 @@ def driver_inserted(): 'modprobe ipmi_watchdog', 'modprobe i2c_dev', 'modprobe at24', +'modprobe i2c-imc', 'modprobe wistron_6512_32r_syseeprom', 'modprobe wistron_6512_32r_cpld', 'modprobe wistron_6512_32r_fan', @@ -242,6 +241,20 @@ def device_install(): if FORCE == 0: return status + + status, output = log_os_system("i2cget -y 0 0x55 0x0 1>/dev/null 2>/dev/null; echo $?", 1) + if status: + print(output) + if FORCE == 0: + return status + else: + if output == '0': + log_os_system("echo 24c02 0x55 > /sys/bus/i2c/devices/i2c-0/new_device", 1) + else: + log_os_system("echo wistron_syseeprom 0x55 > /sys/bus/i2c/devices/i2c-0/new_device", 1) + + + 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: @@ -324,12 +337,6 @@ def do_install(): 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(): diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/changelog b/platform/innovium/sonic-platform-modules-wistron/debian/changelog new file mode 100644 index 000000000000..12d04e4d0303 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/changelog @@ -0,0 +1,5 @@ +sonic-wistron-platform-modules (1.1) unstable; urgency=low + + * Initial release + + -- Haowei Chung Fri, 30 Aug 2019 14:48:00 +0800 diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/compat b/platform/innovium/sonic-platform-modules-wistron/debian/compat new file mode 100644 index 000000000000..b4de39476753 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/compat @@ -0,0 +1 @@ +11 diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/control b/platform/innovium/sonic-platform-modules-wistron/debian/control new file mode 100644 index 000000000000..00ad6637c378 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/control @@ -0,0 +1,14 @@ +Source: sonic-wistron-platform-modules +Section: main +Priority: extra +Maintainer: Wistron +Build-Depends: debhelper (>= 8.0.0), bzip2 +Standards-Version: 3.9.3 + +Package: sonic-platform-wistron-sw-to3200k +Architecture: amd64 +Description: kernel modules for platform devices such as fan, led, sfp + +Package: sonic-platform-wistron-6512-32r +Architecture: amd64 +Description: kernel modules for platform devices such as fan, led, sfp diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/rules b/platform/innovium/sonic-platform-modules-wistron/debian/rules new file mode 100755 index 000000000000..defb1f932d16 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/rules @@ -0,0 +1,143 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +include /usr/share/dpkg/pkg-info.mk + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +export INSTALL_MOD_DIR:=extra + +PYTHON ?= python2 +PYTHON3 ?= python3 + +PACKAGE_PRE_NAME := sonic-platform-wistron +KVERSION ?= $(shell uname -r) +KERNEL_SRC := /lib/modules/$(KVERSION) +MOD_SRC_DIR:= $(shell pwd) +MODULE_DIRS := sw-to3200k 6512-32r +MODULE_DIR := modules +UTILS_DIR := utils +SERVICE_DIR := service +CONF_DIR := conf + +%: + dh $@ --with systemd,python2,python3 --buildsystem=pybuild + +clean: + dh_testdir + dh_testroot + dh_clean + +build: + #make modules -C $(KERNEL_SRC)/build M=$(MODULE_SRC) + (for mod in $(MODULE_DIRS); do \ + make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ + #$(PYTHON) $${mod}/setup.py build; \ + cd $(MOD_SRC_DIR)/$${mod}; \ + if [ -f setup.py ]; then \ + $(PYTHON3) setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \ + echo "Finished making whl package for $$mod"; \ + fi; \ + cd $(MOD_SRC_DIR); \ + done) + +binary: binary-arch binary-indep + # Nothing to do + +binary-arch: + # Nothing to do + +#install: build + #dh_testdir + #dh_testroot + #dh_clean -k + #dh_installdirs + +binary-indep: + dh_testdir + dh_installdirs + + # Custom package commands + (for mod in $(MODULE_DIRS); do \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} usr/local/bin; \ + dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \ + cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_DIR)/*.ko debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ + #cp $(MOD_SRC_DIR)/$${mod}/$(UTILS_DIR)/* debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin/; \ + cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_DIR)/*.service debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system/; \ + #$(PYTHON) $${mod}/setup.py install --root=$(MOD_SRC_DIR)/debian/$(PACKAGE_PRE_NAME)-$${mod} --install-layout=deb; \ + done) + # Resuming debhelper scripts + dh_testroot + dh_install + dh_installchangelogs + dh_installdocs + dh_installsystemd + dh_installinit + dh_link + dh_fixperms + dh_compress + dh_strip + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb +.PHONY: build binary binary-arch binary-indep clean + +##!/usr/bin/make -f +# +#export INSTALL_MOD_DIR:=extra +# +#PYTHON ?= python2 +#PYTHON3 ?= python3 +# +#KVERSION ?= $(shell uname -r) +#KERNEL_SRC := /lib/modules/$(KVERSION) +#MOD_SRC_DIR:= $(shell pwd) +# +#PACKAGE_PRE_NAME := sonic-platform-wistron +#MODULE_DIRS := 3306-32 +#MODULE_SRC := modules +##UTILITY_SRC := utils +#SERVICE_SRC := service +#COMMON_SRC := common +#%: +# dh $@ +# +# +#override_dh_auto_build: +# (for mod in $(MODULE_DIRS); do \ +# make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \ +# cd $(MOD_SRC_DIR)/$${mod}; \ +# python2.7 setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}/modules; \ +# cd $(MOD_SRC_DIR); \ +# done) +# +#override_dh_auto_install: +# (for mod in $(MODULE_DIRS); do \ +# dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} \ +# $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ +# cp $(MOD_SRC_DIR)/$${mod}/$(MODULE_SRC)/*.ko \ +# debian/$(PACKAGE_PRE_NAME)-$${mod}/$(KERNEL_SRC)/$(INSTALL_MOD_DIR); \ +# dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} usr/local/bin; \ +## cp $(MOD_SRC_DIR)/$${mod}/$(UTILITY_SRC)/* \ +## debian/$(PACKAGE_PRE_NAME)-$${mod}/usr/local/bin; \ +# dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} lib/systemd/system; \ +# cp $(MOD_SRC_DIR)/$${mod}/$(SERVICE_SRC)/*.service \ +# debian/$(PACKAGE_PRE_NAME)-$${mod}/lib/systemd/system; \ +# done) +# +#override_dh_usrlocal: +# +#override_dh_clean: +# dh_clean +# $(RM) -r $(COMMON_SRC)/*.o $(COMMON_SRC)/.*.cmd +# (for mod in $(MODULE_DIRS); do \ +# make -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules clean; \ +# done) diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.install b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.install new file mode 100644 index 000000000000..955583027537 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.install @@ -0,0 +1,3 @@ +6512-32r/utils/* usr/local/bin +6512-32r/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-wistron_6512_32r-r0 +6512-32r/service/*.service lib/systemd/system diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.postinst b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.postinst new file mode 100644 index 000000000000..b1cef228e7ee --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-6512-32r.postinst @@ -0,0 +1,41 @@ +#!/bin/bash + +kernel_version=$(uname -r) + +for i in $(seq 1 10); +do + if [ -e /lib/modules/${kernel_version}/modules.dep ];then + wisko=$(cat /lib/modules/${kernel_version}/modules.dep | grep wistron) + ipdko=$(cat /lib/modules/${kernel_version}/modules.dep | grep ipd) + if [ "$wisko" == "" ] || [ "$ipdko" == "" ];then + depmod -a + else + if [ ! -e /lib/modules/${kernel_version}/modules.dep.bin ];then + depmod -a + else + break + fi + fi + + echo "depmod -a" + sleep 1 + else + sleep 1 + fi +done + +#Install sonic-platform package +DEVICE="/usr/share/sonic/device" +PLATFORM=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) +if [ -e $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl ]; then + pip3 install $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl +fi + +systemctl enable platform-modules-6512-32r.service +systemctl start platform-modules-6512-32r.service +systemctl enable 6512-32r-platform.service +systemctl start 6512-32r-platform.service +systemctl enable 6512-32r-syseeprom.service +systemctl start 6512-32r-syseeprom.service +systemctl enable 6512-32r-firmware_ver.service +systemctl start 6512-32r-firmware_ver.service diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.install b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.install new file mode 100644 index 000000000000..2323a24d6bcc --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.install @@ -0,0 +1,4 @@ +sw-to3200k/utils/* usr/local/bin +sw-to3200k/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/x86_64-wistron_sw_to3200k-r0 +sw-to3200k/cfg/sw-to3200k-modules.conf etc/modules-load.d +sw-to3200k/service/*.service lib/systemd/system diff --git a/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.postinst b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.postinst new file mode 100644 index 000000000000..9a1d167da53d --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/debian/sonic-platform-wistron-sw-to3200k.postinst @@ -0,0 +1,43 @@ +#!/bin/bash + +kernel_version=$(uname -r) + +for i in $(seq 1 10); +do + if [ -e /lib/modules/${kernel_version}/modules.dep ];then + wisko=$(cat /lib/modules/${kernel_version}/modules.dep | grep wistron) + ipdko=$(cat /lib/modules/${kernel_version}/modules.dep | grep ipd) + if [ "$wisko" == "" ] || [ "$ipdko" == "" ];then + depmod -a + else + if [ ! -e /lib/modules/${kernel_version}/modules.dep.bin ];then + depmod -a + else + break + fi + fi + + echo "depmod -a" + sleep 1 + else + sleep 1 + fi +done + +#Install sonic-platform package +DEVICE="/usr/share/sonic/device" +PLATFORM=$(/usr/local/bin/sonic-cfggen -H -v DEVICE_METADATA.localhost.platform) +if [ -e $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl ]; then + pip3 install $DEVICE/$PLATFORM/sonic_platform-1.0-py3-none-any.whl +fi + +systemctl enable platform-modules-sw-to3200k.service +systemctl start platform-modules-sw-to3200k.service +systemctl enable sw-to3200k-firmware_ver.service +systemctl start sw-to3200k-firmware_ver.service +systemctl enable to3200k-platform.service +systemctl start to3200k-platform.service +systemctl enable to3200k-led.service +systemctl start to3200k-led.service +systemctl enable to3200k-pld.service +systemctl start to3200k-pld.service 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 index 746e581486cb..5024ecdd70e6 100644 --- 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 @@ -342,25 +342,25 @@ static ssize_t set_value } case PSU_MFR_ID: { - memset(&data->mfr_id, 0x0, sizeof(data->mfr_id)); + memzero_explicit(&data->mfr_id, 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)); + memzero_explicit(&data->mfr_model, 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)); + memzero_explicit(&data->mfr_revsion, 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)); + memzero_explicit(&data->mfr_serial, sizeof(data->mfr_serial)); strncpy(data->mfr_serial, buf, sizeof(data->mfr_serial)-1); break; } @@ -403,7 +403,7 @@ static int wistron_i2c_psu_probe(struct i2c_client *client, const struct i2c_dev goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); + data->hwmon_dev = hwmon_device_register_with_info(&client->dev, "wistron_i2c_psu", NULL, NULL, NULL); if (IS_ERR(data->hwmon_dev)) { status = PTR_ERR(data->hwmon_dev); 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 index 82dfa71b7805..0f7e856e8330 100644 --- 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 @@ -16,6 +16,8 @@ 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); +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); enum fan_id { FAN1_ID, @@ -49,7 +51,7 @@ enum sysfs_fan_attributes { FAN4_DIRECTION, FAN5_DIRECTION, FAN6_DIRECTION, - FAN7_DIRECTION, + FAN7_DIRECTION, FAN1_FRONT_SPEED_RPM, FAN2_FRONT_SPEED_RPM, FAN3_FRONT_SPEED_RPM, @@ -64,6 +66,7 @@ enum sysfs_fan_attributes { FAN5_REAR_SPEED_RPM, FAN6_REAR_SPEED_RPM, FAN7_REAR_SPEED_RPM, + CPLD_VERSION, FAN_ATTR_MAX }; @@ -71,9 +74,13 @@ enum sysfs_fan_attributes { struct sw_to3200k_fan_data { struct device *hwmon_dev; struct mutex update_lock; + int version; int fan_val[FAN_ATTR_MAX]; }; +/* version */ +static SENSOR_DEVICE_ATTR(version, S_IWUSR | S_IRUGO, get_version, set_version, CPLD_VERSION); + /* 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) @@ -171,9 +178,40 @@ static struct attribute *sw_to3200k_fan_attributes[] = { DECLARE_FAN_DIRECTION_ATTR(6), DECLARE_FAN_DIRECTION_ATTR(7), DECLARE_FAN_DUTY_CYCLE_ATTR(), + &sensor_dev_attr_version.dev_attr.attr, NULL }; +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_fan_data *data = i2c_get_clientdata(client); + int version; + + mutex_lock(&data->update_lock); + version = data->version; + mutex_unlock(&data->update_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_fan_data *data = i2c_get_clientdata(client); + int error, version; + + error = kstrtoint(buf, 10, &version); + if (error) + { + return error; + } + + mutex_lock(&data->update_lock); + data->version = version; + mutex_unlock(&data->update_lock); + return count; +} + 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); @@ -245,7 +283,7 @@ static int sw_to3200k_fan_probe goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); + 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); 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 index 6e1df229c9fd..3e26edff07cc 100644 --- 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 @@ -242,27 +242,27 @@ static ssize_t set_oom_info(struct device *dev, struct device_attribute *da, con { case OOM_EEPROM_LOW: { - memset(&data->eeproml, 0x0, sizeof(data->eeproml)); + memzero_explicit(&data->eeproml, sizeof(data->eeproml)); break; } case OOM_EEPROM_PG0: { - memset(&data->eeprom0, 0x0, sizeof(data->eeprom0)); + memzero_explicit(&data->eeprom0, sizeof(data->eeprom0)); break; } case OOM_EEPROM_PG2: { - memset(&data->eeprom2, 0x0, sizeof(data->eeprom2)); + memzero_explicit(&data->eeprom2, sizeof(data->eeprom2)); break; } case OOM_EEPROM_PG3: { - memset(&data->eeprom3, 0x0, sizeof(data->eeprom3)); + memzero_explicit(&data->eeprom3, sizeof(data->eeprom3)); break; } case OOM_EEPROM_PG11: { - memset(&data->eeprom11, 0x0, sizeof(data->eeprom11)); + memzero_explicit(&data->eeprom11, sizeof(data->eeprom11)); break; } default: @@ -332,7 +332,7 @@ static int sw_to3200k_oom_probe(struct i2c_client *client, const struct i2c_devi goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); + 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); 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 index 849ec1315407..418e22240ace 100644 --- 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 @@ -140,7 +140,7 @@ static ssize_t set_string(struct device *dev, struct device_attribute *da, const struct sw_to3200k_psu_data *data = i2c_get_clientdata(client); char tmp_str[32]; - memset(&tmp_str, 0x0, sizeof(tmp_str)); + memzero_explicit(&tmp_str, sizeof(tmp_str)); if (attr->index == PSU_MODEL_NAME) { if (sscanf(buf, "%16s", tmp_str) != 1) @@ -205,7 +205,7 @@ static int sw_to3200k_psu_probe(struct i2c_client *client, goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); + 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); 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 index e96e9d723f46..a86d53a94fb3 100644 --- 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 @@ -140,7 +140,7 @@ static int sw_to3200k_thermal_probe(struct i2c_client *client, const struct i2c_ goto exit_free; } - data->hwmon_dev = hwmon_device_register(&client->dev); + 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); diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/sw-to3200k-firmware_ver.service b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/sw-to3200k-firmware_ver.service new file mode 100644 index 000000000000..c609042622c0 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/service/sw-to3200k-firmware_ver.service @@ -0,0 +1,12 @@ +[Unit] +Description=Wistron SW3200K Platform firmware version service +After=platform-modules-sw-to3200k.service +DefaultDependencies=no + +[Service] +Type=oneshot +ExecStart=/usr/local/bin/platform_firmware_version +RemainAfterExit=yes + +[Install] +WantedBy=multi-user.target 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 index 0c73278ba9f5..afc599aeca4e 100644 --- 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 @@ -1,2 +1,2 @@ -__all__ = ["platform", "chassis", "sfp", "eeprom", "psu", "thermal", "fan", "watchdog"] +__all__ = ["platform", "chassis", "sfp", "eeprom", "psu", "thermal", "fan", "watchdog", 'component'] 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 index 4effac20b6a4..655949d8fc56 100644 --- 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 @@ -8,7 +8,6 @@ ############################################################################# try: import sys - import os import time import subprocess from sonic_platform_base.chassis_base import ChassisBase @@ -16,16 +15,19 @@ raise ImportError(str(e) + "- required module not found") NUM_FAN = 14 +NUM_FANTRAY = 7 NUM_PSU = 2 NUM_THERMAL = 7 NUM_SFP = 32 +NUM_COMPONENT = 6 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" +HOST_CHK_CMD = ["docker"] +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""" @@ -45,6 +47,7 @@ def __init__(self): self.__initialize_thermals() self.__initialize_sfp() self.__initialize_eeprom() + self.__initialize_components() def __initialize_sfp(self): from sonic_platform.sfp import Sfp @@ -52,12 +55,12 @@ def __initialize_sfp(self): 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) + from sonic_platform.fan_drawer import FanDrawer + for fan_index in range(0, NUM_FANTRAY): + fandrawer = FanDrawer(fan_index) + self._fan_drawer_list.append(fandrawer) + self._fan_list.extend(fandrawer._fan_list) def __initialize_psu(self): from sonic_platform.psu import Psu @@ -75,8 +78,14 @@ def __initialize_eeprom(self): from sonic_platform.eeprom import Tlv self._eeprom = Tlv() + def __initialize_components(self): + from sonic_platform.component import Component + for index in range(0, NUM_COMPONENT): + component = Component(index) + self._component_list.append(component) + def __is_host(self): - return os.system(HOST_CHK_CMD) == 0 + return subprocess.call(HOST_CHK_CMD) == 0 def __read_txt_file(self, file_path): try: @@ -88,12 +97,12 @@ def __read_txt_file(self, file_path): return None def _get_sku_name(self): - p = subprocess.Popen(GET_HWSKU_CMD, shell=True, stdout=subprocess.PIPE) + p = subprocess.Popen(GET_HWSKU_CMD, 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) + p = subprocess.Popen(GET_PLATFORM_CMD, stdout=subprocess.PIPE) out, err = p.communicate() return out.decode().rstrip('\n') @@ -114,7 +123,7 @@ def get_base_mac(self): """ return self._eeprom.get_mac() - def get_serial_number(self): + def get_serial(self): """ Retrieves the hardware serial number for the chassis Returns: @@ -181,7 +190,7 @@ 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() + port_pres[port] = 1 if sfp.get_presence() else 0 return port_pres @@ -217,7 +226,7 @@ def get_change_event(self, timeout=0): port_dict[port] = '0' self._transceiver_presence = cur_presence - if change_event == True: + if change_event is True: break if not forever: @@ -231,3 +240,86 @@ def get_change_event(self, timeout=0): sfp.reinit() return True, ret_dict + + def initizalize_system_led(self): + self.system_led = "" + return True + + def set_status_led(self, color): + """ + Sets the state of the system LED + + Args: + color: A string representing the color with which to set the + system LED + + Returns: + bool: True if system LED state is set successfully, False if not + """ + self.system_led = color + return True + + def get_status_led(self): + """ + Gets the state of the system LED + + Returns: + A string, one of the valid LED color strings which could be vendor + specified. + """ + return self.system_led + + + def get_presence(self): + """ + Retrieves the presence of the Chassis + Returns: + bool: True if Chassis is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._eeprom.get_model() + + 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 True + + 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): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_revision(self): + """ + Retrieves the hardware revision of the device + + Returns: + string: Revision value of device + """ + + return '0' + + def get_thermal_manager(self): + raise NotImplementedError diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/component.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/component.py new file mode 100644 index 000000000000..8b855e0a5f86 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/component.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python + +import subprocess +from shlex import split +from collections import namedtuple +from functools import reduce + + +try: + from sonic_platform_base.component_base import ComponentBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +CPLD_ADDR_MAPPING = { + "CPLD1": "0-0061", + "CPLD2": "0-0062", + "MB_FPGA": "0-0060", + "FAN_CPLD" : "0-0066" +} + +proc_output = namedtuple('proc_output', 'stdout stderr') +SYSFS_PATH = "/sys/bus/i2c/devices/" +#GET_BMC_VER_CMD= "ipmitool mc info | grep 'Firmware Revision' | awk '{printf $4}'" +BIOS_VERSION_PATH = "/sys/class/dmi/id/bios_version" +COMPONENT_LIST= [ + ("BIOS", "Basic Input/Output System"), + ("CPLD1", "CPLD 1"), + ("CPLD2", "CPLD 2"), + ("MB_FPGA", "MB FPGA"), + ("FAN_CPLD", "FAN CPLD"), + ("BMC", "baseboard management controller") +] + +class Component(ComponentBase): + """Platform-specific Component class""" + + DEVICE_TYPE = "component" + + def __init__(self, component_index=0): + ComponentBase.__init__(self) + self.index = component_index + self.name = self.get_name() + + def pipeline(self, starter_command, *commands): + if not commands: + try: + starter_command, *commands = starter_command.split('|') + except AttributeError: + pass + starter_command = self._parse(starter_command) + starter = subprocess.Popen(starter_command, stdout=subprocess.PIPE) + last_proc = reduce(self._create_pipe, map(self._parse, commands), starter) + return proc_output(*last_proc.communicate()) + + def _create_pipe(self, previous, command): + proc = subprocess.Popen(command, stdin=previous.stdout, stdout=subprocess.PIPE) + previous.stdout.close() + return proc + + def _parse(self, cmd): + try: + return split(cmd) + except Exception: + return cmd + + 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_bios_version(self): + # Retrieves the BIOS firmware version + try: + with open(BIOS_VERSION_PATH, 'r') as fd: + bios_version = fd.read() + return bios_version.strip() + except Exception as e: + return None + + def __get_bmc_version(self): + try: + #GET_BMC_VER_CMD + out, err = self.pipeline("ipmitool mc info", "grep 'Firmware Revision'", "awk '{printf $4}'") + return out.decode().rstrip('\n') + except Exception as e: + print('Get exception when read bmc') + return 'None' + + def __get_cpld_version(self): + # Retrieves the CPLD firmware version + cpld_version = dict() + for cpld_name in CPLD_ADDR_MAPPING: + try: + cpld_path = "{}{}{}".format(SYSFS_PATH, CPLD_ADDR_MAPPING[cpld_name], '/version') + cpld_version_raw= int(self.__read_txt_file(cpld_path), 10) + cpld_version[cpld_name] = "{}".format(hex(cpld_version_raw)) + except Exception as e: + print('Get exception when read cpld') + cpld_version[cpld_name] = 'None' + + return cpld_version + + def get_name(self): + """ + Retrieves the name of the component + Returns: + A string containing the name of the component + """ + return COMPONENT_LIST[self.index][0] + + def get_description(self): + """ + Retrieves the description of the component + Returns: + A string containing the description of the component + """ + return COMPONENT_LIST[self.index][1] + + def get_firmware_version(self): + """ + Retrieves the firmware version of module + Returns: + string: The firmware versions of the module + """ + fw_version = None + + if self.name == "BIOS": + fw_version = self.__get_bios_version() + elif "BMC" in self.name: + fw_version = self.__get_bmc_version() + elif "CPLD" in self.name: + cpld_version = self.__get_cpld_version() + fw_version = cpld_version.get(self.name) + elif "FPGA" in self.name: + fpga_version = self.__get_cpld_version() + fw_version = fpga_version.get(self.name) + + return fw_version + + def install_firmware(self, image_path): + """ + Install firmware to module + Args: + image_path: A string, path to firmware image + Returns: + A boolean, True if install successfully, False if not + """ + raise NotImplementedError + + def get_presence(self): + """ + Retrieves the presence of the FAN + Returns: + bool: True if FAN is present, False if not + """ + return True + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return 'N/A' + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return 'N/A' + + 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 True + + 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): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return False + + def get_available_firmware_version(self, image_path): + """ + Retrieves the available firmware version of the component + Note: the firmware version will be read from image + Args: + image_path: A string, path to firmware image + Returns: + A string containing the available firmware version of the component + """ + return "N/A" + + def get_firmware_update_notification(self, image_path): + """ + Retrieves a notification on what should be done in order to complete + the component firmware update + Args: + image_path: A string, path to firmware image + Returns: + A string containing the component firmware update notification if required. + By default 'None' value will be used, which indicates that no actions are required + """ + return "None" + + def update_firmware(self, image_path): + """ + Updates firmware of the component + This API performs firmware update: it assumes firmware installation and loading in a single call. + In case platform component requires some extra steps (apart from calling Low Level Utility) + to load the installed firmware (e.g, reboot, power cycle, etc.) - this will be done automatically by API + Args: + image_path: A string, path to firmware image + Raises: + RuntimeError: update failed + """ + return False 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 index 448e083712ce..e495b297576a 100644 --- 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 @@ -41,12 +41,19 @@ def __parse_output(self, decode_output): for line in lines: try: match = re.search( - '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+)', line) - if match is not None: + '(0x[0-9a-fA-F]{2})([\s]+[\S]+[\s]+)([\S]+[\s]+[\S]+)', line) + if match is not None and match.group(1) == '0x25': idx = match.group(1) value = match.group(3).rstrip('\0') + _eeprom_info_dict[idx] = value + else: + 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 - _eeprom_info_dict[idx] = value except BaseException: pass return _eeprom_info_dict @@ -108,3 +115,7 @@ def get_serial(self): def get_mac(self): return self._eeprom.get('0x24', "Undefined.") + + def get_model(self): + return self._eeprom.get('0x21', "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 index f5b7f9e80ed6..9849cd472893 100644 --- 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 @@ -14,23 +14,66 @@ except ImportError as e: raise ImportError(str(e) + "- required module not found") +SPEED_TOLERANCE = 15 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",] +SYSFS_PATH = "/sys/bus/i2c/devices/{0}-00{1}" +PSU_STS_I2C_MAPPING = { + 0: { + "num": 0, + "addr": "51" + }, + 1: { + "num": 0, + "addr": "52" + }, +} + +PSU_HWMON_I2C_MAPPING = { + 0: { + "num": 0, + "addr": "59" + }, + 1: { + "num": 0, + "addr": "5a" + }, +} + +FAN_NAME_LIST = ["FAN-1F", "FAN-1R", "FAN-2F", "FAN-2R", + "FAN-3F", "FAN-3R", "FAN-4F", "FAN-4R", + "FAN-5F", "FAN-5R", "FAN-6F", "FAN-6R", + "FAN-7F", "FAN-7R"] 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" + def __init__(self, fan_tray_index, fan_index=0, is_psu_fan=False, psu_index=0): + self.fan_index = fan_index + self.fan_tray_index = fan_tray_index + self.is_psu_fan = is_psu_fan + + if self.is_psu_fan: + self.psu_index = psu_index + self.psu_status_i2c_num = PSU_STS_I2C_MAPPING[self.psu_index]['num'] + self.psu_status_i2c_addr = PSU_STS_I2C_MAPPING[self.psu_index]['addr'] + self.psu_status_path = SYSFS_PATH.format(self.psu_status_i2c_num, self.psu_status_i2c_addr) + self.psu_hwmon_i2c_num = PSU_HWMON_I2C_MAPPING[self.psu_index]['num'] + self.psu_hwmon_i2c_addr = PSU_HWMON_I2C_MAPPING[self.psu_index]['addr'] + self.psu_hwmon_path = SYSFS_PATH.format(self.psu_hwmon_i2c_num, self.psu_hwmon_i2c_addr) + + FanBase.__init__(self) + def __search_hwmon_dir_name(self, directory): + try: + dirs = os.listdir(directory) + for file in dirs: + if file.startswith("hwmon"): + return file + except IOError: + pass + return '' + def __read_txt_file(self, file_path): try: with open(file_path, 'r') as fd: @@ -38,22 +81,14 @@ def __read_txt_file(self, file_path): return data.strip() except IOError: pass - return "" + return None - def __write_txt_file(self, file_path, value): + def __write_txt_file(self, file_path, data): 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 + fd.write(data) + except IOError: + pass return None def get_direction(self): @@ -63,38 +98,46 @@ def get_direction(self): 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 + direction = 0 + if self.is_psu_fan: + path= "{}/psu_fan_dir".format(self.psu_status_path) + direction=self.__read_txt_file(path) + if direction is None: + return self.FAN_DIRECTION_EXHAUST + elif self.get_presence(): + path= "{}/fan{}_direction".format(FAN_PATH, self.fan_tray_index + 1) + direction=self.__read_txt_file(path) + if direction is None: + return self.FAN_DIRECTION_EXHAUST + + return self.FAN_DIRECTION_EXHAUST if int(direction) == 0 else self.FAN_DIRECTION_INTAKE - 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') - + to 100 (full speed) + + """ + speed = 0 + if self.is_psu_fan: + psu_fan_path= "{}/{}".format(self.psu_hwmon_path, 'fan1_input') + fan_speed_rpm = self.__read_txt_file(psu_fan_path) + if fan_speed_rpm is not None: + speed = (int(fan_speed_rpm,10))*100/33000 + if speed > 100: + speed=100 + else: + return 0 + elif self.get_presence(): + path= "{}/fan_duty_cycle_percentage".format(FAN_PATH) + speed=self.__read_txt_file(path) + if speed is None: + return 0 + return int(int(speed)*100/255) + return int(speed) def get_target_speed(self): @@ -103,22 +146,14 @@ def get_target_speed(self): 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) + Note: + speed_pc = pwm_target/255*100 + + 0 : when PWM mode is use + pwm : when pwm mode is not use + """ + return self.get_speed() def get_speed_tolerance(self): """ @@ -127,7 +162,7 @@ def get_speed_tolerance(self): An integer, the percentage of variance from target speed which is considered tolerable """ - return 10 + return SPEED_TOLERANCE def set_speed(self, speed): """ @@ -138,13 +173,8 @@ def set_speed(self, 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): @@ -156,7 +186,22 @@ def set_status_led(self, color): Returns: bool: True if status LED state is set successfully, False if not """ - return False + return False #Not supported + + def get_status_led(self): + """ + Gets the state of the fan status LED + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + status=self.get_presence() + if status is None: + return self.STATUS_LED_COLOR_OFF + + return { + 1: self.STATUS_LED_COLOR_GREEN, + 0: self.STATUS_LED_COLOR_RED + }.get(status, self.STATUS_LED_COLOR_OFF) def get_name(self): """ @@ -164,24 +209,30 @@ def get_name(self): Returns: string: The name of the device """ - fan_name = FAN_NAME_LIST[self.fan_tray_index] + + fan_name = FAN_NAME_LIST[self.fan_tray_index*2 + self.fan_index] \ + if not self.is_psu_fan \ + else "PSU-{} FAN-{}".format(self.psu_index+1, self.fan_index+1) return fan_name def get_presence(self): """ - Retrieves the presence of the PSU + Retrieves the presence of the FAN Returns: - bool: True if PSU is present, False if not + bool: True if FAN 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 + if self.is_psu_fan: + present_path="{}/psu_present".format(self.psu_status_path) + else: + present_path="{}/fan{}_presence".format(FAN_PATH, self.fan_tray_index + 1) + + val=self.__read_txt_file(present_path) + if val is not None: + return int(val, 10)==1 + else: + return False def get_status(self): """ @@ -189,4 +240,55 @@ def get_status(self): Returns: A boolean value, True if device is operating properly, False if not """ - return self.get_presence() and self.get_speed() > 0 + if self.is_psu_fan: + psu_fan_path= "{}/{}".format(self.psu_status_path, 'psu_power_good') + val=self.__read_txt_file(psu_fan_path) + if val is not None: + return int(val, 10)==1 + else: + return False + else: + status=self.get_presence() + if status is None: + return False + return status + + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + + return "N/A" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "N/A" + + 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 (self.fan_tray_index * 2 + self.fan_index + 1) \ + if not self.is_psu_fan else (self.psu_index + 1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True if not self.is_psu_fan else False + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan_drawer.py b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan_drawer.py new file mode 100644 index 000000000000..c299adec1dec --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/sonic_platform/fan_drawer.py @@ -0,0 +1,119 @@ +######################################################################## +# +# Module contains an implementation of SONiC Platform Base API and +# provides the Fan-Drawers' information available in the platform. +# +######################################################################## + +try: + from sonic_platform_base.fan_drawer_base import FanDrawerBase +except ImportError as e: + raise ImportError(str(e) + "- required module not found") + +FANS_PER_FANTRAY = 2 +MAX_FAN_WATT = 20.0 + +class FanDrawer(FanDrawerBase): + """Platform-specific Fan class""" + + def __init__(self, fantray_index): + + FanDrawerBase.__init__(self) + # FanTray is 0-based in platforms + self.fantrayindex = fantray_index + self.__initialize_fan_drawer() + + + def __initialize_fan_drawer(self): + from sonic_platform.fan import Fan + for i in range(FANS_PER_FANTRAY): + self._fan_list.append(Fan(self.fantrayindex, i)) + + def get_name(self): + """ + Retrieves the fan drawer name + Returns: + string: The name of the device + """ + return "FanTray{}".format(self.fantrayindex+1) + + def get_presence(self): + """ + Retrieves the presence of the device + Returns: + bool: True if device is present, False if not + """ + return self._fan_list[0].get_presence() + + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return self._fan_list[0].get_model() + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return self._fan_list[0].get_serial() + + 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._fan_list[0].get_status() + + def set_status_led(self, color): + """ + Sets the state of the fan drawer status LED + Args: + color: A string representing the color with which to set the + fan drawer status LED + Returns: + bool: True if status LED state is set successfully, False if not + """ + return self._fan_list[0].set_status_led(color) + def get_status_led(self): + """ + Gets the state of the fan drawer LED + + Returns: + A string, one of the predefined STATUS_LED_COLOR_* strings above + """ + return self._fan_list[0].get_status_led() + + 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 (self.fantrayindex+1) + + def is_replaceable(self): + """ + Indicate whether this device is replaceable. + Returns: + bool: True if it is replaceable. + """ + return True + + def get_maximum_consumed_power(self): + """ + Retrives the maximum power drawn by Fan Drawer + Returns: + A float, with value of the maximum consumable power of the + component. + """ + return MAX_FAN_WATT + 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 index c26b82ee4c76..78089ca3c986 100644 --- 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 @@ -22,12 +22,20 @@ class Psu(PsuBase): "/sys/bus/i2c/devices/0-005a"] def __init__(self, psu_index): + self._fan_list = [] 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) + self.__initialize_fan() + + def __initialize_fan(self): + from sonic_platform.fan import Fan + for fan_index in range(0, 1): + fan = Fan(fan_index, 0, is_psu_fan=True, psu_index=self.index) + self._fan_list.append(fan) def __read_txt_file(self, file_path): try: @@ -38,15 +46,14 @@ def __read_txt_file(self, file_path): pass return "" - def get_fan(self): + def get_fan(self, index): """ 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 + return self._fan_list[index] def get_powergood_status(self): """ @@ -84,7 +91,7 @@ def get_presence(self): bool: True if PSU is present, False if not """ attr_file ='psu_present' - attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file status = 0 try: with open(attr_path, 'r') as psu_prs: @@ -101,7 +108,7 @@ def get_status(self): 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 + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file status = 0 try: with open(attr_path, 'r') as power_status: @@ -120,13 +127,11 @@ def get_model(self): try: if self.get_presence(): attr_file = 'psu_model_name' - attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) return str(val) except Exception as e: - logger.error(str(e)) - - return None + return None def get_serial(self): """ @@ -137,13 +142,11 @@ def get_serial(self): try: if self.get_presence(): attr_file = 'psu_serial_number' - attr_path = self.SYSFS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.SYSFS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) return str(val) except Exception as e: - logger.error(str(e)) - - return None + return None def get_voltage(self): """ @@ -154,13 +157,11 @@ def get_voltage(self): try: if self.get_presence(): attr_file = 'psu_v_out' - attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.STATUS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) - return int(val) + return float(val) / 1000.0 except Exception as e: - logger.error(str(e)) - - return None + return None def get_current(self): """ @@ -171,13 +172,11 @@ def get_current(self): try: if self.get_presence(): attr_file = 'psu_i_out' - attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.STATUS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) - return int(val) + return float(val) / 1000.0 except Exception as e: - logger.error(str(e)) - - return None + return None def get_power(self): """ @@ -188,13 +187,11 @@ def get_power(self): try: if self.get_presence(): attr_file = 'psu_p_out' - attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.STATUS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) - return int(val) + return float(val) / 1000000.0 except Exception as e: - logger.error(str(e)) - - return None + return None def get_status_led(self): """ @@ -221,13 +218,11 @@ def get_temperature(self): try: if self.get_presence(): attr_file = 'psu_temp1_input' - attr_path = self.STATUS_PSU_DIR[self.index-1] +'/' + attr_file + attr_path = self.STATUS_PSU_DIR[self.index] +'/' + attr_file val = self.__read_txt_file(attr_path) - return int(val) + return float(val) / 1000.0 except Exception as e: - logger.error(str(e)) - - return None + return None def get_temperature_high_threshold(self): """ @@ -272,7 +267,42 @@ def get_position_in_parent(self): Returns: integer: The 1-based relative physical position in parent device or -1 if cannot determine the position """ - return -1 + return self.index + 1 def is_replaceable(self): return True + + def get_revision(self): + """ + Retrieves the hardware revision of the device + Returns: + string: Revision value of device + """ + try: + if self.get_presence(): + attr_file = 'psu_mfr_revision' + attr_path = self.STATUS_PSU_DIR[self.index] +'/' + attr_file + with open(attr_path, 'r') as revision: + val = revision.read() + return val.strip() + except IOError: + return None + + def get_num_fans(self): + """ + Retrieves the number of fan modules available on this PSU + + Returns: + An integer, the number of fan modules available on this PSU + """ + return len(self._fan_list) + + def get_all_fans(self): + """ + Retrieves all fan modules available on this PSU + + Returns: + A list of objects derived from FanBase representing all fan + modules available on this PSU + """ + return self._fan_list 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 index 004bda2ada66..63225a040472 100644 --- 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 @@ -11,6 +11,8 @@ 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_platform_base.sonic_sfp.sff8024 import type_abbrv_name + from sonic_platform_base.sonic_sfp.sff8024 import type_of_media_interface from sonic_py_common.logger import Logger import sys except ImportError as e: @@ -277,6 +279,7 @@ def __init__(self, sfp_index, sfp_type): # Init index self.index = sfp_index self.port_num = self.index + 1 + self.abbrv = None # Init eeprom path eeprom_low_path = '/sys/bus/i2c/devices/0-00{}/eeprom_low' @@ -328,7 +331,7 @@ def get_presence(self): except IOError: return False logger.log_info("debug:port_ %s sfp presence is %s" % (str(self.index), str(presence))) - return presence + return True if presence == 1 else False def _read_eeprom_specific_bytes(self, offset, num_bytes, page = 0): sysfsfile_eeprom = None @@ -383,8 +386,10 @@ def _detect_sfp_type(self, sfp_type): if eeprom_raw: if eeprom_raw[0] in QSFP_TYPE_CODE_LIST: self.sfp_type = QSFP_TYPE + self.abbrv = type_abbrv_name[eeprom_raw[0]] elif eeprom_raw[0] in QSFP_DD_TYPE_CODE_LIST: self.sfp_type = QSFP_DD_TYPE + self.abbrv = type_abbrv_name[eeprom_raw[0]] else: # we don't regonize this identifier value, treat the xSFP module as the default type self.sfp_type = sfp_type @@ -395,6 +400,7 @@ def _detect_sfp_type(self, sfp_type): # 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 + self.abbrv = type_abbrv_name['18'] def _dom_capability_detect(self): @@ -426,7 +432,7 @@ def _dom_capability_detect(self): 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) + dom_capability = sfpi_obj.parse_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' @@ -462,11 +468,13 @@ def _dom_capability_detect(self): self.dom_temp_supported = True self.dom_volt_supported = True + self.dom_rx_tx_power_bias_supported = False + self.dom_tx_bias_power_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) + dom_capability = sfpi_obj.parse_dom_capability(qsfp_dom_capability_raw, 0) if dom_capability['data']['Flat_MEM']['value'] == 'Off': ext_dd = ext_qsfp_dd() @@ -474,8 +482,8 @@ def _dom_capability_detect(self): 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_rx_power_supported = mon_sup_data['data']['Rx_power_support']['value'] == 'On' + self.dom_tx_power_supported = mon_sup_data['data']['Tx_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' @@ -490,7 +498,7 @@ def _dom_capability_detect(self): def _convert_string_to_num(self, value_str): if "-inf" in value_str: - return 'N/A' + return '-inf' elif "Unknown" in value_str: return 'N/A' elif 'dBm' in value_str: @@ -534,8 +542,19 @@ def get_transceiver_info(self): application_advertisement |1*255VCHAR |supported applications advertisement ================================================================================ """ + self.reinit() + info_dict_keys = [ + 'type', 'hardware_rev', 'serial', 'manufacturer', + 'model', 'connector', 'encoding', 'ext_identifier', + 'ext_rateselect_compliance', 'cable_type', 'cable_length', + 'nominal_bit_rate', 'specification_compliance', 'vendor_date', + 'vendor_oui', 'application_advertisement', 'type_abbrv_name'] + transceiver_info_dict = {} compliance_code_dict = {} + transceiver_info_dict = dict.fromkeys(info_dict_keys, "NA") + transceiver_info_dict["specification_compliance"] = '{}' + transceiver_info_dict['type_abbrv_name'] = self.abbrv #QSFP if self.sfp_type == QSFP_TYPE: @@ -684,6 +703,7 @@ def get_transceiver_info(self): if sfp_media_type_dict is None: return None + transceiver_info_dict['specification_compliance'] = type_of_media_interface[sfp_media_type_raw[0]] 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 @@ -711,7 +731,6 @@ def get_transceiver_info(self): 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" @@ -748,6 +767,7 @@ def get_transceiver_bulk_status(self): TX power |INT |TX output power in mW ======================================================================== """ + self.reinit() transceiver_dom_info_dict = {} dom_info_dict_keys = ['temperature', 'voltage', @@ -844,7 +864,7 @@ def get_transceiver_bulk_status(self): 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: + if self.dom_tx_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'] @@ -907,6 +927,7 @@ def get_transceiver_threshold_info(self): txbiaslowwarning |FLOAT |Low Warning Threshold value of tx Bias Current in mA. ======================================================================== """ + self.reinit() transceiver_dom_threshold_info_dict = {} dom_info_dict_keys = ['temphighalarm', 'temphighwarning', @@ -1031,6 +1052,7 @@ def get_rx_los(self): 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. """ + self.reinit() if not self.dom_supported: return None @@ -1052,7 +1074,7 @@ def get_rx_los(self): 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_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) @@ -1072,6 +1094,7 @@ def get_tx_fault(self): 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. """ + self.reinit() if not self.dom_supported: return None @@ -1104,6 +1127,7 @@ def get_tx_disable(self): 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 """ + self.reinit() if not self.dom_supported: return None @@ -1174,6 +1198,7 @@ def get_temperature(self): Returns: An integer number of current temperature in Celsius """ + self.reinit() if not self.dom_supported: return None #QSFP @@ -1218,6 +1243,7 @@ def get_voltage(self): Returns: An integer number of supply voltage in mV """ + self.reinit() if not self.dom_supported: return None @@ -1263,6 +1289,7 @@ def get_tx_bias(self): for channel 0 to channel 4. Ex. ['110.09', '111.12', '108.21', '112.09'] """ + self.reinit() tx_bias_list = [] #QSFP @@ -1289,7 +1316,7 @@ def get_tx_bias(self): if sfpd_obj is None: return None - if dom_tx_bias_power_supported: + if self.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) @@ -1313,6 +1340,7 @@ def get_rx_power(self): power in mW for channel 0 to channel 4. Ex. ['1.77', '1.71', '1.68', '1.70'] """ + self.reinit() rx_power_list = [] #QSFP @@ -1368,6 +1396,7 @@ def get_tx_power(self): for channel 0 to channel 4. Ex. ['1.86', '1.86', '1.86', '1.86'] """ + self.reinit() tx_power_list = [] #QSFP @@ -1513,3 +1542,40 @@ def get_serial(self): transceiver_dom_info_dict = self.get_transceiver_info() return transceiver_dom_info_dict.get("serial", "N/A") + 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 not self.get_reset_status() + + def get_position_in_parent(self): + """ + Returns: + Temp return 0 + """ + return 0 + + def is_replaceable(self): + """ + Retrieves if replaceable + Returns: + A boolean value, True if replaceable + """ + return True + + def get_error_description(self): + """ + Get error description + + Args: + error_code: The error code returned by _get_error_code + + Returns: + The error description + """ + if self.get_presence(): + return self.SFP_STATUS_OK + else: + return self.SFP_STATUS_UNPLUGGED 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 index f45d930e87f5..730f5b1c6c21 100644 --- 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 @@ -9,6 +9,7 @@ import os import os.path +import subprocess try: from sonic_platform_base.thermal_base import ThermalBase @@ -28,8 +29,14 @@ class Thermal(ThermalBase): "/sys/bus/i2c/devices/0-004d/", "/sys/bus/i2c/devices/0-004e/"] + IPMI_SENSOR_NR = ["0x30", "0x31", "0x32", "0x33", "0x34", "0x35", "0x36"] + def __init__(self, thermal_index): self.index = thermal_index + self.lnc = None + self.lcr = None + self.unc = None + self.ucr = None # Add thermal name self.THERMAL_NAME_LIST.append("Top-Rear") @@ -40,6 +47,20 @@ def __init__(self, thermal_index): self.THERMAL_NAME_LIST.append("Bottom-Front") self.THERMAL_NAME_LIST.append("Bottom-Rear") ThermalBase.__init__(self) + self.minimum_thermal = self.get_temperature() + self.maximum_thermal = self.get_temperature() + self.__initialize_threshold() + + def __initialize_threshold(self): + cmd = ["ipmitool", "raw", "0x4", "0x27"] + if self.lnc is None: + cmd.append(self.IPMI_SENSOR_NR[self.index]) + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + out, err = p.communicate() + self.unc = float(int(out.split()[4],16)) + self.ucr = float(int(out.split()[5],16)) + self.lnc = float(int(out.split()[1],16) if int(out.split()[1],16) != 0 else 2) + self.lcr = float(int(out.split()[2],16)) def __read_txt_file(self, file_path): try: @@ -57,7 +78,7 @@ def __get_temp(self, temp_file): return "{:.3f}".format(temp) def __set_threshold(self, file_name, temperature): - temp_file_path = os.path.join(self.hwmon_path, file_name) + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], file_name) try: with open(temp_file_path, 'w') as fd: fd.write(str(temperature)) @@ -81,7 +102,8 @@ def get_low_threshold(self): :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) + + return self.lnc def get_low_critical_threshold(self): """ @@ -89,7 +111,8 @@ def get_low_critical_threshold(self): :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) + + return self.lcr def get_high_threshold(self): """ @@ -98,20 +121,8 @@ def get_high_threshold(self): 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) + + return self.unc def get_high_critical_threshold(self): """ @@ -119,20 +130,8 @@ def get_high_critical_threshold(self): :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) + + return self.ucr def get_name(self): """ @@ -144,12 +143,12 @@ def get_name(self): def get_presence(self): """ - Retrieves the presence of the PSU + Retrieves the presence of the sensor Returns: - bool: True if PSU is present, False if not + bool: True if sensor is present, False if not """ temp_file = "temp1_input" - temp_file_path = os.path.join(self.hwmon_path, temp_file) + temp_file_path = os.path.join(self.SYSFS_THERMAL_DIR[self.index], temp_file) return os.path.isfile(temp_file_path) def get_status(self): @@ -163,3 +162,63 @@ def get_status(self): return True + def get_model(self): + """ + Retrieves the model number (or part number) of the device + Returns: + string: Model/part number of device + """ + return "None" + + def get_serial(self): + """ + Retrieves the serial number of the device + Returns: + string: Serial number of device + """ + return "None" + + def is_replaceable(self): + """ + Retrieves whether thermal module is replaceable + Returns: + A boolean value, True if replaceable, False if not + """ + return False + + 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 self.index + 1 + + def get_minimum_recorded(self): + """ + Retrieves the minimum recorded temperature of thermal + Returns: + A float number, the minimum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp < self.minimum_thermal: + self.minimum_thermal = tmp + return self.minimum_thermal + + def get_maximum_recorded(self): + """ + Retrieves the maximum recorded temperature of thermal + Returns: + A float number, the maximum recorded temperature of thermal in Celsius + up to nearest thousandth of one degree Celsius, e.g. 30.125 + """ + tmp = self.get_temperature() + if tmp > self.maximum_thermal: + self.maximum_thermal = tmp + return self.maximum_thermal + diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_firmware_version b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_firmware_version new file mode 100755 index 000000000000..0ce6e8624436 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/platform_firmware_version @@ -0,0 +1,24 @@ +#!/bin/bash +ver_str=$(ipmitool raw 0x30 0x23 2>>/dev/null) +fpga_ver=$(echo $ver_str | awk '{printf $3}') +cpld1_ver=$(echo $ver_str | awk '{printf $4}') +cpld2_ver=$(echo $ver_str | awk '{printf $5}') +fan_cpld_ver=$(echo $ver_str | awk '{printf $6}') + +cpld1_ver=$( printf "%d" 0x$cpld1_ver ) +cpld2_ver=$( printf "%d" 0x$cpld2_ver ) +fan_cpld_ver=$( printf "%d" 0x$fan_cpld_ver ) +fpga_ver=$( printf "%d" 0x$fpga_ver ) + +cpld1_ver_path="/sys/bus/i2c/devices/0-0061/version" +cpld2_ver_path="/sys/bus/i2c/devices/0-0062/version" +fan_cpld_ver_path="/sys/bus/i2c/devices/0-0066/version" +fpga_ver_path="/sys/bus/i2c/devices/0-0060/version" + +echo $cpld1_ver > $cpld1_ver_path +echo $cpld2_ver > $cpld2_ver_path +echo $fpga_ver > $fpga_ver_path +echo $fan_cpld_ver > $fan_cpld_ver_path + +exit 0 + 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 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 old mode 100644 new mode 100755 index ba4f4c8dae99..364ac53b1865 --- 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 @@ -2,6 +2,7 @@ #0=off, 1=green, 2=amber, 3=blk_green led_state=0 +pre_loc_state=0 #$1=led_no(1=loc, 2=diag, 3=fan, 4=psu1, 5=psu2) bmc_led_read() @@ -128,37 +129,10 @@ bmc_led_read() 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) +#$1=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 + ipmitool raw 0x30 0x2b 0x2 0xc0 0x0 0x55 0x"$1"0 1>>/dev/null 2>>/dev/null } LED_monitor() @@ -171,7 +145,13 @@ LED_monitor() 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 + if [ $loc_state -gt 4 ]; then + loc_state=4 + fi + if [ $loc_state != $pre_loc_state ]; then + bmc_led_write $loc_state + pre_loc_state=$loc_state + fi bmc_led_read 2 if [ $? -eq 1 ];then 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 old mode 100644 new mode 100755 index bcb3502e4a7c..d5cfd719344b --- 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 @@ -85,61 +85,73 @@ get_PSU_information() #PSU1 Vin add_byte 1 2 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_in fi #PSU2 Vin add_byte 3 4 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_in fi #PSU 1 Vout add_byte 5 6 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_v_out fi #PSU 2 Vout add_byte 7 8 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_v_out fi #PSU 1 Iin add_byte 9 10 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_in fi #PSU 2 Iin add_byte 11 12 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_in fi #PSU 1 Iout add_byte 13 14 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_i_out fi #PSU 2 Iout add_byte 15 16 if [ $? -eq 1 ];then + Value=$((Value * 10)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_i_out fi #PSU 1 Pin add_byte 17 18 if [ $? -eq 1 ];then + Value=$((Value * 1000000)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_in fi #PSU 2 Pin add_byte 19 20 if [ $? -eq 1 ];then + Value=$((Value * 1000000)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_in fi #PSU 1 Pout add_byte 21 22 if [ $? -eq 1 ];then + Value=$((Value * 1000000)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_p_out fi #PSU 2 Pout add_byte 23 24 if [ $? -eq 1 ];then + Value=$((Value * 1000000)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_p_out fi #PSU 1 Fan speed @@ -156,9 +168,11 @@ get_PSU_information() #----------------93->/58/59----psu_fan1_fault psu_temp1_input psu_fan1_duty_cycle #PSU 1 Temp1 byte_read 25 + Value=$((Value * 1000)) echo $Value > /sys/bus/i2c/devices/0-005a/psu_temp1_input #PSU 2 Temp1 byte_read 26 + Value=$((Value * 1000)) echo $Value > /sys/bus/i2c/devices/0-0059/psu_temp1_input if [ $debug_flag -eq 0 ];then #PSU 1 Fan command @@ -314,8 +328,8 @@ PSU_monitor() { while true - do - + do + get_PSU_information if [ $debug_flag -eq 1 ];then bmc_fan_speed_ctrl 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 old mode 100644 new mode 100755 diff --git a/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sw_to3200k_watchdog.sh b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sw_to3200k_watchdog.sh new file mode 100755 index 000000000000..082c3497cdc8 --- /dev/null +++ b/platform/innovium/sonic-platform-modules-wistron/sw-to3200k/utils/sw_to3200k_watchdog.sh @@ -0,0 +1,5 @@ +#! /bin/bash + +#we don't have watchdog design in SW3200K so always return OK to skip + +exit 0 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 old mode 100644 new mode 100755 index 46121e6e7eed..c7b65e16e2c4 --- 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 @@ -229,6 +229,18 @@ def device_install(): print(output) if FORCE == 0: return status + + status, output = log_os_system("cp /usr/share/sonic/device/x86_64-wistron_sw_to3200k-r0/smartd.conf /etc/;systemctl restart smartd.service", 1) + if status: + print(output) + if FORCE == 0: + return status + + status, output = log_os_system("cp /usr/share/sonic/device/x86_64-wistron_sw_to3200k-r0/watchdog-control.service /usr/lib/systemd/system/", 1) + if status: + print(output) + if FORCE == 0: + return status return def device_uninstall(): @@ -284,12 +296,6 @@ def do_install(): 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(): From f4550e8b89cd7d49ccc10bdc9dc1cb5b01a2e85d Mon Sep 17 00:00:00 2001 From: Dror Prital <76714716+dprital@users.noreply.github.com> Date: Thu, 23 Feb 2023 20:23:21 +0200 Subject: [PATCH 50/57] [submodule] Advance sonic-swss pointer (#13953) Update sonic-swss submodule pointer to include the following: * baa302e Do not allow to add port to .1Q bridge while router port deletion is not completed ([#2669](https://github.com/sonic-net/sonic-swss/pull/2669)) * f66abed Support for tc-dot1p and tc-dscp qosmap ([#2559](https://github.com/sonic-net/sonic-swss/pull/2559)) * 35385ad [RouteOrch] Record ROUTE_TABLE entry programming status to APPL_STATE_DB ([#2512](https://github.com/sonic-net/sonic-swss/pull/2512)) * 0704f78 [Workaround] EvpnRemoteVnip2pOrch warmboot check failure ([#2626](https://github.com/sonic-net/sonic-swss/pull/2626)) * 4df5cab [ResponsePublisher] add pipeline support ([#2511](https://github.com/sonic-net/sonic-swss/pull/2511)) --- src/sonic-swss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-swss b/src/sonic-swss index 44ea6a08659a..baa302e232d6 160000 --- a/src/sonic-swss +++ b/src/sonic-swss @@ -1 +1 @@ -Subproject commit 44ea6a08659a11723173c5272b0400882cf11347 +Subproject commit baa302e232d61a49880b23b3ef1098e47cf6d1ce From 3e316cbf24516e4ce3fc278e465e19b87f7f71ff Mon Sep 17 00:00:00 2001 From: Saikrishna Arcot Date: Thu, 23 Feb 2023 14:49:51 -0800 Subject: [PATCH 51/57] Don't create the members@ array in config_db for PC when reading from minigraph (#13660) Fixes #11873. #### Why I did it When loading from minigraph, for port channels, don't create the members@ array in config_db in the PORTCHANNEL table. This is no longer needed or used. In addition, when adding a port channel member from the CLI, that member doesn't get added into the members@ array, resulting in a bit of inconsistency. This gets rid of that inconsistency. --- src/sonic-config-engine/minigraph.py | 21 +++++++++++-------- src/sonic-config-engine/tests/test_cfggen.py | 4 ++-- .../tests/test_minigraph_case.py | 2 +- .../tests/test_multinpu_cfggen.py | 10 ++++----- src/sonic-yang-mgmt/tests/test_cfghelp.py | 20 +++++++++--------- .../tests/files/sample_config_db.json | 13 ------------ .../yang_model_tests/tests_config/mclag.json | 9 -------- .../tests_config/portchannel.json | 18 ---------------- .../tests_config/vlan_sub_interface.json | 12 ----------- .../yang-models/sonic-portchannel.yang | 17 --------------- 10 files changed, 30 insertions(+), 96 deletions(-) diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 094d62bf2674..313c2ebfaded 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -532,9 +532,9 @@ def parse_dpg(dpg, hname): intfs_inpc.append(pcmbr_list[i]) pc_members[(pcintfname, pcmbr_list[i])] = {} if pcintf.find(str(QName(ns, "Fallback"))) != None: - pcs[pcintfname] = {'members': pcmbr_list, 'fallback': pcintf.find(str(QName(ns, "Fallback"))).text, 'min_links': str(int(math.ceil(len() * 0.75))), 'lacp_key': 'auto'} + pcs[pcintfname] = {'fallback': pcintf.find(str(QName(ns, "Fallback"))).text, 'min_links': str(int(math.ceil(len() * 0.75))), 'lacp_key': 'auto'} else: - pcs[pcintfname] = {'members': pcmbr_list, 'min_links': str(int(math.ceil(len(pcmbr_list) * 0.75))), 'lacp_key': 'auto' } + pcs[pcintfname] = {'min_links': str(int(math.ceil(len(pcmbr_list) * 0.75))), 'lacp_key': 'auto' } port_nhipv4_map = {} port_nhipv6_map = {} nhg_int = "" @@ -1244,7 +1244,7 @@ def filter_acl_table_for_backend(acls, vlan_members): } return filter_acls -def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role, device_type, is_storage_device, vlan_members): +def filter_acl_table_bindings(acls, neighbors, port_channels, pc_members, sub_role, device_type, is_storage_device, vlan_members): if device_type == 'BackEndToRRouter' and is_storage_device: return filter_acl_table_for_backend(acls, vlan_members) @@ -1263,8 +1263,8 @@ def filter_acl_table_bindings(acls, neighbors, port_channels, sub_role, device_t # Get the front panel port channel. for port_channel_intf in port_channels: - backend_port_channel = any(lag_member in backplane_port_list \ - for lag_member in port_channels[port_channel_intf]['members']) + backend_port_channel = any(lag_member[1] in backplane_port_list \ + for lag_member in list(pc_members.keys()) if lag_member[0] == port_channel_intf) if not backend_port_channel: front_port_channel_intf.append(port_channel_intf) @@ -1763,12 +1763,15 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if port_config_file: port_set = set(ports.keys()) - for (pc_name, mbr_map) in list(pcs.items()): + for (pc_name, pc_member) in list(pc_members.keys()): # remove portchannels that contain ports not existing in port_config.ini # when port_config.ini exists - if not set(mbr_map['members']).issubset(port_set): - print("Warning: ignore '%s' as part of its member interfaces is not in the port_config.ini" % pc_name, file=sys.stderr) + if (pc_name, pc_member) in pc_members and pc_member not in port_set: + print("Warning: ignore '%s' as at least one of its member interfaces ('%s') is not in the port_config.ini" % (pc_name, pc_member), file=sys.stderr) del pcs[pc_name] + pc_mbr_del_keys = [f for f in list(pc_members.keys()) if f[0] == pc_name] + for pc_mbr_del_key in pc_mbr_del_keys: + del pc_members[pc_mbr_del_key] # set default port channel MTU as 9100 and admin status up and default TPID 0x8100 for pc in pcs.values(): @@ -1872,7 +1875,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw results['DHCP_RELAY'] = dhcp_relay_table results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers) - results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role, current_device['type'], is_storage_device, vlan_members) + results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, pc_members, sub_role, current_device['type'], is_storage_device, vlan_members) results['FEATURE'] = { 'telemetry': { 'state': 'enabled' diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 9b1d0b721983..3ab69fbf6cc8 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -328,7 +328,7 @@ def test_minigraph_portchannels(self, **kwargs): output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), - utils.to_dict("{'PortChannel1': {'admin_status': 'up', 'min_links': '1', 'members': ['Ethernet4'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}") + utils.to_dict("{'PortChannel1': {'admin_status': 'up', 'min_links': '1', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}") ) def test_minigraph_portchannel_with_more_member(self): @@ -336,7 +336,7 @@ def test_minigraph_portchannel_with_more_member(self): output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), - utils.to_dict("{'PortChannel01': {'admin_status': 'up', 'min_links': '3', 'members': ['Ethernet112', 'Ethernet116', 'Ethernet120', 'Ethernet124'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}")) + utils.to_dict("{'PortChannel01': {'admin_status': 'up', 'min_links': '3', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}")) def test_minigraph_portchannel_members(self): argument = ['-m', self.sample_graph_pc_test, '-p', self.port_config, '-v', "PORTCHANNEL_MEMBER.keys()|list"] diff --git a/src/sonic-config-engine/tests/test_minigraph_case.py b/src/sonic-config-engine/tests/test_minigraph_case.py index 86bd92ebe362..7f0319fa3413 100644 --- a/src/sonic-config-engine/tests/test_minigraph_case.py +++ b/src/sonic-config-engine/tests/test_minigraph_case.py @@ -158,7 +158,7 @@ def test_minigraph_portchannels(self): output = self.run_script(argument) self.assertEqual( utils.to_dict(output.strip()), - utils.to_dict("{'PortChannel01': {'admin_status': 'up', 'min_links': '1', 'members': ['Ethernet4'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}") + utils.to_dict("{'PortChannel01': {'admin_status': 'up', 'min_links': '1', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}") ) def test_minigraph_console_mgmt_feature(self): diff --git a/src/sonic-config-engine/tests/test_multinpu_cfggen.py b/src/sonic-config-engine/tests/test_multinpu_cfggen.py index be1f677e178e..6eb2c8674abd 100644 --- a/src/sonic-config-engine/tests/test_multinpu_cfggen.py +++ b/src/sonic-config-engine/tests/test_multinpu_cfggen.py @@ -161,16 +161,16 @@ def test_frontend_asic_portchannels(self): argument = ["-m", self.sample_graph, "-p", self.port_config[0], "-n", "asic0", "--var-json", "PORTCHANNEL"] output = json.loads(self.run_script(argument)) self.assertDictEqual(output, \ - {'PortChannel0002': {'admin_status': 'up', 'min_links': '2', 'members': ['Ethernet0', 'Ethernet4'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, - 'PortChannel4001': {'admin_status': 'up', 'min_links': '2', 'members': ['Ethernet-BP0', 'Ethernet-BP4'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, - 'PortChannel4002': {'admin_status': 'up', 'min_links': '2', 'members': ['Ethernet-BP8', 'Ethernet-BP12'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}) + {'PortChannel0002': {'admin_status': 'up', 'min_links': '2', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, + 'PortChannel4001': {'admin_status': 'up', 'min_links': '2', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, + 'PortChannel4002': {'admin_status': 'up', 'min_links': '2', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}) def test_backend_asic_portchannels(self): argument = ["-m", self.sample_graph, "-p", self.port_config[3], "-n", "asic3", "--var-json", "PORTCHANNEL"] output = json.loads(self.run_script(argument)) self.assertDictEqual(output, \ - {'PortChannel4013': {'admin_status': 'up', 'min_links': '2', 'members': ['Ethernet-BP384', 'Ethernet-BP388'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, - 'PortChannel4014': {'admin_status': 'up', 'min_links': '2', 'members': ['Ethernet-BP392', 'Ethernet-BP396'], 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}) + {'PortChannel4013': {'admin_status': 'up', 'min_links': '2', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}, + 'PortChannel4014': {'admin_status': 'up', 'min_links': '2', 'mtu': '9100', 'tpid': '0x8100', 'lacp_key': 'auto'}}) def test_frontend_asic_portchannel_mem(self): argument = ["-m", self.sample_graph, "-p", self.port_config[0], "-n", "asic0", "-v", "PORTCHANNEL_MEMBER.keys()|list"] diff --git a/src/sonic-yang-mgmt/tests/test_cfghelp.py b/src/sonic-yang-mgmt/tests/test_cfghelp.py index 5867c78e5282..2eebebe7be3b 100644 --- a/src/sonic-yang-mgmt/tests/test_cfghelp.py +++ b/src/sonic-yang-mgmt/tests/test_cfghelp.py @@ -71,17 +71,17 @@ """ -portchannel_table_field_output="""\ +vlan_table_field_output="""\ -PORTCHANNEL -Description: PORTCHANNEL part of config_db.json +VLAN +Description: VLAN part of config_db.json key - name -+---------+-------------------------------------------+-------------+-----------+-------------+ -| Field | Description | Mandatory | Default | Reference | -+=========+===========================================+=============+===========+=============+ -| members | The field contains list of unique members | | | PORT:name | -+---------+-------------------------------------------+-------------+-----------+-------------+ ++--------------+------------------------------------------------------------------------+-------------+-----------+-------------+ +| Field | Description | Mandatory | Default | Reference | ++==============+========================================================================+=============+===========+=============+ +| dhcp_servers | The field contains list of unique membersConfigure the dhcp v4 servers | | | | ++--------------+------------------------------------------------------------------------+-------------+-----------+-------------+ """ @@ -153,9 +153,9 @@ def test_single_field(self): self.assertEqual(output, techsupport_table_field_output) def test_leaf_list(self): - argument = ['-t', 'PORTCHANNEL', '-f', 'members'] + argument = ['-t', 'VLAN', '-f', 'dhcp_servers'] output = self.run_script(argument) - self.assertEqual(output, portchannel_table_field_output) + self.assertEqual(output, vlan_table_field_output) def test_leaf_list_map(self): argument = ['-t', 'DSCP_TO_TC_MAP'] diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 375f7d24e4b5..8b80631f4fb4 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -86,9 +86,6 @@ "PortChannel0003": { "admin_status": "up", "min_links": "1", - "members": [ - "Ethernet1" - ], "tpid": "0x8100", "mtu": "9100", "lacp_key": "auto" @@ -96,9 +93,6 @@ "PortChannel0004": { "admin_status": "up", "min_links": "1", - "members": [ - "Ethernet2" - ], "tpid": "0x9200", "mtu": "9100", "lacp_key": "auto" @@ -106,19 +100,12 @@ "PortChannel2": { "admin_status": "up", "min_links": "1", - "members": [ - "Ethernet12" - ], "tpid": "0x9200", "mtu": "9100", "lacp_key": "auto" }, "PortChannel42": { "admin_status": "up", - "members": [ - "Ethernet-BP0", - "Ethernet-BP4" - ], "min_links": "2", "mtu": "9100", "tpid": "0x8100" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mclag.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mclag.json index fdb2661a973a..3d2ca3c92be6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/mclag.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/mclag.json @@ -29,9 +29,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "lacp_key": "auto", @@ -39,9 +36,6 @@ }, { "admin_status": "up", - "members": [ - "Ethernet10" - ], "min_links": "1", "mtu": "9100", "lacp_key": "auto", @@ -151,9 +145,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "lacp_key": "auto", diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json index 6c26e9ce83e6..ba0762e5ebc6 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/portchannel.json @@ -21,9 +21,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "tpid": "0x8100", @@ -55,9 +52,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1024", "mtu": "9100", "name": "PortChannel0001" @@ -87,9 +81,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1025", "mtu": "9100", "name": "PortChannel0001" @@ -303,9 +294,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "name": "PortChannel0001" @@ -350,9 +338,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "name": "PortChannel0001" @@ -396,9 +381,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "name": "PortChannel0001" diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json index b249510f4370..6f200ef4b7ea 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/vlan_sub_interface.json @@ -196,9 +196,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "tpid": "0x8100", @@ -246,9 +243,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "tpid": "0x8100", @@ -296,9 +290,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "tpid": "0x8100", @@ -346,9 +337,6 @@ "PORTCHANNEL_LIST": [ { "admin_status": "up", - "members": [ - "Ethernet0" - ], "min_links": "1", "mtu": "9100", "tpid": "0x8100", diff --git a/src/sonic-yang-models/yang-models/sonic-portchannel.yang b/src/sonic-yang-models/yang-models/sonic-portchannel.yang index 31235a0d2277..96872eeadb1d 100644 --- a/src/sonic-yang-models/yang-models/sonic-portchannel.yang +++ b/src/sonic-yang-models/yang-models/sonic-portchannel.yang @@ -58,23 +58,6 @@ module sonic-portchannel { } } - leaf-list members { - /* leaf-list members are unique by default */ - type union { - type leafref { - path /port:sonic-port/port:PORT/port:PORT_LIST/port:name; - } - type string { - pattern ""; - } - } - /* Today in SONiC, we do not delete the list once - * created, instead we set to empty list. Due to that - * below default values are needed. - */ - default ""; - } - leaf min_links { type uint16 { range 1..1024; From c1dd94f3689a83d5461993bd2b1f9a5246845deb Mon Sep 17 00:00:00 2001 From: Andriy Dobush <78359998+andriydnvd@users.noreply.github.com> Date: Fri, 24 Feb 2023 01:36:37 +0200 Subject: [PATCH 52/57] Add California-SB237 feature. Requires to change default user password (#12678) #### Why I did it Add support of California-SB237 conformance. https://github.com/sonic-net/SONiC/tree/master/doc/California-SB237 #### How I did it Expire user passwords during build #### How to verify it Enable build flag and check if default user is prompted for a new password --- Makefile.work | 1 + build_debian.sh | 10 ++++++++++ check_install.py | 27 ++++++++++++++++++++++++++- rules/config | 3 +++ slave.mk | 2 ++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/Makefile.work b/Makefile.work index bea20edb4219..e0099429ed2a 100644 --- a/Makefile.work +++ b/Makefile.work @@ -499,6 +499,7 @@ SONIC_BUILD_INSTRUCTION := $(MAKE) \ MDEBUG=$(MDEBUG) \ PASSWORD=$(PASSWORD) \ USERNAME=$(USERNAME) \ + CHANGE_DEFAULT_PASSWORD=$(CHANGE_DEFAULT_PASSWORD) \ SONIC_BUILD_JOBS=$(SONIC_BUILD_JOBS) \ SONIC_USE_DOCKER_BUILDKIT=$(SONIC_USE_DOCKER_BUILDKIT) \ VS_PREPARE_MEM=$(VS_PREPARE_MEM) \ diff --git a/build_debian.sh b/build_debian.sh index c0f409f49d0e..b599b8c859bb 100755 --- a/build_debian.sh +++ b/build_debian.sh @@ -684,6 +684,16 @@ sudo LANG=C chroot $FILESYSTEM_ROOT umount /proc || true ## Prepare empty directory to trigger mount move in initramfs-tools/mount_loop_root, implemented by patching sudo mkdir $FILESYSTEM_ROOT/host + +if [[ "$CHANGE_DEFAULT_PASSWORD" == "y" ]]; then + ## Expire default password for exitsing users that can do login + default_users=$(cat $FILESYSTEM_ROOT/etc/passwd | grep "/home"| grep ":/bin/bash\|:/bin/sh" | awk -F ":" '{print $1}' 2> /dev/null) + for user in $default_users + do + sudo LANG=C chroot $FILESYSTEM_ROOT passwd -e ${user} + done +fi + ## Compress most file system into squashfs file sudo rm -f $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS ## Output the file system total size for diag purpose diff --git a/check_install.py b/check_install.py index b8fc3936f751..3a923e91deb6 100755 --- a/check_install.py +++ b/check_install.py @@ -11,6 +11,7 @@ def main(): parser = argparse.ArgumentParser(description='test_login cmdline parser') parser.add_argument('-u', default="admin", help='login user name') parser.add_argument('-P', default="YourPaSsWoRd", help='login password') + parser.add_argument('-N', default="Test@2022", help='new password') parser.add_argument('-p', type=int, default=9000, help='local port') args = parser.parse_args() @@ -20,6 +21,7 @@ def main(): cmd_prompt = "{}@sonic:~\$ $".format(args.u) grub_selection = "The highlighted entry will be executed" firsttime_prompt = 'firsttime_exit' + passwd_change_prompt = ['Current password:', 'New password:', 'Retype new password:'] i = 0 while True: @@ -36,7 +38,6 @@ def main(): # select default SONiC Image p.expect(grub_selection) p.sendline() - # bootup sonic image while True: i = p.expect([login_prompt, passwd_prompt, firsttime_prompt, cmd_prompt]) @@ -46,6 +47,30 @@ def main(): elif i == 1: # send password p.sendline(args.P) + # Check for password change prompt + try: + p.expect('Current password:', timeout=2) + except pexpect.TIMEOUT: + break + else: + # send old password for password prompt + p.sendline(args.P) + p.expect(passwd_change_prompt[1]) + # send new password + p.sendline(args.N) + p.expect(passwd_change_prompt[2]) + # retype new password + p.sendline(args.N) + time.sleep(1) + # Restore default password + p.sendline('passwd {}'.format(args.u)) + p.expect(passwd_change_prompt[0]) + p.sendline(args.N) + p.expect(passwd_change_prompt[1]) + p.sendline(args.P) + p.expect(passwd_change_prompt[2]) + p.sendline(args.P) + break elif i == 2: # fix a login timeout issue, caused by the login_prompt message mixed with the output message of the rc.local time.sleep(1) diff --git a/rules/config b/rules/config index 0cf5c00dc070..ec659631e222 100644 --- a/rules/config +++ b/rules/config @@ -39,6 +39,9 @@ DEFAULT_BUILD_LOG_TIMESTAMP = none # Comment next line to disable: # SONIC_CONFIG_ENABLE_COLORS = y +# CHANGE_DEFAULT_PASSWORD - enforce default user/users to change password on 1st login +CHANGE_DEFAULT_PASSWORD ?= n + # DEFAULT_USERNAME - default username for installer build DEFAULT_USERNAME = admin diff --git a/slave.mk b/slave.mk index dc926087f35a..5789287f1d43 100644 --- a/slave.mk +++ b/slave.mk @@ -376,6 +376,7 @@ $(info "USE_NATIVE_DOCKERD_FOR_BUILD" : "$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FO $(info "SONIC_USE_DOCKER_BUILDKIT" : "$(SONIC_USE_DOCKER_BUILDKIT)") $(info "USERNAME" : "$(USERNAME)") $(info "PASSWORD" : "$(PASSWORD)") +$(info "CHANGE_DEFAULT_PASSWORD" : "$(CHANGE_DEFAULT_PASSWORD)") $(info "ENABLE_DHCP_GRAPH_SERVICE" : "$(ENABLE_DHCP_GRAPH_SERVICE)") $(info "SHUTDOWN_BGP_ON_START" : "$(SHUTDOWN_BGP_ON_START)") $(info "ENABLE_PFCWD_ON_START" : "$(ENABLE_PFCWD_ON_START)") @@ -1430,6 +1431,7 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \ DEBUG_SRC_ARCHIVE_FILE="$(DBG_SRC_ARCHIVE_FILE)" \ USERNAME="$(USERNAME)" \ PASSWORD="$(PASSWORD)" \ + CHANGE_DEFAULT_PASSWORD="$(CHANGE_DEFAULT_PASSWORD)" \ TARGET_MACHINE=$(dep_machine) \ IMAGE_TYPE=$($*_IMAGE_TYPE) \ TARGET_PATH=$(TARGET_PATH) \ From d1bca210a603c960deeef550675fd08cf7018de4 Mon Sep 17 00:00:00 2001 From: Sambath Kumar Balasubramanian <63021927+skbarista@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:54:43 -0800 Subject: [PATCH 53/57] sonic-buildimage Make changes to arista config.bcm files to support max cores (#13831) To support 64 cores on arista skus. Fixes aristanetworks/sonic#77 Remapped recycle ports to lowers core port ids and set appl_param_nof_ports_per_modid to 64. --- .../jr2-a7280cr3-32d4-40x100G.config.bcm | 20 ++++++++++--------- .../Arista-7800R3-48CQ2-C48/port_config.ini | 4 ++-- .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 19 +++++++++--------- .../Arista-7800R3A-36D2-C36/0/port_config.ini | 4 ++-- .../1/j2p-a7800r3a-36d-36x400G.config.bcm | 19 +++++++++--------- .../Arista-7800R3A-36D2-C36/1/port_config.ini | 4 ++-- .../Arista-7800R3A-36D2-C36/port_config.ini | 8 ++++---- .../0/j2p-a7800r3a-36d-36x400G.config.bcm | 19 +++++++++--------- .../Arista-7800R3A-36D2-D36/0/port_config.ini | 4 ++-- .../1/j2p-a7800r3a-36d-36x400G.config.bcm | 19 +++++++++--------- .../Arista-7800R3A-36D2-D36/1/port_config.ini | 4 ++-- .../Arista-7800R3A-36D2-D36/port_config.ini | 8 ++++---- src/sonic-device-data/tests/permitted_list | 1 + 13 files changed, 70 insertions(+), 63 deletions(-) diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm index 93c5c8d21560..a10f1f5c6f24 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/jr2-a7280cr3-32d4-40x100G.config.bcm @@ -493,15 +493,16 @@ tm_port_header_type_out_233.BCM8869X=CPU tm_port_header_type_in_240.BCM8869X=INJECTED_2 tm_port_header_type_out_240.BCM8869X=RAW -sai_recycle_port_lane_base=0 -ucode_port_221.BCM8869X=RCY.21:core_0.221 -ucode_port_222.BCM8869X=RCY.22:core_1.222 -tm_port_header_type_out_221.BCM8869X=ETH -tm_port_header_type_in_221.BCM8869X=ETH -tm_port_header_type_out_222.BCM8869X=ETH -tm_port_header_type_in_222.BCM8869X=ETH -port_init_speed_221.BCM8869X=400000 -port_init_speed_222.BCM8869X=400000 +#RCY +sai_recycle_port_lane_base=200 +ucode_port_49.BCM8869X=RCY0:core_0.49 +ucode_port_50.BCM8869X=RCY1:core_1.50 +tm_port_header_type_out_49.BCM8869X=ETH +tm_port_header_type_in_49.BCM8869X=ETH +tm_port_header_type_out_50.BCM8869X=ETH +tm_port_header_type_in_50.BCM8869X=ETH +port_init_speed_49.BCM8869X=400000 +port_init_speed_50.BCM8869X=400000 # fabric port_init_cl72_sfi=1 @@ -788,6 +789,7 @@ dport_map_direct.BCM8869X=1 pmf_sexem3_stage.BCM8869X=IPMF3 rif_id_max=0x6000 +appl_param_nof_ports_per_modid=64 dma_desc_aggregator_chain_length_max.BCM8869X=1000 dma_desc_aggregator_buff_size_kb.BCM8869X=100 dma_desc_aggregator_timeout_usec.BCM8869X=1000 diff --git a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/port_config.ini b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/port_config.ini index 34ddd34c2806..ca11e4c0dd6b 100644 --- a/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/port_config.ini +++ b/device/arista/x86_64-arista_7800r3_48cq2_lc/Arista-7800R3-48CQ2-C48/port_config.ini @@ -47,5 +47,5 @@ Ethernet176 54,55 Ethernet45/1 45 Ext 100000 1 Ethernet180 50,51 Ethernet46/1 46 Ext 100000 1 46 8 Ethernet184 52,53 Ethernet47/1 47 Ext 100000 1 47 8 Ethernet188 48,49 Ethernet48/1 48 Ext 100000 1 48 8 -Ethernet-Rec0 221 Recirc0/0 51 Rec 400000 0 221 8 -Ethernet-IB0 222 Recirc0/1 52 Inb 400000 1 222 8 +Ethernet-Rec0 249 Recirc0/0 51 Rec 400000 0 49 8 +Ethernet-IB0 250 Recirc0/1 52 Inb 400000 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/j2p-a7800r3a-36d-36x400G.config.bcm index 8421a2b9ee08..7fc12d0c432f 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -263,15 +263,15 @@ tm_port_header_type_in_219=INJECTED_2 port_init_speed_sat=400000 ### RCY -sai_recycle_port_lane_base=0 -ucode_port_221=RCY.21:core_0.221 -ucode_port_222=RCY.22:core_1.222 -tm_port_header_type_out_221=ETH -tm_port_header_type_in_221=ETH -tm_port_header_type_out_222=ETH -tm_port_header_type_in_222=ETH -port_init_speed_221=400000 -port_init_speed_222=400000 +sai_recycle_port_lane_base=200 +ucode_port_49=RCY0:core_0.49 +ucode_port_50=RCY1:core_1.50 +tm_port_header_type_out_49=ETH +tm_port_header_type_in_49=ETH +tm_port_header_type_out_50=ETH +tm_port_header_type_in_50=ETH +port_init_speed_49=400000 +port_init_speed_50=400000 #OLP port tm_port_header_type_in_240=INJECTED_2 @@ -981,5 +981,6 @@ serdes_tx_taps_34=nrz:-5:83:-22:0:0:0 serdes_tx_taps_35=nrz:-4:75:-21:0:0:0 serdes_tx_taps_36=nrz:-8:89:-29:0:0:0 +appl_param_nof_ports_per_modid=64 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=2 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/port_config.ini index a72d84f584ea..f8448735b26f 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/0/port_config.ini @@ -17,5 +17,5 @@ Ethernet112 24,25,26,27 Ethernet15/1 15 Ext 100000 Eth1 Ethernet120 16,17,18,19 Ethernet16/1 16 Ext 100000 Eth120-ASIC0 0 16 8 Ethernet128 8,9,10,11 Ethernet17/1 17 Ext 100000 Eth128-ASIC0 0 17 8 Ethernet136 0,1,2,3 Ethernet18/1 18 Ext 100000 Eth136-ASIC0 0 18 8 -Ethernet-Rec0 221 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 221 8 -Ethernet-IB0 222 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 222 8 +Ethernet-Rec0 249 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 49 8 +Ethernet-IB0 250 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/j2p-a7800r3a-36d-36x400G.config.bcm index 34a77903ebdf..c13991ae101f 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/j2p-a7800r3a-36d-36x400G.config.bcm @@ -263,15 +263,15 @@ tm_port_header_type_in_219=INJECTED_2 port_init_speed_sat=400000 ### RCY -sai_recycle_port_lane_base=0 -ucode_port_221=RCY.21:core_0.221 -ucode_port_222=RCY.22:core_1.222 -tm_port_header_type_out_221=ETH -tm_port_header_type_in_221=ETH -tm_port_header_type_out_222=ETH -tm_port_header_type_in_222=ETH -port_init_speed_221=400000 -port_init_speed_222=400000 +sai_recycle_port_lane_base=200 +ucode_port_49=RCY0:core_0.49 +ucode_port_50=RCY1:core_1.50 +tm_port_header_type_out_49=ETH +tm_port_header_type_in_49=ETH +tm_port_header_type_out_50=ETH +tm_port_header_type_in_50=ETH +port_init_speed_49=400000 +port_init_speed_50=400000 #OLP port tm_port_header_type_in_240=INJECTED_2 @@ -981,5 +981,6 @@ serdes_tx_taps_34=nrz:-5:75:-20:0:0:0 serdes_tx_taps_35=nrz:-5:80:-23:0:0:0 serdes_tx_taps_36=nrz:-7:85:-25:0:0:0 +appl_param_nof_ports_per_modid=64 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=2 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/port_config.ini index 81cda90851cb..b15b00ca0953 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/1/port_config.ini @@ -17,5 +17,5 @@ Ethernet256 24,25,26,27 Ethernet33/1 33 Ext 100000 Eth1 Ethernet264 16,17,18,19 Ethernet34/1 34 Ext 100000 Eth120-ASIC1 0 16 8 Ethernet272 8,9,10,11 Ethernet35/1 35 Ext 100000 Eth128-ASIC1 0 17 8 Ethernet280 0,1,2,3 Ethernet36/1 36 Ext 100000 Eth136-ASIC1 0 18 8 -Ethernet-Rec1 221 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 221 8 -Ethernet-IB1 222 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 222 8 +Ethernet-Rec1 249 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 49 8 +Ethernet-IB1 250 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/port_config.ini index 3d1c79a5fe50..268ba635ed44 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-C36/port_config.ini @@ -35,7 +35,7 @@ Ethernet256 24,25,26,27 Ethernet33/1 33 Ext 100000 Eth1 Ethernet264 16,17,18,19 Ethernet34/1 34 Ext 100000 Eth120-ASIC1 0 16 8 Ethernet272 8,9,10,11 Ethernet35/1 35 Ext 100000 Eth128-ASIC1 0 17 8 Ethernet280 0,1,2,3 Ethernet36/1 36 Ext 100000 Eth136-ASIC1 0 18 8 -Ethernet-Rec0 221 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 221 8 -Ethernet-IB0 222 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 222 8 -Ethernet-Rec1 221 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 221 8 -Ethernet-IB1 222 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 222 8 \ No newline at end of file +Ethernet-Rec0 249 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 49 8 +Ethernet-IB0 250 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 50 8 +Ethernet-Rec1 249 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 49 8 +Ethernet-IB1 250 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/j2p-a7800r3a-36d-36x400G.config.bcm index 46dcd675d65c..711800de5c73 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/j2p-a7800r3a-36d-36x400G.config.bcm @@ -263,15 +263,15 @@ tm_port_header_type_in_219=INJECTED_2 port_init_speed_sat=400000 ### RCY -sai_recycle_port_lane_base=0 -ucode_port_221=RCY.21:core_0.221 -ucode_port_222=RCY.22:core_1.222 -tm_port_header_type_out_221=ETH -tm_port_header_type_in_221=ETH -tm_port_header_type_out_222=ETH -tm_port_header_type_in_222=ETH -port_init_speed_221=400000 -port_init_speed_222=400000 +sai_recycle_port_lane_base=200 +ucode_port_49=RCY0:core_0.49 +ucode_port_50=RCY1:core_1.50 +tm_port_header_type_out_49=ETH +tm_port_header_type_in_49=ETH +tm_port_header_type_out_50=ETH +tm_port_header_type_in_50=ETH +port_init_speed_49=400000 +port_init_speed_50=400000 #OLP port tm_port_header_type_in_240=INJECTED_2 @@ -1018,5 +1018,6 @@ serdes_tx_taps_34=pam4:-14:136:-14:2:0:-4 serdes_tx_taps_35=pam4:-16:141:-5:3:-2:-3 serdes_tx_taps_36=pam4:-16:137:-12:2:0:-3 +appl_param_nof_ports_per_modid=64 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/port_config.ini index a8a0a9603114..de840da3eb9a 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/0/port_config.ini @@ -17,5 +17,5 @@ Ethernet112 24,25,26,27,28,29,30,31 Ethernet15/1 15 Ext Ethernet120 16,17,18,19,20,21,22,23 Ethernet16/1 16 Ext 400000 Eth120-ASIC0 0 16 8 Ethernet128 8,9,10,11,12,13,14,15 Ethernet17/1 17 Ext 400000 Eth128-ASIC0 0 17 8 Ethernet136 0,1,2,3,4,5,6,7 Ethernet18/1 18 Ext 400000 Eth136-ASIC0 0 18 8 -Ethernet-Rec0 221 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 221 8 -Ethernet-IB0 222 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 222 8 +Ethernet-Rec0 249 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 49 8 +Ethernet-IB0 250 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/j2p-a7800r3a-36d-36x400G.config.bcm b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/j2p-a7800r3a-36d-36x400G.config.bcm index 5eb17bc354fb..c5712833d21a 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/j2p-a7800r3a-36d-36x400G.config.bcm +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/j2p-a7800r3a-36d-36x400G.config.bcm @@ -263,15 +263,15 @@ tm_port_header_type_in_219=INJECTED_2 port_init_speed_sat=400000 ### RCY -sai_recycle_port_lane_base=0 -ucode_port_221=RCY.21:core_0.221 -ucode_port_222=RCY.22:core_1.222 -tm_port_header_type_out_221=ETH -tm_port_header_type_in_221=ETH -tm_port_header_type_out_222=ETH -tm_port_header_type_in_222=ETH -port_init_speed_221=400000 -port_init_speed_222=400000 +sai_recycle_port_lane_base=200 +ucode_port_49=RCY0:core_0.49 +ucode_port_50=RCY1:core_1.50 +tm_port_header_type_out_49=ETH +tm_port_header_type_in_49=ETH +tm_port_header_type_out_50=ETH +tm_port_header_type_in_50=ETH +port_init_speed_49=400000 +port_init_speed_50=400000 #OLP port tm_port_header_type_in_240=INJECTED_2 @@ -1018,5 +1018,6 @@ serdes_tx_taps_34=pam4:-14:136:-14:2:0:-4 serdes_tx_taps_35=pam4:-16:141:-5:3:-2:-3 serdes_tx_taps_36=pam4:-16:137:-12:2:0:-3 +appl_param_nof_ports_per_modid=64 xflow_macsec_secure_chan_to_num_secure_assoc_encrypt=2 xflow_macsec_secure_chan_to_num_secure_assoc_decrypt=4 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/port_config.ini index 517251fcf7b6..68db8fb44969 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/1/port_config.ini @@ -17,5 +17,5 @@ Ethernet256 24,25,26,27,28,29,30,31 Ethernet33/1 33 Ext Ethernet264 16,17,18,19,20,21,22,23 Ethernet34/1 34 Ext 400000 Eth120-ASIC1 0 16 8 Ethernet272 8,9,10,11,12,13,14,15 Ethernet35/1 35 Ext 400000 Eth128-ASIC1 0 17 8 Ethernet280 0,1,2,3,4,5,6,7 Ethernet36/1 36 Ext 400000 Eth136-ASIC1 0 18 8 -Ethernet-Rec1 221 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 221 8 -Ethernet-IB1 222 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 222 8 +Ethernet-Rec1 249 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 49 8 +Ethernet-IB1 250 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 50 8 diff --git a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/port_config.ini b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/port_config.ini index 0c057dee3def..37a8915cf32e 100644 --- a/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/port_config.ini +++ b/device/arista/x86_64-arista_7800r3a_36d2_lc/Arista-7800R3A-36D2-D36/port_config.ini @@ -35,7 +35,7 @@ Ethernet256 24,25,26,27,28,29,30,31 Ethernet33/1 33 Ext Ethernet264 16,17,18,19,20,21,22,23 Ethernet34/1 34 Ext 400000 Eth120-ASIC1 0 16 8 Ethernet272 8,9,10,11,12,13,14,15 Ethernet35/1 35 Ext 400000 Eth128-ASIC1 0 17 8 Ethernet280 0,1,2,3,4,5,6,7 Ethernet36/1 36 Ext 400000 Eth136-ASIC1 0 18 8 -Ethernet-Rec0 221 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 221 8 -Ethernet-IB0 222 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 222 8 -Ethernet-Rec1 221 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 221 8 -Ethernet-IB1 222 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 222 8 +Ethernet-Rec0 249 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 0 49 8 +Ethernet-IB0 250 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 1 50 8 +Ethernet-Rec1 249 Recirc0/0 39 Rec 400000 Rcy0-ASIC1 0 49 8 +Ethernet-IB1 250 Recirc0/1 40 Inb 400000 Rcy1-ASIC1 1 50 8 diff --git a/src/sonic-device-data/tests/permitted_list b/src/sonic-device-data/tests/permitted_list index 565f7796afa7..2ce2cbdfafc0 100644 --- a/src/sonic-device-data/tests/permitted_list +++ b/src/sonic-device-data/tests/permitted_list @@ -332,3 +332,4 @@ sai_mdio_access_clause22 cmic_dma_abort_in_cold_boot hybrid_pfc_deadlock_enable sai_pfc_dlr_init_capability +appl_param_nof_ports_per_modid From da1526ce0175a0792e4e0e33afb5cd41725a1a04 Mon Sep 17 00:00:00 2001 From: Arvindsrinivasan Lakshmi Narasimhan <55814491+arlakshm@users.noreply.github.com> Date: Thu, 23 Feb 2023 21:41:58 -0800 Subject: [PATCH 54/57] [chassis][voq] 400g to100g speed changes for chassis linecards (#13935) On SONiC VoQ chassis, the speed changes are done from 400G to 100G needs to be supported on 400G linecards. To enable this, along with speed change the port lanes need to be changed. This PR has the changes to update the port lanes when such speed change happens. This PR is intended only for VoQ chassis linecards. These platforms today have 400g port with 8 serdes lines, and 100g will operate with 4 serdes lane. When the port speed changes from 400G to 100G the first 4 lanes will be used for 100G port. Platforms which support 2x50g PAM4 or support 100G PAM4 serdes or other combinations are not handled in the PR. Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan --- src/sonic-config-engine/minigraph.py | 14 + src/sonic-config-engine/tests/test_cfggen.py | 32 + .../tests/voq-sample-400g-port-config.ini | 21 + .../tests/voq-sample-masic-graph.xml | 3903 +++++++++++++++++ 4 files changed, 3970 insertions(+) create mode 100644 src/sonic-config-engine/tests/voq-sample-400g-port-config.ini create mode 100644 src/sonic-config-engine/tests/voq-sample-masic-graph.xml diff --git a/src/sonic-config-engine/minigraph.py b/src/sonic-config-engine/minigraph.py index 313c2ebfaded..68f20b4677a8 100644 --- a/src/sonic-config-engine/minigraph.py +++ b/src/sonic-config-engine/minigraph.py @@ -1666,6 +1666,20 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw if port_name in mgmt_alias_reverse_mapping.keys(): continue + port_default_speed = port_speeds_default.get(port_name, None) + port_png_speed = port_speed_png[port_name] + + if switch_type == 'voq': + # when the port speed is changes from 400g to 100g + # update the port lanes, use the first 4 lanes of the 400G port to support 100G port + if port_default_speed == '400000' and port_png_speed == '100000': + port_lanes = ports[port_name].get('lanes', '').split(',') + # check if the 400g port has only 8 lanes + if len(port_lanes) != 8: + continue + updated_lanes = ",".join(port_lanes[:4]) + ports[port_name]['lanes'] = updated_lanes + ports.setdefault(port_name, {})['speed'] = port_speed_png[port_name] for port_name, port in list(ports.items()): diff --git a/src/sonic-config-engine/tests/test_cfggen.py b/src/sonic-config-engine/tests/test_cfggen.py index 3ab69fbf6cc8..fe2b3e17a8b9 100644 --- a/src/sonic-config-engine/tests/test_cfggen.py +++ b/src/sonic-config-engine/tests/test_cfggen.py @@ -39,6 +39,8 @@ def setUp(self): self.packet_chassis_port_ini = os.path.join(self.test_dir, 'sample-chassis-packet-lc-port-config.ini') self.macsec_profile = os.path.join(self.test_dir, 'macsec_profile.json') self.sample_backend_graph = os.path.join(self.test_dir, 'sample-graph-storage-backend.xml') + self.voq_port_config_400g = os.path.join(self.test_dir, 'voq-sample-400g-port-config.ini') + self.voq_sample_masic_graph = os.path.join(self.test_dir, 'voq-sample-masic-graph.xml') # To ensure that mock config_db data is used for unit-test cases os.environ["CFGGEN_UNIT_TESTING"] = "2" @@ -1022,3 +1024,33 @@ def test_minigraph_packet_chassis_400g_zr_port_config(self): output_dict = utils.to_dict(output.strip()) self.assertEqual(output_dict['tx_power'], '7.5') self.assertEqual(output_dict['laser_freq'], 131000) + + def test_minigraph_400g_to_100G_speed(self): + argument = ["-j", self.macsec_profile, "-m", self.voq_sample_masic_graph, "-p", self.voq_port_config_400g, "-n", "asic0", "-v", "PORT"] + output = self.run_script(argument) + self.assertEqual( + utils.to_dict(output.strip()), + utils.to_dict( + "{'Ethernet0': {'lanes': '72,73,74,75', 'alias': 'Ethernet1/1', 'index': '1', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth0-ASIC0', 'fec': 'rs', 'description': 'ARISTA01T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet8': {'lanes': '80,81,82,83', 'alias': 'Ethernet2/1', 'index': '2', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth8-ASIC0', 'fec': 'rs', 'description': 'ARISTA01T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet16': {'lanes': '88,89,90,91', 'alias': 'Ethernet3/1', 'index': '3', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth16-ASIC0', 'fec': 'rs', 'description': 'ARISTA03T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet24': {'lanes': '96,97,98,99,100,101,102,103', 'alias': 'Ethernet4/1', 'index': '4', 'role': 'Ext', 'speed': '400000', 'asic_port_name': 'Eth24-ASIC0', 'description': 'ARISTA03T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet32': {'lanes': '104,105,106,107,108,109,110,111', 'alias': 'Ethernet5/1', 'index': '5', 'role': 'Ext', 'speed': '400000', 'asic_port_name': 'Eth32-ASIC0', 'description': 'ARISTA05T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet40': {'lanes': '112,113,114,115,116,117,118,119', 'alias': 'Ethernet6/1', 'index': '6', 'role': 'Ext', 'speed': '400000', 'asic_port_name': 'Eth40-ASIC0', 'description': 'ARISTA05T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet48': {'lanes': '120,121,122,123,124,125,126,127', 'alias': 'Ethernet7/1', 'index': '7', 'role': 'Ext', 'speed': '400000', 'asic_port_name': 'Eth48-ASIC0', 'description': 'ARISTA07T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet56': {'lanes': '128,129,130,131', 'alias': 'Ethernet8/1', 'index': '8', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth56-ASIC0', 'fec': 'rs', 'description': 'ARISTA07T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet64': {'lanes': '136,137,138,139', 'alias': 'Ethernet9/1', 'index': '9', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth64-ASIC0', 'fec': 'rs', 'description': 'ARISTA09T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet72': {'lanes': '64,65,66,67', 'alias': 'Ethernet10/1', 'index': '10', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth72-ASIC0', 'fec': 'rs', 'description': 'ARISTA09T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet80': {'lanes': '56,57,58,59', 'alias': 'Ethernet11/1', 'index': '11', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth80-ASIC0', 'fec': 'rs', 'description': 'ARISTA11T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet88': {'lanes': '48,49,50,51', 'alias': 'Ethernet12/1', 'index': '12', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth88-ASIC0', 'fec': 'rs', 'description': 'ARISTA11T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet96': {'lanes': '40,41,42,43', 'alias': 'Ethernet13/1', 'index': '13', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth96-ASIC0', 'fec': 'rs', 'description': 'ARISTA13T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet104': {'lanes': '32,33,34,35', 'alias': 'Ethernet14/1', 'index': '14', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth104-ASIC0', 'fec': 'rs', 'description': 'ARISTA15T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet112': {'lanes': '24,25,26,27', 'alias': 'Ethernet15/1', 'index': '15', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth112-ASIC0', 'fec': 'rs', 'description': 'ARISTA15T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet120': {'lanes': '16,17,18,19', 'alias': 'Ethernet16/1', 'index': '16', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth120-ASIC0', 'fec': 'rs', 'description': 'ARISTA17T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet128': {'lanes': '8,9,10,11', 'alias': 'Ethernet17/1', 'index': '17', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth128-ASIC0', 'fec': 'rs', 'description': 'ARISTA18T3:Ethernet1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet136': {'lanes': '0,1,2,3', 'alias': 'Ethernet18/1', 'index': '18', 'role': 'Ext', 'speed': '100000', 'asic_port_name': 'Eth136-ASIC0', 'fec': 'rs', 'description': 'ARISTA18T3:Ethernet2', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}, " + "'Ethernet-Rec0': {'lanes': '221', 'alias': 'Recirc0/0', 'index': '37', 'role': 'Rec', 'speed': '400000', 'asic_port_name': 'Rcy0-ASIC0', 'description': 'Recirc0/0', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}," + "'Ethernet-IB0': {'lanes': '222', 'alias': 'Recirc0/1', 'index': '38', 'role': 'Inb', 'speed': '400000', 'asic_port_name': 'Rcy1-ASIC0', 'description': 'Recirc0/1', 'mtu': '9100', 'tpid': '0x8100', 'pfc_asym': 'off', 'admin_status': 'up'}}" + ) + ) + diff --git a/src/sonic-config-engine/tests/voq-sample-400g-port-config.ini b/src/sonic-config-engine/tests/voq-sample-400g-port-config.ini new file mode 100644 index 000000000000..f86cdb335ed8 --- /dev/null +++ b/src/sonic-config-engine/tests/voq-sample-400g-port-config.ini @@ -0,0 +1,21 @@ +# name lanes alias index role speed asic_port_name +Ethernet0 72,73,74,75,76,77,78,79 Ethernet1/1 1 Ext 400000 Eth0-ASIC0 +Ethernet8 80,81,82,83,84,85,86,87 Ethernet2/1 2 Ext 400000 Eth8-ASIC0 +Ethernet16 88,89,90,91,92,93,94,95 Ethernet3/1 3 Ext 400000 Eth16-ASIC0 +Ethernet24 96,97,98,99,100,101,102,103 Ethernet4/1 4 Ext 400000 Eth24-ASIC0 +Ethernet32 104,105,106,107,108,109,110,111 Ethernet5/1 5 Ext 400000 Eth32-ASIC0 +Ethernet40 112,113,114,115,116,117,118,119 Ethernet6/1 6 Ext 400000 Eth40-ASIC0 +Ethernet48 120,121,122,123,124,125,126,127 Ethernet7/1 7 Ext 400000 Eth48-ASIC0 +Ethernet56 128,129,130,131,132,133,134,135 Ethernet8/1 8 Ext 400000 Eth56-ASIC0 +Ethernet64 136,137,138,139,140,141,142,143 Ethernet9/1 9 Ext 400000 Eth64-ASIC0 +Ethernet72 64,65,66,67,68,69,70,71 Ethernet10/1 10 Ext 400000 Eth72-ASIC0 +Ethernet80 56,57,58,59,60,61,62,63 Ethernet11/1 11 Ext 400000 Eth80-ASIC0 +Ethernet88 48,49,50,51,52,53,54,55 Ethernet12/1 12 Ext 400000 Eth88-ASIC0 +Ethernet96 40,41,42,43,44,45,46,47 Ethernet13/1 13 Ext 400000 Eth96-ASIC0 +Ethernet104 32,33,34,35,36,37,38,39 Ethernet14/1 14 Ext 400000 Eth104-ASIC0 +Ethernet112 24,25,26,27,28,29,30,31 Ethernet15/1 15 Ext 400000 Eth112-ASIC0 +Ethernet120 16,17,18,19,20,21,22,23 Ethernet16/1 16 Ext 400000 Eth120-ASIC0 +Ethernet128 8,9,10,11,12,13,14,15 Ethernet17/1 17 Ext 400000 Eth128-ASIC0 +Ethernet136 0,1,2,3,4,5,6,7 Ethernet18/1 18 Ext 400000 Eth136-ASIC0 +Ethernet-Rec0 221 Recirc0/0 37 Rec 400000 Rcy0-ASIC0 +Ethernet-IB0 222 Recirc0/1 38 Inb 400000 Rcy1-ASIC0 diff --git a/src/sonic-config-engine/tests/voq-sample-masic-graph.xml b/src/sonic-config-engine/tests/voq-sample-masic-graph.xml new file mode 100644 index 000000000000..cda6c1a6a3bf --- /dev/null +++ b/src/sonic-config-engine/tests/voq-sample-masic-graph.xml @@ -0,0 +1,3903 @@ + + + + + + false + str2-sonic-lc5-1 + 10.0.0.0 + ARISTA01T3 + 10.0.0.1 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.0 + ARISTA01T3 + 10.0.0.1 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::1 + ARISTA01T3 + FC00::2 + 1 + 10 + 3 + + + ASIC0 + FC00::1 + ARISTA01T3 + FC00::2 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.4 + ARISTA03T3 + 10.0.0.5 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.4 + ARISTA03T3 + 10.0.0.5 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::9 + ARISTA03T3 + FC00::A + 1 + 10 + 3 + + + ASIC0 + FC00::9 + ARISTA03T3 + FC00::A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.8 + ARISTA05T3 + 10.0.0.9 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.8 + ARISTA05T3 + 10.0.0.9 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::11 + ARISTA05T3 + FC00::12 + 1 + 10 + 3 + + + ASIC0 + FC00::11 + ARISTA05T3 + FC00::12 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.12 + ARISTA07T3 + 10.0.0.13 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.12 + ARISTA07T3 + 10.0.0.13 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::19 + ARISTA07T3 + FC00::1A + 1 + 10 + 3 + + + ASIC0 + FC00::19 + ARISTA07T3 + FC00::1A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.16 + ARISTA09T3 + 10.0.0.17 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.16 + ARISTA09T3 + 10.0.0.17 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::21 + ARISTA09T3 + FC00::22 + 1 + 10 + 3 + + + ASIC0 + FC00::21 + ARISTA09T3 + FC00::22 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.20 + ARISTA11T3 + 10.0.0.21 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.20 + ARISTA11T3 + 10.0.0.21 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::29 + ARISTA11T3 + FC00::2A + 1 + 10 + 3 + + + ASIC0 + FC00::29 + ARISTA11T3 + FC00::2A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.32 + ARISTA13T3 + 10.0.0.33 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.32 + ARISTA13T3 + 10.0.0.33 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::41 + ARISTA13T3 + FC00::42 + 1 + 10 + 3 + + + ASIC0 + FC00::41 + ARISTA13T3 + FC00::42 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.28 + ARISTA15T3 + 10.0.0.29 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.28 + ARISTA15T3 + 10.0.0.29 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::39 + ARISTA15T3 + FC00::3A + 1 + 10 + 3 + + + ASIC0 + FC00::39 + ARISTA15T3 + FC00::3A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.34 + ARISTA17T3 + 10.0.0.35 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.34 + ARISTA17T3 + 10.0.0.35 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::45 + ARISTA17T3 + FC00::46 + 1 + 10 + 3 + + + ASIC0 + FC00::45 + ARISTA17T3 + FC00::46 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.24 + ARISTA18T3 + 10.0.0.25 + 1 + 10 + 3 + + + false + ASIC0 + 10.0.0.24 + ARISTA18T3 + 10.0.0.25 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::31 + ARISTA18T3 + FC00::32 + 1 + 10 + 3 + + + ASIC0 + FC00::31 + ARISTA18T3 + FC00::32 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.36 + ARISTA19T3 + 10.0.0.37 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.36 + ARISTA19T3 + 10.0.0.37 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::49 + ARISTA19T3 + FC00::4A + 1 + 10 + 3 + + + ASIC1 + FC00::49 + ARISTA19T3 + FC00::4A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.38 + ARISTA20T3 + 10.0.0.39 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.38 + ARISTA20T3 + 10.0.0.39 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::4D + ARISTA20T3 + FC00::4E + 1 + 10 + 3 + + + ASIC1 + FC00::4D + ARISTA20T3 + FC00::4E + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.40 + ARISTA21T3 + 10.0.0.41 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.40 + ARISTA21T3 + 10.0.0.41 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::51 + ARISTA21T3 + FC00::52 + 1 + 10 + 3 + + + ASIC1 + FC00::51 + ARISTA21T3 + FC00::52 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.42 + ARISTA22T3 + 10.0.0.43 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.42 + ARISTA22T3 + 10.0.0.43 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::55 + ARISTA22T3 + FC00::56 + 1 + 10 + 3 + + + ASIC1 + FC00::55 + ARISTA22T3 + FC00::56 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.44 + ARISTA23T3 + 10.0.0.45 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.44 + ARISTA23T3 + 10.0.0.45 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::59 + ARISTA23T3 + FC00::5A + 1 + 10 + 3 + + + ASIC1 + FC00::59 + ARISTA23T3 + FC00::5A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.46 + ARISTA24T3 + 10.0.0.47 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.46 + ARISTA24T3 + 10.0.0.47 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::5D + ARISTA24T3 + FC00::5E + 1 + 10 + 3 + + + ASIC1 + FC00::5D + ARISTA24T3 + FC00::5E + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.48 + ARISTA25T3 + 10.0.0.49 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.48 + ARISTA25T3 + 10.0.0.49 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::61 + ARISTA25T3 + FC00::62 + 1 + 10 + 3 + + + ASIC1 + FC00::61 + ARISTA25T3 + FC00::62 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.50 + ARISTA26T3 + 10.0.0.51 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.50 + ARISTA26T3 + 10.0.0.51 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::65 + ARISTA26T3 + FC00::66 + 1 + 10 + 3 + + + ASIC1 + FC00::65 + ARISTA26T3 + FC00::66 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.52 + ARISTA27T3 + 10.0.0.53 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.52 + ARISTA27T3 + 10.0.0.53 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::69 + ARISTA27T3 + FC00::6A + 1 + 10 + 3 + + + ASIC1 + FC00::69 + ARISTA27T3 + FC00::6A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.54 + ARISTA28T3 + 10.0.0.55 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.54 + ARISTA28T3 + 10.0.0.55 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::6D + ARISTA28T3 + FC00::6E + 1 + 10 + 3 + + + ASIC1 + FC00::6D + ARISTA28T3 + FC00::6E + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.56 + ARISTA29T3 + 10.0.0.57 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.56 + ARISTA29T3 + 10.0.0.57 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::71 + ARISTA29T3 + FC00::72 + 1 + 10 + 3 + + + ASIC1 + FC00::71 + ARISTA29T3 + FC00::72 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.58 + ARISTA30T3 + 10.0.0.59 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.58 + ARISTA30T3 + 10.0.0.59 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::75 + ARISTA30T3 + FC00::76 + 1 + 10 + 3 + + + ASIC1 + FC00::75 + ARISTA30T3 + FC00::76 + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.60 + ARISTA31T3 + 10.0.0.61 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.60 + ARISTA31T3 + 10.0.0.61 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::79 + ARISTA31T3 + FC00::7A + 1 + 10 + 3 + + + ASIC1 + FC00::79 + ARISTA31T3 + FC00::7A + 1 + 10 + 3 + + + false + str2-sonic-lc5-1 + 10.0.0.62 + ARISTA32T3 + 10.0.0.63 + 1 + 10 + 3 + + + false + ASIC1 + 10.0.0.62 + ARISTA32T3 + 10.0.0.63 + 1 + 10 + 3 + + + str2-sonic-lc5-1 + FC00::7D + ARISTA32T3 + FC00::7E + 1 + 10 + 3 + + + ASIC1 + FC00::7D + ARISTA32T3 + FC00::7E + 1 + 10 + 3 + + + + + ASIC0 + ASIC1 + 3.3.3.2 + 3.3.3.3 + 1 + 0 + 0 + voq + + + ASIC0 + ASIC1 + 3333::3:2 + 3333::3:3 + 1 + 0 + 0 + voq + + + ASIC0 + str2-sonic-lc3-1 + 3.3.3.2 + 3.3.3.1 + 1 + 0 + 0 + voq + + + ASIC0 + str2-sonic-lc3-1 + 3333::3:2 + 3333::3:1 + 1 + 0 + 0 + voq + + + ASIC0 + str2-sonic-lc7-1 + 3.3.3.2 + 3.3.3.5 + 1 + 0 + 0 + voq + + + ASIC0 + str2-sonic-lc7-1 + 3333::3:2 + 3333::3:5 + 1 + 0 + 0 + voq + + + ASIC1 + ASIC0 + 3.3.3.3 + 3.3.3.2 + 1 + 0 + 0 + voq + + + ASIC1 + ASIC0 + 3333::3:3 + 3333::3:2 + 1 + 0 + 0 + voq + + + ASIC1 + str2-sonic-lc3-1 + 3.3.3.3 + 3.3.3.1 + 1 + 0 + 0 + voq + + + ASIC1 + str2-sonic-lc3-1 + 3333::3:3 + 3333::3:1 + 1 + 0 + 0 + voq + + + ASIC1 + str2-sonic-lc7-1 + 3.3.3.3 + 3.3.3.5 + 1 + 0 + 0 + voq + + + ASIC1 + str2-sonic-lc7-1 + 3333::3:3 + 3333::3:5 + 1 + 0 + 0 + voq + + + + + 65100 + str2-sonic-lc5-1 + + +
10.0.0.1
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.17
+ + + +
+ +
10.0.0.21
+ + + +
+ +
10.0.0.33
+ + + +
+ +
10.0.0.29
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.25
+ + + +
+ +
10.0.0.37
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+
+ +
+ + 65200 + ARISTA01T3 + + + + 65200 + ARISTA03T3 + + + + 65200 + ARISTA05T3 + + + + 65200 + ARISTA07T3 + + + + 65200 + ARISTA09T3 + + + + 65200 + ARISTA11T3 + + + + 65200 + ARISTA13T3 + + + + 65200 + ARISTA15T3 + + + + 65200 + ARISTA17T3 + + + + 65200 + ARISTA18T3 + + + + 65200 + ARISTA19T3 + + + + 65200 + ARISTA20T3 + + + + 65200 + ARISTA21T3 + + + + 65200 + ARISTA22T3 + + + + 65200 + ARISTA23T3 + + + + 65200 + ARISTA24T3 + + + + 65200 + ARISTA25T3 + + + + 65200 + ARISTA26T3 + + + + 65200 + ARISTA27T3 + + + + 65200 + ARISTA28T3 + + + + 65200 + ARISTA29T3 + + + + 65200 + ARISTA30T3 + + + + 65200 + ARISTA31T3 + + + + 65200 + ARISTA32T3 + + + + 65100 + ASIC1 + + +
10.0.0.37
+ + + +
+ +
10.0.0.39
+ + + +
+ +
10.0.0.41
+ + + +
+ +
10.0.0.43
+ + + +
+ +
10.0.0.45
+ + + +
+ +
10.0.0.47
+ + + +
+ +
10.0.0.49
+ + + +
+ +
10.0.0.51
+ + + +
+ +
10.0.0.53
+ + + +
+ +
10.0.0.55
+ + + +
+ +
10.0.0.57
+ + + +
+ +
10.0.0.59
+ + + +
+ +
10.0.0.61
+ + + +
+ +
10.0.0.63
+ + + +
+ +
3.3.3.2/32
+ + + +
+ +
3.3.3.1/32
+ + + +
+ +
3.3.3.5/32
+ + + +
+
+ +
+ + 65100 + ASIC0 + + +
10.0.0.1
+ + + +
+ +
10.0.0.5
+ + + +
+ +
10.0.0.9
+ + + +
+ +
10.0.0.13
+ + + +
+ +
10.0.0.17
+ + + +
+ +
10.0.0.21
+ + + +
+ +
10.0.0.33
+ + + +
+ +
10.0.0.29
+ + + +
+ +
10.0.0.35
+ + + +
+ +
10.0.0.25
+ + + +
+ +
3.3.3.3/32
+ + + +
+ +
3.3.3.1/32
+ + + +
+ +
3.3.3.5/32
+ + + +
+
+ +
+ + 65100 + str2-sonic-lc3-1 + + + + 65100 + str2-sonic-lc7-1 + + +
+
+ + + + + + HostIP + Loopback0 + + 10.1.0.1/32 + + 10.1.0.1/32 + + + HostIP1 + Loopback0 + + FC00:10::1/128 + + FC00:10::1/128 + + + + + HostIP + eth0 + + 10.3.147.27/23 + + 10.3.147.27/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + + str2-sonic-lc5-1 + + + PortChannel102 + Ethernet1/1;Ethernet2/1 + + + + PortChannel104 + Ethernet3/1;Ethernet4/1 + + + + PortChannel106 + Ethernet5/1;Ethernet6/1 + + + + PortChannel108 + Ethernet7/1;Ethernet8/1 + + + + PortChannel1010 + Ethernet9/1;Ethernet10/1 + + + + PortChannel1012 + Ethernet11/1;Ethernet12/1 + + + + PortChannel1016 + Ethernet14/1;Ethernet15/1 + + + + PortChannel1020 + Ethernet17/1;Ethernet18/1 + + + + + + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel104 + 10.0.0.4/31 + + + + PortChannel104 + FC00::9/126 + + + + PortChannel106 + 10.0.0.8/31 + + + + PortChannel106 + FC00::11/126 + + + + PortChannel108 + 10.0.0.12/31 + + + + PortChannel108 + FC00::19/126 + + + + PortChannel1010 + 10.0.0.16/31 + + + + PortChannel1010 + FC00::21/126 + + + + PortChannel1012 + 10.0.0.20/31 + + + + PortChannel1012 + FC00::29/126 + + + + Ethernet13/1 + 10.0.0.32/31 + + + + Ethernet13/1 + FC00::41/126 + + + + PortChannel1016 + 10.0.0.28/31 + + + + PortChannel1016 + FC00::39/126 + + + + Ethernet16/1 + 10.0.0.34/31 + + + + Ethernet16/1 + FC00::45/126 + + + + PortChannel1020 + 10.0.0.24/31 + + + + PortChannel1020 + FC00::31/126 + + + + Ethernet19/1 + 10.0.0.36/31 + + + + Ethernet19/1 + FC00::49/126 + + + + Ethernet20/1 + 10.0.0.38/31 + + + + Ethernet20/1 + FC00::4D/126 + + + + Ethernet21/1 + 10.0.0.40/31 + + + + Ethernet21/1 + FC00::51/126 + + + + Ethernet22/1 + 10.0.0.42/31 + + + + Ethernet22/1 + FC00::55/126 + + + + Ethernet23/1 + 10.0.0.44/31 + + + + Ethernet23/1 + FC00::59/126 + + + + Ethernet24/1 + 10.0.0.46/31 + + + + Ethernet24/1 + FC00::5D/126 + + + + Ethernet25/1 + 10.0.0.48/31 + + + + Ethernet25/1 + FC00::61/126 + + + + Ethernet26/1 + 10.0.0.50/31 + + + + Ethernet26/1 + FC00::65/126 + + + + Ethernet27/1 + 10.0.0.52/31 + + + + Ethernet27/1 + FC00::69/126 + + + + Ethernet28/1 + 10.0.0.54/31 + + + + Ethernet28/1 + FC00::6D/126 + + + + Ethernet29/1 + 10.0.0.56/31 + + + + Ethernet29/1 + FC00::71/126 + + + + Ethernet30/1 + 10.0.0.58/31 + + + + Ethernet30/1 + FC00::75/126 + + + + Ethernet31/1 + 10.0.0.60/31 + + + + Ethernet31/1 + FC00::79/126 + + + + Ethernet32/1 + 10.0.0.62/31 + + + + Ethernet32/1 + FC00::7D/126 + + + + + + NTP_ACL + NTP + NTP + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel102;PortChannel104;PortChannel106;PortChannel108;PortChannel1010;PortChannel1012;PortChannel1016;PortChannel1020;Ethernet13/1;Ethernet16/1;Ethernet19/1;Ethernet20/1;Ethernet21/1;Ethernet22/1;Ethernet23/1;Ethernet24/1;Ethernet25/1;Ethernet26/1;Ethernet27/1;Ethernet28/1;Ethernet29/1;Ethernet30/1;Ethernet31/1;Ethernet32/1 + DataAcl + DataPlane + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.1/32 + + 10.1.0.1/32 + + + HostIP1 + Loopback0 + + FC00:10::1/128 + + FC00:10::1/128 + + + HostIP1 + Loopback4096 + + 192.0.0.3/32 + + 192.0.0.3/32 + + + HostIP1 + Loopback4096 + + 2603:10e2:400::3/128 + + 2603:10e2:400::3/128 + + + + + HostIP + eth0 + + 10.3.147.27/23 + + 10.3.147.27/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + Ethernet-IB1 + port + 3.3.3.3/32 + + + Ethernet-IB1 + port + 3333::3:3/128 + + + + + + ASIC1 + + + + + + + Eth0-ASIC1 + 10.0.0.36/31 + + + + Eth0-ASIC1 + FC00::49/126 + + + + Eth8-ASIC1 + 10.0.0.38/31 + + + + Eth8-ASIC1 + FC00::4D/126 + + + + Eth16-ASIC1 + 10.0.0.40/31 + + + + Eth16-ASIC1 + FC00::51/126 + + + + Eth24-ASIC1 + 10.0.0.42/31 + + + + Eth24-ASIC1 + FC00::55/126 + + + + Eth32-ASIC1 + 10.0.0.44/31 + + + + Eth32-ASIC1 + FC00::59/126 + + + + Eth40-ASIC1 + 10.0.0.46/31 + + + + Eth40-ASIC1 + FC00::5D/126 + + + + Eth48-ASIC1 + 10.0.0.48/31 + + + + Eth48-ASIC1 + FC00::61/126 + + + + Eth56-ASIC1 + 10.0.0.50/31 + + + + Eth56-ASIC1 + FC00::65/126 + + + + Eth64-ASIC1 + 10.0.0.52/31 + + + + Eth64-ASIC1 + FC00::69/126 + + + + Eth72-ASIC1 + 10.0.0.54/31 + + + + Eth72-ASIC1 + FC00::6D/126 + + + + Eth80-ASIC1 + 10.0.0.56/31 + + + + Eth80-ASIC1 + FC00::71/126 + + + + Eth88-ASIC1 + 10.0.0.58/31 + + + + Eth88-ASIC1 + FC00::75/126 + + + + Eth96-ASIC1 + 10.0.0.60/31 + + + + Eth96-ASIC1 + FC00::79/126 + + + + Eth104-ASIC1 + 10.0.0.62/31 + + + + Eth104-ASIC1 + FC00::7D/126 + + + + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + Eth0-ASIC1;Eth8-ASIC1;Eth16-ASIC1;Eth24-ASIC1;Eth32-ASIC1;Eth40-ASIC1;Eth48-ASIC1;Eth56-ASIC1;Eth64-ASIC1;Eth72-ASIC1;Eth80-ASIC1;Eth88-ASIC1;Eth96-ASIC1;Eth104-ASIC1 + DataAcl + DataPlane + + + + + + + + + + HostIP + Loopback0 + + 10.1.0.1/32 + + 10.1.0.1/32 + + + HostIP1 + Loopback0 + + FC00:10::1/128 + + FC00:10::1/128 + + + HostIP1 + Loopback4096 + + 192.0.0.2/32 + + 192.0.0.2/32 + + + HostIP1 + Loopback4096 + + 2603:10e2:400::2/128 + + 2603:10e2:400::2/128 + + + + + HostIP + eth0 + + 10.3.147.27/23 + + 10.3.147.27/23 + + + V6HostIP + eth0 + + FC00:2::32/64 + + FC00:2::32/64 + + + + + + Ethernet-IB0 + port + 3.3.3.2/32 + + + Ethernet-IB0 + port + 3333::3:2/128 + + + + + + ASIC0 + + + PortChannel102 + Eth0-ASIC0;Eth8-ASIC0 + + + + PortChannel104 + Eth16-ASIC0;Eth24-ASIC0 + + + + PortChannel106 + Eth32-ASIC0;Eth40-ASIC0 + + + + PortChannel108 + Eth48-ASIC0;Eth56-ASIC0 + + + + PortChannel1010 + Eth64-ASIC0;Eth72-ASIC0 + + + + PortChannel1012 + Eth80-ASIC0;Eth88-ASIC0 + + + + PortChannel1016 + Eth104-ASIC0;Eth112-ASIC0 + + + + PortChannel1020 + Eth128-ASIC0;Eth136-ASIC0 + + + + + + + + PortChannel102 + 10.0.0.0/31 + + + + PortChannel102 + FC00::1/126 + + + + PortChannel104 + 10.0.0.4/31 + + + + PortChannel104 + FC00::9/126 + + + + PortChannel106 + 10.0.0.8/31 + + + + PortChannel106 + FC00::11/126 + + + + PortChannel108 + 10.0.0.12/31 + + + + PortChannel108 + FC00::19/126 + + + + PortChannel1010 + 10.0.0.16/31 + + + + PortChannel1010 + FC00::21/126 + + + + PortChannel1012 + 10.0.0.20/31 + + + + PortChannel1012 + FC00::29/126 + + + + Eth96-ASIC0 + 10.0.0.32/31 + + + + Eth96-ASIC0 + FC00::41/126 + + + + PortChannel1016 + 10.0.0.28/31 + + + + PortChannel1016 + FC00::39/126 + + + + Eth120-ASIC0 + 10.0.0.34/31 + + + + Eth120-ASIC0 + FC00::45/126 + + + + PortChannel1020 + 10.0.0.24/31 + + + + PortChannel1020 + FC00::31/126 + + + + + + SNMP_ACL + SNMP + SNMP + + + ERSPAN + Everflow + Everflow + + + ERSPANV6 + EverflowV6 + EverflowV6 + + + VTY_LINE + ssh-only + SSH + + + PortChannel102;PortChannel104;PortChannel106;PortChannel108;PortChannel1010;PortChannel1012;PortChannel1016;PortChannel1020;Eth0-ASIC0;Eth16-ASIC0;Eth32-ASIC0;Eth48-ASIC0;Eth64-ASIC0;Eth80-ASIC0;Eth96-ASIC0;Eth104-ASIC0;Eth120-ASIC0;Eth128-ASIC0 + DataAcl + DataPlane + + + + + + + + + + DeviceInterfaceLink + ARISTA01T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet1/1 + 100000 + + + DeviceInterfaceLink + ARISTA01T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet2/1 + 100000 + + + DeviceInterfaceLink + ARISTA03T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet3/1 + 100000 + + + DeviceInterfaceLink + ARISTA03T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet4/1 + 400000 + + + DeviceInterfaceLink + ARISTA05T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet5/1 + 400000 + + + DeviceInterfaceLink + ARISTA05T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet6/1 + 400000 + + + DeviceInterfaceLink + ARISTA07T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet7/1 + 400000 + + + DeviceInterfaceLink + ARISTA07T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet8/1 + 100000 + + + DeviceInterfaceLink + ARISTA09T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet9/1 + 100000 + + + DeviceInterfaceLink + ARISTA09T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet10/1 + 100000 + + + DeviceInterfaceLink + ARISTA11T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet11/1 + 100000 + + + DeviceInterfaceLink + ARISTA11T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet12/1 + 100000 + + + DeviceInterfaceLink + ARISTA13T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet13/1 + 100000 + + + DeviceInterfaceLink + ARISTA15T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet14/1 + 100000 + + + DeviceInterfaceLink + ARISTA15T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet15/1 + 100000 + + + DeviceInterfaceLink + ARISTA17T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet16/1 + 100000 + + + DeviceInterfaceLink + ARISTA18T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet17/1 + 100000 + + + DeviceInterfaceLink + ARISTA18T3 + Ethernet2 + str2-sonic-lc5-1 + Ethernet18/1 + 100000 + + + DeviceInterfaceLink + ARISTA19T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet19/1 + 100000 + + + DeviceInterfaceLink + ARISTA20T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet20/1 + 100000 + + + DeviceInterfaceLink + ARISTA21T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet21/1 + 100000 + + + DeviceInterfaceLink + ARISTA22T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet22/1 + 100000 + + + DeviceInterfaceLink + ARISTA23T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet23/1 + 100000 + + + DeviceInterfaceLink + ARISTA24T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet24/1 + 100000 + + + DeviceInterfaceLink + ARISTA25T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet25/1 + 100000 + + + DeviceInterfaceLink + ARISTA26T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet26/1 + 100000 + + + DeviceInterfaceLink + ARISTA27T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet27/1 + 100000 + + + DeviceInterfaceLink + ARISTA28T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet28/1 + 100000 + + + DeviceInterfaceLink + ARISTA29T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet29/1 + 100000 + + + DeviceInterfaceLink + ARISTA30T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet30/1 + 100000 + + + DeviceInterfaceLink + ARISTA31T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet31/1 + 100000 + + + DeviceInterfaceLink + ARISTA32T3 + Ethernet1 + str2-sonic-lc5-1 + Ethernet32/1 + 100000 + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth0-ASIC0 + true + str2-sonic-lc5-1 + Ethernet1/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth8-ASIC0 + true + str2-sonic-lc5-1 + Ethernet2/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth16-ASIC0 + true + str2-sonic-lc5-1 + Ethernet3/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth24-ASIC0 + true + str2-sonic-lc5-1 + Ethernet4/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth32-ASIC0 + true + str2-sonic-lc5-1 + Ethernet5/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth40-ASIC0 + true + str2-sonic-lc5-1 + Ethernet6/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth48-ASIC0 + true + str2-sonic-lc5-1 + Ethernet7/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth56-ASIC0 + true + str2-sonic-lc5-1 + Ethernet8/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth64-ASIC0 + true + str2-sonic-lc5-1 + Ethernet9/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth72-ASIC0 + true + str2-sonic-lc5-1 + Ethernet10/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth80-ASIC0 + true + str2-sonic-lc5-1 + Ethernet11/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth88-ASIC0 + true + str2-sonic-lc5-1 + Ethernet12/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth96-ASIC0 + true + str2-sonic-lc5-1 + Ethernet13/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth104-ASIC0 + true + str2-sonic-lc5-1 + Ethernet14/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth112-ASIC0 + true + str2-sonic-lc5-1 + Ethernet15/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth120-ASIC0 + true + str2-sonic-lc5-1 + Ethernet16/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth128-ASIC0 + true + str2-sonic-lc5-1 + Ethernet17/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC0 + Eth136-ASIC0 + true + str2-sonic-lc5-1 + Ethernet18/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth0-ASIC1 + true + str2-sonic-lc5-1 + Ethernet19/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth8-ASIC1 + true + str2-sonic-lc5-1 + Ethernet20/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth16-ASIC1 + true + str2-sonic-lc5-1 + Ethernet21/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth24-ASIC1 + true + str2-sonic-lc5-1 + Ethernet22/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth32-ASIC1 + true + str2-sonic-lc5-1 + Ethernet23/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth40-ASIC1 + true + str2-sonic-lc5-1 + Ethernet24/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth48-ASIC1 + true + str2-sonic-lc5-1 + Ethernet25/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth56-ASIC1 + true + str2-sonic-lc5-1 + Ethernet26/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth64-ASIC1 + true + str2-sonic-lc5-1 + Ethernet27/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth72-ASIC1 + true + str2-sonic-lc5-1 + Ethernet28/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth80-ASIC1 + true + str2-sonic-lc5-1 + Ethernet29/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth88-ASIC1 + true + str2-sonic-lc5-1 + Ethernet30/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth96-ASIC1 + true + str2-sonic-lc5-1 + Ethernet31/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth104-ASIC1 + true + str2-sonic-lc5-1 + Ethernet32/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth112-ASIC1 + true + str2-sonic-lc5-1 + Ethernet33/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth120-ASIC1 + true + str2-sonic-lc5-1 + Ethernet34/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth128-ASIC1 + true + str2-sonic-lc5-1 + Ethernet35/1 + true + + + DeviceInterfaceLink + 400000 + true + ASIC1 + Eth136-ASIC1 + true + str2-sonic-lc5-1 + Ethernet36/1 + true + + + + + str2-sonic-lc5-1 + Sonic-linecard-masic-hwsku + + 10.3.147.27 + + + + ARISTA05T3 + + 172.16.145.34 + + Arista-VM + + + ARISTA11T3 + + 172.16.145.37 + + Arista-VM + + + ARISTA17T3 + + 172.16.145.40 + + Arista-VM + + + ARISTA21T3 + + 172.16.145.44 + + Arista-VM + + + ARISTA19T3 + + 172.16.145.42 + + Arista-VM + + + ARISTA09T3 + + 172.16.145.36 + + Arista-VM + + + ARISTA20T3 + + 172.16.145.43 + + Arista-VM + + + ARISTA03T3 + + 172.16.145.33 + + Arista-VM + + + ARISTA07T3 + + 172.16.145.35 + + Arista-VM + + + ARISTA01T3 + + 172.16.145.32 + + Arista-VM + + + ARISTA27T3 + + 172.16.145.50 + + Arista-VM + + + ARISTA26T3 + + 172.16.145.49 + + Arista-VM + + + ARISTA32T3 + + 172.16.145.55 + + Arista-VM + + + ARISTA23T3 + + 172.16.145.46 + + Arista-VM + + + ARISTA25T3 + + 172.16.145.48 + + Arista-VM + + + ARISTA24T3 + + 172.16.145.47 + + Arista-VM + + + ARISTA22T3 + + 172.16.145.45 + + Arista-VM + + + ARISTA28T3 + + 172.16.145.51 + + Arista-VM + + + ARISTA30T3 + + 172.16.145.53 + + Arista-VM + + + ARISTA18T3 + + 172.16.145.41 + + Arista-VM + + + ARISTA29T3 + + 172.16.145.52 + + Arista-VM + + + ARISTA15T3 + + 172.16.145.39 + + Arista-VM + + + ARISTA13T3 + + 172.16.145.38 + + Arista-VM + + + ARISTA31T3 + + 172.16.145.54 + + Arista-VM + + + Asic +
+ 0.0.0.0/0 +
+ + ::/0 + + + + + + + + + + 0.0.0.0/0 + + + ::/0 + + + ASIC0 + Broadcom-Trident2 +
+ + Asic +
+ 0.0.0.0/0 +
+ + ::/0 + + + + + + + + + + 0.0.0.0/0 + + + ::/0 + + + ASIC1 + Broadcom-Trident2 +
+
+
+ + + true + + + DeviceInterface + + true + true + 1 + Ethernet1/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet2/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet3/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet4/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet5/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet6/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet7/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet8/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet9/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet10/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet11/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet12/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet13/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet14/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet15/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet16/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet17/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet18/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet19/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet20/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet21/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet22/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet23/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet24/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet25/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet26/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet27/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet28/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet29/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet30/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet31/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet32/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet33/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet34/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet35/1 + + false + 0 + 0 + 400000 + + + DeviceInterface + + true + true + 1 + Ethernet36/1 + + false + 0 + 0 + 400000 + + + true + 0 + Sonic-linecard-masic-hwsku + + + + + + + str2-sonic-lc5-1 + + + DeploymentId + + 1 + + + QosProfile + + Profile0 + + + DhcpResources + + 192.0.0.1;192.0.0.2;192.0.0.3;192.0.0.4;192.0.0.5;192.0.0.6;192.0.0.7;192.0.0.8;192.0.0.9;192.0.0.10;192.0.0.11;192.0.0.12;192.0.0.13;192.0.0.14;192.0.0.15;192.0.0.16;192.0.0.17;192.0.0.18;192.0.0.19;192.0.0.20;192.0.0.21;192.0.0.22;192.0.0.23;192.0.0.24;192.0.0.25;192.0.0.26;192.0.0.27;192.0.0.28;192.0.0.29;192.0.0.30;192.0.0.31;192.0.0.32;192.0.0.33;192.0.0.34;192.0.0.35;192.0.0.36;192.0.0.37;192.0.0.38;192.0.0.39;192.0.0.40;192.0.0.41;192.0.0.42;192.0.0.43;192.0.0.44;192.0.0.45;192.0.0.46;192.0.0.47;192.0.0.48 + + + NtpResources + + 10.20.8.129;10.20.8.130 + + + SnmpResources + + 10.3.145.98 + + + SyslogResources + + 10.64.246.95 + + + TacacsGroup + + Starlab + + + TacacsServer + + 100.127.20.21 + + + ForcedMgmtRoutes + + 10.3.145.98/31;10.3.145.8;100.127.20.16/28;10.3.149.170/31;40.122.216.24;13.91.48.226;10.3.145.14;10.64.246.0/24;10.3.146.0/23;10.64.5.5;10.201.148.32/28 + + + ErspanDestinationIpv4 + + 10.20.6.16 + + + SwitchType + + voq + + + MaxCores + + 16 + + + + + ASIC0 + + + SubRole + + FrontEnd + + + SwitchType + + voq + + + SwitchId + + 2 + + + MaxCores + + 16 + + + + + ASIC1 + + + SubRole + + FrontEnd + + + SwitchType + + voq + + + SwitchId + + 4 + + + MaxCores + + 16 + + + + + ASIC1 + + + DeploymentId + + 1 + + + SubRole + + FrontEnd + + + SwitchType + + voq + + + + + ASIC0 + + + DeploymentId + + 1 + + + SubRole + + FrontEnd + + + SwitchType + + voq + + + + + + + str2-sonic-lc5-1 + Sonic-linecard-masic-hwsku +
From b9dffcbaafe804f4acd7afef712b7ead81a83dff Mon Sep 17 00:00:00 2001 From: Samuel Angebault Date: Fri, 24 Feb 2023 10:08:04 -0800 Subject: [PATCH 55/57] [Arista] Disable SSD NCQ on Lodoga (#13964) Why I did it Fix similar issue seen on #13739 but only for DCS-7050CX3-32S How I did it Add a kernel parameter to tell libata to disable NCQ How to verify it The message ata2.00: FORCE: horkage modified (noncq) should appear on the dmesg. Test results using: fio --direct=1 --rw=randrw --bs=64k --ioengine=libaio --iodepth=64 --runtime=120 --numjobs=4 with NCQ READ: bw=26.1MiB/s (27.4MB/s), 26.1MiB/s-26.1MiB/s (27.4MB/s-27.4MB/s), io=3136MiB (3288MB), run=120053-120053msec WRITE: bw=26.3MiB/s (27.6MB/s), 26.3MiB/s-26.3MiB/s (27.6MB/s-27.6MB/s), io=3161MiB (3315MB), run=120053-120053msec without NCQ READ: bw=22.0MiB/s (23.1MB/s), 22.0MiB/s-22.0MiB/s (23.1MB/s-23.1MB/s), io=2647MiB (2775MB), run=120069-120069msec WRITE: bw=22.2MiB/s (23.3MB/s), 22.2MiB/s-22.2MiB/s (23.3MB/s-23.3MB/s), io=2665MiB (2795MB), run=120069-120069msec --- files/Aboot/boot0.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/files/Aboot/boot0.j2 b/files/Aboot/boot0.j2 index ca9f8fc2efc4..460fdd88fc18 100644 --- a/files/Aboot/boot0.j2 +++ b/files/Aboot/boot0.j2 @@ -525,6 +525,7 @@ write_platform_specific_cmdline() { if [ "$sid" = "Lodoga" ]; then aboot_machine=arista_7050cx3_32s cmdline_add logs_inram=on + cmdline_add libata.force=2.00:noncq fi if [ "$sid" = "Marysville" ]; then aboot_machine=arista_7050sx3_48yc8 From be6cdf087741715a87bb03ba11292eb3cb7e6335 Mon Sep 17 00:00:00 2001 From: mihirpat1 <112018033+mihirpat1@users.noreply.github.com> Date: Fri, 24 Feb 2023 10:09:12 -0800 Subject: [PATCH 56/57] [platform-daemons][platform-common] Advance submodule head (#13942) Update sonic-platform-daemons submodule head to include: 05dd3bd mihirpat1 Wed Feb 22 09:19:13 2023 -0800 Update CMIS module types for 2x100G AOC support (sonic-net/sonic-platform-daemons#339) f132d12 vdahiya12 Thu Feb 9 18:01:38 2023 -0800 [ycabled] add more coverage to ycabled; add minor name change for vendor API CLI return key-values pairs (sonic-net/sonic-platform-daemons#338) Update sonic-platform-common submodule head to include: 85c20cd mihirpat1 Wed Feb 22 09:18:20 2023 -0800 Update host electrical interface for 2x100G AOC (sonic-net/sonic-platform-common#346) Signed-off-by: Mihir Patel --- src/sonic-platform-common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sonic-platform-common b/src/sonic-platform-common index 01ef800ca959..85c20cdee265 160000 --- a/src/sonic-platform-common +++ b/src/sonic-platform-common @@ -1 +1 @@ -Subproject commit 01ef800ca9590349e2c9299bcdd339831aa0a79d +Subproject commit 85c20cdee2650f89351bf3a78053ebf58ccd9846 From f9d0f0acfae201735aa4d4cff293801a8f062809 Mon Sep 17 00:00:00 2001 From: shilongliu Date: Fri, 24 Feb 2023 08:29:17 +0000 Subject: [PATCH 57/57] update submodule sonic-linux-kernel, update patch --- .../patch/driver-hwmon-pmbus-cisco_n2200.patch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sonic-linux-kernel.patch/patch/driver-hwmon-pmbus-cisco_n2200.patch b/src/sonic-linux-kernel.patch/patch/driver-hwmon-pmbus-cisco_n2200.patch index 32fdbb92c4e5..59400fd73dc0 100644 --- a/src/sonic-linux-kernel.patch/patch/driver-hwmon-pmbus-cisco_n2200.patch +++ b/src/sonic-linux-kernel.patch/patch/driver-hwmon-pmbus-cisco_n2200.patch @@ -62,8 +62,8 @@ diff --git a/drivers/hwmon/pmbus/Makefile b/drivers/hwmon/pmbus/Makefile index edc7c315c..df9119c0d 100644 --- a/drivers/hwmon/pmbus/Makefile +++ b/drivers/hwmon/pmbus/Makefile -@@ -24,3 +24,4 @@ obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o - obj-$(CONFIG_SENSORS_XDPE122) += xdpe12284.o +@@ -36,3 +36,4 @@ obj-$(CONFIG_SENSORS_UCD9200) += ucd9200.o + obj-$(CONFIG_SENSORS_XDPE152) += xdpe152c4.o obj-$(CONFIG_SENSORS_ZL6100) += zl6100.o obj-$(CONFIG_SENSORS_DPS1900) += dps1900.o +obj-$(CONFIG_SENSORS_CISCO_N2200) += cisco_n2200.o