From 7ed5a92fc0856c0975f44d9d6d7fe5f768cfa496 Mon Sep 17 00:00:00 2001
From: michealylj1 <46735287+michealylj1@users.noreply.github.com>
Date: Thu, 18 Apr 2019 17:27:39 +0800
Subject: [PATCH] [Devices] Add new device CIG CS6436-56P (#2587)

* Add new device CIG CS6436-56P

* Delete minigraph.xml

It isn't necessary in the current system, just delete it

* Update qos.json.j2

* Update port_config.ini

Add the speed column. The cmd to show interface status as:

root@switch1:~# show interface status
  Interface            Lanes    Speed    MTU         Alias    Oper    Admin    Type    Asym PFC
-----------  ---------------  -------  -----  ------------  ------  -------  ------  ----------
  Ethernet0                8      25G   9100   Ethernet1/1      up       up     SFP         N/A
  Ethernet1                9      25G   9100   Ethernet2/1      up       up     SFP         N/A
  Ethernet2               10      25G   9100   Ethernet3/1    down     down     N/A         N/A
  Ethernet3               11      25G   9100   Ethernet4/1    down     down     N/A         N/A
  Ethernet4               12      25G   9100   Ethernet5/1    down     down     N/A         N/A
  Ethernet5               13      25G   9100   Ethernet6/1    down     down     N/A         N/A
  Ethernet6               14      25G   9100   Ethernet7/1    down     down     N/A         N/A
  Ethernet7               15      25G   9100   Ethernet8/1    down     down     N/A         N/A
  Ethernet8               16      25G   9100   Ethernet9/1    down     down     N/A         N/A
  Ethernet9               17      25G   9100  Ethernet10/1    down     down     N/A         N/A
 Ethernet10               18      25G   9100  Ethernet11/1    down     down     N/A         N/A
 Ethernet11               19      25G   9100  Ethernet12/1    down     down     N/A         N/A
 Ethernet12               20      25G   9100  Ethernet13/1    down     down     N/A         N/A
 Ethernet13               21      25G   9100  Ethernet14/1    down     down     N/A         N/A
 Ethernet14               22      25G   9100  Ethernet15/1    down     down     N/A         N/A
 Ethernet15               23      25G   9100  Ethernet16/1    down     down     N/A         N/A
 Ethernet16               32      25G   9100  Ethernet17/1    down     down     N/A         N/A
 Ethernet17               33      25G   9100  Ethernet18/1    down     down     N/A         N/A
 Ethernet18               34      25G   9100  Ethernet19/1    down     down     N/A         N/A
 Ethernet19               35      25G   9100  Ethernet20/1    down     down     N/A         N/A
 Ethernet20               40      25G   9100  Ethernet21/1    down     down     N/A         N/A
 Ethernet21               41      25G   9100  Ethernet22/1    down     down     N/A         N/A
 Ethernet22               42      25G   9100  Ethernet23/1    down     down     N/A         N/A
 Ethernet23               43      25G   9100  Ethernet24/1    down     down     N/A         N/A
 Ethernet24               48      25G   9100  Ethernet25/1    down     down     N/A         N/A
 Ethernet25               49      25G   9100  Ethernet26/1    down     down     N/A         N/A
 Ethernet26               50      25G   9100  Ethernet27/1    down     down     N/A         N/A
 Ethernet27               51      25G   9100  Ethernet28/1    down     down     N/A         N/A
 Ethernet28               56      25G   9100  Ethernet29/1    down     down     N/A         N/A
 Ethernet29               57      25G   9100  Ethernet30/1    down     down     N/A         N/A
 Ethernet30               58      25G   9100  Ethernet31/1    down     down     N/A         N/A
 Ethernet31               59      25G   9100  Ethernet32/1    down     down     N/A         N/A
 Ethernet32               64      25G   9100  Ethernet33/1    down     down     N/A         N/A
 Ethernet33               65      25G   9100  Ethernet34/1    down     down     N/A         N/A
 Ethernet34               66      25G   9100  Ethernet35/1    down     down     N/A         N/A
 Ethernet35               67      25G   9100  Ethernet36/1    down     down     N/A         N/A
 Ethernet36               68      25G   9100  Ethernet37/1    down     down     N/A         N/A
 Ethernet37               69      25G   9100  Ethernet38/1    down     down     N/A         N/A
 Ethernet38               70      25G   9100  Ethernet39/1    down     down     N/A         N/A
 Ethernet39               71      25G   9100  Ethernet40/1    down     down     N/A         N/A
 Ethernet40               72      25G   9100  Ethernet41/1    down     down     N/A         N/A
 Ethernet41               73      25G   9100  Ethernet42/1    down     down     N/A         N/A
 Ethernet42               74      25G   9100  Ethernet43/1    down     down     N/A         N/A
 Ethernet43               75      25G   9100  Ethernet44/1    down     down     N/A         N/A
 Ethernet44               76      25G   9100  Ethernet45/1    down     down     N/A         N/A
 Ethernet45               77      25G   9100  Ethernet46/1    down     down     N/A         N/A
 Ethernet46               78      25G   9100  Ethernet47/1    down     down     N/A         N/A
 Ethernet47               79      25G   9100  Ethernet48/1    down     down     N/A         N/A
 Ethernet48      84,85,86,87     100G   9100  Ethernet49/1      up       up  QSFP28         N/A
 Ethernet49      80,81,82,83     100G   9100  Ethernet50/1      up       up  QSFP28         N/A
 Ethernet50      92,93,94,95     100G   9100  Ethernet51/1    down     down     N/A         N/A
 Ethernet51      88,89,90,91     100G   9100  Ethernet52/1    down     down     N/A         N/A
 Ethernet52  108,109,110,111     100G   9100  Ethernet53/1    down     down     N/A         N/A
 Ethernet53  104,105,106,107     100G   9100  Ethernet54/1    down     down     N/A         N/A
 Ethernet54  116,117,118,119     100G   9100  Ethernet55/1    down     down     N/A         N/A
 Ethernet55  112,113,114,115     100G   9100  Ethernet56/1    down     down     N/A         N/A
root@switch1:~#
---
 .../Cig-CS6436-56P/buffers.json.j2            |  111 ++
 .../Cig-CS6436-56P/pg_profile_lookup.ini      |   17 +
 .../Cig-CS6436-56P/port_config.ini            |   57 +
 .../Cig-CS6436-56P/port_config.nps            |  702 +++++++
 .../Cig-CS6436-56P/port_config.nps.AOC.R0B    |  702 +++++++
 .../Cig-CS6436-56P/port_config.nps.DAC.R0B    |  702 +++++++
 .../Cig-CS6436-56P/qos.json.j2                |    1 +
 .../Cig-CS6436-56P/sai.profile                |    2 +
 .../cig/x86_64-cig_cs6436_56p-r0/default_sku  |    1 +
 .../x86_64-cig_cs6436_56p-r0/installer.conf   |    4 +
 .../led_proc_init.nps                         |   10 +
 .../plugins/eeprom.py                         |   21 +
 .../plugins/psuutil.py                        |   92 +
 .../plugins/sfputil.py                        |  160 ++
 .../cig/x86_64-cig_cs6436_56p-r0/sensors.conf |   13 +
 platform/nephos/one-image.mk                  |    5 +-
 platform/nephos/platform-modules-cig.mk       |   12 +
 platform/nephos/rules.mk                      |    1 +
 .../nephos/sonic-platform-modules-cig/LICENSE |   16 +
 .../sonic-platform-modules-cig/README.md      |    1 +
 .../cs6436-56p/classes/__init__.py            |    0
 .../cs6436-56p/classes/fanutil.py             |    0
 .../cs6436-56p/classes/thermalutil.py         |    0
 .../cs6436-56p/modules/Makefile               |    5 +
 .../cs6436-56p/modules/i2c-algo-lpc.h         |   97 +
 .../cs6436-56p/modules/i2c-algo-lpc2iic.h     |   48 +
 .../modules/x86-64-cig-cs6436-56p-cpld.c      | 1632 +++++++++++++++++
 .../modules/x86-64-cig-cs6436-56p-fan.c       |  451 +++++
 .../modules/x86-64-cig-cs6436-56p-led.c       |  594 ++++++
 .../modules/x86-64-cig-cs6436-56p-psu.c       |  586 ++++++
 .../modules/x86-64-cig-cs6436-56p-sfp.c       | 1454 +++++++++++++++
 .../service/cs6436-platform-init.service      |   13 +
 .../service/cs6436-platform-misc.service      |   15 +
 .../cs6436-56p/setup.py                       |   15 +
 .../cs6436-56p/utils/cig_cs6436_misc.py       |  154 ++
 .../cs6436-56p/utils/cig_cs6436_util.py       |  538 ++++++
 .../debian/changelog                          |    5 +
 .../sonic-platform-modules-cig/debian/compat  |    1 +
 .../sonic-platform-modules-cig/debian/control |   11 +
 .../sonic-platform-modules-cig/debian/rules   |   86 +
 40 files changed, 8333 insertions(+), 2 deletions(-)
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/buffers.json.j2
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/pg_profile_lookup.ini
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.ini
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.AOC.R0B
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.DAC.R0B
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/qos.json.j2
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/sai.profile
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/default_sku
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/installer.conf
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/led_proc_init.nps
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/plugins/eeprom.py
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/plugins/psuutil.py
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/plugins/sfputil.py
 create mode 100755 device/cig/x86_64-cig_cs6436_56p-r0/sensors.conf
 create mode 100644 platform/nephos/platform-modules-cig.mk
 create mode 100755 platform/nephos/sonic-platform-modules-cig/LICENSE
 create mode 100755 platform/nephos/sonic-platform-modules-cig/README.md
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/__init__.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/fanutil.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/thermalutil.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/Makefile
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc.h
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc2iic.h
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-cpld.c
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-fan.c
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-led.c
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-psu.c
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-sfp.c
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-init.service
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-misc.service
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/setup.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_misc.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_util.py
 create mode 100755 platform/nephos/sonic-platform-modules-cig/debian/changelog
 create mode 100755 platform/nephos/sonic-platform-modules-cig/debian/compat
 create mode 100755 platform/nephos/sonic-platform-modules-cig/debian/control
 create mode 100755 platform/nephos/sonic-platform-modules-cig/debian/rules

diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/buffers.json.j2 b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/buffers.json.j2
new file mode 100755
index 0000000000..2c391214fa
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/buffers.json.j2
@@ -0,0 +1,111 @@
+{# Default values which will be used if no actual configura available #}
+{% set default_cable = '40m' %}
+{% set default_speed = '10G' %}
+{% set default_ports_num = 54 -%}
+
+{# 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[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 -%}
+        {{ default_cable }}
+    {%- endif -%}
+{% endmacro %}
+
+{%- if DEVICE_METADATA is defined %}
+{%- set switch_role = DEVICE_METADATA['localhost']['type'] %}
+{%- endif -%}
+
+{# Generate list of ports if not defined #}
+{% if PORT is not defined %}
+    {% set PORT = [] %}
+    {% for port_idx in range(0,default_ports_num) %}
+        {% if PORT.append("Ethernet%d" % (port_idx)) %}{% endif %}
+    {% endfor %}
+{% 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": "20971328",
+            "type": "ingress",
+            "mode": "static"
+        },
+        "ingress_lossy_pool": {
+            "size": "20971328",
+            "type": "ingress",
+            "mode": "static"
+        },
+        "egress_lossy_pool": {
+            "size": "20971328",
+            "type": "egress",
+            "mode": "static"
+        }
+    },
+    "BUFFER_PROFILE": {
+        "ingress_lossless_profile": {
+            "pool":"[BUFFER_POOL|ingress_lossless_pool]",
+            "xon":"78400",
+            "xoff":"132160",
+            "size":"3584",
+            "static_th":"82880"
+        },
+        "ingress_lossy_profile": {
+            "pool":"[BUFFER_POOL|ingress_lossy_pool]",
+            "size":"3584",
+            "dynamic_th":"-1"
+        },
+        "egress_lossy_profile": {
+            "pool":"[BUFFER_POOL|egress_lossy_pool]",
+            "size":"3584",
+            "dynamic_th":"-4"
+        }
+    },
+    "BUFFER_PG": {
+    },
+    "BUFFER_QUEUE": {
+    }
+}
+ 
\ No newline at end of file
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/pg_profile_lookup.ini b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/pg_profile_lookup.ini
new file mode 100755
index 0000000000..d98b0eca6d
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/pg_profile_lookup.ini
@@ -0,0 +1,17 @@
+# PG lossless profiles.
+# speed cable  size    xon    xoff    threshold
+  10000  5m    3584    32256  59136   36736
+  25000  5m    3584    41216  68096   45696
+  40000  5m    3584    47488  74368   51968
+  50000  5m    3584    52864  79744   57344
+ 100000  5m    3584    78400  132160  82880
+  10000  40m   3584    32256  59136   36736
+  25000  40m   3584    41216  68096   45696
+  40000  40m   3584    47488  74368   51968
+  50000  40m   3584    52864  79744   57344
+ 100000  40m   3584    78400  132160  82880
+  10000  300m  3584    32256  65856   36736
+  25000  300m  3584    41216  84672   45696
+  40000  300m  3584    47488  101024  51968
+  50000  300m  3584    52864  113120  57344
+ 100000  300m  3584    78400  198688  82880
\ No newline at end of file
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.ini b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.ini
new file mode 100755
index 0000000000..0a25fc0a34
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.ini
@@ -0,0 +1,57 @@
+# name          lanes             alias             index          speed
+Ethernet0       8                 Ethernet1/1       0              25000
+Ethernet1       9                 Ethernet2/1       1              25000
+Ethernet2       10                Ethernet3/1       2              25000
+Ethernet3       11                Ethernet4/1       3              25000
+Ethernet4       12                Ethernet5/1       4              25000
+Ethernet5       13                Ethernet6/1       5              25000
+Ethernet6       14                Ethernet7/1       6              25000
+Ethernet7       15                Ethernet8/1       7              25000
+Ethernet8       16                Ethernet9/1       8              25000
+Ethernet9       17                Ethernet10/1      9              25000
+Ethernet10      18                Ethernet11/1      10             25000
+Ethernet11      19                Ethernet12/1      11             25000
+Ethernet12      20                Ethernet13/1      12             25000
+Ethernet13      21                Ethernet14/1      13             25000
+Ethernet14      22                Ethernet15/1      14             25000
+Ethernet15      23                Ethernet16/1      15             25000
+Ethernet16      32                Ethernet17/1      16             25000
+Ethernet17      33                Ethernet18/1      17             25000
+Ethernet18      34                Ethernet19/1      18             25000
+Ethernet19      35                Ethernet20/1      19             25000
+Ethernet20      40                Ethernet21/1      20             25000
+Ethernet21      41                Ethernet22/1      21             25000
+Ethernet22      42                Ethernet23/1      22             25000
+Ethernet23      43                Ethernet24/1      23             25000
+Ethernet24      48                Ethernet25/1      24             25000
+Ethernet25      49                Ethernet26/1      25             25000
+Ethernet26      50                Ethernet27/1      26             25000
+Ethernet27      51                Ethernet28/1      27             25000
+Ethernet28      56                Ethernet29/1      28             25000
+Ethernet29      57                Ethernet30/1      29             25000
+Ethernet30      58                Ethernet31/1      30             25000
+Ethernet31      59                Ethernet32/1      31             25000
+Ethernet32      64                Ethernet33/1      32             25000
+Ethernet33      65                Ethernet34/1      33             25000
+Ethernet34      66                Ethernet35/1      34             25000
+Ethernet35      67                Ethernet36/1      35             25000
+Ethernet36      68                Ethernet37/1      36             25000
+Ethernet37      69                Ethernet38/1      37             25000
+Ethernet38      70                Ethernet39/1      38             25000
+Ethernet39      71                Ethernet40/1      39             25000
+Ethernet40      72                Ethernet41/1      40             25000
+Ethernet41      73                Ethernet42/1      41             25000
+Ethernet42      74                Ethernet43/1      42             25000
+Ethernet43      75                Ethernet44/1      43             25000
+Ethernet44      76                Ethernet45/1      44             25000
+Ethernet45      77                Ethernet46/1      45             25000
+Ethernet46      78                Ethernet47/1      46             25000
+Ethernet47      79                Ethernet48/1      47             25000
+Ethernet48      84,85,86,87       Ethernet49/1      48             100000
+Ethernet49      80,81,82,83       Ethernet50/1      49             100000
+Ethernet50      92,93,94,95       Ethernet51/1      50             100000
+Ethernet51      88,89,90,91       Ethernet52/1      51             100000
+Ethernet52      108,109,110,111   Ethernet53/1      52             100000
+Ethernet53      104,105,106,107   Ethernet54/1      53             100000
+Ethernet54      116,117,118,119   Ethernet55/1      54             100000
+Ethernet55      112,113,114,115   Ethernet56/1      55             100000
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps
new file mode 100755
index 0000000000..857e5f1ede
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps
@@ -0,0 +1,702 @@
+init start stage unit=0 low-level
+init set port-map unit=0 port=0  eth-macro=2  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=1  eth-macro=2  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=2  eth-macro=2  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=3  eth-macro=2  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=4  eth-macro=3  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=5  eth-macro=3  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=6  eth-macro=3  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=7  eth-macro=3  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=8  eth-macro=4  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=9  eth-macro=4  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=10 eth-macro=4  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=11 eth-macro=4  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=12 eth-macro=5  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=13 eth-macro=5  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=14 eth-macro=5  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=15 eth-macro=5  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=16 eth-macro=8  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=17 eth-macro=8  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=18 eth-macro=8  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=19 eth-macro=8  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=20 eth-macro=10 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=21 eth-macro=10 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=22 eth-macro=10 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=23 eth-macro=10 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=24 eth-macro=12 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=25 eth-macro=12 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=26 eth-macro=12 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=27 eth-macro=12 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=28 eth-macro=14 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=29 eth-macro=14 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=30 eth-macro=14 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=31 eth-macro=14 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=32 eth-macro=16 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=33 eth-macro=16 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=34 eth-macro=16 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=35 eth-macro=16 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=36 eth-macro=17 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=37 eth-macro=17 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=38 eth-macro=17 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=39 eth-macro=17 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=40 eth-macro=18 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=41 eth-macro=18 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=42 eth-macro=18 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=43 eth-macro=18 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=44 eth-macro=19 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=45 eth-macro=19 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=46 eth-macro=19 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=47 eth-macro=19 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=48 eth-macro=21 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=49 eth-macro=20 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=50 eth-macro=23 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=51 eth-macro=22 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=52 eth-macro=27 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=53 eth-macro=26 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=54 eth-macro=29 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=55 eth-macro=28 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=129 eth-macro=0 lane=1 max-speed=10g active=true guarantee=true cpi=true
+init set port-map unit=0 port=130 eth-macro=0 lane=0 max-speed=10g active=true guarantee=true cpi=true init-done=true
+init start stage unit=0 task-rsrc
+init start stage unit=0 module
+init start stage unit=0 task
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=tx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.1.2.3
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=tx data=0x3.2.0.1
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=rx data=0x3.1.0.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=rx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=rx data=0x2.0.1.3
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=tx data=0x1
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=rx data=0x0.1.1.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=rx data=0x1.1.1.1
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c1 data=0x3
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c1 data=0x3
+port set property unit=0 portlist=0 speed=25g
+port set property unit=0 portlist=1 speed=25g
+port set property unit=0 portlist=2 speed=25g
+port set property unit=0 portlist=3 speed=25g
+port set property unit=0 portlist=4 speed=25g
+port set property unit=0 portlist=5 speed=25g
+port set property unit=0 portlist=6 speed=25g
+port set property unit=0 portlist=7 speed=25g
+port set property unit=0 portlist=8 speed=25g
+port set property unit=0 portlist=9 speed=25g
+port set property unit=0 portlist=10 speed=25g
+port set property unit=0 portlist=11 speed=25g
+port set property unit=0 portlist=12 speed=25g
+port set property unit=0 portlist=13 speed=25g
+port set property unit=0 portlist=14 speed=25g
+port set property unit=0 portlist=15 speed=25g
+port set property unit=0 portlist=16 speed=25g
+port set property unit=0 portlist=17 speed=25g
+port set property unit=0 portlist=18 speed=25g
+port set property unit=0 portlist=19 speed=25g
+port set property unit=0 portlist=20 speed=25g
+port set property unit=0 portlist=21 speed=25g
+port set property unit=0 portlist=22 speed=25g
+port set property unit=0 portlist=23 speed=25g
+port set property unit=0 portlist=24 speed=25g
+port set property unit=0 portlist=25 speed=25g
+port set property unit=0 portlist=26 speed=25g
+port set property unit=0 portlist=27 speed=25g
+port set property unit=0 portlist=28 speed=25g
+port set property unit=0 portlist=29 speed=25g
+port set property unit=0 portlist=30 speed=25g
+port set property unit=0 portlist=31 speed=25g
+port set property unit=0 portlist=32 speed=25g
+port set property unit=0 portlist=33 speed=25g
+port set property unit=0 portlist=34 speed=25g
+port set property unit=0 portlist=35 speed=25g
+port set property unit=0 portlist=36 speed=25g
+port set property unit=0 portlist=37 speed=25g
+port set property unit=0 portlist=38 speed=25g
+port set property unit=0 portlist=39 speed=25g
+port set property unit=0 portlist=40 speed=25g
+port set property unit=0 portlist=41 speed=25g
+port set property unit=0 portlist=42 speed=25g
+port set property unit=0 portlist=43 speed=25g
+port set property unit=0 portlist=44 speed=25g
+port set property unit=0 portlist=45 speed=25g
+port set property unit=0 portlist=46 speed=25g
+port set property unit=0 portlist=47 speed=25g
+port set property unit=0 portlist=48 speed=100g
+port set property unit=0 portlist=49 speed=100g
+port set property unit=0 portlist=50 speed=100g
+port set property unit=0 portlist=51 speed=100g
+port set property unit=0 portlist=52 speed=100g
+port set property unit=0 portlist=53 speed=100g
+port set property unit=0 portlist=54 speed=100g
+port set property unit=0 portlist=55 speed=100g
+port set property unit=0 portlist=129 speed=10g
+port set property unit=0 portlist=130 speed=1g
+port set property unit=0 portlist=0 medium-type=sr
+port set property unit=0 portlist=1 medium-type=sr
+port set property unit=0 portlist=2 medium-type=sr
+port set property unit=0 portlist=3 medium-type=sr
+port set property unit=0 portlist=4 medium-type=sr
+port set property unit=0 portlist=5 medium-type=sr
+port set property unit=0 portlist=6 medium-type=sr
+port set property unit=0 portlist=7 medium-type=sr
+port set property unit=0 portlist=8 medium-type=sr
+port set property unit=0 portlist=9 medium-type=sr
+port set property unit=0 portlist=10 medium-type=sr
+port set property unit=0 portlist=11 medium-type=sr
+port set property unit=0 portlist=12 medium-type=sr
+port set property unit=0 portlist=13 medium-type=sr
+port set property unit=0 portlist=14 medium-type=sr
+port set property unit=0 portlist=15 medium-type=sr
+port set property unit=0 portlist=16 medium-type=sr
+port set property unit=0 portlist=17 medium-type=sr
+port set property unit=0 portlist=18 medium-type=sr
+port set property unit=0 portlist=19 medium-type=sr
+port set property unit=0 portlist=20 medium-type=sr
+port set property unit=0 portlist=21 medium-type=sr
+port set property unit=0 portlist=22 medium-type=sr
+port set property unit=0 portlist=23 medium-type=sr
+port set property unit=0 portlist=24 medium-type=sr
+port set property unit=0 portlist=25 medium-type=sr
+port set property unit=0 portlist=26 medium-type=sr
+port set property unit=0 portlist=27 medium-type=sr
+port set property unit=0 portlist=28 medium-type=sr
+port set property unit=0 portlist=29 medium-type=sr
+port set property unit=0 portlist=30 medium-type=sr
+port set property unit=0 portlist=31 medium-type=sr
+port set property unit=0 portlist=32 medium-type=sr
+port set property unit=0 portlist=33 medium-type=sr
+port set property unit=0 portlist=34 medium-type=sr
+port set property unit=0 portlist=35 medium-type=sr
+port set property unit=0 portlist=36 medium-type=sr
+port set property unit=0 portlist=37 medium-type=sr
+port set property unit=0 portlist=38 medium-type=sr
+port set property unit=0 portlist=39 medium-type=sr
+port set property unit=0 portlist=40 medium-type=sr
+port set property unit=0 portlist=41 medium-type=sr
+port set property unit=0 portlist=42 medium-type=sr
+port set property unit=0 portlist=43 medium-type=sr
+port set property unit=0 portlist=44 medium-type=sr
+port set property unit=0 portlist=45 medium-type=sr
+port set property unit=0 portlist=46 medium-type=sr
+port set property unit=0 portlist=47 medium-type=sr
+port set property unit=0 portlist=48 medium-type=sr4
+port set property unit=0 portlist=49 medium-type=sr4
+port set property unit=0 portlist=50 medium-type=sr4
+port set property unit=0 portlist=51 medium-type=sr4
+port set property unit=0 portlist=52 medium-type=sr4
+port set property unit=0 portlist=53 medium-type=sr4
+port set property unit=0 portlist=54 medium-type=sr4
+port set property unit=0 portlist=55 medium-type=sr4
+port set property unit=0 portlist=129 medium-type=kr
+port set property unit=0 portlist=130 medium-type=x
+port advertise unit=0 portlist=129 speed-10g-kr
+port set property unit=0 portlist=129 an=enable
+port set property unit=0 portlist=0 admin=enable
+port set property unit=0 portlist=1 admin=enable
+port set property unit=0 portlist=2 admin=enable
+port set property unit=0 portlist=3 admin=enable
+port set property unit=0 portlist=4 admin=enable
+port set property unit=0 portlist=5 admin=enable
+port set property unit=0 portlist=6 admin=enable
+port set property unit=0 portlist=7 admin=enable
+port set property unit=0 portlist=8 admin=enable
+port set property unit=0 portlist=9 admin=enable
+port set property unit=0 portlist=10 admin=enable
+port set property unit=0 portlist=11 admin=enable
+port set property unit=0 portlist=12 admin=enable
+port set property unit=0 portlist=13 admin=enable
+port set property unit=0 portlist=14 admin=enable
+port set property unit=0 portlist=15 admin=enable
+port set property unit=0 portlist=16 admin=enable
+port set property unit=0 portlist=17 admin=enable
+port set property unit=0 portlist=18 admin=enable
+port set property unit=0 portlist=19 admin=enable
+port set property unit=0 portlist=20 admin=enable
+port set property unit=0 portlist=21 admin=enable
+port set property unit=0 portlist=22 admin=enable
+port set property unit=0 portlist=23 admin=enable
+port set property unit=0 portlist=24 admin=enable
+port set property unit=0 portlist=25 admin=enable
+port set property unit=0 portlist=26 admin=enable
+port set property unit=0 portlist=27 admin=enable
+port set property unit=0 portlist=28 admin=enable
+port set property unit=0 portlist=29 admin=enable
+port set property unit=0 portlist=30 admin=enable
+port set property unit=0 portlist=31 admin=enable
+port set property unit=0 portlist=32 admin=enable
+port set property unit=0 portlist=33 admin=enable
+port set property unit=0 portlist=34 admin=enable
+port set property unit=0 portlist=35 admin=enable
+port set property unit=0 portlist=36 admin=enable
+port set property unit=0 portlist=37 admin=enable
+port set property unit=0 portlist=38 admin=enable
+port set property unit=0 portlist=39 admin=enable
+port set property unit=0 portlist=40 admin=enable
+port set property unit=0 portlist=41 admin=enable
+port set property unit=0 portlist=42 admin=enable
+port set property unit=0 portlist=43 admin=enable
+port set property unit=0 portlist=44 admin=enable
+port set property unit=0 portlist=45 admin=enable
+port set property unit=0 portlist=46 admin=enable
+port set property unit=0 portlist=47 admin=enable
+port set property unit=0 portlist=48 admin=enable
+port set property unit=0 portlist=49 admin=enable
+port set property unit=0 portlist=50 admin=enable
+port set property unit=0 portlist=51 admin=enable
+port set property unit=0 portlist=52 admin=enable
+port set property unit=0 portlist=53 admin=enable
+port set property unit=0 portlist=54 admin=enable
+port set property unit=0 portlist=55 admin=enable
+port set property unit=0 portlist=129 admin=enable
+port set property unit=0 portlist=130 admin=enable
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.AOC.R0B b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.AOC.R0B
new file mode 100755
index 0000000000..857e5f1ede
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.AOC.R0B
@@ -0,0 +1,702 @@
+init start stage unit=0 low-level
+init set port-map unit=0 port=0  eth-macro=2  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=1  eth-macro=2  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=2  eth-macro=2  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=3  eth-macro=2  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=4  eth-macro=3  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=5  eth-macro=3  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=6  eth-macro=3  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=7  eth-macro=3  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=8  eth-macro=4  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=9  eth-macro=4  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=10 eth-macro=4  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=11 eth-macro=4  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=12 eth-macro=5  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=13 eth-macro=5  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=14 eth-macro=5  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=15 eth-macro=5  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=16 eth-macro=8  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=17 eth-macro=8  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=18 eth-macro=8  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=19 eth-macro=8  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=20 eth-macro=10 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=21 eth-macro=10 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=22 eth-macro=10 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=23 eth-macro=10 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=24 eth-macro=12 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=25 eth-macro=12 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=26 eth-macro=12 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=27 eth-macro=12 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=28 eth-macro=14 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=29 eth-macro=14 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=30 eth-macro=14 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=31 eth-macro=14 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=32 eth-macro=16 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=33 eth-macro=16 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=34 eth-macro=16 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=35 eth-macro=16 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=36 eth-macro=17 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=37 eth-macro=17 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=38 eth-macro=17 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=39 eth-macro=17 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=40 eth-macro=18 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=41 eth-macro=18 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=42 eth-macro=18 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=43 eth-macro=18 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=44 eth-macro=19 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=45 eth-macro=19 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=46 eth-macro=19 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=47 eth-macro=19 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=48 eth-macro=21 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=49 eth-macro=20 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=50 eth-macro=23 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=51 eth-macro=22 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=52 eth-macro=27 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=53 eth-macro=26 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=54 eth-macro=29 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=55 eth-macro=28 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=129 eth-macro=0 lane=1 max-speed=10g active=true guarantee=true cpi=true
+init set port-map unit=0 port=130 eth-macro=0 lane=0 max-speed=10g active=true guarantee=true cpi=true init-done=true
+init start stage unit=0 task-rsrc
+init start stage unit=0 module
+init start stage unit=0 task
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=tx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.1.2.3
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=tx data=0x3.2.0.1
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=rx data=0x3.1.0.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=rx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=rx data=0x2.0.1.3
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=tx data=0x1
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=rx data=0x0.1.1.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=rx data=0x1.1.1.1
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c1 data=0x3
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c1 data=0x3
+port set property unit=0 portlist=0 speed=25g
+port set property unit=0 portlist=1 speed=25g
+port set property unit=0 portlist=2 speed=25g
+port set property unit=0 portlist=3 speed=25g
+port set property unit=0 portlist=4 speed=25g
+port set property unit=0 portlist=5 speed=25g
+port set property unit=0 portlist=6 speed=25g
+port set property unit=0 portlist=7 speed=25g
+port set property unit=0 portlist=8 speed=25g
+port set property unit=0 portlist=9 speed=25g
+port set property unit=0 portlist=10 speed=25g
+port set property unit=0 portlist=11 speed=25g
+port set property unit=0 portlist=12 speed=25g
+port set property unit=0 portlist=13 speed=25g
+port set property unit=0 portlist=14 speed=25g
+port set property unit=0 portlist=15 speed=25g
+port set property unit=0 portlist=16 speed=25g
+port set property unit=0 portlist=17 speed=25g
+port set property unit=0 portlist=18 speed=25g
+port set property unit=0 portlist=19 speed=25g
+port set property unit=0 portlist=20 speed=25g
+port set property unit=0 portlist=21 speed=25g
+port set property unit=0 portlist=22 speed=25g
+port set property unit=0 portlist=23 speed=25g
+port set property unit=0 portlist=24 speed=25g
+port set property unit=0 portlist=25 speed=25g
+port set property unit=0 portlist=26 speed=25g
+port set property unit=0 portlist=27 speed=25g
+port set property unit=0 portlist=28 speed=25g
+port set property unit=0 portlist=29 speed=25g
+port set property unit=0 portlist=30 speed=25g
+port set property unit=0 portlist=31 speed=25g
+port set property unit=0 portlist=32 speed=25g
+port set property unit=0 portlist=33 speed=25g
+port set property unit=0 portlist=34 speed=25g
+port set property unit=0 portlist=35 speed=25g
+port set property unit=0 portlist=36 speed=25g
+port set property unit=0 portlist=37 speed=25g
+port set property unit=0 portlist=38 speed=25g
+port set property unit=0 portlist=39 speed=25g
+port set property unit=0 portlist=40 speed=25g
+port set property unit=0 portlist=41 speed=25g
+port set property unit=0 portlist=42 speed=25g
+port set property unit=0 portlist=43 speed=25g
+port set property unit=0 portlist=44 speed=25g
+port set property unit=0 portlist=45 speed=25g
+port set property unit=0 portlist=46 speed=25g
+port set property unit=0 portlist=47 speed=25g
+port set property unit=0 portlist=48 speed=100g
+port set property unit=0 portlist=49 speed=100g
+port set property unit=0 portlist=50 speed=100g
+port set property unit=0 portlist=51 speed=100g
+port set property unit=0 portlist=52 speed=100g
+port set property unit=0 portlist=53 speed=100g
+port set property unit=0 portlist=54 speed=100g
+port set property unit=0 portlist=55 speed=100g
+port set property unit=0 portlist=129 speed=10g
+port set property unit=0 portlist=130 speed=1g
+port set property unit=0 portlist=0 medium-type=sr
+port set property unit=0 portlist=1 medium-type=sr
+port set property unit=0 portlist=2 medium-type=sr
+port set property unit=0 portlist=3 medium-type=sr
+port set property unit=0 portlist=4 medium-type=sr
+port set property unit=0 portlist=5 medium-type=sr
+port set property unit=0 portlist=6 medium-type=sr
+port set property unit=0 portlist=7 medium-type=sr
+port set property unit=0 portlist=8 medium-type=sr
+port set property unit=0 portlist=9 medium-type=sr
+port set property unit=0 portlist=10 medium-type=sr
+port set property unit=0 portlist=11 medium-type=sr
+port set property unit=0 portlist=12 medium-type=sr
+port set property unit=0 portlist=13 medium-type=sr
+port set property unit=0 portlist=14 medium-type=sr
+port set property unit=0 portlist=15 medium-type=sr
+port set property unit=0 portlist=16 medium-type=sr
+port set property unit=0 portlist=17 medium-type=sr
+port set property unit=0 portlist=18 medium-type=sr
+port set property unit=0 portlist=19 medium-type=sr
+port set property unit=0 portlist=20 medium-type=sr
+port set property unit=0 portlist=21 medium-type=sr
+port set property unit=0 portlist=22 medium-type=sr
+port set property unit=0 portlist=23 medium-type=sr
+port set property unit=0 portlist=24 medium-type=sr
+port set property unit=0 portlist=25 medium-type=sr
+port set property unit=0 portlist=26 medium-type=sr
+port set property unit=0 portlist=27 medium-type=sr
+port set property unit=0 portlist=28 medium-type=sr
+port set property unit=0 portlist=29 medium-type=sr
+port set property unit=0 portlist=30 medium-type=sr
+port set property unit=0 portlist=31 medium-type=sr
+port set property unit=0 portlist=32 medium-type=sr
+port set property unit=0 portlist=33 medium-type=sr
+port set property unit=0 portlist=34 medium-type=sr
+port set property unit=0 portlist=35 medium-type=sr
+port set property unit=0 portlist=36 medium-type=sr
+port set property unit=0 portlist=37 medium-type=sr
+port set property unit=0 portlist=38 medium-type=sr
+port set property unit=0 portlist=39 medium-type=sr
+port set property unit=0 portlist=40 medium-type=sr
+port set property unit=0 portlist=41 medium-type=sr
+port set property unit=0 portlist=42 medium-type=sr
+port set property unit=0 portlist=43 medium-type=sr
+port set property unit=0 portlist=44 medium-type=sr
+port set property unit=0 portlist=45 medium-type=sr
+port set property unit=0 portlist=46 medium-type=sr
+port set property unit=0 portlist=47 medium-type=sr
+port set property unit=0 portlist=48 medium-type=sr4
+port set property unit=0 portlist=49 medium-type=sr4
+port set property unit=0 portlist=50 medium-type=sr4
+port set property unit=0 portlist=51 medium-type=sr4
+port set property unit=0 portlist=52 medium-type=sr4
+port set property unit=0 portlist=53 medium-type=sr4
+port set property unit=0 portlist=54 medium-type=sr4
+port set property unit=0 portlist=55 medium-type=sr4
+port set property unit=0 portlist=129 medium-type=kr
+port set property unit=0 portlist=130 medium-type=x
+port advertise unit=0 portlist=129 speed-10g-kr
+port set property unit=0 portlist=129 an=enable
+port set property unit=0 portlist=0 admin=enable
+port set property unit=0 portlist=1 admin=enable
+port set property unit=0 portlist=2 admin=enable
+port set property unit=0 portlist=3 admin=enable
+port set property unit=0 portlist=4 admin=enable
+port set property unit=0 portlist=5 admin=enable
+port set property unit=0 portlist=6 admin=enable
+port set property unit=0 portlist=7 admin=enable
+port set property unit=0 portlist=8 admin=enable
+port set property unit=0 portlist=9 admin=enable
+port set property unit=0 portlist=10 admin=enable
+port set property unit=0 portlist=11 admin=enable
+port set property unit=0 portlist=12 admin=enable
+port set property unit=0 portlist=13 admin=enable
+port set property unit=0 portlist=14 admin=enable
+port set property unit=0 portlist=15 admin=enable
+port set property unit=0 portlist=16 admin=enable
+port set property unit=0 portlist=17 admin=enable
+port set property unit=0 portlist=18 admin=enable
+port set property unit=0 portlist=19 admin=enable
+port set property unit=0 portlist=20 admin=enable
+port set property unit=0 portlist=21 admin=enable
+port set property unit=0 portlist=22 admin=enable
+port set property unit=0 portlist=23 admin=enable
+port set property unit=0 portlist=24 admin=enable
+port set property unit=0 portlist=25 admin=enable
+port set property unit=0 portlist=26 admin=enable
+port set property unit=0 portlist=27 admin=enable
+port set property unit=0 portlist=28 admin=enable
+port set property unit=0 portlist=29 admin=enable
+port set property unit=0 portlist=30 admin=enable
+port set property unit=0 portlist=31 admin=enable
+port set property unit=0 portlist=32 admin=enable
+port set property unit=0 portlist=33 admin=enable
+port set property unit=0 portlist=34 admin=enable
+port set property unit=0 portlist=35 admin=enable
+port set property unit=0 portlist=36 admin=enable
+port set property unit=0 portlist=37 admin=enable
+port set property unit=0 portlist=38 admin=enable
+port set property unit=0 portlist=39 admin=enable
+port set property unit=0 portlist=40 admin=enable
+port set property unit=0 portlist=41 admin=enable
+port set property unit=0 portlist=42 admin=enable
+port set property unit=0 portlist=43 admin=enable
+port set property unit=0 portlist=44 admin=enable
+port set property unit=0 portlist=45 admin=enable
+port set property unit=0 portlist=46 admin=enable
+port set property unit=0 portlist=47 admin=enable
+port set property unit=0 portlist=48 admin=enable
+port set property unit=0 portlist=49 admin=enable
+port set property unit=0 portlist=50 admin=enable
+port set property unit=0 portlist=51 admin=enable
+port set property unit=0 portlist=52 admin=enable
+port set property unit=0 portlist=53 admin=enable
+port set property unit=0 portlist=54 admin=enable
+port set property unit=0 portlist=55 admin=enable
+port set property unit=0 portlist=129 admin=enable
+port set property unit=0 portlist=130 admin=enable
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.DAC.R0B b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.DAC.R0B
new file mode 100755
index 0000000000..857e5f1ede
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/port_config.nps.DAC.R0B
@@ -0,0 +1,702 @@
+init start stage unit=0 low-level
+init set port-map unit=0 port=0  eth-macro=2  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=1  eth-macro=2  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=2  eth-macro=2  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=3  eth-macro=2  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=4  eth-macro=3  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=5  eth-macro=3  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=6  eth-macro=3  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=7  eth-macro=3  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=8  eth-macro=4  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=9  eth-macro=4  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=10 eth-macro=4  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=11 eth-macro=4  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=12 eth-macro=5  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=13 eth-macro=5  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=14 eth-macro=5  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=15 eth-macro=5  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=16 eth-macro=8  lane=0 max-speed=25g active=true
+init set port-map unit=0 port=17 eth-macro=8  lane=1 max-speed=25g active=true
+init set port-map unit=0 port=18 eth-macro=8  lane=2 max-speed=25g active=true
+init set port-map unit=0 port=19 eth-macro=8  lane=3 max-speed=25g active=true
+init set port-map unit=0 port=20 eth-macro=10 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=21 eth-macro=10 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=22 eth-macro=10 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=23 eth-macro=10 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=24 eth-macro=12 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=25 eth-macro=12 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=26 eth-macro=12 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=27 eth-macro=12 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=28 eth-macro=14 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=29 eth-macro=14 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=30 eth-macro=14 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=31 eth-macro=14 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=32 eth-macro=16 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=33 eth-macro=16 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=34 eth-macro=16 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=35 eth-macro=16 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=36 eth-macro=17 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=37 eth-macro=17 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=38 eth-macro=17 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=39 eth-macro=17 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=40 eth-macro=18 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=41 eth-macro=18 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=42 eth-macro=18 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=43 eth-macro=18 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=44 eth-macro=19 lane=0 max-speed=25g active=true
+init set port-map unit=0 port=45 eth-macro=19 lane=1 max-speed=25g active=true
+init set port-map unit=0 port=46 eth-macro=19 lane=2 max-speed=25g active=true
+init set port-map unit=0 port=47 eth-macro=19 lane=3 max-speed=25g active=true
+init set port-map unit=0 port=48 eth-macro=21 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=49 eth-macro=20 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=50 eth-macro=23 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=51 eth-macro=22 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=52 eth-macro=27 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=53 eth-macro=26 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=54 eth-macro=29 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=55 eth-macro=28 lane=0 max-speed=100g active=true
+init set port-map unit=0 port=129 eth-macro=0 lane=1 max-speed=10g active=true guarantee=true cpi=true
+init set port-map unit=0 port=130 eth-macro=0 lane=0 max-speed=10g active=true guarantee=true cpi=true init-done=true
+init start stage unit=0 task-rsrc
+init start stage unit=0 module
+init start stage unit=0 task
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=tx data=0x2
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=tx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=tx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.1.2.3
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=tx data=0x3.2.0.1
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=tx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=tx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set lane-swap unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=1 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=2 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=3 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=4 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=5 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=7 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=9 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=10 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=11 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=12 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=13 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=14 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=17 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=18 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=19 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=21 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=22 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=23 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=25 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=26 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=27 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=29 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=30 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=31 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=32 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=33 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=35 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=36 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=37 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=39 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=40 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=41 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=43 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=44 lane-cnt=1 property=rx data=0x2
+phy set lane-swap unit=0 portlist=45 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set lane-swap unit=0 portlist=47 lane-cnt=1 property=rx data=0x3
+phy set lane-swap unit=0 portlist=48 lane-cnt=4 property=rx data=0x3.1.0.2
+phy set lane-swap unit=0 portlist=49 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=50 lane-cnt=4 property=rx data=0x3.0.1.2
+phy set lane-swap unit=0 portlist=51 lane-cnt=4 property=rx data=0x3.2.1.0
+phy set lane-swap unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=53 lane-cnt=4 property=rx data=0x2.0.1.3
+phy set lane-swap unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=55 lane-cnt=4 property=rx data=0x1.0.3.2
+phy set lane-swap unit=0 portlist=129 lane-cnt=1 property=rx data=0x1
+phy set lane-swap unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=tx data=0x1
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=tx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=tx data=0x0
+phy set polarity-rev unit=0 portlist=0 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=1 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=2 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=3 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=4 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=5 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=6 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=7 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=8 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=9 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=10 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=11 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=12 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=13 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=14 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=15 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=16 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=17 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=18 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=19 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=20 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=21 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=22 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=23 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=24 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=25 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=26 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=27 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=28 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=29 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=30 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=31 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=32 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=33 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=34 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=35 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=36 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=37 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=38 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=39 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=40 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=41 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=42 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=43 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=44 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=45 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=46 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=47 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=48 lane-cnt=4 property=rx data=0x0.1.1.0
+phy set polarity-rev unit=0 portlist=49 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=50 lane-cnt=4 property=rx data=0x1.1.1.1
+phy set polarity-rev unit=0 portlist=51 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=52 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=53 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=54 lane-cnt=4 property=rx data=0x1.1.1.0
+phy set polarity-rev unit=0 portlist=55 lane-cnt=4 property=rx data=0x0.0.0.0
+phy set polarity-rev unit=0 portlist=129 lane-cnt=1 property=rx data=0x0
+phy set polarity-rev unit=0 portlist=130 lane-cnt=1 property=rx data=0x0
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=0 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=1 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=2 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=3 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=4 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=5 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=6 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c0 data=0x1a
+phy set pre-emphasis unit=0 portlist=7 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=8 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=9 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=10 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=11 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=12 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=13 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=14 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c0 data=0x1b
+phy set pre-emphasis unit=0 portlist=15 lane-cnt=1 property=c1 data=0x7
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=16 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=17 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=18 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=19 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=20 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=21 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=22 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=23 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=24 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=25 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=26 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=27 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=28 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=29 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=30 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=31 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=32 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=33 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=34 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=35 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=36 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=37 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=38 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=39 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=40 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=41 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=42 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=43 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=44 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=45 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=46 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c2 data=0x2
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c0 data=0x1c
+phy set pre-emphasis unit=0 portlist=47 lane-cnt=1 property=c1 data=0x6
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=48 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=49 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=50 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=51 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=52 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=53 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=54 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c2 data=0x2.2.2.2
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=cn1 data=0x0.0.0.0
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c0 data=0x1b.1b.1b.1b
+phy set pre-emphasis unit=0 portlist=55 lane-cnt=4 property=c1 data=0x6.6.6.6
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=cn1 data=0x1
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=129 lane-cnt=1 property=c1 data=0x3
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c2 data=0x1
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=cn1 data=0x0
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c0 data=0x2
+phy set pre-emphasis unit=0 portlist=130 lane-cnt=1 property=c1 data=0x3
+port set property unit=0 portlist=0 speed=25g
+port set property unit=0 portlist=1 speed=25g
+port set property unit=0 portlist=2 speed=25g
+port set property unit=0 portlist=3 speed=25g
+port set property unit=0 portlist=4 speed=25g
+port set property unit=0 portlist=5 speed=25g
+port set property unit=0 portlist=6 speed=25g
+port set property unit=0 portlist=7 speed=25g
+port set property unit=0 portlist=8 speed=25g
+port set property unit=0 portlist=9 speed=25g
+port set property unit=0 portlist=10 speed=25g
+port set property unit=0 portlist=11 speed=25g
+port set property unit=0 portlist=12 speed=25g
+port set property unit=0 portlist=13 speed=25g
+port set property unit=0 portlist=14 speed=25g
+port set property unit=0 portlist=15 speed=25g
+port set property unit=0 portlist=16 speed=25g
+port set property unit=0 portlist=17 speed=25g
+port set property unit=0 portlist=18 speed=25g
+port set property unit=0 portlist=19 speed=25g
+port set property unit=0 portlist=20 speed=25g
+port set property unit=0 portlist=21 speed=25g
+port set property unit=0 portlist=22 speed=25g
+port set property unit=0 portlist=23 speed=25g
+port set property unit=0 portlist=24 speed=25g
+port set property unit=0 portlist=25 speed=25g
+port set property unit=0 portlist=26 speed=25g
+port set property unit=0 portlist=27 speed=25g
+port set property unit=0 portlist=28 speed=25g
+port set property unit=0 portlist=29 speed=25g
+port set property unit=0 portlist=30 speed=25g
+port set property unit=0 portlist=31 speed=25g
+port set property unit=0 portlist=32 speed=25g
+port set property unit=0 portlist=33 speed=25g
+port set property unit=0 portlist=34 speed=25g
+port set property unit=0 portlist=35 speed=25g
+port set property unit=0 portlist=36 speed=25g
+port set property unit=0 portlist=37 speed=25g
+port set property unit=0 portlist=38 speed=25g
+port set property unit=0 portlist=39 speed=25g
+port set property unit=0 portlist=40 speed=25g
+port set property unit=0 portlist=41 speed=25g
+port set property unit=0 portlist=42 speed=25g
+port set property unit=0 portlist=43 speed=25g
+port set property unit=0 portlist=44 speed=25g
+port set property unit=0 portlist=45 speed=25g
+port set property unit=0 portlist=46 speed=25g
+port set property unit=0 portlist=47 speed=25g
+port set property unit=0 portlist=48 speed=100g
+port set property unit=0 portlist=49 speed=100g
+port set property unit=0 portlist=50 speed=100g
+port set property unit=0 portlist=51 speed=100g
+port set property unit=0 portlist=52 speed=100g
+port set property unit=0 portlist=53 speed=100g
+port set property unit=0 portlist=54 speed=100g
+port set property unit=0 portlist=55 speed=100g
+port set property unit=0 portlist=129 speed=10g
+port set property unit=0 portlist=130 speed=1g
+port set property unit=0 portlist=0 medium-type=sr
+port set property unit=0 portlist=1 medium-type=sr
+port set property unit=0 portlist=2 medium-type=sr
+port set property unit=0 portlist=3 medium-type=sr
+port set property unit=0 portlist=4 medium-type=sr
+port set property unit=0 portlist=5 medium-type=sr
+port set property unit=0 portlist=6 medium-type=sr
+port set property unit=0 portlist=7 medium-type=sr
+port set property unit=0 portlist=8 medium-type=sr
+port set property unit=0 portlist=9 medium-type=sr
+port set property unit=0 portlist=10 medium-type=sr
+port set property unit=0 portlist=11 medium-type=sr
+port set property unit=0 portlist=12 medium-type=sr
+port set property unit=0 portlist=13 medium-type=sr
+port set property unit=0 portlist=14 medium-type=sr
+port set property unit=0 portlist=15 medium-type=sr
+port set property unit=0 portlist=16 medium-type=sr
+port set property unit=0 portlist=17 medium-type=sr
+port set property unit=0 portlist=18 medium-type=sr
+port set property unit=0 portlist=19 medium-type=sr
+port set property unit=0 portlist=20 medium-type=sr
+port set property unit=0 portlist=21 medium-type=sr
+port set property unit=0 portlist=22 medium-type=sr
+port set property unit=0 portlist=23 medium-type=sr
+port set property unit=0 portlist=24 medium-type=sr
+port set property unit=0 portlist=25 medium-type=sr
+port set property unit=0 portlist=26 medium-type=sr
+port set property unit=0 portlist=27 medium-type=sr
+port set property unit=0 portlist=28 medium-type=sr
+port set property unit=0 portlist=29 medium-type=sr
+port set property unit=0 portlist=30 medium-type=sr
+port set property unit=0 portlist=31 medium-type=sr
+port set property unit=0 portlist=32 medium-type=sr
+port set property unit=0 portlist=33 medium-type=sr
+port set property unit=0 portlist=34 medium-type=sr
+port set property unit=0 portlist=35 medium-type=sr
+port set property unit=0 portlist=36 medium-type=sr
+port set property unit=0 portlist=37 medium-type=sr
+port set property unit=0 portlist=38 medium-type=sr
+port set property unit=0 portlist=39 medium-type=sr
+port set property unit=0 portlist=40 medium-type=sr
+port set property unit=0 portlist=41 medium-type=sr
+port set property unit=0 portlist=42 medium-type=sr
+port set property unit=0 portlist=43 medium-type=sr
+port set property unit=0 portlist=44 medium-type=sr
+port set property unit=0 portlist=45 medium-type=sr
+port set property unit=0 portlist=46 medium-type=sr
+port set property unit=0 portlist=47 medium-type=sr
+port set property unit=0 portlist=48 medium-type=sr4
+port set property unit=0 portlist=49 medium-type=sr4
+port set property unit=0 portlist=50 medium-type=sr4
+port set property unit=0 portlist=51 medium-type=sr4
+port set property unit=0 portlist=52 medium-type=sr4
+port set property unit=0 portlist=53 medium-type=sr4
+port set property unit=0 portlist=54 medium-type=sr4
+port set property unit=0 portlist=55 medium-type=sr4
+port set property unit=0 portlist=129 medium-type=kr
+port set property unit=0 portlist=130 medium-type=x
+port advertise unit=0 portlist=129 speed-10g-kr
+port set property unit=0 portlist=129 an=enable
+port set property unit=0 portlist=0 admin=enable
+port set property unit=0 portlist=1 admin=enable
+port set property unit=0 portlist=2 admin=enable
+port set property unit=0 portlist=3 admin=enable
+port set property unit=0 portlist=4 admin=enable
+port set property unit=0 portlist=5 admin=enable
+port set property unit=0 portlist=6 admin=enable
+port set property unit=0 portlist=7 admin=enable
+port set property unit=0 portlist=8 admin=enable
+port set property unit=0 portlist=9 admin=enable
+port set property unit=0 portlist=10 admin=enable
+port set property unit=0 portlist=11 admin=enable
+port set property unit=0 portlist=12 admin=enable
+port set property unit=0 portlist=13 admin=enable
+port set property unit=0 portlist=14 admin=enable
+port set property unit=0 portlist=15 admin=enable
+port set property unit=0 portlist=16 admin=enable
+port set property unit=0 portlist=17 admin=enable
+port set property unit=0 portlist=18 admin=enable
+port set property unit=0 portlist=19 admin=enable
+port set property unit=0 portlist=20 admin=enable
+port set property unit=0 portlist=21 admin=enable
+port set property unit=0 portlist=22 admin=enable
+port set property unit=0 portlist=23 admin=enable
+port set property unit=0 portlist=24 admin=enable
+port set property unit=0 portlist=25 admin=enable
+port set property unit=0 portlist=26 admin=enable
+port set property unit=0 portlist=27 admin=enable
+port set property unit=0 portlist=28 admin=enable
+port set property unit=0 portlist=29 admin=enable
+port set property unit=0 portlist=30 admin=enable
+port set property unit=0 portlist=31 admin=enable
+port set property unit=0 portlist=32 admin=enable
+port set property unit=0 portlist=33 admin=enable
+port set property unit=0 portlist=34 admin=enable
+port set property unit=0 portlist=35 admin=enable
+port set property unit=0 portlist=36 admin=enable
+port set property unit=0 portlist=37 admin=enable
+port set property unit=0 portlist=38 admin=enable
+port set property unit=0 portlist=39 admin=enable
+port set property unit=0 portlist=40 admin=enable
+port set property unit=0 portlist=41 admin=enable
+port set property unit=0 portlist=42 admin=enable
+port set property unit=0 portlist=43 admin=enable
+port set property unit=0 portlist=44 admin=enable
+port set property unit=0 portlist=45 admin=enable
+port set property unit=0 portlist=46 admin=enable
+port set property unit=0 portlist=47 admin=enable
+port set property unit=0 portlist=48 admin=enable
+port set property unit=0 portlist=49 admin=enable
+port set property unit=0 portlist=50 admin=enable
+port set property unit=0 portlist=51 admin=enable
+port set property unit=0 portlist=52 admin=enable
+port set property unit=0 portlist=53 admin=enable
+port set property unit=0 portlist=54 admin=enable
+port set property unit=0 portlist=55 admin=enable
+port set property unit=0 portlist=129 admin=enable
+port set property unit=0 portlist=130 admin=enable
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/qos.json.j2 b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/qos.json.j2
new file mode 100755
index 0000000000..3e548325ea
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/qos.json.j2
@@ -0,0 +1 @@
+{%- include 'qos_config.j2' %}
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/sai.profile b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/sai.profile
new file mode 100755
index 0000000000..880f47910a
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/Cig-CS6436-56P/sai.profile
@@ -0,0 +1,2 @@
+SAI_INIT_CONFIG_FILE=/usr/share/sonic/platform/led_proc_init.nps
+SAI_DSH_CONFIG_FILE=/usr/share/sonic/hwsku/port_config.nps
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/default_sku b/device/cig/x86_64-cig_cs6436_56p-r0/default_sku
new file mode 100755
index 0000000000..77eed77810
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/default_sku
@@ -0,0 +1 @@
+Cig-CS6436-56P t1
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/installer.conf b/device/cig/x86_64-cig_cs6436_56p-r0/installer.conf
new file mode 100755
index 0000000000..01b6391381
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/installer.conf
@@ -0,0 +1,4 @@
+CONSOLE_PORT=0x3e8
+CONSOLE_DEV=2
+CONSOLE_SPEED=115200
+ONIE_PLATFORM_EXTRA_CMDLINE_LINUX="pci=noaer"
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/led_proc_init.nps b/device/cig/x86_64-cig_cs6436_56p-r0/led_proc_init.nps
new file mode 100755
index 0000000000..3ba2f35e55
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/led_proc_init.nps
@@ -0,0 +1,10 @@
+#unit   NPS_CFG_TYPE_XXX                param0  param1  value
+#----   ----------------                ------  ------  -----
+0       NPS_CFG_TYPE_USE_UNIT_PORT       0      0       1
+0       NPS_CFG_TYPE_LED_CFG             0      0       7
+0       NPS_CFG_TYPE_CPI_PORT_MODE       129    0       1
+0       NPS_CFG_TYPE_CPI_PORT_MODE       130    0       1
+0       NPS_CFG_TYPE_USER_BUF_CTRL       0      0       1
+0       NPS_CFG_TYPE_HASH_L2_FDB_REGION_ENTRY_NUM                       0       0       49152
+0       NPS_CFG_TYPE_HASH_L3_WITH_IPV6_PREFIX_64_REGION_ENTRY_NUM       0       0       32768
+
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/plugins/eeprom.py b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/eeprom.py
new file mode 100755
index 0000000000..5019b9c40a
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/eeprom.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python
+
+try:
+    import exceptions
+    import binascii
+    import time
+    import optparse
+    import warnings
+    import os
+    import sys
+    from sonic_eeprom import eeprom_base
+    from sonic_eeprom import eeprom_tlvinfo
+    import subprocess
+except ImportError, e:
+    raise ImportError (str(e) + "- required module not found")
+
+class board(eeprom_tlvinfo.TlvInfoDecoder):
+    _TLV_INFO_MAX_LEN = 256
+    def __init__(self, name, path, cpld_root, ro):
+        self.eeprom_path = "/sys/bus/i2c/devices/7-0057/eeprom"
+        super(board, self).__init__(self.eeprom_path, 0, '', True)
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/plugins/psuutil.py b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/psuutil.py
new file mode 100755
index 0000000000..137531c36e
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/psuutil.py
@@ -0,0 +1,92 @@
+#
+# psuutil.py
+# Platform-specific PSU status interface for SONiC
+#
+
+
+import os.path
+
+try:
+    from sonic_psu.psu_base import PsuBase
+except ImportError as e:
+    raise ImportError(str(e) + "- required module not found")
+
+
+class PsuUtil(PsuBase):
+    """Platform-specific PSUutil class"""
+
+    SYSFS_PSU_DIR = ["/sys/bus/i2c/devices/5-005a",
+                     "/sys/bus/i2c/devices/5-005b"]
+
+    def __init__(self):
+        PsuBase.__init__(self)
+
+
+    # Get sysfs attribute
+    def get_attr_value(self, attr_path):
+
+        retval = 'ERR'
+        if (not os.path.isfile(attr_path)):
+            return retval
+
+        try:
+            with open(attr_path, 'r') as fd:
+                retval = fd.read()
+        except Exception as error:
+            logging.error("Unable to open ", attr_path, " file !")
+
+        retval = retval.rstrip('\r\n')
+        return retval
+
+    def get_num_psus(self):
+        """
+        Retrieves the number of PSUs available on the device
+        :return: An integer, the number of PSUs available on the device
+         """
+        MAX_PSUS = 2
+        return MAX_PSUS
+
+    def get_psu_status(self, index):
+        """
+        Retrieves the oprational status of power supply unit (PSU) defined
+                by index <index>
+        :param index: An integer, index of the PSU of which to query status
+        :return: Boolean, True if PSU is operating properly, False if PSU is\
+        faulty
+        """
+        status = 0
+        attr_file = 'psu_power_good'
+        attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+        attr_value = self.get_attr_value(attr_path)
+
+        if (attr_value != 'ERR'):
+            attr_value = int(attr_value, 16)
+            # Check for PSU status
+            if (attr_value == 1):
+                    status = 1
+
+        return status
+
+    def get_psu_presence(self, index):
+        """
+        Retrieves the presence status of power supply unit (PSU) defined
+                by index <index>
+        :param index: An integer, index of the PSU of which to query status
+        :return: Boolean, True if PSU is plugged, False if not
+        """
+        status = 0
+        psu_absent = 0
+        attr_file ='psu_present'
+        attr_path = self.SYSFS_PSU_DIR[index-1] +'/' + attr_file
+
+        attr_value = self.get_attr_value(attr_path)
+
+        if (attr_value != 'ERR'):
+            attr_value = int(attr_value, 16)
+            # Check for PSU presence
+            if (attr_value == 1):
+                    status = 1
+
+        return status
+
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/plugins/sfputil.py b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/sfputil.py
new file mode 100755
index 0000000000..f5fe6c9314
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/plugins/sfputil.py
@@ -0,0 +1,160 @@
+#!/usr/bin/env python
+
+try:
+    import time
+    from sonic_sfp.sfputilbase import SfpUtilBase 
+except ImportError, e:
+    raise ImportError (str(e) + "- required module not found")
+
+
+class SfpUtil(SfpUtilBase):
+    """Platform specific SfpUtill class"""
+
+    _port_start = 0
+    _port_end = 55
+    _qsfp_port_start = 48
+    _ports_in_block = 55
+
+    _port_to_eeprom_mapping = {}
+    _port_to_i2c_mapping = {
+        0 : 8,
+        1 : 9,
+        2 : 10,
+        3 : 11,
+        4 : 12,
+        5 : 13,
+        6 : 14,
+        7 : 15,
+        8 : 16,
+        9 : 17,
+        10 : 18,
+        11 : 19,
+        12 : 20,
+        13 : 21,
+        14 : 22,
+        15 : 23,
+        16 : 24,
+        17 : 25,
+        18 : 26,
+        19 : 27,
+        20 : 28,
+        21 : 29,
+        22 : 30,
+        23 : 31,
+        24 : 32,
+        25 : 33,
+        26 : 34,
+        27 : 35,
+        28 : 36,
+        29 : 37,
+        30 : 38,
+        31 : 39,
+        32 : 40,
+        33 : 41,
+        34 : 42,
+        35 : 43,
+        36 : 44,
+        37 : 45,
+        38 : 46,
+        39 : 47,
+        40 : 48,
+        41 : 49,
+        42 : 50,
+        43 : 51,
+        44 : 52,
+        45 : 53,
+        46 : 54,
+        47 : 55,
+        48 : 56,
+        49 : 57,
+        50 : 58,
+        51 : 59,
+        52 : 60,
+        53 : 61,
+        54 : 62,
+        55 : 63,         
+    }
+
+    _qsfp_ports = range(_qsfp_port_start, _ports_in_block + 1)
+
+    def __init__(self):
+        eeprom_path = '/sys/bus/i2c/devices/{0}-0050/sfp_eeprom'
+        for x in range(self._port_start, self._port_end + 1):
+            port_eeprom_path = eeprom_path.format(self._port_to_i2c_mapping[x])
+            self._port_to_eeprom_mapping[x] = port_eeprom_path
+                
+            SfpUtilBase.__init__(self)
+
+    def reset(self, port_num):
+        # Check for invalid port_num
+        if port_num < self._port_start or port_num > self._port_end:
+            return False
+
+        path = "/sys/bus/i2c/devices/{0}-0050/sfp_port_reset"
+        port_ps = path.format(self._port_to_i2c_mapping[port_num])
+          
+        try:
+            reg_file = open(port_ps, 'w')
+        except IOError as e:
+            print "Error: unable to open file: %s" % str(e)
+            return False
+
+        #toggle reset
+        reg_file.seek(0)
+        reg_file.write('1')
+        time.sleep(1)
+        reg_file.seek(0)
+        reg_file.write('0')
+        reg_file.close()
+        return True
+
+    def set_low_power_mode(self, port_nuM, lpmode):
+        raise NotImplementedError
+
+    def get_low_power_mode(self, port_num):
+        raise NotImplementedError
+        
+    def get_presence(self, port_num):
+        # Check for invalid port_num
+        if port_num < self._port_start or port_num > self._port_end:
+            return False
+
+        path = "/sys/bus/i2c/devices/{0}-0050/sfp_is_present"
+        port_ps = path.format(self._port_to_i2c_mapping[port_num])
+
+          
+        try:
+            reg_file = open(port_ps)
+        except IOError as e:
+            print "Error: unable to open file: %s" % str(e)
+            return False
+
+        reg_value = reg_file.readline().rstrip()
+        if reg_value == '1':
+            return True
+
+        return False
+
+    def get_transceiver_change_event(self):
+        """
+        TODO: This function need to be implemented
+        when decide to support monitoring SFP(Xcvrd)
+        on this platform.
+        """
+        raise NotImplementedError
+
+    @property
+    def port_start(self):
+        return self._port_start
+
+    @property
+    def port_end(self):
+        return self._port_end
+
+    @property
+    def qsfp_ports(self):
+        return self._qsfp_ports
+
+    @property 
+    def port_to_eeprom_mapping(self):
+         return self._port_to_eeprom_mapping
diff --git a/device/cig/x86_64-cig_cs6436_56p-r0/sensors.conf b/device/cig/x86_64-cig_cs6436_56p-r0/sensors.conf
new file mode 100755
index 0000000000..565186de28
--- /dev/null
+++ b/device/cig/x86_64-cig_cs6436_56p-r0/sensors.conf
@@ -0,0 +1,13 @@
+# libsensors configuration file
+
+chip "cs6436_56p_fan-*"
+    label fan1 "front fan 1"
+    label fan2 "front fan 2"
+    label fan3 "front fan 3"
+    label fan4 "front fan 4"
+    label fan5 "front fan 5"
+    label fan6 "rear fan 1"
+    label fan7 "rear fan 2"
+    label fan8 "rear fan 3"
+    label fan9 "rear fan 4"
+    label fan10 "rear fan 5"
diff --git a/platform/nephos/one-image.mk b/platform/nephos/one-image.mk
index ace042d5ce..d29d0e8c93 100644
--- a/platform/nephos/one-image.mk
+++ b/platform/nephos/one-image.mk
@@ -5,7 +5,8 @@ $(SONIC_ONE_IMAGE)_MACHINE = nephos
 $(SONIC_ONE_IMAGE)_IMAGE_TYPE = onie
 $(SONIC_ONE_IMAGE)_INSTALLS += $(NEPHOS_NPS_KERNEL)
 $(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(INGRASYS_S9130_32X_PLATFORM_MODULE) \
-				$(INGRASYS_S9230_64X_PLATFORM_MODULE) \
-                           	$(ACCTON_AS7116_54X_PLATFORM_MODULE)
+                               $(INGRASYS_S9230_64X_PLATFORM_MODULE) \
+                               $(ACCTON_AS7116_54X_PLATFORM_MODULE)  \
+                               $(CIG_CS6436_56P_PLATFORM_MODULE)
 $(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_IMAGES)
 SONIC_INSTALLERS += $(SONIC_ONE_IMAGE)
diff --git a/platform/nephos/platform-modules-cig.mk b/platform/nephos/platform-modules-cig.mk
new file mode 100644
index 0000000000..98bbadf9ce
--- /dev/null
+++ b/platform/nephos/platform-modules-cig.mk
@@ -0,0 +1,12 @@
+# Cig CS6436 56P Platform modules
+
+CIG_CS6436_56P_PLATFORM_MODULE_VERSION = 1.0.0
+
+export CIG_CS6436_56P_PLATFORM_MODULE_VERSION
+
+CIG_CS6436_56P_PLATFORM_MODULE = sonic-platform-cig-cs6436-56p_$(CIG_CS6436_56P_PLATFORM_MODULE_VERSION)_amd64.deb
+$(CIG_CS6436_56P_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-cig
+$(CIG_CS6436_56P_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
+$(CIG_CS6436_56P_PLATFORM_MODULE)_PLATFORM = x86_64-cig_cs6436_56p-r0
+SONIC_DPKG_DEBS += $(CIG_CS6436_56P_PLATFORM_MODULE)
+SONIC_STRETCH_DEBS += $(CIG_CS6436_56P_PLATFORM_MODULE)
\ No newline at end of file
diff --git a/platform/nephos/rules.mk b/platform/nephos/rules.mk
index c33d75448b..48d42c557d 100644
--- a/platform/nephos/rules.mk
+++ b/platform/nephos/rules.mk
@@ -2,6 +2,7 @@ include $(PLATFORM_PATH)/sdk.mk
 include $(PLATFORM_PATH)/sai.mk
 include $(PLATFORM_PATH)/platform-modules-ingrasys.mk
 include $(PLATFORM_PATH)/platform-modules-accton.mk
+include $(PLATFORM_PATH)/platform-modules-cig.mk
 include $(PLATFORM_PATH)/docker-orchagent-nephos.mk
 include $(PLATFORM_PATH)/docker-syncd-nephos.mk
 include $(PLATFORM_PATH)/docker-syncd-nephos-rpc.mk
diff --git a/platform/nephos/sonic-platform-modules-cig/LICENSE b/platform/nephos/sonic-platform-modules-cig/LICENSE
new file mode 100755
index 0000000000..baf27e1674
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/LICENSE
@@ -0,0 +1,16 @@
+Copyright (C) 2016  Microsoft, Inc
+Copyright (C) 2017  Cambridgeig Technology Corporation 
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
diff --git a/platform/nephos/sonic-platform-modules-cig/README.md b/platform/nephos/sonic-platform-modules-cig/README.md
new file mode 100755
index 0000000000..9dc23910b5
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/README.md
@@ -0,0 +1 @@
+platform drivers of Cambridgeig products for the SONiC project
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/__init__.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/__init__.py
new file mode 100755
index 0000000000..e69de29bb2
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/fanutil.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/fanutil.py
new file mode 100755
index 0000000000..e69de29bb2
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/thermalutil.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/classes/thermalutil.py
new file mode 100755
index 0000000000..e69de29bb2
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/Makefile b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/Makefile
new file mode 100755
index 0000000000..cdb114aad5
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/Makefile
@@ -0,0 +1,5 @@
+obj-m := x86-64-cig-cs6436-56p-cpld.o \
+	x86-64-cig-cs6436-56p-fan.o \
+	x86-64-cig-cs6436-56p-led.o \
+	x86-64-cig-cs6436-56p-psu.o \
+	x86-64-cig-cs6436-56p-sfp.o 
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc.h b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc.h
new file mode 100755
index 0000000000..7ce6ae3785
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc.h
@@ -0,0 +1,97 @@
+/* -------------------------------------------------------------------- 
+
+	 * A hwmon driver for the CIG cs6436-56P
+	 *
+	 * Copyright (C) 2018 Cambridge, Inc.
+	 *
+	 * This program is free software; you can redistribute it and/or modify
+	 * it under the terms of the GNU General Public License as published by
+	 * the Free Software Foundation; either version 2 of the License, or
+	 * (at your option) any later version.
+	 *
+	 * This program is distributed in the hope that it will be useful,
+	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	 * GNU General Public License for more details.
+	 *
+	 * You should have received a copy of the GNU General Public License
+	 * along with this program; if not, write to the Free Software
+	 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+	 */
+
+/* --------------------------------------------------------------------	*/
+
+#ifndef I2C_LPC_H
+#define I2C_LPC_H 1
+
+/* ----- Control register bits ----------------------------------------	*/
+#define I2C_LPC_PIN	0x80
+#define I2C_LPC_ESO	0x40
+#define I2C_LPC_ES1	0x20
+#define I2C_LPC_ES2	0x10
+#define I2C_LPC_ENI	0x08
+
+#define I2C_LPC_STO	0x40
+#define I2C_LPC_ACK	0x01
+
+/*command register*/
+#define I2C_LPC_STA	0x80
+#define I2C_LPC_ABT	0x40
+
+/*status register*/
+#define I2C_LPC_TBE 0x02
+#define I2C_LPC_IBB 0x80
+#define I2C_LPC_RBF 0x01
+#define I2C_LPC_TD 0x08
+
+#define I2C_LPC_START    I2C_LPC_STA
+#define I2C_LPC_STOP     I2C_LPC_STO
+#define I2C_LPC_REPSTART I2C_LPC_STA
+#define I2C_LPC_IDLE     
+
+/* ----- Status register bits -----------------------------------------	*/
+/*#define I2C_LPC_PIN  0x80    as above*/
+
+#define I2C_LPC_INI 0x40   /* 1 if not initialized */
+#define I2C_LPC_STS 0x20
+#define I2C_LPC_BER 0x10
+#define I2C_LPC_AD0 0x08
+#define I2C_LPC_LRB 0x08
+#define I2C_LPC_AAS 0x04
+#define I2C_LPC_LAB 0x02
+#define I2C_LPC_BB  0x80
+
+/* ----- Chip clock frequencies ---------------------------------------	*/
+#define I2C_LPC_CLK3	0x00
+#define I2C_LPC_CLK443	0x10
+#define I2C_LPC_CLK6	0x14
+#define I2C_LPC_CLK	0x18
+#define I2C_LPC_CLK12	0x1c
+
+/* ----- transmission frequencies -------------------------------------	*/
+#define I2C_LPC_TRNS90 0x00	/*  90 kHz */
+#define I2C_LPC_TRNS45 0x01	/*  45 kHz */
+#define I2C_LPC_TRNS11 0x02	/*  11 kHz */
+#define I2C_LPC_TRNS15 0x03	/* 1.5 kHz */
+
+
+#define I2C_LPC_OWNADR	0
+#define I2C_LPC_INTREG	I2C_LPC_ES2
+#define I2C_LPC_CLKREG	I2C_LPC_ES1
+
+#define I2C_LPC_REG_TEST 0x01
+#define I2C_LPC_REG_BUS_SEL 0x80
+#define I2C_LPC_REG_DEVICE_ADDR 0x81
+#define I2C_LPC_REG_BYTE_COUNT 0x83
+#define I2C_LPC_REG_COMMAND 0x84
+#define I2C_LPC_REG_STATUS 0x85
+#define I2C_LPC_REG_DATA_RX1 0x86
+#define I2C_LPC_REG_DATA_RX2 0x87
+#define I2C_LPC_REG_DATA_RX3 0x88
+#define I2C_LPC_REG_DATA_RX4 0x89
+#define I2C_LPC_REG_DATA_TX1 0x8a
+#define I2C_LPC_REG_DATA_TX2 0x8b
+#define I2C_LPC_REG_DATA_TX3 0x8c
+#define I2C_LPC_REG_DATA_TX4 0x8d
+
+#endif /* I2C_LPC_H */
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc2iic.h b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc2iic.h
new file mode 100755
index 0000000000..6963bef734
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/i2c-algo-lpc2iic.h
@@ -0,0 +1,48 @@
+/* -------------------------------------------------------------------- 
+
+	 * A hwmon driver for the CIG cs6436-56P
+	 *
+	 * Copyright (C) 2018 Cambridge, Inc.
+	 *
+	 * This program is free software; you can redistribute it and/or modify
+	 * it under the terms of the GNU General Public License as published by
+	 * the Free Software Foundation; either version 2 of the License, or
+	 * (at your option) any later version.
+	 *
+	 * This program is distributed in the hope that it will be useful,
+	 * but WITHOUT ANY WARRANTY; without even the implied warranty of
+	 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	 * GNU General Public License for more details.
+	 *
+	 * You should have received a copy of the GNU General Public License
+	 * along with this program; if not, write to the Free Software
+	 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+	 */
+
+/* --------------------------------------------------------------------	*/
+
+
+#ifndef _LINUX_I2C_ALGO_LPC_H
+#define _LINUX_I2C_ALGO_LPC_H
+
+struct i2c_algo_lpc_data {
+	void *data;		/* private data for lolevel routines	*/
+	void (*setlpc) (void *data, int ctl, int val);
+	int  (*getlpc) (void *data, int ctl);
+	int  (*getown) (void *data);
+	int  (*getclock) (void *data);
+	void (*waitforpin) (void *data);
+
+	int (*xfer_begin) (void *data);
+	int (*xfer_end) (void *data);
+
+	/* Multi-master lost arbitration back-off delay (msecs)
+	 * This should be set by the bus adapter or knowledgable client
+	 * if bus is multi-mastered, else zero
+	 */
+	unsigned long lab_mdelay;
+};
+
+int lpc_add_iic_bus(struct i2c_adapter * adap, unsigned int id);
+
+#endif /* _LINUX_I2C_ALGO_LPC_H */
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-cpld.c b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-cpld.c
new file mode 100755
index 0000000000..a3c6e2db54
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-cpld.c
@@ -0,0 +1,1632 @@
+/*
+ * A hwmon driver for the CIG cs6436-56P CPLD
+ *
+ * Copyright (C) 2018 Cambridge, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/pci.h>
+#include <linux/wait.h>
+#include <linux/isa.h>
+#include <linux/i2c.h>
+#include <linux/io.h>
+#include <asm/irq.h>
+#include "i2c-algo-lpc.h"
+#include "i2c-algo-lpc2iic.h"
+#include <linux/moduleparam.h>
+#include <linux/slab.h>
+#include <linux/fs.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/fcntl.h>
+#include <linux/device.h>
+#include <linux/cdev.h>
+#include <linux/pci.h>
+#include <asm/uaccess.h>
+#include <asm/atomic.h>
+#include <linux/i2c-mux.h>
+#include <linux/slab.h>
+#include <linux/list.h>
+#include <linux/dmi.h>
+#include <linux/dma-mapping.h>
+
+#ifndef CPLD_USER
+# include <linux/ioctl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+
+/*
+ * ISA bus.
+ */
+
+static void platform_isa_bus_release(struct device * dev)
+{
+    return ;
+}
+
+	
+static struct device isa_bus = {
+	.init_name	= "lpc-isa",
+    .release = platform_isa_bus_release,
+};
+
+struct isa_dev {
+	struct device dev;
+	struct device *next;
+	unsigned int id;
+};
+	
+#define to_isa_dev(x) container_of((x), struct isa_dev, dev)
+	
+static int isa_bus_match(struct device *dev, struct device_driver *driver)
+{
+	struct isa_driver *isa_driver = to_isa_driver(driver);
+
+	if (dev->platform_data == isa_driver) {
+		if (!isa_driver->match ||
+			isa_driver->match(dev, to_isa_dev(dev)->id))
+			return 1;
+		dev->platform_data = NULL;
+	}
+	return 0;
+}
+
+static int isa_bus_probe(struct device *dev)
+{
+	struct isa_driver *isa_driver = dev->platform_data;
+
+	if (isa_driver->probe)
+		return isa_driver->probe(dev, to_isa_dev(dev)->id);
+
+	return 0;
+}
+
+static int isa_bus_remove(struct device *dev)
+{
+	struct isa_driver *isa_driver = dev->platform_data;
+
+	if (isa_driver->remove)
+		return isa_driver->remove(dev, to_isa_dev(dev)->id);
+
+	return 0;
+}
+
+static void isa_bus_shutdown(struct device *dev)
+{
+	struct isa_driver *isa_driver = dev->platform_data;
+
+	if (isa_driver->shutdown)
+		isa_driver->shutdown(dev, to_isa_dev(dev)->id);
+}
+
+static int isa_bus_suspend(struct device *dev, pm_message_t state)
+{
+	struct isa_driver *isa_driver = dev->platform_data;
+
+	if (isa_driver->suspend)
+		return isa_driver->suspend(dev, to_isa_dev(dev)->id, state);
+
+	return 0;
+}
+
+static int isa_bus_resume(struct device *dev)
+{
+	struct isa_driver *isa_driver = dev->platform_data;
+
+	if (isa_driver->resume)
+		return isa_driver->resume(dev, to_isa_dev(dev)->id);
+
+	return 0;
+}
+
+static struct bus_type isa_bus_type = {
+	.name		= "lpc-isa",
+	.match		= isa_bus_match,
+	.probe		= isa_bus_probe,
+	.remove 	= isa_bus_remove,
+	.shutdown	= isa_bus_shutdown,
+	.suspend	= isa_bus_suspend,
+	.resume 	= isa_bus_resume
+};
+
+static void isa_dev_release(struct device *dev)
+{
+	kfree(to_isa_dev(dev));
+}
+
+void lpc_unregister_driver(struct isa_driver *isa_driver)
+{
+	struct device *dev = isa_driver->devices;
+
+	while (dev) {
+		struct device *tmp = to_isa_dev(dev)->next;
+		device_unregister(dev);
+		dev = tmp;
+	}
+	driver_unregister(&isa_driver->driver);
+}
+
+
+int lpc_register_driver(struct isa_driver *isa_driver, unsigned int ndev)
+{
+	int error;
+	unsigned int id;
+
+	isa_driver->driver.bus	= &isa_bus_type;
+	isa_driver->devices = NULL;
+
+	error = driver_register(&isa_driver->driver);
+	if (error)
+		return error;
+
+	for (id = 0; id < ndev; id++) {
+		struct isa_dev *isa_dev;
+
+		isa_dev = kzalloc(sizeof *isa_dev, GFP_KERNEL);
+		if (!isa_dev) {
+			error = -ENOMEM;
+			break;
+		}
+
+		isa_dev->dev.parent = &isa_bus;
+		isa_dev->dev.bus	= &isa_bus_type;
+
+		dev_set_name(&isa_dev->dev, "%s.%u",
+				 isa_driver->driver.name, id);
+		isa_dev->dev.platform_data	= isa_driver;
+		isa_dev->dev.release		= isa_dev_release;
+		isa_dev->id 		= id;
+
+		isa_dev->dev.coherent_dma_mask = DMA_BIT_MASK(24);
+		isa_dev->dev.dma_mask = &isa_dev->dev.coherent_dma_mask;
+
+		error = device_register(&isa_dev->dev);
+		if (error) {
+			put_device(&isa_dev->dev);
+			break;
+		}
+
+		if (isa_dev->dev.platform_data) {
+			isa_dev->next = isa_driver->devices;
+			isa_driver->devices = &isa_dev->dev;
+		} else
+			device_unregister(&isa_dev->dev);
+	}
+
+	if (!error && !isa_driver->devices)
+		error = -ENODEV;
+
+	if (error)
+		isa_unregister_driver(isa_driver);
+
+	return error;
+}
+
+	
+int lpc_bus_init(void)
+{
+	int error;
+
+	error = bus_register(&isa_bus_type);
+	if (!error) {
+		error = device_register(&isa_bus);
+		if (error)
+			bus_unregister(&isa_bus_type);
+	}
+	return error;
+}
+
+void lpc_bus_exit(void)
+{
+
+   device_unregister(&isa_bus);
+
+   bus_unregister(&isa_bus_type);
+}
+
+
+/*
+ * module parameters:
+ */
+static int i2c_debug = 0;
+static struct mutex	lpc_lock;
+
+
+#define DEB2(x) if (i2c_debug >= 2) x
+#define DEB3(x) if (i2c_debug >= 3) x 
+    /* print several statistical values */
+#define DEBPROTO(x) if (i2c_debug >= 9) x;
+	/* debug the protocol by showing transferred bits */
+#define DEF_TIMEOUT 160
+
+
+
+/* setting states on the bus with the right timing: */
+
+#define set_lpc(adap, ctl, val) adap->setlpc(adap->data, ctl, val)
+#define get_lpc(adap, ctl) adap->getlpc(adap->data, ctl)
+#define get_own(adap) adap->getown(adap->data)
+#define get_clock(adap) adap->getclock(adap->data)
+#define i2c_outaddr(adap, val) adap->setlpc(adap->data, I2C_LPC_REG_DEVICE_ADDR, val)
+
+#define i2c_outbyte1(adap, val) adap->setlpc(adap->data, I2C_LPC_REG_DATA_TX1, val)
+#define i2c_outbyte2(adap, val) adap->setlpc(adap->data, I2C_LPC_REG_DATA_TX2, val)
+#define i2c_outbyte3(adap, val) adap->setlpc(adap->data, I2C_LPC_REG_DATA_TX3, val)
+#define i2c_outbyte4(adap, val) adap->setlpc(adap->data, I2C_LPC_REG_DATA_TX4, val)
+#define i2c_inbyte1(adap) adap->getlpc(adap->data, I2C_LPC_REG_DATA_RX1)
+#define i2c_inbyte2(adap) adap->getlpc(adap->data, I2C_LPC_REG_DATA_RX2)
+#define i2c_inbyte3(adap) adap->getlpc(adap->data, I2C_LPC_REG_DATA_RX3)
+#define i2c_inbyte4(adap) adap->getlpc(adap->data, I2C_LPC_REG_DATA_RX4)
+
+
+
+#define LPC_FPRINTF_LOG_PATH "/tmp/file.log"
+struct file *lpc_fprintf_file = NULL;
+
+
+static int lpc_fprintf_debug(const char *fmt, ...)
+{
+	char lpc_fprintf_buf[256]={0};
+
+	struct va_format vaf;
+	va_list args;
+	int r;
+	unsigned int file_size = 0;
+	mm_segment_t old_fs;
+	struct timeval tv;
+    do_gettimeofday(&tv);
+
+	va_start(args, fmt);
+	vaf.fmt = fmt;
+	vaf.va = &args;
+	r=snprintf(lpc_fprintf_buf,"[%012d.%012d] %pV\n",sizeof(lpc_fprintf_buf),tv.tv_sec, tv.tv_usec, &vaf);
+	va_end(args);
+
+	old_fs = get_fs();
+	set_fs(KERNEL_DS);
+	lpc_fprintf_file->f_op->write(lpc_fprintf_file, (char *)lpc_fprintf_buf, strlen(lpc_fprintf_buf), &lpc_fprintf_file->f_pos);
+	set_fs(old_fs);
+	
+	memset(lpc_fprintf_buf,0x0,sizeof(lpc_fprintf_buf));
+	return r;
+
+}
+
+
+static int lpc_fprintf_init(void)
+{
+	mm_segment_t old_fs;
+	
+	DEB2(printk("lpc_fprintf_init.\n");)
+
+
+	if(lpc_fprintf_file == NULL)
+		lpc_fprintf_file = filp_open(LPC_FPRINTF_LOG_PATH, O_RDWR | O_APPEND | O_CREAT, 0644);
+	if (IS_ERR(lpc_fprintf_file)) {
+		DEB2(printk("error occured while opening file %s, exiting...\n", LPC_FPRINTF_LOG_PATH);)
+		return 0;
+	}
+
+	return 0;
+}
+
+static int lpc_fprintf_exit(void)
+{
+	DEB2(printk("lpc_fprintf_exit.\n");)
+
+	if(lpc_fprintf_file != NULL)
+		filp_close(lpc_fprintf_file, NULL);
+	return 0;
+}
+
+
+/* other auxiliary functions */
+
+
+void print_reg(struct i2c_algo_lpc_data *adap)
+{
+	unsigned char status;
+	DEBPROTO(lpc_fprintf_debug("================================================\n");)
+	status = get_lpc(adap, I2C_LPC_REG_BUS_SEL);
+	DEBPROTO(lpc_fprintf_debug("%s select reg %x : %x\n",__func__,I2C_LPC_REG_BUS_SEL, status);)
+	status = get_lpc(adap, I2C_LPC_REG_BYTE_COUNT);
+	DEBPROTO(lpc_fprintf_debug("%s count reg %x : %x\n",__func__,I2C_LPC_REG_BYTE_COUNT, status);)
+
+	status = get_lpc(adap, I2C_LPC_REG_COMMAND);
+	DEBPROTO(lpc_fprintf_debug("%s command reg %x : %x\n",__func__,I2C_LPC_REG_COMMAND, status);)
+	status = get_lpc(adap, I2C_LPC_REG_DEVICE_ADDR);
+	DEBPROTO(lpc_fprintf_debug("%s address reg %x : %x\n",__func__,I2C_LPC_REG_DEVICE_ADDR, status);)
+
+	status = get_lpc(adap, I2C_LPC_REG_STATUS);
+	DEBPROTO(lpc_fprintf_debug("%s status reg %x : %x\n",__func__,I2C_LPC_REG_STATUS, status);)
+}
+
+
+
+static void i2c_repstart(struct i2c_algo_lpc_data *adap)
+{
+	DEBPROTO(lpc_fprintf_debug(" Sr\n"));
+	set_lpc(adap, I2C_LPC_REG_COMMAND, I2C_LPC_REPSTART);
+}
+
+static void i2c_stop(struct i2c_algo_lpc_data *adap)
+{
+	DEBPROTO(lpc_fprintf_debug("%s :\n",__func__);)
+
+	set_lpc(adap, I2C_LPC_REG_COMMAND, I2C_LPC_STOP);
+	udelay(60);
+	set_lpc(adap, I2C_LPC_REG_COMMAND, 0x00);
+}
+
+
+
+
+static void i2c_start(struct i2c_algo_lpc_data *adap)
+{
+	unsigned char status;
+	int timeout = DEF_TIMEOUT;
+
+	print_reg(adap);
+
+	set_lpc(adap, I2C_LPC_REG_COMMAND, I2C_LPC_START);
+
+	print_reg(adap);
+
+}
+
+
+
+
+static int wait_for_bb(struct i2c_algo_lpc_data *adap)
+{
+
+	int timeout = DEF_TIMEOUT;
+	int status;
+
+	while (--timeout) {
+		status = get_lpc(adap, I2C_LPC_REG_STATUS);
+		
+		DEBPROTO(lpc_fprintf_debug("%s : Waiting for bus free status : %x\n",__func__,status);)
+
+		if(status == I2C_LPC_TD)
+		{
+			DEBPROTO(lpc_fprintf_debug("%s : Bus is free status : %x\n",__func__,status);)
+			break;
+		}
+	}
+
+	if (timeout == 0) {
+		DEBPROTO(lpc_fprintf_debug("%s : Timeout for free busy status : %x\n",__func__,status);)
+		return -ETIMEDOUT;
+	}
+
+	
+
+	return 0;
+}
+
+
+static int wait_for_be(int mode,struct i2c_algo_lpc_data *adap)
+{
+
+	int timeout = DEF_TIMEOUT;
+	unsigned char status;
+
+
+	while (--timeout) {
+
+		status = get_lpc(adap, I2C_LPC_REG_STATUS);
+	
+		DEBPROTO(lpc_fprintf_debug("%s : Waiting for bus empty status : %x\n",__func__,status);)
+
+		if(mode == 1)
+		{
+			if((status & I2C_LPC_IBB) && (status & I2C_LPC_TBE))
+			{
+				DEBPROTO(lpc_fprintf_debug("%s : Bus is empty status : %x\n",__func__,status);)
+				break;
+			}
+		}
+		else
+		{
+			if(status & I2C_LPC_TD)
+			{
+				DEBPROTO(lpc_fprintf_debug("%s : Bus is empty status : %x\n",__func__,status);)
+				break;
+			}
+		}
+		
+		status = get_lpc(adap, I2C_LPC_REG_TEST);
+		
+		DEBPROTO(lpc_fprintf_debug("%s : The test register data : %x\n",__func__,status);)
+		udelay(1); /* wait for 100 us */
+	}
+
+	if (timeout == 0) {
+		DEBPROTO(lpc_fprintf_debug("%s : Timeout waiting for Bus Empty\n",__func__);)
+		return -ETIMEDOUT;
+	}
+
+	return 0;
+}
+
+
+static int wait_for_bf(struct i2c_algo_lpc_data *adap)
+{
+
+	int timeout = DEF_TIMEOUT;
+	int status;
+
+
+	while (--timeout) {
+		status = get_lpc(adap, I2C_LPC_REG_STATUS);
+		
+		DEBPROTO(lpc_fprintf_debug("%s : Waiting for bus full status : %x\n",__func__,status);)
+
+		if(status & I2C_LPC_RBF)
+		{
+			DEBPROTO(lpc_fprintf_debug("%s : Bus is full status : %x\n",__func__,status);)
+			break;
+		}
+
+		status = get_lpc(adap, I2C_LPC_REG_TEST);
+		
+		DEBPROTO(lpc_fprintf_debug("%s : The test register data : %x\n",__func__,status);)
+		udelay(1); /* wait for 100 us */
+	}
+
+	if (timeout == 0) {
+		DEBPROTO(lpc_fprintf_debug("%s : Timeout waiting for Bus Full\n",__func__);)
+		return -ETIMEDOUT;
+	}
+
+	return 0;
+}
+
+static int wait_for_td(struct i2c_algo_lpc_data *adap)
+{
+
+	int timeout = DEF_TIMEOUT;
+	int status=0;
+
+	while (--timeout) {
+		udelay(4);
+		status = get_lpc(adap, I2C_LPC_REG_STATUS);
+		
+		DEBPROTO(lpc_fprintf_debug("%s : Waiting for bus done status : %x\n",__func__,status);)
+
+		if(status == I2C_LPC_TD)
+		{
+			DEBPROTO(lpc_fprintf_debug("%s : Bus is done status : %x\n",__func__,status);)
+			break;
+		}
+	}
+
+	if (timeout == 0) {
+		DEBPROTO(lpc_fprintf_debug("%s : Timeout waiting for Bus Done\n",__func__);)
+		return -ETIMEDOUT;
+	}
+
+	return 0;
+}
+
+
+
+static int wait_for_pin(struct i2c_algo_lpc_data *adap, int *status)
+{
+	int timeout = DEF_TIMEOUT;
+	*status = get_lpc(adap, I2C_LPC_REG_STATUS);
+
+	while ((*status & I2C_LPC_TBE) && --timeout) {
+		*status = get_lpc(adap, I2C_LPC_REG_STATUS);
+	}
+
+	if (timeout == 0)
+		return -ETIMEDOUT;
+
+	
+	return 0;
+}
+
+
+static int lpc_doAddress(struct i2c_algo_lpc_data *adap,struct i2c_msg *msg)
+{
+	unsigned short flags = msg->flags;
+	unsigned char addr;
+
+	addr = msg->addr << 1;
+	if (flags & I2C_M_RD)
+	{
+		addr |= 1;
+		DEBPROTO(lpc_fprintf_debug("step 7 : read mode then write device address 0x%x\n",addr);)
+	}
+	else
+	{
+		DEBPROTO(lpc_fprintf_debug("step 2 : write mode then write device address 0x%x\n",addr);)
+	}
+	
+	if (flags & I2C_M_REV_DIR_ADDR)
+	{
+		addr ^= 1;
+
+	}
+	i2c_outaddr(adap, addr);
+	return 0;
+
+}
+
+
+static int lpc_sendbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+{
+	struct i2c_algo_lpc_data *adap = i2c_adap->algo_data;
+	int i = 0,timeout=0;
+
+	unsigned int count = msg->len;
+	unsigned char *buf = msg->buf;
+
+	do{
+		lpc_doAddress(adap,msg);
+		set_lpc(adap, I2C_LPC_REG_BYTE_COUNT, (count-i) >= 4 ? 4:(count - i));
+		DEBPROTO(lpc_fprintf_debug("step 3 : write register count %x\n",count);)
+
+		if((count -i) >= 4)
+		{
+			i2c_outbyte1(adap, buf[i+0] & 0xff);
+			i2c_outbyte2(adap, buf[i+1] & 0xff);
+			i2c_outbyte3(adap, buf[i+2] & 0xff);
+			i2c_outbyte4(adap, buf[i+3] & 0xff);
+
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+1,buf[i+1]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+2,buf[i+2]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+3,buf[i+3]);)
+			i += 4;
+		}
+		else if((count -i) == 3)
+		{
+			i2c_outbyte1(adap, buf[i+0] & 0xff);
+			i2c_outbyte2(adap, buf[i+1] & 0xff);
+			i2c_outbyte3(adap, buf[i+2] & 0xff);
+
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+1,buf[i+1]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+2,buf[i+2]);)
+
+			i += 3;
+		}
+		else if((count -i) == 2)
+		{
+			i2c_outbyte1(adap, buf[i+0] & 0xff);
+			i2c_outbyte2(adap, buf[i+1] & 0xff);
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+1,buf[i+1]);)
+			i += 2;
+		}
+		else if((count -i) == 1)
+		{
+			i2c_outbyte1(adap, buf[i+0] & 0xff);
+			DEBPROTO(lpc_fprintf_debug("step 4 : Send data[%d] = %x\n",i+0,buf[i+0]);)
+			i += 1;
+		}
+		
+		/* Send START */
+		DEBPROTO(lpc_fprintf_debug("step 5-1 : Delay 6mS \n");)
+		udelay(6000);		
+		DEBPROTO(lpc_fprintf_debug("step 5-2 : Start to transfrom \n");)
+		i2c_stop(adap);
+		i2c_start(adap);
+		DEBPROTO(lpc_fprintf_debug("step 5-3 : Start done\n");)
+
+		udelay(400);	
+		DEBPROTO(lpc_fprintf_debug("step 6 : Waiting for BE\n");)
+		timeout = wait_for_td(adap);
+		if (timeout) {
+			DEBPROTO(lpc_fprintf_debug("step 6 : Timeout waiting for BE \n");)
+			return -1;
+		}
+	}while (i < count);
+		
+	if(i == count)
+	{
+		DEBPROTO(lpc_fprintf_debug("Writen %d bytes successd !\n",count);)
+		return i;
+	}
+	else
+	{	
+		DEBPROTO(lpc_fprintf_debug("Writen %d bytes failed \n",count);)
+		return -1;
+	}
+}
+
+static int lpc_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
+{
+	int i=0,timeout=0;
+	struct i2c_algo_lpc_data *adap = i2c_adap->algo_data;
+	int wfp;
+
+	unsigned int count = msg->len;
+	unsigned char *buf = msg->buf;
+
+	do{
+		lpc_doAddress(adap,msg);
+		set_lpc(adap, I2C_LPC_REG_BYTE_COUNT, (count-i) >= 4 ? 4:(count - i));
+		DEBPROTO(lpc_fprintf_debug("step 8 : write register count %d\n",count);)
+
+		/* Send START */
+		DEBPROTO(lpc_fprintf_debug("step 9-1 : Delay 6mS\n");)
+		udelay(6000);			
+		DEBPROTO(lpc_fprintf_debug("step 9-2 : Start to receive data\n");)
+		i2c_stop(adap);
+		i2c_start(adap);
+		DEBPROTO(lpc_fprintf_debug("step 9-3 : Start done\n");)
+
+		udelay(400);	
+		DEBPROTO(lpc_fprintf_debug("step 10 : Waiting for TD\n");)
+		timeout = wait_for_td(adap);
+		if (timeout) {
+			DEBPROTO(lpc_fprintf_debug("step 10 : Timeout waiting for TD \n");)
+			return -1;
+		}
+		
+		if((count -i) >= 4)
+		{
+			buf[i+0] = 0xff & i2c_inbyte1(adap);
+			buf[i+1] = 0xff & i2c_inbyte2(adap);
+			buf[i+2] = 0xff & i2c_inbyte3(adap);
+			buf[i+3] = 0xff & i2c_inbyte4(adap);
+			
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+1,buf[i+1]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+2,buf[i+2]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+3,buf[i+3]);)
+
+			i += 4;
+		}
+		else if((count -i) == 3)
+		{
+			buf[i+0] = 0xff & i2c_inbyte1(adap);
+			buf[i+1] = 0xff & i2c_inbyte2(adap);
+			buf[i+2] = 0xff & i2c_inbyte3(adap);
+
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+1,buf[i+1]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+2,buf[i+2]);)
+
+			i += 3;
+		}
+		else if((count -i) == 2)
+		{
+			buf[i+0] = 0xff & i2c_inbyte1(adap);
+			buf[i+1] = 0xff & i2c_inbyte2(adap);
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+0,buf[i+0]);)
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+1,buf[i+1]);)
+			i += 2;
+		}
+		else if((count -i) == 1)
+		{
+			buf[i+0] = 0xff & i2c_inbyte1(adap);
+			DEBPROTO(lpc_fprintf_debug("step 11 : Receive data[%d] = %x\n",i+0,buf[i+0]);)
+			i += 1;
+		}
+
+
+	}while(i < count);
+	
+	if(i == count)
+	{
+		DEBPROTO(lpc_fprintf_debug("Read %d bytes successd !\n",count);)
+		return i;
+	}
+	else
+	{	
+		DEBPROTO(lpc_fprintf_debug("Read %d bytes failed \n",count);)
+		return -1;
+	}
+
+	return i;
+}
+
+
+struct cpld_client_node {
+	struct i2c_client *client;
+	struct list_head   list;
+};
+#define LPC_I2C_MAX_NCHANS 6
+
+
+struct lpc_iic {
+	struct i2c_adapter *virt_adaps[LPC_I2C_MAX_NCHANS];
+	u8 last_chan;		/* last register value */
+};
+
+
+static int lpc_master_xfer(struct i2c_adapter *i2c_adap,
+		    struct i2c_msg *msgs,
+		    int num)
+{
+	struct i2c_algo_lpc_data *adap = i2c_adap->algo_data;
+	struct i2c_msg *pmsg;
+	int i;
+	int ret=0, timeout, status;
+
+	mutex_lock(&lpc_lock);
+
+	if (adap->xfer_begin)
+		adap->xfer_begin(&i2c_adap->nr);
+
+
+	for (i = 0;ret >= 0 && i < num; i++) {
+		pmsg = &msgs[i];
+
+		DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: Doing %s %d bytes to 0x%02x - %d of %d messages\n",
+		     pmsg->flags & I2C_M_RD ? "read" : "write",
+		     pmsg->len, pmsg->addr, i + 1, num);)
+
+		DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: Msg %d, addr=0x%x, flags=0x%x, len=%d\n",
+			    i, msgs[i].addr, msgs[i].flags, msgs[i].len);)
+
+		if (pmsg->flags & I2C_M_RD) {
+			ret = lpc_readbytes(i2c_adap, pmsg);
+
+			if (ret != pmsg->len) {
+				DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: fail: "
+					    "only read %d bytes.\n",ret));
+			} else {
+				DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: read %d bytes.\n",ret));
+			}
+		} else {
+
+			ret = lpc_sendbytes(i2c_adap, pmsg);
+
+			if (ret != pmsg->len) {
+				DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: fail: "
+					    "only wrote %d bytes.\n",ret));
+			} else {
+				DEBPROTO(lpc_fprintf_debug("lpc_xfer.o: wrote %d bytes.\n",ret));
+			}
+		}
+	}
+
+	if (adap->xfer_end)
+		adap->xfer_end(&i2c_adap->nr);
+	
+	mutex_unlock(&lpc_lock);
+
+	return i;
+
+}
+
+
+static u32 lpc_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_QUICK;
+}
+
+/* exported algorithm data: */
+static const struct i2c_algorithm lpc_algo = {
+	.master_xfer	= lpc_master_xfer,
+	//.smbus_xfer		= lpc_smbus_xfer,
+	.functionality	= lpc_func,
+};
+
+
+/*
+ * registering functions to load algorithms at runtime
+ */
+int lpc_add_iic_bus(struct i2c_adapter *adap,unsigned int id)
+{
+	//struct i2c_algo_lpc_data *lpc_adap = adap->3;
+	int rval,num;
+
+	DEB2(dev_dbg(&adap->dev, "hw routines registered.\n"));
+
+	/* register new adapter to i2c module... */
+	adap->algo = &lpc_algo;
+	
+	for(num = 0; num < LPC_I2C_MAX_NCHANS;num++)
+	{
+		adap->nr = num;
+		snprintf(adap->name, sizeof(adap->name),
+		 "i2c-%d-lpc (chan_id %d)", i2c_adapter_id(adap), num);
+		if(num)
+		{
+			rval = i2c_add_numbered_adapter(adap);
+		}
+		else
+		{
+			rval = i2c_add_adapter(adap);
+		}
+	}
+	return rval;
+}
+EXPORT_SYMBOL(lpc_add_iic_bus);
+
+
+#define DEFAULT_BASE 0x0a00
+
+static int lpc_base= 0x0a00;
+static u8 __iomem *lpc_base_iomem;
+
+static int lpc_irq;
+static int lpc_clock  = 0x1c;
+static int lpc_own    = 0x55;
+static int lpc_mmapped;
+
+static unsigned long lpc_base_addr = 0x0a00;
+static unsigned int  lpc_io_space_size = 2;
+
+static unsigned long LPC_INDEX_REG;
+static unsigned long LPC_DATA_REG;
+
+
+/* notice : removed static struct i2c_lpc_iic gpi; code -
+  this module in real supports only one device, due to missing arguments
+  in some functions, called from the algo-lpc module. Sometimes it's
+  need to be rewriten - but for now just remove this for simpler reading */
+
+static wait_queue_head_t lpc_wait;
+static int lpc_pending;
+static spinlock_t lock;
+static spinlock_t lpc_slock;
+
+static struct i2c_adapter lpc_iic_ops;
+
+struct cpld_dev_type {
+    struct resource *io_resource;
+    struct semaphore sem;
+    struct cdev cdev;
+};
+
+struct cpld_dev_type *cpld_device;
+
+
+/* ----- local functions ----------------------------------------------	*/
+
+static void lpc_cpld_setbyte(void *data, int ctl, int val)
+{
+	//udelay(2);
+    outb(ctl, LPC_INDEX_REG);
+    mb();
+
+    outb(val, LPC_DATA_REG);
+    mb();
+}
+
+static int lpc_cpld_getbyte(void *data, int ctl)
+{
+	u8 val = 0;
+	//udelay(2);
+    outb(ctl, LPC_INDEX_REG);
+    mb();
+
+    val = inb(LPC_DATA_REG);
+    mb();
+
+    return val;
+}
+
+static void lpc_iic_setbyte(void *data, int ctl, int val)
+{
+    if (!cpld_device)
+        return -ENOTTY;
+
+    if (down_interruptible(&cpld_device->sem))
+        return -ERESTARTSYS;
+	
+	lpc_cpld_setbyte(data,ctl,val);
+	
+	up(&cpld_device->sem);
+	DEB2(printk("%s REG[%x] = %x\n",__func__,ctl,val);)
+}
+
+static int lpc_iic_getbyte(void *data, int ctl)
+{
+	u8 val = 0;
+    if (!cpld_device)
+        return -ENOTTY;
+
+    if (down_interruptible(&cpld_device->sem))
+        return -ERESTARTSYS;
+
+	val = lpc_cpld_getbyte(data,ctl);
+	
+	up(&cpld_device->sem);
+	DEB2(printk("%s REG[%x] = %x\n",__func__,ctl,val);)
+    return val;
+}
+
+int cig_cpld_read_register(u8 reg_off, u8 *val)
+{
+    if (!cpld_device)
+        return -ENOTTY;
+
+    if (down_interruptible(&cpld_device->sem))
+        return -ERESTARTSYS;
+
+    *val = lpc_cpld_getbyte(cpld_device, reg_off);   
+
+	up(&cpld_device->sem);
+
+    return 0;
+}
+EXPORT_SYMBOL(cig_cpld_read_register);
+
+int cig_cpld_write_register(u8 reg_off, u8 val)
+{
+    if (!cpld_device)
+        return -ENOTTY;
+
+    if (down_interruptible(&cpld_device->sem))
+        return -ERESTARTSYS;
+
+    lpc_cpld_setbyte(cpld_device, reg_off, val);
+	up(&cpld_device->sem);
+    return 0;
+}
+EXPORT_SYMBOL(cig_cpld_write_register);
+
+
+
+static int lpc_iic_getown(void *data)
+{
+	return (lpc_own);
+}
+
+
+static int lpc_iic_getclock(void *data)
+{
+	return (lpc_clock);
+}
+
+static void lpc_iic_waitforpin(void *data)
+{
+	DEFINE_WAIT(wait);
+	int timeout = 2;
+	unsigned long flags;
+
+	if (lpc_irq > 0) {
+		spin_lock_irqsave(&lock, flags);
+		if (lpc_pending == 0) {
+			spin_unlock_irqrestore(&lock, flags);
+			prepare_to_wait(&lpc_wait, &wait, TASK_INTERRUPTIBLE);
+			if (schedule_timeout(timeout*HZ)) {
+				spin_lock_irqsave(&lock, flags);
+				if (lpc_pending == 1) {
+					lpc_pending = 0;
+				}
+				spin_unlock_irqrestore(&lock, flags);
+			}
+			finish_wait(&lpc_wait, &wait);
+		} else {
+			lpc_pending = 0;
+			spin_unlock_irqrestore(&lock, flags);
+		}
+	} else {
+		udelay(100);
+	}
+}
+
+
+static irqreturn_t lpc_iic_handler(int this_irq, void *dev_id) {
+	spin_lock(&lock);
+	lpc_pending = 1;
+	spin_unlock(&lock);
+	wake_up_interruptible(&lpc_wait);
+	return IRQ_HANDLED;
+}
+
+static int board_id = 0;
+
+
+static int lpc_select_chan(void *data)
+{
+	unsigned int chan_id=0;
+	chan_id = *(unsigned int *)data;
+	chan_id -= 1;
+	DEB2(printk("step 1 : selest channel id = %d\n",chan_id);)
+	lpc_iic_setbyte(data,I2C_LPC_REG_BUS_SEL,chan_id);
+
+	return 0;
+}
+
+static int lpc_deselect_chan(void *data)
+{
+
+	unsigned int chan_id=0;
+	chan_id = *(unsigned int *)data;
+	chan_id -= 1;
+	DEB2(printk("step last :deselect channel id = %d\n",chan_id);)
+
+	return 0;
+}
+
+
+/* ------------------------------------------------------------------------
+ * Encapsulate the above functions in the correct operations structure.
+ * This is only done when more than one hardware adapter is supported.
+ */
+static struct i2c_algo_lpc_data lpc_iic_data = {
+	.setlpc	    = lpc_iic_setbyte,
+	.getlpc	    = lpc_iic_getbyte,
+	.getown	    = lpc_iic_getown,
+	.getclock   = lpc_iic_getclock,
+	.waitforpin = lpc_iic_waitforpin,
+	.xfer_begin = lpc_select_chan,
+	.xfer_end	= lpc_deselect_chan,
+};
+
+#include <linux/i2c-algo-bit.h>
+
+static struct i2c_adapter lpc_iic_arr_ops[LPC_I2C_MAX_NCHANS] = {0};
+
+static void dummy_setscl(void *data, int state)
+{
+	return 1;
+}
+
+static void dummy_setsda(void *data, int state)
+{
+	return 1;
+
+}
+
+static int dummy_getscl(void *data)
+{
+	return 1;
+
+}
+
+static int dummy_getsda(void *data)
+{
+	return 1;
+}
+
+
+static struct i2c_algo_bit_data dummy_algo_data = {
+	.setsda		= dummy_setsda,
+	.setscl		= dummy_setscl,
+	.getsda		= dummy_getsda,
+	.getscl		= dummy_getscl,
+	.udelay		= 50,
+	.timeout	= HZ,
+};
+
+
+static int dummy_xfer(struct i2c_adapter *i2c_adap,
+		    struct i2c_msg *msgs,
+		    int num)
+{
+	return 1;
+}
+
+static u32 dummy_func(struct i2c_adapter *adap)
+{
+	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_SMBUS_QUICK;
+}
+
+
+static const struct i2c_algorithm dummy_algo = {
+	.master_xfer	= dummy_xfer,
+	.functionality	= dummy_func,
+};
+
+
+
+static struct i2c_adapter i2c_dummy = {
+	.owner		= THIS_MODULE,
+	.class		= I2C_CLASS_HWMON,
+	.algo_data	= &dummy_algo_data,
+	.algo		= &dummy_algo,
+	.name		= "i2c_dummy",
+};
+
+
+static int lpc_iic_match(struct device *dev, unsigned int id)
+{
+	/* sanity checks for lpc_mmapped I/O */
+
+	DEB2(printk("lpc_iic_match\n");)
+
+
+	if (lpc_base < DEFAULT_BASE) {
+		dev_err(dev, "incorrect lpc_base address (%#x) specified "
+		       "for lpc_mmapped I/O\n", lpc_base);
+		return 0;
+	}
+
+	if (lpc_base == 0) {
+		lpc_base = DEFAULT_BASE;
+	}
+	return 1;
+}
+
+static int lpc_iic_probe(struct device *dev, unsigned int id)
+{
+	int rval,num;
+
+	lpc_fprintf_init();
+
+	DEB2(printk("lpc_iic_probe\n");)
+
+	mutex_init(&lpc_lock);
+	if(board_id == 1)
+		i2c_add_adapter(&i2c_dummy);
+	
+	for(num = 0; num < LPC_I2C_MAX_NCHANS;num++)
+	{
+		lpc_iic_arr_ops[num].dev.parent = dev;
+		lpc_iic_arr_ops[num].owner = THIS_MODULE;
+		lpc_iic_arr_ops[num].class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
+		lpc_iic_arr_ops[num].algo = &lpc_algo;
+		lpc_iic_arr_ops[num].algo_data = &lpc_iic_data,
+		lpc_iic_arr_ops[num].nr=num;
+		snprintf(lpc_iic_arr_ops[num].name, sizeof(lpc_iic_arr_ops[num].name), "i2c-%d-lpc", i2c_adapter_id(&lpc_iic_arr_ops[num]), num);
+		rval |= i2c_add_adapter(&lpc_iic_arr_ops[num]);
+		DEB2(printk("%s\n",lpc_iic_arr_ops[num].name);)
+	}
+	
+	return 0;
+}
+
+static int lpc_iic_remove(struct device *dev, unsigned int id)
+{
+	int num;
+	DEB2(printk("lpc_iic_remove\n"));
+
+	lpc_fprintf_exit();
+	for(num = LPC_I2C_MAX_NCHANS - 1; num >= 0 ;num--)
+		i2c_del_adapter(&lpc_iic_arr_ops[num]);
+
+	if(board_id == 1)
+		i2c_del_adapter(&i2c_dummy);
+
+	return 0;
+}
+
+static struct isa_driver i2c_lpc_driver = {
+	.match		= lpc_iic_match,
+	.probe		= lpc_iic_probe,
+	.remove		= lpc_iic_remove,
+	.driver = {
+		.owner	= THIS_MODULE,
+		.name	= "lpc-iic",
+	},
+};
+
+
+struct kset cpld_kset;
+static int cpld_major = 0;
+static int cpld_minor = 0;
+
+struct cpld_rw_msg {
+    unsigned char addr;
+    unsigned char data;
+};
+
+
+static struct cpld_rw_msg param_read = {-1};
+static struct cpld_rw_msg param_write = {-1};
+
+void cpld_sysfs_kobj_release(struct kobject *kobj)
+{
+    return;
+}
+
+int cpld_sysfs_add_attr(struct kobject* kobj, char* attr_name)
+{
+
+	struct attribute *attr;
+
+    attr = kmalloc(sizeof(struct attribute), GFP_KERNEL);
+    attr->name = attr_name;
+    attr->mode = 0644;
+
+    return sysfs_create_file(kobj, attr);
+}
+
+
+static ssize_t cpld_sysfs_show(struct kobject *kobj, struct attribute *attr, char *buffer)
+{
+	u8 val,ret;
+
+    if (0 == strcmp(attr->name, "read"))
+    {
+		val = lpc_iic_getbyte(NULL,param_read.addr);	
+		ret = sprintf(buffer,"read : addr = %x val = %x\n",param_read.addr, val);
+
+    }
+    else if (0 == strcmp(attr->name, "write"))
+    {
+		lpc_iic_setbyte(NULL, param_write.addr,param_write.data);
+		ret = sprintf(buffer,"write : addr = %x val = %x\n",param_write.addr, param_write.data);
+    }
+	else if (0 == strcmp(attr->name, "version"))
+    {
+		val = lpc_iic_getbyte(NULL, 0x02);
+		ret = sprintf(buffer,"CPLD version : V%02x\n",val);
+    }
+	
+    return ret;
+
+}
+
+static ssize_t cpld_sysfs_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t count)
+{
+    int param[3];
+    
+    if (0 == strcmp(attr->name, "read"))
+    {
+        sscanf(buffer, "0x%02x", &param[0]);
+        param_read.addr = param[0];
+    }
+    else if (0 == strcmp(attr->name, "write"))
+    {
+        sscanf(buffer, "0x%2x 0x%02x", &param[0], &param[1]);
+        param_write.addr = param[0];
+        param_write.data = param[1];
+    }
+	return count;
+}
+
+
+
+static struct sysfs_ops cpld_sysfs_ops = 
+{   
+    .show   = cpld_sysfs_show,
+    .store  = cpld_sysfs_store,
+};
+
+static struct kobj_type cpld_kobj_type = 
+{
+    .release        = cpld_sysfs_kobj_release,
+    .sysfs_ops      = &cpld_sysfs_ops,
+    .default_attrs  = NULL,
+};
+
+
+static const char driver_name[] = "cpld_drv";
+static atomic_t cpld_available = ATOMIC_INIT(1);
+static struct class *cpld_class;
+#define CPLD_IOC_MAGIC  '['
+
+#define CPLD_IOC_RDREG  _IOR(CPLD_IOC_MAGIC, 0, struct cpld_rw_msg)
+#define CPLD_IOC_WRREG  _IOW(CPLD_IOC_MAGIC, 1, struct cpld_rw_msg)
+
+#define CPLD_IOC_MAXNR  2
+
+
+int cpld_open(struct inode *inode, struct file *filp)
+{
+    struct cpld_dev_type *dev;
+
+    if (! atomic_dec_and_test(&cpld_available)) {
+        atomic_inc(&cpld_available);
+        return -EBUSY;
+    }
+
+    dev = container_of(inode->i_cdev, struct cpld_dev_type, cdev);
+    filp->private_data = dev;
+
+    return 0;
+}
+
+int cpld_release(struct inode *inode, struct file *flip)
+{
+    atomic_inc(&cpld_available);
+    return 0;
+}
+
+
+long cpld_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+    int rc = 0; 
+	int err = 0;
+    struct cpld_dev_type *dev = (struct cpld_dev_type *)filp->private_data;
+    struct cpld_rw_msg msg;
+
+    if (_IOC_TYPE(cmd) != CPLD_IOC_MAGIC)
+        return -ENOTTY;
+    if (_IOC_NR(cmd) > CPLD_IOC_MAXNR)
+        return -ENOTTY;
+
+    if (_IOC_DIR(cmd) & _IOC_READ)
+        err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd));
+    if (_IOC_DIR(cmd) & _IOC_WRITE)
+        err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd));
+    if (err)
+        return -EFAULT;
+
+    if (down_interruptible(&dev->sem))
+        return -ERESTARTSYS;
+
+    switch(cmd){
+        case CPLD_IOC_RDREG:
+            rc = copy_from_user(&msg, (void __user *)arg, sizeof(msg));
+            if (!rc) {
+                msg.data = lpc_cpld_getbyte(dev, msg.addr);
+                rc = copy_to_user((void __user *)arg, &msg, sizeof(msg));
+            }
+            break;
+
+        case CPLD_IOC_WRREG:
+            rc = copy_from_user(&msg, (void __user *)arg, sizeof(msg));
+            if (!rc) {
+                lpc_cpld_setbyte(dev, msg.addr, msg.data);
+            }
+            break;
+        default:
+            rc = -ENOTTY;
+            break;
+    }
+    up(&dev->sem);
+
+    return rc;
+}
+
+struct file_operations cpld_fops = {
+    .owner          = THIS_MODULE,
+    .open           = cpld_open,
+    .unlocked_ioctl = cpld_ioctl,
+    .release        = cpld_release,
+};
+	
+
+static void cpld_setup_cdev(struct cpld_dev_type *dev)
+{
+    int err, devno = MKDEV(cpld_major, cpld_minor);
+
+    cdev_init(&dev->cdev, &cpld_fops);
+    dev->cdev.owner = THIS_MODULE;
+    dev->cdev.ops = &cpld_fops;
+    err = cdev_add(&dev->cdev, devno, 1);
+
+    if (err)
+        DEB2(printk(KERN_NOTICE "Error %d adding cpld", err);)
+}
+//#define CPLD_KTHREAD_TEST
+#ifdef CPLD_KTHREAD_TEST
+#include <linux/kthread.h>
+#include <linux/sched.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+static struct task_struct *test_TaskStruct;
+void get_random_bytes(void *buf, int nbytes);
+
+#define LM75_REAR_LEFT_PATH "/sys/class/hwmon/hwmon5/temp1_input"
+#define LM75_REAR_RIGHT_PATH "/sys/class/hwmon/hwmon6/temp1_input"
+
+
+static int threadTask(void* arg)
+{
+	static int count =0;
+	unsigned char lpc_read_data=0;
+	unsigned char lpc_write_data=0;
+	unsigned char lpc_random_data=0;
+	
+	struct file *temp1_file = NULL,*temp2_file = NULL;
+	unsigned char temp1_buffer[8]={0},temp2_buffer[8]={0};
+	
+	mm_segment_t old_fs;
+	while(1)
+	{
+		if(kthread_should_stop())
+		{
+			DEB2(printk("threadTask: kthread_should_stop\n"));
+			break;
+		}	
+
+#if 1
+		get_random_bytes(&lpc_random_data,1);
+		
+		lpc_write_data = lpc_random_data;
+		
+		lpc_iic_setbyte(NULL,I2C_LPC_REG_TEST,lpc_write_data);		
+		//DEB2(printk("threadTask: lpc write reg[01] data : %02x\n",lpc_write_data));
+
+		lpc_read_data = lpc_iic_getbyte(NULL,I2C_LPC_REG_TEST);
+		//DEB2(printk("threadTask: lpc read reg[01] data : %02x\n",lpc_read_data));
+		udelay(10000);
+		if(lpc_write_data != lpc_read_data)
+		{
+			printk("Error : WRITE %02x != READ %02x\n",lpc_write_data,lpc_read_data);
+		}
+		msleep(10);
+#else
+
+		if(temp1_file != NULL)
+			temp1_file = filp_open(LM75_REAR_LEFT_PATH, O_RDONLY , 0);
+		if (IS_ERR(temp1_file)) {
+			printk("error occured while opening file %s, exiting...\n", LM75_REAR_LEFT_PATH);
+		}
+
+		if(temp2_file != NULL)
+			temp2_file = filp_open(LM75_REAR_RIGHT_PATH, O_RDONLY ,0);
+		if (IS_ERR(temp2_file)) {
+			printk("error occured while opening file %s, exiting...\n", LM75_REAR_RIGHT_PATH);
+		}
+
+
+		old_fs = get_fs();
+		set_fs(KERNEL_DS);
+
+		temp1_file->f_op->read(temp1_file, (char *)temp1_buffer, strlen(temp1_buffer), &temp1_file->f_pos);
+
+		temp2_file->f_op->read(temp2_file, (char *)temp2_buffer, strlen(temp2_buffer), &temp2_file->f_pos);
+		
+		set_fs(old_fs);
+
+		if((simple_strtoul(temp1_buffer,NULL,10) >=30000) || (simple_strtoul(temp2_buffer,NULL,10) >=30000))
+		{
+			lpc_iic_setbyte(NULL,0x40,0xff);			
+			printk("Full speed\n");
+		}
+
+		msleep(1000);
+#endif
+	}
+}
+ 
+static int init_kernel_Thread(void)
+{
+	test_TaskStruct=kthread_create(threadTask,NULL,"KernelThead",0);
+	if(IS_ERR(test_TaskStruct))
+	{
+		printk("kthread_create error\n");
+	}
+	else
+	{
+		wake_up_process(test_TaskStruct);
+	}
+	 return 0;
+}
+
+static void exit_kernel_Thread(void)
+{
+	kthread_stop(test_TaskStruct);
+	test_TaskStruct = NULL;
+}
+
+#endif
+
+
+static int __init cpld_init(void)
+{
+	int rval,rc;
+	dev_t dev;
+	
+	DEB2(printk("cpld_init\n");)
+
+    cpld_device = kzalloc(sizeof(struct cpld_dev_type), GFP_KERNEL);
+    if (!cpld_device)
+        goto error3;
+    cpld_device->io_resource = request_region(lpc_base_addr, 
+                                            lpc_io_space_size, "lpc-i2c");
+    if (!cpld_device->io_resource) {
+        DEB2(printk("lpc: claim I/O resource fail\n");)
+        goto error2;
+    }
+    sema_init(&cpld_device->sem, 1);
+
+    LPC_INDEX_REG = lpc_base_addr;
+    LPC_DATA_REG  = lpc_base_addr + 1;
+
+	rval = lpc_bus_init();
+	rval = lpc_register_driver(&i2c_lpc_driver, 1);
+
+	kobject_set_name(&cpld_kset.kobj, "cpld");
+	cpld_kset.kobj.ktype= &cpld_kobj_type;
+	kset_register(&cpld_kset);
+	cpld_sysfs_add_attr(&cpld_kset.kobj, "read");
+	cpld_sysfs_add_attr(&cpld_kset.kobj, "write");
+	cpld_sysfs_add_attr(&cpld_kset.kobj, "version");
+
+    if (cpld_major) {
+        dev = MKDEV(cpld_major, cpld_minor);
+        rc = register_chrdev_region(dev, 1, "cpld");
+    } else {
+        rc = alloc_chrdev_region(&dev, cpld_major, 1, "cpld");
+        cpld_major = MAJOR(dev);
+    }
+
+    cpld_setup_cdev(cpld_device);
+
+    cpld_class = class_create(THIS_MODULE, KBUILD_MODNAME);
+    if (!cpld_class) {
+        DEB2(printk("failed to create class\n");)
+        goto error1;
+    }
+
+    device_create(cpld_class, NULL, dev, NULL, "cpld");
+#ifdef CPLD_KTHREAD_TEST
+	init_kernel_Thread();
+#endif
+	
+	return 0;
+error1:
+    cdev_del(&cpld_device->cdev);
+    unregister_chrdev_region(dev, 1);
+error2:
+    release_resource(cpld_device->io_resource);
+error3:
+    kfree(cpld_device);
+	
+	return rc;
+}
+
+static void __exit cpld_exit(void)
+{
+	DEB2(printk("cpld_exit\n"));
+	
+	lpc_unregister_driver(&i2c_lpc_driver);
+	lpc_bus_exit();
+#ifdef CPLD_KTHREAD_TEST
+	exit_kernel_Thread();
+#endif
+	dev_t devno = MKDEV(cpld_major, cpld_minor);
+
+    cdev_del(&cpld_device->cdev);
+    if (cpld_class) {
+        device_destroy(cpld_class, devno);
+        class_destroy(cpld_class);
+    }
+
+    kobject_put(&cpld_kset.kobj);
+
+	if(cpld_kset.kobj.ktype)
+		kset_unregister(&cpld_kset);
+
+    if (cpld_device) {
+        if (cpld_device->io_resource)
+            release_resource(cpld_device->io_resource);
+
+        kfree(cpld_device);
+    }
+	unregister_chrdev_region(devno, 1);
+
+
+}
+
+module_param(cpld_major, int, S_IRUGO);
+module_param(cpld_minor, int, S_IRUGO);
+module_param(i2c_debug, int, S_IRUGO);
+module_param(board_id, int, S_IRUGO);
+
+module_init(cpld_init);
+module_exit(cpld_exit);
+
+MODULE_AUTHOR("Zhang Peng <zhangpeng@cigtech.com>");
+MODULE_DESCRIPTION("cs6436-56p-cpld driver");
+MODULE_LICENSE("GPL");
+
+
+ 
+
+
+
+
+
+
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-fan.c b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-fan.c
new file mode 100755
index 0000000000..09beb6912c
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-fan.c
@@ -0,0 +1,451 @@
+/*
+ * A hwmon driver for the CIG cs6436-56P fan
+ *
+ * Copyright (C) 2018 Cambridge, Inc.
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/jiffies.h>
+#include <linux/i2c.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
+#include <linux/mutex.h>
+#include <linux/sysfs.h>
+#include <linux/slab.h>
+#include <linux/dmi.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h>
+#include <linux/syscalls.h>
+#include <linux/kthread.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+
+
+
+#define  FAN_SPEED_DUTY_TO_CPLD_STEP 10 
+
+static struct cs6436_56p_fan_data *cs6436_56p_fan_update_device(struct device *dev);
+static ssize_t fan_show_value(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da,
+                              const char *buf, size_t count);
+
+extern  int cig_cpld_write_register(u8 reg_off, u8 val);
+extern int cig_cpld_read_register(u8 reg_off, u8 *val);
+
+/* fan related data, the index should match sysfs_fan_attributes
+ */
+static const u8 fan_reg[] = {
+    0x41,       /*  fan enable/disable */
+    0x40,       /* fan PWM(for all fan) */
+    0x42,       /* front fan 1 speed(rpm) */
+    0x44,       /* front fan 2 speed(rpm) */
+    0x46,       /* front fan 3 speed(rpm) */
+    0x48,       /* front fan 4 speed(rpm) */
+    0x4a,       /* front fan 5 speed(rpm) */
+    0x43,       /* rear fan 1 speed(rpm) */
+    0x45,       /* rear fan 2 speed(rpm) */
+    0x47,       /* rear fan 3 speed(rpm) */
+    0x49,       /* rear fan 4 speed(rpm) */
+    0x4b,       /* rear fan 5 speed(rpm) */
+};
+
+
+/* Each client has this additional data */
+struct cs6436_56p_fan_data {
+    struct platform_device *pdev;
+    struct device   *hwmon_dev;
+    struct mutex     update_lock;
+    char             valid;           /* != 0 if registers are valid */
+    unsigned long    last_updated;    /* In jiffies */
+    u8               reg_val[ARRAY_SIZE(fan_reg)]; /* Register value */
+};
+
+static struct cs6436_56p_fan_data  *fan_data = NULL;
+
+enum fan_id {
+    FAN1_ID,
+    FAN2_ID,
+    FAN3_ID,
+    FAN4_ID,
+    FAN5_ID,
+};
+
+enum sysfs_fan_attributes {
+    FAN_STATE_REG,
+    FAN_DUTY_CYCLE_PERCENTAGE, /* Only one CPLD register to control duty cycle for all fans */
+    FAN1_FRONT_SPEED_RPM,
+    FAN2_FRONT_SPEED_RPM,
+    FAN3_FRONT_SPEED_RPM,
+    FAN4_FRONT_SPEED_RPM,
+    FAN5_FRONT_SPEED_RPM,
+    FAN1_REAR_SPEED_RPM,
+    FAN2_REAR_SPEED_RPM,
+    FAN3_REAR_SPEED_RPM,
+    FAN4_REAR_SPEED_RPM,
+    FAN5_REAR_SPEED_RPM,
+    FAN1_STATE,
+    FAN2_STATE,
+    FAN3_STATE,
+    FAN4_STATE,
+    FAN5_STATE,
+    FAN1_FAULT,
+    FAN2_FAULT,
+    FAN3_FAULT,
+    FAN4_FAULT,
+    FAN5_FAULT,
+};
+
+/* Define attributes
+ */
+#define DECLARE_FAN_STATE_SENSOR_DEV_ATTR(index) \
+	static SENSOR_DEVICE_ATTR(fan##index##_state, S_IRUGO, fan_show_value, NULL, FAN##index##_STATE)
+#define DECLARE_FAN_STATE_ATTR(index)	  &sensor_dev_attr_fan##index##_state.dev_attr.attr
+
+#define DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(index) \
+    static SENSOR_DEVICE_ATTR(fan##index##_fault, S_IRUGO, fan_show_value, NULL, FAN##index##_FAULT)
+#define DECLARE_FAN_FAULT_ATTR(index)      &sensor_dev_attr_fan##index##_fault.dev_attr.attr
+
+#define DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR(index) \
+    static SENSOR_DEVICE_ATTR(fan##index##_duty_cycle_percentage, S_IWUSR | S_IRUGO, fan_show_value, set_duty_cycle, FAN##index##_DUTY_CYCLE_PERCENTAGE)
+#define DECLARE_FAN_DUTY_CYCLE_ATTR(index) &sensor_dev_attr_fan##index##_duty_cycle_percentage.dev_attr.attr
+
+#define DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(index) \
+    static SENSOR_DEVICE_ATTR(fan##index##_front_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_FRONT_SPEED_RPM);\
+    static SENSOR_DEVICE_ATTR(fan##index##_rear_speed_rpm, S_IRUGO, fan_show_value, NULL, FAN##index##_REAR_SPEED_RPM)
+#define DECLARE_FAN_SPEED_RPM_ATTR(index)  &sensor_dev_attr_fan##index##_front_speed_rpm.dev_attr.attr, \
+                                           &sensor_dev_attr_fan##index##_rear_speed_rpm.dev_attr.attr
+
+/* 5 fan state attributes in this platform */
+DECLARE_FAN_STATE_SENSOR_DEV_ATTR(1);
+DECLARE_FAN_STATE_SENSOR_DEV_ATTR(2);
+DECLARE_FAN_STATE_SENSOR_DEV_ATTR(3);
+DECLARE_FAN_STATE_SENSOR_DEV_ATTR(4);
+DECLARE_FAN_STATE_SENSOR_DEV_ATTR(5);
+
+
+/* 5 fan fault attributes in this platform */
+DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(1);
+DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(2);
+DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(3);
+DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(4);
+DECLARE_FAN_FAULT_SENSOR_DEV_ATTR(5);
+
+/* 5 fan speed(rpm) attributes in this platform */
+DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(1);
+DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(2);
+DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(3);
+DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(4);
+DECLARE_FAN_SPEED_RPM_SENSOR_DEV_ATTR(5);
+
+/* 1 fan duty cycle attribute in this platform */
+DECLARE_FAN_DUTY_CYCLE_SENSOR_DEV_ATTR();
+
+static struct attribute *cs6436_56p_fan_attributes[] = {
+    /* fan related attributes */
+    DECLARE_FAN_STATE_ATTR(1),
+    DECLARE_FAN_STATE_ATTR(2),
+    DECLARE_FAN_STATE_ATTR(3),
+    DECLARE_FAN_STATE_ATTR(4),
+    DECLARE_FAN_STATE_ATTR(5),
+    DECLARE_FAN_FAULT_ATTR(1),
+    DECLARE_FAN_FAULT_ATTR(2),
+    DECLARE_FAN_FAULT_ATTR(3),
+    DECLARE_FAN_FAULT_ATTR(4),
+    DECLARE_FAN_FAULT_ATTR(5),
+    DECLARE_FAN_SPEED_RPM_ATTR(1),
+    DECLARE_FAN_SPEED_RPM_ATTR(2),
+    DECLARE_FAN_SPEED_RPM_ATTR(3),
+    DECLARE_FAN_SPEED_RPM_ATTR(4),
+    DECLARE_FAN_SPEED_RPM_ATTR(5),
+    DECLARE_FAN_DUTY_CYCLE_ATTR(),
+    NULL
+};
+
+#define FAN_MAX_DUTY_CYCLE              100
+#define FAN_REG_VAL_TO_SPEED_RPM_STEP   100
+
+/* fan utility functions
+ */
+static u32 reg_val_to_duty_cycle(u8 reg_val)
+{
+	if (reg_val 
+== 0xFF) {
+		return 100;
+	}
+	return ((u32)(reg_val) * 100)/ 255;
+}
+
+static u8 duty_cycle_to_reg_val(u8 duty_cycle)
+{
+	if (duty_cycle >= FAN_MAX_DUTY_CYCLE) {
+		return 0xFF;
+	}
+
+	return 255 / 10 * (duty_cycle / 10);
+}
+
+static u32 reg_val_to_speed_rpm(u8 reg_val)
+{
+    return (u32)reg_val * FAN_REG_VAL_TO_SPEED_RPM_STEP;
+}
+
+static u8 reg_val_to_is_state(u8 reg_val, enum fan_id id)
+{
+    u8 mask = (1 << id);
+
+    reg_val &= mask;
+
+    return reg_val ? 0 : 1;
+}
+
+static u8 is_fan_fault(struct cs6436_56p_fan_data *data, enum fan_id id)
+{
+    u8 ret = 1;
+    int front_fan_index = FAN1_FRONT_SPEED_RPM + id;
+    int rear_fan_index  = FAN1_REAR_SPEED_RPM  + id;
+
+    /* Check if the speed of front or rear fan is ZERO,
+     */
+    if (reg_val_to_speed_rpm(data->reg_val[front_fan_index]) &&
+            reg_val_to_speed_rpm(data->reg_val[rear_fan_index]))  {
+        ret = 0;
+    }
+
+    return ret;
+}
+
+static ssize_t set_duty_cycle(struct device *dev, struct device_attribute *da,
+                              const char *buf, size_t count)
+{
+    int error, value;
+
+    error = kstrtoint(buf, 10, &value);
+    if (error)
+        return error;
+
+    if (value <= 0 || value > FAN_MAX_DUTY_CYCLE)
+        return -EINVAL;
+
+    cig_cpld_write_register(fan_reg[FAN_DUTY_CYCLE_PERCENTAGE], duty_cycle_to_reg_val(value));
+    
+    return count;
+}
+
+static ssize_t fan_show_value(struct device *dev, struct device_attribute *da,
+                              char *buf)
+{
+    struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
+
+    cs6436_56p_fan_update_device(dev);
+	
+    struct cs6436_56p_fan_data *data = fan_data;
+	
+    ssize_t ret = 0;
+
+    if (data->valid) {
+	switch (attr->index) {
+			
+	    case FAN1_STATE:
+	    case FAN2_STATE:
+	    case FAN3_STATE:
+	    case FAN4_STATE:
+	    case FAN5_STATE:
+ //printk("FAN_STATE_REG: 0x%x\n", data->reg_val[FAN_STATE_REG]);
+ //printk("index: %d\n", attr->index);
+	        ret = sprintf(buf, "%d\n",
+	                      reg_val_to_is_state(data->reg_val[FAN_STATE_REG],
+	                      attr->index - FAN1_STATE));
+	        break;
+	    case FAN_DUTY_CYCLE_PERCENTAGE:
+	    {
+	        u32 duty_cycle = reg_val_to_duty_cycle(data->reg_val[FAN_DUTY_CYCLE_PERCENTAGE]);
+	        ret = sprintf(buf, "%u\n", duty_cycle);
+	        break;
+	    }
+	    case FAN1_FRONT_SPEED_RPM:
+	    case FAN2_FRONT_SPEED_RPM:
+	    case FAN3_FRONT_SPEED_RPM:
+	    case FAN4_FRONT_SPEED_RPM:
+	    case FAN5_FRONT_SPEED_RPM:
+	    case FAN1_REAR_SPEED_RPM:
+	    case FAN2_REAR_SPEED_RPM:
+	    case FAN3_REAR_SPEED_RPM:
+	    case FAN4_REAR_SPEED_RPM:
+	    case FAN5_REAR_SPEED_RPM:
+// printk("FAN_seed_REG: 0x%x\n", data->reg_val[attr->index]);
+// printk("index: %d\n", attr->index);
+	        ret = sprintf(buf, "%u\n", reg_val_to_speed_rpm(data->reg_val[attr->index]));
+	        break;
+
+	    case FAN1_FAULT:
+	    case FAN2_FAULT:
+	    case FAN3_FAULT:
+	    case FAN4_FAULT:
+	    case FAN5_FAULT:
+	        ret = sprintf(buf, "%d\n", is_fan_fault(data, attr->index - FAN1_FAULT));
+	        break;
+	    default:
+	        break;
+        }
+    }
+
+    return ret;
+}
+
+static const struct attribute_group cs6436_56p_fan_group = {
+    .attrs = cs6436_56p_fan_attributes,
+};
+
+static struct cs6436_56p_fan_data *cs6436_56p_fan_update_device(struct device *dev)
+{
+    struct cs6436_56p_fan_data *data = fan_data;
+
+    mutex_lock(&data->update_lock);
+
+    if (time_after(jiffies, data->last_updated + HZ + HZ / 2) ||
+            !data->valid) {
+        int i;
+
+        data->valid = 0;
+
+        /* Update fan data
+         */
+        for (i = 0; i < ARRAY_SIZE(data->reg_val); i++) {
+            u8 status;
+            (void)cig_cpld_read_register(fan_reg[i], &status);
+
+            if (status < 0) {
+                data->valid = 0;
+                mutex_unlock(&data->update_lock);
+                return data;
+            }
+            else {
+                data->reg_val[i] = status;
+            }
+        }
+
+        data->last_updated = jiffies;
+        data->valid = 1;
+    }
+
+    mutex_unlock(&data->update_lock);
+
+    return data;
+}
+
+static int cs6436_56p_fan_probe(struct platform_device *pdev)
+{
+    int status = -1;
+    /* Register sysfs hooks */
+    status = sysfs_create_group(&pdev->dev.kobj, &cs6436_56p_fan_group);
+    if (status) {
+        goto exit;
+
+    }
+    
+	fan_data->hwmon_dev = hwmon_device_register(&pdev->dev);
+	if (IS_ERR(fan_data->hwmon_dev)) {
+		status = PTR_ERR(fan_data->hwmon_dev);
+		goto exit_remove;
+	}
+
+    dev_info(&pdev->dev, "cs6436_56p_fan\n");
+    
+    return 0;
+    
+exit_remove:
+    sysfs_remove_group(&pdev->dev.kobj, &cs6436_56p_fan_group);
+exit:
+    return status;
+}
+
+static int cs6436_56p_fan_remove(struct platform_device *pdev)
+{
+    hwmon_device_unregister(fan_data->hwmon_dev);
+    sysfs_remove_group(&fan_data->pdev->dev.kobj, &cs6436_56p_fan_group);
+    
+    return 0;
+}
+
+#define DRVNAME "cs6436_56p_fan"
+
+static struct platform_driver cs6436_56p_fan_driver = {
+    .probe      = cs6436_56p_fan_probe,
+    .remove     = cs6436_56p_fan_remove,
+    .driver     = {
+        .name   = DRVNAME,
+        .owner  = THIS_MODULE,
+    },
+};
+
+
+
+
+
+static int __init cs6436_56p_fan_init(void)
+{
+    int ret;
+
+    cig_cpld_write_register(0x40, duty_cycle_to_reg_val(50));
+
+    ret = platform_driver_register(&cs6436_56p_fan_driver);
+    if (ret < 0) {
+        goto exit;
+    }
+
+    fan_data = kzalloc(sizeof(struct cs6436_56p_fan_data), GFP_KERNEL);
+    if (!fan_data) {
+        ret = -ENOMEM;
+        platform_driver_unregister(&cs6436_56p_fan_driver);
+        goto exit;
+    }
+
+	mutex_init(&fan_data->update_lock);
+    fan_data->valid = 0;
+	
+    fan_data->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
+    if (IS_ERR(fan_data->pdev)) {
+        ret = PTR_ERR(fan_data->pdev);
+        platform_driver_unregister(&cs6436_56p_fan_driver);
+        kfree(fan_data);
+        goto exit;
+    }
+
+exit:
+    return ret;
+}
+
+static void __exit cs6436_56p_fan_exit(void)
+{
+    platform_device_unregister(fan_data->pdev);
+    platform_driver_unregister(&cs6436_56p_fan_driver);
+    kfree(fan_data);
+}
+
+MODULE_AUTHOR("CIG");
+MODULE_DESCRIPTION("cs6436_56p_fan driver");
+MODULE_LICENSE("GPL");
+
+module_init(cs6436_56p_fan_init);
+module_exit(cs6436_56p_fan_exit);
+
+MODULE_AUTHOR("Zhang Peng <zhangpeng@cigtech.com>");
+MODULE_DESCRIPTION("cs6436_56p_fan driver");
+MODULE_LICENSE("GPL");
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-led.c b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-led.c
new file mode 100755
index 0000000000..4c7c629f3e
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-led.c
@@ -0,0 +1,594 @@
+/*
+ * A hwmon driver for the CIG cs6436-56P LED
+ *
+ * Copyright (C) 2018 Cambridge, Inc.
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*#define DEBUG*/
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/err.h>
+#include <linux/leds.h>
+#include <linux/slab.h>
+#include <linux/dmi.h>
+
+extern  int cig_cpld_write_register(u8 reg_off, u8 val);
+
+extern int cig_cpld_read_register(u8 reg_off, u8 *val);
+
+extern void led_classdev_unregister(struct led_classdev *led_cdev);
+extern int led_classdev_register(struct device *parent, struct led_classdev *led_cdev);
+extern void led_classdev_resume(struct led_classdev *led_cdev);
+extern void led_classdev_suspend(struct led_classdev *led_cdev);
+
+#define DRVNAME "cs6436_56p_led"
+
+struct cs6436_56p_led_data {
+    struct platform_device *pdev;
+    struct mutex	 update_lock;
+    char			 valid;		   /* != 0 if registers are valid */
+    unsigned long	last_updated;	/* In jiffies */
+    u8			   reg_val[6];	  /* 0: system & location
+	                                 1: PSU1 &PSU12
+	                                 2: fan & management
+	                                 3: console & ToD
+	                                 4-5 : fan1-fan5*/
+};
+
+static struct cs6436_56p_led_data  *ledctl = NULL;
+
+/* LED related data
+ */
+#define LED_TYPE_PSU1_REG_MASK   0x0C
+#define LED_MODE_PSU1_GREEN_MASK 0x08
+#define LED_MODE_PSU1_RED_MASK 	 0x04
+#define LED_MODE_PSU1_AMBER_MASK 0x0C
+#define LED_MODE_PSU1_OFF_MASK   0x00
+
+#define LED_TYPE_PSU2_REG_MASK   0x30
+#define LED_MODE_PSU2_GREEN_MASK 0x20
+#define LED_MODE_PSU2_RED_MASK   0x10
+#define LED_MODE_PSU2_AMBER_MASK 0x30
+#define LED_MODE_PSU2_OFF_MASK   0x00
+
+#define LED_TYPE_SYS_REG_MASK    0xF0
+#define LED_MODE_SYS_GREEN_MASK  0x40
+#define LED_MODE_SYS_RED_MASK    0x20
+#define LED_MODE_SYS_AMBER_MASK  0x60
+#define LED_MODE_SYS_AMBER_FLASHING_MASK   0x70
+#define LED_MODE_SYS_OFF_MASK    0x00
+
+#define LED_TYPE_RES_REG_MASK     0x0F
+#define LED_MODE_RES_GREEN_MASK   0x04
+#define LED_MODE_RES_RED_MASK     0x02
+#define LED_MODE_RES_AMBER_MASK   0x06
+#define LED_MODE_RES_AMBER_FLASHING_MASK   0x07
+#define LED_MODE_RES_OFF_MASK     0x00
+
+#define LED_TYPE_FAN_REG_MASK     0x03
+#define LED_MODE_FAN_GREEN_MASK   0x02
+#define LED_MODE_FAN_RED_MASK     0x01
+#define LED_MODE_FAN_AMBER_MASK   0x03
+#define LED_MODE_FAN_OFF_MASK     0x00
+
+#define LED_TYPE_FAN1_REG_MASK    0x03
+#define LED_TYPE_FAN2_REG_MASK    0x0C
+#define LED_TYPE_FAN3_REG_MASK    0x30
+#define LED_TYPE_FAN4_REG_MASK    0xC0
+#define LED_TYPE_FAN5_REG_MASK    0x03
+
+#define LED_MODE_FANX_GREEN_MASK   0x02
+#define LED_MODE_FANX_RED_MASK     0x01
+#define LED_MODE_FANX_AMBER_MASK   0x03
+#define LED_MODE_FANX_OFF_MASK     0x00
+
+enum led_type {
+    LED_TYPE_SYS,
+	LED_TYPE_PSU2,
+	LED_TYPE_PSU1,
+	LED_TYPE_FAN,
+    LED_TYPE_FAN1,
+    LED_TYPE_FAN2,
+    LED_TYPE_FAN3,
+    LED_TYPE_FAN4,
+    LED_TYPE_FAN5,
+};
+
+static const u8 led_reg[] = {
+    0x30,        /* system & reserved*/
+    0x31,        /* fan & PSU1 & PSU2 */
+	0x32,		 /* FAN5 LED */
+	0x33,		 /* FAN1-4 LED */
+};
+
+
+enum led_light_mode {
+    LED_MODE_OFF = 0,
+    LED_MODE_GREEN,
+    LED_MODE_AMBER,
+    LED_MODE_RED,
+    LED_MODE_GREEN_BLINK,
+    LED_MODE_AMBER_BLINK,
+    LED_MODE_RED_BLINK,
+    LED_MODE_GREEN_FLASHING,
+    LED_MODE_AMBER_FLASHING,
+    LED_MODE_RED_FLASHING,
+    LED_MODE_AUTO,
+    LED_MODE_UNKNOWN
+};
+
+struct led_type_mode {
+    enum led_type type;
+    int  type_mask;
+    enum led_light_mode mode;
+    int  mode_mask;
+};
+
+static struct led_type_mode led_type_mode_data[] = {
+{LED_TYPE_PSU1, LED_TYPE_PSU1_REG_MASK, LED_MODE_GREEN, LED_MODE_PSU1_GREEN_MASK},
+{LED_TYPE_PSU1, LED_TYPE_PSU1_REG_MASK, LED_MODE_AMBER, LED_MODE_PSU1_AMBER_MASK},
+{LED_TYPE_PSU1, LED_TYPE_PSU1_REG_MASK, LED_MODE_RED,   LED_MODE_PSU1_RED_MASK},
+{LED_TYPE_PSU1, LED_TYPE_PSU1_REG_MASK, LED_MODE_OFF,	LED_MODE_PSU1_OFF_MASK},
+
+{LED_TYPE_PSU2, LED_TYPE_PSU2_REG_MASK, LED_MODE_GREEN, LED_MODE_PSU2_GREEN_MASK},
+{LED_TYPE_PSU2, LED_TYPE_PSU2_REG_MASK, LED_MODE_AMBER, LED_MODE_PSU2_AMBER_MASK},
+{LED_TYPE_PSU2, LED_TYPE_PSU2_REG_MASK, LED_MODE_RED,  LED_MODE_PSU2_RED_MASK},
+{LED_TYPE_PSU2, LED_TYPE_PSU2_REG_MASK, LED_MODE_OFF,	LED_MODE_PSU2_OFF_MASK},
+
+{LED_TYPE_SYS,  LED_TYPE_SYS_REG_MASK,  LED_MODE_GREEN, LED_MODE_SYS_GREEN_MASK},
+{LED_TYPE_SYS,  LED_TYPE_SYS_REG_MASK,  LED_MODE_AMBER, LED_MODE_SYS_AMBER_MASK},
+{LED_TYPE_SYS,  LED_TYPE_SYS_REG_MASK,  LED_MODE_RED,   LED_MODE_SYS_RED_MASK},
+{LED_TYPE_SYS,  LED_TYPE_SYS_REG_MASK,  LED_MODE_AMBER_FLASHING,   LED_MODE_SYS_AMBER_FLASHING_MASK},
+{LED_TYPE_SYS,	LED_TYPE_SYS_REG_MASK,	LED_MODE_OFF,	LED_MODE_SYS_OFF_MASK},
+
+{LED_TYPE_FAN,  LED_TYPE_FAN_REG_MASK,  LED_MODE_GREEN, LED_MODE_FAN_GREEN_MASK},
+{LED_TYPE_FAN,  LED_TYPE_FAN_REG_MASK,  LED_MODE_AMBER, LED_MODE_FAN_AMBER_MASK},
+{LED_TYPE_FAN,  LED_TYPE_FAN_REG_MASK,  LED_MODE_RED,   LED_MODE_FAN_RED_MASK},
+{LED_TYPE_FAN,  LED_TYPE_FAN_REG_MASK,  LED_MODE_OFF,   LED_MODE_FAN_OFF_MASK},
+
+{LED_TYPE_FAN1,  LED_TYPE_FAN1_REG_MASK,  LED_MODE_GREEN, LED_MODE_FANX_GREEN_MASK << 0},
+{LED_TYPE_FAN1,  LED_TYPE_FAN1_REG_MASK,  LED_MODE_RED,   LED_MODE_FANX_RED_MASK << 0},
+{LED_TYPE_FAN1,  LED_TYPE_FAN1_REG_MASK,  LED_MODE_AMBER, LED_MODE_FANX_AMBER_MASK << 0},
+{LED_TYPE_FAN1,  LED_TYPE_FAN1_REG_MASK,  LED_MODE_OFF,   LED_MODE_FANX_OFF_MASK   << 0},
+{LED_TYPE_FAN2,  LED_TYPE_FAN2_REG_MASK,  LED_MODE_GREEN, LED_MODE_FANX_GREEN_MASK << 2},
+{LED_TYPE_FAN2,  LED_TYPE_FAN2_REG_MASK,  LED_MODE_RED,   LED_MODE_FANX_RED_MASK << 2},
+{LED_TYPE_FAN2,  LED_TYPE_FAN2_REG_MASK,  LED_MODE_AMBER, LED_MODE_FANX_AMBER_MASK << 2},
+{LED_TYPE_FAN2,  LED_TYPE_FAN2_REG_MASK,  LED_MODE_OFF,   LED_MODE_FANX_OFF_MASK   << 2},
+{LED_TYPE_FAN3,  LED_TYPE_FAN3_REG_MASK,  LED_MODE_GREEN, LED_MODE_FANX_GREEN_MASK << 4},
+{LED_TYPE_FAN3,  LED_TYPE_FAN3_REG_MASK,  LED_MODE_RED,   LED_MODE_FANX_RED_MASK << 4},
+{LED_TYPE_FAN3,  LED_TYPE_FAN3_REG_MASK,  LED_MODE_AMBER, LED_MODE_FANX_AMBER_MASK << 4},
+{LED_TYPE_FAN3,  LED_TYPE_FAN3_REG_MASK,  LED_MODE_OFF,   LED_MODE_FANX_OFF_MASK   << 4},
+{LED_TYPE_FAN4,  LED_TYPE_FAN4_REG_MASK,  LED_MODE_GREEN, LED_MODE_FANX_GREEN_MASK << 6},
+{LED_TYPE_FAN4,  LED_TYPE_FAN4_REG_MASK,  LED_MODE_RED,   LED_MODE_FANX_RED_MASK << 6},
+{LED_TYPE_FAN4,  LED_TYPE_FAN4_REG_MASK,  LED_MODE_AMBER, LED_MODE_FANX_AMBER_MASK << 6},
+{LED_TYPE_FAN4,  LED_TYPE_FAN4_REG_MASK,  LED_MODE_OFF,   LED_MODE_FANX_OFF_MASK   << 6},
+{LED_TYPE_FAN5,  LED_TYPE_FAN5_REG_MASK,  LED_MODE_GREEN, LED_MODE_FANX_GREEN_MASK << 0},
+{LED_TYPE_FAN5,  LED_TYPE_FAN5_REG_MASK,  LED_MODE_RED,   LED_MODE_FANX_RED_MASK << 0},
+{LED_TYPE_FAN5,  LED_TYPE_FAN5_REG_MASK,  LED_MODE_AMBER, LED_MODE_FANX_AMBER_MASK << 0},
+{LED_TYPE_FAN5,  LED_TYPE_FAN5_REG_MASK,  LED_MODE_OFF,   LED_MODE_FANX_OFF_MASK   << 0},
+};
+
+struct fanx_info_s {
+    u8 cname; /* device name */
+    enum led_type type;
+    u8   reg_id; /* map to led_reg & reg_val */
+};
+
+static struct fanx_info_s fanx_info[] = {
+    {'1', LED_TYPE_FAN1, 3},
+    {'2', LED_TYPE_FAN2, 3},
+    {'3', LED_TYPE_FAN3, 3},
+    {'4', LED_TYPE_FAN4, 3},
+    {'5', LED_TYPE_FAN5, 2},
+};
+	
+
+static int led_reg_val_to_light_mode(enum led_type type, u8 reg_val) {
+    int i;
+    
+    for (i = 0; i < ARRAY_SIZE(led_type_mode_data); i++) {
+
+        if (type != led_type_mode_data[i].type)
+            continue;
+           
+        if ((led_type_mode_data[i].type_mask & reg_val) == 
+             led_type_mode_data[i].mode_mask)
+        {
+            return led_type_mode_data[i].mode;
+        }
+    }
+    
+    return 0;
+}
+
+static u8 led_light_mode_to_reg_val(enum led_type type, 
+                                    enum led_light_mode mode, u8 reg_val) {
+    int i;
+                                      
+    for (i = 0; i < ARRAY_SIZE(led_type_mode_data); i++) {
+        if (type != led_type_mode_data[i].type)
+            continue;
+
+        if (mode != led_type_mode_data[i].mode)
+            continue;
+
+        reg_val = led_type_mode_data[i].mode_mask | 
+                     (reg_val & (~led_type_mode_data[i].type_mask));
+        break;
+    }
+    
+    return reg_val;
+}
+									
+static void cs6436_56p_led_update(void)
+{
+    mutex_lock(&ledctl->update_lock);
+
+    if (time_after(jiffies, ledctl->last_updated + HZ + HZ / 2)
+            || !ledctl->valid) {
+        int i;
+
+        dev_dbg(&ledctl->pdev->dev, "Starting cs6436_56p_led update\n");
+
+        /* Update LED data
+         */
+        for (i = 0; i < ARRAY_SIZE(ledctl->reg_val); i++) {
+            u8 status;
+			cig_cpld_read_register(led_reg[i], &status);
+
+            if (status < 0) {
+                ledctl->valid = 0;
+                dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", led_reg[i], status);
+                goto exit;
+            }
+            else
+            {
+                ledctl->reg_val[i] = status;
+            }
+        }
+
+        ledctl->last_updated = jiffies;
+        ledctl->valid = 1;
+    }
+
+exit:
+    mutex_unlock(&ledctl->update_lock);
+}
+
+static void cs6436_56p_led_set(struct led_classdev *led_cdev,
+                                      enum led_brightness led_light_mode,
+                                      u8 reg, enum led_type type)
+{
+    u8 reg_val;
+    mutex_lock(&ledctl->update_lock);
+
+    cig_cpld_read_register(reg, &reg_val);
+    if (reg_val < 0) {
+        dev_dbg(&ledctl->pdev->dev, "reg %d, err %d\n", reg, reg_val);
+        goto exit;
+    }
+	
+    reg_val = led_light_mode_to_reg_val(type, led_light_mode, reg_val);
+	
+    cig_cpld_write_register(reg, reg_val);
+
+    /* to prevent the slow-update issue */
+    ledctl->valid = 0;
+
+exit:
+    mutex_unlock(&ledctl->update_lock);
+}
+									  
+static void cs6436_56p_led_fanx_set(struct led_classdev *led_cdev,
+									enum led_brightness led_light_mode)
+{
+	enum led_type led_type1;
+	int reg_id;
+	int i, nsize;
+	int ncount = sizeof(fanx_info)/sizeof(struct fanx_info_s);
+
+	for(i=0;i<ncount;i++)
+	{
+		nsize=strlen(led_cdev->name);
+
+		if (led_cdev->name[nsize-1] == fanx_info[i].cname)
+		{
+			led_type1 = fanx_info[i].type;
+			reg_id = fanx_info[i].reg_id;
+
+			cs6436_56p_led_set(led_cdev, led_light_mode, led_reg[reg_id], led_type1);
+			return;
+		}
+	}
+}
+
+
+static enum led_brightness cs6436_56p_led_fanx_get(struct led_classdev *cdev)
+{
+	enum led_type led_type1;
+	int reg_id;
+	int i, nsize;
+	int ncount = sizeof(fanx_info)/sizeof(struct fanx_info_s);
+
+	for(i=0;i<ncount;i++)
+	{
+		nsize=strlen(cdev->name);
+
+		if (cdev->name[nsize-1] == fanx_info[i].cname)
+		{
+			led_type1 = fanx_info[i].type;
+			reg_id = fanx_info[i].reg_id;
+			cs6436_56p_led_update();
+			return led_reg_val_to_light_mode(led_type1, ledctl->reg_val[reg_id]);
+		}
+  	}
+  
+	return led_reg_val_to_light_mode(LED_TYPE_FAN1, ledctl->reg_val[5]);
+}
+
+									  
+static void cs6436_56p_led_psu1_set(struct led_classdev *led_cdev,
+	  enum led_brightness led_light_mode)
+{
+  cs6436_56p_led_set(led_cdev, led_light_mode, led_reg[1], LED_TYPE_PSU1);
+}
+
+static enum led_brightness cs6436_56p_led_psu1_get(struct led_classdev *cdev)
+{
+  cs6436_56p_led_update();
+  return led_reg_val_to_light_mode(LED_TYPE_PSU1, ledctl->reg_val[1]);
+}
+
+static void cs6436_56p_led_psu2_set(struct led_classdev *led_cdev,
+	  enum led_brightness led_light_mode)
+{
+  cs6436_56p_led_set(led_cdev, led_light_mode, led_reg[1], LED_TYPE_PSU2);
+}
+
+static enum led_brightness cs6436_56p_led_psu2_get(struct led_classdev *cdev)
+{
+  cs6436_56p_led_update();
+  return led_reg_val_to_light_mode(LED_TYPE_PSU2, ledctl->reg_val[1]);
+}
+
+static void cs6436_56p_led_sys_set(struct led_classdev *led_cdev,
+        enum led_brightness led_light_mode)
+{
+    cs6436_56p_led_set(led_cdev, led_light_mode,led_reg[0], LED_TYPE_SYS);
+}
+
+static enum led_brightness cs6436_56p_led_sys_get(struct led_classdev *cdev)
+{
+    cs6436_56p_led_update();
+    return led_reg_val_to_light_mode(LED_TYPE_SYS, ledctl->reg_val[0]);
+}
+
+
+static enum led_brightness cs6436_56p_led_fan_get(struct led_classdev *cdev)
+{
+    cs6436_56p_led_update();
+    return led_reg_val_to_light_mode(LED_TYPE_FAN, ledctl->reg_val[1]);
+}
+
+static void cs6436_56p_led_fan_set(struct led_classdev *led_cdev,
+        enum led_brightness led_light_mode)
+{
+    cs6436_56p_led_set(led_cdev, led_light_mode, led_reg[1], LED_TYPE_FAN);
+}
+
+
+static struct led_classdev cs6436_56p_leds[] = {
+    [LED_TYPE_SYS] = {
+        .name			 = "cs6436_56p_led::sys",
+        .default_trigger = "unused",
+        .brightness_set	 = cs6436_56p_led_sys_set,
+        .brightness_get	 = cs6436_56p_led_sys_get,
+        .flags			 = LED_CORE_SUSPENDRESUME,
+        .max_brightness	 = LED_MODE_AUTO,
+    },
+    [LED_TYPE_FAN] = {
+        .name			 = "cs6436_56p_led::fan",
+        .default_trigger = "unused",
+        .brightness_set	 = cs6436_56p_led_fan_set,
+        .brightness_get  = cs6436_56p_led_fan_get,
+        .flags			 = LED_CORE_SUSPENDRESUME,
+        .max_brightness  = LED_MODE_AUTO,
+    },
+	
+    [LED_TYPE_PSU1] = {
+        .name			 = "cs6436_56p_led::psu1",
+        .default_trigger = "unused",
+        .brightness_set	 = cs6436_56p_led_psu1_set,
+        .brightness_get  = cs6436_56p_led_psu1_get,
+        .flags			 = LED_CORE_SUSPENDRESUME,
+        .max_brightness  = LED_MODE_AUTO,
+    },
+    [LED_TYPE_PSU2] = {
+        .name			 = "cs6436_56p_led::psu2",
+        .default_trigger = "unused",
+        .brightness_set	 = cs6436_56p_led_psu2_set,
+        .brightness_get  = cs6436_56p_led_psu2_get,
+        .flags			 = LED_CORE_SUSPENDRESUME,
+        .max_brightness  = LED_MODE_AUTO,
+    },
+	   
+	[LED_TYPE_FAN1] = {
+		.name			  = "cs6436_56p_led::fan1",
+		.default_trigger = "unused",
+		.brightness_set 	= cs6436_56p_led_fanx_set,
+		.brightness_get  = cs6436_56p_led_fanx_get,
+		.flags			   = LED_CORE_SUSPENDRESUME,
+		.max_brightness  = LED_MODE_AUTO,
+	},
+	[LED_TYPE_FAN2] = {
+		.name			  = "cs6436_56p_led::fan2",
+		.default_trigger = "unused",
+		.brightness_set 	= cs6436_56p_led_fanx_set,
+		.brightness_get  = cs6436_56p_led_fanx_get,
+		.flags			   = LED_CORE_SUSPENDRESUME,
+		.max_brightness  = LED_MODE_AUTO,
+	},
+	[LED_TYPE_FAN3] = {
+		.name			  = "cs6436_56p_led::fan3",
+		.default_trigger = "unused",
+		.brightness_set 	= cs6436_56p_led_fanx_set,
+		.brightness_get  = cs6436_56p_led_fanx_get,
+		.flags			   = LED_CORE_SUSPENDRESUME,
+		.max_brightness  = LED_MODE_AUTO,
+	},
+	[LED_TYPE_FAN4] = {
+		.name			  = "cs6436_56p_led::fan4",
+		.default_trigger = "unused",
+		.brightness_set 	= cs6436_56p_led_fanx_set,
+		.brightness_get  = cs6436_56p_led_fanx_get,
+		.flags			   = LED_CORE_SUSPENDRESUME,
+		.max_brightness  = LED_MODE_AUTO,
+	},
+	[LED_TYPE_FAN5] = {
+		.name			  = "cs6436_56p_led::fan5",
+		.default_trigger = "unused",
+		.brightness_set 	= cs6436_56p_led_fanx_set,
+		.brightness_get  = cs6436_56p_led_fanx_get,
+		.flags			   = LED_CORE_SUSPENDRESUME,
+		.max_brightness  = LED_MODE_AUTO,
+	}
+};
+
+static int cs6436_56p_led_suspend(struct platform_device *dev,
+        pm_message_t state)
+{
+    int i = 0;
+
+    for (i = 0; i < ARRAY_SIZE(cs6436_56p_leds); i++) {
+        led_classdev_suspend(&cs6436_56p_leds[i]);
+    }
+
+    return 0;
+}
+
+static int cs6436_56p_led_resume(struct platform_device *dev)
+{
+    int i = 0;
+
+    for (i = 0; i < ARRAY_SIZE(cs6436_56p_leds); i++) {
+        led_classdev_resume(&cs6436_56p_leds[i]);
+    }
+
+    return 0;
+}
+
+static int cs6436_56p_led_probe(struct platform_device *pdev)
+{
+    int ret, i;
+
+    for (i = 0; i < ARRAY_SIZE(cs6436_56p_leds); i++) {
+        ret = led_classdev_register(&pdev->dev, &cs6436_56p_leds[i]);
+
+        if (ret < 0)
+            break;
+    }
+
+    /* Check if all LEDs were successfully registered */
+    if (i != ARRAY_SIZE(cs6436_56p_leds)) {
+        int j;
+
+        /* only unregister the LEDs that were successfully registered */
+        for (j = 0; j < i; j++) {
+            led_classdev_unregister(&cs6436_56p_leds[i]);
+        }
+    }
+
+    return ret;
+}
+
+static int cs6436_56p_led_remove(struct platform_device *pdev)
+{
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(cs6436_56p_leds); i++) {
+        led_classdev_unregister(&cs6436_56p_leds[i]);
+    }
+
+    return 0;
+}
+
+static struct platform_driver cs6436_56p_led_driver = {
+    .probe	  = cs6436_56p_led_probe,
+    .remove	 = cs6436_56p_led_remove,
+    .suspend	= cs6436_56p_led_suspend,
+    .resume	 = cs6436_56p_led_resume,
+    .driver	 = {
+        .name   = DRVNAME,
+        .owner  = THIS_MODULE,
+    },
+};
+
+static int cs6436_56p_led_default(void)
+{
+	cig_cpld_write_register(0x30, 0x40);// system green led solid on
+}
+
+static int __init cs6436_56p_led_init(void)
+{
+    int ret;
+
+    ret = platform_driver_register(&cs6436_56p_led_driver);
+    if (ret < 0) {
+        goto exit;
+    }
+
+    ledctl = kzalloc(sizeof(struct cs6436_56p_led_data), GFP_KERNEL);
+    if (!ledctl) {
+        ret = -ENOMEM;
+        platform_driver_unregister(&cs6436_56p_led_driver);
+        goto exit;
+    }
+
+    mutex_init(&ledctl->update_lock);
+
+    ledctl->pdev = platform_device_register_simple(DRVNAME, -1, NULL, 0);
+    if (IS_ERR(ledctl->pdev)) {
+        ret = PTR_ERR(ledctl->pdev);
+        platform_driver_unregister(&cs6436_56p_led_driver);
+        kfree(ledctl);
+        goto exit;
+    }
+	
+	cs6436_56p_led_default();
+
+exit:
+    return ret;
+}
+
+static void __exit cs6436_56p_led_exit(void)
+{
+    platform_device_unregister(ledctl->pdev);
+    platform_driver_unregister(&cs6436_56p_led_driver);
+    kfree(ledctl);
+}
+
+module_init(cs6436_56p_led_init);
+module_exit(cs6436_56p_led_exit);
+
+MODULE_AUTHOR("Zhang Peng <zhangpeng@cigtech.com>");
+MODULE_DESCRIPTION("cs6436_56p_led driver");
+MODULE_LICENSE("GPL");
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-psu.c b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-psu.c
new file mode 100755
index 0000000000..8754007408
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-psu.c
@@ -0,0 +1,586 @@
+/*
+ * A hwmon driver for the CIG cs6436-56P Power Module
+ *
+ * Copyright (C) 2018 Cambridge, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <linux/module.h>
+#include <linux/jiffies.h>
+#include <linux/i2c.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
+#include <linux/mutex.h>
+#include <linux/sysfs.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+#include <linux/dmi.h>
+#include <linux/fs.h>
+#include <linux/uaccess.h>
+#include <linux/syscalls.h>
+#include <linux/kthread.h>
+#include <linux/device.h>
+#include <linux/platform_device.h>
+
+
+
+#define MAX_FAN_DUTY_CYCLE 100
+
+/* Address scanned */
+static const unsigned short normal_i2c[] = {I2C_CLIENT_END };
+
+/* This is additional data */
+struct cs6436_56p_psu_data {
+	struct device	*hwmon_dev;
+	struct mutex	update_lock;
+	char		valid;		
+	unsigned long	last_updated;	/* In jiffies */
+
+	/* Registers value */
+	u8	vout_mode;
+	u16	v_in;
+	u16	v_out;
+	u16	i_in;
+	u16	i_out;
+	u16	p_in;
+	u16	p_out;
+	u16	temp_input[3];
+	u8	temp_fault;
+	u8	fan_fault;
+	u16	fan_duty_cycle[2];
+	u16	fan_speed[2];
+	u8	mfr_id[8];
+	u8	mfr_model[20];
+	u8	mfr_serial[20];
+	u8	psu_is_present;
+	u8	psu_is_good;
+};
+
+static int two_complement_to_int(u16 data, u8 valid_bit, int mask);
+static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute *dev_attr, const char *buf, size_t count);
+static ssize_t for_linear_data(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_fan_fault(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_fan_warning(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_temp_fault(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_temp_warning(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_vout_data(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static int cs6436_56p_psu_read_byte(struct i2c_client *client, u8 reg);
+static int cs6436_56p_psu_read_word(struct i2c_client *client, u8 reg);
+static int cs6436_56p_psu_write_word(struct i2c_client *client, u8 reg, u16 value);
+static int cs6436_56p_psu_read_block(struct i2c_client *client, u8 command, u8 *data, int data_len);
+static struct cs6436_56p_psu_data *cs6436_56p_psu_update_device(struct device *dev);
+static ssize_t for_ascii(struct device *dev, struct device_attribute *dev_attr, char *buf);
+static ssize_t for_status(struct device *dev, struct device_attribute *dev_attr, char *buf);
+
+enum cs6436_56p_psu_sysfs_attributes {
+	PSU_V_IN,
+	PSU_V_OUT,
+	PSU_I_IN,
+	PSU_I_OUT,
+	PSU_P_IN,
+	PSU_P_OUT,
+	PSU_TEMP1_INPUT,
+	PSU_TEMP2_INPUT,
+	PSU_TEMP3_INPUT,
+	PSU_TEMP_FAULT,
+	PSU_TEMP_WARN,
+	PSU_FAN1_FAULT,
+	PSU_FAN1_WARN,
+	PSU_FAN1_DUTY_CYCLE,
+	PSU_FAN1_SPEED,
+	PSU_MFR_ID,
+	PSU_MFR_MODEL,
+	PSU_MFR_SERIAL,
+	PSU_PRESENT,
+	PSU_P_GOOD,
+};
+
+static int two_complement_to_int(u16 data, u8 valid_bit, int mask)
+{
+	u16  valid_data  = data & mask;
+	
+	bool is_negative = valid_data >> (valid_bit - 1);
+	return is_negative ? (-(((~valid_data) & mask) + 1)) : valid_data;
+}
+
+static ssize_t set_fan_duty_cycle(struct device *dev, struct device_attribute \
+				*dev_attr, const char *buf, size_t count)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+	struct i2c_client *client = to_i2c_client(dev);
+	struct cs6436_56p_psu_data *data = i2c_get_clientdata(client);
+	int nr = (attr->index == PSU_FAN1_DUTY_CYCLE) ? 0 : 1;
+	long speed;
+	int error;
+	
+	error = kstrtol(buf, 10, &speed);
+	if (error)
+		return error;
+
+	if (speed < 0 || speed > MAX_FAN_DUTY_CYCLE)
+		return -EINVAL;
+
+
+	mutex_lock(&data->update_lock);
+	data->fan_duty_cycle[nr] = speed;
+	cs6436_56p_psu_write_word(client, 0x3B + nr, data->fan_duty_cycle[nr]);
+	mutex_unlock(&data->update_lock);
+
+	return count;
+}
+
+static ssize_t for_linear_data(struct device *dev, struct device_attribute *dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+	struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+
+	u16 value = 0;
+	int exponent, mantissa;
+	int multiplier = 1000;
+	
+	switch (attr->index) {
+	case PSU_V_IN:
+		value = data->v_in;
+		break;
+	case PSU_I_IN:
+		value = data->i_in;
+		break;
+	case PSU_I_OUT:
+		value = data->i_out;
+		break;
+	case PSU_P_IN:
+		value = data->p_in;
+		break;
+	case PSU_P_OUT:
+		value = data->p_out;
+		break;
+	case PSU_TEMP1_INPUT:
+		value = data->temp_input[0];
+		break;
+	case PSU_TEMP2_INPUT:
+		value = data->temp_input[1];
+		break;
+	case PSU_TEMP3_INPUT:
+		value = data->temp_input[2];
+		break;
+	case PSU_FAN1_DUTY_CYCLE:
+		multiplier = 1;
+		value = data->fan_duty_cycle[0];
+		break;
+	case PSU_FAN1_SPEED:
+		multiplier = 1;
+		value = data->fan_speed[0];
+		break;
+	default:
+		break;
+	}
+
+	exponent = two_complement_to_int(value >> 11, 5, 0x1f);
+	mantissa = two_complement_to_int(value & 0x7ff, 11, 0x7ff);
+
+	return (exponent >= 0) ? sprintf(buf, "%d\n",	\
+		(mantissa << exponent) * multiplier) :	\
+	    sprintf(buf, "%d\n", (mantissa * multiplier) / (1 << -exponent));	
+}
+
+static ssize_t for_fan_fault(struct device *dev, struct device_attribute \
+							*dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+    	struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+
+    	u8 shift = (attr->index == PSU_FAN1_FAULT) ? 7 : 6;
+
+    	return sprintf(buf, "%d\n", data->fan_fault >> shift);
+}
+							
+static ssize_t for_fan_warning(struct device *dev, struct device_attribute \
+							*dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+		struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+
+		u8 shift = (attr->index == PSU_FAN1_WARN) ? 5 : 4;
+
+		return sprintf(buf, "%d\n", data->fan_fault >> shift);
+}
+
+static ssize_t for_temp_fault(struct device *dev, struct device_attribute \
+							*dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+		struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+
+
+		return sprintf(buf, "%d\n", data->temp_fault >> 7);
+}
+
+static ssize_t for_temp_warning(struct device *dev, struct device_attribute \
+							*dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+		struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+
+		return sprintf(buf, "%d\n", data->temp_fault >> 6);
+}
+static ssize_t for_vout_data(struct device *dev, struct device_attribute \
+		 					*dev_attr, char *buf)
+{
+	struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+	int exponent, mantissa;
+	int multiplier = 1000;
+
+	exponent = two_complement_to_int(data->vout_mode, 5, 0x1f);
+	mantissa = data->v_out;
+
+	return (exponent > 0) ? sprintf(buf, "%d\n", \
+		(mantissa << exponent) * multiplier) : \
+		sprintf(buf, "%d\n", ((mantissa  * multiplier) >> (-exponent)));
+}
+
+static ssize_t for_ascii(struct device *dev, struct device_attribute \
+	 						*dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+	struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+	u8 *ptr = NULL;
+
+	if (!data->valid)
+		return 0;
+
+	switch (attr->index) {
+	case PSU_MFR_ID:
+		ptr = data->mfr_id + 1;
+		break;
+	case PSU_MFR_MODEL:
+		ptr = data->mfr_model + 1;
+		break;
+	case PSU_MFR_SERIAL:
+		ptr = data->mfr_serial + 1;
+		break;
+	default:
+		return 0;
+	}
+	return sprintf(buf, "%s\n", ptr);
+}
+
+
+static ssize_t for_status(struct device *dev, struct device_attribute *dev_attr, char *buf)
+{
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(dev_attr);
+	struct cs6436_56p_psu_data *data = cs6436_56p_psu_update_device(dev);
+	u8 *ptr = NULL;
+
+    u8 status = 0;
+
+    if (!data->valid) {
+        return -EIO;
+    }
+
+    if (attr->index == PSU_PRESENT) {
+		status = data->psu_is_present;
+    }
+    else { /* PSU_POWER_GOOD */
+		status = data->psu_is_good;
+    }
+
+    return sprintf(buf, "%d\n", status);
+}
+
+
+							
+static int cs6436_56p_psu_read_byte(struct i2c_client *client, u8 reg)
+{
+	return i2c_smbus_read_byte_data(client, reg);
+}
+
+static int cs6436_56p_psu_read_word(struct i2c_client *client, u8 reg)
+{
+	return i2c_smbus_read_word_data(client, reg);
+}
+
+static int cs6436_56p_psu_write_word(struct i2c_client *client, u8 reg, \
+								u16 value)
+{
+	union i2c_smbus_data data;
+        data.word = value;
+        return i2c_smbus_xfer(client->adapter, client->addr, 
+				client->flags |= I2C_CLIENT_PEC,
+                              	I2C_SMBUS_WRITE, reg,
+                              	I2C_SMBUS_WORD_DATA, &data);
+
+}
+
+static int cs6436_56p_psu_read_block(struct i2c_client *client, u8 command, \
+							u8 *data, int data_len)
+{
+	int result = i2c_smbus_read_i2c_block_data(client, command, data_len,
+									data);
+	if (unlikely(result < 0))
+		goto abort;
+	if (unlikely(result != data_len)) {
+		result = -EIO;
+		goto abort;
+	}
+
+	result = 0;
+abort:
+	return result;
+
+}
+
+struct reg_data_byte {
+	u8 reg;
+	u8 *value;
+};
+
+struct reg_data_word {
+	u8 reg;
+	u16 *value;
+};
+
+static struct cs6436_56p_psu_data *cs6436_56p_psu_update_device( \
+							struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct cs6436_56p_psu_data *data = i2c_get_clientdata(client);
+
+	mutex_lock(&data->update_lock);
+
+
+	if (time_after(jiffies, data->last_updated)) {
+		int i, status;
+		u8 command;
+		struct reg_data_byte regs_byte[] = {
+				{0x20, &data->vout_mode},
+				{0x81, &data->fan_fault},
+				{0x7d, &data->temp_fault},
+		};
+		struct reg_data_word regs_word[] = {
+				{0x88, &data->v_in},
+				{0x8b, &data->v_out},
+				{0x89, &data->i_in},
+				{0x8c, &data->i_out},
+				{0x96, &data->p_out},
+				{0x97, &data->p_in},
+				{0x8d, &(data->temp_input[0])},
+				{0x8e, &(data->temp_input[1])},
+				{0x8f, &(data->temp_input[2])},
+				{0x3b, &(data->fan_duty_cycle[0])},
+				{0x90, &(data->fan_speed[0])},
+		};
+
+		dev_dbg(&client->dev, "start data update\n");
+
+		/* one milliseconds from now */
+		data->last_updated = jiffies + HZ / 1000;
+		
+		for (i = 0; i < ARRAY_SIZE(regs_byte); i++) {
+			status = cs6436_56p_psu_read_byte(client, 
+							regs_byte[i].reg);
+			if (status < 0) {
+				dev_dbg(&client->dev, "reg %d, err %d\n",
+					regs_byte[i].reg, status);
+			} else {
+				*(regs_byte[i].value) = status;
+			}
+		}
+
+		for (i = 0; i < ARRAY_SIZE(regs_word); i++) {
+			status = cs6436_56p_psu_read_word(client,
+							regs_word[i].reg);
+			if (status < 0) {
+				dev_dbg(&client->dev, "reg %d, err %d\n",
+					regs_word[i].reg, status);
+			} else {
+				*(regs_word[i].value) = status;
+			}
+		}
+
+		command = 0x99;		/* PSU mfr_id */
+		status = cs6436_56p_psu_read_block(client, command, 
+		data->mfr_id, ARRAY_SIZE(data->mfr_id) - 1);
+    	data->mfr_id[ARRAY_SIZE(data->mfr_id) - 1] = '\0';
+    	if (status < 0) {
+        	dev_dbg(&client->dev, "reg %d, err %d\n", command, status);
+    	}
+
+		command = 0x9a;		/* PSU mfr_model */
+		status = cs6436_56p_psu_read_block(client, command, 
+		data->mfr_model, ARRAY_SIZE(data->mfr_model) - 1);
+    	data->mfr_model[ARRAY_SIZE(data->mfr_model) - 1] = '\0';
+    	if (status < 0) {
+        	dev_dbg(&client->dev, "reg %d, err %d\n", command, status);
+    	}
+
+    	command = 0x9e;		/* PSU mfr_serial */
+    	status = cs6436_56p_psu_read_block(client, command, 
+		data->mfr_serial, ARRAY_SIZE(data->mfr_serial) - 1);
+    	data->mfr_serial[ARRAY_SIZE(data->mfr_serial) - 1] = '\0';
+    	if (status < 0) {
+        	dev_dbg(&client->dev, "reg %d, err %d\n", command, status);
+   		}	
+		data->valid = 1;
+		data->psu_is_present = strlen(data->mfr_id) > 1 ? 1:0;
+		if(data->psu_is_present)
+			data->psu_is_good = ((data->fan_fault) || (data->temp_fault))? 0:1;
+		else			
+			data->psu_is_good = 0;
+	}
+
+	mutex_unlock(&data->update_lock);
+	
+	return data;
+
+}
+
+/* sysfs attributes for hwmon */
+static SENSOR_DEVICE_ATTR(psu_v_in, S_IRUGO, for_linear_data, NULL, PSU_V_IN);
+static SENSOR_DEVICE_ATTR(psu_v_out, S_IRUGO, for_vout_data,   NULL, PSU_V_OUT);
+static SENSOR_DEVICE_ATTR(psu_i_in, S_IRUGO, for_linear_data, NULL, PSU_I_IN);
+static SENSOR_DEVICE_ATTR(psu_i_out, S_IRUGO, for_linear_data, NULL, PSU_I_OUT);
+static SENSOR_DEVICE_ATTR(psu_p_in, S_IRUGO, for_linear_data, NULL, PSU_P_IN);
+static SENSOR_DEVICE_ATTR(psu_p_out, S_IRUGO, for_linear_data, NULL, PSU_P_OUT);
+static SENSOR_DEVICE_ATTR(psu_temp1_input,	S_IRUGO, for_linear_data,	NULL, PSU_TEMP1_INPUT);
+static SENSOR_DEVICE_ATTR(psu_temp2_input,	S_IRUGO, for_linear_data,	NULL, PSU_TEMP2_INPUT);
+static SENSOR_DEVICE_ATTR(psu_temp3_input,	S_IRUGO, for_linear_data,	NULL, PSU_TEMP3_INPUT);
+static SENSOR_DEVICE_ATTR(psu_temp_fault,	S_IRUGO, for_temp_fault, 	NULL, PSU_TEMP_FAULT);
+static SENSOR_DEVICE_ATTR(psu_temp_warning,	S_IRUGO, for_temp_warning, 	NULL, PSU_TEMP_WARN);
+static SENSOR_DEVICE_ATTR(psu_fan1_fault,	S_IRUGO, for_fan_fault, 	NULL, PSU_FAN1_FAULT);
+static SENSOR_DEVICE_ATTR(psu_fan1_warning,	S_IRUGO, for_fan_warning, 	NULL, PSU_FAN1_WARN);
+static SENSOR_DEVICE_ATTR(psu_fan1_duty_cycle_percentage, S_IWUSR | S_IRUGO, for_linear_data, set_fan_duty_cycle, PSU_FAN1_DUTY_CYCLE);
+static SENSOR_DEVICE_ATTR(psu_fan1_speed_rpm, S_IRUGO, for_linear_data,	NULL, PSU_FAN1_SPEED);
+static SENSOR_DEVICE_ATTR(psu_mfr_id, 	S_IRUGO, for_ascii, NULL, PSU_MFR_ID);
+static SENSOR_DEVICE_ATTR(psu_mfr_model, 	S_IRUGO, for_ascii, NULL, PSU_MFR_MODEL);
+static SENSOR_DEVICE_ATTR(psu_mfr_serial,	S_IRUGO, for_ascii, NULL, PSU_MFR_SERIAL);
+static SENSOR_DEVICE_ATTR(psu_present,	S_IRUGO, for_status, NULL, PSU_PRESENT);
+static SENSOR_DEVICE_ATTR(psu_power_good,	S_IRUGO, for_status, NULL, PSU_P_GOOD);
+
+
+
+static struct attribute *cs6436_56p_psu_attributes[] = {
+	&sensor_dev_attr_psu_v_in.dev_attr.attr,
+	&sensor_dev_attr_psu_v_out.dev_attr.attr,
+	&sensor_dev_attr_psu_i_in.dev_attr.attr,
+	&sensor_dev_attr_psu_i_out.dev_attr.attr,
+	&sensor_dev_attr_psu_p_in.dev_attr.attr,
+	&sensor_dev_attr_psu_p_out.dev_attr.attr,
+	&sensor_dev_attr_psu_temp1_input.dev_attr.attr,
+	&sensor_dev_attr_psu_temp2_input.dev_attr.attr,
+	&sensor_dev_attr_psu_temp3_input.dev_attr.attr,
+	&sensor_dev_attr_psu_temp_fault.dev_attr.attr,
+	&sensor_dev_attr_psu_temp_warning.dev_attr.attr,
+	&sensor_dev_attr_psu_fan1_fault.dev_attr.attr,
+	&sensor_dev_attr_psu_fan1_warning.dev_attr.attr,
+	&sensor_dev_attr_psu_fan1_duty_cycle_percentage.dev_attr.attr,
+	&sensor_dev_attr_psu_fan1_speed_rpm.dev_attr.attr,
+	&sensor_dev_attr_psu_mfr_id.dev_attr.attr,
+	&sensor_dev_attr_psu_mfr_model.dev_attr.attr,
+	&sensor_dev_attr_psu_mfr_serial.dev_attr.attr,
+	&sensor_dev_attr_psu_present.dev_attr.attr,
+    &sensor_dev_attr_psu_power_good.dev_attr.attr,
+	NULL
+};
+
+static const struct attribute_group cs6436_56p_psu_group = {
+	.attrs = cs6436_56p_psu_attributes,
+};
+
+static int cs6436_56p_psu_probe(struct i2c_client *client,
+				const struct i2c_device_id *id)
+{
+	struct cs6436_56p_psu_data *data;
+	int status;
+
+	if (!i2c_check_functionality(client->adapter, 
+		I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA)) {
+		status = -EIO;
+		goto exit;
+	}
+	
+	data = kzalloc(sizeof(*data), GFP_KERNEL);
+	if (!data) {
+		status = -ENOMEM;
+		goto exit;
+	}
+
+	i2c_set_clientdata(client, data);
+	data->valid = 0;
+	mutex_init(&data->update_lock);
+	
+	dev_info(&client->dev, "new chip found\n");
+
+	/* Register sysfs hooks */
+	status = sysfs_create_group(&client->dev.kobj, &cs6436_56p_psu_group);
+	if (status) 
+		goto exit_sysfs_create_group;
+
+	data->hwmon_dev = hwmon_device_register(&client->dev);
+	if (IS_ERR(data->hwmon_dev)) {
+		status = PTR_ERR(data->hwmon_dev);
+		goto exit_hwmon_device_register;
+	}
+
+	return 0;
+	
+exit_hwmon_device_register:
+	sysfs_remove_group(&client->dev.kobj, &cs6436_56p_psu_group);
+exit_sysfs_create_group:
+	kfree(data);
+exit:
+	return status;
+}
+
+static int cs6436_56p_psu_remove(struct i2c_client *client)
+{
+	struct cs6436_56p_psu_data *data = i2c_get_clientdata(client);
+	hwmon_device_unregister(data->hwmon_dev);
+	sysfs_remove_group(&client->dev.kobj, &cs6436_56p_psu_group);
+	kfree(data);
+	
+	return 0;
+}
+
+enum psu_index
+{
+    cs6436_56p_psu1,
+    cs6436_56p_psu2
+};
+
+static const struct i2c_device_id cs6436_56p_psu_id[] = {
+    { "cs6436_56p_psu1", cs6436_56p_psu1 },
+    { "cs6436_56p_psu2", cs6436_56p_psu2 },
+    {}
+};
+MODULE_DEVICE_TABLE(i2c, cs6436_56p_psu_id);
+
+static struct i2c_driver cs6436_56p_psu_driver = {
+    .class        = I2C_CLASS_HWMON,
+    .driver = {
+        .name     = "cs6436_56p_psu",
+    },
+    .probe        = cs6436_56p_psu_probe,
+    .remove       = cs6436_56p_psu_remove,
+    .id_table     = cs6436_56p_psu_id,
+    .address_list = normal_i2c,
+};
+
+module_i2c_driver(cs6436_56p_psu_driver);
+
+MODULE_AUTHOR("Zhang Peng <zhangpeng@cigtech.com>");
+MODULE_DESCRIPTION("cs6436_56p_psu driver");
+MODULE_LICENSE("GPL");
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-sfp.c b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-sfp.c
new file mode 100755
index 0000000000..f2b54a260f
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/modules/x86-64-cig-cs6436-56p-sfp.c
@@ -0,0 +1,1454 @@
+/*
+ * A hwmon driver for the CIG cs6436-56P SFP Module
+ *
+ * Copyright (C) 2018 Cambridge, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/jiffies.h>
+#include <linux/i2c.h>
+#include <linux/hwmon.h>
+#include <linux/hwmon-sysfs.h>
+#include <linux/err.h>
+#include <linux/mutex.h>
+#include <linux/sysfs.h>
+#include <linux/slab.h>
+#include <linux/delay.h>
+
+#define DRIVER_NAME 	"cs6436_56p_sfp" /* Platform dependent */
+
+#define DEBUG_MODE 0
+
+#if (DEBUG_MODE == 1)
+	#define DEBUG_PRINT(fmt, args...)										 \
+		printk (KERN_INFO "%s:%s[%d]: " fmt "\r\n", __FILE__, __FUNCTION__, __LINE__, ##args)
+#else
+	#define DEBUG_PRINT(fmt, args...)
+#endif
+
+#define EEPROM_NAME				"sfp_eeprom"
+#define EEPROM_SIZE				256	/*	256 byte eeprom */
+#define BIT_INDEX(i)			(1ULL << (i))
+#define USE_I2C_BLOCK_READ 		1 /* Platform dependent */
+#define I2C_RW_RETRY_COUNT		3
+#define I2C_RW_RETRY_INTERVAL	100 /* ms */
+
+#define SFP_EEPROM_A0_I2C_ADDR (0xA0 >> 1)
+#define SFP_EEPROM_A2_I2C_ADDR (0xA2 >> 1)
+
+#define SFF8024_PHYSICAL_DEVICE_ID_ADDR		0x0
+#define SFF8024_DEVICE_ID_SFP				0x3
+#define SFF8024_DEVICE_ID_QSFP				0xC
+#define SFF8024_DEVICE_ID_QSFP_PLUS			0xD
+#define SFF8024_DEVICE_ID_QSFP28			0x11
+
+#define SFF8472_DIAG_MON_TYPE_ADDR			92
+#define SFF8472_DIAG_MON_TYPE_DDM_MASK		0x40
+#define SFF8472_10G_ETH_COMPLIANCE_ADDR		0x3
+#define SFF8472_10G_BASE_MASK				0xF0
+
+#define SFF8436_RX_LOS_ADDR					3
+#define SFF8436_TX_FAULT_ADDR				4
+#define SFF8436_TX_DISABLE_ADDR				86
+
+
+#define ADDR_REG_SFP_STATUS_ADDR 0X62 //reg addr +R/W#   //1031
+#define ADDR_REG_SFP_STATUS_TX 0X63  // write data
+#define ADDR_REG_SFP_STATUS_RX 0X64 //read data
+#define ADDR_REG_SFP_STATUS_COMMAND 0X65 //cmd bit7=1,go
+#define ADDR_REG_SFP_STATUS_STATUS 0X66 //status 
+
+
+
+static ssize_t show_port_number(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t show_port_type(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t show_present(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t sfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t qsfp_show_tx_rx_status(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t sfp_set_tx_disable(struct device *dev, struct device_attribute *da, const char *buf, size_t count);
+static ssize_t qsfp_set_tx_disable(struct device *dev, struct device_attribute *da, const char *buf, size_t count);;
+static ssize_t sfp_show_ddm_implemented(struct device *dev, struct device_attribute *da, char *buf);
+static ssize_t sfp_eeprom_read(struct i2c_client *, u8, u8 *,int);
+static ssize_t sfp_eeprom_write(struct i2c_client *, u8 , const char *,int);
+extern int cig_cpld_read_register(u8 reg_off, u8 *val);
+extern int cig_cpld_write_register(u8 reg_off, u8 val);
+
+
+enum sfp_sysfs_attributes {
+	PRESENT,
+	PRESENT_ALL,
+	PORT_NUMBER,
+	PORT_TYPE,
+	DDM_IMPLEMENTED,
+	TX_FAULT,
+	TX_FAULT1,
+	TX_FAULT2,
+	TX_FAULT3,
+	TX_FAULT4,
+	TX_DISABLE,
+	TX_DISABLE1,
+	TX_DISABLE2,
+	TX_DISABLE3,
+	TX_DISABLE4,
+	RX_LOS,
+	RX_LOS1,
+	RX_LOS2,
+	RX_LOS3,
+	RX_LOS4,
+	RX_LOS_ALL
+};
+
+/* SFP/QSFP common attributes for sysfs */
+static SENSOR_DEVICE_ATTR(sfp_port_number, S_IRUGO, show_port_number, NULL, PORT_NUMBER);
+static SENSOR_DEVICE_ATTR(sfp_port_type, S_IRUGO, show_port_type, NULL, PORT_TYPE);
+static SENSOR_DEVICE_ATTR(sfp_is_present,  S_IRUGO, show_present, NULL, PRESENT);
+static SENSOR_DEVICE_ATTR(sfp_is_present_all,  S_IRUGO, show_present, NULL, PRESENT_ALL);
+static SENSOR_DEVICE_ATTR(sfp_rx_los,  S_IRUGO, sfp_show_tx_rx_status, NULL, RX_LOS);
+static SENSOR_DEVICE_ATTR(sfp_tx_disable,  S_IWUSR | S_IRUGO, sfp_show_tx_rx_status, sfp_set_tx_disable, TX_DISABLE);
+static SENSOR_DEVICE_ATTR(sfp_tx_fault,	 S_IRUGO, sfp_show_tx_rx_status, NULL, TX_FAULT);
+
+/* QSFP attributes for sysfs */
+static SENSOR_DEVICE_ATTR(sfp_rx_los1, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS1);
+static SENSOR_DEVICE_ATTR(sfp_rx_los2, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS2);
+static SENSOR_DEVICE_ATTR(sfp_rx_los3, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS3);
+static SENSOR_DEVICE_ATTR(sfp_rx_los4, S_IRUGO, qsfp_show_tx_rx_status, NULL, RX_LOS4);
+static SENSOR_DEVICE_ATTR(sfp_tx_disable1, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE1);
+static SENSOR_DEVICE_ATTR(sfp_tx_disable2, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE2);
+static SENSOR_DEVICE_ATTR(sfp_tx_disable3, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE3);
+static SENSOR_DEVICE_ATTR(sfp_tx_disable4, S_IWUSR | S_IRUGO, qsfp_show_tx_rx_status, qsfp_set_tx_disable, TX_DISABLE4);
+static SENSOR_DEVICE_ATTR(sfp_tx_fault1, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT1);
+static SENSOR_DEVICE_ATTR(sfp_tx_fault2, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT2);
+static SENSOR_DEVICE_ATTR(sfp_tx_fault3, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT3);
+static SENSOR_DEVICE_ATTR(sfp_tx_fault4, S_IRUGO, qsfp_show_tx_rx_status, NULL, TX_FAULT4);
+static struct attribute *qsfp_attributes[] = {
+	&sensor_dev_attr_sfp_port_number.dev_attr.attr,
+	&sensor_dev_attr_sfp_port_type.dev_attr.attr,
+	&sensor_dev_attr_sfp_is_present.dev_attr.attr,
+	&sensor_dev_attr_sfp_is_present_all.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los1.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los2.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los3.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los4.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable1.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable2.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable3.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable4.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault1.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault2.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault3.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault4.dev_attr.attr,
+	NULL
+};
+
+/* SFP msa attributes for sysfs */
+static SENSOR_DEVICE_ATTR(sfp_ddm_implemented,	 S_IRUGO, sfp_show_ddm_implemented, NULL, DDM_IMPLEMENTED);
+static SENSOR_DEVICE_ATTR(sfp_rx_los_all,  S_IRUGO, sfp_show_tx_rx_status, NULL, RX_LOS_ALL);
+static struct attribute *sfp_msa_attributes[] = {
+	&sensor_dev_attr_sfp_port_number.dev_attr.attr,
+	&sensor_dev_attr_sfp_port_type.dev_attr.attr,
+	&sensor_dev_attr_sfp_is_present.dev_attr.attr,
+	&sensor_dev_attr_sfp_is_present_all.dev_attr.attr,
+	&sensor_dev_attr_sfp_ddm_implemented.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_fault.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los.dev_attr.attr,
+	&sensor_dev_attr_sfp_rx_los_all.dev_attr.attr,
+	&sensor_dev_attr_sfp_tx_disable.dev_attr.attr,
+	NULL
+};
+
+/* SFP ddm attributes for sysfs */
+static struct attribute *sfp_ddm_attributes[] = {
+	NULL
+};
+
+/* Platform dependent +++ */
+#define CPLD_PORT_TO_FRONT_PORT(port)  (port+1)
+
+enum port_numbers {
+cs6436_56p_sfp1,  cs6436_56p_sfp2,  cs6436_56p_sfp3,  cs6436_56p_sfp4,
+cs6436_56p_sfp5,  cs6436_56p_sfp6,  cs6436_56p_sfp7,  cs6436_56p_sfp8,
+cs6436_56p_sfp9,  cs6436_56p_sfp10, cs6436_56p_sfp11, cs6436_56p_sfp12,
+cs6436_56p_sfp13, cs6436_56p_sfp14, cs6436_56p_sfp15, cs6436_56p_sfp16,
+cs6436_56p_sfp17, cs6436_56p_sfp18, cs6436_56p_sfp19, cs6436_56p_sfp20,
+cs6436_56p_sfp21, cs6436_56p_sfp22, cs6436_56p_sfp23, cs6436_56p_sfp24,
+cs6436_56p_sfp25, cs6436_56p_sfp26, cs6436_56p_sfp27, cs6436_56p_sfp28,
+cs6436_56p_sfp29, cs6436_56p_sfp30, cs6436_56p_sfp31, cs6436_56p_sfp32,
+cs6436_56p_sfp33, cs6436_56p_sfp34, cs6436_56p_sfp35, cs6436_56p_sfp36,
+cs6436_56p_sfp37, cs6436_56p_sfp38, cs6436_56p_sfp39, cs6436_56p_sfp40,
+cs6436_56p_sfp41, cs6436_56p_sfp42, cs6436_56p_sfp43, cs6436_56p_sfp44,
+cs6436_56p_sfp45, cs6436_56p_sfp46, cs6436_56p_sfp47, cs6436_56p_sfp48,
+cs6436_56p_sfp49, cs6436_56p_sfp50, cs6436_56p_sfp51, cs6436_56p_sfp52,
+cs6436_56p_sfp53, cs6436_56p_sfp54, cs6436_56p_sfp55, cs6436_56p_sfp56
+};
+
+#define I2C_DEV_ID(x) { #x, x}
+
+static const struct i2c_device_id sfp_device_id[] = {
+I2C_DEV_ID(cs6436_56p_sfp1),
+I2C_DEV_ID(cs6436_56p_sfp2),
+I2C_DEV_ID(cs6436_56p_sfp3),
+I2C_DEV_ID(cs6436_56p_sfp4),
+I2C_DEV_ID(cs6436_56p_sfp5),
+I2C_DEV_ID(cs6436_56p_sfp6),
+I2C_DEV_ID(cs6436_56p_sfp7),
+I2C_DEV_ID(cs6436_56p_sfp8),
+I2C_DEV_ID(cs6436_56p_sfp9),
+I2C_DEV_ID(cs6436_56p_sfp10),
+I2C_DEV_ID(cs6436_56p_sfp11),
+I2C_DEV_ID(cs6436_56p_sfp12),
+I2C_DEV_ID(cs6436_56p_sfp13),
+I2C_DEV_ID(cs6436_56p_sfp14),
+I2C_DEV_ID(cs6436_56p_sfp15),
+I2C_DEV_ID(cs6436_56p_sfp16),
+I2C_DEV_ID(cs6436_56p_sfp17),
+I2C_DEV_ID(cs6436_56p_sfp18),
+I2C_DEV_ID(cs6436_56p_sfp19),
+I2C_DEV_ID(cs6436_56p_sfp20),
+I2C_DEV_ID(cs6436_56p_sfp21),
+I2C_DEV_ID(cs6436_56p_sfp22),
+I2C_DEV_ID(cs6436_56p_sfp23),
+I2C_DEV_ID(cs6436_56p_sfp24),
+I2C_DEV_ID(cs6436_56p_sfp25),
+I2C_DEV_ID(cs6436_56p_sfp26),
+I2C_DEV_ID(cs6436_56p_sfp27),
+I2C_DEV_ID(cs6436_56p_sfp28),
+I2C_DEV_ID(cs6436_56p_sfp29),
+I2C_DEV_ID(cs6436_56p_sfp30),
+I2C_DEV_ID(cs6436_56p_sfp31),
+I2C_DEV_ID(cs6436_56p_sfp32),
+I2C_DEV_ID(cs6436_56p_sfp33),
+I2C_DEV_ID(cs6436_56p_sfp34),
+I2C_DEV_ID(cs6436_56p_sfp35),
+I2C_DEV_ID(cs6436_56p_sfp36),
+I2C_DEV_ID(cs6436_56p_sfp37),
+I2C_DEV_ID(cs6436_56p_sfp38),
+I2C_DEV_ID(cs6436_56p_sfp39),
+I2C_DEV_ID(cs6436_56p_sfp40),
+I2C_DEV_ID(cs6436_56p_sfp41),
+I2C_DEV_ID(cs6436_56p_sfp42),
+I2C_DEV_ID(cs6436_56p_sfp43),
+I2C_DEV_ID(cs6436_56p_sfp44),
+I2C_DEV_ID(cs6436_56p_sfp45),
+I2C_DEV_ID(cs6436_56p_sfp46),
+I2C_DEV_ID(cs6436_56p_sfp47),
+I2C_DEV_ID(cs6436_56p_sfp48),
+I2C_DEV_ID(cs6436_56p_sfp49),
+I2C_DEV_ID(cs6436_56p_sfp50),
+I2C_DEV_ID(cs6436_56p_sfp51),
+I2C_DEV_ID(cs6436_56p_sfp52),
+I2C_DEV_ID(cs6436_56p_sfp53),
+I2C_DEV_ID(cs6436_56p_sfp54),
+I2C_DEV_ID(cs6436_56p_sfp55),
+I2C_DEV_ID(cs6436_56p_sfp56),
+{ /* LIST END */ }
+};
+MODULE_DEVICE_TABLE(i2c, sfp_device_id);
+
+/*
+ * list of valid port types
+ * note OOM_PORT_TYPE_NOT_PRESENT to indicate no
+ * module is present in this port
+ */
+typedef enum oom_driver_port_type_e {
+	OOM_DRIVER_PORT_TYPE_INVALID,
+	OOM_DRIVER_PORT_TYPE_NOT_PRESENT,
+	OOM_DRIVER_PORT_TYPE_SFP,
+	OOM_DRIVER_PORT_TYPE_SFP_PLUS,
+	OOM_DRIVER_PORT_TYPE_QSFP,
+	OOM_DRIVER_PORT_TYPE_QSFP_PLUS,
+	OOM_DRIVER_PORT_TYPE_QSFP28
+} oom_driver_port_type_t;
+
+enum driver_type_e {
+	DRIVER_TYPE_SFP_MSA,
+	DRIVER_TYPE_SFP_DDM,
+	DRIVER_TYPE_QSFP
+};
+
+/* Each client has this additional data
+ */
+struct eeprom_data {
+	char				 valid;			/* !=0 if registers are valid */
+	unsigned long		 last_updated;	/* In jiffies */
+	struct bin_attribute bin;			/* eeprom data */
+};
+
+struct sfp_msa_data {
+	char			valid;			/* !=0 if registers are valid */
+	unsigned long	last_updated;	/* In jiffies */
+	u64				status[6];		/* bit0:port0, bit1:port1 and so on */
+									/* index 0 => tx_fail
+											 1 => tx_disable
+											 2 => rx_loss
+											 3 => device id
+											 4 => 10G Ethernet Compliance Codes
+												  to distinguish SFP or SFP+
+											 5 => DIAGNOSTIC MONITORING TYPE */
+	struct eeprom_data				eeprom;
+};
+
+struct sfp_ddm_data {
+	struct eeprom_data				eeprom;
+};
+
+struct qsfp_data {
+	char			valid;			/* !=0 if registers are valid */
+	unsigned long	last_updated;	/* In jiffies */
+	u8				status[3];		/* bit0:port0, bit1:port1 and so on */
+									/* index 0 => tx_fail
+											 1 => tx_disable
+											 2 => rx_loss */
+
+	u8					device_id;
+	struct eeprom_data	eeprom;
+};
+
+struct sfp_port_data {
+	struct mutex		   update_lock;
+	enum driver_type_e	   driver_type;
+	int					   port;		/* CPLD port index */
+	oom_driver_port_type_t port_type;
+	u64					   present;		/* present status, bit0:port0, bit1:port1 and so on */
+
+	struct sfp_msa_data	  *msa;
+	struct sfp_ddm_data	  *ddm;
+	struct qsfp_data	  *qsfp;
+
+	struct i2c_client	  *client;
+};
+
+static ssize_t show_port_number(struct device *dev, struct device_attribute *da,
+			 char *buf)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+	return sprintf(buf, "%d\n", CPLD_PORT_TO_FRONT_PORT(data->port));
+}
+
+#define WAIT_TIME_OUT_COUNT 100
+
+static int cig_cpld_write_sfp_register(u8 sfp_reg_addr, u8 sfp_write_reg_data)
+{
+	u8 sfp_read_status = 0;
+	u8 wait_time_out = WAIT_TIME_OUT_COUNT;
+	
+	cig_cpld_write_register(ADDR_REG_SFP_STATUS_ADDR, sfp_reg_addr << 1);
+	cig_cpld_write_register(ADDR_REG_SFP_STATUS_TX, sfp_write_reg_data);
+	cig_cpld_write_register(ADDR_REG_SFP_STATUS_COMMAND, 0x80);
+	do{
+		cig_cpld_read_register(ADDR_REG_SFP_STATUS_STATUS, &sfp_read_status);
+		udelay(60);
+		wait_time_out--;
+		if(wait_time_out == 0)
+			break;
+	}while(sfp_read_status != 0x02);
+
+	if(wait_time_out == 0)
+		return -1;
+
+	return 1;
+}
+
+
+static int cig_cpld_read_sfp_register(u8 sfp_reg_addr, u8 *sfp_read_reg_data)
+{
+	u8 sfp_read_status = 0;
+	u8 wait_time_out = WAIT_TIME_OUT_COUNT;
+	
+	cig_cpld_write_register(ADDR_REG_SFP_STATUS_ADDR, sfp_reg_addr << 1 | 1);
+	cig_cpld_write_register(ADDR_REG_SFP_STATUS_COMMAND, 0x80);
+	do{
+		udelay(60);
+		cig_cpld_read_register(ADDR_REG_SFP_STATUS_STATUS, &sfp_read_status);
+		wait_time_out--;
+		if(wait_time_out == 0)
+			break;
+	}while(sfp_read_status != 0x01);
+
+	cig_cpld_read_register(ADDR_REG_SFP_STATUS_RX,sfp_read_reg_data);
+
+	if(wait_time_out == 0)
+		return -1;
+
+	return 1;
+}
+
+
+
+
+			 
+
+/* Platform dependent +++ */
+static struct sfp_port_data *sfp_update_present(struct i2c_client *client)
+{
+	int i = 0, j = 0, status = -1;
+	unsigned char cpld_reg_data = 0,cpld_reg_addr = 0;
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	DEBUG_PRINT("Starting sfp present status update");
+	mutex_lock(&data->update_lock);
+	data->present = 0;
+
+	udelay(6000);
+
+	/* Read present status of port 1~48(SFP port) */
+	for (i = 0; i < 6; i++) {
+			cpld_reg_addr 	= 1 + i;
+			
+			status = cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+
+			if (unlikely(status < 0)) {
+				dev_dbg(&client->dev, "cpld(0x%x) reg(0x%x) err %d\n", cpld_reg_addr, cpld_reg_data, status);
+				goto exit;
+			}
+
+			data->present |= (u64)cpld_reg_data << (i*8);
+			
+			DEBUG_PRINT("Present status = 0x%lx\r\n", data->present);		
+	}
+
+	/* Read present status of port 49-56(QSFP port) */
+	cpld_reg_addr = 25;
+	status 	  = cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+	if (unlikely(status < 0)) {
+		dev_dbg(&client->dev, "cpld(0x%x) reg(0x%x) err %d\n", cpld_reg_addr, cpld_reg_data, status);
+		goto exit;
+	}
+	else {
+		data->present |= (u64)cpld_reg_data << 48;
+	}	
+
+	DEBUG_PRINT("Present status = 0x%lx", data->present);
+exit:
+	mutex_unlock(&data->update_lock);
+	return (status < 0) ? ERR_PTR(status) : data;
+}
+
+static struct sfp_port_data *sfp_update_tx_rx_status(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+	int i = 0, j = 0;
+	int status = -1;
+	unsigned char cpld_reg_data = 0,cpld_reg_addr = 0;
+
+	if (time_before(jiffies, data->msa->last_updated + HZ + HZ / 2) && data->msa->valid) {
+        return data;
+	}
+
+	DEBUG_PRINT("Starting cs6436_56p sfp tx rx status update");
+	mutex_lock(&data->update_lock);
+	data->msa->valid = 0;
+	memset(data->msa->status, 0, sizeof(data->msa->status));
+
+	udelay(6000);
+
+	/* Read status of port 1~48(SFP port) */
+	for (i = 0; i < 6; i++) {
+			cpld_reg_addr = 13+i;
+			
+			status	= cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+			if (unlikely(status < 0)) {
+				dev_dbg(&client->dev, "cpld(0x%x) reg(0x%x) err %d\n", cpld_reg_addr, cpld_reg_data, status);
+				goto exit;
+			}
+
+			data->msa->status[0] |= (u64)cpld_reg_data << (i * 8);
+			
+			DEBUG_PRINT("tx rx status[0] = 0x%lx\r\n", data->msa->status[0]);		
+	}
+	
+
+	for (i = 0; i < 6; i++) {
+			cpld_reg_addr = 19+i;
+			
+			status	= cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+			if (unlikely(status < 0)) {
+				dev_dbg(&client->dev, "cpld(0x%x) reg(0x%x) err %d\n", cpld_reg_addr, cpld_reg_data, status);
+				goto exit;
+			}
+
+			data->msa->status[1] |= (u64)cpld_reg_data << (i * 8);
+			
+			DEBUG_PRINT("tx rx status[1] = 0x%lx\r\n", data->msa->status[1]);		
+	}
+
+	for (i = 0; i < 6; i++) {
+			cpld_reg_addr = 7+i;
+			
+			status	= cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+			if (unlikely(status < 0)) {
+				dev_dbg(&client->dev, "cpld(0x%x) reg(0x%x) err %d\n", cpld_reg_addr, cpld_reg_data, status);
+				goto exit;
+			}
+
+			data->msa->status[2] |= (u64)cpld_reg_data << (i * 8);
+			
+			DEBUG_PRINT("tx rx status[2] = 0x%lx\r\n", data->msa->status[2]);		
+	}
+
+	data->msa->valid = 1;
+	data->msa->last_updated = jiffies;
+
+exit:
+	mutex_unlock(&data->update_lock);
+    return (status < 0) ? ERR_PTR(status) : data;
+}
+
+static ssize_t sfp_set_tx_disable(struct device *dev, struct device_attribute *da,
+			const char *buf, size_t count)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+	unsigned char cpld_reg_data = 0,cpld_reg_addr = 0,cpld_reg_bit = 0,cpld_reg_val = 0;
+	long disable;
+	int error;
+
+	if (data->driver_type == DRIVER_TYPE_QSFP) {
+		return qsfp_set_tx_disable(dev, da, buf, count);
+	}
+
+	error = kstrtol(buf, 10, &disable);
+	if (error) {
+		return error;
+	}
+
+	mutex_lock(&data->update_lock);
+	
+	udelay(6000);
+
+	if(data->port <= 48) {
+		cpld_reg_addr = 19 + data->port / 8;
+		cpld_reg_bit = 1 << (data->port);
+	}
+
+	/* Read current status */
+	error = cig_cpld_read_sfp_register(cpld_reg_addr, &cpld_reg_data);
+
+	/* Update tx_disable status */
+	if (disable) {
+		data->msa->status[1] |= BIT_INDEX(data->port);
+		cpld_reg_data |= cpld_reg_bit;
+	}
+	else {
+		data->msa->status[1] &= ~BIT_INDEX(data->port);
+		cpld_reg_data &= ~cpld_reg_bit;
+	}
+	
+	error = cig_cpld_write_sfp_register(cpld_reg_addr,cpld_reg_data);
+
+	mutex_unlock(&data->update_lock);
+	return count;
+}
+/* Platform dependent --- */
+
+static int sfp_is_port_present(struct i2c_client *client, int port)
+{
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	data = sfp_update_present(client);
+	if (IS_ERR(data)) {
+		return PTR_ERR(data);
+	}
+
+	return !(data->present & BIT_INDEX(data->port)); /* Platform dependent */
+}
+
+/* Platform dependent +++ */
+static ssize_t show_present(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);
+
+	if (PRESENT_ALL == attr->index) {
+		int i;
+		u8 values[7]  = {0};
+		struct sfp_port_data *data = sfp_update_present(client);
+		
+		if (IS_ERR(data)) {
+			return PTR_ERR(data);
+		}
+
+		for (i = 0; i < ARRAY_SIZE(values); i++) {
+			values[i] = ~(u8)(data->present >> (i * 8));
+		}
+
+        /* Return values 1 -> 56 in order */
+        return sprintf(buf, "%.2x %.2x %.2x %.2x %.2x %.2x %.2x\n",
+                       values[0], values[1], values[2],
+                       values[3], values[4], values[5],
+                       values[6]);
+	}
+	else {
+		struct sfp_port_data *data = i2c_get_clientdata(client);
+		int present = sfp_is_port_present(client, data->port);
+
+		if (IS_ERR_VALUE(present)) {
+			return present;
+		}
+
+		/* PRESENT */
+		return sprintf(buf, "%d\n", present);
+	}
+}
+/* Platform dependent --- */
+
+static struct sfp_port_data *sfp_update_port_type(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+	u8 buf = 0;
+	int status;
+
+	mutex_lock(&data->update_lock);
+
+	switch (data->driver_type) {
+		case DRIVER_TYPE_SFP_MSA:
+		{
+			status = sfp_eeprom_read(client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf));
+			if (unlikely(status < 0)) {
+				data->port_type = OOM_DRIVER_PORT_TYPE_INVALID;
+				break;
+			}
+
+			if (buf != SFF8024_DEVICE_ID_SFP) {
+				data->port_type = OOM_DRIVER_PORT_TYPE_INVALID;
+				break;
+			}
+
+			status = sfp_eeprom_read(client, SFF8472_10G_ETH_COMPLIANCE_ADDR, &buf, sizeof(buf));
+			if (unlikely(status < 0)) {
+				data->port_type = OOM_DRIVER_PORT_TYPE_INVALID;
+				break;
+			}
+
+			DEBUG_PRINT("sfp port type (0x3) data = (0x%x)", buf);
+			data->port_type = buf & SFF8472_10G_BASE_MASK ? OOM_DRIVER_PORT_TYPE_SFP_PLUS : OOM_DRIVER_PORT_TYPE_SFP;
+			break;
+		}
+		case DRIVER_TYPE_QSFP:
+		{
+			status = sfp_eeprom_read(client, SFF8024_PHYSICAL_DEVICE_ID_ADDR, &buf, sizeof(buf));
+			if (unlikely(status < 0)) {
+				data->port_type = OOM_DRIVER_PORT_TYPE_INVALID;
+				break;
+			}
+
+			DEBUG_PRINT("qsfp port type (0x0) buf = (0x%x)", buf);
+			switch (buf) {
+			case SFF8024_DEVICE_ID_QSFP:
+				data->port_type = OOM_DRIVER_PORT_TYPE_QSFP;
+				break;
+			case SFF8024_DEVICE_ID_QSFP_PLUS:
+				data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS;
+				break;
+			case SFF8024_DEVICE_ID_QSFP28:
+				data->port_type = OOM_DRIVER_PORT_TYPE_QSFP_PLUS;
+				break;
+			default:
+				data->port_type = buf;
+				break;
+			}
+
+			break;
+		}
+		default:
+			break;
+	}
+
+	mutex_unlock(&data->update_lock);
+	return data;
+}
+
+static ssize_t show_port_type(struct device *dev, struct device_attribute *da,
+			 char *buf)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);	
+	int present = sfp_is_port_present(client, data->port);
+
+	if (IS_ERR_VALUE(present)) {
+		return present;
+	}
+
+	if (!present) {
+		/* port is not present */
+		return sprintf(buf, "%d\n", OOM_DRIVER_PORT_TYPE_NOT_PRESENT);
+	}
+
+	sfp_update_port_type(dev);
+	return sprintf(buf, "%d\n", data->port_type);
+}
+
+static struct sfp_port_data *qsfp_update_tx_rx_status(struct device *dev)
+{
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+	int i, status = -1;
+	u8 buf = 0;
+	u8 reg[] = {SFF8436_TX_FAULT_ADDR, SFF8436_TX_DISABLE_ADDR, SFF8436_RX_LOS_ADDR};
+
+	DEBUG_PRINT("");
+	if (time_before(jiffies, data->qsfp->last_updated + HZ + HZ / 2) && data->qsfp->valid) {
+		return data;
+	}
+
+	DEBUG_PRINT("Starting sfp tx rx status update");
+	mutex_lock(&data->update_lock);
+	data->qsfp->valid = 0;
+	memset(data->qsfp->status, 0, sizeof(data->qsfp->status));
+
+	DEBUG_PRINT("");
+	/* Notify device to update tx fault/ tx disable/ rx los status */
+	for (i = 0; i < ARRAY_SIZE(reg); i++) {
+		status = sfp_eeprom_read(client, reg[i], &buf, sizeof(buf));
+		if (unlikely(status < 0)) {
+			DEBUG_PRINT("");
+			goto exit;
+		}
+	}
+	msleep(200);
+	DEBUG_PRINT("");
+
+	/* Read actual tx fault/ tx disable/ rx los status */
+	for (i = 0; i < ARRAY_SIZE(reg); i++) {
+		status = sfp_eeprom_read(client, reg[i], &buf, sizeof(buf));
+		if (unlikely(status < 0)) {
+			DEBUG_PRINT("");
+			goto exit;
+		}
+
+		DEBUG_PRINT("qsfp reg(0x%x) status = (0x%x)", reg[i], data->qsfp->status[i]);
+		data->qsfp->status[i] = (buf & 0xF);
+	}
+
+	DEBUG_PRINT("");
+	data->qsfp->valid = 1;
+	data->qsfp->last_updated = jiffies;
+
+exit:
+	DEBUG_PRINT("");
+	mutex_unlock(&data->update_lock);
+	return (status < 0) ? ERR_PTR(status) : data;
+}
+
+static ssize_t qsfp_show_tx_rx_status(struct device *dev, struct device_attribute *da,
+			 char *buf)
+{
+	int present;
+	u8 val = 0;
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	DEBUG_PRINT("");
+	present = sfp_is_port_present(client, data->port);
+	if (IS_ERR_VALUE(present)) {
+		return present;
+	}
+
+	DEBUG_PRINT("");
+	if (present == 0) {
+		/* port is not present */
+        return -ENODEV;
+	}
+
+	DEBUG_PRINT("");
+	data = qsfp_update_tx_rx_status(dev);
+	DEBUG_PRINT("");
+	if (IS_ERR(data)) {
+		return PTR_ERR(data);
+	}
+
+	DEBUG_PRINT("");
+	switch (attr->index) {
+	case TX_FAULT:
+		val = !!(data->qsfp->status[2] & 0xF);
+		break;
+	case TX_FAULT1:
+	case TX_FAULT2:
+	case TX_FAULT3:
+	case TX_FAULT4:
+		val = !!(data->qsfp->status[2] & BIT_INDEX(attr->index - TX_FAULT1));
+		break;
+	case TX_DISABLE:
+		val = data->qsfp->status[1] & 0xF;
+		break;
+	case TX_DISABLE1:
+	case TX_DISABLE2:
+	case TX_DISABLE3:
+	case TX_DISABLE4:
+		val = !!(data->qsfp->status[1] & BIT_INDEX(attr->index - TX_DISABLE1));
+		break;
+	case RX_LOS:
+		val = !!(data->qsfp->status[0] & 0xF);
+		break;
+	case RX_LOS1:
+	case RX_LOS2:
+	case RX_LOS3:
+	case RX_LOS4:
+		val = !!(data->qsfp->status[0] & BIT_INDEX(attr->index - RX_LOS1));
+		break;
+	default:
+		break;
+	}
+
+	DEBUG_PRINT("");
+	return sprintf(buf, "%d\n", val);
+}
+
+static ssize_t qsfp_set_tx_disable(struct device *dev, struct device_attribute *da,
+			const char *buf, size_t count)
+{
+	long disable;
+	int status;
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);	
+
+	status = sfp_is_port_present(client, data->port);
+	if (IS_ERR_VALUE(status)) {
+		return status;
+	}
+
+	if (!status) {
+		/* port is not present */
+		return -ENXIO;
+	}
+
+	status = kstrtol(buf, 10, &disable);
+	if (status) {
+		return status;
+	}
+
+	data = qsfp_update_tx_rx_status(dev);
+	if (IS_ERR(data)) {
+		return PTR_ERR(data);
+	}
+
+	mutex_lock(&data->update_lock);
+
+	if (attr->index == TX_DISABLE) {
+		data->qsfp->status[1] = disable & 0xF;
+	}
+	else {/* TX_DISABLE1 ~ TX_DISABLE4*/
+		if (disable) {
+			data->qsfp->status[1] |= (1 << (attr->index - TX_DISABLE1));
+		}
+		else {
+			data->qsfp->status[1] &= ~(1 << (attr->index - TX_DISABLE1));
+		}
+	}
+
+	DEBUG_PRINT("index = (%d), status = (0x%x)", attr->index, data->qsfp->status[1]);
+	status = sfp_eeprom_write(data->client, SFF8436_TX_DISABLE_ADDR, &data->qsfp->status[1], sizeof(data->qsfp->status[1]));
+	if (unlikely(status < 0)) {
+		count = status;
+	}
+
+	mutex_unlock(&data->update_lock);
+	return count;
+}
+
+static ssize_t sfp_show_ddm_implemented(struct device *dev, struct device_attribute *da,
+			 char *buf)
+{
+	int status;
+	char ddm;
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	status = sfp_is_port_present(client, data->port);
+	if (IS_ERR_VALUE(status)) {
+		return status;
+	}
+
+	if (status == 0) {
+		/* port is not present */
+		return -ENODEV;
+	}
+
+	status = sfp_eeprom_read(client, SFF8472_DIAG_MON_TYPE_ADDR, &ddm, sizeof(ddm));
+	if (unlikely(status < 0)) {
+		return status;
+	}
+
+	return sprintf(buf, "%d\n", !!(ddm & SFF8472_DIAG_MON_TYPE_DDM_MASK));
+}
+
+/* Platform dependent +++ */
+static ssize_t sfp_show_tx_rx_status(struct device *dev, struct device_attribute *da,
+			 char *buf)
+{
+	u8 val = 0, index = 0;
+	struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
+	struct i2c_client *client = to_i2c_client(dev);
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	DEBUG_PRINT("driver type = (%d)", data->driver_type);
+	if (data->driver_type == DRIVER_TYPE_QSFP) {
+		DEBUG_PRINT("");
+		return qsfp_show_tx_rx_status(dev, da, buf);
+	}
+
+	DEBUG_PRINT("");
+	data = sfp_update_tx_rx_status(dev);
+	if (IS_ERR(data)) {
+		return PTR_ERR(data);
+	}
+
+	if(attr->index == RX_LOS_ALL) {
+		int i = 0;
+		u8 values[6] = {0};
+
+		for (i = 0; i < ARRAY_SIZE(values); i++) {
+			values[i] = (u8)(data->msa->status[2] >> (i * 8));
+		}
+		
+		/** Return values 1 -> 48 in order */
+		return sprintf(buf, "%.2x %.2x %.2x %.2x %.2x %.2x\n",
+						values[0], values[1], values[2],
+						values[3], values[4], values[5]);	
+	}
+	
+	switch (attr->index) {
+	case TX_FAULT:
+		index = 0;
+		break;
+	case TX_DISABLE:
+		index = 1;
+		break;
+	case RX_LOS:
+		index = 2;
+		break;		
+	default:
+		break;
+	}
+
+    val = !!(data->msa->status[index] & BIT_INDEX(data->port));
+    return sprintf(buf, "%d\n", val);
+}
+/* Platform dependent --- */
+static ssize_t sfp_eeprom_write(struct i2c_client *client, u8 command, const char *data,
+			  int data_len)
+{
+#if USE_I2C_BLOCK_READ
+	int status, retry = I2C_RW_RETRY_COUNT;
+
+	if (data_len > I2C_SMBUS_BLOCK_MAX) {
+		data_len = I2C_SMBUS_BLOCK_MAX;
+	}
+
+	while (retry) {
+		status = i2c_smbus_write_i2c_block_data(client, command, data_len, data);
+		if (unlikely(status < 0)) {
+			msleep(I2C_RW_RETRY_INTERVAL);
+			retry--;
+			continue;
+		}
+
+		break;
+	}
+
+	if (unlikely(status < 0)) {
+		return status;
+	}
+
+	return data_len;
+#else
+	int status, retry = I2C_RW_RETRY_COUNT;
+
+	while (retry) {
+		status = i2c_smbus_write_byte_data(client, command, *data);
+		if (unlikely(status < 0)) {
+			msleep(I2C_RW_RETRY_INTERVAL);
+			retry--;
+			continue;
+		}
+
+		break;
+	}
+
+	if (unlikely(status < 0)) {
+		return status;
+	}
+
+	return 1;
+#endif
+
+
+}
+
+static ssize_t sfp_port_write(struct sfp_port_data *data,
+						  const char *buf, loff_t off, size_t count)
+{
+	ssize_t retval = 0;
+
+	if (unlikely(!count)) {
+		return count;
+	}
+
+	/*
+	 * Write data to chip, protecting against concurrent updates
+	 * from this host, but not from other I2C masters.
+	 */
+	mutex_lock(&data->update_lock);
+
+	while (count) {
+		ssize_t status;
+
+		status = sfp_eeprom_write(data->client, off, buf, count);
+		if (status <= 0) {
+			if (retval == 0) {
+				retval = status;
+			}
+			break;
+		}
+		buf += status;
+		off += status;
+		count -= status;
+		retval += status;
+	}
+
+	mutex_unlock(&data->update_lock);
+	return retval;
+}
+
+
+static ssize_t sfp_bin_write(struct file *filp, struct kobject *kobj,
+				struct bin_attribute *attr,
+				char *buf, loff_t off, size_t count)
+{
+	int present;
+	struct sfp_port_data *data;
+	DEBUG_PRINT("%s(%d) offset = (%d), count = (%d)", off, count);
+	data = dev_get_drvdata(container_of(kobj, struct device, kobj));
+
+	present = sfp_is_port_present(data->client, data->port);
+	if (IS_ERR_VALUE(present)) {
+		return present;
+	}
+
+	if (present == 0) {
+		/* port is not present */
+		return -ENODEV;
+	}
+
+	return sfp_port_write(data, buf, off, count);
+}
+
+static ssize_t sfp_eeprom_read(struct i2c_client *client, u8 command, u8 *data,
+			  int data_len)
+{
+#if USE_I2C_BLOCK_READ
+	int status, retry = I2C_RW_RETRY_COUNT;
+
+	if (data_len > I2C_SMBUS_BLOCK_MAX) {
+		data_len = I2C_SMBUS_BLOCK_MAX;
+	}
+
+	while (retry) {
+		status = i2c_smbus_read_i2c_block_data(client, command, data_len, data);
+		if (unlikely(status < 0)) {
+			msleep(I2C_RW_RETRY_INTERVAL);
+			retry--;
+			continue;
+		}
+
+		break;
+	}
+
+	if (unlikely(status < 0)) {
+		goto abort;
+	}
+	if (unlikely(status != data_len)) {
+		status = -EIO;
+		goto abort;
+	}
+
+	//result = data_len;
+
+abort:
+	return status;
+#else
+	int status, retry = I2C_RW_RETRY_COUNT;
+
+	while (retry) {
+		status = i2c_smbus_read_byte_data(client, command);
+		if (unlikely(status < 0)) {
+			msleep(I2C_RW_RETRY_INTERVAL);
+			retry--;
+			continue;
+		}
+
+		break;
+	}
+
+	if (unlikely(status < 0)) {
+		dev_dbg(&client->dev, "sfp read byte data failed, command(0x%2x), data(0x%2x)\r\n", command, status);
+		goto abort;
+	}
+
+	*data  = (u8)status;
+	status = 1;
+
+abort:
+	return status;
+#endif
+}
+
+static ssize_t sfp_port_read(struct sfp_port_data *data,
+				char *buf, loff_t off, size_t count)
+{
+	ssize_t retval = 0;
+
+	if (unlikely(!count)) {
+		DEBUG_PRINT("Count = 0, return");
+		return count;
+	}
+
+	/*
+	 * Read data from chip, protecting against concurrent updates
+	 * from this host, but not from other I2C masters.
+	 */
+	mutex_lock(&data->update_lock);
+
+	while (count) {
+		ssize_t status;
+
+		status = sfp_eeprom_read(data->client, off, buf, count);
+		if (status <= 0) {
+			if (retval == 0) {
+				retval = status;
+			}
+			break;
+		}
+
+		buf += status;
+		off += status;
+		count -= status;
+		retval += status;
+	}
+
+	mutex_unlock(&data->update_lock);
+	return retval;
+
+}
+
+static ssize_t sfp_bin_read(struct file *filp, struct kobject *kobj,
+		struct bin_attribute *attr,
+		char *buf, loff_t off, size_t count)
+{
+	int present;
+	struct sfp_port_data *data;
+	DEBUG_PRINT("offset = (%d), count = (%d)", off, count);
+	data = dev_get_drvdata(container_of(kobj, struct device, kobj));
+
+	present = sfp_is_port_present(data->client, data->port);
+	if (IS_ERR_VALUE(present)) {
+		return present;
+	}
+
+	if (present == 0) {
+		/* port is not present */
+		return -ENODEV;
+	}
+
+	return sfp_port_read(data, buf, off, count);
+}
+
+static int sfp_sysfs_eeprom_init(struct kobject *kobj, struct bin_attribute *eeprom)
+{
+	int err;
+
+	sysfs_bin_attr_init(eeprom);
+	eeprom->attr.name = EEPROM_NAME;
+	eeprom->attr.mode = S_IWUSR | S_IRUGO;
+	eeprom->read	  = sfp_bin_read;
+	eeprom->write	  = sfp_bin_write;
+	eeprom->size	  = EEPROM_SIZE;
+
+	/* Create eeprom file */
+	err = sysfs_create_bin_file(kobj, eeprom);
+	if (err) {
+		return err;
+	}
+
+	return 0;
+}
+
+static int sfp_sysfs_eeprom_cleanup(struct kobject *kobj, struct bin_attribute *eeprom)
+{
+	sysfs_remove_bin_file(kobj, eeprom);
+	return 0;
+}
+
+static const struct attribute_group sfp_msa_group = {
+	.attrs = sfp_msa_attributes,
+};
+
+static int sfp_i2c_check_functionality(struct i2c_client *client)
+{
+#if USE_I2C_BLOCK_READ
+	return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK);
+#else
+	return i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA);
+#endif
+}
+
+static int sfp_msa_probe(struct i2c_client *client, const struct i2c_device_id *dev_id,
+							   struct sfp_msa_data **data)
+{
+	int status;
+	struct sfp_msa_data *msa;
+
+	if (!sfp_i2c_check_functionality(client)) {
+		status = -EIO;
+		goto exit;
+	}
+
+	msa = kzalloc(sizeof(struct sfp_msa_data), GFP_KERNEL);
+	if (!msa) {
+		status = -ENOMEM;
+		goto exit;
+	}
+
+	/* Register sysfs hooks */
+	status = sysfs_create_group(&client->dev.kobj, &sfp_msa_group);
+	if (status) {
+		goto exit_free;
+	}
+
+	/* init eeprom */
+	status = sfp_sysfs_eeprom_init(&client->dev.kobj, &msa->eeprom.bin);
+	if (status) {
+		goto exit_remove;
+	}
+
+	*data = msa;
+	dev_info(&client->dev, "sfp msa '%s'\n", client->name);
+
+	return 0;
+
+exit_remove:
+	sysfs_remove_group(&client->dev.kobj, &sfp_msa_group);
+exit_free:
+	kfree(msa);
+exit:
+
+	return status;
+}
+
+static const struct attribute_group sfp_ddm_group = {
+	.attrs = sfp_ddm_attributes,
+};
+
+static int sfp_ddm_probe(struct i2c_client *client, const struct i2c_device_id *dev_id,
+							   struct sfp_ddm_data **data)
+{
+	int status;
+	struct sfp_ddm_data *ddm;
+
+	if (!sfp_i2c_check_functionality(client)) {
+		status = -EIO;
+		goto exit;
+	}
+
+	ddm = kzalloc(sizeof(struct sfp_ddm_data), GFP_KERNEL);
+	if (!ddm) {
+		status = -ENOMEM;
+		goto exit;
+	}
+
+	/* Register sysfs hooks */
+	status = sysfs_create_group(&client->dev.kobj, &sfp_ddm_group);
+	if (status) {
+		goto exit_free;
+	}
+
+	/* init eeprom */
+	status = sfp_sysfs_eeprom_init(&client->dev.kobj, &ddm->eeprom.bin);
+	if (status) {
+		goto exit_remove;
+	}
+
+	*data = ddm;
+	dev_info(&client->dev, "sfp ddm '%s'\n", client->name);
+
+	return 0;
+
+exit_remove:
+	sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group);
+exit_free:
+	kfree(ddm);
+exit:
+
+	return status;
+}
+
+static const struct attribute_group qsfp_group = {
+	.attrs = qsfp_attributes,
+};
+
+static int qsfp_probe(struct i2c_client *client, const struct i2c_device_id *dev_id,
+						  struct qsfp_data **data)
+{
+	int status;
+	struct qsfp_data *qsfp;
+
+	if (!sfp_i2c_check_functionality(client)) {
+		status = -EIO;
+		goto exit;
+	}
+
+	qsfp = kzalloc(sizeof(struct qsfp_data), GFP_KERNEL);
+	if (!qsfp) {
+		status = -ENOMEM;
+		goto exit;
+	}
+
+	/* Register sysfs hooks */
+	status = sysfs_create_group(&client->dev.kobj, &qsfp_group);
+	if (status) {
+		goto exit_free;
+	}
+
+	/* init eeprom */
+	status = sfp_sysfs_eeprom_init(&client->dev.kobj, &qsfp->eeprom.bin);
+	if (status) {
+		goto exit_remove;
+	}
+
+	/* Bring QSFPs out of reset */
+	//cig_lpc_write(0x62, 0x15, 0x3F);
+
+	*data = qsfp;
+	dev_info(&client->dev, "qsfp '%s'\n", client->name);
+
+	return 0;
+
+exit_remove:
+	sysfs_remove_group(&client->dev.kobj, &qsfp_group);
+exit_free:
+	kfree(qsfp);
+exit:
+
+	return status;
+}
+
+/* Platform dependent +++ */
+static int sfp_device_probe(struct i2c_client *client,
+			const struct i2c_device_id *dev_id)
+{
+	struct sfp_port_data *data = NULL;
+
+	data = kzalloc(sizeof(struct sfp_port_data), GFP_KERNEL);
+	if (!data) {
+		return -ENOMEM;
+	}
+
+	i2c_set_clientdata(client, data);
+	mutex_init(&data->update_lock);
+	data->port 	 = dev_id->driver_data;
+	data->client = client;
+
+	if (dev_id->driver_data >= cs6436_56p_sfp1 && dev_id->driver_data <= cs6436_56p_sfp48) {
+		if (client->addr == SFP_EEPROM_A0_I2C_ADDR) {
+			data->driver_type = DRIVER_TYPE_SFP_MSA;
+			return sfp_msa_probe(client, dev_id, &data->msa);
+		}
+		else if (client->addr == SFP_EEPROM_A2_I2C_ADDR) {
+			data->driver_type = DRIVER_TYPE_SFP_DDM;
+			return sfp_ddm_probe(client, dev_id, &data->ddm);
+		}
+	}
+	else { /* cs6436_56p_sfp49 ~ cs6436_56p_sfp56 */
+		if (client->addr == SFP_EEPROM_A0_I2C_ADDR) {
+			data->driver_type = DRIVER_TYPE_QSFP;
+			return qsfp_probe(client, dev_id, &data->qsfp);
+		}
+	}
+	
+	return -ENODEV;
+}
+/* Platform dependent --- */
+
+static int sfp_msa_remove(struct i2c_client *client, struct sfp_msa_data *data)
+{
+	sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin);
+	sysfs_remove_group(&client->dev.kobj, &sfp_msa_group);
+	kfree(data);
+	return 0;
+}
+
+static int sfp_ddm_remove(struct i2c_client *client, struct sfp_ddm_data *data)
+{
+	sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin);
+	sysfs_remove_group(&client->dev.kobj, &sfp_ddm_group);
+	kfree(data);
+	return 0;
+}
+
+static int qfp_remove(struct i2c_client *client, struct qsfp_data *data)
+{
+	sfp_sysfs_eeprom_cleanup(&client->dev.kobj, &data->eeprom.bin);
+	sysfs_remove_group(&client->dev.kobj, &qsfp_group);
+	kfree(data);
+	return 0;
+}
+
+static int sfp_device_remove(struct i2c_client *client)
+{
+	struct sfp_port_data *data = i2c_get_clientdata(client);
+
+	switch (data->driver_type) {
+		case DRIVER_TYPE_SFP_MSA:
+			return sfp_msa_remove(client, data->msa);
+		case DRIVER_TYPE_SFP_DDM:
+			return sfp_ddm_remove(client, data->ddm);
+		case DRIVER_TYPE_QSFP:
+			return qfp_remove(client, data->qsfp);
+	}
+
+	return 0;
+}
+
+/* Addresses scanned
+ */
+static const unsigned short normal_i2c[] = { I2C_CLIENT_END };
+
+static struct i2c_driver cs6436_56p_sfp_driver = {
+	.driver = {
+		.name	  = DRIVER_NAME,
+	},
+	.probe		  = sfp_device_probe,
+	.remove		  = sfp_device_remove,
+    .id_table     = sfp_device_id,
+	.address_list = normal_i2c,
+};
+
+module_i2c_driver(cs6436_56p_sfp_driver);
+
+
+MODULE_AUTHOR("Zhang Peng <zhangpeng@cigtech.com>");
+MODULE_DESCRIPTION("cs6436_56p_sfp driver");
+MODULE_LICENSE("GPL");
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-init.service b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-init.service
new file mode 100755
index 0000000000..3936b54dee
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-init.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Cig CS6436-56P Platform initialization service
+Before=pmon.service
+DefaultDependencies=no
+
+[Service]
+Type=oneshot
+ExecStart=/usr/local/bin/cig_cs6436_util.py install
+ExecStop=/usr/local/bin/cig_cs6436_util.py clean
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-misc.service b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-misc.service
new file mode 100755
index 0000000000..7ff410cbb3
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/service/cs6436-platform-misc.service
@@ -0,0 +1,15 @@
+[Unit]
+Description=Cig CS6436-56P Platform miscellaneous service
+After=cs6436-platform-init.service
+DefaultDependencies=no
+
+[Service]
+ExecStart=/usr/local/bin/cig_cs6436_misc.py 
+KillSignal=SIGKILL
+SuccessExitStatus=SIGKILL
+
+# Resource Limitations
+LimitCORE=infinity
+
+[Install]
+WantedBy=multi-user.target
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/setup.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/setup.py
new file mode 100755
index 0000000000..c17c10c831
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/setup.py
@@ -0,0 +1,15 @@
+#!/usr/bin/env python
+
+import os
+import sys
+from setuptools import setup
+os.listdir
+
+setup(
+       name='cs6436-56p',
+       version='1.0.0',
+       description='Module to initialize Cig CS6436-56P platforms',
+
+       packages=['cs6436-56p'],
+       package_dir={'cs6436-56p': 'cs6436-56p/classes'},
+    )
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_misc.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_misc.py
new file mode 100755
index 0000000000..08decef98a
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_misc.py
@@ -0,0 +1,154 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2018 Cambridge, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import os
+import commands
+import sys, getopt
+import logging
+import re
+import time
+from collections import namedtuple
+from threading import Thread
+
+DEBUG = False
+i2c_prefix = '/sys/bus/i2c/devices/'
+cs6436__prefix = '/sys/devices/platform/cs6436_56p_led/leds/'
+
+def my_log(txt):
+    if DEBUG == True:
+        print "[ROY]"+txt
+    return
+
+def device_exist():
+    ret1, log = log_os_system("ls "+i2c_prefix+"5-005a", 0)
+    ret2, log = log_os_system("ls "+i2c_prefix+"5-005b", 0)
+    ret3, log = log_os_system("ls "+cs6436__prefix+"cs6436_56p_led*", 0)
+    return not(ret1 or ret2 or ret3)
+    
+
+def log_os_system(cmd, show):
+    logging.info('Run :'+cmd)  
+    status, output = commands.getstatusoutput(cmd)    
+    my_log (cmd +"with result:" + str(status))
+    my_log ("      output:"+output)    
+    if status:
+        logging.info('Failed :'+cmd)
+        if show:
+            print('Failed :'+cmd)
+    return status, output
+
+
+def system_misc_polling(threadName,delay):    
+    for count in range(1,5):
+        if device_exist() == False:
+            time.sleep(delay+3)
+            print "%s: %s, count=%d" % ( threadName, time.ctime(time.time()), count)
+        else:
+            break
+
+    if count == 4:
+        return
+        
+    status, output = log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::sys/brightness", 1)
+    status, output = log_os_system("hwconfig -cfp 1", 1)
+
+    while 1:
+        status, output = log_os_system("cat /sys/bus/i2c/devices/5-005a/psu_present", 1)
+        if status:
+          print "failed to check status for 5-005a/psu_present"
+          continue
+          
+        if output=='1':
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::psu1/brightness", 1)
+        else:
+           log_os_system("echo 0 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::psu1/brightness", 1)
+           
+        status, output = log_os_system("cat /sys/bus/i2c/devices/5-005b/psu_present", 1)
+        if status:
+          print "failed to check status for 5-005b/psu_present"
+          continue     
+          
+        if output=='1':
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::psu2/brightness", 1)
+        else:
+            log_os_system("echo 0 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::psu2/brightness", 1)
+
+        status, fan1 = log_os_system(" cat /sys/devices/platform/cs6436_56p_fan/fan1_fault",1)
+        if status:
+          print "failed to check status for cs6436_56p_fan/fan1_fault"
+          continue
+          
+        if fan1=='0':		
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan1/brightness", 1)
+        else:	    
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan1/brightness", 1)
+            
+        status, fan2 = log_os_system(" cat /sys/devices/platform/cs6436_56p_fan/fan2_fault",1)
+        
+        if status:
+          print "failed to check status for cs6436_56p_fan/fan2_fault"
+          continue
+          
+        if fan2=='0':		
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan2/brightness", 1)
+        else:	    
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan2/brightness", 1)
+            
+        status, fan3 = log_os_system(" cat /sys/devices/platform/cs6436_56p_fan/fan3_fault",1)
+        if status:
+          print "failed to check status for cs6436_56p_fan/fan3_fault"
+          continue
+          
+        if fan3=='0':		
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan3/brightness", 1)
+        else:	    
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan3/brightness", 1)
+            
+        status, fan4 = log_os_system(" cat /sys/devices/platform/cs6436_56p_fan/fan4_fault",1)
+        if status:
+          print "failed to check status for cs6436_56p_fan/fan4_fault"
+          continue
+          
+        if fan4=='0':		
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan4/brightness", 1)
+        else:	    
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan4/brightness", 1)
+            
+        status, fan5 = log_os_system(" cat /sys/devices/platform/cs6436_56p_fan/fan5_fault",1)
+        if status:
+          print "failed to check status for cs6436_56p_fan/fan5_fault"
+          continue 
+       
+        if fan5=='0':		
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan5/brightness", 1)
+        else:	    
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan5/brightness", 1)
+            
+        if fan1=='0' or fan2=='0' or fan3=='0' or fan4=='0' or fan5=='0':
+            log_os_system("echo 1 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan/brightness", 1)
+        else:
+            log_os_system("echo 3 > /sys/devices/platform/cs6436_56p_led/leds/cs6436_56p_led::fan/brightness", 1)
+        time.sleep(delay)
+        print "%s: %s" % ( threadName, time.ctime(time.time()))
+    return
+
+if __name__ == '__main__':
+    target=system_misc_polling("Thread-misc",3)
+
+
+
+
diff --git a/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_util.py b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_util.py
new file mode 100755
index 0000000000..2b64d2e107
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/cs6436-56p/utils/cig_cs6436_util.py
@@ -0,0 +1,538 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2018 Cambridge, Inc.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Usage: %(scriptName)s [options] command object
+
+options:
+    -h | --help     : this help message
+    -d | --debug    : run with debug mode
+    -f | --force    : ignore error during installation or clean 
+command:
+    install     : install drivers and generate related sysfs nodes
+    clean       : uninstall drivers and remove related sysfs nodes
+    show        : show all systen status
+    sff         : dump SFP eeprom
+    set         : change board setting with fan|led|sfp    
+"""
+
+import os
+import commands
+import sys, getopt
+import logging
+import re
+import time
+from collections import namedtuple
+
+
+
+
+PROJECT_NAME = 'cs6436_56p'
+version = '0.1.0'
+verbose = False
+DEBUG = False
+args = []
+ALL_DEVICE = {}               
+DEVICE_NO = {'led':9, 'fan':5, 'thermal':4, 'psu':2, 'sfp':56}
+FORCE = 0
+
+if DEBUG == True:
+    print sys.argv[0]
+    print 'ARGV      :', sys.argv[1:]   
+
+
+def main():
+    global DEBUG
+    global args
+    global FORCE
+        
+    if len(sys.argv)<2:
+        show_help()
+         
+    options, args = getopt.getopt(sys.argv[1:], 'hdf', ['help',
+                                                       'debug',
+                                                       'force',
+                                                          ])
+    if DEBUG == True:                                                           
+        print options
+        print args
+        print len(sys.argv)
+            
+    for opt, arg in options:
+        if opt in ('-h', '--help'):
+            show_help()
+        elif opt in ('-d', '--debug'):            
+            DEBUG = True
+            logging.basicConfig(level=logging.INFO)
+        elif opt in ('-f', '--force'): 
+            FORCE = 1
+        else:
+            logging.info('no option')                          
+    for arg in args:            
+        if arg == 'install':
+           do_install()
+        elif arg == 'clean':
+           do_uninstall()
+        elif arg == 'show':
+           device_traversal()
+        elif arg == 'sff':
+            if len(args)!=2:
+                show_eeprom_help()
+            elif int(args[1]) ==0 or int(args[1]) > DEVICE_NO['sfp']:              
+                show_eeprom_help()
+            else:
+                show_eeprom(args[1])  
+            return                              
+        elif arg == 'set':
+            if len(args)<3:
+                show_set_help()
+            else:
+                set_device(args[1:])                
+            return                
+        else:
+            show_help()
+            
+            
+    return 0              
+        
+def show_help():
+    print __doc__ % {'scriptName' : sys.argv[0].split("/")[-1]}
+    sys.exit(0)
+
+def  show_set_help():
+    cmd =  sys.argv[0].split("/")[-1]+ " "  + args[0]
+    print  cmd +" [led|sfp|fan]"
+    print  "    use \""+ cmd + " led 0-4 \"  to set led color"
+    print  "    use \""+ cmd + " fan 0-100\" to set fan duty percetage"    
+    print  "    use \""+ cmd + " sfp 1-56 {0|1}\" to set sfp# tx_disable" 
+    sys.exit(0)  
+    
+def  show_eeprom_help():
+    cmd =  sys.argv[0].split("/")[-1]+ " "  + args[0]
+    print  "    use \""+ cmd + " 1-56 \" to dump sfp# eeprom" 
+    sys.exit(0)           
+            
+def my_log(txt):
+    if DEBUG == True:
+        print "[ROY]"+txt    
+    return
+    
+def log_os_system(cmd, show):
+    logging.info('Run :'+cmd)  
+    status, output = commands.getstatusoutput(cmd)    
+    my_log (cmd +"with result:" + str(status))
+    my_log ("      output:"+output)    
+    if status:
+        logging.info('Failed :'+cmd)
+        if show:
+            print('Failed :'+cmd)
+    return  status, output
+            
+def driver_check():
+    for count in range(1,5):
+        time.sleep(1)
+        ret, lsmod = log_os_system("lsmod| grep i2c_i801", 0)
+        if len(lsmod) > 2:
+            log_os_system("rmmod i2c_i801", 0)
+            break
+
+    ret, lsmod = log_os_system("lsmod| grep i2c_designware_platform", 0)
+    if len(lsmod) > 2:
+        log_os_system("rmmod i2c_designware_platform", 0)
+        log_os_system("modprobe i2c-designware-platform", 0)
+        
+    ret, lsmod = log_os_system("lsmod| grep cig", 0)
+    logging.info('mods:'+lsmod)
+    if len(lsmod) ==0:
+        return False   
+    return True
+
+
+
+kos = [
+    'depmod',
+    'modprobe i2c_dev',
+    'modprobe i2c_mux_pca954x force_deselect_on_exit=1',
+    'modprobe x86-64-cig-cs6436-56p-cpld '  ,
+    'modprobe x86-64-cig-cs6436-56p-fan'  ,
+    'modprobe x86-64-cig-cs6436-56p-psu'  ,
+    'modprobe x86-64-cig-cs6436-56p-sfp'  ,
+    'modprobe x86-64-cig-cs6436-56p-led'  ]
+
+def driver_install():
+    global FORCE
+    
+    for i in range(0,len(kos)):
+        if i == 3:
+            ret, board_type = log_os_system("cat /proc/cpuinfo | grep \"model name\" | cut -b 32-39 | head -n 1", 0)
+            if board_type=='i3-6100U':
+                kos[i] =kos[i] + 'board_id=1' 
+            
+        status, output = log_os_system(kos[i], 1)
+        if status:
+            if FORCE == 0:        
+                return status              
+    return 0
+    
+def driver_uninstall():
+    global FORCE
+    for i in range(0,len(kos)):
+        rm = kos[-(i+1)].replace("modprobe", "modprobe -rq")
+        rm = rm.replace("insmod", "rmmod")        
+        status, output = log_os_system(rm, 1)
+        if status:
+            if FORCE == 0:        
+                return status              
+    return 0
+
+led_prefix ='/sys/class/leds/'+PROJECT_NAME+'_led::'
+hwmon_types = {'led': ['sys','fan','fan1','fan2','fan3','fan4','fan5','psu1','psu2']}
+hwmon_nodes = {'led': ['brightness'] }
+hwmon_prefix ={'led': led_prefix}
+
+i2c_prefix = '/sys/bus/i2c/devices/'
+i2c_bus = {'thermal': ['4-0048','4-0049', '5-004a', '5-004b'] ,
+           'psu': ['5-005a','5-005b'],
+           'sfp': ['-0050']}
+i2c_nodes = {'thermal': ['hwmon/hwmon*/temp1_input'] ,
+           'psu': ['psu_present ', 'psu_power_good']    ,
+           'sfp': ['sfp_is_present ', 'sfp_tx_disable']}
+
+fan_prefix ='/sys/bus/platform/devices/'+PROJECT_NAME+'_fan'
+fan_types = {'fan': ['fan1','fan2', 'fan3', 'fan4', 'fan5']}
+fan_nodes = {'fan': ['state', 'front_speed_rpm', 'rear_speed_rpm', 'fault']}
+
+
+sfp_map =  [8,9,10,11,12,13,14,15,16,
+            17,18,19,20,21,22,23,24,25,26,
+            27,28,29,30,31,32,33,34,35,36,
+            37,38,39,40,41,42,43,44,45,46,
+            47,48,49,50,51,52,53,54,55,56,
+            57,58,59,60,61,62,63]
+
+mknod =[
+    'echo pca9548 0x71 > /sys/bus/i2c/devices/i2c-2/new_device',
+    'echo pca9548 0x72 > /sys/bus/i2c/devices/i2c-2/new_device',
+    'echo pca9548 0x73 > /sys/bus/i2c/devices/i2c-2/new_device',
+    'echo pca9548 0x74 > /sys/bus/i2c/devices/i2c-2/new_device',
+    'echo pca9548 0x75 > /sys/bus/i2c/devices/i2c-3/new_device',
+    'echo pca9548 0x76 > /sys/bus/i2c/devices/i2c-3/new_device',
+    'echo pca9548 0x77 > /sys/bus/i2c/devices/i2c-3/new_device',
+    'echo lm75 0x48 > /sys/bus/i2c/devices/i2c-4/new_device',
+    'echo lm75 0x49 > /sys/bus/i2c/devices/i2c-4/new_device',
+    'echo lm75 0x4a > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo lm75 0x4b > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo cs6436_56p_psu1 0x5a > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo cs6436_56p_psu2 0x5b > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo cs6436_56p_psu1 0x52 > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo cs6436_56p_psu2 0x53 > /sys/bus/i2c/devices/i2c-5/new_device',
+    'echo 24c128 0x57 > /sys/bus/i2c/devices/i2c-7/new_device']
+
+
+def device_install():
+    global FORCE
+                
+    for i in range(0,len(mknod)):
+        #for pca954x need times to built new i2c buses            
+        if mknod[i].find('pca954') != -1:
+            time.sleep(1)
+            
+        status, output = log_os_system(mknod[i], 1)
+        if status:
+            print output
+            if FORCE == 0:                
+                return status
+            
+    for i in range(0,len(sfp_map)):
+        status, output =log_os_system("echo cs6436_56p_sfp"+str(i+1)+" 0x50 > /sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/new_device", 1)
+        if status:
+            print output
+            if FORCE == 0:            
+                return status
+
+        if i <= 47:
+            status, output =log_os_system("echo cs6436_56p_sfp"+str(i+1)+" 0x51 > /sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/new_device", 1)
+            if status:
+                print output
+                if FORCE == 0:
+                    return status
+
+    return 
+    
+def device_uninstall():
+    global FORCE
+    
+    for i in range(0,len(sfp_map)):
+        target = "/sys/bus/i2c/devices/i2c-"+str(sfp_map[i])+"/delete_device"
+        status, output =log_os_system("echo 0x50 > "+ target, 1)
+        if status:
+            print output
+            if FORCE == 0:            
+                return status
+       
+    nodelist = mknod
+           
+    for i in range(len(nodelist)):
+        target = nodelist[-(i+1)]
+        temp = target.split()
+        del temp[1]
+        temp[-1] = temp[-1].replace('new_device', 'delete_device')
+        status, output = log_os_system(" ".join(temp), 1)
+        if status:
+            print output
+            if FORCE == 0:            
+                return status  
+                                  
+    return 
+        
+def system_ready():
+    if driver_check() == False:
+        return False
+    if not device_exist(): 
+        return False
+    return True
+               
+def do_install():
+    print "Checking system...."
+    if driver_check() == False:
+        print "No driver, installing...."    
+        status = driver_install()
+        if status:
+            if FORCE == 0:        
+                return  status
+    else:
+        print PROJECT_NAME.upper()+" drivers detected...."                      
+    if not device_exist():
+        print "No device, installing...."     
+        status = device_install() 
+        if status:
+            if FORCE == 0:        
+                return  status        
+    else:
+        print PROJECT_NAME.upper()+" devices detected...."           
+    return
+    
+def do_uninstall():
+    print "Checking system...."
+    if not device_exist():
+        print PROJECT_NAME.upper() +" has no device installed...."         
+    else:
+        print "Removing device...."     
+        status = device_uninstall() 
+        if status:
+            if FORCE == 0:            
+                return  status  
+                
+    if driver_check()== False :
+        print PROJECT_NAME.upper() +" has no driver installed...."
+    else:
+        print "Removing installed driver...."
+        status = driver_uninstall()
+        if status:
+            if FORCE == 0:        
+                return  status                          
+                    
+    return       
+
+def devices_info():
+    global DEVICE_NO
+    global ALL_DEVICE
+    global i2c_bus, hwmon_types, fan_types
+    for key in DEVICE_NO:   
+        ALL_DEVICE[key]= {} 
+        for i in range(0,DEVICE_NO[key]):
+            ALL_DEVICE[key][key+str(i+1)] = []
+            
+    for key in i2c_bus:
+        buses = i2c_bus[key]
+        nodes = i2c_nodes[key]    
+        for i in range(0,len(buses)):
+            for j in range(0,len(nodes)):
+                if  'sfp' == key:
+                    for k in range(0,DEVICE_NO[key]):
+                        node = key+str(k+1)
+                        path = i2c_prefix+ str(sfp_map[k])+ buses[i]+"/"+ nodes[j]                
+                        my_log(node+": "+ path)
+                        ALL_DEVICE[key][node].append(path)                                        
+                else:
+                    node = key+str(i+1)
+                    path = i2c_prefix+ buses[i]+"/"+ nodes[j]                
+                    my_log(node+": "+ path)
+                    ALL_DEVICE[key][node].append(path)  
+                                     
+    for key in hwmon_types:
+        itypes = hwmon_types[key]
+        nodes = hwmon_nodes[key]    
+        for i in range(0,len(itypes)):
+            for j in range(0,len(nodes)): 
+                node = key+"_"+itypes[i]
+                path = hwmon_prefix[key]+ itypes[i]+"/"+ nodes[j]           
+                my_log(node+": "+ path)
+                ALL_DEVICE[key][ key+str(i+1)].append(path)                   
+
+    for key in fan_types:
+        itypes = fan_types[key]
+        nodes = fan_nodes[key]    
+        for i in range(0,len(itypes)):
+            for j in range(0,len(nodes)): 
+                node = key+"_"+itypes[i]
+                path = fan_prefix+"/"+ itypes[i]+"_"+ nodes[j]           
+                my_log(node+": "+ path)
+                ALL_DEVICE[key][ key+str(i+1)].append(path)
+                
+    #show dict all in the order
+    if DEBUG == True:
+        for i in sorted(ALL_DEVICE.keys()):
+            print(i+": ")
+            for j in sorted(ALL_DEVICE[i].keys()):    
+                print("   "+j)
+                for k in (ALL_DEVICE[i][j]):    
+                    print("   "+"   "+k)
+    return 
+        
+def show_eeprom(index):
+    if system_ready()==False:
+        print("System's not ready.")        
+        print("Please install first!")
+        return 
+              
+    if len(ALL_DEVICE)==0:
+        devices_info()        
+    node = ALL_DEVICE['sfp'] ['sfp'+str(index)][0]
+    node = node.replace(node.split("/")[-1], 'sfp_eeprom')
+    # check if got hexdump command in current environment
+    ret, log = log_os_system("which hexdump", 0)
+    ret, log2 = log_os_system("which busybox hexdump", 0)    
+    if len(log):
+        hex_cmd = 'hexdump'
+    elif len(log2):
+        hex_cmd = ' busybox hexdump'
+    else:
+        log = 'Failed : no hexdump cmd!!'
+        logging.info(log)
+        print log
+        return 1                                 
+            
+    print node + ":"
+    ret, log = log_os_system("cat "+node+"| "+hex_cmd+" -C", 1)
+    if ret==0:                                      
+        print  log 
+    else:
+        print "**********device no found**********"       
+    return 
+         
+def set_device(args):
+    global DEVICE_NO
+    global ALL_DEVICE
+    if system_ready()==False:
+        print("System's not ready.")        
+        print("Please install first!")
+        return     
+    
+    if len(ALL_DEVICE)==0:
+        devices_info()  
+        
+    if args[0]=='led':
+        if int(args[1])>4:
+            show_set_help()
+            return
+        #print  ALL_DEVICE['led']
+        for i in range(0,len(ALL_DEVICE['led'])):   
+            for k in (ALL_DEVICE['led']['led'+str(i+1)]):  
+                ret, log = log_os_system("echo "+args[1]+" >"+k, 1)
+                if ret:
+                    return ret  
+    elif args[0]=='fan':
+        if int(args[1])>100:
+            show_set_help()
+            return
+        #print  ALL_DEVICE['fan']
+        #fan1~6 is all fine, all fan share same setting        
+        node = ALL_DEVICE['fan'] ['fan1'][0] 
+        node = node.replace(node.split("/")[-1], 'fan_duty_cycle_percentage')
+        ret, log = log_os_system("cat "+ node, 1)            
+        if ret==0:
+            print ("Previous fan duty: " + log.strip() +"%")            
+        ret, log = log_os_system("echo "+args[1]+" >"+node, 1)
+        if ret==0:
+            print ("Current fan duty: " + args[1] +"%")          
+        return ret
+    elif args[0]=='sfp':
+        if int(args[1])> DEVICE_NO[args[0]] or int(args[1])==0:
+            show_set_help()
+            return     
+        if len(args)<2:
+            show_set_help()
+            return 
+                            
+        if int(args[2])>1:
+            show_set_help()
+            return
+       
+        #print  ALL_DEVICE[args[0]]   
+        for i in range(0,len(ALL_DEVICE[args[0]])):   
+            for j in ALL_DEVICE[args[0]][args[0]+str(args[1])]:        
+                if j.find('tx_disable')!= -1:  
+                    ret, log = log_os_system("echo "+args[2]+" >"+ j, 1)
+                    if ret:
+                        return ret  
+                                                                           
+    return
+
+def get_value(input):
+    digit = re.findall('\d+', input)
+    return int(digit[0])
+              
+def device_traversal():
+    if system_ready()==False:
+        print("System's not ready.")        
+        print("Please install first!")
+        return 
+        
+    if len(ALL_DEVICE)==0:
+        devices_info()
+    for i in sorted(ALL_DEVICE.keys()):
+        print("============================================")        
+        print(i.upper()+": ")
+        print("============================================")
+         
+        for j in sorted(ALL_DEVICE[i].keys(), key=get_value):    
+            print "   "+j+":",
+            for k in (ALL_DEVICE[i][j]):
+                ret, log = log_os_system("cat "+k, 0)
+                func = k.split("/")[-1].strip()
+                func = re.sub(j+'_','',func,1)
+                func = re.sub(i.lower()+'_','',func,1)                 
+                if ret==0:
+                    print func+"="+log+" ",                  
+                else:
+                    print func+"="+"X"+" ",
+            print                    
+            print("----------------------------------------------------------------")
+                                              
+     
+        print
+    return
+            
+def device_exist():
+    ret1, log = log_os_system("ls "+i2c_prefix+"*0077", 0)
+    ret2, log = log_os_system("ls "+i2c_prefix+"i2c-3", 0)
+    return not(ret1 or ret2)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/platform/nephos/sonic-platform-modules-cig/debian/changelog b/platform/nephos/sonic-platform-modules-cig/debian/changelog
new file mode 100755
index 0000000000..7a4aa7996f
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/debian/changelog
@@ -0,0 +1,5 @@
+sonic-cig-platform-modules (1.0.0) unstable; urgency=low
+
+  * Add support for CS6436-56P series
+
+ -- developer <developer@cigtech.com>  Wed, 12 Sep 2018 10:00:00 +0800
diff --git a/platform/nephos/sonic-platform-modules-cig/debian/compat b/platform/nephos/sonic-platform-modules-cig/debian/compat
new file mode 100755
index 0000000000..ec635144f6
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/debian/compat
@@ -0,0 +1 @@
+9
diff --git a/platform/nephos/sonic-platform-modules-cig/debian/control b/platform/nephos/sonic-platform-modules-cig/debian/control
new file mode 100755
index 0000000000..c617c76bbb
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/debian/control
@@ -0,0 +1,11 @@
+Source: sonic-cig-platform-modules
+Section: main
+Priority: extra
+Maintainer: yanglijie@cigtech.com
+Build-Depends: debhelper (>= 8.0.0), bzip2
+Standards-Version: 3.9.3
+
+Package: sonic-platform-cig-cs6436-56p
+Architecture: amd64
+Depends: linux-image-4.9.0-8-amd64
+Description: kernel modules for platform devices such as fan, led, sfp
diff --git a/platform/nephos/sonic-platform-modules-cig/debian/rules b/platform/nephos/sonic-platform-modules-cig/debian/rules
new file mode 100755
index 0000000000..3192948cc0
--- /dev/null
+++ b/platform/nephos/sonic-platform-modules-cig/debian/rules
@@ -0,0 +1,86 @@
+#!/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
+
+PACKAGE_PRE_NAME := sonic-platform-cig
+KVERSION   ?= $(shell uname -r)
+KERNEL_SRC :=  /lib/modules/$(KVERSION)
+MOD_SRC_DIR:= $(shell pwd)
+MODULE_DIRS:= cs6436-56p
+MODULE_DIR := modules
+UTILS_DIR := utils
+SERVICE_DIR := service
+CLASSES_DIR := classes
+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; \
+	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_systemd_enable
+	dh_installinit
+	dh_systemd_start
+	dh_link
+	dh_fixperms
+	dh_compress
+	dh_strip
+	dh_installdeb
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+.PHONY: build binary binary-arch binary-indep clean