Supermicro_arm64_1G_Switch_G3748_Added: Added new platform Supermicro 1G switch. The device and platform folders are included in this commit
This commit is contained in:
parent
5d511d4485
commit
0cb19ba5d1
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-Board-ac5x-G3748.md5
Executable file
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-Board-ac5x-G3748.md5
Executable file
@ -0,0 +1 @@
|
||||
1dd040e3e3ec7740ad5778e9da49a59d
|
1607
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-Board-ac5x-G3748.xml
Executable file
1607
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-Board-ac5x-G3748.xml
Executable file
File diff suppressed because it is too large
Load Diff
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-L1-AC5X-G3748.md5
Executable file
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-L1-AC5X-G3748.md5
Executable file
@ -0,0 +1 @@
|
||||
cccaf00bb8ea243d5c2884fb05bfd528
|
1219
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-L1-AC5X-G3748.xml
Executable file
1219
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-L1-AC5X-G3748.xml
Executable file
File diff suppressed because it is too large
Load Diff
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-PP-AC5X-G3748.md5
Executable file
1
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-PP-AC5X-G3748.md5
Executable file
@ -0,0 +1 @@
|
||||
75737f56687883d181ea3da8d1c24da6
|
871
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-PP-AC5X-G3748.xml
Executable file
871
device/supermicro/arm64-supermicro_sse_g3748-r0/ASK-PP-AC5X-G3748.xml
Executable file
@ -0,0 +1,871 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="2023-01-23-1.03" profile="Askpp" dsig="md5">
|
||||
<askppplt:ASK-PP xmlns:askppplt="urn:marvell:askpp:yang">
|
||||
<askppplt:typedefs>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>std-string</askppplt:name>
|
||||
<askppplt:type>string</askppplt:type>
|
||||
<askppplt:description>standard string.</askppplt:description>
|
||||
<askppplt:min>1</askppplt:min>
|
||||
<askppplt:max>100</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>queue-id-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Queue id</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>7</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>precent-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Precent</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>100</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>phaThreadId-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Thread id</askppplt:description>
|
||||
<askppplt:min>1</askppplt:min>
|
||||
<askppplt:max>255</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>routing-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies routing mode.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>POLICY_BASED_ROUTING_ONLY</askppplt:name>
|
||||
<askppplt:description>PBR only</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>TCAM_ROUTER_BASED</askppplt:name>
|
||||
<askppplt:description>Router engine or PBR</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>shared-table-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies table sharing modes for L3 (LPM), L2 (FDB), EM (Exact Match)</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MID_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>MID_L3_MID_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MID_L2_MIN_EM</askppplt:name>
|
||||
<askppplt:description>MID_L3_MID_L2_MIN_EM</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>LOW_MAX_L3_MID_LOW_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>LOW_MAX_L3_MID_LOW_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MAX_L3_MIN_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>MAX_L3_MIN_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>pha-firmware-image-id-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha image id</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>DEFAULT</askppplt:name>
|
||||
<askppplt:description>Default PHA firmware image ID</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>01</askppplt:name>
|
||||
<askppplt:description>01 firmware image ID</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>02</askppplt:name>
|
||||
<askppplt:description>02 PHA firmware image ID</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>pha-firmware-thread-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha thread type</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_INGRESS_SWITCH_IPV4</askppplt:name>
|
||||
<askppplt:description>IOAM_INGRESS_SWITCH_IPV4</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_INGRESS_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_INGRESS_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_TRANSIT_SWITCH_IPV4</askppplt:name>
|
||||
<askppplt:description>IOAM_TRANSIT_SWITCH_IPV4</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_TRANSIT_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_TRANSIT_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>4</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>INT_IOAM_MIRRORING</askppplt:name>
|
||||
<askppplt:description>INT_IOAM_MIRRORING</askppplt:description>
|
||||
<askppplt:value>5</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>INT_IOAM_EGRESS_SWITCH</askppplt:name>
|
||||
<askppplt:description>INT_IOAM_EGRESS_SWITCH</askppplt:description>
|
||||
<askppplt:value>6</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_NO_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_NO_EL</askppplt:description>
|
||||
<askppplt:value>7</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_ONE_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_ONE_EL</askppplt:description>
|
||||
<askppplt:value>8</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_TWO_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_TWO_EL</askppplt:description>
|
||||
<askppplt:value>9</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_THREE_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_THREE_EL</askppplt:description>
|
||||
<askppplt:value>10</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>UNIFIED_SR</askppplt:name>
|
||||
<askppplt:description>UNIFIED_SR</askppplt:description>
|
||||
<askppplt:value>11</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:name>
|
||||
<askppplt:description>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:description>
|
||||
<askppplt:value>12</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:name>
|
||||
<askppplt:description>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:description>
|
||||
<askppplt:value>13</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:name>
|
||||
<askppplt:description>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:description>
|
||||
<askppplt:value>14</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:name>
|
||||
<askppplt:description>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:description>
|
||||
<askppplt:value>15</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_EGRESS_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_EGRESS_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>16</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_END_NODE</askppplt:name>
|
||||
<askppplt:description>SRV6_END_NODE</askppplt:description>
|
||||
<askppplt:value>17</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_PENULTIMATE_END_NODE</askppplt:name>
|
||||
<askppplt:description>SRV6_PENULTIMATE_END_NODE</askppplt:description>
|
||||
<askppplt:value>18</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_1_SEGMENT</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_1_SEGMENT</askppplt:description>
|
||||
<askppplt:value>19</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>20</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>21</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>22</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_ADD_MSB</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_ADD_MSB</askppplt:description>
|
||||
<askppplt:value>23</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_FIX</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_FIX</askppplt:description>
|
||||
<askppplt:value>24</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_REMOVE</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_REMOVE</askppplt:description>
|
||||
<askppplt:value>25</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_EDSA_FIX</askppplt:name>
|
||||
<askppplt:description>SGT_EDSA_FIX</askppplt:description>
|
||||
<askppplt:value>26</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_EDSA_REMOVE</askppplt:name>
|
||||
<askppplt:description>SGT_EDSA_REMOVE</askppplt:description>
|
||||
<askppplt:value>27</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_FIX_IPV4</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_FIX_IPV4</askppplt:description>
|
||||
<askppplt:value>28</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_FIX_IPV6</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_FIX_IPV6</askppplt:description>
|
||||
<askppplt:value>29</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_REMOVE_IPV4</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_REMOVE_IPV4</askppplt:description>
|
||||
<askppplt:value>30</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_REMOVE_IPV6</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_REMOVE_IPV6</askppplt:description>
|
||||
<askppplt:value>31</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>PTP_PHY_1_STEP</askppplt:name>
|
||||
<askppplt:description>PTP_PHY_1_STEP</askppplt:description>
|
||||
<askppplt:value>32</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>EGRESS_MIRRORING_METADATA</askppplt:name>
|
||||
<askppplt:description>EGRESS_MIRRORING_METADATA</askppplt:description>
|
||||
<askppplt:value>33</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:description>
|
||||
<askppplt:value>34</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:description>
|
||||
<askppplt:value>35</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:description>
|
||||
<askppplt:value>36</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:description>
|
||||
<askppplt:value>37</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:description>
|
||||
<askppplt:value>38</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:name>
|
||||
<askppplt:description>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:description>
|
||||
<askppplt:value>39</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_BEST_EFFORT</askppplt:name>
|
||||
<askppplt:description>SRV6_BEST_EFFORT</askppplt:description>
|
||||
<askppplt:value>40</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_1_CONTAINER</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_1_CONTAINER</askppplt:description>
|
||||
<askppplt:value>41</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>42</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>43</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>44</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_END_NODE_COC32_GSID</askppplt:name>
|
||||
<askppplt:description>SRV6_END_NODE_COC32_GSID</askppplt:description>
|
||||
<askppplt:value>45</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IPV4_TTL_INCREMENT</askppplt:name>
|
||||
<askppplt:description>IPV4_TTL_INCREMENT</askppplt:description>
|
||||
<askppplt:value>46</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IPV6_HOP_LIMIT_INCREMENT</askppplt:name>
|
||||
<askppplt:description>IPV6_HOP_LIMIT_INCREMENT</askppplt:description>
|
||||
<askppplt:value>47</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:name>
|
||||
<askppplt:description>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:description>
|
||||
<askppplt:value>48</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFLOW_V5_IPV4</askppplt:name>
|
||||
<askppplt:description>SFLOW_V5_IPV4</askppplt:description>
|
||||
<askppplt:value>49</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFLOW_V5_IPV6</askppplt:name>
|
||||
<askppplt:description>SFLOW_V5_IPV6</askppplt:description>
|
||||
<askppplt:value>50</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SLS</askppplt:name>
|
||||
<askppplt:description>SLS</askppplt:description>
|
||||
<askppplt:value>51</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>trunk-member-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha image id</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>NATIVE</askppplt:name>
|
||||
<askppplt:description>NATIVE
|
||||
* the trunk members are filled
|
||||
* according to the order given by application.
|
||||
* Regular trunk may hold max of 8 members.
|
||||
* Cascade trunk may hold :
|
||||
* max of 64 members</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>FLEX</askppplt:name>
|
||||
<askppplt:description>FLEX
|
||||
* A mode to allows flexibility for
|
||||
* each Regular trunk to state it's max number of members (before starting to add members).
|
||||
* (this mode not effect 'cascade trunk' members)
|
||||
* Regular trunk may hold : max of 4K members. (each trunk set it's own limit)
|
||||
* Cascade trunk may hold : max of 64 members.</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>number-physical-port-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>ac5x 128, falcon 64,128,256, 512, 1024</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>no-ports</askppplt:name>
|
||||
<askppplt:description>no-ports</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>64-ports</askppplt:name>
|
||||
<askppplt:description>64-ports</askppplt:description>
|
||||
<askppplt:value>64</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>128-ports</askppplt:name>
|
||||
<askppplt:description>128-ports</askppplt:description>
|
||||
<askppplt:value>128</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>256-ports</askppplt:name>
|
||||
<askppplt:description>256-ports</askppplt:description>
|
||||
<askppplt:value>256</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>512-ports</askppplt:name>
|
||||
<askppplt:description>512-ports</askppplt:description>
|
||||
<askppplt:value>512</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>1024-ports</askppplt:name>
|
||||
<askppplt:description>1024-ports</askppplt:description>
|
||||
<askppplt:value>1024</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>serdes-ref-clock-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies serdes refernce clock.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_25_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_25_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_125_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_125_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_125_diff</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_125_DIFF</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_156_25_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_156_25_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_156_25_diff</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_156_25_DIFF</askppplt:description>
|
||||
<askppplt:value>4</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>internal_125</askppplt:name>
|
||||
<askppplt:description>INTERNAL_125</askppplt:description>
|
||||
<askppplt:value>5</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>cpu-port-id-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>CPU port id</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>7</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>rx-buffer-size-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Rx Buffer size</askppplt:description>
|
||||
<askppplt:min>64</askppplt:min>
|
||||
<askppplt:max>10240</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>tx-sdma-queue-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies TX queue mode.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Normal</askppplt:name>
|
||||
<askppplt:description>Application</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Packet_Generator</askppplt:name>
|
||||
<askppplt:description>Traffic generator</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>alloc-method-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies Buffers allocation method.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Dynamic_Alloc</askppplt:name>
|
||||
<askppplt:description>Dynamic</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Static_Alloc</askppplt:name>
|
||||
<askppplt:description>Static</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>au_mesage_lenght-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies Buffers allocation method.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>4_words</askppplt:name>
|
||||
<askppplt:description>4 Words</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>8_words</askppplt:name>
|
||||
<askppplt:description>8 Words</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>boolean-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Boolean 32 bits , due to bing endian</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>false</askppplt:name>
|
||||
<askppplt:description>False</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>true</askppplt:name>
|
||||
<askppplt:description>True</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
</askppplt:typedefs>
|
||||
<askppplt:PPInit>
|
||||
<askppplt:PP-name askppplt:type="std-string">AC5X-RD</askppplt:PP-name>
|
||||
<askppplt:Phase1>
|
||||
<askppplt:coreClock askppplt:type="uint32">4294967295</askppplt:coreClock>
|
||||
<askppplt:serdesRefClock askppplt:type="serdes-ref-clock-type">external_25_single_ended</askppplt:serdesRefClock>
|
||||
<askppplt:isrAddrCompletionRegionsBmp askppplt:type="uint32">2</askppplt:isrAddrCompletionRegionsBmp>
|
||||
<askppplt:appAddrCompletionRegionsBmp askppplt:type="uint32">60</askppplt:appAddrCompletionRegionsBmp>
|
||||
<askppplt:maxNumOfPhyPortsToUse askppplt:type="number-physical-port-type">128-ports</askppplt:maxNumOfPhyPortsToUse>
|
||||
<askppplt:tcamParityCalcEnable askppplt:type="boolean-type">false</askppplt:tcamParityCalcEnable>
|
||||
<askppplt:apEnable askppplt:type="boolean-type">false</askppplt:apEnable>
|
||||
<askppplt:numOfDataIntegrityElements askppplt:type="uint32">0</askppplt:numOfDataIntegrityElements>
|
||||
</askppplt:Phase1>
|
||||
<askppplt:Phase2>
|
||||
<askppplt:useMultiNetIfSdma askppplt:type="boolean-type">true</askppplt:useMultiNetIfSdma>
|
||||
<askppplt:auqCfg>
|
||||
<askppplt:auDescNum askppplt:type="uint32">4096</askppplt:auDescNum>
|
||||
</askppplt:auqCfg>
|
||||
<askppplt:fuqCfg>
|
||||
<askppplt:fuDescNum askppplt:type="uint32">2048</askppplt:fuDescNum>
|
||||
</askppplt:fuqCfg>
|
||||
<askppplt:multiNetIfCfg>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
</askppplt:multiNetIfCfg>
|
||||
<askppplt:internal>
|
||||
<askppplt:fuqUseSeparate askppplt:type="boolean-type">false</askppplt:fuqUseSeparate>
|
||||
<askppplt:useSecondaryAuq askppplt:type="boolean-type">false</askppplt:useSecondaryAuq>
|
||||
<askppplt:noTraffic2CPU askppplt:type="boolean-type">false</askppplt:noTraffic2CPU>
|
||||
<askppplt:netifSdmaPortGroupId askppplt:type="uint32">0</askppplt:netifSdmaPortGroupId>
|
||||
<askppplt:auMessageLength askppplt:type="au_mesage_lenght-type">8_words</askppplt:auMessageLength>
|
||||
<askppplt:useDoubleAuq askppplt:type="boolean-type">false</askppplt:useDoubleAuq>
|
||||
</askppplt:internal>
|
||||
</askppplt:Phase2>
|
||||
<askppplt:LogicalInit>
|
||||
<askppplt:routingMode askppplt:type="routing-mode-type">TCAM_ROUTER_BASED</askppplt:routingMode>
|
||||
<askppplt:maxNumOfPbrEntries askppplt:type="uint32">0</askppplt:maxNumOfPbrEntries>
|
||||
<askppplt:sharedTableMode askppplt:type="shared-table-mode-type">MID_L3_MID_L2_NO_EM</askppplt:sharedTableMode>
|
||||
<askppplt:ingressDropEnable askppplt:type="boolean-type">true</askppplt:ingressDropEnable>
|
||||
</askppplt:LogicalInit>
|
||||
<askppplt:LibInit>
|
||||
<askppplt:initBridge askppplt:type="boolean-type">true</askppplt:initBridge>
|
||||
<askppplt:initMirror askppplt:type="boolean-type">true</askppplt:initMirror>
|
||||
<askppplt:initNetIf askppplt:type="boolean-type">true</askppplt:initNetIf>
|
||||
<askppplt:initPhy askppplt:type="boolean-type">true</askppplt:initPhy>
|
||||
<askppplt:initPort askppplt:type="boolean-type">true</askppplt:initPort>
|
||||
<askppplt:initTrunk askppplt:type="boolean-type">true</askppplt:initTrunk>
|
||||
<askppplt:Trunk-params>
|
||||
<askppplt:maxNumberOfTrunks askppplt:type="uint32">511</askppplt:maxNumberOfTrunks>
|
||||
<askppplt:trunkMembersMode askppplt:type="trunk-member-mode-type">FLEX</askppplt:trunkMembersMode>
|
||||
</askppplt:Trunk-params>
|
||||
<askppplt:initPcl askppplt:type="boolean-type">true</askppplt:initPcl>
|
||||
<askppplt:initTcam askppplt:type="boolean-type">true</askppplt:initTcam>
|
||||
<askppplt:initPolicer askppplt:type="boolean-type">true</askppplt:initPolicer>
|
||||
<askppplt:initPha askppplt:type="boolean-type">true</askppplt:initPha>
|
||||
<askppplt:Pha-params>
|
||||
<askppplt:packetOrderChangeEnable askppplt:type="boolean-type">false</askppplt:packetOrderChangeEnable>
|
||||
<askppplt:phaFwImageId askppplt:type="pha-firmware-image-id-type">01</askppplt:phaFwImageId>
|
||||
<askppplt:phaFwImageIdVersion askppplt:type="uint32">0</askppplt:phaFwImageIdVersion>
|
||||
</askppplt:Pha-params>
|
||||
</askppplt:LibInit>
|
||||
</askppplt:PPInit>
|
||||
</askppplt:ASK-PP>
|
||||
</data>
|
1
device/supermicro/arm64-supermicro_sse_g3748-r0/SAI-AC5X-G3748.md5
Executable file
1
device/supermicro/arm64-supermicro_sse_g3748-r0/SAI-AC5X-G3748.md5
Executable file
@ -0,0 +1 @@
|
||||
32fa759aabe89e7d76a2b8f35a9babc0
|
346
device/supermicro/arm64-supermicro_sse_g3748-r0/SAI-AC5X-G3748.xml
Executable file
346
device/supermicro/arm64-supermicro_sse_g3748-r0/SAI-AC5X-G3748.xml
Executable file
@ -0,0 +1,346 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="2023-01-23-1.03" profile="SAI" dsig="md5">
|
||||
<SAIplt:SAI xmlns:SAIplt="urn:marvell:SAI:yang">
|
||||
<SAIplt:typedefs>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>device-id-type</SAIplt:name>
|
||||
<SAIplt:type>uint32</SAIplt:type>
|
||||
<SAIplt:description>Device ID 0..1023</SAIplt:description>
|
||||
<SAIplt:min>0</SAIplt:min>
|
||||
<SAIplt:max>1023</SAIplt:max>
|
||||
</SAIplt:typedef>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>port-id-type</SAIplt:name>
|
||||
<SAIplt:type>uint32</SAIplt:type>
|
||||
<SAIplt:description>Interface number</SAIplt:description>
|
||||
<SAIplt:min>0</SAIplt:min>
|
||||
<SAIplt:max>1023</SAIplt:max>
|
||||
</SAIplt:typedef>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>logDest-type</SAIplt:name>
|
||||
<SAIplt:type>enumeration</SAIplt:type>
|
||||
<SAIplt:description>Logging Feature Options</SAIplt:description>
|
||||
<SAIplt:enum>
|
||||
<SAIplt:name>SAI_LOG_SYSLOG</SAIplt:name>
|
||||
<SAIplt:description>SYSLOG {Syslog service should be running to use this option}</SAIplt:description>
|
||||
<SAIplt:value>0</SAIplt:value>
|
||||
</SAIplt:enum>
|
||||
<SAIplt:enum>
|
||||
<SAIplt:name>SAI_LOG_CONSOLE</SAIplt:name>
|
||||
<SAIplt:description>CONSOLE</SAIplt:description>
|
||||
<SAIplt:value>1</SAIplt:value>
|
||||
</SAIplt:enum>
|
||||
<SAIplt:enum>
|
||||
<SAIplt:name>SAI_LOG_FILE</SAIplt:name>
|
||||
<SAIplt:description>FILE {Warning !!! Use with caution. Can cause disk full issues}</SAIplt:description>
|
||||
<SAIplt:value>2</SAIplt:value>
|
||||
</SAIplt:enum>
|
||||
</SAIplt:typedef>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>log-dest-file-path-type</SAIplt:name>
|
||||
<SAIplt:type>string</SAIplt:type>
|
||||
<SAIplt:description>A string with path to file for logging feature</SAIplt:description>
|
||||
<SAIplt:min>2</SAIplt:min>
|
||||
<SAIplt:max>30</SAIplt:max>
|
||||
</SAIplt:typedef>
|
||||
</SAIplt:typedefs>
|
||||
<SAIplt:ASK-BOARD-Profile-Name SAIplt:type="string">ASK-Board-ac5x-G3748.xml</SAIplt:ASK-BOARD-Profile-Name>
|
||||
<SAIplt:Features>
|
||||
<SAIplt:RoCE SAIplt:type="boolean">false</SAIplt:RoCE>
|
||||
</SAIplt:Features>
|
||||
<SAIplt:Ports>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">0</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">0</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">1</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">1</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">2</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">2</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">3</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">3</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">4</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">4</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">5</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">5</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">6</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">6</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">7</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">7</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">8</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">8</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">9</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">9</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">10</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">10</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">11</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">11</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">12</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">12</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">13</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">13</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">14</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">14</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">15</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">15</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">16</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">16</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">17</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">17</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">18</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">18</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">19</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">19</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">20</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">20</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">21</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">21</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">22</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">22</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">23</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">23</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">24</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">24</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">25</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">25</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">26</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">26</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">27</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">27</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">28</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">28</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">29</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">29</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">30</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">30</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">31</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">31</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">32</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">32</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">33</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">33</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">34</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">34</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">35</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">35</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">36</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">36</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">37</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">37</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">38</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">38</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">39</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">39</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">40</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">40</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">41</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">41</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">42</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">42</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">43</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">43</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">44</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">44</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">45</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">45</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">46</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">46</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">47</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">47</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">48</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">48</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">49</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">49</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">50</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">50</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">51</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">51</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">52</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">52</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">53</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">53</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
</SAIplt:Ports>
|
||||
<SAIplt:Scaling>
|
||||
<SAIplt:max_lag_members SAIplt:type="uint32">8</SAIplt:max_lag_members>
|
||||
<SAIplt:max_route_ipv4 SAIplt:type="uint32">0</SAIplt:max_route_ipv4>
|
||||
<SAIplt:max_route_ipv6 SAIplt:type="uint32">0</SAIplt:max_route_ipv6>
|
||||
<SAIplt:max_Nh_Ecmp_Mbr_Per_Grp SAIplt:type="uint32">64</SAIplt:max_Nh_Ecmp_Mbr_Per_Grp>
|
||||
<SAIplt:max_ipv4_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv4_tunnel>
|
||||
<SAIplt:max_ipv6_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv6_tunnel>
|
||||
<SAIplt:max_tti SAIplt:type="uint32">1024</SAIplt:max_tti>
|
||||
<SAIplt:wred_size SAIplt:type="uint32">0</SAIplt:wred_size>
|
||||
<SAIplt:max_nat SAIplt:type="uint32">0</SAIplt:max_nat>
|
||||
</SAIplt:Scaling>
|
||||
<SAIplt:Counters>
|
||||
<SAIplt:cnc-base-list>
|
||||
<SAIplt:counter-base SAIplt:type="uint32">0</SAIplt:counter-base>
|
||||
</SAIplt:cnc-base-list>
|
||||
<SAIplt:cnc-base-list>
|
||||
<SAIplt:counter-base SAIplt:type="uint32">2048</SAIplt:counter-base>
|
||||
</SAIplt:cnc-base-list>
|
||||
</SAIplt:Counters>
|
||||
<SAIplt:Logging>
|
||||
<SAIplt:log_dest SAIplt:type="logDest-type">SAI_LOG_SYSLOG</SAIplt:log_dest>
|
||||
</SAIplt:Logging>
|
||||
</SAIplt:SAI>
|
||||
</data>
|
@ -0,0 +1 @@
|
||||
supermicro_sse_g3748 t1
|
@ -0,0 +1 @@
|
||||
[]
|
116
device/supermicro/arm64-supermicro_sse_g3748-r0/platform.json
Normal file
116
device/supermicro/arm64-supermicro_sse_g3748-r0/platform.json
Normal file
@ -0,0 +1,116 @@
|
||||
{
|
||||
"chassis": {
|
||||
"name": "SSE-G3748",
|
||||
"components": [
|
||||
{
|
||||
"name": "U-Boot"
|
||||
},
|
||||
{
|
||||
"name": "ONIE-VERSION"
|
||||
},
|
||||
{
|
||||
"name": "System-CPLD"
|
||||
}
|
||||
],
|
||||
"fans": [
|
||||
{
|
||||
"name": "Fan1",
|
||||
"status_led": {
|
||||
"controllable": true,
|
||||
"colors": ["red", "green"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "Fan2",
|
||||
"status_led": {
|
||||
"controllable": true,
|
||||
"colors": ["red", "green"]
|
||||
}
|
||||
}
|
||||
],
|
||||
"fan_drawers": [
|
||||
{
|
||||
"name": "drawer1",
|
||||
"status_led": {
|
||||
"controllable": true,
|
||||
"colors": ["red", "green"]
|
||||
},
|
||||
"max_consumed_power": false,
|
||||
"fans": [
|
||||
{
|
||||
"name": "Fan1"
|
||||
},
|
||||
{
|
||||
"name": "Fan2"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"psus": [
|
||||
{
|
||||
"name": "PSU1",
|
||||
"status_led": {
|
||||
"controllable": false
|
||||
},
|
||||
"current": false,
|
||||
"power": false,
|
||||
"max_power": false,
|
||||
"voltage_high_threshold": false,
|
||||
"voltage_low_threshold": false,
|
||||
"temperature": false
|
||||
},
|
||||
{
|
||||
"name": "PSU2",
|
||||
"status_led": {
|
||||
"controllable": false
|
||||
},
|
||||
"current": false,
|
||||
"power": false,
|
||||
"max_power": false,
|
||||
"voltage_high_threshold": false,
|
||||
"voltage_low_threshold": false,
|
||||
"temperature": false
|
||||
}
|
||||
],
|
||||
"thermals": [
|
||||
{
|
||||
"name": "FRONT",
|
||||
"controllable": false,
|
||||
"low-threshold": false,
|
||||
"high-threshold": false,
|
||||
"low-crit-threshold": false,
|
||||
"high-crit-threshold": false
|
||||
},
|
||||
{
|
||||
"name": "REAR",
|
||||
"controllable": false,
|
||||
"low-threshold": false,
|
||||
"high-threshold": false,
|
||||
"low-crit-threshold": false,
|
||||
"high-crit-threshold": false
|
||||
}
|
||||
],
|
||||
"sfps": [
|
||||
{
|
||||
"name": "Ethernet48"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet49"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet50"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet51"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet52"
|
||||
},
|
||||
{
|
||||
"name": "Ethernet53"
|
||||
}
|
||||
]
|
||||
},
|
||||
"interfaces": {}
|
||||
}
|
||||
|
@ -0,0 +1 @@
|
||||
marvell-arm64
|
@ -0,0 +1,21 @@
|
||||
{
|
||||
"chassis": {
|
||||
"SSE-G3748": {
|
||||
"component": {
|
||||
"U-Boot": { },
|
||||
"ONIE-VERSION": { },
|
||||
"System-CPLD": { }
|
||||
}
|
||||
}
|
||||
},
|
||||
"chassis": {
|
||||
"SSE-G3748R": {
|
||||
"component": {
|
||||
"U-Boot": { },
|
||||
"ONIE-VERSION": { },
|
||||
"System-CPLD": { }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
11
device/supermicro/arm64-supermicro_sse_g3748-r0/platform_reboot
Executable file
11
device/supermicro/arm64-supermicro_sse_g3748-r0/platform_reboot
Executable file
@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
function SafePwrCycle() {
|
||||
sync ; sync
|
||||
umount -fa > /dev/null 2&>1
|
||||
|
||||
# Write CPLD register to initiate cold reboot
|
||||
sudo i2cset -f -y 0 0x66 0x02 0x80
|
||||
}
|
||||
|
||||
SafePwrCycle
|
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
try:
|
||||
from sonic_eeprom import eeprom_tlvinfo
|
||||
except ImportError as e:
|
||||
raise ImportError (str(e) + "- required module not found")
|
||||
|
||||
|
||||
class board(eeprom_tlvinfo.TlvInfoDecoder):
|
||||
|
||||
def __init__(self, name, path, cpld_root, ro):
|
||||
#self.eeprom_path = "/etc/sonic/eeprom"
|
||||
self.eeprom_path = "/sys/class/i2c-adapter/i2c-0/0-0054/eeprom"
|
||||
if not os.path.exists(self.eeprom_path):
|
||||
os.system("echo 24c02 0x54 > /sys/class/i2c-adapter/i2c-0/new_device")
|
||||
super(board, self).__init__(self.eeprom_path, 0, '', True)
|
@ -0,0 +1,225 @@
|
||||
#
|
||||
# led_control.py
|
||||
#
|
||||
# Platform-specific LED control functionality for SONiC
|
||||
#
|
||||
|
||||
try:
|
||||
from sonic_led.led_control_base import LedControlBase
|
||||
import os
|
||||
import time
|
||||
import syslog
|
||||
import sonic_platform.platform
|
||||
import sonic_platform.chassis
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + " - required module not found")
|
||||
|
||||
smbus_present = 1
|
||||
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
|
||||
def DBG_PRINT(str):
|
||||
syslog.openlog("sse-g3748-led")
|
||||
syslog.syslog(syslog.LOG_INFO, str)
|
||||
syslog.closelog()
|
||||
|
||||
|
||||
class LedControl(LedControlBase):
|
||||
"""Platform specific LED control class"""
|
||||
SONIC_PORT_NAME_PREFIX = "Ethernet"
|
||||
|
||||
# Constructor
|
||||
def __init__(self):
|
||||
self.chassis = sonic_platform.platform.Platform().get_chassis()
|
||||
self._initDefaultConfig()
|
||||
|
||||
def _initDefaultConfig(self):
|
||||
# The fan tray leds and system led managed by new chassis class API
|
||||
# leaving only a couple other front panel leds to be done old style
|
||||
DBG_PRINT("starting system leds")
|
||||
self._initSystemLed()
|
||||
DBG_PRINT(" led done")
|
||||
|
||||
def _get_i2c_register(self, reg_file):
|
||||
# On successful read, returns the value read from given
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(reg_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def _set_i2c_register(self, reg_file, value):
|
||||
# On successful write, the value read will be written on
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(reg_file, 'w') as fd:
|
||||
rv = fd.write(str(value))
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
# Ensure that the write operation has succeeded
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
time.sleep(3)
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
rv = 'ERR'
|
||||
|
||||
return rv
|
||||
|
||||
def _initSystemLed(self):
|
||||
# Front Panel System LEDs setting
|
||||
oldfan = 0xf
|
||||
oldpsu0 = 0xf
|
||||
oldpsu1 = 0xf
|
||||
G3748CPLD_I2C_DIR = "/sys/bus/i2c/devices/0-0066/"
|
||||
self.fan_sys_frontled_reg = G3748CPLD_I2C_DIR+"fan_sys_frontled".format()
|
||||
self.psu_frontled_reg = G3748CPLD_I2C_DIR+"psu_frontled".format()
|
||||
|
||||
|
||||
# Write sys led
|
||||
if smbus_present == 0:
|
||||
DBG_PRINT(" PMON LED SET ERROR -> smbus present = 0 ")
|
||||
else:
|
||||
# System LED is controlled by CPLD (i2c 0x66) register 0x11 bits:3-0
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x11
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
## write System LED Green
|
||||
#register = register & 0xFC | 0x01
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
#DBG_PRINT(" System LED set O.K. ")
|
||||
|
||||
register = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
# write System LED solid green
|
||||
register = int(register) & 0xFC | 0x01
|
||||
self._set_i2c_register(self.fan_sys_frontled_reg, register)
|
||||
|
||||
while True:
|
||||
# Front Panel FAN Panel LED setting in CPLD (i2c 0x66) register 0x11 bits:7-4
|
||||
if (self.chassis.get_fan(0).get_status() == self.chassis.get_fan(1).get_status() == True):
|
||||
if oldfan != 0x1:
|
||||
# Set Front Panel FAN LED to green
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x11
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xCF | 0x20
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
register = int(register) & 0xCF | 0x20
|
||||
self._set_i2c_register(self.fan_sys_frontled_reg, register)
|
||||
oldfan = 0x1
|
||||
DBG_PRINT(" Front panel LED FAN set green")
|
||||
else:
|
||||
if oldfan != 0x0:
|
||||
# Set Front Panel FAN LED to red
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x11
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xCF | 0x10
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
register = int(register) & 0xCF | 0x10
|
||||
self._set_i2c_register(self.fan_sys_frontled_reg, register)
|
||||
oldfan = 0x0
|
||||
DBG_PRINT(" Front panel LED FAN set red")
|
||||
|
||||
# Front Panel PSU Panel LED setting in CPLD (i2c 0x66) register 0x12
|
||||
# PSU0 -- bits: 1..0 PSU1 -- bits: 3..2
|
||||
if (self.chassis.get_psu(0).get_status() == True):
|
||||
if oldpsu0 != 0x1:
|
||||
# Set PSU0 LED to green
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x12
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xFC | 0x02
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.psu_frontled_reg)
|
||||
register = int(register) & 0xFC | 0x02
|
||||
self._set_i2c_register(self.psu_frontled_reg, register)
|
||||
oldpsu0 = 0x1
|
||||
DBG_PRINT(" Front panel LED PSU0 set green")
|
||||
else:
|
||||
if oldpsu0 != 0x0:
|
||||
# Set PSU0 LED to red
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x12
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xFC | 0x01
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.psu_frontled_reg)
|
||||
register = int(register) & 0xFC | 0x01
|
||||
self._set_i2c_register(self.psu_frontled_reg, register)
|
||||
oldpsu0 = 0x0
|
||||
DBG_PRINT(" Front panel LED PSU0 set red")
|
||||
|
||||
if (self.chassis.get_psu(1).get_status() == True):
|
||||
if oldpsu1 != 0x1:
|
||||
# Set PSU1 LED to green
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x12
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xF3 | 0x08
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.psu_frontled_reg)
|
||||
register = int(register) & 0xF3 | 0x08
|
||||
self._set_i2c_register(self.psu_frontled_reg, register)
|
||||
oldpsu1 = 0x1
|
||||
DBG_PRINT(" Front panel LED PSU1 set green")
|
||||
else:
|
||||
if oldpsu1 != 0x0:
|
||||
# Set PSU1 LED to red
|
||||
#bus = smbus.SMBus(0)
|
||||
#DEVICE_ADDRESS = 0x66
|
||||
#DEVICEREG = 0x12
|
||||
#register = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
#register = register & 0xF3 | 0x04
|
||||
#bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, register)
|
||||
register = self._get_i2c_register(self.psu_frontled_reg)
|
||||
register = int(register) & 0xF3 | 0x04
|
||||
self._set_i2c_register(self.psu_frontled_reg, register)
|
||||
oldpsu1 = 0x0
|
||||
DBG_PRINT(" Front panel LED PSU1 set red")
|
||||
|
||||
time.sleep(6)
|
||||
|
||||
# Helper method to map SONiC port name to index
|
||||
def _port_name_to_index(self, port_name):
|
||||
# Strip "Ethernet" off port name
|
||||
if not port_name.startswith(self.SONIC_PORT_NAME_PREFIX):
|
||||
return -1
|
||||
|
||||
port_idx = int(port_name[len(self.SONIC_PORT_NAME_PREFIX):])
|
||||
return port_idx
|
||||
|
||||
def _port_state_to_mode(self, port_idx, state):
|
||||
DBG_PRINT("_port_state_to_mode")
|
||||
|
||||
def _port_led_mode_update(self, port_idx, ledMode):
|
||||
DBG_PRINT("_port_led_mode_update")
|
||||
|
||||
# called when port states change- implementation of port_link_state_change() method if needed
|
||||
def port_link_state_change(self, portname, state):
|
||||
# DBG_PRINT("port_link_state_change ")
|
||||
return
|
32
device/supermicro/arm64-supermicro_sse_g3748-r0/plugins/psuutil.py
Executable file
32
device/supermicro/arm64-supermicro_sse_g3748-r0/plugins/psuutil.py
Executable file
@ -0,0 +1,32 @@
|
||||
try:
|
||||
import sonic_platform.platform
|
||||
import sonic_platform.chassis
|
||||
from sonic_psu.psu_base import PsuBase
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
class PsuUtil(PsuBase):
|
||||
"""Platform-specific PSUutil class"""
|
||||
|
||||
def __init__(self):
|
||||
PsuBase.__init__(self)
|
||||
self.chassis = sonic_platform.platform.Platform().get_chassis()
|
||||
|
||||
def get_num_psus(self):
|
||||
MAX_PSUS = 2
|
||||
return MAX_PSUS
|
||||
|
||||
def get_psu_status(self, index):
|
||||
# print " psuUtil redirect to PMON 2.0 "
|
||||
if self.chassis is not None:
|
||||
return self.chassis.get_psu(index-1).get_status()
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_psu_presence(self, index):
|
||||
# print " psuUtil redirect to PMON 2.0 "
|
||||
if self.chassis is not None:
|
||||
return self.chassis.get_psu(index-1).get_presence()
|
||||
else:
|
||||
return False
|
118
device/supermicro/arm64-supermicro_sse_g3748-r0/plugins/sfputil.py
Executable file
118
device/supermicro/arm64-supermicro_sse_g3748-r0/plugins/sfputil.py
Executable file
@ -0,0 +1,118 @@
|
||||
try:
|
||||
import glob
|
||||
import sonic_platform.platform
|
||||
import sonic_platform.chassis
|
||||
from sonic_sfp.sfputilbase import SfpUtilBase
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
class SfpUtil(SfpUtilBase):
|
||||
"""Platform specific sfputil class"""
|
||||
|
||||
_port_start = 49
|
||||
_port_end = 54
|
||||
ports_in_block = 4
|
||||
|
||||
_port_to_eeprom_mapping = {}
|
||||
port_to_i2c_mapping = {
|
||||
49: 2,
|
||||
50: 3,
|
||||
51: 4,
|
||||
52: 5,
|
||||
53: 6,
|
||||
54: 7
|
||||
}
|
||||
_changed_ports = [0, 0, 0, 0]
|
||||
|
||||
@property
|
||||
def port_start(self):
|
||||
return self._port_start
|
||||
|
||||
@property
|
||||
def port_end(self):
|
||||
return self._port_end
|
||||
|
||||
@property
|
||||
def qsfp_ports(self):
|
||||
return list(range(0, 0))
|
||||
|
||||
@property
|
||||
def port_to_eeprom_mapping(self):
|
||||
return self._port_to_eeprom_mapping
|
||||
|
||||
def __init__(self):
|
||||
# Mux Ordering
|
||||
mux_dev = sorted(glob.glob("/sys/class/i2c-adapter/i2c-1/i2c-[2-7]"))
|
||||
eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
|
||||
y = 0
|
||||
self.presence = {}
|
||||
for x in range(self.port_start, self.port_end + 1):
|
||||
mux_dev_num = mux_dev[y]
|
||||
self.port_to_i2c_mapping[x] = mux_dev_num[-1]
|
||||
y = y + 1
|
||||
port_eeprom_path = eeprom_path.format(self.port_to_i2c_mapping[x])
|
||||
self.port_to_eeprom_mapping[x] = port_eeprom_path
|
||||
self._port_to_eeprom_mapping[x] = port_eeprom_path
|
||||
self.presence[x] = False;
|
||||
|
||||
SfpUtilBase.__init__(self)
|
||||
|
||||
self.chassis = sonic_platform.platform.Platform().get_chassis()
|
||||
|
||||
def reset(self, port_num):
|
||||
# print " SfpUtil(SfpUtilBase) re-directed to chassis PMON 2.0 "
|
||||
if self.chassis is not None:
|
||||
return self.chassis.get_sfp(port_num).reset()
|
||||
else:
|
||||
return False
|
||||
|
||||
def set_low_power_mode(self, port_nuM, lpmode):
|
||||
# print " SfpUtil(SfpUtilBase) targeted for deprecation "
|
||||
return False
|
||||
|
||||
def get_low_power_mode(self, port_num):
|
||||
# print " SfpUtil(SfpUtilBase) targeted for deprecation "
|
||||
return False
|
||||
|
||||
def get_presence(self, port_num):
|
||||
# print " SfpUtil(SfpUtilBase) re-directed to chassis PMON 2.0 "
|
||||
if self.chassis is not None:
|
||||
return self.chassis.get_sfp(port_num).get_presence()
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_transceiver_change_event(self, timeout):
|
||||
# print " SfpUtil(SfpUtilBase) targeted for deprecation "
|
||||
#
|
||||
# raise NotImplementedError
|
||||
# eyen remove above line and add below. Refer to centec/arm64-centec_e530_48t4x_p-r0/plugins/sfputil.py
|
||||
|
||||
now = time.time()
|
||||
port_dict = {}
|
||||
|
||||
if timeout < 1000:
|
||||
timeout = 1000
|
||||
timeout = (timeout) / float(1000) # Convert to secs
|
||||
|
||||
if now < (self.data['last'] + timeout) and self.data['valid']:
|
||||
return True, {}
|
||||
|
||||
for x in range(self.port_start, self.port_end + 1):
|
||||
presence = self.get_presence(x)
|
||||
if presence != self.presence[x]:
|
||||
self.presence[x] = presence
|
||||
# index in port_config.ini
|
||||
if presence:
|
||||
port_dict[x] = SFP_STATUS_INSERTED
|
||||
else:
|
||||
port_dict[x] = SFP_STATUS_REMOVED
|
||||
|
||||
if bool(port_dict):
|
||||
self.data['last'] = now
|
||||
self.data['valid'] = 1
|
||||
return True, port_dict
|
||||
else:
|
||||
time.sleep(0.5)
|
||||
return True, {}
|
||||
|
@ -0,0 +1,4 @@
|
||||
{
|
||||
"skip_ledd": false
|
||||
}
|
||||
|
20
device/supermicro/arm64-supermicro_sse_g3748-r0/sensors.conf
Normal file
20
device/supermicro/arm64-supermicro_sse_g3748-r0/sensors.conf
Normal file
@ -0,0 +1,20 @@
|
||||
chip "lm75-i2c-*-48"
|
||||
label temp1 "Board temp sensor 1"
|
||||
set temp1_max 65
|
||||
set temp1_max_hyst 50
|
||||
|
||||
chip "lm75-i2c-*-49"
|
||||
label temp1 "Board temp sensor 2"
|
||||
set temp1_max 65
|
||||
set temp1_max_hyst 50
|
||||
|
||||
chip "7f022004mdiomii00-mdio-*"
|
||||
label temp1 "Management ethernet port PHY temp"
|
||||
set temp1_crit 50
|
||||
|
||||
chip "g3748cpld-i2c-*-66"
|
||||
label in1 "Power Supply Unit PSU1"
|
||||
label in2 "Power Supply Unit PSU2"
|
||||
label fan1 "Fan Module FAN1"
|
||||
label fan2 "Fan Module FAN2"
|
||||
|
6
device/supermicro/arm64-supermicro_sse_g3748-r0/soft-reboot_plugin
Executable file
6
device/supermicro/arm64-supermicro_sse_g3748-r0/soft-reboot_plugin
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
|
||||
#echo "Issuing OS-level reboot .."
|
||||
exec /sbin/reboot -f
|
||||
|
||||
|
@ -0,0 +1 @@
|
||||
a9434f801bdf89ef55e49be4ae288046
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
||||
8e51017346a381613f8660e192883697
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
||||
330bea15c5dc5dcc0bdabd95940b6bab
|
@ -0,0 +1,891 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="2021-11-29-1.05" profile="Askpp" dsig="md5">
|
||||
<askppplt:ASK-PP xmlns:askppplt="urn:marvell:askpp:yang">
|
||||
<askppplt:typedefs>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>std-string</askppplt:name>
|
||||
<askppplt:type>string</askppplt:type>
|
||||
<askppplt:description>standard string.</askppplt:description>
|
||||
<askppplt:min>1</askppplt:min>
|
||||
<askppplt:max>100</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>queue-id-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Queue id</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>7</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>precent-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Precent</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>100</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>phaThreadId-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Thread id</askppplt:description>
|
||||
<askppplt:min>1</askppplt:min>
|
||||
<askppplt:max>255</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>routing-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies routing mode.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>POLICY_BASED_ROUTING_ONLY</askppplt:name>
|
||||
<askppplt:description>PBR only</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>TCAM_ROUTER_BASED</askppplt:name>
|
||||
<askppplt:description>Router engine or PBR</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>shared-table-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies table sharing modes.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MAX_L3_MIN_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>MAX_L3_MIN_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MIN_L3_MAX_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>MIN_L3_MAX_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MID_L2_MIN_EM</askppplt:name>
|
||||
<askppplt:description>MID_L3_MID_L2_MIN_EM</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MIN_L2_MAX_EM</askppplt:name>
|
||||
<askppplt:description>MID_L3_MIN_L2_MAX_EM</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_LOW_L3_MID_LOW_L2_MAX_EM</askppplt:name>
|
||||
<askppplt:description>MID_LOW_L3_MID_LOW_L2_MAX_EM</askppplt:description>
|
||||
<askppplt:value>4</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MID_L2_NO_EM</askppplt:name>
|
||||
<askppplt:description>MID_L3_MID_L2_NO_EM</askppplt:description>
|
||||
<askppplt:value>5</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_LOW_L3_MID_L2_MID_EM</askppplt:name>
|
||||
<askppplt:description>MID_LOW_L3_MID_L2_MID_EM</askppplt:description>
|
||||
<askppplt:value>6</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MID_L3_MID_LOW_L2_MID_EM_MAX_ARP</askppplt:name>
|
||||
<askppplt:description>MID_L3_MID_LOW_L2_MID_EM_MAX_ARP</askppplt:description>
|
||||
<askppplt:value>7</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>pha-firmware-image-id-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha image id</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>DEFAULT</askppplt:name>
|
||||
<askppplt:description>Default PHA firmware image ID</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>01</askppplt:name>
|
||||
<askppplt:description>01 firmware image ID</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>02</askppplt:name>
|
||||
<askppplt:description>02 PHA firmware image ID</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>pha-firmware-thread-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha thread type</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_INGRESS_SWITCH_IPV4</askppplt:name>
|
||||
<askppplt:description>IOAM_INGRESS_SWITCH_IPV4</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_INGRESS_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_INGRESS_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_TRANSIT_SWITCH_IPV4</askppplt:name>
|
||||
<askppplt:description>IOAM_TRANSIT_SWITCH_IPV4</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_TRANSIT_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_TRANSIT_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>4</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>INT_IOAM_MIRRORING</askppplt:name>
|
||||
<askppplt:description>INT_IOAM_MIRRORING</askppplt:description>
|
||||
<askppplt:value>5</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>INT_IOAM_EGRESS_SWITCH</askppplt:name>
|
||||
<askppplt:description>INT_IOAM_EGRESS_SWITCH</askppplt:description>
|
||||
<askppplt:value>6</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_NO_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_NO_EL</askppplt:description>
|
||||
<askppplt:value>7</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_ONE_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_ONE_EL</askppplt:description>
|
||||
<askppplt:value>8</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_TWO_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_TWO_EL</askppplt:description>
|
||||
<askppplt:value>9</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>MPLS_SR_THREE_EL</askppplt:name>
|
||||
<askppplt:description>MPLS_SR_THREE_EL</askppplt:description>
|
||||
<askppplt:value>10</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>UNIFIED_SR</askppplt:name>
|
||||
<askppplt:description>UNIFIED_SR</askppplt:description>
|
||||
<askppplt:value>11</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:name>
|
||||
<askppplt:description>CLASSIFIER_NSH_OVER_ETHERNET</askppplt:description>
|
||||
<askppplt:value>12</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:name>
|
||||
<askppplt:description>CLASSIFIER_NSH_OVER_VXLAN_GPE</askppplt:description>
|
||||
<askppplt:value>13</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:name>
|
||||
<askppplt:description>SFF_NSH_VXLAN_GPE_TO_ETHERNET</askppplt:description>
|
||||
<askppplt:value>14</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:name>
|
||||
<askppplt:description>SFF_NSH_ETHERNET_TO_VXLAN_GPE</askppplt:description>
|
||||
<askppplt:value>15</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IOAM_EGRESS_SWITCH_IPV6</askppplt:name>
|
||||
<askppplt:description>IOAM_EGRESS_SWITCH_IPV6</askppplt:description>
|
||||
<askppplt:value>16</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_END_NODE</askppplt:name>
|
||||
<askppplt:description>SRV6_END_NODE</askppplt:description>
|
||||
<askppplt:value>17</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_PENULTIMATE_END_NODE</askppplt:name>
|
||||
<askppplt:description>SRV6_PENULTIMATE_END_NODE</askppplt:description>
|
||||
<askppplt:value>18</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_1_SEGMENT</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_1_SEGMENT</askppplt:description>
|
||||
<askppplt:value>19</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>20</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>21</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_SEGMENTS</askppplt:description>
|
||||
<askppplt:value>22</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_ADD_MSB</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_ADD_MSB</askppplt:description>
|
||||
<askppplt:value>23</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_FIX</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_FIX</askppplt:description>
|
||||
<askppplt:value>24</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_NETWORK_REMOVE</askppplt:name>
|
||||
<askppplt:description>SGT_NETWORK_REMOVE</askppplt:description>
|
||||
<askppplt:value>25</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_EDSA_FIX</askppplt:name>
|
||||
<askppplt:description>SGT_EDSA_FIX</askppplt:description>
|
||||
<askppplt:value>26</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_EDSA_REMOVE</askppplt:name>
|
||||
<askppplt:description>SGT_EDSA_REMOVE</askppplt:description>
|
||||
<askppplt:value>27</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_FIX_IPV4</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_FIX_IPV4</askppplt:description>
|
||||
<askppplt:value>28</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_FIX_IPV6</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_FIX_IPV6</askppplt:description>
|
||||
<askppplt:value>29</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_REMOVE_IPV4</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_REMOVE_IPV4</askppplt:description>
|
||||
<askppplt:value>30</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SGT_GBP_REMOVE_IPV6</askppplt:name>
|
||||
<askppplt:description>SGT_GBP_REMOVE_IPV6</askppplt:description>
|
||||
<askppplt:value>31</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>PTP_PHY_1_STEP</askppplt:name>
|
||||
<askppplt:description>PTP_PHY_1_STEP</askppplt:description>
|
||||
<askppplt:value>32</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>EGRESS_MIRRORING_METADATA</askppplt:name>
|
||||
<askppplt:description>EGRESS_MIRRORING_METADATA</askppplt:description>
|
||||
<askppplt:value>33</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV4</askppplt:description>
|
||||
<askppplt:value>34</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_LC_IPV6</askppplt:description>
|
||||
<askppplt:value>35</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV4</askppplt:description>
|
||||
<askppplt:value>36</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_TRG_DEV_DIRECT_IPV6</askppplt:description>
|
||||
<askppplt:value>37</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:name>
|
||||
<askppplt:description>CC_ERSPAN_TYPE_II_SRC_DEV</askppplt:description>
|
||||
<askppplt:value>38</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:name>
|
||||
<askppplt:description>VXLAN_GBP_SOURCE_GROUP_POLICY_ID</askppplt:description>
|
||||
<askppplt:value>39</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_BEST_EFFORT</askppplt:name>
|
||||
<askppplt:description>SRV6_BEST_EFFORT</askppplt:description>
|
||||
<askppplt:value>40</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_1_CONTAINER</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_1_CONTAINER</askppplt:description>
|
||||
<askppplt:value>41</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_FIRST_PASS_2_3_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>42</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_2_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>43</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:name>
|
||||
<askppplt:description>SRV6_SRC_NODE_SECOND_PASS_3_CONTAINERS</askppplt:description>
|
||||
<askppplt:value>44</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SRV6_END_NODE_COC32_GSID</askppplt:name>
|
||||
<askppplt:description>SRV6_END_NODE_COC32_GSID</askppplt:description>
|
||||
<askppplt:value>45</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IPV4_TTL_INCREMENT</askppplt:name>
|
||||
<askppplt:description>IPV4_TTL_INCREMENT</askppplt:description>
|
||||
<askppplt:value>46</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>IPV6_HOP_LIMIT_INCREMENT</askppplt:name>
|
||||
<askppplt:description>IPV6_HOP_LIMIT_INCREMENT</askppplt:description>
|
||||
<askppplt:value>47</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:name>
|
||||
<askppplt:description>CLEAR_OUTGOING_MTAG_COMMAND</askppplt:description>
|
||||
<askppplt:value>48</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFLOW_V5_IPV4</askppplt:name>
|
||||
<askppplt:description>SFLOW_V5_IPV4</askppplt:description>
|
||||
<askppplt:value>49</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SFLOW_V5_IPV6</askppplt:name>
|
||||
<askppplt:description>SFLOW_V5_IPV6</askppplt:description>
|
||||
<askppplt:value>50</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>SLS</askppplt:name>
|
||||
<askppplt:description>SLS</askppplt:description>
|
||||
<askppplt:value>51</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>trunk-member-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies supported Pha image id</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>NATIVE</askppplt:name>
|
||||
<askppplt:description>NATIVE
|
||||
* the trunk members are filled
|
||||
* according to the order given by application.
|
||||
* Regular trunk may hold max of 8 members.
|
||||
* Cascade trunk may hold :
|
||||
* max of 64 members</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>FLEX</askppplt:name>
|
||||
<askppplt:description>FLEX
|
||||
* A mode to allows flexibility for
|
||||
* each Regular trunk to state it's max number of members (before starting to add members).
|
||||
* (this mode not effect 'cascade trunk' members)
|
||||
* Regular trunk may hold : max of 4K members. (each trunk set it's own limit)
|
||||
* Cascade trunk may hold : max of 64 members.</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>number-physical-port-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>ac5x 128, falcon 64,128,256, 512, 1024</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>no-ports</askppplt:name>
|
||||
<askppplt:description>no-ports</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>64-ports</askppplt:name>
|
||||
<askppplt:description>64-ports</askppplt:description>
|
||||
<askppplt:value>64</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>128-ports</askppplt:name>
|
||||
<askppplt:description>128-ports</askppplt:description>
|
||||
<askppplt:value>128</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>256-ports</askppplt:name>
|
||||
<askppplt:description>256-ports</askppplt:description>
|
||||
<askppplt:value>256</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>512-ports</askppplt:name>
|
||||
<askppplt:description>512-ports</askppplt:description>
|
||||
<askppplt:value>512</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>1024-ports</askppplt:name>
|
||||
<askppplt:description>1024-ports</askppplt:description>
|
||||
<askppplt:value>1024</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>serdes-ref-clock-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies serdes refernce clock.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_25_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_25_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_125_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_125_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_125_diff</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_125_DIFF</askppplt:description>
|
||||
<askppplt:value>2</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_156_25_single_ended</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_156_25_SINGLE_ENDED</askppplt:description>
|
||||
<askppplt:value>3</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>external_156_25_diff</askppplt:name>
|
||||
<askppplt:description>EXTERNAL_156_25_DIFF</askppplt:description>
|
||||
<askppplt:value>4</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>internal_125</askppplt:name>
|
||||
<askppplt:description>INTERNAL_125</askppplt:description>
|
||||
<askppplt:value>5</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>cpu-port-id-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>CPU port id</askppplt:description>
|
||||
<askppplt:min>0</askppplt:min>
|
||||
<askppplt:max>7</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>rx-buffer-size-type</askppplt:name>
|
||||
<askppplt:type>uint32</askppplt:type>
|
||||
<askppplt:description>Rx Buffer size</askppplt:description>
|
||||
<askppplt:min>64</askppplt:min>
|
||||
<askppplt:max>10240</askppplt:max>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>tx-sdma-queue-mode-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies TX queue mode.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Normal</askppplt:name>
|
||||
<askppplt:description>Application</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Packet_Generator</askppplt:name>
|
||||
<askppplt:description>Traffic generator</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>alloc-method-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies Buffers allocation method.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Dynamic_Alloc</askppplt:name>
|
||||
<askppplt:description>Dynamic</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>Static_Alloc</askppplt:name>
|
||||
<askppplt:description>Static</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>au_mesage_lenght-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Specifies Buffers allocation method.</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>4_words</askppplt:name>
|
||||
<askppplt:description>4 Words</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>8_words</askppplt:name>
|
||||
<askppplt:description>8 Words</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
<askppplt:typedef>
|
||||
<askppplt:name>boolean-type</askppplt:name>
|
||||
<askppplt:type>enumeration</askppplt:type>
|
||||
<askppplt:description>Boolean 32 bits , due to bing endian</askppplt:description>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>false</askppplt:name>
|
||||
<askppplt:description>False</askppplt:description>
|
||||
<askppplt:value>0</askppplt:value>
|
||||
</askppplt:enum>
|
||||
<askppplt:enum>
|
||||
<askppplt:name>true</askppplt:name>
|
||||
<askppplt:description>True</askppplt:description>
|
||||
<askppplt:value>1</askppplt:value>
|
||||
</askppplt:enum>
|
||||
</askppplt:typedef>
|
||||
</askppplt:typedefs>
|
||||
<askppplt:PPInit>
|
||||
<askppplt:PP-name askppplt:type="std-string">AC5X-RD</askppplt:PP-name>
|
||||
<askppplt:Phase1>
|
||||
<askppplt:coreClock askppplt:type="uint32">4294967295</askppplt:coreClock>
|
||||
<askppplt:serdesRefClock askppplt:type="serdes-ref-clock-type">external_25_single_ended</askppplt:serdesRefClock>
|
||||
<askppplt:isrAddrCompletionRegionsBmp askppplt:type="uint32">2</askppplt:isrAddrCompletionRegionsBmp>
|
||||
<askppplt:appAddrCompletionRegionsBmp askppplt:type="uint32">60</askppplt:appAddrCompletionRegionsBmp>
|
||||
<askppplt:maxNumOfPhyPortsToUse askppplt:type="number-physical-port-type">128-ports</askppplt:maxNumOfPhyPortsToUse>
|
||||
<askppplt:tcamParityCalcEnable askppplt:type="boolean-type">false</askppplt:tcamParityCalcEnable>
|
||||
<askppplt:apEnable askppplt:type="boolean-type">false</askppplt:apEnable>
|
||||
<askppplt:numOfDataIntegrityElements askppplt:type="uint32">0</askppplt:numOfDataIntegrityElements>
|
||||
</askppplt:Phase1>
|
||||
<askppplt:Phase2>
|
||||
<askppplt:useMultiNetIfSdma askppplt:type="boolean-type">true</askppplt:useMultiNetIfSdma>
|
||||
<askppplt:auqCfg>
|
||||
<askppplt:auDescNum askppplt:type="uint32">4096</askppplt:auDescNum>
|
||||
</askppplt:auqCfg>
|
||||
<askppplt:fuqCfg>
|
||||
<askppplt:fuDescNum askppplt:type="uint32">2048</askppplt:fuDescNum>
|
||||
</askppplt:fuqCfg>
|
||||
<askppplt:multiNetIfCfg>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:rx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:rx_sdma_cpu_port>
|
||||
<askppplt:rx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:rx_sdma_cpu_queue>
|
||||
<askppplt:buffAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAllocMethod>
|
||||
<askppplt:numOfRxDesc askppplt:type="uint32">20</askppplt:numOfRxDesc>
|
||||
<askppplt:numOfRxBuff askppplt:type="uint32">20</askppplt:numOfRxBuff>
|
||||
<askppplt:buffSize askppplt:type="rx-buffer-size-type">2048</askppplt:buffSize>
|
||||
<askppplt:buffHeaderOffset askppplt:type="uint32">0</askppplt:buffHeaderOffset>
|
||||
</askppplt:rxSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">0</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">0</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">1</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">2</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">3</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">4</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">5</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">6</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:txSdmaQueuesConfig-list>
|
||||
<askppplt:tx_sdma_cpu_port askppplt:type="cpu-port-id-type">1</askppplt:tx_sdma_cpu_port>
|
||||
<askppplt:tx_sdma_cpu_queue askppplt:type="queue-id-type">7</askppplt:tx_sdma_cpu_queue>
|
||||
<askppplt:buffAndDescAllocMethod askppplt:type="alloc-method-type">Static_Alloc</askppplt:buffAndDescAllocMethod>
|
||||
<askppplt:queueMode askppplt:type="tx-sdma-queue-mode-type">Normal</askppplt:queueMode>
|
||||
<askppplt:numOfTxDesc askppplt:type="uint32">20</askppplt:numOfTxDesc>
|
||||
<askppplt:numOfTxBuff askppplt:type="uint32">0</askppplt:numOfTxBuff>
|
||||
<askppplt:TxBuffSize askppplt:type="rx-buffer-size-type">128</askppplt:TxBuffSize>
|
||||
</askppplt:txSdmaQueuesConfig-list>
|
||||
</askppplt:multiNetIfCfg>
|
||||
<askppplt:internal>
|
||||
<askppplt:fuqUseSeparate askppplt:type="boolean-type">false</askppplt:fuqUseSeparate>
|
||||
<askppplt:useSecondaryAuq askppplt:type="boolean-type">false</askppplt:useSecondaryAuq>
|
||||
<askppplt:noTraffic2CPU askppplt:type="boolean-type">false</askppplt:noTraffic2CPU>
|
||||
<askppplt:netifSdmaPortGroupId askppplt:type="uint32">0</askppplt:netifSdmaPortGroupId>
|
||||
<askppplt:auMessageLength askppplt:type="au_mesage_lenght-type">8_words</askppplt:auMessageLength>
|
||||
<askppplt:useDoubleAuq askppplt:type="boolean-type">false</askppplt:useDoubleAuq>
|
||||
</askppplt:internal>
|
||||
</askppplt:Phase2>
|
||||
<askppplt:LogicalInit>
|
||||
<askppplt:routingMode askppplt:type="routing-mode-type">TCAM_ROUTER_BASED</askppplt:routingMode>
|
||||
<askppplt:maxNumOfPbrEntries askppplt:type="uint32">0</askppplt:maxNumOfPbrEntries>
|
||||
<askppplt:sharedTableMode askppplt:type="shared-table-mode-type">MID_L3_MID_L2_NO_EM</askppplt:sharedTableMode>
|
||||
<askppplt:ingressDropEnable askppplt:type="boolean-type">true</askppplt:ingressDropEnable>
|
||||
</askppplt:LogicalInit>
|
||||
<askppplt:LibInit>
|
||||
<askppplt:initBridge askppplt:type="boolean-type">true</askppplt:initBridge>
|
||||
<askppplt:initMirror askppplt:type="boolean-type">true</askppplt:initMirror>
|
||||
<askppplt:initNetIf askppplt:type="boolean-type">true</askppplt:initNetIf>
|
||||
<askppplt:initPhy askppplt:type="boolean-type">true</askppplt:initPhy>
|
||||
<askppplt:initPort askppplt:type="boolean-type">true</askppplt:initPort>
|
||||
<askppplt:initTrunk askppplt:type="boolean-type">true</askppplt:initTrunk>
|
||||
<askppplt:Trunk-params>
|
||||
<askppplt:maxNumberOfTrunks askppplt:type="uint32">511</askppplt:maxNumberOfTrunks>
|
||||
<askppplt:trunkMembersMode askppplt:type="trunk-member-mode-type">FLEX</askppplt:trunkMembersMode>
|
||||
</askppplt:Trunk-params>
|
||||
<askppplt:initPcl askppplt:type="boolean-type">true</askppplt:initPcl>
|
||||
<askppplt:initTcam askppplt:type="boolean-type">true</askppplt:initTcam>
|
||||
<askppplt:initPolicer askppplt:type="boolean-type">true</askppplt:initPolicer>
|
||||
<askppplt:initPha askppplt:type="boolean-type">true</askppplt:initPha>
|
||||
<askppplt:Pha-params>
|
||||
<askppplt:packetOrderChangeEnable askppplt:type="boolean-type">false</askppplt:packetOrderChangeEnable>
|
||||
<askppplt:phaFwImageId askppplt:type="pha-firmware-image-id-type">01</askppplt:phaFwImageId>
|
||||
<askppplt:phaFwImageIdVersion askppplt:type="uint32">0</askppplt:phaFwImageIdVersion>
|
||||
</askppplt:Pha-params>
|
||||
</askppplt:LibInit>
|
||||
</askppplt:PPInit>
|
||||
</askppplt:ASK-PP>
|
||||
</data>
|
@ -0,0 +1 @@
|
||||
3ac4dbcd6e23c747318b7e7c27e08a02
|
@ -0,0 +1,315 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" version="undefined" profile="SAI" dsig="md5">
|
||||
<SAIplt:SAI xmlns:SAIplt="urn:marvell:SAI:yang">
|
||||
<SAIplt:typedefs>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>device-id-type</SAIplt:name>
|
||||
<SAIplt:type>uint32</SAIplt:type>
|
||||
<SAIplt:description>Device ID 0..1023</SAIplt:description>
|
||||
<SAIplt:min>0</SAIplt:min>
|
||||
<SAIplt:max>1023</SAIplt:max>
|
||||
</SAIplt:typedef>
|
||||
<SAIplt:typedef>
|
||||
<SAIplt:name>port-id-type</SAIplt:name>
|
||||
<SAIplt:type>uint32</SAIplt:type>
|
||||
<SAIplt:description>Interface number</SAIplt:description>
|
||||
<SAIplt:min>0</SAIplt:min>
|
||||
<SAIplt:max>1023</SAIplt:max>
|
||||
</SAIplt:typedef>
|
||||
</SAIplt:typedefs>
|
||||
<SAIplt:ASK-BOARD-Profile-Name SAIplt:type="string">ASK-Board-ac5x-G3748.xml</SAIplt:ASK-BOARD-Profile-Name>
|
||||
<SAIplt:Features>
|
||||
<SAIplt:RoCE SAIplt:type="boolean">false</SAIplt:RoCE>
|
||||
</SAIplt:Features>
|
||||
<SAIplt:Ports>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">0</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">0</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">1</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">1</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">2</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">2</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">3</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">3</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">4</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">4</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">5</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">5</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">6</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">6</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">7</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">7</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">8</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">8</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">9</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">9</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">10</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">10</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">11</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">11</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">12</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">12</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">13</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">13</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">14</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">14</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">15</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">15</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">16</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">16</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">17</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">17</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">18</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">18</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">19</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">19</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">20</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">20</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">21</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">21</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">22</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">22</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">23</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">23</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">24</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">24</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">25</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">25</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">26</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">26</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">27</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">27</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">28</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">28</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">29</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">29</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">30</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">30</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">31</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">31</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">32</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">32</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">33</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">33</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">34</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">34</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">35</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">35</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">36</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">36</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">37</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">37</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">38</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">38</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">39</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">39</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">40</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">40</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">41</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">41</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">42</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">42</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">43</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">43</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">44</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">44</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">45</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">45</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">46</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">46</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">47</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">47</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">48</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">48</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">49</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">49</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">50</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">50</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">51</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">51</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">52</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">52</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
<SAIplt:port-list>
|
||||
<SAIplt:sai_port_id SAIplt:type="port-id-type">53</SAIplt:sai_port_id>
|
||||
<SAIplt:sdk_device_id SAIplt:type="device-id-type">0</SAIplt:sdk_device_id>
|
||||
<SAIplt:sdk_port_id SAIplt:type="port-id-type">53</SAIplt:sdk_port_id>
|
||||
</SAIplt:port-list>
|
||||
</SAIplt:Ports>
|
||||
<SAIplt:Scaling>
|
||||
<SAIplt:max_lag_members SAIplt:type="uint32">8</SAIplt:max_lag_members>
|
||||
<SAIplt:max_route_ipv4 SAIplt:type="uint32">0</SAIplt:max_route_ipv4>
|
||||
<SAIplt:max_route_ipv6 SAIplt:type="uint32">0</SAIplt:max_route_ipv6>
|
||||
<SAIplt:max_Nh_Ecmp_Mbr_Per_Grp SAIplt:type="uint32">64</SAIplt:max_Nh_Ecmp_Mbr_Per_Grp>
|
||||
<SAIplt:max_ipv4_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv4_tunnel>
|
||||
<SAIplt:max_ipv6_tunnel SAIplt:type="uint32">8</SAIplt:max_ipv6_tunnel>
|
||||
<SAIplt:max_tti SAIplt:type="uint32">1024</SAIplt:max_tti>
|
||||
<SAIplt:wred_size SAIplt:type="uint32">0</SAIplt:wred_size>
|
||||
</SAIplt:Scaling>
|
||||
<SAIplt:Counters>
|
||||
<SAIplt:cnc-base-list>
|
||||
<SAIplt:counter-base SAIplt:type="uint32">0</SAIplt:counter-base>
|
||||
</SAIplt:cnc-base-list>
|
||||
<SAIplt:cnc-base-list>
|
||||
<SAIplt:counter-base SAIplt:type="uint32">2048</SAIplt:counter-base>
|
||||
</SAIplt:cnc-base-list>
|
||||
</SAIplt:Counters>
|
||||
</SAIplt:SAI>
|
||||
</data>
|
@ -0,0 +1,214 @@
|
||||
{
|
||||
"interfaces": {
|
||||
"Ethernet0": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet1": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet2": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet3": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet4": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet5": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet6": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet7": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet8": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet9": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet10": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet11": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet12": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet13": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet14": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet15": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet16": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet17": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet18": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet19": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet20": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet21": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet22": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet23": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet24": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet25": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet26": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet27": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet28": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet29": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet30": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet31": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet32": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet33": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet34": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet35": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet36": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet37": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet38": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet39": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet40": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet41": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet42": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet43": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet44": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet45": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet46": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet47": {
|
||||
"default_brkout_mode": "1x1000[100,10]",
|
||||
"port_type": "RJ45"
|
||||
},
|
||||
"Ethernet48": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
},
|
||||
"Ethernet49": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
},
|
||||
"Ethernet50": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
},
|
||||
"Ethernet51": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
},
|
||||
"Ethernet52": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
},
|
||||
"Ethernet53": {
|
||||
"default_brkout_mode": "1x25G[10G]"
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1 @@
|
||||
# Port lane speed DC BW HF LF sqlch minLf maxLf minHf maxHf
|
@ -0,0 +1,55 @@
|
||||
# name lanes alias speed autoneg fec index
|
||||
Ethernet0 0 Gi0/1 1000 on none 1
|
||||
Ethernet1 1 Gi0/2 1000 on none 2
|
||||
Ethernet2 2 Gi0/3 1000 on none 3
|
||||
Ethernet3 3 Gi0/4 1000 on none 4
|
||||
Ethernet4 4 Gi0/5 1000 on none 5
|
||||
Ethernet5 5 Gi0/6 1000 on none 6
|
||||
Ethernet6 6 Gi0/7 1000 on none 7
|
||||
Ethernet7 7 Gi0/8 1000 on none 8
|
||||
Ethernet8 8 Gi0/9 1000 on none 9
|
||||
Ethernet9 9 Gi0/10 1000 on none 10
|
||||
Ethernet10 10 Gi0/11 1000 on none 11
|
||||
Ethernet11 11 Gi0/12 1000 on none 12
|
||||
Ethernet12 12 Gi0/13 1000 on none 13
|
||||
Ethernet13 13 Gi0/14 1000 on none 14
|
||||
Ethernet14 14 Gi0/15 1000 on none 15
|
||||
Ethernet15 15 Gi0/16 1000 on none 16
|
||||
Ethernet16 16 Gi0/17 1000 on none 17
|
||||
Ethernet17 17 Gi0/18 1000 on none 18
|
||||
Ethernet18 18 Gi0/19 1000 on none 19
|
||||
Ethernet19 19 Gi0/20 1000 on none 20
|
||||
Ethernet20 20 Gi0/21 1000 on none 21
|
||||
Ethernet21 21 Gi0/22 1000 on none 22
|
||||
Ethernet22 22 Gi0/23 1000 on none 23
|
||||
Ethernet23 23 Gi0/24 1000 on none 24
|
||||
Ethernet24 24 Gi0/25 1000 on none 25
|
||||
Ethernet25 25 Gi0/26 1000 on none 26
|
||||
Ethernet26 26 Gi0/27 1000 on none 27
|
||||
Ethernet27 27 Gi0/28 1000 on none 28
|
||||
Ethernet28 28 Gi0/29 1000 on none 29
|
||||
Ethernet29 29 Gi0/30 1000 on none 30
|
||||
Ethernet30 30 Gi0/31 1000 on none 31
|
||||
Ethernet31 31 Gi0/32 1000 on none 32
|
||||
Ethernet32 32 Gi0/33 1000 on none 33
|
||||
Ethernet33 33 Gi0/34 1000 on none 34
|
||||
Ethernet34 34 Gi0/35 1000 on none 35
|
||||
Ethernet35 35 Gi0/36 1000 on none 36
|
||||
Ethernet36 36 Gi0/37 1000 on none 37
|
||||
Ethernet37 37 Gi0/38 1000 on none 38
|
||||
Ethernet38 38 Gi0/39 1000 on none 39
|
||||
Ethernet39 39 Gi0/40 1000 on none 40
|
||||
Ethernet40 40 Gi0/41 1000 on none 41
|
||||
Ethernet41 41 Gi0/42 1000 on none 42
|
||||
Ethernet42 42 Gi0/43 1000 on none 43
|
||||
Ethernet43 43 Gi0/44 1000 on none 44
|
||||
Ethernet44 44 Gi0/45 1000 on none 45
|
||||
Ethernet45 45 Gi0/46 1000 on none 46
|
||||
Ethernet46 46 Gi0/47 1000 on none 47
|
||||
Ethernet47 47 Gi0/48 1000 on none 48
|
||||
Ethernet48 48 Fx0/1 25000 on rs 49
|
||||
Ethernet49 49 Fx0/2 25000 on rs 50
|
||||
Ethernet50 50 Fx0/3 25000 on rs 51
|
||||
Ethernet51 51 Fx0/4 25000 on rs 52
|
||||
Ethernet52 52 Fx0/5 25000 on rs 53
|
||||
Ethernet53 53 Fx0/6 25000 on rs 54
|
@ -0,0 +1,7 @@
|
||||
switchMacAddress=00:01:02:03:04:05
|
||||
portListWithCableLen=000:1 001:1 002:1 003:1 004:1 005:1 006:1 007:1 008:1 009:1 010:1 011:1 012:1 013:1 014:1 015:1 016:1 017:1 018:1 019:1 020:1 021:1 022:1 023:1 024:1 025:1 026:1 027:1 028:1 029:1 030:1 031:1 032:1 033:1 034:1 035:1 036:1 037:1 038:1 039:1 040:1 041:1 042:1 043:1 044:1 045:1 046:1 047:1 048:1 049:1 050:1 051:1 052:1 053:1
|
||||
platformConfigFile=/usr/share/sonic/hwsku/platform.ini
|
||||
lpm_fdb_em_profile=MID_L3_MID_L2_NO_EM
|
||||
l3_counter_index_base=0 2K
|
||||
pbrMaxEntries=0
|
||||
SAI_NUM_ECMP_MEMBERS=64
|
@ -0,0 +1,4 @@
|
||||
mode=1
|
||||
hwId=AC5XG3748
|
||||
switchProfile=/usr/share/sonic/hwsku/SAI-AC5X-G3748.xml
|
||||
SAI_INIT_CONFIG_FILE=/usr/share/sonic/hwsku/profile.ini
|
@ -0,0 +1,14 @@
|
||||
{
|
||||
"services_to_ignore": [],
|
||||
"devices_to_ignore": [
|
||||
"asic",
|
||||
"psu.temperature"
|
||||
],
|
||||
"user_defined_checkers": [],
|
||||
"polling_interval": 60,
|
||||
"led_color": {
|
||||
"fault": "amber",
|
||||
"normal": "green",
|
||||
"booting": "blinking green"
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
{
|
||||
"thermal_control_algorithm": {
|
||||
"run_at_boot_up": "false",
|
||||
"fan_speed_when_suspend": "50"
|
||||
},
|
||||
"info_types": [
|
||||
{
|
||||
"type": "fan_info"
|
||||
},
|
||||
{
|
||||
"type": "thermal_info"
|
||||
},
|
||||
{
|
||||
"type": "chassis_info"
|
||||
}
|
||||
],
|
||||
"policies": [
|
||||
{
|
||||
"name": "any fan absence",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "fan.any.absence"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "thermal_control.control",
|
||||
"status": "false"
|
||||
},
|
||||
{
|
||||
"type": "fan.all.set_speed",
|
||||
"speed": "100"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "all fan presence",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "fan.all.presence"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "thermal.temp_check_and_set_all_fan_speed",
|
||||
"default_speed": "25",
|
||||
"hightemp_speed": "100"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "temp over high critical threshold",
|
||||
"conditions": [
|
||||
{
|
||||
"type": "thermal.over.high_critical_threshold"
|
||||
}
|
||||
],
|
||||
"actions": [
|
||||
{
|
||||
"type": "switch.shutdown"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
@ -7,7 +7,8 @@ $(SONIC_ONE_IMAGE)_INSTALLS += $(SYSTEMD_SONIC_GENERATOR)
|
||||
$(SONIC_ONE_IMAGE)_INSTALLS += $(MRVL_PRESTERA_DEB)
|
||||
$(SONIC_ONE_IMAGE)_LAZY_INSTALLS += $(NOKIA_7215_PLATFORM) \
|
||||
$(AC5X_RD98DX35xx_PLATFORM) \
|
||||
$(AC5X_RD98DX35xxCN9131_PLATFORM)
|
||||
$(AC5X_RD98DX35xxCN9131_PLATFORM) \
|
||||
$(SUPERMICRO_SSE_G3748_PLATFORM_MODULE)
|
||||
ifeq ($(INSTALL_DEBUG_TOOLS),y)
|
||||
$(SONIC_ONE_IMAGE)_DOCKERS += $(SONIC_INSTALL_DOCKER_DBG_IMAGES)
|
||||
$(SONIC_ONE_IMAGE)_DOCKERS += $(filter-out $(patsubst %-$(DBG_IMAGE_MARK).gz,%.gz, $(SONIC_INSTALL_DOCKER_DBG_IMAGES)), $(SONIC_INSTALL_DOCKER_IMAGES))
|
||||
|
12
platform/marvell-arm64/platform-modules-supermicro.mk
Normal file
12
platform/marvell-arm64/platform-modules-supermicro.mk
Normal file
@ -0,0 +1,12 @@
|
||||
# Supermicro SSE-G3748 (using AC5X) Platform modules
|
||||
|
||||
SUPERMICRO_SSE_G3748_PLATFORM_MODULE_VERSION=1.0
|
||||
|
||||
export SUPERMICRO_SSE_G3748_PLATFORM_MODULE_VERSION
|
||||
|
||||
SUPERMICRO_SSE_G3748_PLATFORM_MODULE = sonic-platform-supermicro-sse-g3748_$(SUPERMICRO_SSE_G3748_PLATFORM_MODULE_VERSION)_$(CONFIGURED_ARCH).deb
|
||||
$(SUPERMICRO_SSE_G3748_PLATFORM_MODULE)_SRC_PATH = $(PLATFORM_PATH)/sonic-platform-modules-supermicro
|
||||
$(SUPERMICRO_SSE_G3748_PLATFORM_MODULE)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
|
||||
$(SUPERMICRO_SSE_G3748_PLATFORM_MODULE)_PLATFORM = arm64-supermicro_sse_g3748-r0
|
||||
SONIC_DPKG_DEBS += $(SUPERMICRO_SSE_G3748_PLATFORM_MODULE)
|
||||
|
@ -40,6 +40,9 @@ case $PLATFORM in
|
||||
arm64-marvell_rd98DX35xx_cn9131-r0) PLATFORM_CN9131=1;
|
||||
fdt_fname="/boot/cn9131-db-comexpress.dtb";
|
||||
fit_conf_name="#conf_cn9131";;
|
||||
arm64-supermicro_sse_g3748-r0) PLATFORM_AC5X=2;
|
||||
fdt_fname="/usr/lib/linux-image-${kernel_version}/marvell/smc_sse-g3748.dtb";
|
||||
fit_conf_name="#conf_smc_sse-g3748";;
|
||||
esac
|
||||
|
||||
if [ $PLATFORM_AC5X -eq 1 ]; then
|
||||
@ -57,6 +60,39 @@ elif [ $PLATFORM_CN9131 -eq 1 ]; then
|
||||
demo_part=2
|
||||
FW_ENV_DEFAULT='/dev/mtd1 0x1F0000 0x10000 0x10000'
|
||||
mmc_bus="mmc0:0001"
|
||||
lif [ $PLATFORM_AC5X -eq 2 ]; then
|
||||
fdt_addr=0x201000000
|
||||
fit_addr=0x210000000
|
||||
initrd_addr=0x206000000
|
||||
|
||||
#---------------------------------------------------------------
|
||||
# device name offset Env size sector size
|
||||
# ----------- ------- -------- -----------
|
||||
FW_ENV_DEFAULT='/dev/mtd1 0x000000 0x10000 0x10000'
|
||||
demo_part=2
|
||||
mmc_bus="mmc0:0001"
|
||||
|
||||
onie_part_size=168M
|
||||
onie_part_num=1
|
||||
onie_part_label=ONIE
|
||||
|
||||
sonic_part_num=2
|
||||
sonic_part_label=SONiC-OS
|
||||
|
||||
swap_part_size=3G
|
||||
swap_part_num=3
|
||||
swap_part_label=swap
|
||||
|
||||
debug_part_size=2G
|
||||
debug_swap_part_size=5G
|
||||
debug_part_num=4
|
||||
debug_part_label=DEBUG
|
||||
|
||||
current_image_dir=""
|
||||
current_image_name=""
|
||||
current_fdt_name=""
|
||||
current_fit_name=""
|
||||
current_sonic_version_1=""
|
||||
else
|
||||
fdt_addr=0x1000000
|
||||
fit_addr=0x8000000
|
||||
@ -110,15 +146,86 @@ remove_dev_partitions() {
|
||||
}
|
||||
|
||||
create_demo_partition() {
|
||||
# SD CARD
|
||||
remove_dev_partitions
|
||||
if [ $PLATFORM_AC5X -eq 2 ]; then
|
||||
onie_part=$(sgdisk -p "$blk_dev" | grep -e "$onie_part_label" | awk '{print $1}')
|
||||
sonic_part=$(sgdisk -p "$blk_dev" | grep -e "$sonic_part_label" | awk '{print $1}')
|
||||
swap_part=$(sgdisk -p "$blk_dev" | grep -e "$swap_part_label" | awk '{print $1}')
|
||||
debug_part=$(sgdisk -p "$blk_dev" | grep -e "$debug_part_label" | awk '{print $1}')
|
||||
|
||||
# Create sonic partition
|
||||
sgdisk --new ${demo_part}:: \
|
||||
--change-name=${demo_part}:${demo_volume_label} \
|
||||
--typecode=${demo_part}:8300 -p ${blk_dev}
|
||||
if [ -z "$onie_part" ]
|
||||
then
|
||||
echo "Partitioning is Incorrect. Re-partitioning"
|
||||
sgdisk -oZ ${blk_dev}
|
||||
|
||||
partprobe
|
||||
sgdisk --new ${onie_part_num}:0:+${onie_part_size} \
|
||||
--change-name=${onie_part_num}:${onie_part_label} \
|
||||
--typecode=${onie_part_num}:8300 -p ${blk_dev}
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Failed creating onie eMMC partition"
|
||||
return 2
|
||||
fi
|
||||
|
||||
mkfs.ext4 -F -L ${onie_part_label} ${blk_dev}p${onie_part_num}
|
||||
else
|
||||
fsck.ext4 -v -p ${blk_dev}p${onie_part_num}
|
||||
fi
|
||||
|
||||
if [ -z "$debug_part" ]; then
|
||||
# Create debug partition
|
||||
sgdisk --new ${debug_part_num}:-${debug_part_size}: \
|
||||
--change-name=${debug_part_num}:${debug_part_label} \
|
||||
--typecode=${debug_part_num}:8300 -p ${blk_dev}
|
||||
|
||||
mkfs.ext4 -F -L ${debug_part_label} ${blk_dev}p${debug_part_num}
|
||||
else
|
||||
fsck.ext4 -v -p ${blk_dev}p${debug_part_num}
|
||||
fi
|
||||
|
||||
if [ -z "$swap_part" ]; then
|
||||
# Create swap partition
|
||||
swap_start_num=-${debug_swap_part_size}
|
||||
swap_end_num=-${debug_part_size}
|
||||
#sgdisk --new ${swap_part_num}:-${swap_part_size}: \
|
||||
sgdisk --new ${swap_part_num}:${swap_start_num}:${swap_end_num} \
|
||||
--change-name=${swap_part_num}:${swap_part_label} \
|
||||
--typecode=${swap_part_num}:8200 -p ${blk_dev}
|
||||
fi
|
||||
|
||||
if [ -z "$sonic_part" ]; then
|
||||
# Create sonic partition
|
||||
start_num=$(sgdisk -F $blk_dev)
|
||||
end_num=$(sgdisk -E $blk_dev)
|
||||
|
||||
sgdisk --new ${sonic_part_num}:${start_num}:${end_num} \
|
||||
--change-name=${sonic_part_num}:${sonic_part_label} \
|
||||
--typecode=${sonic_part_num}:8300 -p ${blk_dev}
|
||||
|
||||
mkfs.ext4 -F -L ${sonic_part_label} ${blk_dev}p${sonic_part_num}
|
||||
else
|
||||
mkfs.ext4 -F -L ${sonic_part_label} ${blk_dev}p${sonic_part_num}
|
||||
fi
|
||||
|
||||
partprobe
|
||||
sync
|
||||
|
||||
mkswap ${blk_dev}p${swap_part_num}
|
||||
echo "${blk_dev}p${swap_part_num} swap swap defaults 0 0" > /etc/fstab
|
||||
swapon -a
|
||||
|
||||
return 0
|
||||
|
||||
else
|
||||
# SD CARD
|
||||
remove_dev_partitions
|
||||
|
||||
# Create sonic partition
|
||||
sgdisk --new ${demo_part}:: \
|
||||
--change-name=${demo_part}:${demo_volume_label} \
|
||||
--typecode=${demo_part}:8300 -p ${blk_dev}
|
||||
|
||||
partprobe
|
||||
fi
|
||||
}
|
||||
|
||||
create_partition() {
|
||||
@ -171,6 +278,13 @@ prepare_boot_menu() {
|
||||
initrd_name=${image_dir}${initrd_fname}
|
||||
fdt_name=${image_dir}${fdt_fname}
|
||||
fit_name=${image_dir}${fit_fname}
|
||||
if [ $PLATFORM_AC5X -eq 2 ]; then
|
||||
current_image_dir="image-$running_sonic_revision"
|
||||
current_image_name=${current_image_dir}${kernel_name}
|
||||
current_fdt_name=${current_image_dir}${fdt_fname}
|
||||
current_fit_name=${current_image_dir}${fit_fname}
|
||||
current_sonic_version_1="${demo_volume_label}-${running_sonic_revision}"
|
||||
fi
|
||||
|
||||
if [ "$install_env" = "onie" ]; then
|
||||
FW_ARG="-f"
|
||||
@ -181,12 +295,55 @@ prepare_boot_menu() {
|
||||
fit_name_old=""
|
||||
sonic_version_2="None"
|
||||
else
|
||||
image_dir_old=$(fw_printenv -n image_dir || true)
|
||||
image_name_old=$(fw_printenv -n image_name || true)
|
||||
initrd_name_old=$(fw_printenv -n initrd_name || true)
|
||||
fdt_name_old=$(fw_printenv -n fdt_name || true)
|
||||
fit_name_old=$(fw_printenv -n fit_name || true)
|
||||
sonic_version_2=$(fw_printenv -n sonic_version_1 || true)
|
||||
if [ $PLATFORM_AC5X -eq 2 ]; then
|
||||
sonic_version_1=$(fw_printenv -n sonic_version_1 || true)
|
||||
sonic_version_2=$(fw_printenv -n sonic_version_2 || true)
|
||||
if [ "$sonic_version_1" != "NONE" ] && [ "$sonic_version_1" != "None" ]
|
||||
then
|
||||
if [ "$running_sonic_revision" != "None" ]
|
||||
then
|
||||
image_dir_old=${current_image_dir}
|
||||
image_name_old=${current_image_name}
|
||||
initrd_name_old=${current_initrd_name}
|
||||
fdt_name_old=${current_fdt_name}
|
||||
fit_name_old=${current_fit_name}
|
||||
sonic_version_2=${current_sonic_version_1}
|
||||
else
|
||||
image_dir_old=$(fw_printenv -n image_dir || true)
|
||||
image_name_old=$(fw_printenv -n image_name || true)
|
||||
initrd_name_old=$(fw_printenv -n initrd_name || true)
|
||||
fdt_name_old=$(fw_printenv -n fdt_name || true)
|
||||
fit_name_old=$(fw_printenv -n fit_name || true)
|
||||
sonic_version_2=$(fw_printenv -n sonic_version_1 || true)
|
||||
fi
|
||||
else
|
||||
if [ "$sonic_version_2" != "NONE" ] && [ "$sonic_version_2" != "None" ]
|
||||
then
|
||||
image_dir_old=$(fw_printenv -n image_dir_old || true)
|
||||
image_name_old=$(fw_printenv -n image_name_old || true)
|
||||
initrd_name_old=$(fw_printenv -n initrd_name_old || true)
|
||||
fdt_name_old=$(fw_printenv -n fdt_name_old || true)
|
||||
fit_name_old=$(fw_printenv -n fit_name_old || true)
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$demo_dev" ]; then
|
||||
get_install_device
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Unable to detect $blk_dev $demo_dev"
|
||||
exit 1
|
||||
fi
|
||||
demo_part=${sonic_part_num}
|
||||
demo_dev=${blk_dev}p${sonic_part_num}
|
||||
fi
|
||||
else
|
||||
image_dir_old=$(fw_printenv -n image_dir || true)
|
||||
image_name_old=$(fw_printenv -n image_name || true)
|
||||
initrd_name_old=$(fw_printenv -n initrd_name || true)
|
||||
fdt_name_old=$(fw_printenv -n fdt_name || true)
|
||||
fit_name_old=$(fw_printenv -n fit_name || true)
|
||||
sonic_version_2=$(fw_printenv -n sonic_version_1 || true)
|
||||
fi
|
||||
fi
|
||||
|
||||
# Set boot variables
|
||||
@ -204,14 +361,27 @@ prepare_boot_menu() {
|
||||
fw_setenv ${FW_ARG} sonic_version_2 $sonic_version_2 > /dev/null
|
||||
BOOT1='echo " > Boot1: $sonic_version_1 - run sonic_image_1";echo;'
|
||||
BOOT2='echo " > Boot2: $sonic_version_2 - run sonic_image_2";echo;'
|
||||
BOOT3='echo " > Boot3: ONIE - run onie_boot";echo;'
|
||||
BORDER='echo "---------------------------------------------------";echo;'
|
||||
fw_setenv ${FW_ARG} print_menu $BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER > /dev/null
|
||||
|
||||
fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${ONIE_PLATFORM_EXTRA_CMDLINE_LINUX}" > /dev/null
|
||||
fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${ONIE_PLATFORM_EXTRA_CMDLINE_LINUX}" > /dev/null
|
||||
sonic_bootargs_old='setenv bootargs root='$demo_dev' rw rootwait rootfstype=ext4 panic=1 console=ttyS0,${baudrate} ${othbootargs} ${mtdparts} ${linuxargs_old}'
|
||||
fw_setenv ${FW_ARG} sonic_bootargs_old $sonic_bootargs_old > /dev/null || true
|
||||
if [ $PLATFORM -eq 2 ]; then
|
||||
BOOT3='echo " > Boot3: ONIE - run onie_emmc_boot";echo;'
|
||||
BORDER='echo "---------------------------------------------------";echo;'
|
||||
fw_setenv ${FW_ARG} print_menu "$BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER" > /dev/null
|
||||
|
||||
fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${extra_cmdline_linux} loglevel=4" > /dev/null
|
||||
fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG loglevel=4" > /dev/null
|
||||
sonic_bootargs_old='setenv bootargs root='$demo_dev' rw rootwait rootfstype=ext4 panic=1 console=ttyS0,${baudrate} ${othbootargs} ${mtdparts} ${linuxargs_old}'
|
||||
fw_setenv ${FW_ARG} sonic_bootargs_old "$sonic_bootargs_old" > /dev/null || true
|
||||
else
|
||||
BOOT3='echo " > Boot3: ONIE - run onie_boot";echo;'
|
||||
BORDER='echo "---------------------------------------------------";echo;'
|
||||
fw_setenv ${FW_ARG} print_menu $BORDER $BOOT1 $BOOT2 $BOOT3 $BORDER > /dev/null
|
||||
|
||||
fw_setenv ${FW_ARG} linuxargs "net.ifnames=0 loopfstype=squashfs loop=$image_dir/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${ONIE_PLATFORM_EXTRA_CMDLINE_LINUX}" > /dev/null
|
||||
fw_setenv ${FW_ARG} linuxargs_old "net.ifnames=0 loopfstype=squashfs loop=$image_dir_old/$FILESYSTEM_SQUASHFS systemd.unified_cgroup_hierarchy=0 varlog_size=$VAR_LOG ${ONIE_PLATFORM_EXTRA_CMDLINE_LINUX}" > /dev/null
|
||||
sonic_bootargs_old='setenv bootargs root='$demo_dev' rw rootwait rootfstype=ext4 panic=1 console=ttyS0,${baudrate} ${othbootargs} ${mtdparts} ${linuxargs_old}'
|
||||
fw_setenv ${FW_ARG} sonic_bootargs_old $sonic_bootargs_old > /dev/null || true
|
||||
fi
|
||||
|
||||
sonic_boot_load_old=$(fw_printenv -n sonic_boot_load || true)
|
||||
old_str="_old"
|
||||
fw_setenv ${FW_ARG} sonic_boot_load_old "$sonic_boot_load_old$old_str" > /dev/null || true
|
||||
@ -226,13 +396,24 @@ prepare_boot_menu() {
|
||||
SONIC_BOOT_CMD='run sonic_bootargs; run sonic_boot_load; bootm $fit_addr${fit_conf_name}'
|
||||
SONIC_BOOT_CMD_OLD='run sonic_bootargs_old; run sonic_boot_load_old; bootm $fit_addr${fit_conf_name}'
|
||||
BOOTARGS='setenv bootargs root='$demo_dev' rw rootwait rootfstype=ext4 panic=1 console=ttyS0,${baudrate} ${othbootargs} ${mtdparts} ${linuxargs}'
|
||||
fw_setenv ${FW_ARG} sonic_bootargs $BOOTARGS > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_bootcmd $SONIC_BOOT_CMD > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_image_2 $SONIC_BOOT_CMD_OLD > /dev/null
|
||||
if [ $PLATFORM -eq 2 ]; then
|
||||
fw_setenv ${FW_ARG} sonic_bootargs "$BOOTARGS" > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_bootcmd "$SONIC_BOOT_CMD" > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_image_2 "$SONIC_BOOT_CMD_OLD" > /dev/null
|
||||
else
|
||||
fw_setenv ${FW_ARG} sonic_bootargs $BOOTARGS > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_bootcmd $SONIC_BOOT_CMD > /dev/null
|
||||
fw_setenv ${FW_ARG} sonic_image_2 $SONIC_BOOT_CMD_OLD > /dev/null
|
||||
fi
|
||||
fw_setenv ${FW_ARG} sonic_image_1 "$SONIC_BOOT_CMD" > /dev/null
|
||||
fw_setenv ${FW_ARG} boot_next 'run sonic_image_1'> /dev/null
|
||||
fw_setenv ${FW_ARG} bootcmd 'run print_menu; usb start; test -n "$boot_once" && run boot_once; run boot_next' > /dev/null
|
||||
|
||||
if [ $PLATFORM -eq 2 ]; then
|
||||
fw_setenv ${FW_ARG} boot_once > /dev/null
|
||||
fw_setenv ${FW_ARG} nos_bootcmd 'run print_menu; usb start; test -n "$boot_once" && run boot_once; run boot_next' > /dev/null
|
||||
fw_setenv ${FW_ARG} bootcmd 'run diag_bootcmd; run check_boot_reason; run nos_bootcmd; run onie_bootcmd' > /dev/null
|
||||
else
|
||||
fw_setenv ${FW_ARG} bootcmd 'run print_menu; usb start; test -n "$boot_once" && run boot_once; run boot_next' > /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
bootloader_menu_config() {
|
||||
|
@ -8,6 +8,7 @@ include $(PLATFORM_PATH)/one-image.mk
|
||||
include $(PLATFORM_PATH)/mrvl-prestera.mk
|
||||
include $(PLATFORM_PATH)/platform-nokia.mk
|
||||
include $(PLATFORM_PATH)/platform-marvell.mk
|
||||
include $(PLATFORM_PATH)/platform-modules-supermicro.mk
|
||||
|
||||
SONIC_ALL += $(SONIC_ONE_IMAGE) \
|
||||
$(DOCKER_FPM) \
|
||||
|
@ -0,0 +1,6 @@
|
||||
sonic-supermicro-platform-modules (1.0) unstable; urgency=low
|
||||
|
||||
* Add support for Supermicro SSE-G3748
|
||||
* Initial release
|
||||
|
||||
-- Supermicro Team <support@supermicro.com> Wed, 03 Jan 2024 09:00:00 +0800
|
@ -0,0 +1 @@
|
||||
9
|
@ -0,0 +1,13 @@
|
||||
Source: sonic-supermicro-platform-modules
|
||||
Section: main
|
||||
Priority: extra
|
||||
Maintainer: Supermicro Team <support@supermicro.com>
|
||||
Build-Depends: debhelper (>=9)
|
||||
Standards-Version: 3.9.6
|
||||
Homepage: <insert the upstream URL, if relevant>
|
||||
|
||||
Package: sonic-platform-supermicro-sse-g3748
|
||||
Architecture: arm64
|
||||
Depends: ${misc:Depends}
|
||||
Description: Kernel modules for platform devices such as fan, led, sfp
|
||||
<insert long description, indented with spaces>
|
74
platform/marvell-arm64/sonic-platform-modules-supermicro/debian/rules
Executable file
74
platform/marvell-arm64/sonic-platform-modules-supermicro/debian/rules
Executable file
@ -0,0 +1,74 @@
|
||||
#!/usr/bin/make -f
|
||||
# See debhelper(7) (uncomment to enable)
|
||||
# output every command that modifies files on the build system.
|
||||
#export DH_VERBOSE = 1
|
||||
|
||||
include /usr/share/dpkg/pkg-info.mk
|
||||
#--------------------------------------------------------
|
||||
|
||||
export INSTALL_MOD_DIR:=extra
|
||||
|
||||
PACKAGE_PRE_NAME := sonic-platform-supermicro
|
||||
KVERSION ?= $(shell uname -r)
|
||||
KERNEL_SRC ?= /lib/modules/$(KVERSION)
|
||||
MOD_SRC_DIR:= $(shell pwd)
|
||||
MODULE_DIRS:= sse-g3748
|
||||
MODULE_DIR:= modules
|
||||
UTILS_DIR := utils
|
||||
SERVICE_DIR := service
|
||||
|
||||
%:
|
||||
dh $@ --with systemd,python3 --buildsystem=pybuild
|
||||
|
||||
clean:
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
dh_clean
|
||||
|
||||
build:
|
||||
(for mod in $(MODULE_DIRS); do \
|
||||
if [ $$mod = "sse-g3748" ]; then \
|
||||
make modules -C $(KERNEL_SRC)/build M=$(MOD_SRC_DIR)/$${mod}/modules; \
|
||||
python3 $${mod}/setup.py bdist_wheel -d $(MOD_SRC_DIR)/$${mod}; \
|
||||
echo "Finished making whl package for $$mod"; \
|
||||
fi; \
|
||||
done)
|
||||
|
||||
binary: binary-arch binary-indep
|
||||
# Nothing to do
|
||||
|
||||
binary-arch:
|
||||
# Nothing to do
|
||||
|
||||
binary-indep:
|
||||
dh_testdir
|
||||
dh_installdirs
|
||||
|
||||
# Custom package commands
|
||||
(for mod in $(MODULE_DIRS); do \
|
||||
dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} /usr/local/bin; \
|
||||
dh_installdirs -p$(PACKAGE_PRE_NAME)-$${mod} $(KERNEL_SRC)/$(INSTALL_MOD_DIR); \
|
||||
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/; \
|
||||
python2 $${mod}/setup.py install --root=$(MOD_SRC_DIR)/debian/$(PACKAGE_PRE_NAME)-$${mod} --install-layout=deb; \
|
||||
python3 $${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
|
@ -0,0 +1,10 @@
|
||||
sse-g3748/scripts/setup_all_ports_l2.py usr/local/bin
|
||||
sse-g3748/scripts/show-techsupport usr/local/bin
|
||||
sse-g3748/scripts/techfile_v2.py usr/local/bin
|
||||
sse-g3748/scripts/sse-g3748_plt_setup.sh usr/local/bin
|
||||
sse-g3748/scripts/entropy.py etc/
|
||||
sse-g3748/scripts/sse-g3748-init.sh usr/local/bin
|
||||
sse-g3748/scripts/reset-to-factory-default usr/local/bin
|
||||
sse-g3748/service/sse-g3748-init.service etc/systemd/system
|
||||
sse-g3748/sonic_platform-1.0-py3-none-any.whl usr/share/sonic/device/arm64-supermicro_sse_g3748-r0
|
||||
sse-g3748/scripts/add_port_range usr/local/bin
|
@ -0,0 +1,47 @@
|
||||
#!/bin/sh
|
||||
# postinst script for platform-modules-sse-g3748
|
||||
#
|
||||
# see: dh_installdeb(1)
|
||||
|
||||
set -e
|
||||
|
||||
# summary of how this script can be called:
|
||||
# * <postinst> `configure' <most-recently-configured-version>
|
||||
# * <old-postinst> `abort-upgrade' <new version>
|
||||
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
|
||||
# <new-version>
|
||||
# * <postinst> `abort-remove'
|
||||
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
|
||||
# <failed-install-package> <version> `removing'
|
||||
# <conflicting-package> <version>
|
||||
# for details, see https://www.debian.org/doc/debian-policy/ or
|
||||
# the debian-policy package
|
||||
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
sh /usr/local/bin/sse-g3748_plt_setup.sh
|
||||
chmod a+x /usr/local/bin/sse-g3748-init.sh
|
||||
chmod a+x /usr/local/bin/setup_all_ports_l2.py
|
||||
chmod a+x /usr/local/bin/add_port_range
|
||||
chmod a+x /usr/local/bin/reset-to-factory-default
|
||||
systemctl enable sse-g3748-init.service
|
||||
systemctl start sse-g3748-init.service
|
||||
|
||||
;;
|
||||
|
||||
abort-upgrade|abort-remove|abort-deconfigure)
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "postinst called with unknown argument \`$1'" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# dh_installdeb will replace this with shell code automatically
|
||||
# generated by other debhelper scripts.
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
@ -0,0 +1,2 @@
|
||||
obj-m := g3748cpld.o
|
||||
obj-m += smc-i2c-mux-pca954x.o
|
@ -0,0 +1,818 @@
|
||||
/*
|
||||
* g3748cpld.c - A driver for control of SMC SSE-G3748 cpld based on lm75.c
|
||||
*
|
||||
* Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
|
||||
* Copyright (c) 2023 Supermicro <support@supermicro.com>
|
||||
*
|
||||
* 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/init.h>
|
||||
#include <linux/slab.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>
|
||||
|
||||
/* Addresses scanned */
|
||||
static const unsigned short normal_i2c[] = { 0x66, I2C_CLIENT_END };
|
||||
|
||||
/* CPLD WDT global timeout */
|
||||
static u32 gTimeout = 0;
|
||||
|
||||
/* Size of EEPROM in bytes */
|
||||
#define CPLD_SIZE 12
|
||||
|
||||
#define FAN_NUM 2
|
||||
#define PSU_NUM 2
|
||||
#define DEFAULT_VOLTAGE_MIN 11000
|
||||
#define DEFAULT_VOLTAGE_MAX 13000
|
||||
#define DEFAULT_VOLTAGE_LCRIT 11500
|
||||
#define DEFAULT_VOLTAGE_CRIT 12500
|
||||
|
||||
#define G3748_CPLD_VER_REG 0x09
|
||||
//#define G3748_POWER_GOOD_REG 0x0A
|
||||
//#define G3748_PSU_PRESENT_REG 0x0A
|
||||
#define G3748_PSU_STATUS_REG 0x0A
|
||||
#define G3748_FAN_STATUS_REG 0x3B
|
||||
#define G3748_FAN_CONTROL_REG 0x3C
|
||||
#define G3748_FAN_SPEED_REG 0x3E
|
||||
#define G3748_PSU_FRONTLED_REG 0x12
|
||||
#define G3748_FAN_SYS_FRONTLED_REG 0x11
|
||||
#define G3748_WDT_TIMER_REG 0x1B
|
||||
#define G3748_WDT_CTRL_REG 0x1C
|
||||
#define G3748_WDT_INTR_CNT_MASK_REG 0x1D
|
||||
#define G3748_WDT_INTR_FLAG_REG 0x1E
|
||||
|
||||
/* Each client has this additional data */
|
||||
struct cpld_data {
|
||||
struct device *hwmon_dev;
|
||||
struct i2c_client *client;
|
||||
struct mutex update_lock;
|
||||
char valid; /* !=0 if registers are valid */
|
||||
unsigned long last_updated; /* In jiffies */
|
||||
u8 data[CPLD_SIZE]; /* Register value */
|
||||
|
||||
u32 in[PSU_NUM]; /* Register value for PSU Voltage input value */
|
||||
u32 in_min[PSU_NUM]; /* Register value for PSU Voltage min value */
|
||||
u32 in_max[PSU_NUM]; /* Register value for PSU Voltage max value */
|
||||
u32 in_crit[PSU_NUM]; /* Register value for PSU Voltage critical max value */
|
||||
u32 in_lcrit[PSU_NUM]; /* Register value for PSU Voltage critical min value */
|
||||
|
||||
u32 fan[FAN_NUM]; /* Register value for FAN speed(RPM) input value */
|
||||
u32 fan_min[FAN_NUM]; /* Register value for FAN speed(RPM) min value */
|
||||
u32 fan_max[FAN_NUM]; /* Register value for FAN speed(RPM) max value */
|
||||
u32 fan_target[FAN_NUM]; /* Register value for FAN desired speed(RPM) value */
|
||||
u8 pwm[FAN_NUM]; /* Register value for Pulse Width Modulation Ctrl 0-255 255:max(100%) */
|
||||
};
|
||||
|
||||
static int g3748cpld_read (struct cpld_data *data, u8 reg)
|
||||
{
|
||||
int ret = -EPERM;
|
||||
//u8 high_reg = 0x00;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
//ret = i2c_smbus_write_byte_data (data->client, high_reg, reg);
|
||||
ret = i2c_smbus_read_byte_data (data->client, reg);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int g3748cpld_write (struct cpld_data *data, u8 reg, u8 val)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
ret = i2c_smbus_write_byte_data (data->client, reg, val);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if 0
|
||||
static ssize_t show_hwmon_value(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
data->data[0] = i2c_smbus_read_byte_data(client, index);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return sprintf(buf, "%d\n", data->data[0]);
|
||||
}
|
||||
|
||||
static ssize_t show_sysfs_value(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(da);
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct cpld_data *data = i2c_get_clientdata(client);
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
data->data[0] = i2c_smbus_read_byte_data(client, attr->index);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return sprintf(buf, "%02x\n", data->data[0]);
|
||||
}
|
||||
|
||||
static ssize_t set_hwmon_value(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = data->client;
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
i2c_smbus_write_byte_data(client, index, temp);
|
||||
mutex_unlock(&data->update_lock);
|
||||
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
static ssize_t get_cpld_ver(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_CPLD_VER_REG);
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld read error");
|
||||
|
||||
devdata = (u8)ret & 0xff;
|
||||
return sprintf(buf, "0x%02X\n", devdata);
|
||||
}
|
||||
|
||||
static ssize_t get_power_good(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
//ret = g3748cpld_read (data, G3748_POWER_GOOD_REG);
|
||||
ret = g3748cpld_read (data, G3748_PSU_STATUS_REG);
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld read error");
|
||||
|
||||
if (index == 1) {
|
||||
devdata = (u8)ret & 0x04;
|
||||
} else if (index == 2) {
|
||||
devdata = (u8)ret & 0x08;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%s\n", (devdata == 0)? "12000":"0");
|
||||
}
|
||||
|
||||
static ssize_t get_psu_status(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
//u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
//int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
ret = g3748cpld_read (data, G3748_PSU_STATUS_REG);
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld psu status read error");
|
||||
|
||||
//if (index == 1) {
|
||||
// devdata = (u8)ret & 0x01;
|
||||
//} else if (index == 2) {
|
||||
// devdata = (u8)ret & 0x02;
|
||||
//}
|
||||
|
||||
return sprintf(buf, "%d\n", (u8)ret);
|
||||
}
|
||||
|
||||
static void initCpldDataReg (struct cpld_data *data)
|
||||
{
|
||||
if (data != NULL) {
|
||||
data->in_min[0] = data->in_min[1] = DEFAULT_VOLTAGE_MIN;
|
||||
data->in_max[0] = data->in_max[1] = DEFAULT_VOLTAGE_MAX;
|
||||
data->in_lcrit[0] = data->in_lcrit[1] = DEFAULT_VOLTAGE_LCRIT;
|
||||
data->in_crit[0] = data->in_crit[1] = DEFAULT_VOLTAGE_CRIT;
|
||||
}
|
||||
}
|
||||
|
||||
static ssize_t get_voltage_limit(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
u32 inData = 0;
|
||||
//ret = g3748cpld_read (data, G3748_PSU_PRESENT_REG);
|
||||
//if (ret < 0)
|
||||
// return sprintf(buf, "cpld read error");
|
||||
|
||||
/* Register data read from our cpld_data structure storage area */
|
||||
if ((index == 11) || (index == 12)) {
|
||||
/* Read for in1_min or in2_min */
|
||||
inData = data->in_min[index - 11];
|
||||
} else if ((index == 21) || (index == 22)) {
|
||||
/* Read for in1_max or in2_max */
|
||||
inData = data->in_max[index - 21];
|
||||
} else if ((index == 31) || (index == 32)) {
|
||||
/* Read for in1_lcrit or in2_lcrit */
|
||||
inData = data->in_lcrit[index - 31];
|
||||
} else if ((index == 41) || (index == 42)) {
|
||||
/* Read for in1_crit or in2_crit */
|
||||
inData = data->in_crit[index - 41];
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", (int)inData);
|
||||
}
|
||||
|
||||
static ssize_t set_voltage_limit(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
u32 inData = 0;
|
||||
int error;
|
||||
|
||||
error = kstrtou32(buf, 10, &inData);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
/* Register data read from our cpld_data structure storage area */
|
||||
if ((index == 11) || (index == 12)) {
|
||||
/* write in1_min or in2_min */
|
||||
data->in_min[index - 11] = inData;
|
||||
} else if ((index == 21) || (index == 22)) {
|
||||
/* write in1_max or in2_max */
|
||||
data->in_max[index - 21] = inData;
|
||||
} else if ((index == 31) || (index == 32)) {
|
||||
/* write in1_lcrit or in2_lcrit */
|
||||
data->in_lcrit[index - 31] = inData;
|
||||
} else if ((index == 41) || (index == 42)) {
|
||||
/* Read for in1_crit or in2_crit */
|
||||
data->in_crit[index - 41] = inData;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_fan_status(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret = 0;
|
||||
//u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
//int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
ret = g3748cpld_read (data, G3748_FAN_STATUS_REG);
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld fan status read error");
|
||||
|
||||
//if (index == 1) {
|
||||
// devdata = (u8)ret & 0x04;
|
||||
//} else if (index == 2) {
|
||||
// devdata = (u8)ret & 0x08;
|
||||
//}
|
||||
|
||||
return sprintf(buf, "%d\n", (u8)ret);
|
||||
}
|
||||
|
||||
static ssize_t get_fan_fault(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret = 0;
|
||||
u8 fault = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
ret = g3748cpld_read (data, G3748_FAN_STATUS_REG);
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "ERR: fan status read");
|
||||
|
||||
if (index == 1) {
|
||||
if (((u8)ret & 0x04) == 0) {
|
||||
fault = 1; /* not present */
|
||||
}
|
||||
} else if (index == 2) {
|
||||
if (((u8)ret & 0x084) == 0) {
|
||||
fault = 1; /* not present */
|
||||
}
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", fault);
|
||||
}
|
||||
|
||||
static ssize_t get_fan_speed(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret, rpm;
|
||||
//u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
|
||||
ret = g3748cpld_read (data, (G3748_FAN_SPEED_REG + index - 1));
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "ERR");
|
||||
|
||||
rpm = (5000 * 60) / ret;
|
||||
|
||||
return sprintf(buf, "%d\n", rpm);
|
||||
}
|
||||
|
||||
/* G3748 FAN Control Register:
|
||||
* Register value -- total 32 steps (0-31(0x1f)) to control system FAN PWM value (0% to 100%)
|
||||
* RPM -- 0x00:0rpm, 0x0F:8800rpm, 0x1F:17600rpm.
|
||||
* PWM -- 0x00:0%, 0x0F:50%, 0x1F:100%
|
||||
*/
|
||||
static ssize_t get_fan_pwm(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
//u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
u8 pwm;
|
||||
|
||||
ret = g3748cpld_read (data, (G3748_FAN_CONTROL_REG + index - 1));
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld fan ctrl read error");
|
||||
|
||||
ret = ret & 0x1F;
|
||||
if (ret == 0x1F) {
|
||||
pwm = 100;
|
||||
} else if (ret == 0) {
|
||||
pwm = 0;
|
||||
} else {
|
||||
pwm = (u8)((ret * 100) / 31);
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", pwm);
|
||||
}
|
||||
|
||||
static ssize_t set_fan_pwm(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
//struct i2c_client *client = data->client;
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
u8 temp;
|
||||
int error;
|
||||
u8 regVal = 0;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error)
|
||||
return error;
|
||||
if (temp > 100) {
|
||||
temp = 100;
|
||||
} else if (temp < 0) {
|
||||
temp = 0;
|
||||
}
|
||||
regVal = (u8)((int)temp * 31 / 100);
|
||||
|
||||
g3748cpld_write (data, (G3748_FAN_CONTROL_REG + index - 1), regVal);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_fan_target(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
//u8 devdata = 0;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
int rpm;
|
||||
|
||||
ret = g3748cpld_read (data, (G3748_FAN_CONTROL_REG + index - 1));
|
||||
if (ret < 0)
|
||||
return sprintf(buf, "cpld fan ctrl read error");
|
||||
|
||||
ret = ret & 0x1F;
|
||||
if (ret == 0x1F) {
|
||||
rpm = 17600;
|
||||
} else if (ret == 0) {
|
||||
rpm = 0;
|
||||
} else {
|
||||
rpm = (ret * 17600) / 31;
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", rpm);
|
||||
}
|
||||
|
||||
static ssize_t set_fan_target(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
//struct i2c_client *client = data->client;
|
||||
int index = to_sensor_dev_attr_2(da)->index;
|
||||
int temp;
|
||||
int error;
|
||||
u8 regVal = 0;
|
||||
|
||||
error = kstrtou32(buf, 10, (u32 *)&temp);
|
||||
if (error)
|
||||
return error;
|
||||
if (temp > 17600) {
|
||||
temp = 17600;
|
||||
} else if (temp < 0) {
|
||||
temp = 0;
|
||||
}
|
||||
regVal = (u8)((temp * 31) / 17600);
|
||||
|
||||
g3748cpld_write (data, (G3748_FAN_CONTROL_REG + index - 1), regVal);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_psu_frontled_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_PSU_FRONTLED_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: psu reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_psu_frontled_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_PSU_FRONTLED_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_fan_sys_frontled_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_FAN_SYS_FRONTLED_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: fan_sys reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_fan_sys_frontled_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_FAN_SYS_FRONTLED_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_wdt_timer_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_WDT_TIMER_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: WDT Timer reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_wdt_timer_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_WDT_TIMER_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_wdt_ctrl_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_WDT_CTRL_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: WDT Ctrl reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_wdt_ctrl_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_WDT_CTRL_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_wdt_intr_cnt_mask_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_WDT_INTR_CNT_MASK_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: WDT Intr Count Mask reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_wdt_intr_cnt_mask_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_WDT_INTR_CNT_MASK_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_wdt_intr_flag_reg(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
int ret;
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
|
||||
ret = g3748cpld_read (data, G3748_WDT_INTR_FLAG_REG);
|
||||
if (ret < 0) {
|
||||
return sprintf(buf, "ERR: WDT Intr Flag reg read");
|
||||
}
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_wdt_intr_flag_reg(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u8 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou8(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
g3748cpld_write (data, G3748_WDT_INTR_FLAG_REG, temp);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t get_wdt_timeout(struct device *dev, struct device_attribute *da, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%u\n", gTimeout);
|
||||
}
|
||||
|
||||
static ssize_t set_wdt_timeout(struct device *dev, struct device_attribute *da, const char *buf, size_t count)
|
||||
{
|
||||
struct cpld_data *data = dev_get_drvdata(dev);
|
||||
u32 temp;
|
||||
int error;
|
||||
|
||||
error = kstrtou32(buf, 10, &temp);
|
||||
if (error) {
|
||||
return error;
|
||||
}
|
||||
|
||||
gTimeout = temp;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, get_power_good, NULL, 1); /* PSU1 voltage (power good) */
|
||||
static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, get_power_good, NULL, 2); /* PSU2 voltage (power good) */
|
||||
static SENSOR_DEVICE_ATTR(in1_min, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 11); /* PSU1 voltage min */
|
||||
static SENSOR_DEVICE_ATTR(in2_min, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 12); /* PSU2 voltage min */
|
||||
static SENSOR_DEVICE_ATTR(in1_max, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 21); /* PSU1 voltage max */
|
||||
static SENSOR_DEVICE_ATTR(in2_max, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 22); /* PSU2 voltage max */
|
||||
static SENSOR_DEVICE_ATTR(in1_lcrit, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 31); /* PSU1 voltage lcrit */
|
||||
static SENSOR_DEVICE_ATTR(in2_lcrit, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 32); /* PSU2 voltage lcrit */
|
||||
static SENSOR_DEVICE_ATTR(in1_crit, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 41); /* PSU1 voltage crit */
|
||||
static SENSOR_DEVICE_ATTR(in2_crit, S_IRUGO | S_IWUSR, get_voltage_limit, set_voltage_limit, 42); /* PSU2 voltage crit */
|
||||
|
||||
static SENSOR_DEVICE_ATTR(pwm1, S_IWUSR | S_IRUGO, get_fan_pwm, set_fan_pwm, 1);
|
||||
static SENSOR_DEVICE_ATTR(pwm2, S_IWUSR | S_IRUGO, get_fan_pwm, set_fan_pwm, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan1_input, S_IRUGO, get_fan_speed, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan2_input, S_IRUGO, get_fan_speed, NULL, 2);
|
||||
static SENSOR_DEVICE_ATTR(fan1_target, S_IRUGO | S_IWUSR, get_fan_target, set_fan_target, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan2_target, S_IRUGO | S_IWUSR, get_fan_target, set_fan_target, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan1_fault, S_IRUGO, get_fan_fault, NULL, 1);
|
||||
static SENSOR_DEVICE_ATTR(fan2_fault, S_IRUGO, get_fan_fault, NULL, 2);
|
||||
|
||||
static struct attribute *cpld_hwmon_attrs[] = {
|
||||
&sensor_dev_attr_in1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_min.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_max.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_lcrit.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_lcrit.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_crit.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_crit.dev_attr.attr,
|
||||
|
||||
&sensor_dev_attr_pwm1.dev_attr.attr,
|
||||
&sensor_dev_attr_pwm2.dev_attr.attr,
|
||||
&sensor_dev_attr_fan1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_fan2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_fan1_target.dev_attr.attr,
|
||||
&sensor_dev_attr_fan2_target.dev_attr.attr,
|
||||
&sensor_dev_attr_fan1_fault.dev_attr.attr,
|
||||
&sensor_dev_attr_fan2_fault.dev_attr.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
ATTRIBUTE_GROUPS(cpld_hwmon);
|
||||
#if 0
|
||||
static const struct attribute_group cpld_hwmon_group = {
|
||||
.attrs = cpld_hwmon_attrs,
|
||||
};
|
||||
#endif
|
||||
|
||||
static SENSOR_DEVICE_ATTR(cpld_version, S_IRUGO, get_cpld_ver, NULL, 0x00);
|
||||
static SENSOR_DEVICE_ATTR(psu_status, S_IRUGO, get_psu_status, NULL, 0); /* PSU Status Register */
|
||||
static SENSOR_DEVICE_ATTR(fan_status, S_IRUGO, get_fan_status, NULL, 0); /* FAN Status Register */
|
||||
static SENSOR_DEVICE_ATTR(fan_sys_frontled, S_IRUGO | S_IWUSR, get_fan_sys_frontled_reg, set_fan_sys_frontled_reg, 0); /* FAN front panel LED */
|
||||
static SENSOR_DEVICE_ATTR(psu_frontled, S_IRUGO | S_IWUSR, get_psu_frontled_reg, set_psu_frontled_reg, 0); /* PSU front panel LED */
|
||||
|
||||
static SENSOR_DEVICE_ATTR(wdt_timer, S_IRUGO | S_IWUSR, get_wdt_timer_reg, set_wdt_timer_reg, 0);
|
||||
static SENSOR_DEVICE_ATTR(wdt_ctrl, S_IRUGO | S_IWUSR, get_wdt_ctrl_reg, set_wdt_ctrl_reg, 0);
|
||||
static SENSOR_DEVICE_ATTR(wdt_intr_cnt_mask, S_IRUGO | S_IWUSR, get_wdt_intr_cnt_mask_reg, set_wdt_intr_cnt_mask_reg, 0);
|
||||
static SENSOR_DEVICE_ATTR(wdt_intr_flag, S_IRUGO | S_IWUSR, get_wdt_intr_flag_reg, set_wdt_intr_flag_reg, 0);
|
||||
static SENSOR_DEVICE_ATTR(wdt_timeout, S_IRUGO | S_IWUSR, get_wdt_timeout, set_wdt_timeout, 0);
|
||||
|
||||
static struct attribute *cpld_sysfs_attrs[] = {
|
||||
&sensor_dev_attr_cpld_version.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_status.dev_attr.attr,
|
||||
&sensor_dev_attr_fan_status.dev_attr.attr,
|
||||
&sensor_dev_attr_fan_sys_frontled.dev_attr.attr,
|
||||
&sensor_dev_attr_psu_frontled.dev_attr.attr,
|
||||
|
||||
&sensor_dev_attr_wdt_timer.dev_attr.attr,
|
||||
&sensor_dev_attr_wdt_ctrl.dev_attr.attr,
|
||||
&sensor_dev_attr_wdt_intr_cnt_mask.dev_attr.attr,
|
||||
&sensor_dev_attr_wdt_intr_flag.dev_attr.attr,
|
||||
&sensor_dev_attr_wdt_timeout.dev_attr.attr,
|
||||
|
||||
NULL
|
||||
};
|
||||
|
||||
static const struct attribute_group cpld_sysfs_group = {
|
||||
.attrs = cpld_sysfs_attrs,
|
||||
};
|
||||
|
||||
/* Return 0 if detection is successful, -ENODEV otherwise */
|
||||
static int g3748cpld_detect(struct i2c_client *new_client, struct i2c_board_info *info)
|
||||
{
|
||||
struct i2c_adapter *adapter = new_client->adapter;
|
||||
int conf;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -ENODEV;
|
||||
|
||||
/* Unused bits */
|
||||
conf = i2c_smbus_read_byte_data(new_client, 0);
|
||||
if (!conf)
|
||||
return -ENODEV;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void g3748cpld_add_client (struct i2c_client *client)
|
||||
{
|
||||
struct cpld_data *data;
|
||||
|
||||
data = devm_kzalloc(&client->dev, sizeof(struct cpld_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
dev_info(&client->dev, "Can't allocate cpld_client_node (0x%x)\n", client->addr);
|
||||
return;
|
||||
}
|
||||
|
||||
data->client = client;
|
||||
i2c_set_clientdata(client, data);
|
||||
mutex_init(&data->update_lock);
|
||||
}
|
||||
|
||||
static int g3748cpld_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
||||
{
|
||||
int status;
|
||||
struct cpld_data *data;
|
||||
int err;
|
||||
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_info(&client->dev, "i2c_check_functionality failed (0x%x)\n", client->addr);
|
||||
status = -EIO;
|
||||
return status;
|
||||
}
|
||||
|
||||
dev_info(&client->dev, "chip found - CPLD\n");
|
||||
g3748cpld_add_client(client);
|
||||
|
||||
/* Register sysfs hooks */
|
||||
//printk(KERN_INFO "g3748cpld_probe: Register sysfs hooks\n");
|
||||
status = sysfs_create_group(&client->dev.kobj, &cpld_sysfs_group);
|
||||
if (status) {
|
||||
printk(KERN_INFO "g3748cpld cannot create sysfs\n");
|
||||
}
|
||||
|
||||
data = i2c_get_clientdata(client);
|
||||
//data->hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, client->name, data, cpld_hwmon_groups);
|
||||
data->hwmon_dev = hwmon_device_register_with_groups(&client->dev, client->name, data, cpld_hwmon_groups);
|
||||
|
||||
if (IS_ERR(data->hwmon_dev)) {
|
||||
err = PTR_ERR(data->hwmon_dev);
|
||||
goto exit_remove_files;
|
||||
}
|
||||
|
||||
initCpldDataReg(data);
|
||||
dev_info(&client->dev, "%s: sensor '%s'\n", dev_name(data->hwmon_dev), client->name);
|
||||
return 0;
|
||||
|
||||
exit_remove_files:
|
||||
sysfs_remove_group(&client->dev.kobj, &cpld_sysfs_group);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int g3748cpld_remove(struct i2c_client *client)
|
||||
{
|
||||
struct cpld_data *data = i2c_get_clientdata(client);
|
||||
|
||||
hwmon_device_unregister(data->hwmon_dev);
|
||||
//devm_hwmon_device_unregister(&client->dev);
|
||||
sysfs_remove_group(&client->dev.kobj, &cpld_sysfs_group);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id g3748cpld_id[] = {
|
||||
{ "g3748cpld", 0 },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, g3748cpld_id);
|
||||
|
||||
static struct i2c_driver g3748cpld_driver = {
|
||||
.class = I2C_CLASS_HWMON,
|
||||
.driver = {
|
||||
.name = "g3748cpld",
|
||||
},
|
||||
.probe = g3748cpld_probe,
|
||||
.remove = g3748cpld_remove,
|
||||
.id_table = g3748cpld_id,
|
||||
.detect = g3748cpld_detect,
|
||||
.address_list = normal_i2c,
|
||||
};
|
||||
|
||||
module_i2c_driver(g3748cpld_driver);
|
||||
|
||||
MODULE_AUTHOR("SMC <support@supermicro.com>");
|
||||
MODULE_DESCRIPTION("SMC SSE-G3748 CPLD driver");
|
||||
MODULE_LICENSE("GPL");
|
@ -0,0 +1,591 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* I2C multiplexer
|
||||
*
|
||||
* Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
|
||||
* Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
|
||||
*
|
||||
* This module supports the PCA954x and PCA984x series of I2C multiplexer/switch
|
||||
* chips made by NXP Semiconductors.
|
||||
* This includes the:
|
||||
* PCA9540, PCA9542, PCA9543, PCA9544, PCA9545, PCA9546, PCA9547,
|
||||
* PCA9548, PCA9846, PCA9847, PCA9848 and PCA9849.
|
||||
*
|
||||
* These chips are all controlled via the I2C bus itself, and all have a
|
||||
* single 8-bit register. The upstream "parent" bus fans out to two,
|
||||
* four, or eight downstream busses or channels; which of these
|
||||
* are selected is determined by the chip type and register contents. A
|
||||
* mux can select only one sub-bus at a time; a switch can select any
|
||||
* combination simultaneously.
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Kumar Gala <galak@kernel.crashing.org>
|
||||
* Copyright (C) 2006
|
||||
*
|
||||
* Based on:
|
||||
* pca954x.c from Ken Harrenstien
|
||||
* Copyright (C) 2004 Google, Inc. (Ken Harrenstien)
|
||||
*
|
||||
* Based on:
|
||||
* i2c-virtual_cb.c from Brian Kuschak <bkuschak@yahoo.com>
|
||||
* and
|
||||
* pca9540.c from Jean Delvare <jdelvare@suse.de>.
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio/consumer.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-mux.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <dt-bindings/mux/mux.h>
|
||||
#include "smc-pca954x.h"
|
||||
|
||||
#define PCA954X_MAX_NCHANS 8
|
||||
|
||||
#define PCA954X_IRQ_OFFSET 4
|
||||
|
||||
enum pca_type {
|
||||
pca_9540,
|
||||
pca_9542,
|
||||
pca_9543,
|
||||
pca_9544,
|
||||
pca_9545,
|
||||
pca_9546,
|
||||
pca_9547,
|
||||
pca_9548,
|
||||
pca_9846,
|
||||
pca_9847,
|
||||
pca_9848,
|
||||
pca_9849,
|
||||
};
|
||||
|
||||
struct chip_desc {
|
||||
u8 nchans;
|
||||
u8 enable; /* used for muxes only */
|
||||
u8 has_irq;
|
||||
enum muxtype {
|
||||
pca954x_ismux = 0,
|
||||
pca954x_isswi
|
||||
} muxtype;
|
||||
struct i2c_device_identity id;
|
||||
};
|
||||
|
||||
struct pca954x {
|
||||
const struct chip_desc *chip;
|
||||
|
||||
u8 last_chan; /* last register value */
|
||||
/* MUX_IDLE_AS_IS, MUX_IDLE_DISCONNECT or >= 0 for channel */
|
||||
s32 idle_state;
|
||||
|
||||
struct i2c_client *client;
|
||||
|
||||
struct irq_domain *irq;
|
||||
unsigned int irq_mask;
|
||||
raw_spinlock_t lock;
|
||||
};
|
||||
|
||||
/* Provide specs for the PCA954x types we know about */
|
||||
static const struct chip_desc chips[] = {
|
||||
[pca_9540] = {
|
||||
.nchans = 2,
|
||||
.enable = 0x4,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9542] = {
|
||||
.nchans = 2,
|
||||
.enable = 0x4,
|
||||
.has_irq = 1,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9543] = {
|
||||
.nchans = 2,
|
||||
.has_irq = 1,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9544] = {
|
||||
.nchans = 4,
|
||||
.enable = 0x4,
|
||||
.has_irq = 1,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9545] = {
|
||||
.nchans = 4,
|
||||
.has_irq = 1,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9546] = {
|
||||
.nchans = 4,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9547] = {
|
||||
.nchans = 8,
|
||||
.enable = 0x8,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9548] = {
|
||||
.nchans = 8,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = { .manufacturer_id = I2C_DEVICE_ID_NONE },
|
||||
},
|
||||
[pca_9846] = {
|
||||
.nchans = 4,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = {
|
||||
.manufacturer_id = I2C_DEVICE_ID_NXP_SEMICONDUCTORS,
|
||||
.part_id = 0x10b,
|
||||
},
|
||||
},
|
||||
[pca_9847] = {
|
||||
.nchans = 8,
|
||||
.enable = 0x8,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = {
|
||||
.manufacturer_id = I2C_DEVICE_ID_NXP_SEMICONDUCTORS,
|
||||
.part_id = 0x108,
|
||||
},
|
||||
},
|
||||
[pca_9848] = {
|
||||
.nchans = 8,
|
||||
.muxtype = pca954x_isswi,
|
||||
.id = {
|
||||
.manufacturer_id = I2C_DEVICE_ID_NXP_SEMICONDUCTORS,
|
||||
.part_id = 0x10a,
|
||||
},
|
||||
},
|
||||
[pca_9849] = {
|
||||
.nchans = 4,
|
||||
.enable = 0x4,
|
||||
.muxtype = pca954x_ismux,
|
||||
.id = {
|
||||
.manufacturer_id = I2C_DEVICE_ID_NXP_SEMICONDUCTORS,
|
||||
.part_id = 0x109,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static const struct i2c_device_id pca954x_id[] = {
|
||||
{ "smc_pca9540", pca_9540 },
|
||||
{ "smc_pca9542", pca_9542 },
|
||||
{ "smc_pca9543", pca_9543 },
|
||||
{ "smc_pca9544", pca_9544 },
|
||||
{ "smc_pca9545", pca_9545 },
|
||||
{ "smc_pca9546", pca_9546 },
|
||||
{ "smc_pca9547", pca_9547 },
|
||||
{ "smc_pca9548", pca_9548 },
|
||||
{ "smc_pca9846", pca_9846 },
|
||||
{ "smc_pca9847", pca_9847 },
|
||||
{ "smc_pca9848", pca_9848 },
|
||||
{ "smc_pca9849", pca_9849 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, pca954x_id);
|
||||
|
||||
/* Force deselect-on-exit feature for PCA954X devices. Default is disabled. */
|
||||
static unsigned int force_deselect_on_exit = 0;
|
||||
module_param(force_deselect_on_exit, uint, S_IRUGO);
|
||||
MODULE_PARM_DESC(force_deselect_on_exit, "Force deselect-on-exit feature for PCA954X devices. Default is disabled.");
|
||||
|
||||
static const struct of_device_id pca954x_of_match[] = {
|
||||
{ .compatible = "nxp,smc_pca9540", .data = &chips[pca_9540] },
|
||||
{ .compatible = "nxp,smc_pca9542", .data = &chips[pca_9542] },
|
||||
{ .compatible = "nxp,smc_pca9543", .data = &chips[pca_9543] },
|
||||
{ .compatible = "nxp,smc_pca9544", .data = &chips[pca_9544] },
|
||||
{ .compatible = "nxp,smc_pca9545", .data = &chips[pca_9545] },
|
||||
{ .compatible = "nxp,smc_pca9546", .data = &chips[pca_9546] },
|
||||
{ .compatible = "nxp,smc_pca9547", .data = &chips[pca_9547] },
|
||||
{ .compatible = "nxp,smc_pca9548", .data = &chips[pca_9548] },
|
||||
{ .compatible = "nxp,smc_pca9846", .data = &chips[pca_9846] },
|
||||
{ .compatible = "nxp,smc_pca9847", .data = &chips[pca_9847] },
|
||||
{ .compatible = "nxp,smc_pca9848", .data = &chips[pca_9848] },
|
||||
{ .compatible = "nxp,smc_pca9849", .data = &chips[pca_9849] },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pca954x_of_match);
|
||||
|
||||
/* Write to mux register. Don't use i2c_transfer()/i2c_smbus_xfer()
|
||||
for this as they will try to lock adapter a second time */
|
||||
static int pca954x_reg_write(struct i2c_adapter *adap,
|
||||
struct i2c_client *client, u8 val)
|
||||
{
|
||||
union i2c_smbus_data dummy;
|
||||
|
||||
return __i2c_smbus_xfer(adap, client->addr, client->flags,
|
||||
I2C_SMBUS_WRITE, val,
|
||||
I2C_SMBUS_BYTE, &dummy);
|
||||
}
|
||||
|
||||
static u8 pca954x_regval(struct pca954x *data, u8 chan)
|
||||
{
|
||||
/* We make switches look like muxes, not sure how to be smarter. */
|
||||
if (data->chip->muxtype == pca954x_ismux)
|
||||
return chan | data->chip->enable;
|
||||
else
|
||||
return 1 << chan;
|
||||
}
|
||||
|
||||
static int pca954x_select_chan(struct i2c_mux_core *muxc, u32 chan)
|
||||
{
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
struct i2c_client *client = data->client;
|
||||
u8 regval;
|
||||
int ret = 0;
|
||||
|
||||
regval = pca954x_regval(data, chan);
|
||||
/* Only select the channel if its different from the last channel */
|
||||
if (data->last_chan != regval) {
|
||||
ret = pca954x_reg_write(muxc->parent, client, regval);
|
||||
data->last_chan = ret < 0 ? 0 : regval;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pca954x_deselect_mux(struct i2c_mux_core *muxc, u32 chan)
|
||||
{
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
struct i2c_client *client = data->client;
|
||||
s32 idle_state;
|
||||
|
||||
idle_state = READ_ONCE(data->idle_state);
|
||||
if (idle_state >= 0)
|
||||
/* Set the mux back to a predetermined channel */
|
||||
return pca954x_select_chan(muxc, idle_state);
|
||||
|
||||
if (idle_state == MUX_IDLE_DISCONNECT) {
|
||||
/* Deselect active channel */
|
||||
data->last_chan = 0;
|
||||
return pca954x_reg_write(muxc->parent, client,
|
||||
data->last_chan);
|
||||
}
|
||||
|
||||
/* otherwise leave as-is */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t idle_state_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct i2c_mux_core *muxc = i2c_get_clientdata(client);
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
|
||||
return sprintf(buf, "%d\n", READ_ONCE(data->idle_state));
|
||||
}
|
||||
|
||||
static ssize_t idle_state_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct i2c_mux_core *muxc = i2c_get_clientdata(client);
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
int val;
|
||||
int ret;
|
||||
|
||||
ret = kstrtoint(buf, 0, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (val != MUX_IDLE_AS_IS && val != MUX_IDLE_DISCONNECT &&
|
||||
(val < 0 || val >= data->chip->nchans))
|
||||
return -EINVAL;
|
||||
|
||||
i2c_lock_bus(muxc->parent, I2C_LOCK_SEGMENT);
|
||||
|
||||
WRITE_ONCE(data->idle_state, val);
|
||||
/*
|
||||
* Set the mux into a state consistent with the new
|
||||
* idle_state.
|
||||
*/
|
||||
if (data->last_chan || val != MUX_IDLE_DISCONNECT)
|
||||
ret = pca954x_deselect_mux(muxc, 0);
|
||||
|
||||
i2c_unlock_bus(muxc->parent, I2C_LOCK_SEGMENT);
|
||||
|
||||
return ret < 0 ? ret : count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR_RW(idle_state);
|
||||
|
||||
static irqreturn_t pca954x_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct pca954x *data = dev_id;
|
||||
unsigned long pending;
|
||||
int ret, i;
|
||||
|
||||
ret = i2c_smbus_read_byte(data->client);
|
||||
if (ret < 0)
|
||||
return IRQ_NONE;
|
||||
|
||||
pending = (ret >> PCA954X_IRQ_OFFSET) & (BIT(data->chip->nchans) - 1);
|
||||
for_each_set_bit(i, &pending, data->chip->nchans)
|
||||
handle_nested_irq(irq_linear_revmap(data->irq, i));
|
||||
|
||||
return IRQ_RETVAL(pending);
|
||||
}
|
||||
|
||||
static int pca954x_irq_set_type(struct irq_data *idata, unsigned int type)
|
||||
{
|
||||
if ((type & IRQ_TYPE_SENSE_MASK) != IRQ_TYPE_LEVEL_LOW)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip pca954x_irq_chip = {
|
||||
.name = "i2c-mux-pca954x",
|
||||
.irq_set_type = pca954x_irq_set_type,
|
||||
};
|
||||
|
||||
static int pca954x_irq_setup(struct i2c_mux_core *muxc)
|
||||
{
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
struct i2c_client *client = data->client;
|
||||
int c, irq;
|
||||
|
||||
if (!data->chip->has_irq || client->irq <= 0)
|
||||
return 0;
|
||||
|
||||
raw_spin_lock_init(&data->lock);
|
||||
|
||||
data->irq = irq_domain_add_linear(client->dev.of_node,
|
||||
data->chip->nchans,
|
||||
&irq_domain_simple_ops, data);
|
||||
if (!data->irq)
|
||||
return -ENODEV;
|
||||
|
||||
for (c = 0; c < data->chip->nchans; c++) {
|
||||
irq = irq_create_mapping(data->irq, c);
|
||||
if (!irq) {
|
||||
dev_err(&client->dev, "failed irq create map\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
irq_set_chip_data(irq, data);
|
||||
irq_set_chip_and_handler(irq, &pca954x_irq_chip,
|
||||
handle_simple_irq);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pca954x_cleanup(struct i2c_mux_core *muxc)
|
||||
{
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
int c, irq;
|
||||
|
||||
if (data->irq) {
|
||||
for (c = 0; c < data->chip->nchans; c++) {
|
||||
irq = irq_find_mapping(data->irq, c);
|
||||
irq_dispose_mapping(irq);
|
||||
}
|
||||
irq_domain_remove(data->irq);
|
||||
}
|
||||
i2c_mux_del_adapters(muxc);
|
||||
}
|
||||
|
||||
static int pca954x_init(struct i2c_client *client, struct pca954x *data)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk("pca954x_init is called\n");
|
||||
if (data->idle_state >= 0)
|
||||
data->last_chan = pca954x_regval(data, data->idle_state);
|
||||
else
|
||||
data->last_chan = 0; /* Disconnect multiplexer */
|
||||
|
||||
ret = i2c_smbus_write_byte(client, data->last_chan);
|
||||
if (ret < 0)
|
||||
data->last_chan = 0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* I2C init/probing/exit functions
|
||||
*/
|
||||
static int pca954x_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct i2c_adapter *adap = client->adapter;
|
||||
struct pca954x_platform_data *pdata = dev_get_platdata(&client->dev);
|
||||
struct device *dev = &client->dev;
|
||||
struct gpio_desc *gpio;
|
||||
struct i2c_mux_core *muxc;
|
||||
struct pca954x *data;
|
||||
int num, force;
|
||||
int ret;
|
||||
|
||||
printk("pca954x_probe is called\n");
|
||||
if (!i2c_check_functionality(adap, I2C_FUNC_SMBUS_BYTE))
|
||||
return -ENODEV;
|
||||
|
||||
muxc = i2c_mux_alloc(adap, dev, PCA954X_MAX_NCHANS, sizeof(*data), 0,
|
||||
pca954x_select_chan, pca954x_deselect_mux);
|
||||
if (!muxc)
|
||||
return -ENOMEM;
|
||||
data = i2c_mux_priv(muxc);
|
||||
|
||||
i2c_set_clientdata(client, muxc);
|
||||
data->client = client;
|
||||
|
||||
/* Reset the mux if a reset GPIO is specified. */
|
||||
gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH);
|
||||
if (IS_ERR(gpio))
|
||||
return PTR_ERR(gpio);
|
||||
if (gpio) {
|
||||
udelay(1);
|
||||
gpiod_set_value_cansleep(gpio, 0);
|
||||
/* Give the chip some time to recover. */
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
data->chip = device_get_match_data(dev);
|
||||
if (!data->chip)
|
||||
data->chip = &chips[id->driver_data];
|
||||
|
||||
if (data->chip->id.manufacturer_id != I2C_DEVICE_ID_NONE) {
|
||||
struct i2c_device_identity id;
|
||||
|
||||
ret = i2c_get_device_id(client, &id);
|
||||
if (ret && ret != -EOPNOTSUPP)
|
||||
return ret;
|
||||
|
||||
if (!ret &&
|
||||
(id.manufacturer_id != data->chip->id.manufacturer_id ||
|
||||
id.part_id != data->chip->id.part_id)) {
|
||||
dev_warn(dev, "unexpected device id %03x-%03x-%x\n",
|
||||
id.manufacturer_id, id.part_id,
|
||||
id.die_revision);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
data->idle_state = MUX_IDLE_AS_IS;
|
||||
if (device_property_read_u32(dev, "idle-state", &data->idle_state)) {
|
||||
if (device_property_read_bool(dev, "i2c-mux-idle-disconnect"))
|
||||
data->idle_state = MUX_IDLE_DISCONNECT;
|
||||
}
|
||||
if (force_deselect_on_exit)
|
||||
data->idle_state = MUX_IDLE_DISCONNECT;
|
||||
printk("pca954x_probe: data->idle_state = %d\n", data->idle_state);
|
||||
|
||||
/*
|
||||
* Write the mux register at addr to verify
|
||||
* that the mux is in fact present. This also
|
||||
* initializes the mux to a channel
|
||||
* or disconnected state.
|
||||
*/
|
||||
ret = pca954x_init(client, data);
|
||||
if (ret < 0) {
|
||||
dev_warn(dev, "probe failed\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = pca954x_irq_setup(muxc);
|
||||
if (ret)
|
||||
goto fail_cleanup;
|
||||
|
||||
/* Now create an adapter for each channel */
|
||||
for (num = 0; num < data->chip->nchans; num++) {
|
||||
force = 0; /* dynamic adap number */
|
||||
if (pdata) {
|
||||
if (num < pdata->num_modes) {
|
||||
/* force static number */
|
||||
force = pdata->modes[num].adap_id;
|
||||
} else
|
||||
/* discard unconfigured channels */
|
||||
break;
|
||||
}
|
||||
|
||||
ret = i2c_mux_add_adapter(muxc, force, num, 0);
|
||||
if (ret)
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
if (data->irq) {
|
||||
ret = devm_request_threaded_irq(dev, data->client->irq,
|
||||
NULL, pca954x_irq_handler,
|
||||
IRQF_ONESHOT | IRQF_SHARED,
|
||||
"pca954x", data);
|
||||
if (ret)
|
||||
goto fail_cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* The attr probably isn't going to be needed in most cases,
|
||||
* so don't fail completely on error.
|
||||
*/
|
||||
device_create_file(dev, &dev_attr_idle_state);
|
||||
|
||||
/* dev_info(dev, "registered %d multiplexed busses for I2C %s %s\n",
|
||||
*/
|
||||
printk("registered %d multiplexed busses for I2C %s %s\n",
|
||||
num, data->chip->muxtype == pca954x_ismux
|
||||
? "mux" : "switch", client->name);
|
||||
|
||||
return 0;
|
||||
|
||||
fail_cleanup:
|
||||
pca954x_cleanup(muxc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pca954x_remove(struct i2c_client *client)
|
||||
{
|
||||
struct i2c_mux_core *muxc = i2c_get_clientdata(client);
|
||||
|
||||
device_remove_file(&client->dev, &dev_attr_idle_state);
|
||||
|
||||
pca954x_cleanup(muxc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int pca954x_resume(struct device *dev)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct i2c_mux_core *muxc = i2c_get_clientdata(client);
|
||||
struct pca954x *data = i2c_mux_priv(muxc);
|
||||
int ret;
|
||||
|
||||
ret = pca954x_init(client, data);
|
||||
if (ret < 0)
|
||||
dev_err(&client->dev, "failed to verify mux presence\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(pca954x_pm, NULL, pca954x_resume);
|
||||
|
||||
static struct i2c_driver pca954x_driver = {
|
||||
.driver = {
|
||||
.name = "smc_pca954x",
|
||||
.pm = &pca954x_pm,
|
||||
.of_match_table = pca954x_of_match,
|
||||
},
|
||||
.probe = pca954x_probe,
|
||||
.remove = pca954x_remove,
|
||||
.id_table = pca954x_id,
|
||||
};
|
||||
|
||||
module_i2c_driver(pca954x_driver);
|
||||
|
||||
MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
|
||||
MODULE_DESCRIPTION("PCA954x I2C mux/switch driver");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -0,0 +1,44 @@
|
||||
/*
|
||||
*
|
||||
* cls-pca954x.h - I2C multiplexer/switch support
|
||||
*
|
||||
* Copyright (c) 2008-2009 Rodolfo Giometti <giometti@linux.it>
|
||||
* Copyright (c) 2008-2009 Eurotech S.p.A. <info@eurotech.it>
|
||||
* Michael Lawnick <michael.lawnick.ext@nsn.com>
|
||||
*
|
||||
* 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_PCA954X_H
|
||||
#define _LINUX_I2C_PCA954X_H
|
||||
|
||||
/* Platform data for the PCA954x I2C multiplexers */
|
||||
|
||||
/* Per channel initialisation data:
|
||||
* @adap_id: bus number for the adapter. 0 = don't care
|
||||
*
|
||||
*/
|
||||
struct pca954x_platform_mode {
|
||||
int adap_id;
|
||||
};
|
||||
|
||||
/* Per mux/switch data, used with i2c_register_board_info */
|
||||
struct pca954x_platform_data {
|
||||
struct pca954x_platform_mode *modes;
|
||||
int num_modes;
|
||||
};
|
||||
|
||||
#endif /* _LINUX_I2C_PCA954X_H */
|
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/python
|
||||
import os
|
||||
import sys
|
||||
from sys import argv
|
||||
import re
|
||||
|
||||
# Quit if user doesn't input all the required variables
|
||||
|
||||
if len(argv) < 3 or len(argv) > 5:
|
||||
print('\n' + 'Usage: add_port_range EthernetX-X vlan <vid> [OPTIONS] ' + '\n' + '\n' +
|
||||
'Add ports as Tagged/Untagged and configure VLAN onto them' + '\n' + '\n' +
|
||||
'OPTIONS:' + '\n' +
|
||||
'-u, --untagged' + '\n' +
|
||||
'-h, ?, -?, --help Show this message and exit' + '\n')
|
||||
quit()
|
||||
|
||||
|
||||
# Quit if user inputs 'help' options
|
||||
|
||||
if '?' in argv or '--help' in argv or '-help' in argv or 'help' in argv or '-?' in argv or '-h' in argv:
|
||||
print('\n' + 'Usage: add_port_range EthernetX-X vlan <vid> [OPTIONS] ' + '\n' + '\n' +
|
||||
'Add ports as Tagged/Untagged and configure VLAN onto them' + '\n' + '\n' +
|
||||
'OPTIONS:' + '\n' +
|
||||
'-u, --untagged' + '\n' +
|
||||
'-h, ?, -?, --help Show this message and exit' + '\n')
|
||||
quit()
|
||||
|
||||
# User has to pass the VLAN argument using atleast the first two letters i.e. 'V/v' 'L/l'
|
||||
pattern = '[Vv]+[Ll]'
|
||||
|
||||
def match(text):
|
||||
if re.match(pattern,text):
|
||||
return ('Yes')
|
||||
else:
|
||||
return('No')
|
||||
|
||||
if ((match(argv[2]) == 'Yes') and (int(argv[3]) < 4094)):
|
||||
command2 = 'sudo config vlan add ' + str(argv[3])
|
||||
os.system(command2)
|
||||
else:
|
||||
print('\n' + 'Usage: add_port_range EthernetX-X vlan <vid> [OPTIONS] ' + '\n' + '\n' +
|
||||
'Add ports as Tagged/Untagged and configure VLAN onto them' + '\n' + '\n' +
|
||||
'OPTIONS:' + '\n' +
|
||||
'-u, --untagged' + '\n' +
|
||||
'-h, ?, -?, --help Show this message and exit' + '\n')
|
||||
quit()
|
||||
|
||||
#Find and create a list of all the interfaces
|
||||
int_range1 = re.findall('[0-9]+-[0-9]+',argv[1])
|
||||
int_range = int_range1[0].split('-')
|
||||
|
||||
#Add ports as untagged
|
||||
|
||||
if ((match(argv[2]) == 'Yes') and ('-u' in argv)):
|
||||
|
||||
for interface in range(int(int_range[0]),int(int_range[1])):
|
||||
os.system('sudo config vlan member add -u ' + str(argv[3]) + ' Ethernet' + str(interface))
|
||||
|
||||
#Add ports as tagged
|
||||
|
||||
elif ((match(argv[2]) == 'Yes') and len(argv)) == 4:
|
||||
|
||||
for interface in range(int(int_range[0]),int(int_range[1])):
|
||||
os.system('sudo config vlan member add ' + str(argv[3]) + ' Ethernet' + str(interface))
|
||||
|
||||
else:
|
||||
print('\n' + 'Usage: add_port_range EthernetX-X vlan <vid> [OPTIONS] ' + '\n' + '\n' +
|
||||
'Add ports as Tagged/Untagged and configure VLAN onto them' + '\n' + '\n' +
|
||||
'OPTIONS:' + '\n' +
|
||||
'-u, --untagged' + '\n' +
|
||||
'-h, ?, -?, --help Show this message and exit' + '\n')
|
||||
quit()
|
||||
|
@ -0,0 +1,19 @@
|
||||
#!/usr/bin/python
|
||||
import fcntl, struct
|
||||
import time
|
||||
from os import path
|
||||
|
||||
RNDADDENTROPY=0x40085203
|
||||
|
||||
def avail():
|
||||
with open("/proc/sys/kernel/random/entropy_avail", mode='r') as avail:
|
||||
return int(avail.read())
|
||||
|
||||
if path.exists("/proc/sys/kernel/random/entropy_avail"):
|
||||
while 1:
|
||||
while avail() < 2048:
|
||||
with open('/dev/urandom', 'rb') as urnd, open("/dev/random", mode='wb') as rnd:
|
||||
d = urnd.read(512)
|
||||
t = struct.pack('ii', 4 * len(d), len(d)) + d
|
||||
fcntl.ioctl(rnd, RNDADDENTROPY, t)
|
||||
time.sleep(30)
|
@ -0,0 +1,84 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
# This script is used to reset the current host file system and docker containers
|
||||
# to the initial state of the firmware.
|
||||
|
||||
# Because this is a factory reset hook, execute the script only if the hook script is
|
||||
# either executed directorly or called as "config-setup factory" command
|
||||
if [ -n $CMD ] && [ "$CMD" != "" ]; then
|
||||
if [ "$CMD" != "factory" ]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# if called from the sonic cli, then python click has already confirmed
|
||||
# this, so just set var_yn to y here.
|
||||
|
||||
if [ ! -r /tmp/sonic_cli_factory_reset ]; then
|
||||
# if called by the monitor script then no ask confirm
|
||||
PARENT_COMMAND=$(ps -o args= $PPID)
|
||||
if [[ "$PARENT_COMMAND" != *"reset_button_monitor.py"* ]]; then
|
||||
cat << EOF
|
||||
This command will reset settings to factory defaults.
|
||||
After resetting to factory defaults, switch will be reloaded immediately.
|
||||
Do you really want to execute this command and reload the switch? [y/n]
|
||||
EOF
|
||||
|
||||
read var_yn
|
||||
if [ "$var_yn" != "y" ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
var_yn="y"
|
||||
fi
|
||||
|
||||
|
||||
if [ "$EUID" -ne 0 ]
|
||||
then echo "Root privileges are required for this operation"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# PB issue: 156474: Enable ZTP back.-start
|
||||
ztp enable -y
|
||||
ztp run -y
|
||||
# PB issue: 156474: Enable ZTP back.-end
|
||||
|
||||
# if there is any backup config saved via the command "config-setup backup"
|
||||
# then remove it during factory reset, else these configs will get applied
|
||||
# after factory reset.
|
||||
|
||||
if [ -d /host/old_config ]; then
|
||||
rm -rf /host/old_config
|
||||
fi
|
||||
|
||||
# stop SONiC services to prevent docker restart
|
||||
# keep syslog for debugging
|
||||
grep -v @ /etc/sonic/generated_services.conf | grep -v rsyslog-config.service | xargs systemctl disable
|
||||
grep -v @ /etc/sonic/generated_services.conf | grep -v rsyslog-config.service | xargs systemctl stop
|
||||
|
||||
# rm docker containers
|
||||
docker ps -aq | xargs docker rm -f
|
||||
|
||||
# rm overlay upper dir, ex: /host/image-3.0.0.5/rw
|
||||
UPPER=`mount | grep "root-overlay on /" | sed 's/.*upperdir=\/root\([^,]*\),.*/\1/'`
|
||||
rm -rf $UPPER
|
||||
WORK=`mount | grep "root-overlay on /" | sed 's/.*workdir=\/root\([^)]*\)).*/\1/'`
|
||||
rm -rf $WORK
|
||||
sync;sync
|
||||
echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
# rm other files in /host/
|
||||
|
||||
# create "image-xxx/platform/firsttime"
|
||||
IMGPATH=`dirname $UPPER`
|
||||
touch "$IMGPATH/platform/firsttime"
|
||||
sync;sync
|
||||
|
||||
rm -f /etc/sonic/config_db.json
|
||||
|
||||
# force reboot if called by user
|
||||
if [ "$var_yn" == "y" ]; then
|
||||
shutdown -r now
|
||||
fi
|
||||
|
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import os
|
||||
|
||||
command1 = ""
|
||||
command2 = "sudo config vlan add 10"
|
||||
command3 = ""
|
||||
os.system(command2)
|
||||
for interface in range(0,54):
|
||||
command1 = ('sudo config interface ip remove Ethernet' + str(interface) + " " + '10.0.0.' + str(interface*2) + '/31' + '\n')
|
||||
os.system(command1)
|
||||
command3 = "sudo config vlan member add -u 10 Ethernet" + str(interface) + '\n'
|
||||
os.system(command3)
|
@ -0,0 +1,88 @@
|
||||
#!/usr/bin/python
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import time
|
||||
import sys
|
||||
|
||||
interface_output = str(os.popen('show interface stat').read())
|
||||
pattern_int = re.findall('Ethernet[0-9]+',interface_output)
|
||||
|
||||
os.system('sudo config feature state iccpd enabled')
|
||||
mclag_output = str(os.popen('mclagdctl dump state').read())
|
||||
|
||||
commands = []
|
||||
|
||||
if not mclag_output:
|
||||
|
||||
commands = commands + ['show platform syseeprom', 'show version', 'show boot', 'show tacacs', 'show radius', 'show aaa',
|
||||
'show platform psustatus', 'show platform pcieinfo', 'show platform temp',
|
||||
'show platform summary', 'show platform firmware status',
|
||||
'show platform fan', 'show interface status', 'sudo ifconfig -a', 'show ip interface',
|
||||
'show vlan brief', 'show lldp neighbors' , 'show lldp table', 'show ztp status', 'show ip bgp summary', 'show ip bgp neighbors', 'show route-map',
|
||||
'show interface portchannel', 'show ip route', 'sudo route -n', 'show arp', 'sudo arp -n', 'show mac',
|
||||
'show acl rule', 'sudo aclshow -a -vv', 'show acl table', 'show interface counters -a', 'show int autoneg status',
|
||||
'mclagdctl dump state','sudo show system-health detail', 'show system-mem',
|
||||
'docker ps', 'top -n 1', 'show uptime', 'show reboot-cause history',
|
||||
'sudo show system-health summary','show int transceiver presence', 'show int transceiver eeprom', 'show int transceiver error-status',
|
||||
'show int transceiver lpmode', 'show clock', 'show ntp', 'sudo timedatectl status', 'show runningconfiguration all']
|
||||
|
||||
else:
|
||||
|
||||
mclag_domain = re.findall('Domain id: [0-9]+',mclag_output)
|
||||
mclag_final = mclag_domain[0].split(':')
|
||||
commands = commands + ['show platform syseeprom', 'show version', 'show boot', 'show tacacs', 'show radius', 'show aaa',
|
||||
'show platform psustatus', 'show platform pcieinfo', 'show platform temp',
|
||||
'show platform summary', 'show platform firmware status',
|
||||
'show platform fan', 'show interface status', 'sudo ifconfig -a', 'show ip interface',
|
||||
'show vlan brief', 'show lldp neighbors' , 'show lldp table', 'show ztp status', 'show ip bgp summary', 'show ip bgp neighbors', 'show route-map',
|
||||
'show interface portchannel', 'show ip route', 'sudo route -n', 'show arp', 'sudo arp -n', 'show mac',
|
||||
'show acl rule', 'sudo aclshow -a -vv', 'show acl table', 'show interface counters -a', 'show int autoneg status',
|
||||
'mclagdctl dump state', ('mclagdctl dump mac -i ' + str(mclag_final[1])), ('mclagdctl dump arp -i ' + str(mclag_final[1])),
|
||||
'sudo show system-health detail', 'show system-mem',
|
||||
'docker ps', 'top -n 1', 'show uptime', 'show reboot-cause history',
|
||||
'sudo show system-health summary','show int transceiver presence', 'show int transceiver eeprom', 'show int transceiver error-status',
|
||||
'show int transceiver lpmode', 'show clock', 'show ntp', 'sudo timedatectl status', 'show runningconfiguration all']
|
||||
|
||||
output = ''
|
||||
|
||||
print('Fetching data....This might take a few minutes...')
|
||||
|
||||
toolbar_width = 83
|
||||
|
||||
# setup toolbar
|
||||
sys.stdout.write("[%s]" % (" " * toolbar_width))
|
||||
sys.stdout.flush()
|
||||
sys.stdout.write("\b" * (toolbar_width+1)) # return to start of line, after '['
|
||||
|
||||
for command in commands:
|
||||
time.sleep(0.1)
|
||||
output = output + str(command) + '\n'
|
||||
output = output + os.popen(str(command)).read() + '\n'
|
||||
output = str(output)
|
||||
# update the bar
|
||||
sys.stdout.write("-")
|
||||
sys.stdout.flush()
|
||||
|
||||
for interface in pattern_int:
|
||||
time.sleep(0.1)
|
||||
int_command = '\n' + 'show interface counters detailed ' + str(interface) + '\n'
|
||||
output = '\n' + output + int_command + '\n'
|
||||
output = output + os.popen(str(int_command)).read()
|
||||
output = str(output)
|
||||
# update the bar
|
||||
sys.stdout.write("-")
|
||||
sys.stdout.flush()
|
||||
|
||||
# end the progress bar
|
||||
sys.stdout.write("\n")
|
||||
|
||||
print('Generated a text file techsupport.txt in the tmp directory')
|
||||
orig_stdout = sys.stdout
|
||||
f = open('/tmp/techsupport.txt', 'w')
|
||||
sys.stdout = f
|
||||
|
||||
print(output)
|
||||
|
||||
sys.stdout = orig_stdout
|
||||
f.close()
|
@ -0,0 +1,342 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Platform init script
|
||||
|
||||
NUM_I2C_1_DEVICE=1
|
||||
|
||||
# MAIN MUX PCA9548 0x71
|
||||
NUM_MUX_9548_CH0=$(( ${NUM_I2C_DEVICE} + 1 )) # MUX #1 SFP28 Port1 EEPROM 0x50
|
||||
NUM_MUX_9548_CH1=$(( ${NUM_I2C_DEVICE} + 2 )) # MUX #2 SFP28 Port2 EEPROM 0x50
|
||||
NUM_MUX_9548_CH2=$(( ${NUM_I2C_DEVICE} + 3 )) # MUX #3 SFP28 Port3 EEPROM 0x50
|
||||
NUM_MUX_9548_CH3=$(( ${NUM_I2C_DEVICE} + 4 )) # MUX #4 SFP28 Port4 EEPROM 0x50
|
||||
NUM_MUX_9548_CH4=$(( ${NUM_I2C_DEVICE} + 5 )) # MUX #5 SFP28 Port5 EEPROM 0x50
|
||||
NUM_MUX_9548_CH5=$(( ${NUM_I2C_DEVICE} + 6 )) # MUX #6 SFP28 Port6 EEPROM 0x50
|
||||
NUM_MUX_9548_CH6=$(( ${NUM_I2C_DEVICE} + 7 )) # MUX #7 FAN EEPROM (0x56, 0x57)
|
||||
NUM_MUX_9548_CH7=$(( ${NUM_I2C_DEVICE} + 8 )) # MUX #8 PSU EEPROM (0x56, 0x57)
|
||||
|
||||
PATH_SYS_I2C_DEVICES="/sys/bus/i2c/devices"
|
||||
PATH_I2C_1_DEVICE="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_I2C_1_DEVICE}"
|
||||
PATH_MUX_9548_CH0="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH0}"
|
||||
PATH_MUX_9548_CH1="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH1}"
|
||||
PATH_MUX_9548_CH2="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH2}"
|
||||
PATH_MUX_9548_CH3="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH3}"
|
||||
PATH_MUX_9548_CH4="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH4}"
|
||||
PATH_MUX_9548_CH5="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH5}"
|
||||
PATH_MUX_9548_CH6="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH6}"
|
||||
PATH_MUX_9548_CH7="${PATH_SYS_I2C_DEVICES}/i2c-${NUM_MUX_9548_CH7}"
|
||||
|
||||
# I2C Address
|
||||
### I2C MUX PCA9548
|
||||
I2C_ADDR_MUX_9548_CH0=0x71 # SFP28 MUX #1 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH1=0x71 # SFP28 MUX #2 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH2=0x71 # SFP28 MUX #3 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH3=0x71 # SFP28 MUX #4 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH4=0x71 # SFP28 MUX #5 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH5=0x71 # SFP28 MUX #6 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH6=0x71 # FAN MUX #7 EEPROM
|
||||
I2C_ADDR_MUX_9548_CH7=0x71 # PSU MUX #8 EEPROM
|
||||
### GPIO Expander
|
||||
I2C_ADDR_IO_PCAL6416=0x20 # GPIO Expander PCAL6416A
|
||||
I2C_ADDR_IO_PCAL6524=0x22 # GPIO Expander PCAL6524
|
||||
### peripheral
|
||||
I2C_ADDR_FAN1_EEPROM=0x56 # FAN1 EEPROM
|
||||
I2C_ADDR_FAN2_EEPROM=0x57 # FAN2 EEPROM
|
||||
I2C_ADDR_PSU1_EEPROM=0x56 # PSU1 EEPROM
|
||||
I2C_ADDR_PSU2_EEPROM=0x57 # PSU2 EEPROM
|
||||
I2C_ADDR_TMP75_1=0x48 # LM75 temperature sensor 1
|
||||
I2C_ADDR_TMP75_2=0x49 # LM75 temperature sensor 2
|
||||
I2C_ADDR_QSFP_EEPROM=0x50 # SFP28 port EEPROM
|
||||
|
||||
# IO Expander Register
|
||||
# direction
|
||||
PCAL6524_REG_PORT0_DIR=0x0C
|
||||
PCAL6524_REG_PORT1_DIR=0x0D
|
||||
PCAL6524_REG_PORT2_DIR=0x0E
|
||||
|
||||
PCAL6416_REG_PORT0_DIR=6
|
||||
PCAL6416_REG_PORT1_DIR=7
|
||||
|
||||
# polarity
|
||||
PCAL6524_REG_PORT0_POL=0x08
|
||||
PCAL6524_REG_PORT1_POL=0x09
|
||||
PCAL6524_REG_PORT2_POL=0x0A
|
||||
|
||||
PCAL6416_REG_PORT0_POL=4
|
||||
PCAL6416_REG_PORT1_POL=5
|
||||
|
||||
# output
|
||||
PCAL6524_REG_PORT0_OUT=0x04
|
||||
PCAL6524_REG_PORT1_OUT=0x05
|
||||
PCAL6524_REG_PORT2_OUT=0x06
|
||||
|
||||
PCAL6416_REG_PORT0_OUT=2
|
||||
PCAL6416_REG_PORT1_OUT=3
|
||||
|
||||
# input
|
||||
PCAL6524_REG_PORT0_IN=0x00
|
||||
PCAL6524_REG_PORT1_IN=0x01
|
||||
PCAL6524_REG_PORT2_IN=0x02
|
||||
|
||||
PCAL6416_REG_PORT0_IN=0
|
||||
PCAL6416_REG_PORT1_IN=1
|
||||
|
||||
# Load required kernel-mode drivers
|
||||
load_kernel_drivers() {
|
||||
echo "Load SSE-G3748 Linux kernel drivers ...\n"
|
||||
# Remove modules loaded during Linux init
|
||||
# FIX-ME: This will be removed in the future when Linux init no longer loads these
|
||||
rmmod i2c_dev
|
||||
rmmod i2c_mv64xxx
|
||||
rmmod smc_i2c_mux_pca954x
|
||||
|
||||
# Carefully control the load order here to ensure consistent i2c bus numbering
|
||||
depmod -a
|
||||
modprobe g3748cpld
|
||||
modprobe smc_i2c_mux_pca954x force_deselect_on_exit=1
|
||||
modprobe i2c_mv64xxx
|
||||
modprobe i2c_dev
|
||||
modprobe eeprom
|
||||
modprobe mvMbusDrv
|
||||
}
|
||||
|
||||
# i2c MUX PCA9548 init
|
||||
i2c_mux_init() {
|
||||
# add MUX PCA9548 on I2C_1, assume to be i2c-2~9
|
||||
if [ ! -e ${PATH_MUX_9548_CH0} ]; then
|
||||
_retry "echo 'pca9548 ${I2C_ADDR_MUX_9548_CH0}' > ${PATH_I2C_1_DEVICE}/new_device"
|
||||
else
|
||||
echo "pca9548 ${I2C_ADDR_MUX_9548_CH0} already init."
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
# I/O Expander init
|
||||
#----------------------------------------------------------------------------
|
||||
# PCAL6524 -- [I2C 0x22] 24 bits I/O for SFP status and TX_DIS
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP1 SFP1 SFP1 SFP1 SFP0 SFP0 SFP0 SFP0
|
||||
#
|
||||
# Port 1 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP3 SFP3 SFP3 SFP3 SFP2 SFP2 SFP2 SFP2
|
||||
#
|
||||
# Port 1 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP5 SFP5 SFP5 SFP5 SFP4 SFP4 SFP4 SFP4
|
||||
# [TX_DIS bit is output, all other bits are input]
|
||||
#---------------------------------------------------------------------------
|
||||
# PCAL6416A -- [I2C 0x20] 16 bits I/) Expander SFP RS0 and RS1
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# RS0 RS1 RS0 RS1 RS0 RS1 RS0 RS1
|
||||
# SF2 SF3 SF0 SF1
|
||||
#
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# N/A N/A N/A N/A RS0 RS1 RS0 RS1
|
||||
# SF4 SF5
|
||||
# [ All bits are output]
|
||||
# According to SFF-8431
|
||||
# RS0 - low : RX signalling rate less than or equal to 4.25GBd
|
||||
# high: RX signalling rate greater than 4.25GBd
|
||||
# RS1 - low : TX signalling rate less than or equal to 4.25GBd
|
||||
# high: TX signalling rate greater than 4.25GBd
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
i2c_io_exp_init() {
|
||||
echo "Init SFP status and ctrl IO Expander"
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT0_DIR} 0xBB
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT1_DIR} 0xBB
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT2_DIR} 0xBB
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT0_POL} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT1_POL} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6524} ${PCAL6524_REG_PORT2_POL} 0x00
|
||||
|
||||
echo "Init SFP RS0 and RS1 IO Expander"
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT0_DIR} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT1_DIR} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT0_POL} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT1_POL} 0x00
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT0_OUT} 0xFF
|
||||
sudo i2cset -y -r ${NUM_I2C_1_DEVICE} ${I2C_ADDR_IO_PCAL6416} ${PCAL6416_REG_PORT1_OUT} 0xFF
|
||||
}
|
||||
|
||||
update_share_password()
|
||||
{
|
||||
echo "Update shared password !!!"
|
||||
SONIC_VERSION=$(cat /etc/sonic/sonic_version.yml | grep "build_version" | sed -e "s/build_version: //g;s/'//g")
|
||||
image_dir=$(cat /proc/cmdline | sed -e 's/.*loop=\(\S*\)\/.*/\1/')
|
||||
if [ -f /host/reboot-cause/platform/last_boot_image ]; then
|
||||
last_image_ver=$(cat /host/reboot-cause/platform/last_boot_image)
|
||||
else
|
||||
last_image_ver=""
|
||||
fi
|
||||
echo "last_image_ver=${last_image_ver}"
|
||||
|
||||
find /host -name "*image-*" | sed -e 's/\/host\/image-//' | while read var ; do
|
||||
#echo "var=${var} image_dir=${image_dir}"
|
||||
if [ "image-${var}" != "$image_dir" ] && [ "$last_image_ver" != "${SONIC_VERSION}" ]; then
|
||||
cp /host/image-${var}/rw/etc/shadow /host/${image_dir}/rw/etc/shadow
|
||||
cp /host/image-${var}/rw/etc/passwd /host/${image_dir}/rw/etc/passwd
|
||||
cp /host/image-${var}/rw/etc/gshadow /host/${image_dir}/rw/etc/gshadow
|
||||
cp /host/image-${var}/rw/etc/group /host/${image_dir}/rw/etc/group
|
||||
fi
|
||||
done
|
||||
|
||||
if [ -d /host/reboot-cause/platform ]; then
|
||||
echo "${SONIC_VERSION}" | sudo tee /host/reboot-cause/platform/last_boot_image > /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
check_and_install_certificate_key_for_telemetry()
|
||||
{
|
||||
echo "Check and install certificate and key for telemetry."
|
||||
if [ ! -d /etc/sonic/telemetry ]; then
|
||||
sudo mkdir -p /etc/sonic/telemetry
|
||||
fi
|
||||
if [ -d /etc/sonic/telemetry ]; then
|
||||
if [ ! -f /etc/sonic/telemetry/dsmsroot.key ] || [ ! -f /etc/sonic/telemetry/dsmsroot.cer ]; then
|
||||
echo "Create dsmsroot.key and dsmsroot.cer in /etc/sonic/telemetry/"
|
||||
sudo openssl req -x509 -newkey rsa:4096 -keyout /etc/sonic/telemetry/dsmsroot.key \
|
||||
-out /etc/sonic/telemetry/dsmsroot.cer -sha256 -days 365 -nodes -subj '/CN=lab-ca'
|
||||
fi
|
||||
|
||||
if [ ! -f /etc/sonic/telemetry/streamingtelemetryserver.csr ] || [ ! -f /etc/sonic/telemetry/streamingtelemetryserver.key ]; then
|
||||
echo "Create streamingtelemetryserver.key, streamingtelemetryserver.csr in /etc/sonic/telemetry/"
|
||||
sudo openssl req -new -newkey rsa:4096 -nodes \
|
||||
-keyout /etc/sonic/telemetry/streamingtelemetryserver.key -out /etc/sonic/telemetry/streamingtelemetryserver.csr \
|
||||
-subj "/CN=dev-pygnmi-sonic-003"
|
||||
fi
|
||||
|
||||
if [ ! -f /etc/sonic/telemetry/streamingtelemetryserver.cer ] || [ ! -f /etc/sonic/telemetry/dsmsroot.srl ]; then
|
||||
echo "Create streamingtelemetryserver.cer, dsmsroot.srl in /etc/sonic/telemetry/"
|
||||
sudo openssl x509 -req -in /etc/sonic/telemetry/streamingtelemetryserver.csr \
|
||||
-CA /etc/sonic/telemetry/dsmsroot.cer -CAkey /etc/sonic/telemetry/dsmsroot.key \
|
||||
-CAcreateserial -out /etc/sonic/telemetry/streamingtelemetryserver.cer \
|
||||
-days 365 -sha512
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
# - Main entry
|
||||
|
||||
# Install kernel drivers required for i2c bus access
|
||||
load_kernel_drivers
|
||||
#entropy setting
|
||||
#python /etc/entropy.py
|
||||
|
||||
# LOGIC to enumerate SFP eeprom devices - send 0x50 to kernel i2c driver - initialize devices
|
||||
# the mux may be enumerated at number 4 or 5 so we check for the mux and skip if needed
|
||||
echo pca9548 ${I2C_ADDR_MUX_9548_CH0} > ${PATH_I2C_1_DEVICE}/new_device
|
||||
sleep 2
|
||||
|
||||
# Get list of the mux channels
|
||||
ismux_bus=$(i2cdetect -l|grep mux|cut -f1)
|
||||
|
||||
# Enumerate the SFP eeprom device on each mux channel
|
||||
#echo optoe2 0x50 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
for mux in ${ismux_bus}
|
||||
do
|
||||
if [[ "${mux}" != "i2c-8" ]] && [[ "${mux}" != "i2c-9" ]]; then
|
||||
echo optoe2 ${I2C_ADDR_QSFP_EEPROM} > /sys/class/i2c-adapter/${mux}/new_device
|
||||
mux_num=$(echo ${mux} | cut -b5)
|
||||
#sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/${mux}/${mux_num}-0050/eeprom
|
||||
fi
|
||||
|
||||
if [ "${mux}" == "i2c-8" ]; then
|
||||
# Enumerate fan eeprom devices
|
||||
echo eeprom 0x56 > /sys/class/i2c-adapter/i2c-8/new_device
|
||||
#sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-8/8-0056/eeprom
|
||||
|
||||
echo eeprom 0x57 > /sys/class/i2c-adapter/i2c-8/new_device
|
||||
#sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-8/8-0057/eeprom
|
||||
fi
|
||||
|
||||
if [ "${mux}" == "i2c-9" ]; then
|
||||
# Enumerate fan eeprom devices
|
||||
echo eeprom 0x56 > /sys/class/i2c-adapter/i2c-9/new_device
|
||||
#sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-9/9-0056/eeprom
|
||||
|
||||
echo eeprom 0x57 > /sys/class/i2c-adapter/i2c-9/new_device
|
||||
#sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-9/9-0057/eeprom
|
||||
fi
|
||||
done
|
||||
|
||||
# Enumerate rtc
|
||||
echo pcf8563 0x51 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
# Enumerate system eeprom
|
||||
echo 24c02 0x54 > /sys/class/i2c-adapter/i2c-0/new_device
|
||||
#sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-0/0-0054/eeprom
|
||||
|
||||
# Enumerate PD eeprom
|
||||
echo 24c02 0x52 > /sys/class/i2c-adapter/i2c-0/new_device
|
||||
#sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-0/0-0052/eeprom
|
||||
|
||||
# Enumerate AC5X eeprom
|
||||
echo 24c64 0x53 > /sys/class/i2c-adapter/i2c-0/new_device
|
||||
#sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-0/0-0053/eeprom
|
||||
|
||||
# Enumerate temperature sensors
|
||||
echo lm75 0x48 > /sys/class/i2c-adapter/i2c-0/new_device
|
||||
sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-0/0-0048/eeprom
|
||||
|
||||
echo lm75 0x49 > /sys/class/i2c-adapter/i2c-0/new_device
|
||||
sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-0/0-0049/eeprom
|
||||
|
||||
# Enumerate cpld
|
||||
echo g3748cpld 0x66 > /sys/bus/i2c/devices/i2c-0/new_device
|
||||
sleep 1
|
||||
|
||||
# Enumerate gpio
|
||||
echo gpio 0x22 > /sys/class/i2c-adapter/i2c-1/new_device
|
||||
#sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-1/1-0022/
|
||||
echo gpio 0x20 > /sys/class/i2c-adapter/i2c-1/new_device
|
||||
#sleep 1
|
||||
#chmod 644 /sys/class/i2c-adapter/i2c-1/1-0020/
|
||||
|
||||
sleep 1
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-0/0-0054/eeprom
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-0/0-0052/eeprom
|
||||
chmod 644 /sys/class/i2c-adapter/i2c-0/0-0053/eeprom
|
||||
|
||||
i2c_io_exp_init
|
||||
|
||||
# Updating password for each installed image
|
||||
update_share_password
|
||||
|
||||
# Check and setup certificate and key for telemetry
|
||||
check_and_install_certificate_key_for_telemetry
|
||||
|
||||
#setting boot_once to undefined everytime after reboot
|
||||
/usr/bin/fw_setenv boot_once
|
||||
|
||||
|
||||
#Handle 202211 image install from 202106 release image. ie. if platform
|
||||
#directory sse_g3748 exists, this config is coming from 202106 code,
|
||||
#the corresponding directory in 202211 is supermicro_sse_g3748.
|
||||
# So we have to create a soft link from sse_g3748 to supermicro_sse_g3748.
|
||||
# So let us delete the sse_g3748 directory first.
|
||||
|
||||
sed "s/\<sse_g3748\>/supermicro_sse_g3748/" /etc/sonic/sonic-enviornment -i
|
||||
|
||||
tmp=$(mktemp)
|
||||
jq '.DEVICE_METADATA.localhost.hwsku = "supermicro_sse_g3748"' /etc/sonic/config_db.json > "$tmp" && mv "$tmp" /etc/sonic/config_db.json
|
||||
|
||||
if [ -d /usr/share/sonic/device/arm64-supermicro_sse_g3748-r0/supermicro_sse_g3748 ]; then
|
||||
rm -rf /usr/share/sonic/device/arm64-supermicro_sse_g3748-r0/sse_g3748
|
||||
ln -s /usr/share/sonic/device/arm64-supermicro_sse_g3748-r0/supermicro_sse_g3748/ /usr/share/sonic/device/arm64-supermicro_sse_g3748-r0/sse_g3748
|
||||
fi
|
||||
|
||||
hwclock -s
|
||||
|
||||
exit 0
|
@ -0,0 +1,46 @@
|
||||
#!/bin/bash
|
||||
|
||||
fw_uboot_env_cfg()
|
||||
{
|
||||
echo "Setting up U-Boot environment..."
|
||||
MACH_FILE="/host/machine.conf"
|
||||
PLATFORM=`sed -n 's/onie_platform=\(.*\)/\1/p' $MACH_FILE`
|
||||
|
||||
FW_ENV_DEFAULT='/dev/mtd1 0 0x10000 0x10000'
|
||||
|
||||
echo $FW_ENV_DEFAULT
|
||||
echo $FW_ENV_DEFAULT > /etc/fw_env.config
|
||||
}
|
||||
|
||||
sse_g3748_profile()
|
||||
{
|
||||
MAC_ADDR=$(fw_printenv -n ethaddr)
|
||||
find /usr/share/sonic/device/*sse_g3748* -name profile.ini | xargs sed -i "s/switchMacAddress=.*/switchMacAddress=$MAC_ADDR/g"
|
||||
echo "SSE-G3748 Updating switch mac address ${MAC_ADDR}"
|
||||
}
|
||||
|
||||
update_modulelist()
|
||||
{
|
||||
MODULE_FILE="/etc/modules-load.d/supermicro.conf"
|
||||
|
||||
echo "# Module list to load during the boot" > $MODULE_FILE
|
||||
echo "mvIntDrv" >> $MODULE_FILE
|
||||
echo "psample" >> $MODULE_FILE
|
||||
}
|
||||
|
||||
haveged_service_cfg()
|
||||
{
|
||||
# Workaround for failing haveged.service
|
||||
sed -i 's/^DAEMON_ARGS=.*/DAEMON_ARGS="-w 1024 -d 16"/' /etc/default/haveged
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
echo "Executing sse-g3748_plt_setup.sh ....."
|
||||
fw_uboot_env_cfg
|
||||
sse_g3748_profile
|
||||
update_modulelist
|
||||
haveged_service_cfg
|
||||
}
|
||||
|
||||
main $@
|
@ -0,0 +1,88 @@
|
||||
#!/usr/bin/python
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import time
|
||||
import sys
|
||||
|
||||
interface_output = str(os.popen('show interface stat').read())
|
||||
pattern_int = re.findall('Ethernet[0-9]+',interface_output)
|
||||
|
||||
os.system('sudo config feature state iccpd enabled')
|
||||
mclag_output = str(os.popen('mclagdctl dump state').read())
|
||||
|
||||
commands = []
|
||||
|
||||
if not mclag_output:
|
||||
|
||||
commands = commands + ['show platform syseeprom', 'show version', 'show boot', 'show tacacs', 'show radius', 'show aaa',
|
||||
'show platform psustatus', 'show platform pcieinfo', 'show platform temp',
|
||||
'show platform summary', 'show platform firmware status',
|
||||
'show platform fan', 'show interface status', 'sudo ifconfig -a', 'show ip interface',
|
||||
'show vlan brief', 'show lldp neighbors' , 'show lldp table', 'show ztp status', 'show ip bgp summary', 'show ip bgp neighbors', 'show route-map',
|
||||
'show interface portchannel', 'show ip route', 'sudo route -n', 'show arp', 'sudo arp -n', 'show mac',
|
||||
'show acl rule', 'sudo aclshow -a -vv', 'show acl table', 'show interface counters -a', 'show int autoneg status',
|
||||
'mclagdctl dump state','sudo show system-health detail', 'show system-mem',
|
||||
'docker ps', 'top -n 1', 'show uptime', 'show reboot-cause history',
|
||||
'sudo show system-health summary','show int transceiver presence', 'show int transceiver eeprom', 'show int transceiver error-status',
|
||||
'show int transceiver lpmode', 'show clock', 'show ntp', 'sudo timedatectl status', 'show runningconfiguration all']
|
||||
|
||||
else:
|
||||
|
||||
mclag_domain = re.findall('Domain id: [0-9]+',mclag_output)
|
||||
mclag_final = mclag_domain[0].split(':')
|
||||
commands = commands + ['show platform syseeprom', 'show version', 'show boot', 'show tacacs', 'show radius', 'show aaa',
|
||||
'show platform psustatus', 'show platform pcieinfo', 'show platform temp',
|
||||
'show platform summary', 'show platform firmware status',
|
||||
'show platform fan', 'show interface status', 'sudo ifconfig -a', 'show ip interface',
|
||||
'show vlan brief', 'show lldp neighbors' , 'show lldp table', 'show ztp status', 'show ip bgp summary', 'show ip bgp neighbors', 'show route-map',
|
||||
'show interface portchannel', 'show ip route', 'sudo route -n', 'show arp', 'sudo arp -n', 'show mac',
|
||||
'show acl rule', 'sudo aclshow -a -vv', 'show acl table', 'show interface counters -a', 'show int autoneg status',
|
||||
'mclagdctl dump state', ('mclagdctl dump mac -i ' + str(mclag_final[1])), ('mclagdctl dump arp -i ' + str(mclag_final[1])),
|
||||
'sudo show system-health detail', 'show system-mem',
|
||||
'docker ps', 'top -n 1', 'show uptime', 'show reboot-cause history',
|
||||
'sudo show system-health summary','show int transceiver presence', 'show int transceiver eeprom', 'show int transceiver error-status',
|
||||
'show int transceiver lpmode', 'show clock', 'show ntp', 'sudo timedatectl status', 'show runningconfiguration all']
|
||||
|
||||
output = ''
|
||||
|
||||
print('Fetching data....This might take a few minutes...')
|
||||
|
||||
toolbar_width = 83
|
||||
|
||||
# setup toolbar
|
||||
sys.stdout.write("[%s]" % (" " * toolbar_width))
|
||||
sys.stdout.flush()
|
||||
sys.stdout.write("\b" * (toolbar_width+1)) # return to start of line, after '['
|
||||
|
||||
for command in commands:
|
||||
time.sleep(0.1)
|
||||
output = output + str(command) + '\n'
|
||||
output = output + os.popen(str(command)).read() + '\n'
|
||||
output = str(output)
|
||||
# update the bar
|
||||
sys.stdout.write("-")
|
||||
sys.stdout.flush()
|
||||
|
||||
for interface in pattern_int:
|
||||
time.sleep(0.1)
|
||||
int_command = '\n' + 'show interface counters detailed ' + str(interface) + '\n'
|
||||
output = '\n' + output + int_command + '\n'
|
||||
output = output + os.popen(str(int_command)).read()
|
||||
output = str(output)
|
||||
# update the bar
|
||||
sys.stdout.write("-")
|
||||
sys.stdout.flush()
|
||||
|
||||
# end the progress bar
|
||||
sys.stdout.write("\n")
|
||||
|
||||
print('Generated a text file techsupport.txt in the tmp directory')
|
||||
orig_stdout = sys.stdout
|
||||
f = open('/tmp/techsupport.txt', 'w')
|
||||
sys.stdout = f
|
||||
|
||||
print(output)
|
||||
|
||||
sys.stdout = orig_stdout
|
||||
f.close()
|
@ -0,0 +1,14 @@
|
||||
[Unit]
|
||||
Description=Platform SSE-G3748 Service
|
||||
Before=pmon.service
|
||||
After=sysinit.target
|
||||
DefaultDependencies=no
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/local/bin/sse-g3748-init.sh
|
||||
KillSignal=SIGKILL
|
||||
SuccessExitStatus=SIGKILL
|
||||
#StandardOutput=tty
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
@ -0,0 +1,15 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
from setuptools import setup
|
||||
os.listdir
|
||||
|
||||
setup(
|
||||
name='sonic_platform',
|
||||
version='1.0',
|
||||
description='Module to initialize Supermicro SSE-G3748 platforms',
|
||||
|
||||
packages=['sonic_platform','sonic_platform.test'],
|
||||
package_dir={'sonic_platform': 'sse-g3748/sonic_platform'},
|
||||
)
|
||||
|
@ -0,0 +1,3 @@
|
||||
__all__ = ["platform", "chassis"]
|
||||
from sonic_platform import *
|
||||
|
@ -0,0 +1,548 @@
|
||||
#!/usr/bin/env python
|
||||
##################################################################
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the platform information
|
||||
##################################################################
|
||||
|
||||
try:
|
||||
import os
|
||||
import sys
|
||||
import glob
|
||||
from sonic_platform_base.chassis_base import ChassisBase
|
||||
from sonic_platform.sfp import Sfp
|
||||
from sonic_platform.eeprom import Eeprom
|
||||
from sonic_platform.fan import Fan
|
||||
from .fan_drawer import RealDrawer
|
||||
from sonic_platform.psu import Psu
|
||||
from sonic_platform.thermal import Thermal
|
||||
from sonic_py_common import logger
|
||||
from sonic_platform.component import Component
|
||||
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
smbus_present = 1
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
|
||||
MAX_SELECT_DELAY = 3600
|
||||
COPPER_PORT_START = 1
|
||||
COPPER_PORT_END = 48
|
||||
SFP_PORT_START =49
|
||||
SFP_PORT_END = 54
|
||||
PORT_END = 54
|
||||
MAX_COMPONENT=3
|
||||
|
||||
# Device counts
|
||||
MAX_G3748_FAN_DRAWERS = 1
|
||||
MAX_G3748_FANS_PER_DRAWER = 2
|
||||
MAX_G3748_PSU = 2
|
||||
MAX_G3748_THERMAL = 2
|
||||
|
||||
SYSLOG_IDENTIFIER = "chassis"
|
||||
sonic_logger=logger.Logger(SYSLOG_IDENTIFIER)
|
||||
|
||||
class Chassis(ChassisBase):
|
||||
"""
|
||||
Platform-specific Chassis class
|
||||
derived from Dell S6000 platform.
|
||||
customized for the platform.
|
||||
"""
|
||||
reset_reason_dict = {}
|
||||
reset_reason_dict[0x02] = ChassisBase.REBOOT_CAUSE_POWER_LOSS
|
||||
reset_reason_dict[0x20] = ChassisBase.REBOOT_CAUSE_THERMAL_OVERLOAD_ASIC
|
||||
|
||||
reset_reason_dict[0x08] = ChassisBase.REBOOT_CAUSE_THERMAL_OVERLOAD_CPU
|
||||
reset_reason_dict[0x10] = ChassisBase.REBOOT_CAUSE_WATCHDOG
|
||||
PLATFORM_ROOT_PATH = "/usr/share/sonic/device"
|
||||
PMON_HWSKU_PATH = "/usr/share/sonic/hwsku"
|
||||
HOST_CHK_CMD = "docker > /dev/null 2>&1"
|
||||
PLATFORM = "arm64-supermicro_sse_g3748-r0"
|
||||
HWSKU = "supermicro_sse_g3748"
|
||||
|
||||
I2C_CLASS_DIR = "/sys/class/i2c-adapter/"
|
||||
I2C_DEV_MAPPING = (['i2c-0/0-0066/hwmon/', 1])
|
||||
|
||||
def __init__(self):
|
||||
ChassisBase.__init__(self)
|
||||
self.system_led_supported_color = ['off', 'green', 'amber', 'blue', 'blinking green', 'blinking amber', 'blinking blue']
|
||||
# Port numbers for Initialize SFP list
|
||||
self.COPPER_PORT_START = COPPER_PORT_START
|
||||
self.COPPER_PORT_END = COPPER_PORT_END
|
||||
self.SFP_PORT_START = SFP_PORT_START
|
||||
self.SFP_PORT_END = SFP_PORT_END
|
||||
self.PORT_END = PORT_END
|
||||
|
||||
G3748CPLD_I2C_DIR = "/sys/bus/i2c/devices/0-0066/"
|
||||
|
||||
# for non-sfp ports create dummy objects for copper / non-sfp ports
|
||||
for index in range(self.COPPER_PORT_START, self.COPPER_PORT_END+1):
|
||||
sfp_node = Sfp(index, 'RJ45', 'N/A', 'N/A')
|
||||
self._sfp_list.append(sfp_node)
|
||||
|
||||
# Verify optoe2 driver SFP eeprom devices were enumerated and exist
|
||||
# then create the sfp nodes
|
||||
eeprom_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/eeprom"
|
||||
mux_dev = sorted(glob.glob("/sys/class/i2c-adapter/i2c-[2-7]"))
|
||||
y = 0
|
||||
for index in range(self.SFP_PORT_START, self.SFP_PORT_END+1):
|
||||
mux_dev_num = mux_dev[y]
|
||||
port_i2c_map = mux_dev_num[-1]
|
||||
y = y + 1
|
||||
port_eeprom_path = eeprom_path.format(port_i2c_map)
|
||||
if not os.path.exists(port_eeprom_path):
|
||||
sonic_logger.log_info("path %s didnt exist" % port_eeprom_path)
|
||||
sfp_node = Sfp(index, 'SFP', port_eeprom_path, port_i2c_map)
|
||||
self._sfp_list.append(sfp_node)
|
||||
self.sfp_event_initialized = False
|
||||
|
||||
# Instantiate ONIE system eeprom object
|
||||
self._eeprom = Eeprom()
|
||||
|
||||
# Construct lists fans, power supplies, thermals & components
|
||||
drawer_num = MAX_G3748_FAN_DRAWERS
|
||||
fan_num_per_drawer = MAX_G3748_FANS_PER_DRAWER
|
||||
drawer_ctor = RealDrawer
|
||||
fan_index = 0
|
||||
for drawer_index in range(drawer_num):
|
||||
drawer = drawer_ctor(drawer_index)
|
||||
self._fan_drawer_list.append(drawer)
|
||||
for index in range(fan_num_per_drawer):
|
||||
fan = Fan(fan_index, drawer)
|
||||
fan_index += 1
|
||||
drawer._fan_list.append(fan)
|
||||
self._fan_list.append(fan)
|
||||
|
||||
for i in range(MAX_G3748_PSU):
|
||||
psu = Psu(i)
|
||||
self._psu_list.append(psu)
|
||||
|
||||
for i in range(MAX_G3748_THERMAL):
|
||||
thermal = Thermal(i)
|
||||
self._thermal_list.append(thermal)
|
||||
|
||||
for i in range(MAX_COMPONENT):
|
||||
component = Component(i)
|
||||
self._component_list.append(component)
|
||||
|
||||
self.fan_sys_frontled_reg = G3748CPLD_I2C_DIR+"fan_sys_frontled".format()
|
||||
|
||||
def _get_i2c_register(self, reg_file):
|
||||
# On successful read, returns the value read from given
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
|
||||
try:
|
||||
with open(reg_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def _set_i2c_register(self, reg_file, value):
|
||||
# On successful write, the value read will be written on
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
|
||||
try:
|
||||
with open(reg_file, 'w') as fd:
|
||||
rv = fd.write(str(value))
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
# Ensure that the write operation has succeeded
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
time.sleep(3)
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
rv = 'ERR'
|
||||
|
||||
return rv
|
||||
|
||||
def __is_host(self):
|
||||
return os.system(self.HOST_CHK_CMD) == 0
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence of the chassis
|
||||
Returns:
|
||||
bool: True if chassis is present, False if not
|
||||
"""
|
||||
return True
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the chassis
|
||||
Returns:
|
||||
bool: A boolean value, True if chassis is operating properly
|
||||
False if not
|
||||
"""
|
||||
return True
|
||||
|
||||
##############################################
|
||||
# EEPROM methods
|
||||
##############################################
|
||||
|
||||
def get_eeprom(self):
|
||||
"""
|
||||
Retreives eeprom device on this chassis
|
||||
Returns:
|
||||
An object representing the hardware eeprom device
|
||||
"""
|
||||
return self._eeprom
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Retrieves the name of the chassis
|
||||
Returns:
|
||||
string: The name of the chassis
|
||||
"""
|
||||
return self._eeprom.modelstr()
|
||||
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the model number (or part number) of the chassis
|
||||
Returns:
|
||||
string: Model/part number of chassis
|
||||
"""
|
||||
return self._eeprom.part_number_str()
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the chassis (Service tag)
|
||||
Returns:
|
||||
string: Serial number of chassis
|
||||
"""
|
||||
return self._eeprom.serial_str()
|
||||
|
||||
def get_revision(self):
|
||||
"""
|
||||
Retrieves the device version of the chassis
|
||||
Returns:
|
||||
string: device version of chassis
|
||||
"""
|
||||
return self._eeprom.device_version()
|
||||
|
||||
def get_base_mac(self):
|
||||
"""
|
||||
Retrieves the base MAC address for the chassis
|
||||
|
||||
Returns:
|
||||
A string containing the MAC address in the format
|
||||
'XX:XX:XX:XX:XX:XX'
|
||||
"""
|
||||
return self._eeprom.base_mac_addr()
|
||||
|
||||
def get_serial_number(self):
|
||||
"""
|
||||
Retrieves the hardware serial number for the chassis
|
||||
|
||||
Returns:
|
||||
A string containing the hardware serial number for this
|
||||
chassis.
|
||||
"""
|
||||
return self._eeprom.serial_number_str()
|
||||
|
||||
def get_system_eeprom_info(self):
|
||||
"""
|
||||
Retrieves the full content of system EEPROM information for the
|
||||
chassis
|
||||
|
||||
Returns:
|
||||
A dictionary where keys are the type code defined in
|
||||
OCP ONIE TlvInfo EEPROM format and values are their
|
||||
corresponding values.
|
||||
"""
|
||||
return self._eeprom.system_eeprom_info()
|
||||
|
||||
##############################################
|
||||
# SFP methods
|
||||
##############################################
|
||||
|
||||
def get_sfp(self, index):
|
||||
"""
|
||||
Retrieves sfp represented by (1-based) index <index>
|
||||
Args:
|
||||
index: An integer, the index (1-based) of the sfp to retrieve.
|
||||
The index should be the sequence of physical SFP ports in a chassis,
|
||||
starting from 1.
|
||||
For example, 1 for first SFP port in the chassis and so on.
|
||||
Returns:
|
||||
An object dervied from SfpBase representing the specified sfp
|
||||
"""
|
||||
sfp = None
|
||||
try:
|
||||
# The index will start from 1
|
||||
sfp = self._sfp_list[index-1]
|
||||
except IndexError:
|
||||
sys.stderr.write("SFP index {} out of range (1-{})\n".format(
|
||||
index, len(self._sfp_list)))
|
||||
return sfp
|
||||
|
||||
#index = index - 1
|
||||
#return super(Chassis, self).get_sfp(index)
|
||||
|
||||
def get_port_or_cage_type(self, index):
|
||||
"""
|
||||
Retrieves sfp port or cage type corresponding to physical port <index>
|
||||
|
||||
Args:
|
||||
index: An integer (>=0), the index of the sfp to retrieve.
|
||||
The index should correspond to the physical port in a chassis.
|
||||
For example:-
|
||||
1 for Ethernet0, 2 for Ethernet4 and so on for one platform.
|
||||
0 for Ethernet0, 1 for Ethernet4 and so on for another platform.
|
||||
Returns:
|
||||
The masks of all types of port or cage that can be supported on the port
|
||||
Types are defined in sfp_base.py
|
||||
Eg.
|
||||
Both SFP and SFP+ are supported on the port, the return value should be 0x0a
|
||||
which is 0x02 | 0x08
|
||||
"""
|
||||
#if index in range(self.COPPER_PORT_START, self.COPPER_PORT_END):
|
||||
if (index >= self.COPPER_PORT_START and index <= self.COPPER_PORT_END):
|
||||
from sonic_platform_base.sfp_base import SfpBase
|
||||
return SfpBase.SFP_PORT_TYPE_BIT_RJ45
|
||||
raise NotImplementedError
|
||||
|
||||
def get_change_event(self, timeout=0):
|
||||
"""
|
||||
Returns a nested dictionary containing all devices which have
|
||||
experienced a change at chassis level
|
||||
Args:
|
||||
timeout: Timeout in milliseconds (optional). If timeout == 0,
|
||||
this method will block until a change is detected.
|
||||
Returns:
|
||||
(bool, dict):
|
||||
- True if call successful, False if not;
|
||||
- A nested dictionary where key is a device type,
|
||||
value is a dictionary with key:value pairs in the format of
|
||||
{'device_id':'device_event'},
|
||||
where device_id is the device ID for this device and
|
||||
device_event,
|
||||
status='1' represents device inserted,
|
||||
status='0' represents device removed.
|
||||
Ex. {'fan':{'0':'0', '2':'1'}, 'sfp':{'11':'0'}}
|
||||
indicates that fan 0 has been removed, fan 2
|
||||
has been inserted and sfp 11 has been removed.
|
||||
"""
|
||||
# Initialize SFP event first
|
||||
if not self.sfp_event_initialized:
|
||||
from sonic_platform.sfp_event import sfp_event
|
||||
self.sfp_event = sfp_event()
|
||||
self.sfp_event.initialize()
|
||||
self.MAX_SELECT_EVENT_RETURNED = self.PORT_END
|
||||
self.sfp_event_initialized = True
|
||||
|
||||
wait_for_ever = (timeout == 0)
|
||||
port_dict = {}
|
||||
if wait_for_ever:
|
||||
# xrcvd will call this monitor loop in the "SYSTEM_READY" state
|
||||
# logger.log_info(" wait_for_ever get_change_event %d" % timeout)
|
||||
timeout = MAX_SELECT_DELAY
|
||||
while True:
|
||||
status = self.sfp_event.check_sfp_status( port_dict, timeout)
|
||||
if not port_dict == {}:
|
||||
break
|
||||
else:
|
||||
# At boot up and in "INIT" state call from xrcvd will have a timeout value
|
||||
# return true without change after timeout and will transition to "SYSTEM_READY"
|
||||
# logger.log_info(" initial get_change_event %d" % timeout )
|
||||
status = self.sfp_event.check_sfp_status( port_dict, timeout)
|
||||
|
||||
if status:
|
||||
return True, {'sfp':port_dict}
|
||||
else:
|
||||
return True, {'sfp':{}}
|
||||
|
||||
##############################################
|
||||
# THERMAL methods
|
||||
##############################################
|
||||
|
||||
def get_thermal_manager(self):
|
||||
from .thermal_manager import ThermalManager
|
||||
return ThermalManager
|
||||
|
||||
##############################################
|
||||
# System LED methods
|
||||
##############################################
|
||||
|
||||
def initizalize_system_led(self):
|
||||
return True
|
||||
|
||||
def set_status_led(self, color):
|
||||
"""
|
||||
Sets the state of the system LED
|
||||
|
||||
Args:
|
||||
color: A string representing the color with which to set the
|
||||
system LED
|
||||
|
||||
Returns:
|
||||
bool: True if system LED state is set successfully, False if not
|
||||
"""
|
||||
#sonic_logger.log_warning(" System LED set_status_led color:{}".format(color))
|
||||
if color not in self.system_led_supported_color:
|
||||
return False
|
||||
|
||||
if (color == 'off'):
|
||||
setbits = 0x00
|
||||
elif (color == 'blue'):
|
||||
setbits = 0x03
|
||||
elif (color == 'amber'):
|
||||
setbits = 0x02
|
||||
elif (color == 'green'):
|
||||
setbits = 0x01
|
||||
elif (color == 'blinking blue'):
|
||||
setbits = 0x07
|
||||
elif (color == 'blinking amber'):
|
||||
setbits = 0x06
|
||||
elif (color == 'blinking green'):
|
||||
setbits = 0x05
|
||||
else:
|
||||
return False
|
||||
|
||||
#sonic_logger.log_warning(" System LED set_status_led setbits:{}".format(setbits))
|
||||
# Write sys led
|
||||
#if smbus_present == 0: # called from host (e.g. 'show system-health')
|
||||
# cmdstatus, value = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x11')
|
||||
# value = int(value, 16)
|
||||
# value = value & 0xF0 | setbits
|
||||
# sonic_logger.log_warning(" System LED set color:{} value:{}".format(color, value))
|
||||
# cmdstatus, value = cmd.getstatusoutput('sudo i2cset -y 0 0x66 0x11 %d' % value)
|
||||
# if cmdstatus:
|
||||
# sonic_logger.log_warning(" System LED set %s failed" % value)
|
||||
# return False
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICEREG = 0x11
|
||||
# value = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
# value = value & 0xF0 | setbits
|
||||
# bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, value)
|
||||
# sonic_logger.log_warning(" System LED set color:{} value:{}".format(color, value))
|
||||
|
||||
value = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
value = int(value) & 0xF0 | setbits
|
||||
self._set_i2c_register(self.fan_sys_frontled_reg, value)
|
||||
sonic_logger.log_warning(" System LED set color:{} value:{}".format(color, value))
|
||||
|
||||
return True
|
||||
|
||||
def get_status_led(self):
|
||||
"""
|
||||
Gets the state of the system LED
|
||||
|
||||
Returns:
|
||||
A string, one of the valid LED color strings which could be vendor
|
||||
specified.
|
||||
"""
|
||||
# Read sys led
|
||||
#if smbus_present == 0: # called from host
|
||||
# cmdstatus, value = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x11')
|
||||
# value = int(value, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x11
|
||||
# value = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#value = value & 0x07
|
||||
value = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
value = int(value) & 0x07
|
||||
|
||||
if value == 0x00:
|
||||
color = 'off'
|
||||
elif value == 0x01:
|
||||
color = 'green'
|
||||
elif value == 0x02:
|
||||
color = 'amber'
|
||||
elif value == 0x06:
|
||||
color = 'amber_blink'
|
||||
elif value == 0x05:
|
||||
color = 'green_blink'
|
||||
elif value == 0x04:
|
||||
color = 'off'
|
||||
else:
|
||||
return None
|
||||
|
||||
sonic_logger.log_warning(" System LED get color %s" % color)
|
||||
return color
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Prasanna : This method is added, since M0 test named below fails without this method.
|
||||
platform_tests/api/test_chassis.py::TestChassisApi::test_get_position_in_parent[lab-inno-01]
|
||||
As done in other platforms such as nokia etc, return -1.
|
||||
|
||||
Retrieves 1-based relative physical position in parent device.
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent
|
||||
device or -1 if cannot determine the position
|
||||
"""
|
||||
return -1
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Prasanna : This method is added, since M0 test named below fails without this method.
|
||||
platform_tests/api/test_chassis.py::TestChassisApi::test_is_replaceable[lab-inno-01]
|
||||
As done in other platforms such as nokia etc, return False.
|
||||
|
||||
Indicate whether Chassis is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return False
|
||||
|
||||
def get_reboot_cause(self):
|
||||
"""
|
||||
Retrieves the cause of the previous reboot
|
||||
Returns:
|
||||
A tuple (string, string) where the first element is a string
|
||||
containing the cause of the previous reboot. This string must be
|
||||
one of the predefined strings in this class. If the first string
|
||||
is "REBOOT_CAUSE_HARDWARE_OTHER", the second string can be used
|
||||
to pass a description of the reboot cause.
|
||||
"""
|
||||
#lrr = self._get_cpld_register('mb_reboot_cause')
|
||||
#if (lrr != 'ERR'):
|
||||
# reset_reason = lrr
|
||||
# if (reset_reason in self.reset_reason_dict):
|
||||
# return (self.reset_reason_dict[reset_reason], None)
|
||||
#
|
||||
return (ChassisBase.REBOOT_CAUSE_NON_HARDWARE, None)
|
||||
|
||||
def get_watchdog(self):
|
||||
"""
|
||||
Retrieves hardware watchdog device on this chassis
|
||||
|
||||
Returns:
|
||||
An object derived from WatchdogBase representing the hardware
|
||||
watchdog device
|
||||
"""
|
||||
try:
|
||||
if self._watchdog is None:
|
||||
from sonic_platform.watchdog import WatchdogImplBase
|
||||
watchdog_device_path = "/dev/watchdog0"
|
||||
self._watchdog = WatchdogImplBase(watchdog_device_path)
|
||||
except Exception as e:
|
||||
sonic_logger.log_warning(" Fail to load watchdog {}".format(repr(e)))
|
||||
|
||||
return self._watchdog
|
||||
|
||||
|
@ -0,0 +1,166 @@
|
||||
########################################################################
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the Components' (e.g., BIOS, CPLD, FPGA, etc.) available in
|
||||
# the platform
|
||||
#
|
||||
########################################################################
|
||||
|
||||
try:
|
||||
import sys
|
||||
import subprocess
|
||||
from sonic_platform_base.component_base import ComponentBase
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
|
||||
class Component(ComponentBase):
|
||||
"""platform-specific Component class"""
|
||||
|
||||
CHASSIS_COMPONENTS = [
|
||||
["U-Boot", "Performs initialization during booting"],
|
||||
["ONIE-VERSION", "ONIE - Open Network Install Environment"],
|
||||
["System-CPLD", "System - CPLD"],
|
||||
]
|
||||
|
||||
def __init__(self, component_index):
|
||||
self.index = component_index
|
||||
self.name = self.CHASSIS_COMPONENTS[self.index][0]
|
||||
self.description = self.CHASSIS_COMPONENTS[self.index][1]
|
||||
|
||||
def _get_command_result(self, cmdline):
|
||||
try:
|
||||
proc = subprocess.Popen(cmdline.split(), stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT)
|
||||
stdout = proc.communicate()[0]
|
||||
proc.wait()
|
||||
result = stdout.rstrip('\n')
|
||||
except OSError:
|
||||
result = None
|
||||
|
||||
return result
|
||||
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Retrieves the name of the component
|
||||
|
||||
Returns:
|
||||
A string containing the name of the component
|
||||
"""
|
||||
return self.name
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the part number of the component
|
||||
|
||||
Returns:
|
||||
string: Part number of component
|
||||
"""
|
||||
return 'NA'
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the component
|
||||
|
||||
Returns:
|
||||
string: Serial number of component
|
||||
"""
|
||||
return 'NA'
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence of the component
|
||||
|
||||
Returns:
|
||||
bool: True if component is operating properly, False if not
|
||||
"""
|
||||
return True
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the presence of the component
|
||||
|
||||
Returns:
|
||||
bool: True if component is operating properly, False if not
|
||||
"""
|
||||
return True
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device.
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent
|
||||
device or -1 if cannot determine the position
|
||||
"""
|
||||
return -1
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether Chassis is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return False
|
||||
|
||||
def get_description(self):
|
||||
"""
|
||||
Retrieves the description of the component
|
||||
|
||||
Returns:
|
||||
A string containing the description of the component
|
||||
"""
|
||||
return self.description
|
||||
|
||||
def get_firmware_version(self):
|
||||
"""
|
||||
Retrieves the firmware version of the component
|
||||
|
||||
Returns:
|
||||
A string containing the firmware version of the component
|
||||
"""
|
||||
|
||||
if self.index == 0:
|
||||
cmdstatus, uboot_version = cmd.getstatusoutput('grep --null-data ^U-Boot /dev/mtd0ro | cut -d" " -f2')
|
||||
return uboot_version
|
||||
|
||||
if self.index == 1:
|
||||
cmdstatus, onie_version = cmd.getstatusoutput('grep ^onie_version /host/machine.conf | cut -f2 -d"="')
|
||||
return onie_version
|
||||
|
||||
if self.index == 2:
|
||||
cmdstatus, cpld_version = cmd.getstatusoutput('cat /sys/bus/i2c/devices/0-0066/cpld_version')
|
||||
return cpld_version
|
||||
|
||||
def install_firmware(self, image_path):
|
||||
"""
|
||||
Installs firmware to the component
|
||||
|
||||
Args:
|
||||
image_path: A string, path to firmware image
|
||||
|
||||
Returns:
|
||||
A boolean, True if install was successful, False if not
|
||||
"""
|
||||
return False
|
||||
|
||||
|
||||
def get_available_firmware_version(self, image_path):
|
||||
"""
|
||||
Fix for issue: 160170:(SONIC-MGMT) platform_tests post /platform/chassis/component/
|
||||
returns empty reply.
|
||||
|
||||
Retrieves the available firmware version of the component
|
||||
Note: the firmware version will be read from image.
|
||||
Args:
|
||||
image_path: A string, path to firmware image
|
||||
Returns:
|
||||
A string containing the available firmware version of the component
|
||||
"""
|
||||
return "N/A"
|
||||
|
@ -0,0 +1,321 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
########################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains platform specific implementation of SONiC Platform
|
||||
# Base API and provides the EEPROMs' information.
|
||||
#
|
||||
# The different EEPROMs available are as follows:
|
||||
# - System EEPROM : Contains Serial number, Service tag, Base MA
|
||||
# address, etc. in ONIE TlvInfo EEPROM format.
|
||||
# - PSU EEPROM : Contains Serial number, Part number, Service Tag,
|
||||
# PSU type, Revision.
|
||||
# - Fan EEPROM : Contains Serial number, Part number, Service Tag,
|
||||
# Fan type, Number of Fans in Fantray, Revision.
|
||||
########################################################################
|
||||
|
||||
|
||||
try:
|
||||
from sonic_platform_base.sonic_eeprom.eeprom_base import EepromDecoder
|
||||
from sonic_platform_base.sonic_eeprom.eeprom_tlvinfo import TlvInfoDecoder
|
||||
from sonic_py_common import logger
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
# PSU eeprom fields in format required by EepromDecoder
|
||||
psu_eeprom_format = [
|
||||
('Frame Head', 's', 1), ('PSU Rev', 's', 3), ('Reserved_1', 's', 3),
|
||||
('Checksum', 's', 1), ('Reserved_2', 's', 2),
|
||||
('Part Number', 's', 17), ('Vendor', 's', 7), ('Serial Number', 's', 25),
|
||||
('Specification', 's', 141), ('Power', 's', 10), ('Mfg Date', 's', 3),
|
||||
('Reserved_3', 's', 43)
|
||||
]
|
||||
|
||||
# Fan eeprom fields in format required by EepromDecoder
|
||||
fan_eeprom_format = [
|
||||
('Common Head', 's', 8),
|
||||
('Board Area Ver', 's', 1), ('Board Area Len', 's', 1), ('Language Code', 's', 1),
|
||||
('Mfg Date', 's', 3), ('Mfg TypeLen', 's', 1), ('Mfg Name', 's', 3),
|
||||
('Model TypeLen', 's', 1), ('Model', 's', 13),
|
||||
('Serial Number TypeLen', 's', 1), ('Serial Number', 's', 15),
|
||||
('Part Number TypeLen', 's',1), ('Part Number', 's', 12),
|
||||
('FRU TypeLen', 's', 1), ('FRU Id', 's', 1),
|
||||
('PCB Part Number TypeLen', 's', 1), ('PCB Part Number', 's', 12),
|
||||
('End Encoder', 's', 1),
|
||||
('Reserved', 's', 179)
|
||||
]
|
||||
|
||||
sonic_logger = logger.Logger('eeprom')
|
||||
|
||||
class Eeprom(TlvInfoDecoder):
|
||||
"""Supermicro SSE-G3748 platform-specific EEPROM class"""
|
||||
|
||||
I2C_DIR = "/sys/class/i2c-adapter/"
|
||||
|
||||
def __init__(self, is_psu=False, psu_index=0, is_fan=False, fan_index=0):
|
||||
self.is_psu_eeprom = is_psu
|
||||
self.is_fan_eeprom = is_fan
|
||||
self.is_sys_eeprom = not (is_psu | is_fan)
|
||||
|
||||
if self.is_sys_eeprom:
|
||||
self.start_offset = 0
|
||||
#self.eeprom_path = "/etc/sonic/eeprom"
|
||||
self.eeprom_path = self.I2C_DIR + "i2c-0/0-0054/eeprom"
|
||||
# System EEPROM is in ONIE TlvInfo EEPROM format
|
||||
super(Eeprom, self).__init__(self.eeprom_path,
|
||||
self.start_offset, '', True)
|
||||
self._load_system_eeprom()
|
||||
else:
|
||||
#print ("No other eeprom")
|
||||
if self.is_psu_eeprom:
|
||||
self.index = psu_index
|
||||
self.start_offset = 0
|
||||
self.eeprom_path = self.I2C_DIR + "i2c-9/9-005{}/eeprom".format(self.index + 5)
|
||||
self.format = psu_eeprom_format
|
||||
|
||||
# Decode device eeprom as per specified format
|
||||
EepromDecoder.__init__(self, self.eeprom_path, self.format, self.start_offset, '', True)
|
||||
#sonic_logger.log_warning("_load_device_eeprom PSU##{}".format(self.index))
|
||||
#sonic_logger.log_warning("eeprom_path for PSU## is {}".format(self.eeprom_path))
|
||||
else:
|
||||
self.index = fan_index
|
||||
self.start_offset = 0
|
||||
self.eeprom_path = self.I2C_DIR + "i2c-8/8-005{}/eeprom".format(self.index + 5)
|
||||
self.format = fan_eeprom_format
|
||||
|
||||
# Fan EEPROM is in ONIE TlvInfo EEPROM format
|
||||
EepromDecoder.__init__(self, self.eeprom_path, self.format, self.start_offset, '', True)
|
||||
#sonic_logger.log_warning("_load_device_eeprom FAN##{}".format(self.index))
|
||||
#sonic_logger.log_warning("eeprom_path for FAN## is {}".format(self.eeprom_path))
|
||||
|
||||
self._load_device_eeprom()
|
||||
|
||||
def _load_system_eeprom(self):
|
||||
"""
|
||||
Reads the system EEPROM and retrieves the values corresponding
|
||||
to the codes defined as per ONIE TlvInfo EEPROM format and fills
|
||||
them in a dictionary.
|
||||
"""
|
||||
try:
|
||||
# Read System EEPROM as per ONIE TlvInfo EEPROM format.
|
||||
self.eeprom_data = self.read_eeprom()
|
||||
except Exception as e:
|
||||
self.base_mac = 'NA'
|
||||
self.serial_number = 'NA'
|
||||
self.part_number = 'NA'
|
||||
self.model_str = 'NA'
|
||||
self.serial = 'NA'
|
||||
self.device_ver = 'NA'
|
||||
self.eeprom_tlv_dict = dict()
|
||||
else:
|
||||
eeprom = self.eeprom_data
|
||||
self.eeprom_tlv_dict = dict()
|
||||
|
||||
if not self.is_valid_tlvinfo_header(eeprom):
|
||||
self.base_mac = 'NA'
|
||||
self.serial_number = 'NA'
|
||||
self.part_number = 'NA'
|
||||
self.model_str = 'NA'
|
||||
self.serial = 'NA'
|
||||
self.device_ver = 'NA'
|
||||
return
|
||||
|
||||
total_length = (eeprom[9] << 8) | eeprom[10]
|
||||
tlv_index = self._TLV_INFO_HDR_LEN
|
||||
tlv_end = self._TLV_INFO_HDR_LEN + total_length
|
||||
|
||||
# Construct dictionary of eeprom TLV entries
|
||||
while (tlv_index + 2) < len(eeprom) and tlv_index < tlv_end:
|
||||
if not self.is_valid_tlv(eeprom[tlv_index:]):
|
||||
break
|
||||
|
||||
tlv = eeprom[tlv_index:tlv_index + 2
|
||||
+ eeprom[tlv_index + 1]]
|
||||
code = "0x%02X" % (tlv[0])
|
||||
|
||||
if tlv[0] == self._TLV_CODE_VENDOR_EXT:
|
||||
value = str((tlv[2] << 24) | (tlv[3] << 16) |
|
||||
(tlv[4]<< 8) | tlv[5])
|
||||
value += str(tlv[6:6 + tlv[1]])
|
||||
else:
|
||||
name, value = self.decoder(None, tlv)
|
||||
|
||||
self.eeprom_tlv_dict[code] = value
|
||||
if eeprom[tlv_index] == self._TLV_CODE_CRC_32:
|
||||
break
|
||||
|
||||
tlv_index += eeprom[tlv_index+1] + 2
|
||||
|
||||
self.base_mac = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_MAC_BASE), 'NA')
|
||||
self.serial_number = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_SERIAL_NUMBER), 'NA')
|
||||
self.part_number = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_PART_NUMBER), 'NA')
|
||||
self.model_str = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_PRODUCT_NAME), 'NA')
|
||||
#self.serial = self.eeprom_tlv_dict.get(
|
||||
# "0x%X" % (self._TLV_CODE_SERVICE_TAG), 'NA')
|
||||
self.serial = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_SERIAL_NUMBER), 'NA')
|
||||
self.device_ver = self.eeprom_tlv_dict.get(
|
||||
"0x%X" % (self._TLV_CODE_DEVICE_VERSION), 'NA')
|
||||
|
||||
def _load_device_eeprom(self):
|
||||
"""
|
||||
Reads the Fan/PSU EEPROM and interprets as per the specified format
|
||||
"""
|
||||
self.serial_number = 'NA'
|
||||
self.part_number = 'NA'
|
||||
self.model_str = 'NA'
|
||||
self.service_tag = 'NA'
|
||||
self.mfg_date = 'NA'
|
||||
self.hw_rev = 'NA'
|
||||
|
||||
# PSU device eeproms use proprietary format
|
||||
if self.is_psu_eeprom:
|
||||
try:
|
||||
# Read Fan/PSU EEPROM as per the specified format.
|
||||
self.eeprom_data = EepromDecoder.read_eeprom(self)
|
||||
except Exception as e:
|
||||
sonic_logger.log_warning("Unable to read device eeprom for PSU#{}".format(self.index))
|
||||
return
|
||||
|
||||
# Bail out if PSU eeprom unavailable
|
||||
if self.eeprom_data[0] == 255:
|
||||
sonic_logger.log_warning("Uninitialized device eeprom for PSU#{}".format(self.index))
|
||||
return
|
||||
|
||||
(valid, data) = self._get_eeprom_field("Model")
|
||||
if valid:
|
||||
self.model_str = data.decode()
|
||||
|
||||
(valid, data) = self._get_eeprom_field("Part Number")
|
||||
if valid:
|
||||
self.part_number = data.decode()
|
||||
|
||||
(valid, data) = self._get_eeprom_field("PSU Rev")
|
||||
if valid:
|
||||
self.hw_rev = data.decode()
|
||||
|
||||
# Early PSU device eeproms were not programmed with serial #
|
||||
try:
|
||||
(valid, data) = self._get_eeprom_field("Serial Number")
|
||||
if valid:
|
||||
self.serial_number = data.decode()
|
||||
except Exception as e:
|
||||
sonic_logger.log_warning("Unable to read serial# of PSU#{}".format(self.index))
|
||||
return
|
||||
|
||||
# Fan device eeproms use proprietary proformat
|
||||
else:
|
||||
# Temporary hardcoded due to no eeprom data in FAN module
|
||||
self.model_str = 'NA'
|
||||
self.part_number = 'NA'
|
||||
self.serial_number = 'NA'
|
||||
|
||||
try:
|
||||
# Read Fan EEPROM as per ONIE TlvInfo EEPROM format.
|
||||
self.eeprom_data = EepromDecoder.read_eeprom(self)
|
||||
except Exception as e:
|
||||
sonic_logger.log_warning("Unable to read device eeprom for Fan#{}".format(self.index))
|
||||
return
|
||||
|
||||
# Bail out if FAN eeprom unavailable
|
||||
if self.eeprom_data[0] == 255 or self.eeprom_data[0] == 15:
|
||||
sonic_logger.log_warning("Uninitialized device eeprom for Fan#{}".format(self.index))
|
||||
return
|
||||
|
||||
(valid, data) = self._get_eeprom_field("Model")
|
||||
if valid:
|
||||
self.model_str = data.decode()
|
||||
|
||||
(valid, data) = self._get_eeprom_field("Part Number")
|
||||
if valid:
|
||||
self.part_number = data.decode()
|
||||
|
||||
# Early FAN device eeproms were not programmed with serial #
|
||||
try:
|
||||
(valid, data) = self._get_eeprom_field("Serial Number")
|
||||
if valid:
|
||||
self.serial_number = data.decode()
|
||||
except Exception as e:
|
||||
sonic_logger.log_warning("Unable to read serial# of FAN#{}".format(self.index))
|
||||
return
|
||||
|
||||
def _get_eeprom_field(self, field_name):
|
||||
"""
|
||||
For a field name specified in the EEPROM format, returns the
|
||||
presence of the field and the value for the same.
|
||||
"""
|
||||
field_start = 0
|
||||
for field in self.format:
|
||||
field_end = field_start + field[2]
|
||||
if field[0] == field_name:
|
||||
return (True, self.eeprom_data[field_start:field_end])
|
||||
field_start = field_end
|
||||
|
||||
return (False, None)
|
||||
|
||||
def serial_number_str(self):
|
||||
"""
|
||||
Returns the serial number.
|
||||
"""
|
||||
return self.serial_number
|
||||
|
||||
def part_number_str(self):
|
||||
"""
|
||||
Returns the part number.
|
||||
"""
|
||||
return self.part_number
|
||||
|
||||
def revision_str(self):
|
||||
"""
|
||||
Return revision number
|
||||
"""
|
||||
return self.hw_rev
|
||||
|
||||
def airflow_fan_type(self):
|
||||
"""
|
||||
Returns the airflow fan type.
|
||||
"""
|
||||
if self.is_psu_eeprom:
|
||||
return int(self.psu_type.encode('hex'), 16)
|
||||
if self.is_fan_eeprom:
|
||||
return int(self.fan_type.encode('hex'), 16)
|
||||
|
||||
# System EEPROM specific methods
|
||||
def base_mac_addr(self):
|
||||
"""
|
||||
Returns the base MAC address found in the system EEPROM.
|
||||
"""
|
||||
return self.base_mac
|
||||
|
||||
def modelstr(self):
|
||||
"""
|
||||
Returns the Model name.
|
||||
"""
|
||||
return self.model_str
|
||||
|
||||
def serial_str(self):
|
||||
"""
|
||||
Returns the servicetag number.
|
||||
Currently, we treat it as serial number from syseeprom
|
||||
"""
|
||||
return self.serial
|
||||
|
||||
def device_version(self):
|
||||
"""
|
||||
Returns the device version.
|
||||
"""
|
||||
return self.device_ver
|
||||
|
||||
def system_eeprom_info(self):
|
||||
"""
|
||||
Returns a dictionary, where keys are the type code defined in
|
||||
ONIE EEPROM format and values are their corresponding values
|
||||
found in the system EEPROM.
|
||||
"""
|
||||
return self.eeprom_tlv_dict
|
@ -0,0 +1,576 @@
|
||||
########################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the Fans' information which are available in the platform
|
||||
#
|
||||
########################################################################
|
||||
|
||||
|
||||
try:
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
from sonic_platform_base.fan_base import FanBase
|
||||
from sonic_platform.eeprom import Eeprom
|
||||
from sonic_py_common import logger
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
smbus_present = 1
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
sonic_logger = logger.Logger('fan')
|
||||
|
||||
|
||||
MAX_G3748_FAN_SPEED = 17600
|
||||
WORKING_G3748_FAN_SPEED = 960
|
||||
|
||||
CPLD_I2C_ADDR = 0x66
|
||||
CPLD_FAN_STATUS_REG = 0x3B
|
||||
CPLD_FAN_SPEED_PWM_REG = 0x3C
|
||||
CPLD_FAN1_SPEED_CNT_REG = 0x3E
|
||||
CPLD_FAN2_SPEED_CNT_REG = 0x3F
|
||||
|
||||
#FAN_DIRECTION_EXHAUST = 'exhaust'
|
||||
#FAN_DIRECTION_INTAKE = 'intake'
|
||||
|
||||
class Fan(FanBase):
|
||||
"""Supermicro SSE-G3748 platform-specific Fan class"""
|
||||
I2C_CLASS_DIR = "/sys/class/i2c-adapter/"
|
||||
I2C_DEV_MAPPING = (['i2c-0/0-0066/hwmon/', 1])
|
||||
|
||||
def __init__(self, fan_index, fan_drawer, psu_fan=False, dependency=None):
|
||||
self.is_psu_fan = psu_fan
|
||||
G3748CPLD_I2C_DIR = "/sys/bus/i2c/devices/0-0066/"
|
||||
|
||||
if not self.is_psu_fan:
|
||||
# Fan is 1-based in Supermicro SSE-G3748 platforms
|
||||
self.index = fan_index + 1
|
||||
self.fan_drawer = fan_drawer
|
||||
|
||||
self.set_fan_pwm_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/pwm{}".format(self.index)
|
||||
self.get_fan_pwm_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/pwm{}".format(self.index)
|
||||
self.get_fan_speed_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/fan{}_input".format(self.index)
|
||||
self.get_fan_target_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/fan{}_target".format(self.index)
|
||||
self.set_fan_target_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/fan{}_target".format(self.index)
|
||||
self.get_fan_status_reg = G3748CPLD_I2C_DIR+"fan_status".format()
|
||||
self.fan_sys_frontled_reg = G3748CPLD_I2C_DIR+"fan_sys_frontled".format()
|
||||
|
||||
#self.fan_speed_cnt_reg = [ CPLD_FAN1_SPEED_CNT_REG, CPLD_FAN2_SPEED_CNT_REG]
|
||||
self.max_fan_speed = MAX_G3748_FAN_SPEED
|
||||
self.supported_led_color = ['off', 'green', 'red']
|
||||
|
||||
# Fan eeprom
|
||||
self.eeprom = Eeprom(is_fan=True, fan_index=self.index)
|
||||
else:
|
||||
# this is a PSU Fan
|
||||
self.index = fan_index
|
||||
self.dependency = dependency
|
||||
|
||||
def _get_i2c_register(self, reg_file):
|
||||
# On successful read, returns the value read from given
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
|
||||
try:
|
||||
with open(reg_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def _set_i2c_register(self, reg_file, value):
|
||||
# On successful write, the value read will be written on
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
|
||||
try:
|
||||
with open(reg_file, 'w') as fd:
|
||||
rv = fd.write(str(value))
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
# Ensure that the write operation has succeeded
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
time.sleep(3)
|
||||
if (int(self._get_i2c_register(reg_file)) != value ):
|
||||
rv = 'ERR'
|
||||
|
||||
return rv
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Retrieves the name of the Fan
|
||||
|
||||
Returns:
|
||||
string: The name of the Fan
|
||||
"""
|
||||
if not self.is_psu_fan:
|
||||
return "Fan{}".format(self.index)
|
||||
else:
|
||||
return "PSU{} Fan".format(self.index)
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence of the Fan Unit
|
||||
|
||||
Returns:
|
||||
bool: True if Fan is present, False if not
|
||||
"""
|
||||
#if smbus_present == 0:
|
||||
# #sonic_logger.log_info("PMON fan-smbus ERROR - presence ")
|
||||
# cmdstatus, fanstatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x3B')
|
||||
# fanstatus = int(fanstatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x3B
|
||||
# fanstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#
|
||||
#if self.index == 1:
|
||||
# fanstatus = fanstatus & 4
|
||||
# if fanstatus == 4:
|
||||
# return True
|
||||
#if self.index == 2:
|
||||
# fanstatus = fanstatus & 8
|
||||
# if fanstatus == 8:
|
||||
# return True
|
||||
#return False
|
||||
fanstatus = self._get_i2c_register(self.get_fan_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
fanstatus = int(fanstatus) & 4
|
||||
if fanstatus == 4:
|
||||
return True
|
||||
if self.index == 2:
|
||||
fanstatus = int(fanstatus) & 8
|
||||
if fanstatus == 8:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the model number of the Fan
|
||||
|
||||
Returns:
|
||||
string: Model number of Fan.
|
||||
"""
|
||||
return self.eeprom.modelstr()
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the Fan
|
||||
|
||||
Returns:
|
||||
string: Serial number of Fan
|
||||
"""
|
||||
return self.eeprom.serial_number_str()
|
||||
|
||||
def get_part_number(self):
|
||||
"""
|
||||
Retrieves the part number of the Fan
|
||||
|
||||
Returns:
|
||||
string: Part number of Fan
|
||||
"""
|
||||
return self.eeprom.part_number_str()
|
||||
|
||||
def get_service_tag(self):
|
||||
"""
|
||||
Retrieves the service tag of the Fan
|
||||
|
||||
Returns:
|
||||
string: Service Tag of Fan
|
||||
"""
|
||||
#return self.eeprom.service_tag_str()
|
||||
return 'N/A'
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the Fan
|
||||
|
||||
Returns:
|
||||
bool: True if Fan is operating properly, False if not
|
||||
"""
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, fanstatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x3B')
|
||||
# fanstatus = int(fanstatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x3B
|
||||
# fanstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#if self.index == 1:
|
||||
# fanstatus = fanstatus & 0x10
|
||||
# if fanstatus == 0:
|
||||
# return True
|
||||
#if self.index == 2:
|
||||
# fanstatus = fanstatus & 0x20
|
||||
# if fanstatus == 0:
|
||||
# return True
|
||||
#return False
|
||||
fanstatus = self._get_i2c_register(self.get_fan_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
fanstatus = int(fanstatus) & 0x10
|
||||
if fanstatus == 0:
|
||||
return True
|
||||
if self.index == 2:
|
||||
fanstatus = int(fanstatus) & 0x20
|
||||
if fanstatus == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_direction(self):
|
||||
"""
|
||||
Retrieves the fan airflow direction
|
||||
Possible fan directions (relative to port-side of device)
|
||||
Returns:
|
||||
A string, either FAN_DIRECTION_INTAKE or
|
||||
FAN_DIRECTION_EXHAUST depending on fan direction
|
||||
"""
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, fandir = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x3B')
|
||||
# fandir = int(fandir, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x3B
|
||||
# fandir = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#if self.index == 1:
|
||||
# fandir = fandir & 0x01
|
||||
# if fandir == 0:
|
||||
# return self.FAN_DIRECTION_EXHAUST
|
||||
#if self.index == 2:
|
||||
# fandir = fandir & 0x02
|
||||
# if fandir == 0:
|
||||
# return self.FAN_DIRECTION_EXHAUST
|
||||
fandir = self._get_i2c_register(self.get_fan_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
fandir = int(fandir) & 0x01
|
||||
if fandir == 0:
|
||||
return self.FAN_DIRECTION_EXHAUST
|
||||
if self.index == 2:
|
||||
fandir = int(fandir) & 0x02
|
||||
if fandir == 0:
|
||||
return self.FAN_DIRECTION_EXHAUST
|
||||
|
||||
#return 'intake'
|
||||
return self.FAN_DIRECTION_INTAKE
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent device
|
||||
"""
|
||||
return self.index
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether this device is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return True
|
||||
|
||||
|
||||
def get_speed(self):
|
||||
"""
|
||||
Retrieves the speed of a Front FAN in the tray in revolutions per
|
||||
minute defined by 1-based index
|
||||
:param index: An integer, 1-based index of the FAN to query speed
|
||||
:return: integer, denoting front FAN speed
|
||||
"""
|
||||
speed = 0
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, speedcnt = cmd.getstatusoutput('sudo i2cget -y 0 0x66 %d' % self.fan_speed_cnt_reg[self.index - 1])
|
||||
# speedcnt = int(speedcnt, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = self.fan_speed_cnt_reg[self.index - 1]
|
||||
# speedcnt = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
|
||||
#speed_in_rpm = (5000 * 60) / speedcnt
|
||||
#speed = 100*speed_in_rpm/MAX_G3748_FAN_SPEED
|
||||
|
||||
speed_in_rpm = int(self._get_i2c_register(self.get_fan_speed_reg))
|
||||
|
||||
speed = 100*int(speed_in_rpm)/MAX_G3748_FAN_SPEED
|
||||
if speed > 100:
|
||||
speed = 100
|
||||
|
||||
#sonic_logger.log_warning("fan get_speed speed is %d" % speed )
|
||||
#sonic_logger.log_warning("get_speed FAN{} FAN_RPM={} FAN_PWM={}".format(self.index, speed_in_rpm, speed))
|
||||
return int(speed)
|
||||
|
||||
def get_speed_tolerance(self):
|
||||
"""
|
||||
Retrieves the speed tolerance of the fan
|
||||
|
||||
Returns:
|
||||
An integer, the percentage of variance from target speed
|
||||
which is considered tolerable
|
||||
"""
|
||||
if self.get_presence():
|
||||
# The tolerance value is fixed as 25% for this platform
|
||||
tolerance = 25
|
||||
else:
|
||||
tolerance = 0
|
||||
|
||||
return tolerance
|
||||
|
||||
def set_speed(self, speed):
|
||||
"""
|
||||
Set fan speed to expected value
|
||||
Args:
|
||||
speed: An integer, the percentage of full fan speed to set
|
||||
fan to, in the range 0 (off) to 100 (full speed)
|
||||
Returns:
|
||||
bool: True if set success, False if fail.
|
||||
"""
|
||||
if self.is_psu_fan:
|
||||
return False
|
||||
|
||||
# Set current fan duty cycle
|
||||
# - 0x00 : fan off (0 rpm)
|
||||
# - 0x0F : 50% duty cycle (8800 rpm)
|
||||
# - 0x1F : 100% duty cycle (17600 rpm)
|
||||
#fan_speed_pwm_reg_val = int((speed * 31) / 100)
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, rv = cmd.getstatusoutput('sudo i2cset -y 0 0x66 0x3C %d' % fan_speed_pwm_reg_val)
|
||||
# if cmdstatus:
|
||||
# sonic_logger.log_warning("fan set_speed cmdstatus i2c write failed %s" % rv )
|
||||
# return False
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x3C
|
||||
# bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG, fan_speed_pwm_reg_val)
|
||||
|
||||
rv = self._set_i2c_register(self.set_fan_pwm_reg, speed)
|
||||
#sonic_logger.log_warning("fan set_speed PWM reg is %d" % speed )
|
||||
#sonic_logger.log_warning("set_speed FAN{} FAN_PWM_REG={}".format(self.index, speed))
|
||||
|
||||
return True
|
||||
|
||||
## - 0x00 : fan off
|
||||
## - 0x40 : 25% duty cycle
|
||||
## - 0x80 : 50% duty cycle (default)
|
||||
## - 0xff : 100% duty cycle (full speed)
|
||||
#if speed in range(0, 6):
|
||||
# fandutycycle = 0x00
|
||||
#elif speed in range(6, 41):
|
||||
# fandutycycle = 64
|
||||
#elif speed in range(41, 76):
|
||||
# fandutycycle = 128
|
||||
#elif speed in range(76, 101):
|
||||
# fandutycycle = 255
|
||||
#else:
|
||||
# return False
|
||||
|
||||
#rv = self._set_i2c_register(self.set_fan_speed_reg, fandutycycle)
|
||||
#sonic_logger.log_warning("fan set_speed PWM reg is %d" % speed )
|
||||
#if (rv != 'ERR'):
|
||||
# return True
|
||||
#else:
|
||||
# return False
|
||||
|
||||
def set_status_led(self, color):
|
||||
"""
|
||||
Set led to expected color
|
||||
Args:
|
||||
color: A string representing the color with which to set the
|
||||
fan module status LED
|
||||
Returns:
|
||||
bool: True if set success, False if fail.
|
||||
|
||||
off , red and green are the only settings 7215 fans
|
||||
"""
|
||||
|
||||
if self.is_psu_fan or (color not in self.supported_led_color):
|
||||
return False
|
||||
if (color == self.STATUS_LED_COLOR_AMBER):
|
||||
return False
|
||||
if (color == self.STATUS_LED_COLOR_RED):
|
||||
value = 0x10
|
||||
elif (color == self.STATUS_LED_COLOR_GREEN):
|
||||
value = 0x20
|
||||
elif (color == self.STATUS_LED_COLOR_OFF):
|
||||
value = 0x00
|
||||
else:
|
||||
return False
|
||||
|
||||
#if smbus_present == 0:
|
||||
# return False
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICEREG = 0x11
|
||||
# original = bus.read_byte_data(DEVICE_ADDRESS, DEVICEREG)
|
||||
# original = original & 0xCF
|
||||
# ledstatus = original | value
|
||||
# if (self.index == 1):
|
||||
# if (color == self.STATUS_LED_COLOR_GREEN):
|
||||
# ledstatus = ledstatus | 0x40
|
||||
# else:
|
||||
# ledstatus = ledstatus & 0xBF
|
||||
# elif self.index == 2:
|
||||
# if (color == self.STATUS_LED_COLOR_GREEN):
|
||||
# ledstatus = ledstatus | 0x80
|
||||
# else:
|
||||
# ledstatus = ledstatus & 0x7F
|
||||
# else:
|
||||
# return False
|
||||
|
||||
# bus.write_byte_data(DEVICE_ADDRESS, DEVICEREG, ledstatus)
|
||||
# #sonic_logger.log_warning("fan set_status_led FAN{} FAN_LED_REG={}".format(self.index, ledstatus))
|
||||
|
||||
original = self._get_i2c_register(self.fan_sys_frontled_reg)
|
||||
original = int(original) & 0xCF
|
||||
ledstatus = original | value
|
||||
if (self.index == 1):
|
||||
if (color == self.STATUS_LED_COLOR_GREEN):
|
||||
ledstatus = ledstatus | 0x40
|
||||
else:
|
||||
ledstatus = ledstatus & 0xBF
|
||||
elif self.index == 2:
|
||||
if (color == self.STATUS_LED_COLOR_GREEN):
|
||||
ledstatus = ledstatus | 0x80
|
||||
else:
|
||||
ledstatus = ledstatus & 0x7F
|
||||
else:
|
||||
return False
|
||||
|
||||
self._set_i2c_register(self.fan_sys_frontled_reg, ledstatus)
|
||||
#sonic_logger.log_warning("set_status_led FAN{} FAN_SYS_LED_REG={} color={}".format(self.index, ledstatus, color))
|
||||
|
||||
return True
|
||||
|
||||
def get_status_led(self):
|
||||
"""
|
||||
Gets the state of the fan status LED
|
||||
|
||||
Returns:
|
||||
A string, one of the predefined STATUS_LED_COLOR_* strings.
|
||||
"""
|
||||
|
||||
if self.is_psu_fan:
|
||||
return None
|
||||
|
||||
#if smbus_present == 0:
|
||||
# return None
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x11
|
||||
# ledstatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
ledstatus = int(self._get_i2c_register(self.fan_sys_frontled_reg))
|
||||
#sonic_logger.log_warning("get_status_led FAN{} FAN_SYS_LED_REG={}".format(self.index, ledstatus))
|
||||
|
||||
if ledstatus & 0x30 == 0x20:
|
||||
if self.index == 1:
|
||||
if ledstatus & 0x40 == 0x40:
|
||||
return self.STATUS_LED_COLOR_GREEN
|
||||
else:
|
||||
return self.STATUS_LED_COLOR_OFF
|
||||
elif self.index == 2:
|
||||
if ledstatus & 0x80 == 0x80:
|
||||
return self.STATUS_LED_COLOR_GREEN
|
||||
else:
|
||||
return self.STATUS_LED_COLOR_OFF
|
||||
else:
|
||||
return self.STATUS_LED_COLOR_OFF
|
||||
elif ledstatus & 0x30 == 0x10:
|
||||
return self.STATUS_LED_COLOR_RED
|
||||
elif ledstatus & 0x30 == 0x00:
|
||||
return self.STATUS_LED_COLOR_OFF
|
||||
|
||||
#elif ledstatus & 0x30 == 0x20:
|
||||
# return self.STATUS_LED_COLOR_RED
|
||||
#elif ledstatus & 0x30 == 0x00:
|
||||
# return self.STATUS_LED_COLOR_OFF
|
||||
|
||||
#if self.index == 1:
|
||||
# ledstatus = (ledstatus & 0x40)
|
||||
# ledstatus = ledstatus >> 4
|
||||
#elif self.index == 2:
|
||||
# ledstatus = (ledstatus & 0x80)
|
||||
# ledstatus = ledstatus >> 6
|
||||
#if ledstatus == 0x02:
|
||||
# return self.STATUS_LED_COLOR_RED
|
||||
#elif ledstatus == 0x1:
|
||||
# return self.STATUS_LED_COLOR_GREEN
|
||||
#else:
|
||||
# return self.STATUS_LED_COLOR_OFF
|
||||
|
||||
def get_target_speed(self):
|
||||
"""
|
||||
Retrieves the target (expected) speed of the fan
|
||||
|
||||
Returns:
|
||||
An integer, the percentage of full fan speed, in the range 0
|
||||
(off) to 100 (full speed)
|
||||
"""
|
||||
#speed = 0
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, rv = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x3C')
|
||||
# if cmdstatus:
|
||||
# sonic_logger.log_warning("fan get_target_speed cmdstatus i2c get failed %s" % rv )
|
||||
# return speed
|
||||
# rv = int(rv, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x3C
|
||||
# rv = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
|
||||
#if rv > 0x1F:
|
||||
# sonic_logger.log_warning("fan get_target_speed return value out of boundry")
|
||||
# return speed
|
||||
#speed = rv * 100 / 0x1F
|
||||
speed = int(self._get_i2c_register(self.get_fan_pwm_reg))
|
||||
|
||||
#sonic_logger.log_warning("get_target_speed FAN{} FAN_PWM_REG={}".format(self.index, speed))
|
||||
#sonic_logger.log_warning("fan get_target_speed speed is %d" % int(speed) )
|
||||
return int(speed)
|
||||
|
||||
#fan_duty = self._get_i2c_register(self.set_fan_speed_reg)
|
||||
#if (fan_duty != 'ERR'):
|
||||
# dutyspeed = int(fan_duty)
|
||||
# if dutyspeed == 0:
|
||||
# speed = 0
|
||||
# elif dutyspeed == 64:
|
||||
# speed = 25
|
||||
# elif dutyspeed == 128:
|
||||
# speed = 50
|
||||
# elif dutyspeed == 255:
|
||||
# speed = 100
|
||||
#
|
||||
#return speed
|
@ -0,0 +1,102 @@
|
||||
#############################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the Fan Drawer status which is available in the platform
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
try:
|
||||
from sonic_platform_base.fan_drawer_base import FanDrawerBase
|
||||
from sonic_py_common import logger
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
sonic_logger = logger.Logger('fan_drawer')
|
||||
|
||||
class G3748FanDrawer(FanDrawerBase):
|
||||
def __init__(self, index):
|
||||
super(G3748FanDrawer, self).__init__()
|
||||
self._index = index + 1
|
||||
self._led = None
|
||||
|
||||
def get_index(self):
|
||||
return self._index
|
||||
|
||||
def get_presence(self):
|
||||
return self._fan_list[0].get_presence()
|
||||
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the model number of the Fan Drawer
|
||||
Returns:
|
||||
string: Part number of Fan Drawer
|
||||
"""
|
||||
return self._fan_list[0].get_model()
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the Fan Drawer
|
||||
Returns:
|
||||
string: Serial number of Fan
|
||||
"""
|
||||
return self._fan_list[0].get_serial()
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the Fan Drawer
|
||||
Returns:
|
||||
bool: True if Fan is operating properly, False if not
|
||||
"""
|
||||
return self._fan_list[0].get_status()
|
||||
|
||||
def get_direction(self):
|
||||
return 'intake'
|
||||
|
||||
def set_status_led(self, color):
|
||||
"""
|
||||
Sets the state of the fan drawer status LED
|
||||
|
||||
Args:
|
||||
color: A string representing the color with which to set the
|
||||
fan drawer status LED
|
||||
|
||||
Returns:
|
||||
bool: True if status LED state is set successfully, False if not
|
||||
"""
|
||||
return self._fan_list[0].set_status_led(color)
|
||||
|
||||
def get_status_led(self):
|
||||
"""
|
||||
Gets the state of the fan drawer LED
|
||||
|
||||
Returns:
|
||||
A string, one of the predefined STATUS_LED_COLOR_* strings
|
||||
"""
|
||||
return self._fan_list[0].get_status_led()
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether this device is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return True
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent device
|
||||
"""
|
||||
return self._index
|
||||
|
||||
|
||||
# For Supermicro SSE-G3748 platforms with fan drawer(s)
|
||||
class RealDrawer(G3748FanDrawer):
|
||||
def __init__(self, index):
|
||||
super(RealDrawer, self).__init__(index)
|
||||
self._name = 'drawer{}'.format(self._index)
|
||||
|
||||
def get_name(self):
|
||||
return self._name
|
@ -0,0 +1,57 @@
|
||||
#######################################################################
|
||||
# Module contains a platform specific implementation of SONiC Platform
|
||||
# Base PCIe class
|
||||
#######################################################################
|
||||
import os
|
||||
import re
|
||||
|
||||
try:
|
||||
from sonic_platform_base.sonic_pcie.pcie_common import PcieUtil
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
SYSFS_PCI_DEVICE_PATH = '/sys/bus/pci/devices/'
|
||||
|
||||
class Pcie(PcieUtil):
|
||||
# Check the current PCIe device with config file and return the result.
|
||||
# It uses bus from _device_id_to_bus_map instead of from default in yaml file.
|
||||
def get_pcie_check(self):
|
||||
self.load_config_file()
|
||||
for item_conf in self.confInfo:
|
||||
id_conf = item_conf["id"]
|
||||
dev_conf = item_conf["dev"]
|
||||
fn_conf = item_conf["fn"]
|
||||
bus_conf = self._device_id_to_bus_map.get(str(id_conf))
|
||||
if bus_conf and self.check_pcie_sysfs(bus=int(bus_conf, base=16), device=int(dev_conf, base=16),
|
||||
func=int(fn_conf, base=16)):
|
||||
item_conf["result"] = "Passed"
|
||||
else:
|
||||
item_conf["result"] = "Failed"
|
||||
return self.confInfo
|
||||
|
||||
# Create bus from device id and store in self._device_id_to_bus_map
|
||||
def _create_device_id_to_bus_map(self):
|
||||
self._device_id_to_bus_map = {}
|
||||
self.load_config_file()
|
||||
device_folders = os.listdir(SYSFS_PCI_DEVICE_PATH)
|
||||
# Search for device folder name pattern in sysfs tree.
|
||||
# If there is a matching pattern found, create an id to bus mapping.
|
||||
# Save the mapping in self._device_id_to_bus_map[ ].
|
||||
# Device folder name pattern: dddd:bb:ii:f
|
||||
# where dddd - 4 hex digit of domain
|
||||
# bb - 2 hex digit of bus
|
||||
# ii - 2 hex digit of id
|
||||
# f - 1 digit of fn
|
||||
for folder in device_folders:
|
||||
pattern_for_device_folder = re.search('....:(..):..\..', folder)
|
||||
if pattern_for_device_folder:
|
||||
bus = pattern_for_device_folder.group(1)
|
||||
with open(os.path.join('/sys/bus/pci/devices', folder, 'device'), 'r') as device_file:
|
||||
# The 'device' file contain an hex repesantaion of the id key in the yaml file.
|
||||
# We will strip the new line character, and remove the 0x prefix that is not needed.
|
||||
device_id = device_file.read().strip().replace('0x', '')
|
||||
self._device_id_to_bus_map[device_id] = bus
|
||||
|
||||
def __init__(self, platform_path):
|
||||
PcieUtil.__init__(self, platform_path)
|
||||
self._create_device_id_to_bus_map()
|
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
#############################################################################
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the platform information
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
try:
|
||||
from sonic_platform_base.platform_base import PlatformBase
|
||||
from sonic_platform.chassis import Chassis
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
class Platform(PlatformBase):
|
||||
|
||||
def __init__(self):
|
||||
PlatformBase.__init__(self)
|
||||
self._chassis = Chassis()
|
||||
|
@ -0,0 +1,527 @@
|
||||
#######################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the PSUs' information which are available in the platform
|
||||
#
|
||||
########################################################################
|
||||
|
||||
try:
|
||||
import os
|
||||
import sys
|
||||
from sonic_platform_base.psu_base import PsuBase
|
||||
from sonic_py_common import logger
|
||||
from sonic_platform.eeprom import Eeprom
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
smbus_present = 1
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
sonic_logger = logger.Logger('psu')
|
||||
|
||||
class Psu(PsuBase):
|
||||
"""Supermicro platform-specific PSU class for SSE-G3748 """
|
||||
def __init__(self, psu_index):
|
||||
PsuBase.__init__(self)
|
||||
self.PSU_OUTPUT_VOLTAGE_MIN = 11
|
||||
self.PSU_OUTPUT_VOLTAGE_MAX = 13
|
||||
G3748CPLD_I2C_DIR = "/sys/bus/i2c/devices/0-0066/"
|
||||
# PSU is 1-based in SMC G3748 platforms
|
||||
self.index = psu_index + 1
|
||||
self._fan_list = []
|
||||
|
||||
self.get_psu_voltage_reg = G3748CPLD_I2C_DIR+"hwmon/hwmon3/in{}_input".format(self.index)
|
||||
self.get_psu_status_reg = G3748CPLD_I2C_DIR+"psu_status".format()
|
||||
self.psu_frontled_reg = G3748CPLD_I2C_DIR+"psu_frontled".format()
|
||||
|
||||
# PSU eeprom
|
||||
self.eeprom = Eeprom(is_psu=True, psu_index=self.index)
|
||||
|
||||
def _read_sysfs_file(self, sysfs_file):
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(sysfs_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(sysfs_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def _write_sysfs_file(self, sysfs_file, value):
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(sysfs_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(sysfs_file, 'w') as fd:
|
||||
rv = fd.write(str(value))
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
# Ensure that the write operation has succeeded
|
||||
if (int(self._read_sysfs_file(sysfs_file)) != value ):
|
||||
time.sleep(3)
|
||||
if (int(self._read_sysfs_file(sysfs_file)) != value ):
|
||||
rv = 'ERR'
|
||||
|
||||
return rv
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Retrieves the name of the device
|
||||
|
||||
Returns:
|
||||
string: The name of the device
|
||||
"""
|
||||
return "PSU{}".format(self.index)
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence of the Power Supply Unit (PSU)
|
||||
|
||||
Returns:
|
||||
bool: True if PSU is present, False if not
|
||||
"""
|
||||
|
||||
#if smbus_present == 0: # if called from psuutil outside of pmon
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 1
|
||||
# if psustatus == 1:
|
||||
# return True
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 2
|
||||
# if psustatus == 2:
|
||||
# return True
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 1
|
||||
if psustatus == 1:
|
||||
return True
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 2
|
||||
if psustatus == 2:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the model of the PSU
|
||||
|
||||
Returns:
|
||||
string: Model name of PSU.
|
||||
Part number of PSU if model name is not available.
|
||||
"""
|
||||
if self.eeprom.modelstr() == "NA":
|
||||
return self.eeprom.part_number_str()
|
||||
else:
|
||||
return self.eeprom.modelstr()
|
||||
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the PSU
|
||||
|
||||
Returns:
|
||||
string: Serial number of PSU
|
||||
"""
|
||||
return self.eeprom.serial_number_str()
|
||||
|
||||
|
||||
def get_part_number(self):
|
||||
"""
|
||||
Retrieves the part number of the PSU
|
||||
|
||||
Returns:
|
||||
string: Part number of PSU
|
||||
"""
|
||||
return self.eeprom.part_number_str()
|
||||
|
||||
def get_revision(self):
|
||||
"""
|
||||
Retrieves the hardware revision number of the PSU
|
||||
|
||||
Returns:
|
||||
string: Revision number of PSU
|
||||
"""
|
||||
return self.eeprom.revision_str()
|
||||
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the PSU
|
||||
|
||||
Returns:
|
||||
bool: True if PSU is operating properly, False if not
|
||||
"""
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
# sonic_logger.log_warning("PMON psu-smbus - presence = 0 ")
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 4
|
||||
# if psustatus == 4:
|
||||
# return False
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 8
|
||||
# if psustatus == 8:
|
||||
# return False
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 4
|
||||
if psustatus == 4:
|
||||
return False
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 8
|
||||
if psustatus == 8:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def get_voltage(self):
|
||||
"""
|
||||
Retrieves current PSU voltage output
|
||||
|
||||
Returns:
|
||||
A float number, the output voltage in volts,
|
||||
e.g. 12.1
|
||||
"""
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 4
|
||||
# if psustatus == 0:
|
||||
# psu_voltage = 12.0
|
||||
# return psu_voltage
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 8
|
||||
# if psustatus == 0:
|
||||
# psu_voltage = 12.0
|
||||
# return psu_voltage
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 4
|
||||
if psustatus == 0:
|
||||
psu_voltage = 12.0
|
||||
return psu_voltage
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 8
|
||||
if psustatus == 0:
|
||||
psu_voltage = 12.0
|
||||
return psu_voltage
|
||||
|
||||
psu_voltage = 0.0
|
||||
return psu_voltage
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent device
|
||||
"""
|
||||
return self.index
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether this device is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return True
|
||||
|
||||
def get_powergood_status(self):
|
||||
"""
|
||||
Retrieves the powergood status of PSU
|
||||
Returns:
|
||||
A boolean, True if PSU has stablized its output voltages and
|
||||
passed all its internal self-tests, False if not.
|
||||
"""
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 4
|
||||
# if psustatus == 0:
|
||||
# return True
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 8
|
||||
# if psustatus == 0:
|
||||
# return True
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 4
|
||||
if psustatus == 0:
|
||||
return True
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 8
|
||||
if psustatus == 0:
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def get_status_led(self):
|
||||
"""
|
||||
Gets the state of the PSU status LED
|
||||
|
||||
Returns:
|
||||
A string, one of the predefined STATUS_LED_COLOR_* strings.
|
||||
"""
|
||||
if self.get_powergood_status():
|
||||
return self.STATUS_LED_COLOR_GREEN
|
||||
else:
|
||||
return self.STATUS_LED_COLOR_OFF
|
||||
|
||||
def set_status_led(self, color):
|
||||
"""
|
||||
Sets the state of the PSU status LED
|
||||
Args:
|
||||
color: A string representing the color with which to set the
|
||||
PSU status LED
|
||||
Returns:
|
||||
bool: True if status LED state is set successfully, False if
|
||||
not
|
||||
"""
|
||||
# The firmware running in the PSU controls the LED
|
||||
# and the PSU LED state cannot be changed from CPU.
|
||||
|
||||
# Read current psu led register
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psuled = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0x12')
|
||||
# psuled = int(psuled, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x12
|
||||
# psuled = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
psuled = self._read_sysfs_file(self.psu_frontled_reg)
|
||||
|
||||
if color == self.STATUS_LED_COLOR_GREEN:
|
||||
if self.index == 1:
|
||||
psuled = int(psuled) & 0x0C | 0x02
|
||||
if self.index == 2:
|
||||
psuled = int(psuled) & 0x03 | 0x08
|
||||
if color == self.STATUS_LED_COLOR_RED:
|
||||
if self.index == 1:
|
||||
psuled = int(psuled) & 0x0C | 0x01
|
||||
if self.index == 2:
|
||||
psuled = int(psuled) & 0x03 | 0x04
|
||||
if color == self.STATUS_LED_COLOR_OFF:
|
||||
if self.index == 1:
|
||||
psuled = int(psuled) & 0x0C
|
||||
if self.index == 2:
|
||||
psuled = int(psuled) & 0x03
|
||||
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cset -y 0 0x66 0x12 %d' % psuled)
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0x12
|
||||
# psustatus = bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG, psuled)
|
||||
|
||||
self._write_sysfs_file(self.psu_frontled_reg, psuled)
|
||||
#sonic_logger.log_warning("set_status_led PSU{} color={} PSU_LED_REG={}".format(self.index, color, psuled))
|
||||
|
||||
return True
|
||||
|
||||
def get_status_master_led(self):
|
||||
"""
|
||||
Gets the state of the front panel PSU status LED
|
||||
|
||||
Returns:
|
||||
A string, one of the predefined STATUS_LED_COLOR_* strings.
|
||||
"""
|
||||
if (not os.path.isfile("/sys/class/gpio/psuLedGreen/value") or
|
||||
not os.path.isfile("/sys/class/gpio/psuLedAmber/value")):
|
||||
return None
|
||||
|
||||
green = self._read_sysfs_file("/sys/class/gpio/psuLedGreen/value")
|
||||
amber = self._read_sysfs_file("/sys/class/gpio/psuLedAmber/value")
|
||||
if green == "ERR" or amber == "ERR":
|
||||
return None
|
||||
if green == "1":
|
||||
return self.STATUS_LED_COLOR_GREEN
|
||||
elif amber == "1":
|
||||
return self.STATUS_LED_COLOR_AMBER
|
||||
else:
|
||||
return None
|
||||
|
||||
def set_status_master_led(self, color):
|
||||
"""
|
||||
Sets the state of the front panel PSU status LED
|
||||
|
||||
Returns:
|
||||
bool: True if status LED state is set successfully, False if
|
||||
not
|
||||
"""
|
||||
if (not os.path.isfile("/sys/class/gpio/psuLedGreen/value") or
|
||||
not os.path.isfile("/sys/class/gpio/psuLedAmber/value")):
|
||||
return False
|
||||
|
||||
if color == self.STATUS_LED_COLOR_GREEN:
|
||||
rvg = self._write_sysfs_file("/sys/class/gpio/psuLedGreen/value", 1)
|
||||
if rvg != "ERR":
|
||||
rva = self._write_sysfs_file("/sys/class/gpio/psuLedAmber/value", 0)
|
||||
elif color == self.STATUS_LED_COLOR_AMBER:
|
||||
rvg = self._write_sysfs_file("/sys/class/gpio/psuLedGreen/value", 0)
|
||||
if rvg != "ERR":
|
||||
rva = self._write_sysfs_file("/sys/class/gpio/psuLedAmber/value", 1)
|
||||
else:
|
||||
return False
|
||||
|
||||
if rvg == "ERR" or rva == "ERR":
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
def get_power(self):
|
||||
"""
|
||||
Retrieves the output power of the PSU
|
||||
|
||||
Returns:
|
||||
string: output power of PSU
|
||||
"""
|
||||
#return self.eeprom.power_str()
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 4
|
||||
# if psustatus == 0:
|
||||
# psu_power = 150
|
||||
# return psu_power
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 8
|
||||
# if psustatus == 0:
|
||||
# psu_power = 150
|
||||
# return psu_power
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 4
|
||||
if psustatus == 0:
|
||||
psu_power = 150
|
||||
return psu_power
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 8
|
||||
if psustatus == 0:
|
||||
psu_power = 150
|
||||
return psu_power
|
||||
|
||||
psu_power = 0
|
||||
return psu_power
|
||||
|
||||
def get_current(self):
|
||||
"""
|
||||
Retrieves the output current of the PSU
|
||||
|
||||
Returns:
|
||||
string: output current of PSU
|
||||
"""
|
||||
#return self.eeprom.current_str()
|
||||
#if smbus_present == 0:
|
||||
# cmdstatus, psustatus = cmd.getstatusoutput('sudo i2cget -y 0 0x66 0xa')
|
||||
# psustatus = int(psustatus, 16)
|
||||
#else:
|
||||
# bus = smbus.SMBus(0)
|
||||
# DEVICE_ADDRESS = 0x66
|
||||
# DEVICE_REG = 0xa
|
||||
# psustatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
#
|
||||
#if self.index == 1:
|
||||
# psustatus = psustatus & 4
|
||||
# if psustatus == 0:
|
||||
# psu_current = 12.5
|
||||
# return psu_current
|
||||
#if self.index == 2:
|
||||
# psustatus = psustatus & 8
|
||||
# if psustatus == 0:
|
||||
# psu_current = 12.5
|
||||
# return psu_current
|
||||
psustatus = self._read_sysfs_file(self.get_psu_status_reg)
|
||||
|
||||
if self.index == 1:
|
||||
psustatus = int(psustatus) & 4
|
||||
if psustatus == 0:
|
||||
psu_current = 12.5
|
||||
return psu_current
|
||||
if self.index == 2:
|
||||
psustatus = int(psustatus) & 8
|
||||
if psustatus == 0:
|
||||
psu_current = 12.5
|
||||
return psu_current
|
||||
|
||||
psu_current = 0.0
|
||||
return psu_current
|
||||
|
||||
def get_voltage_high_threshold(self):
|
||||
"""
|
||||
Retrieves the high threshold PSU voltage output
|
||||
Returns:
|
||||
A float number, the high threshold output voltage in volts,
|
||||
e.g. 12.1
|
||||
"""
|
||||
return float(self.PSU_OUTPUT_VOLTAGE_MAX)
|
||||
|
||||
def get_voltage_low_threshold(self):
|
||||
"""
|
||||
Retrieves the low threshold PSU voltage output
|
||||
Returns:
|
||||
A float number, the low threshold output voltage in volts,
|
||||
e.g. 12.1
|
||||
"""
|
||||
return float(self.PSU_OUTPUT_VOLTAGE_MIN)
|
||||
|
||||
|
@ -0,0 +1,573 @@
|
||||
#############################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the platform information by using sfp refactor spec
|
||||
#
|
||||
#############################################################################
|
||||
#
|
||||
# There are 2 IO Expander connect to SFP transceiver status/control
|
||||
#---------------------------------------------------------------------------
|
||||
#
|
||||
# SFP transceiver status:
|
||||
#
|
||||
# PCAL6524 -- [I2C 0x22] 24 bits I/O for SFP status and TX_DIS
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP1 SFP1 SFP1 SFP1 SFP0 SFP0 SFP0 SFP0
|
||||
#
|
||||
# Port 1 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP3 SFP3 SFP3 SFP3 SFP2 SFP2 SFP2 SFP2
|
||||
#
|
||||
# Port 2 -- 7 6 5 4 3 2 1 0
|
||||
# TX_FAULT TX_DIS LOS PRESENT TX_FAULT TX_DIS LOS PRESENT
|
||||
# SFP5 SFP5 SFP5 SFP5 SFP4 SFP4 SFP4 SFP4
|
||||
# [TX_DIS bit is output, all other bits are input]
|
||||
#---------------------------------------------------------------------------
|
||||
#
|
||||
# SFP transceiver control:
|
||||
#
|
||||
# PCAL6416A -- [I2C 0x20] 16 bits I/) Expander SFP RS0 and RS1
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# RS0 RS1 RS0 RS1 RS0 RS1 RS0 RS1
|
||||
# SF2 SF3 SF0 SF1
|
||||
#
|
||||
# Port 0 -- 7 6 5 4 3 2 1 0
|
||||
# N/A N/A N/A N/A RS0 RS1 RS0 RS1
|
||||
# SF4 SF5
|
||||
# [ All bits are output]
|
||||
#
|
||||
#############################################################################
|
||||
|
||||
try:
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import subprocess
|
||||
from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase
|
||||
from sonic_platform_base.sfp_base import SfpBase
|
||||
|
||||
from sonic_py_common import logger
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
smbus_present = 1
|
||||
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
QSFP_INFO_OFFSET = 128
|
||||
SFP_INFO_OFFSET = 0
|
||||
QSFP_DD_PAGE0 = 0
|
||||
|
||||
SFP_TYPE_LIST = [
|
||||
'0x3' # SFP/SFP+/SFP28 and later
|
||||
]
|
||||
QSFP_TYPE_LIST = [
|
||||
'0x0c', # QSFP
|
||||
'0x0d', # QSFP+ or later
|
||||
'0x11' # QSFP28 or later
|
||||
]
|
||||
QSFP_DD_TYPE_LIST = [
|
||||
'0x18' #QSFP_DD Type
|
||||
]
|
||||
|
||||
OSFP_TYPE_LIST = [
|
||||
'0x19' # OSFP 8X Type
|
||||
]
|
||||
|
||||
COPPER_TYPE = "COPPER"
|
||||
SFP_TYPE = "SFP"
|
||||
RJ45_TYPE = "RJ45"
|
||||
|
||||
# SFP PORT numbers
|
||||
SFP_PORT_START = 49
|
||||
SFP_PORT_END = 54
|
||||
|
||||
SYSLOG_IDENTIFIER = "xcvrd"
|
||||
sonic_logger = logger.Logger(SYSLOG_IDENTIFIER)
|
||||
|
||||
class Sfp(SfpOptoeBase):
|
||||
"""
|
||||
Supermicro SSE-G3748 refactor Platform-specific Sfp class
|
||||
"""
|
||||
|
||||
def __init__(self, index, sfp_type, eeprom_path, port_i2c_map):
|
||||
SfpOptoeBase.__init__(self)
|
||||
self.index = index
|
||||
self.port_num = index
|
||||
self.eeprom_path = eeprom_path
|
||||
self.sfp_eeprom_path = eeprom_path
|
||||
#port_type is the native port type and sfp_type is the transceiver type
|
||||
#sfp_type will be detected in get_transceiver_info
|
||||
self.port_type = sfp_type
|
||||
if (self.index < SFP_PORT_START):
|
||||
self.port_type = RJ45_TYPE
|
||||
self.sfp_type = self.port_type
|
||||
|
||||
self._port_to_i2c_mapping = port_i2c_map
|
||||
self.port_name = sfp_type + str(index)
|
||||
|
||||
self._initialize_media(delay=False)
|
||||
|
||||
# def __is_host(self):
|
||||
# return os.system(self.HOST_CHK_CMD) == 0
|
||||
#
|
||||
# def __get_path_to_port_config_file(self):
|
||||
# platform_path = "/".join([self.PLATFORM_ROOT_PATH, self.PLATFORM])
|
||||
# hwsku_path = "/".join([platform_path, self.HWSKU]
|
||||
# ) if self.__is_host() else self.PMON_HWSKU_PATH
|
||||
# sonic_logger.log_warning("sfp __get_path_to_port_config_file hwsku_path = %s" % hwsku_path)
|
||||
|
||||
def sfp_status_get_value(self, port_off):
|
||||
reg_in = [0x00, 0x00, 0x01, 0x01, 0x02, 0x02]
|
||||
|
||||
if smbus_present == 0: # if called from sfputil outside of pmon
|
||||
regin = reg_in[port_off]
|
||||
cmdstatus, sfpstatus = cmd.getstatusoutput('sudo i2cget -y 1 0x22 %d' % regin)
|
||||
if cmdstatus:
|
||||
sonic_logger.log_warning("sfp cmdstatus i2c get failed %s" % status)
|
||||
return False
|
||||
sfpStatus = int(sfpstatus, 16)
|
||||
else:
|
||||
bus = smbus.SMBus(1)
|
||||
DEVICE_ADDRESS = 0x22
|
||||
DEVICE_REG = reg_in[port_off]
|
||||
sfpStatus = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
|
||||
return sfpStatus
|
||||
|
||||
def sfp_status_set_value(self, port_off, val):
|
||||
reg_out = [0x04, 0x04, 0x05, 0x05, 0x06, 0x06]
|
||||
|
||||
if smbus_present == 0: # if called from sfputil outside of pmon
|
||||
regout = reg_out[port_off]
|
||||
i2csetcmd = "i2cset -y 1 0x22 " + hex(regout) + hex(val)
|
||||
cmdstatus, output = cmd.getstatusoutput(i2csetcmd)
|
||||
if cmdstatus:
|
||||
sonic_logger.log_warning("sfp cmdstatus i2c write failed %s" % output )
|
||||
return False
|
||||
else:
|
||||
bus = smbus.SMBus(1)
|
||||
DEVICE_ADDRESS = 0x22
|
||||
DEVICE_REG = reg_out[port_off]
|
||||
bus.write_byte_data(DEVICE_ADDRESS, DEVICE_REG, val)
|
||||
|
||||
return True
|
||||
|
||||
def _initialize_media(self, delay=False):
|
||||
"""
|
||||
Initialize the media type and eeprom driver for SFP
|
||||
"""
|
||||
if delay:
|
||||
time.sleep(1)
|
||||
self._xcvr_api = None
|
||||
self.get_xcvr_api()
|
||||
|
||||
self.set_media_type()
|
||||
self.reinit_sfp_driver()
|
||||
|
||||
def set_media_type(self):
|
||||
"""
|
||||
Reads optic eeprom byte to determine media type inserted
|
||||
"""
|
||||
eeprom_raw = []
|
||||
eeprom_raw = self._xcvr_api_factory._get_id()
|
||||
if eeprom_raw is not None:
|
||||
eeprom_raw = hex(eeprom_raw)
|
||||
if eeprom_raw in SFP_TYPE_LIST:
|
||||
self.sfp_type = 'SFP'
|
||||
elif eeprom_raw in QSFP_TYPE_LIST:
|
||||
self.sfp_type = 'QSFP'
|
||||
elif eeprom_raw in QSFP_DD_TYPE_LIST:
|
||||
self.sfp_type = 'QSFP_DD'
|
||||
else:
|
||||
#Set native port type if EEPROM type is not recognized/readable
|
||||
self.sfp_type = self.port_type
|
||||
else:
|
||||
self.sfp_type = self.port_type
|
||||
|
||||
return self.sfp_type
|
||||
|
||||
def reinit_sfp_driver(self):
|
||||
"""
|
||||
Changes the driver based on media type detected
|
||||
"""
|
||||
"""
|
||||
del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(
|
||||
self._port_to_i2c_mapping[self.index])
|
||||
new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(
|
||||
self._port_to_i2c_mapping[self.index])
|
||||
driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(
|
||||
self._port_to_i2c_mapping[self.index])
|
||||
"""
|
||||
i2c_bus = self.sfp_eeprom_path[27:].split('/')[0]
|
||||
del_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/delete_device".format(i2c_bus)
|
||||
new_sfp_path = "/sys/class/i2c-adapter/i2c-{0}/new_device".format(i2c_bus)
|
||||
driver_path = "/sys/class/i2c-adapter/i2c-{0}/{0}-0050/name".format(i2c_bus)
|
||||
delete_device = "echo 0x50 >" + del_sfp_path
|
||||
|
||||
if not os.path.isfile(driver_path):
|
||||
#print(driver_path, "does not exist")
|
||||
return False
|
||||
|
||||
try:
|
||||
with os.fdopen(os.open(driver_path, os.O_RDONLY)) as filed:
|
||||
driver_name = filed.read()
|
||||
driver_name = driver_name.rstrip('\r\n')
|
||||
driver_name = driver_name.lstrip(" ")
|
||||
|
||||
#Avoid re-initialization of the QSFP/SFP optic on QSFP/SFP port.
|
||||
if self.sfp_type == 'SFP' and driver_name in ['optoe1', 'optoe3']:
|
||||
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(0.2)
|
||||
new_device = "echo optoe2 0x50 >" + new_sfp_path
|
||||
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(2)
|
||||
elif self.sfp_type == 'QSFP' and driver_name in ['optoe2', 'optoe3']:
|
||||
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(0.2)
|
||||
new_device = "echo optoe1 0x50 >" + new_sfp_path
|
||||
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(2)
|
||||
elif self.sfp_type == 'QSFP_DD' and driver_name in ['optoe1', 'optoe2']:
|
||||
subprocess.Popen(delete_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(0.2)
|
||||
new_device = "echo optoe3 0x50 >" + new_sfp_path
|
||||
subprocess.Popen(new_device, shell=True, stdout=subprocess.PIPE)
|
||||
time.sleep(2)
|
||||
|
||||
except IOError as err:
|
||||
print("Error: Unable to open file: %s" %str(err))
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
# Implemented in sfp_optoe_base
|
||||
# def get_model(self):
|
||||
# def get_serial(self):
|
||||
# def get_transceiver_info(self):
|
||||
# def get_transceiver_bulk_status(self):
|
||||
# def get_transceiver_threshold_info(self):
|
||||
|
||||
def get_transceiver_status(self):
|
||||
return {}
|
||||
|
||||
def get_transceiver_info(self):
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
transceiver_info_keys = ['manufacturer',
|
||||
'model',
|
||||
'vendor_rev',
|
||||
'serial',
|
||||
'vendor_oui',
|
||||
'vendor_date',
|
||||
'connector',
|
||||
'encoding',
|
||||
'ext_identifier',
|
||||
'ext_rateselect_compliance',
|
||||
'cable_type',
|
||||
'cable_length',
|
||||
'specification_compliance',
|
||||
'nominal_bit_rate',
|
||||
'application_advertisement']
|
||||
transceiver_info_dict = dict.fromkeys(transceiver_info_keys, 'N/A')
|
||||
transceiver_info_dict['type'] = self.sfp_type
|
||||
return transceiver_info_dict
|
||||
else:
|
||||
return super(Sfp, self).get_transceiver_info()
|
||||
|
||||
def get_transceiver_bulk_status(self):
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
transceiver_dom_info_dict = {}
|
||||
dom_info_dict_keys = ['temperature', 'voltage',
|
||||
'rx1power', 'rx2power',
|
||||
'rx3power', 'rx4power',
|
||||
'rx5power', 'rx6power',
|
||||
'rx7power', 'rx8power',
|
||||
'tx1bias', 'tx2bias',
|
||||
'tx3bias', 'tx4bias',
|
||||
'tx5bias', 'tx6bias',
|
||||
'tx7bias', 'tx8bias',
|
||||
'tx1power', 'tx2power',
|
||||
'tx3power', 'tx4power',
|
||||
'tx5power', 'tx6power',
|
||||
'tx7power', 'tx8power'
|
||||
]
|
||||
transceiver_dom_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A')
|
||||
return transceiver_dom_info_dict
|
||||
else:
|
||||
return super(Sfp, self).get_transceiver_bulk_status()
|
||||
|
||||
def get_transceiver_threshold_info(self):
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
transceiver_dom_threshold_info_dict = {}
|
||||
dom_info_dict_keys = ['temphighalarm', 'temphighwarning',
|
||||
'templowalarm', 'templowwarning',
|
||||
'vcchighalarm', 'vcchighwarning',
|
||||
'vcclowalarm', 'vcclowwarning',
|
||||
'rxpowerhighalarm', 'rxpowerhighwarning',
|
||||
'rxpowerlowalarm', 'rxpowerlowwarning',
|
||||
'txpowerhighalarm', 'txpowerhighwarning',
|
||||
'txpowerlowalarm', 'txpowerlowwarning',
|
||||
'txbiashighalarm', 'txbiashighwarning',
|
||||
'txbiaslowalarm', 'txbiaslowwarning'
|
||||
]
|
||||
transceiver_dom_threshold_info_dict = dict.fromkeys(dom_info_dict_keys, 'N/A')
|
||||
return transceiver_dom_threshold_info_dict
|
||||
else:
|
||||
return super(Sfp, self).get_transceiver_threshold_info()
|
||||
|
||||
# def get_transceiver_loopback(self):
|
||||
# def is_coherent_module(self):
|
||||
# def get_transceiver_pm(self):
|
||||
# def get_rx_los(self):
|
||||
# def get_tx_fault(self):
|
||||
# def get_tx_disable(self):
|
||||
# def get_tx_disable_channel(self):
|
||||
# def get_temperature(self):
|
||||
# def get_voltage(self):
|
||||
# def get_tx_bias(self):
|
||||
# def get_rx_power(self):
|
||||
# def get_tx_power(self):
|
||||
|
||||
def tx_disable(self, tx_disable):
|
||||
"""
|
||||
Disable SFP TX
|
||||
Args:
|
||||
tx_disable : A Boolean, True to enable tx_disable mode, False to disable
|
||||
tx_disable mode.
|
||||
Returns:
|
||||
A boolean, True if tx_disable is set successfully, False if not
|
||||
"""
|
||||
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return False
|
||||
|
||||
port_offset = self.index-SFP_PORT_START
|
||||
sfpstatus=self.sfp_status_get_value(port_offset)
|
||||
|
||||
tx_dis_bit = [0x04, 0x40, 0x04, 0x40, 0x04, 0x40]
|
||||
tx_en_bit = [0xFB, 0xBF, 0xFB, 0xBF, 0xFB, 0xBF]
|
||||
|
||||
if tx_disable == True:
|
||||
setbits = sfpstatus | tx_dis_bit[port_offset]
|
||||
else:
|
||||
setbits = sfpstatus & tx_en_bit[port_offset]
|
||||
|
||||
self.sfp_status_set_value(port_offset, setbits)
|
||||
|
||||
return True
|
||||
|
||||
# Implemented in sfp_optoe_base
|
||||
# def tx_disable_channel(self, channel, disable):
|
||||
# """
|
||||
# Sets the tx_disable for specified SFP channels
|
||||
# Args:
|
||||
# channel : A hex of 4 bits (bit 0 to bit 3) which represent channel 0 to 3,
|
||||
# e.g. 0x5 for channel 0 and channel 2.
|
||||
# disable : A boolean, True to disable TX channels specified in channel,
|
||||
# False to enable
|
||||
# Returns:
|
||||
# A boolean, True if successful, False if not
|
||||
# """
|
||||
#
|
||||
# return NotImplementedError
|
||||
|
||||
def get_power_override(self):
|
||||
"""
|
||||
Retrieves the power-override status of this SFP
|
||||
Returns:
|
||||
A Boolean, True if power-override is enabled, False if disabled
|
||||
"""
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return False
|
||||
if self.sfp_type == SFP_TYPE:
|
||||
return False
|
||||
|
||||
# Implemented in sfp_optoe_base
|
||||
# def set_power_override(self, power_override, power_set):
|
||||
# """
|
||||
# Sets SFP power level using power_override and power_set
|
||||
# Args:
|
||||
# power_override :
|
||||
# A Boolean, True to override set_lpmode and use power_set
|
||||
# to control SFP power, False to disable SFP power control
|
||||
# through power_override/power_set and use set_lpmode
|
||||
# to control SFP power.
|
||||
# power_set :
|
||||
# Only valid when power_override is True.
|
||||
# A Boolean, True to set SFP to low power mode, False to set
|
||||
# SFP to high power mode.
|
||||
# Returns:
|
||||
# A boolean, True if power-override and power_set are set successfully,
|
||||
# False if not
|
||||
# """
|
||||
#
|
||||
# return NotImplementedError
|
||||
|
||||
def get_eeprom_path(self):
|
||||
"""
|
||||
Returns SFP eeprom path
|
||||
"""
|
||||
return self.eeprom_path
|
||||
|
||||
def get_lpmode(self):
|
||||
"""
|
||||
Retrieves the lpmode (low power mode) status of this SFP
|
||||
Returns:
|
||||
A Boolean, True if lpmode is enabled, False if disabled
|
||||
"""
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return False
|
||||
if self.sfp_type == SFP_TYPE:
|
||||
return False
|
||||
|
||||
def set_lpmode(self, lpmode):
|
||||
"""
|
||||
Sets the lpmode (low power mode) of SFP
|
||||
Args:
|
||||
lpmode: A Boolean, True to enable lpmode, False to disable it
|
||||
Note : lpmode can be overridden by set_power_override
|
||||
Returns:
|
||||
A boolean, True if lpmode is set successfully, False if not
|
||||
"""
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return False
|
||||
if self.sfp_type == SFP_TYPE:
|
||||
return False
|
||||
|
||||
# def read_eeprom(self, offset, num_bytes):
|
||||
# def write_eeprom(self, offset, num_bytes, write_buffer):
|
||||
|
||||
def reset(self):
|
||||
"""
|
||||
Reset SFP.
|
||||
Returns:
|
||||
A boolean, True if successful, False if not
|
||||
"""
|
||||
# RJ45 and SFP ports not resettable
|
||||
return False
|
||||
|
||||
def get_error_description(self):
|
||||
"""
|
||||
Retrives the error descriptions of the SFP module
|
||||
|
||||
Returns:
|
||||
String that represents the current error descriptions of vendor specific errors
|
||||
In case there are multiple errors, they should be joined by '|',
|
||||
like: "Bad EEPROM|Unsupported cable"
|
||||
"""
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return super(Sfp, self).get_error_description()
|
||||
|
||||
if not self.get_presence():
|
||||
return self.SFP_STATUS_UNPLUGGED
|
||||
else:
|
||||
if not os.path.isfile(self.eeprom_path):
|
||||
return "EEPROM driver is not attached"
|
||||
|
||||
if self.sfp_type == 'SFP':
|
||||
offset = SFP_INFO_OFFSET
|
||||
elif self.sfp_type == 'QSFP':
|
||||
offset = QSFP_INFO_OFFSET
|
||||
elif self.sfp_type == 'QSFP_DD':
|
||||
offset = QSFP_DD_PAGE0
|
||||
|
||||
try:
|
||||
with open(self.eeprom_path, mode="rb", buffering=0) as eeprom:
|
||||
eeprom.seek(offset)
|
||||
eeprom.read(1)
|
||||
except OSError as e:
|
||||
return "EEPROM read failed ({})".format(e.strerror)
|
||||
|
||||
return self.SFP_STATUS_OK
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Returns native transceiver type
|
||||
Returns: string - The name of the device
|
||||
"""
|
||||
return RJ45_TYPE if self.index < SFP_PORT_START else "SFP/SFP+/SFP28"
|
||||
|
||||
# def get_name(self):
|
||||
# """
|
||||
# Retrieves the name of the device
|
||||
# Returns:
|
||||
# string: The name of the device
|
||||
# """
|
||||
# sfputil_helper = SfpUtilHelper()
|
||||
# sfputil_helper.read_porttab_mappings(
|
||||
# self.__get_path_to_port_config_file())
|
||||
# name = sfputil_helper.logical[self.index-1] or "Unknown"
|
||||
# return name
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence
|
||||
Returns:
|
||||
bool: True if is present, False if not
|
||||
"""
|
||||
if self.sfp_type == COPPER_TYPE or self.sfp_type == RJ45_TYPE:
|
||||
return False
|
||||
|
||||
port_offset = self.index-SFP_PORT_START
|
||||
sfpstatus = self.sfp_status_get_value(port_offset)
|
||||
|
||||
if ((port_offset%2) == 1):
|
||||
sfpstatus = (sfpstatus >> 4) & 0X01
|
||||
else:
|
||||
sfpstatus = sfpstatus & 0x01
|
||||
|
||||
if sfpstatus == 0:
|
||||
# Present. Turn off tx_disable
|
||||
self.tx_disable(False)
|
||||
return True
|
||||
|
||||
# Not present. Turn on tx_disable
|
||||
self.tx_disable(True)
|
||||
return False
|
||||
|
||||
def get_reset_status(self):
|
||||
"""
|
||||
Retrives the reset status of SFP
|
||||
"""
|
||||
reset_status = False
|
||||
return reset_status
|
||||
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the device
|
||||
Returns:
|
||||
A boolean value, True if device is operating properly, False if not
|
||||
"""
|
||||
return self.get_presence()
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether this device is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
|
||||
if self.sfp_type == "SFP":
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent device
|
||||
"""
|
||||
return self.index
|
||||
|
@ -0,0 +1,141 @@
|
||||
############################################################
|
||||
# listen for the SFP change event and return to chassis.
|
||||
############################################################
|
||||
|
||||
import math
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
from sonic_py_common import logger
|
||||
|
||||
smbus_present = 1
|
||||
|
||||
try:
|
||||
import smbus
|
||||
except ImportError as e:
|
||||
smbus_present = 0
|
||||
|
||||
if sys.version_info[0] < 3:
|
||||
import commands as cmd
|
||||
else:
|
||||
import subprocess as cmd
|
||||
|
||||
# system level event/error
|
||||
EVENT_ON_ALL_SFP = '-1'
|
||||
SYSTEM_NOT_READY = 'system_not_ready'
|
||||
SYSTEM_READY = 'system_become_ready'
|
||||
SYSTEM_FAIL = 'system_fail'
|
||||
|
||||
# SFP PORT numbers
|
||||
SFP_PORT_START = 49
|
||||
SFP_PORT_END = 54
|
||||
RJ45_PORT_START = 1
|
||||
RJ45_PORT_END = 48
|
||||
|
||||
SYSLOG_IDENTIFIER = "sfp_event"
|
||||
sonic_logger = logger.Logger(SYSLOG_IDENTIFIER)
|
||||
|
||||
|
||||
class sfp_event:
|
||||
''' Listen to plugin/plugout cable events '''
|
||||
|
||||
def __init__(self):
|
||||
self.handle = None
|
||||
|
||||
def initialize(self):
|
||||
self.modprs_register = 0
|
||||
# Get Transceiver status
|
||||
time.sleep(5)
|
||||
self.modprs_register = self._get_transceiver_status()
|
||||
sonic_logger.log_info("Initial SFP presence=%d" % self.modprs_register)
|
||||
|
||||
def deinitialize(self):
|
||||
if self.handle is None:
|
||||
return
|
||||
|
||||
def _get_transceiver_status(self):
|
||||
|
||||
reg_in = [0x00, 0x00, 0x01, 0x01, 0x02, 0x02]
|
||||
port = SFP_PORT_START
|
||||
|
||||
sfpstatus = 0
|
||||
while (port >= SFP_PORT_START and port <= SFP_PORT_END):
|
||||
if smbus_present == 0:
|
||||
sonic_logger.log_info(" PMON - smbus ERROR - DEBUG sfp_event ")
|
||||
regin = reg_in[port-SFP_PORT_START]
|
||||
cmdstatus, sfpreg = cmd.getstatusoutput('sudo i2cget -y 0 0x22 %d' % regin)
|
||||
sfpreg = int(sfpreg, 16)
|
||||
else:
|
||||
bus = smbus.SMBus(1)
|
||||
DEVICE_ADDRESS = 0x22
|
||||
DEVICE_REG = reg_in[port-SFP_PORT_START]
|
||||
sfpreg = bus.read_byte_data(DEVICE_ADDRESS, DEVICE_REG)
|
||||
|
||||
if ((port-SFP_PORT_START)%2) == 1:
|
||||
sfpreg = (sfpreg >> 4) & 0x01
|
||||
else:
|
||||
sfpreg = sfpreg & 0x01
|
||||
sfpstatus = sfpstatus | (sfpreg << (port-SFP_PORT_START))
|
||||
port += 1
|
||||
|
||||
return sfpstatus
|
||||
|
||||
def check_sfp_status(self, port_change, timeout):
|
||||
"""
|
||||
check_sfp_status called from get_change_event, this will return correct
|
||||
status of all 6 SFP ports if there is a change in any of them
|
||||
"""
|
||||
start_time = time.time()
|
||||
#port = SFP_PORT_START
|
||||
port = RJ45_PORT_START
|
||||
forever = False
|
||||
|
||||
if timeout == 0:
|
||||
forever = True
|
||||
elif timeout > 0:
|
||||
timeout = timeout / float(1000) # Convert to secs
|
||||
else:
|
||||
return False, {}
|
||||
end_time = start_time + timeout
|
||||
|
||||
if (start_time > end_time):
|
||||
return False, {} # Time wrap or possibly incorrect timeout
|
||||
|
||||
while (timeout >= 0):
|
||||
while (port >= RJ45_PORT_START and port <= RJ45_PORT_END):
|
||||
port_change[port] = '1'
|
||||
port += 1
|
||||
|
||||
# Check for OIR events and return updated port_change
|
||||
reg_value = self._get_transceiver_status()
|
||||
if (reg_value != self.modprs_register):
|
||||
changed_ports = (self.modprs_register ^ reg_value)
|
||||
while (port >= SFP_PORT_START and port <= SFP_PORT_END):
|
||||
# Mask off the bit corresponding to our port
|
||||
mask = (1 << port-SFP_PORT_START)
|
||||
if (changed_ports & mask):
|
||||
# ModPrsL is active high
|
||||
if reg_value & mask == 0:
|
||||
#G3748 reg_value==0 is inserted. In port_change 1 is inserted
|
||||
port_change[port] = '1'
|
||||
else:
|
||||
#G3748 reg_value==1 is removed. In port_change 0 is removed
|
||||
port_change[port] = '0'
|
||||
port += 1
|
||||
|
||||
# Update reg value
|
||||
self.modprs_register = reg_value
|
||||
#return True, port_change
|
||||
return True, port_change
|
||||
|
||||
if forever:
|
||||
time.sleep(1)
|
||||
else:
|
||||
timeout = end_time - time.time()
|
||||
if timeout >= 1:
|
||||
time.sleep(1) # We poll at 1 second granularity
|
||||
else:
|
||||
if timeout > 0:
|
||||
time.sleep(timeout)
|
||||
return True, {}
|
||||
return False, {}
|
@ -0,0 +1 @@
|
||||
This directory contains unit tests of the Platform API 2.0
|
@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
#import sonic_platform
|
||||
#from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
try:
|
||||
import sonic_platform.platform
|
||||
import sonic_platform.chassis
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
def main():
|
||||
print("-----------------")
|
||||
print("Chassis Unit Test")
|
||||
print("-----------------")
|
||||
|
||||
chassis = sonic_platform.platform.Platform().get_chassis()
|
||||
print(" Chassis name: {}".format(chassis.get_name()))
|
||||
|
||||
print(" Chassis presence: {}".format(chassis.get_presence()))
|
||||
|
||||
print(" Chassis model: {}".format(chassis.get_model()))
|
||||
|
||||
print(" Chassis serial: {}".format(chassis.get_serial()))
|
||||
|
||||
print(" Chassis status: {}".format(chassis.get_status()))
|
||||
|
||||
print(" Chassis base_mac: {}".format(chassis.get_base_mac()))
|
||||
|
||||
print(" Chassis reboot cause: {}\n".format(chassis.get_reboot_cause()))
|
||||
|
||||
print(" Chassis watchdog: {}".format(chassis.get_watchdog()))
|
||||
|
||||
print(" Chassis num_components: {}".format(chassis.get_num_components()))
|
||||
|
||||
print(" Chassis all_components: {}\n".format(chassis.get_all_components()))
|
||||
|
||||
print(" Chassis num_modules: {}".format(chassis.get_num_modules()))
|
||||
|
||||
print(" Chassis all_modules: {}\n".format(chassis.get_all_modules()))
|
||||
|
||||
print(" Chassis num_fans: {}".format(chassis.get_num_fans()))
|
||||
|
||||
print(" Chassis all_fans: {}\n".format(chassis.get_all_fans()))
|
||||
|
||||
print(" Chassis num_psus: {}".format(chassis.get_num_psus()))
|
||||
|
||||
print(" Chassis all_psus: {}\n".format(chassis.get_all_psus()))
|
||||
|
||||
print(" Chassis num_thermals: {}".format(chassis.get_num_thermals()))
|
||||
|
||||
print(" Chassis all_thermals: {}\n".format(chassis.get_all_thermals()))
|
||||
|
||||
print(" Chassis num_sfps: {}".format(chassis.get_num_sfps()))
|
||||
|
||||
print(" Chassis all_sfps: {}\n".format(chassis.get_all_sfps()))
|
||||
|
||||
print(" Chassis eeprom: {}".format(chassis.get_eeprom()))
|
||||
|
||||
print(" Chassis system_eeprom_info: {}\n".format(chassis.get_system_eeprom_info()))
|
||||
|
||||
print(" Chassis get_status_led start : {}\n".format(chassis.get_status_led()))
|
||||
chassis.set_status_led('amber')
|
||||
print(" Chassis get_status_led amber: {}\n".format(chassis.get_status_led()))
|
||||
chassis.set_status_led('green')
|
||||
print(" Chassis get_status_led green: {}\n".format(chassis.get_status_led()))
|
||||
|
||||
print(" Chassis thermal_manager: {}\n".format(chassis.get_thermal_manager()))
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
def main():
|
||||
print("---------------------------")
|
||||
print("Chassis Component Unit Test")
|
||||
print("---------------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
for component in chassis.get_all_components():
|
||||
print(" Name: {}".format(component.get_name()))
|
||||
print(" Description: {}".format(component.get_description()))
|
||||
print(" FW version: {}\n".format(component.get_firmware_version()))
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,25 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
def main():
|
||||
print("------------------------")
|
||||
print("Chassis eeprom Unit Test")
|
||||
print("------------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
eeprom = chassis.get_eeprom()
|
||||
|
||||
print(" Model: {}, Service Tag: {}".format(eeprom.modelstr(),
|
||||
eeprom.service_tag_str()))
|
||||
print(" Part#: {}, Serial#: {}".format(eeprom.part_number_str(),
|
||||
eeprom.serial_number_str()))
|
||||
print(" Base MAC: {}".format(eeprom.base_mac_addr()))
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sonic_platform
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
def main():
|
||||
print("---------------------")
|
||||
print("Chassis Fan Unit Test")
|
||||
print("---------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
for fan in chassis.get_all_fans():
|
||||
if not fan.get_presence():
|
||||
print(" Name: {} not present".format(fan.get_name()))
|
||||
else:
|
||||
print(" Name:", fan.get_name())
|
||||
print(" Presence: {}, Status: {}, LED: {}".format(fan.get_presence(),
|
||||
fan.get_status(),
|
||||
fan.get_status_led()))
|
||||
print(" Model: {}, Serial#: {}".format(fan.get_model(),
|
||||
fan.get_serial()))
|
||||
print(" Part#: {}, Service Tag: {}".format(fan.get_part_number(),
|
||||
fan.get_service_tag()))
|
||||
print(" Direction: {}, Speed: {}RPM, Target Speed: {}, Speed Tolerance: {}%\n".format(fan.get_direction(),
|
||||
str(fan.get_speed()),
|
||||
str(fan.get_target_speed()),
|
||||
str(fan.get_speed_tolerance()))
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sonic_platform
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
def main():
|
||||
print("---------------------")
|
||||
print("Chassis PSU Unit Test")
|
||||
print("---------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
for psu in chassis.get_all_psus():
|
||||
if not psu.get_presence():
|
||||
print(" Name: {} not present".format(psu.get_name()))
|
||||
else:
|
||||
print(" Name:", psu.get_name())
|
||||
print(" Presence: {}, Status: {}, LED: {}".format(psu.get_presence(),
|
||||
psu.get_status(),
|
||||
psu.get_status_led()))
|
||||
print(" Model: {}, Serial#: {}, Part#: {}".format(psu.get_model(),
|
||||
psu.get_serial(),
|
||||
psu.get_part_number()))
|
||||
try:
|
||||
current = psu.get_current()
|
||||
except NotImplementedError:
|
||||
current = "NA"
|
||||
try:
|
||||
power = psu.get_power()
|
||||
except NotImplementedError:
|
||||
power = "NA"
|
||||
|
||||
print(" Voltage: {}, Current: {}, Power: {}\n".format(psu.get_voltage(),
|
||||
current,
|
||||
power))
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,58 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sonic_platform
|
||||
|
||||
try:
|
||||
from sonic_platform.chassis import Chassis
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
|
||||
def main():
|
||||
print("---------------------")
|
||||
print("Chassis SFP Unit Test")
|
||||
print("---------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
PORT_START = 1
|
||||
PORT_END = 52
|
||||
|
||||
for physical_port in range(PORT_START, PORT_END+1):
|
||||
print(" ")
|
||||
print(" SFP transceiver tests PORT = ", physical_port)
|
||||
name = chassis.get_sfp(physical_port).get_name()
|
||||
print(" SFP transceiver tests NAME = ", name)
|
||||
|
||||
presence = chassis.get_sfp(physical_port).get_presence()
|
||||
print("TEST 1 - sfp presence [ True ] ", physical_port, presence)
|
||||
|
||||
status = chassis.get_sfp(physical_port).get_reset_status()
|
||||
print("TEST 2 - sfp reset status [ False ] ", physical_port, status)
|
||||
|
||||
txdisable = chassis.get_sfp(physical_port).get_tx_disable()
|
||||
print("TEST 3 - sfp tx_disable [ False ] ", physical_port, txdisable)
|
||||
|
||||
rxlos = chassis.get_sfp(physical_port).get_rx_los()
|
||||
print("TEST 4 - sfp status rxlos [ False ] ", physical_port, rxlos)
|
||||
|
||||
txfault = chassis.get_sfp(physical_port).get_tx_fault()
|
||||
print("TEST 5 - sfp status txfault [ False ] ", physical_port, txfault)
|
||||
|
||||
lpmode = chassis.get_sfp(physical_port).get_lpmode()
|
||||
print("TEST 6 - sfp enable lpmode [ False ] ", physical_port, lpmode)
|
||||
|
||||
trans_info = chassis.get_sfp(physical_port).get_transceiver_info()
|
||||
print("TEST 7 - sfp transceiver info for port:", physical_port, trans_info)
|
||||
|
||||
trans_status = chassis.get_sfp(physical_port).get_transceiver_bulk_status()
|
||||
print("TEST 8 - sfp bulk status for port:", physical_port, trans_status)
|
||||
|
||||
threshold = chassis.get_sfp(physical_port).get_transceiver_threshold_info()
|
||||
print("TEST 9 - sfp bulk status for port:", physical_port, threshold)
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,50 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
def main():
|
||||
print("-------------------------")
|
||||
print("Chassis Thermal Unit Test")
|
||||
print("-------------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
for thermal in chassis.get_all_thermals():
|
||||
if not thermal.get_presence():
|
||||
print(" Name: {} not present".format(thermal.get_name()))
|
||||
else:
|
||||
print(" Name:", thermal.get_name())
|
||||
print(" Presence: {}, Status: {}".format(thermal.get_presence(),
|
||||
thermal.get_status()))
|
||||
print(" Model: {}, Serial#: {}".format(thermal.get_model(),
|
||||
thermal.get_serial()))
|
||||
print(" Temperature(C): {}".format(thermal.get_temperature()))
|
||||
|
||||
try:
|
||||
low_thresh = thermal.get_low_threshold()
|
||||
except NotImplementedError:
|
||||
low_thresh = "NA"
|
||||
try:
|
||||
high_thresh = thermal.get_high_threshold()
|
||||
except NotImplementedError:
|
||||
high_thresh = "NA"
|
||||
|
||||
print(" Low Threshold(C): {}, High Threshold(C): {}".format(low_thresh,
|
||||
high_thresh))
|
||||
|
||||
try:
|
||||
crit_low_thresh = thermal.get_low_critical_threshold()
|
||||
except NotImplementedError:
|
||||
crit_low_thresh = "NA"
|
||||
try:
|
||||
crit_high_thresh = thermal.get_high_critical_threshold()
|
||||
except NotImplementedError:
|
||||
crit_high_thresh = "NA"
|
||||
|
||||
print(" Crit Low Threshold(C): {}, Crit High Threshold(C): {}\n".format(crit_low_thresh,
|
||||
crit_high_thresh))
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
from sonic_platform.chassis import Chassis
|
||||
|
||||
|
||||
def main():
|
||||
print("---------------------")
|
||||
print("Chassis Watchdog Test")
|
||||
print("---------------------")
|
||||
|
||||
chassis = Chassis()
|
||||
|
||||
watchdog = chassis.get_watchdog()
|
||||
|
||||
print(" Armed: {}".format(watchdog.is_armed()))
|
||||
print(" Time Left: {}".format(watchdog.get_remaining_time()))
|
||||
|
||||
return
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -0,0 +1,245 @@
|
||||
########################################################################
|
||||
# Supermicro SSE-G3748
|
||||
#
|
||||
# Module contains an implementation of SONiC Platform Base API and
|
||||
# provides the Thermals' information which are available in the platform
|
||||
#
|
||||
########################################################################
|
||||
|
||||
|
||||
try:
|
||||
import os
|
||||
from sonic_platform_base.thermal_base import ThermalBase
|
||||
from sonic_py_common import logger
|
||||
except ImportError as e:
|
||||
raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
sonic_logger = logger.Logger('thermal')
|
||||
|
||||
class Thermal(ThermalBase):
|
||||
"""sse-g3748 platform-specific Thermal class"""
|
||||
|
||||
I2C_CLASS_DIR = "/sys/class/i2c-adapter/"
|
||||
I2C_DEV_MAPPING = (['i2c-0/0-0048/hwmon/', 1],
|
||||
['i2c-0/0-0049/hwmon/', 1])
|
||||
|
||||
HWMON_CLASS_DIR = "/sys/class/hwmon/"
|
||||
|
||||
THERMAL_NAME = ("FRONT", "REAR")
|
||||
|
||||
def __init__(self, thermal_index):
|
||||
ThermalBase.__init__(self)
|
||||
self.index = thermal_index + 1
|
||||
self.is_psu_thermal = False
|
||||
self.dependency = None
|
||||
self._minimum = None
|
||||
self._maximum = None
|
||||
self.thermal_high_threshold_file = None
|
||||
# PCB temperature sensors
|
||||
if self.index < 3:
|
||||
i2c_path = self.I2C_CLASS_DIR + self.I2C_DEV_MAPPING[self.index - 1][0]
|
||||
sensor_index = self.I2C_DEV_MAPPING[self.index - 1][1]
|
||||
sensor_max_suffix = "max"
|
||||
sensor_crit_suffix = "max_hyst"
|
||||
hwmon_node = os.listdir(i2c_path)[0]
|
||||
self.SENSOR_DIR = i2c_path + hwmon_node + '/'
|
||||
|
||||
# Armada 38x SOC temperature sensor
|
||||
else:
|
||||
dev_path = self.HWMON_CLASS_DIR
|
||||
sensor_index = 1
|
||||
sensor_max_suffix = None
|
||||
sensor_crit_suffix = None
|
||||
hwmon_node = os.listdir(dev_path)[0]
|
||||
self.SENSOR_DIR = dev_path + hwmon_node + '/'
|
||||
|
||||
# sysfs file for current temperature value
|
||||
self.thermal_temperature_file = self.SENSOR_DIR \
|
||||
+ "temp{}_input".format(sensor_index)
|
||||
|
||||
# sysfs file for high threshold value if supported for this sensor
|
||||
if sensor_max_suffix:
|
||||
self.thermal_high_threshold_file = self.SENSOR_DIR \
|
||||
+ "temp{}_{}".format(sensor_index, sensor_max_suffix)
|
||||
else:
|
||||
self.thermal_high_threshold_file = None
|
||||
|
||||
# sysfs file for crit high threshold value if supported for this sensor
|
||||
if sensor_crit_suffix:
|
||||
self.thermal_high_crit_threshold_file = self.SENSOR_DIR \
|
||||
+ "temp{}_{}".format(sensor_index, sensor_crit_suffix)
|
||||
else:
|
||||
self.thermal_high_crit_threshold_file = None
|
||||
|
||||
def _read_sysfs_file(self, sysfs_file):
|
||||
# On successful read, returns the value read from given
|
||||
# sysfs_file and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
|
||||
if (not os.path.isfile(sysfs_file)):
|
||||
return rv
|
||||
|
||||
try:
|
||||
with open(sysfs_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def get_name(self):
|
||||
"""
|
||||
Retrieves the name of the thermal
|
||||
|
||||
Returns:
|
||||
string: The name of the thermal
|
||||
"""
|
||||
return self.THERMAL_NAME[self.index - 1]
|
||||
|
||||
def get_presence(self):
|
||||
"""
|
||||
Retrieves the presence of the thermal
|
||||
|
||||
Returns:
|
||||
bool: True if thermal is present, False if not
|
||||
"""
|
||||
if self.dependency:
|
||||
return self.dependency.get_presence()
|
||||
else:
|
||||
return True
|
||||
|
||||
def get_model(self):
|
||||
"""
|
||||
Retrieves the model number (or part number) of the Thermal
|
||||
|
||||
Returns:
|
||||
string: Model/part number of Thermal
|
||||
"""
|
||||
return 'NA'
|
||||
|
||||
def get_serial(self):
|
||||
"""
|
||||
Retrieves the serial number of the Thermal
|
||||
|
||||
Returns:
|
||||
string: Serial number of Thermal
|
||||
"""
|
||||
return 'NA'
|
||||
|
||||
def get_status(self):
|
||||
"""
|
||||
Retrieves the operational status of the thermal
|
||||
|
||||
Returns:
|
||||
A boolean value, True if thermal is operating properly,
|
||||
False if not
|
||||
"""
|
||||
if self.dependency:
|
||||
return self.dependency.get_status()
|
||||
else:
|
||||
return True
|
||||
|
||||
def get_temperature(self):
|
||||
"""
|
||||
Retrieves current temperature reading from thermal
|
||||
|
||||
Returns:
|
||||
A float number of current temperature in Celsius up to
|
||||
nearest thousandth of one degree Celsius, e.g. 30.125
|
||||
"""
|
||||
thermal_temperature = self._read_sysfs_file(
|
||||
self.thermal_temperature_file)
|
||||
if (thermal_temperature != 'ERR'):
|
||||
thermal_temperature = float(thermal_temperature) / 1000
|
||||
if self._minimum is None or self._minimum > thermal_temperature:
|
||||
self._minimum = thermal_temperature
|
||||
if self._maximum is None or self._maximum < thermal_temperature:
|
||||
self._maximum = thermal_temperature
|
||||
else:
|
||||
thermal_temperature = 0
|
||||
|
||||
return float("{:.3f}".format(thermal_temperature))
|
||||
|
||||
def get_high_threshold(self):
|
||||
"""
|
||||
Retrieves the high threshold temperature of thermal
|
||||
|
||||
Returns:
|
||||
A float number, the high threshold temperature of thermal in
|
||||
Celsius up to nearest thousandth of one degree Celsius,
|
||||
e.g. 30.125
|
||||
"""
|
||||
# Not implemented for this sensor
|
||||
if not self.thermal_high_threshold_file:
|
||||
raise NotImplementedError
|
||||
|
||||
thermal_high_threshold = self._read_sysfs_file(
|
||||
self.thermal_high_threshold_file)
|
||||
if (thermal_high_threshold != 'ERR'):
|
||||
thermal_high_threshold = float(thermal_high_threshold) / 1000
|
||||
else:
|
||||
thermal_high_threshold = 0.0
|
||||
|
||||
return float("{:.3f}".format(thermal_high_threshold))
|
||||
|
||||
def set_high_threshold(self, temperature):
|
||||
"""
|
||||
Sets the high threshold temperature of thermal
|
||||
|
||||
Args :
|
||||
temperature: A float number up to nearest thousandth of one
|
||||
degree Celsius, e.g. 30.125
|
||||
Returns:
|
||||
A boolean, True if threshold is set successfully, False if
|
||||
not
|
||||
"""
|
||||
# Thermal threshold values are pre-defined based on HW.
|
||||
return False
|
||||
|
||||
def get_high_critical_threshold(self):
|
||||
"""
|
||||
Retrieves the high critical threshold temperature of thermal
|
||||
|
||||
Returns:
|
||||
A float number, the high critical threshold temperature of thermal in Celsius
|
||||
up to nearest thousandth of one degree Celsius, e.g. 30.125
|
||||
"""
|
||||
|
||||
# Not implemented for this sensor
|
||||
if not self.thermal_high_crit_threshold_file:
|
||||
raise NotImplementedError
|
||||
|
||||
thermal_high_crit_threshold = self._read_sysfs_file(
|
||||
self.thermal_high_crit_threshold_file)
|
||||
if (thermal_high_crit_threshold != 'ERR'):
|
||||
thermal_high_crit_threshold = float(thermal_high_crit_threshold) / 1000
|
||||
else:
|
||||
thermal_high_crit_threshold = 0.0
|
||||
|
||||
return float("{:.3f}".format(thermal_high_crit_threshold))
|
||||
|
||||
def get_minimum_recorded(self):
|
||||
self.get_temperature()
|
||||
return self._minimum
|
||||
|
||||
def get_maximum_recorded(self):
|
||||
self.get_temperature()
|
||||
return self._maximum
|
||||
|
||||
def get_position_in_parent(self):
|
||||
"""
|
||||
Retrieves 1-based relative physical position in parent device
|
||||
Returns:
|
||||
integer: The 1-based relative physical position in parent device
|
||||
"""
|
||||
return self.index
|
||||
|
||||
def is_replaceable(self):
|
||||
"""
|
||||
Indicate whether this device is replaceable.
|
||||
Returns:
|
||||
bool: True if it is replaceable.
|
||||
"""
|
||||
return False
|
@ -0,0 +1,200 @@
|
||||
#try:
|
||||
# import os
|
||||
# from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase
|
||||
# from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object
|
||||
#except ImportError as e:
|
||||
# raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
import os
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_action_base import ThermalPolicyActionBase
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object
|
||||
|
||||
from sonic_py_common import logger
|
||||
|
||||
sonic_logger = logger.Logger('thermal_actions')
|
||||
|
||||
|
||||
class SetFanSpeedAction(ThermalPolicyActionBase):
|
||||
"""
|
||||
Base thermal action class to set speed for fans
|
||||
"""
|
||||
# JSON field definition
|
||||
JSON_FIELD_SPEED = 'speed'
|
||||
JSON_FIELD_DEFAULT_SPEED = 'default_speed'
|
||||
JSON_FIELD_HIGHTEMP_SPEED = 'hightemp_speed'
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
Constructor of SetFanSpeedAction
|
||||
"""
|
||||
self.default_speed = 50
|
||||
self.hightemp_speed = 100
|
||||
self.speed = self.default_speed
|
||||
|
||||
def load_from_json(self, json_obj):
|
||||
"""
|
||||
Construct SetFanSpeedAction via JSON. JSON example:
|
||||
{
|
||||
"type": "fan.all.set_speed"
|
||||
"speed": "100"
|
||||
}
|
||||
:param json_obj: A JSON object representing a SetFanSpeedAction action.
|
||||
:return:
|
||||
"""
|
||||
if SetFanSpeedAction.JSON_FIELD_SPEED in json_obj:
|
||||
speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_SPEED])
|
||||
if speed < 0 or speed > 100:
|
||||
raise ValueError('SetFanSpeedAction invalid speed value {} in JSON policy file, valid value should be [0, 100]'.
|
||||
format(speed))
|
||||
self.speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_SPEED])
|
||||
else:
|
||||
raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'.
|
||||
format(SetFanSpeedAction.JSON_FIELD_SPEED))
|
||||
|
||||
@classmethod
|
||||
def set_all_fan_speed(cls, thermal_info_dict, speed):
|
||||
from .thermal_infos import FanInfo
|
||||
if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo):
|
||||
fan_info_obj = thermal_info_dict[FanInfo.INFO_NAME]
|
||||
for fan in fan_info_obj.get_presence_fans():
|
||||
fan.set_speed(int(speed))
|
||||
|
||||
|
||||
@thermal_json_object('fan.all.set_speed')
|
||||
class SetAllFanSpeedAction(SetFanSpeedAction):
|
||||
"""
|
||||
Action to set speed for all fans
|
||||
"""
|
||||
def execute(self, thermal_info_dict):
|
||||
"""
|
||||
Set speed for all fans
|
||||
:param thermal_info_dict: A dictionary stores all thermal information.
|
||||
:return:
|
||||
"""
|
||||
SetAllFanSpeedAction.set_all_fan_speed(thermal_info_dict, self.speed)
|
||||
|
||||
|
||||
@thermal_json_object('thermal.temp_check_and_set_all_fan_speed')
|
||||
class ThermalRecoverAction(SetFanSpeedAction):
|
||||
"""
|
||||
Action to check thermal sensor temperature change status and set speed for all fans
|
||||
"""
|
||||
|
||||
def load_from_json(self, json_obj):
|
||||
"""
|
||||
Construct ThermalRecoverAction via JSON. JSON example:
|
||||
{
|
||||
"type": "thermal.temp_check_and_set_all_fan_speed"
|
||||
"default_speed": "50"
|
||||
"hightemp_speed": "100"
|
||||
}
|
||||
:param json_obj: A JSON object representing a ThermalRecoverAction action.
|
||||
:return:
|
||||
"""
|
||||
if SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED in json_obj:
|
||||
default_speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED])
|
||||
if default_speed < 0 or default_speed > 100:
|
||||
raise ValueError('SetFanSpeedAction invalid default speed value {} in JSON policy file, valid value should be [0, 100]'.
|
||||
format(default_speed))
|
||||
self.default_speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED])
|
||||
else:
|
||||
raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'.
|
||||
format(SetFanSpeedAction.JSON_FIELD_DEFAULT_SPEED))
|
||||
|
||||
if SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED in json_obj:
|
||||
hightemp_speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED])
|
||||
if hightemp_speed < 0 or hightemp_speed > 100:
|
||||
raise ValueError('SetFanSpeedAction invalid hightemp speed value {} in JSON policy file, valid value should be [0, 100]'.
|
||||
format(hightemp_speed))
|
||||
self.hightemp_speed = int(json_obj[SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED])
|
||||
else:
|
||||
raise ValueError('SetFanSpeedAction missing mandatory field {} in JSON policy file'.
|
||||
format(SetFanSpeedAction.JSON_FIELD_HIGHTEMP_SPEED))
|
||||
|
||||
sonic_logger.log_warning("ThermalRecoverAction: default: {}, hightemp: {}".format(self.default_speed, self.hightemp_speed))
|
||||
|
||||
def execute(self, thermal_info_dict):
|
||||
"""
|
||||
Check check thermal sensor temperature change status and set speed for all fans
|
||||
:param thermal_info_dict: A dictionary stores all thermal information.
|
||||
:return:
|
||||
"""
|
||||
from .thermal_infos import ThermalInfo
|
||||
if ThermalInfo.INFO_NAME in thermal_info_dict and \
|
||||
isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo):
|
||||
|
||||
thermal_info_obj = thermal_info_dict[ThermalInfo.INFO_NAME]
|
||||
if thermal_info_obj.is_warm_up_and_over_high_threshold():
|
||||
ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.hightemp_speed)
|
||||
elif thermal_info_obj.is_cool_down_and_below_low_threshold():
|
||||
ThermalRecoverAction.set_all_fan_speed(thermal_info_dict, self.default_speed)
|
||||
|
||||
|
||||
@thermal_json_object('switch.shutdown')
|
||||
class SwitchPolicyAction(ThermalPolicyActionBase):
|
||||
"""
|
||||
Base class for thermal action. Once all thermal conditions in a thermal policy are matched,
|
||||
all predefined thermal action will be executed.
|
||||
"""
|
||||
def execute(self, thermal_info_dict):
|
||||
"""
|
||||
Take action when thermal condition matches. For example, adjust speed of fan or shut
|
||||
down the switch.
|
||||
:param thermal_info_dict: A dictionary stores all thermal information.
|
||||
:return:
|
||||
"""
|
||||
sonic_logger.log_warning("Alarm for temperature critical is detected, reboot Device")
|
||||
# import os
|
||||
# os.system('reboot')
|
||||
|
||||
|
||||
@thermal_json_object('thermal_control.control')
|
||||
class ControlThermalAlgoAction(ThermalPolicyActionBase):
|
||||
"""
|
||||
Action to control the thermal control algorithm
|
||||
"""
|
||||
# JSON field definition
|
||||
JSON_FIELD_STATUS = 'status'
|
||||
|
||||
def __init__(self):
|
||||
self.status = True
|
||||
|
||||
def load_from_json(self, json_obj):
|
||||
"""
|
||||
Construct ControlThermalAlgoAction via JSON. JSON example:
|
||||
{
|
||||
"type": "thermal_control.control"
|
||||
"status": "true"
|
||||
}
|
||||
:param json_obj: A JSON object representing a ControlThermalAlgoAction action.
|
||||
:return:
|
||||
"""
|
||||
if ControlThermalAlgoAction.JSON_FIELD_STATUS in json_obj:
|
||||
status_str = json_obj[ControlThermalAlgoAction.JSON_FIELD_STATUS].lower()
|
||||
if status_str == 'true':
|
||||
self.status = True
|
||||
elif status_str == 'false':
|
||||
self.status = False
|
||||
else:
|
||||
raise ValueError('Invalid {} field value, please specify true of false'.
|
||||
format(ControlThermalAlgoAction.JSON_FIELD_STATUS))
|
||||
else:
|
||||
raise ValueError('ControlThermalAlgoAction '
|
||||
'missing mandatory field {} in JSON policy file'.
|
||||
format(ControlThermalAlgoAction.JSON_FIELD_STATUS))
|
||||
|
||||
def execute(self, thermal_info_dict):
|
||||
"""
|
||||
Disable thermal control algorithm
|
||||
:param thermal_info_dict: A dictionary stores all thermal information.
|
||||
:return:
|
||||
"""
|
||||
from .thermal_infos import ChassisInfo
|
||||
if ChassisInfo.INFO_NAME in thermal_info_dict:
|
||||
chassis_info_obj = thermal_info_dict[ChassisInfo.INFO_NAME]
|
||||
chassis = chassis_info_obj.get_chassis()
|
||||
thermal_manager = chassis.get_thermal_manager()
|
||||
if self.status:
|
||||
thermal_manager.start_thermal_control_algorithm()
|
||||
else:
|
||||
thermal_manager.stop_thermal_control_algorithm()
|
@ -0,0 +1,81 @@
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_condition_base import ThermalPolicyConditionBase
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object
|
||||
|
||||
|
||||
class FanCondition(ThermalPolicyConditionBase):
|
||||
def get_fan_info(self, thermal_info_dict):
|
||||
from .thermal_infos import FanInfo
|
||||
if FanInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[FanInfo.INFO_NAME], FanInfo):
|
||||
return thermal_info_dict[FanInfo.INFO_NAME]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
@thermal_json_object('fan.any.absence')
|
||||
class AnyFanAbsenceCondition(FanCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
fan_info_obj = self.get_fan_info(thermal_info_dict)
|
||||
return len(fan_info_obj.get_absence_fans()) > 0 if fan_info_obj else False
|
||||
|
||||
|
||||
@thermal_json_object('fan.all.absence')
|
||||
class AllFanAbsenceCondition(FanCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
fan_info_obj = self.get_fan_info(thermal_info_dict)
|
||||
return len(fan_info_obj.get_presence_fans()) == 0 if fan_info_obj else False
|
||||
|
||||
|
||||
@thermal_json_object('fan.all.presence')
|
||||
class AllFanPresenceCondition(FanCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
fan_info_obj = self.get_fan_info(thermal_info_dict)
|
||||
return len(fan_info_obj.get_absence_fans()) == 0 if fan_info_obj else False
|
||||
|
||||
|
||||
class ThermalCondition(ThermalPolicyConditionBase):
|
||||
def get_thermal_info(self, thermal_info_dict):
|
||||
from .thermal_infos import ThermalInfo
|
||||
if ThermalInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[ThermalInfo.INFO_NAME], ThermalInfo):
|
||||
return thermal_info_dict[ThermalInfo.INFO_NAME]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
@thermal_json_object('thermal.over.high_critical_threshold')
|
||||
class ThermalOverHighCriticalCondition(ThermalCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
thermal_info_obj = self.get_thermal_info(thermal_info_dict)
|
||||
if thermal_info_obj:
|
||||
return thermal_info_obj.is_over_high_critical_threshold()
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class PsuCondition(ThermalPolicyConditionBase):
|
||||
def get_psu_info(self, thermal_info_dict):
|
||||
from .thermal_infos import PsuInfo
|
||||
if PsuInfo.INFO_NAME in thermal_info_dict and isinstance(thermal_info_dict[PsuInfo.INFO_NAME], PsuInfo):
|
||||
return thermal_info_dict[PsuInfo.INFO_NAME]
|
||||
else:
|
||||
return None
|
||||
|
||||
|
||||
@thermal_json_object('psu.any.absence')
|
||||
class AnyPsuAbsenceCondition(PsuCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
psu_info_obj = self.get_psu_info(thermal_info_dict)
|
||||
return len(psu_info_obj.get_absence_psus()) > 0 if psu_info_obj else False
|
||||
|
||||
|
||||
@thermal_json_object('psu.all.absence')
|
||||
class AllPsuAbsenceCondition(PsuCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
psu_info_obj = self.get_psu_info(thermal_info_dict)
|
||||
return len(psu_info_obj.get_presence_psus()) == 0 if psu_info_obj else False
|
||||
|
||||
|
||||
@thermal_json_object('psu.all.presence')
|
||||
class AllPsuPresenceCondition(PsuCondition):
|
||||
def is_match(self, thermal_info_dict):
|
||||
psu_info_obj = self.get_psu_info(thermal_info_dict)
|
||||
return len(psu_info_obj.get_absence_psus()) == 0 if psu_info_obj else False
|
@ -0,0 +1,210 @@
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_info_base import ThermalPolicyInfoBase
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_json_object import thermal_json_object
|
||||
|
||||
|
||||
@thermal_json_object('fan_info')
|
||||
class FanInfo(ThermalPolicyInfoBase):
|
||||
"""
|
||||
Fan information needed by thermal policy
|
||||
"""
|
||||
|
||||
# Fan information name
|
||||
INFO_NAME = 'fan_info'
|
||||
|
||||
def __init__(self):
|
||||
self._absence_fans = set()
|
||||
self._presence_fans = set()
|
||||
self._status_changed = False
|
||||
|
||||
def collect(self, chassis):
|
||||
"""
|
||||
Collect absence and presence fans.
|
||||
:param chassis: The chassis object
|
||||
:return:
|
||||
"""
|
||||
self._status_changed = False
|
||||
for fan in chassis.get_all_fans():
|
||||
if fan.get_presence() and fan not in self._presence_fans:
|
||||
self._presence_fans.add(fan)
|
||||
self._status_changed = True
|
||||
if fan in self._absence_fans:
|
||||
self._absence_fans.remove(fan)
|
||||
elif not fan.get_presence() and fan not in self._absence_fans:
|
||||
self._absence_fans.add(fan)
|
||||
self._status_changed = True
|
||||
if fan in self._presence_fans:
|
||||
self._presence_fans.remove(fan)
|
||||
|
||||
def get_absence_fans(self):
|
||||
"""
|
||||
Retrieves absence fans
|
||||
:return: A set of absence fans
|
||||
"""
|
||||
return self._absence_fans
|
||||
|
||||
def get_presence_fans(self):
|
||||
"""
|
||||
Retrieves presence fans
|
||||
:return: A set of presence fans
|
||||
"""
|
||||
return self._presence_fans
|
||||
|
||||
def is_status_changed(self):
|
||||
"""
|
||||
Retrieves if the status of fan information changed
|
||||
:return: True if status changed else False
|
||||
"""
|
||||
return self._status_changed
|
||||
|
||||
|
||||
@thermal_json_object('thermal_info')
|
||||
class ThermalInfo(ThermalPolicyInfoBase):
|
||||
"""
|
||||
Thermal information needed by thermal policy
|
||||
"""
|
||||
|
||||
# Fan information name
|
||||
INFO_NAME = 'thermal_info'
|
||||
|
||||
def __init__(self):
|
||||
self.init = False
|
||||
self._old_avg_temp = 0
|
||||
self._current_avg_temp = 0
|
||||
self._high_crital_threshold = 75
|
||||
self._high_threshold = 45
|
||||
self._low_threshold = 40
|
||||
|
||||
def collect(self, chassis):
|
||||
"""
|
||||
Collect thermal sensor temperature change status
|
||||
:param chassis: The chassis object
|
||||
:return:
|
||||
"""
|
||||
self._temps = []
|
||||
self._over_high_critical_threshold = False
|
||||
self._warm_up_and_over_high_threshold = False
|
||||
self._cool_down_and_below_low_threshold = False
|
||||
|
||||
# Calculate average temp within the device
|
||||
temp = 0
|
||||
num_of_thermals = chassis.get_num_thermals()
|
||||
for index in range(num_of_thermals):
|
||||
self._temps.insert(index, chassis.get_thermal(index).get_temperature())
|
||||
temp += self._temps[index]
|
||||
|
||||
self._current_avg_temp = temp / num_of_thermals
|
||||
|
||||
# Special case if first time
|
||||
if self.init is False:
|
||||
self._old_avg_temp = self._current_avg_temp
|
||||
self.init = True
|
||||
|
||||
# Check if new average temp exceeds high threshold value
|
||||
if self._current_avg_temp >= self._old_avg_temp and self._current_avg_temp >= self._high_threshold:
|
||||
self._warm_up_and_over_high_threshold = True
|
||||
|
||||
# Check if new average temp exceeds low threshold value
|
||||
if self._current_avg_temp <= self._old_avg_temp and self._current_avg_temp <= self._low_threshold:
|
||||
self._cool_down_and_below_low_threshold = True
|
||||
|
||||
self._old_avg_temp = self._current_avg_temp
|
||||
|
||||
def is_warm_up_and_over_high_threshold(self):
|
||||
"""
|
||||
Retrieves if the temperature is warm up and over high threshold
|
||||
:return: True if the temperature is warm up and over high threshold else False
|
||||
"""
|
||||
return self._warm_up_and_over_high_threshold
|
||||
|
||||
def is_cool_down_and_below_low_threshold(self):
|
||||
"""
|
||||
Retrieves if the temperature is cold down and below low threshold
|
||||
:return: True if the temperature is cold down and below low threshold else False
|
||||
"""
|
||||
return self._cool_down_and_below_low_threshold
|
||||
|
||||
def is_over_high_critical_threshold(self):
|
||||
"""
|
||||
Retrieves if the temperature is over high critical threshold
|
||||
:return: True if the temperature is over high critical threshold else False
|
||||
"""
|
||||
return self._over_high_critical_threshold
|
||||
|
||||
|
||||
@thermal_json_object('psu_info')
|
||||
class PsuInfo(ThermalPolicyInfoBase):
|
||||
"""
|
||||
PSU information needed by thermal policy
|
||||
"""
|
||||
INFO_NAME = 'psu_info'
|
||||
|
||||
def __init__(self):
|
||||
self._absence_psus = set()
|
||||
self._presence_psus = set()
|
||||
self._status_changed = False
|
||||
|
||||
def collect(self, chassis):
|
||||
"""
|
||||
Collect absence and presence PSUs.
|
||||
:param chassis: The chassis object
|
||||
:return:
|
||||
"""
|
||||
self._status_changed = False
|
||||
for psu in chassis.get_all_psus():
|
||||
if psu.get_presence() and psu.get_powergood_status() and psu not in self._presence_psus:
|
||||
self._presence_psus.add(psu)
|
||||
self._status_changed = True
|
||||
if psu in self._absence_psus:
|
||||
self._absence_psus.remove(psu)
|
||||
elif (not psu.get_presence() or not psu.get_powergood_status()) and psu not in self._absence_psus:
|
||||
self._absence_psus.add(psu)
|
||||
self._status_changed = True
|
||||
if psu in self._presence_psus:
|
||||
self._presence_psus.remove(psu)
|
||||
|
||||
def get_absence_psus(self):
|
||||
"""
|
||||
Retrieves presence PSUs
|
||||
:return: A set of absence PSUs
|
||||
"""
|
||||
return self._absence_psus
|
||||
|
||||
def get_presence_psus(self):
|
||||
"""
|
||||
Retrieves presence PSUs
|
||||
:return: A set of presence fans
|
||||
"""
|
||||
return self._presence_psus
|
||||
|
||||
def is_status_changed(self):
|
||||
"""
|
||||
Retrieves if the status of PSU information changed
|
||||
:return: True if status changed else False
|
||||
"""
|
||||
return self._status_changed
|
||||
|
||||
|
||||
@thermal_json_object('chassis_info')
|
||||
class ChassisInfo(ThermalPolicyInfoBase):
|
||||
"""
|
||||
Chassis information needed by thermal policy
|
||||
"""
|
||||
INFO_NAME = 'chassis_info'
|
||||
|
||||
def __init__(self):
|
||||
self._chassis = None
|
||||
|
||||
def collect(self, chassis):
|
||||
"""
|
||||
Collect platform chassis.
|
||||
:param chassis: The chassis object
|
||||
:return:
|
||||
"""
|
||||
self._chassis = chassis
|
||||
|
||||
def get_chassis(self):
|
||||
"""
|
||||
Retrieves platform chassis object
|
||||
:return: A platform chassis object.
|
||||
"""
|
||||
return self._chassis
|
@ -0,0 +1,68 @@
|
||||
|
||||
#try:
|
||||
# import os
|
||||
# from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase
|
||||
# from .thermal_actions import *
|
||||
# from .thermal_conditions import *
|
||||
# from .thermal_infos import *
|
||||
#except ImportError as e:
|
||||
# raise ImportError(str(e) + "- required module not found")
|
||||
|
||||
import os
|
||||
from sonic_platform_base.sonic_thermal_control.thermal_manager_base import ThermalManagerBase
|
||||
from sonic_py_common import logger
|
||||
from .thermal_actions import *
|
||||
from .thermal_conditions import *
|
||||
from .thermal_infos import *
|
||||
|
||||
sonic_logger = logger.Logger('thermal_manager')
|
||||
|
||||
class ThermalManager(ThermalManagerBase):
|
||||
THERMAL_ALGORITHM_CONTROL_PATH = '/var/run/hw-management/config/suspend'
|
||||
|
||||
@classmethod
|
||||
def initialize(cls):
|
||||
cls.logger=sonic_logger
|
||||
cls.logger.set_min_log_priority_info()
|
||||
cls.logger.log_warning('ThermalManager initialize')
|
||||
|
||||
@classmethod
|
||||
def start_thermal_control_algorithm(cls):
|
||||
"""
|
||||
Start thermal control algorithm
|
||||
|
||||
Returns:
|
||||
bool: True if set success, False if fail.
|
||||
"""
|
||||
cls._control_thermal_control_algorithm(False)
|
||||
|
||||
@classmethod
|
||||
def stop_thermal_control_algorithm(cls):
|
||||
"""
|
||||
Stop thermal control algorithm
|
||||
|
||||
Returns:
|
||||
bool: True if set success, False if fail.
|
||||
"""
|
||||
cls._control_thermal_control_algorithm(True)
|
||||
|
||||
@classmethod
|
||||
def _control_thermal_control_algorithm(cls, suspend):
|
||||
"""
|
||||
Control thermal control algorithm
|
||||
|
||||
Args:
|
||||
suspend: Bool, indicate suspend the algorithm or not
|
||||
|
||||
Returns:
|
||||
bool: True if set success, False if fail.
|
||||
"""
|
||||
status = True
|
||||
write_value = 1 if suspend else 0
|
||||
try:
|
||||
with open(cls.THERMAL_ALGORITHM_CONTROL_PATH, 'w') as control_file:
|
||||
control_file.write(str(write_value))
|
||||
except (ValueError, IOError):
|
||||
status = False
|
||||
|
||||
return status
|
@ -0,0 +1,289 @@
|
||||
"""
|
||||
Module contains an implementation of SONiC Platform Base API and
|
||||
provides access to hardware watchdog
|
||||
"""
|
||||
|
||||
import os
|
||||
import fcntl
|
||||
import array
|
||||
import time
|
||||
|
||||
from sonic_platform_base.watchdog_base import WatchdogBase
|
||||
from sonic_py_common import logger
|
||||
|
||||
WD_COMMON_ERROR = -1
|
||||
|
||||
sonic_logger = logger.Logger()
|
||||
|
||||
# CPLD Watchdog Timer CTRL register bits
|
||||
WDT_CTRL_INTR_EN_BIT = 0x80
|
||||
WDT_CTRL_RSET_EN_BIT = 0x40
|
||||
WDT_CTRL_CNTR_EN_BIT = 0x20
|
||||
|
||||
WDT_CTRL_FREQ_SEL_16HZ = 0x00
|
||||
WDT_CTRL_FREQ_SEL_4HZ = 0x01
|
||||
WDT_CTRL_FREQ_SEL_1HZ = 0x02
|
||||
WDT_CTRL_FREQ_SEL_0_25HZ = 0x03
|
||||
|
||||
WDT_MAX_TIMEOUT = 867
|
||||
|
||||
class WatchdogImplBase(WatchdogBase):
|
||||
"""
|
||||
Base class that implements common logic for interacting
|
||||
with watchdog using ioctl commands
|
||||
"""
|
||||
|
||||
def __init__(self, wd_device_path):
|
||||
"""
|
||||
Open a watchdog handle
|
||||
@param wd_device_path Path to watchdog device
|
||||
"""
|
||||
|
||||
G3748CPLD_I2C_DIR = "/sys/bus/i2c/devices/0-0066/"
|
||||
#sonic_logger.log_info(" WatchdogImplBase: __init__")
|
||||
|
||||
self.watchdog_path = wd_device_path
|
||||
#self.watchdog = os.open(self.watchdog_path, os.O_WRONLY)
|
||||
self.wdt_timer_reg = G3748CPLD_I2C_DIR+"wdt_timer".format()
|
||||
self.wdt_ctrl_reg = G3748CPLD_I2C_DIR+"wdt_ctrl".format()
|
||||
self.wdt_intr_cnt_mask_reg = G3748CPLD_I2C_DIR+"wdt_intr_cnt_mask".format()
|
||||
self.wdt_intr_flag_reg = G3748CPLD_I2C_DIR+"wdt_intr_flag".format()
|
||||
self.wdt_timeout = G3748CPLD_I2C_DIR+"wdt_timeout".format()
|
||||
|
||||
self.armed = self._is_cpld_wd_armed()
|
||||
self.timeout = self._gettimeout()
|
||||
self.max_timeout = WDT_MAX_TIMEOUT
|
||||
|
||||
def _read_cpld_reg(self, reg_file):
|
||||
# On successful read, returns the value read from given
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(reg_file, 'r') as fd:
|
||||
rv = fd.read()
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
rv = rv.rstrip('\r\n')
|
||||
rv = rv.lstrip(" ")
|
||||
return rv
|
||||
|
||||
def _write_cpld_reg(self, reg_file, value):
|
||||
# On successful write, the value read will be written on
|
||||
# reg_name and on failure returns 'ERR'
|
||||
rv = 'ERR'
|
||||
if (not os.path.isfile(reg_file)):
|
||||
return rv
|
||||
try:
|
||||
with open(reg_file, 'w') as fd:
|
||||
rv = fd.write(str(value))
|
||||
except Exception as e:
|
||||
rv = 'ERR'
|
||||
# Ensure that the write operation has succeeded
|
||||
if (int(self._read_cpld_reg(reg_file)) != value ):
|
||||
time.sleep(3)
|
||||
if (int(self._read_cpld_reg(reg_file)) != value ):
|
||||
rv = 'ERR'
|
||||
return rv
|
||||
|
||||
def _is_cpld_wd_armed(self):
|
||||
reg = self._read_cpld_reg(self.wdt_ctrl_reg)
|
||||
state = (int(reg) & 0x20) >> 5
|
||||
#sonic_logger.log_warning(" state = {}".format(state))
|
||||
if (state == 0):
|
||||
return False # Disabled
|
||||
return True # Enabled
|
||||
|
||||
def _disablewatchdog(self):
|
||||
"""
|
||||
Turn off the watchdog timer
|
||||
"""
|
||||
#sonic_logger.log_info(" _disablewatchdog")
|
||||
reg = self._read_cpld_reg(self.wdt_ctrl_reg)
|
||||
# Set reg bit(7-5) to 0 to disable timer
|
||||
reg_val = int(reg)
|
||||
reg_val = reg_val & ~(WDT_CTRL_INTR_EN_BIT | WDT_CTRL_RSET_EN_BIT | WDT_CTRL_CNTR_EN_BIT)
|
||||
self._write_cpld_reg(self.wdt_ctrl_reg, reg_val)
|
||||
# Reset timer counter to 0
|
||||
self._write_cpld_reg(self.wdt_timer_reg, 0)
|
||||
|
||||
def _enablewatchdog(self):
|
||||
"""
|
||||
Turn on the watchdog timer
|
||||
"""
|
||||
#sonic_logger.log_info(" _enablewatchdog")
|
||||
reg = self._read_cpld_reg(self.wdt_ctrl_reg)
|
||||
# Set reg bit(5) to 1 to enable timer
|
||||
reg_val = int(reg) | (WDT_CTRL_INTR_EN_BIT | WDT_CTRL_RSET_EN_BIT | WDT_CTRL_CNTR_EN_BIT)
|
||||
self._write_cpld_reg(self.wdt_ctrl_reg, reg_val)
|
||||
|
||||
def _settimeout(self, seconds):
|
||||
"""
|
||||
Set watchdog timer timeout
|
||||
1. The watchdog timer can be set to an initial value from 0 through 0xff.
|
||||
Writing 0xff would generate an immediate watchdog reset.
|
||||
2. The watchdog timer will increment from the initial value after enabling
|
||||
the watchdog timer reset function or the watchdog interrupt function.
|
||||
3. Writing a value to the watchdog timer register will restart the timer count.
|
||||
4. The watchdog timer will generate an interrupt when the watchdog timer
|
||||
interrupt function is enabled by software and the current timer value
|
||||
reaches watchdog interrupt count mask register value (power on default = 0X7f).
|
||||
5. The PLD will reset the whole system when watchdog timer reset function is enabled
|
||||
by software and the current timer value is 0XFF.
|
||||
|
||||
@param seconds - timeout in seconds
|
||||
@return is the actual set timeout
|
||||
"""
|
||||
#sonic_logger.log_info(" _settimeout")
|
||||
if (seconds > self.max_timeout or seconds < 0):
|
||||
sonic_logger.log_warning("Error: WDT timeout value is out of range.")
|
||||
return WD_COMMON_ERROR
|
||||
# Save the timeout (seconds) value
|
||||
self._write_cpld_reg(self.wdt_timeout, seconds)
|
||||
# Configure the initial timer value to CPLD registor
|
||||
if (seconds >= 0 and seconds <= self.max_timeout):
|
||||
# Use 3.4 sec instead of 4 sec, to be more closer to real time
|
||||
count = (seconds / 3.4)
|
||||
clkval = WDT_CTRL_FREQ_SEL_0_25HZ # frequency 0.25 Hz
|
||||
#elif (seconds >= 0 and seconds < 256):
|
||||
# count = (seconds / 1)
|
||||
# clkval = WDT_CTRL_FREQ_SEL_1HZ # frequency 1 Hz
|
||||
|
||||
init_timer = int(255 - count)
|
||||
if (init_timer > 1):
|
||||
init_timer = init_timer - 1
|
||||
#sonic_logger.log_warning("_settimeout: init_timer = {}".format(init_timer))
|
||||
# Set initial timer count
|
||||
self._write_cpld_reg(self.wdt_timer_reg, init_timer)
|
||||
# Set clock frequency selector
|
||||
# If Bit7 - Bit5 of fval has one bit '1', the timer will be restarted
|
||||
reg = self._read_cpld_reg(self.wdt_ctrl_reg)
|
||||
fval = (int(reg) & 0xF0) | clkval
|
||||
self._write_cpld_reg(self.wdt_ctrl_reg, fval)
|
||||
|
||||
return seconds
|
||||
|
||||
def _gettimeout(self):
|
||||
"""
|
||||
Get watchdog timeout
|
||||
@return watchdog timeout
|
||||
"""
|
||||
#sonic_logger.log_info(" _gettimeout")
|
||||
timeout = self._read_cpld_reg(self.wdt_timeout)
|
||||
return int(timeout)
|
||||
|
||||
def _gettimeleft(self):
|
||||
"""
|
||||
Get time left before watchdog timer expires
|
||||
@return time left in seconds
|
||||
"""
|
||||
#sonic_logger.log_info(" _gettimeleft")
|
||||
timer_cnt = int(self._read_cpld_reg(self.wdt_timer_reg))
|
||||
if (timer_cnt < 254):
|
||||
timer_cnt = timer_cnt + 1
|
||||
freq_sel = int(self._read_cpld_reg(self.wdt_ctrl_reg)) & 0x03
|
||||
timer_cnt_left = 0xFF - int(timer_cnt)
|
||||
if (freq_sel == WDT_CTRL_FREQ_SEL_16HZ):
|
||||
timeleft = timer_cnt_left / 16
|
||||
elif (freq_sel == WDT_CTRL_FREQ_SEL_4HZ):
|
||||
timeleft = timer_cnt_left / 4
|
||||
elif (freq_sel == WDT_CTRL_FREQ_SEL_1HZ):
|
||||
timeleft = timer_cnt_left / 1
|
||||
elif (freq_sel == WDT_CTRL_FREQ_SEL_0_25HZ):
|
||||
#timeleft = timer_cnt_left * 4
|
||||
# Change from 4 sec to 3.4 sec to be more closer to real time.
|
||||
timeleft = timer_cnt_left * 3.4
|
||||
|
||||
return int(timeleft)
|
||||
|
||||
def _keepalive(self):
|
||||
"""
|
||||
Keep alive watchdog timer
|
||||
"""
|
||||
#sonic_logger.log_warning(" _keepalive")
|
||||
self._disablewatchdog()
|
||||
timeout = self._gettimeout()
|
||||
self._settimeout(timeout)
|
||||
self._enablewatchdog()
|
||||
|
||||
def is_armed(self):
|
||||
"""
|
||||
Implements is_armed WatchdogBase API
|
||||
"""
|
||||
return self.armed
|
||||
|
||||
def get_remaining_time(self):
|
||||
"""
|
||||
Implements get_remaining_time WatchdogBase API
|
||||
"""
|
||||
#sonic_logger.log_warning("get_remaining_time")
|
||||
timeleft = WD_COMMON_ERROR
|
||||
|
||||
if self.armed:
|
||||
try:
|
||||
timeleft = self._gettimeleft()
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
return timeleft
|
||||
|
||||
def disarm(self):
|
||||
"""
|
||||
Disarm the hardware watchdog
|
||||
Returns:
|
||||
A boolean, True if watchdog is disarmed successfully, False
|
||||
if not
|
||||
"""
|
||||
#sonic_logger.log_info(" Debug disarm watchdog ")
|
||||
|
||||
disarmed = False
|
||||
|
||||
if self.is_armed():
|
||||
try:
|
||||
self._disablewatchdog()
|
||||
self.armed = False
|
||||
disarmed = True
|
||||
self.timeout = 0
|
||||
self._write_cpld_reg(self.wdt_timeout, self.timeout)
|
||||
except IOError:
|
||||
pass
|
||||
|
||||
return disarmed
|
||||
|
||||
def arm(self, seconds):
|
||||
"""
|
||||
Arm the hardware watchdog with a timeout of <seconds> seconds.
|
||||
If the watchdog is currently armed, calling this function will
|
||||
simply reset the timer to the provided value. If the underlying
|
||||
hardware does not support the value provided in <seconds>, this
|
||||
method should arm the watchdog with the *next greater* available
|
||||
value.
|
||||
Returns:
|
||||
An integer specifying the *actual* number of seconds the watchdog
|
||||
was armed with. On failure returns -1.
|
||||
"""
|
||||
#sonic_logger.log_info(" Debug arm ")
|
||||
|
||||
ret = WD_COMMON_ERROR
|
||||
if seconds < 0:
|
||||
return ret
|
||||
if seconds > self.max_timeout:
|
||||
return ret
|
||||
|
||||
try:
|
||||
self._disablewatchdog()
|
||||
#if self._gettimeout() != seconds:
|
||||
#sonic_logger.log_info(" Debug arm-settimeout")
|
||||
self.timeout = self._settimeout(seconds)
|
||||
#sonic_logger.log_info(" Debug arm-enable ")
|
||||
self._enablewatchdog()
|
||||
self.armed = True
|
||||
ret = self.timeout
|
||||
except IOError as e:
|
||||
pass
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -0,0 +1,20 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
def main():
|
||||
try:
|
||||
import sonic_platform.platform
|
||||
import sonic_platform.chassis
|
||||
except ImportError, e:
|
||||
raise ImportError (str(e) + "- required module not found")
|
||||
|
||||
chassis = sonic_platform.platform.Platform().get_chassis()
|
||||
if chassis is None:
|
||||
print "DEBUG chassis was None "
|
||||
|
||||
base_mac = chassis.get_base_mac()
|
||||
print base_mac
|
||||
|
||||
return
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
@ -91,6 +91,17 @@
|
||||
algo = "sha1";
|
||||
};
|
||||
};
|
||||
fdt_smc_sse-g3748 {
|
||||
description = "Flattened Device Tree blob for Supermicro SSE-G3748";
|
||||
data = /incbin/("/usr/lib/linux-image-5.10.0-23-2-arm64/marvell/smc_sse-g3748.dtb");
|
||||
type = "flat_dt";
|
||||
arch = "arm64";
|
||||
compression = "none";
|
||||
load = <0x2 0x1000000>;
|
||||
hash@1 {
|
||||
algo = "sha1";
|
||||
};
|
||||
};
|
||||
};
|
||||
configurations {
|
||||
default = "conf_ac5x";
|
||||
@ -121,5 +132,14 @@
|
||||
algo = "sha1";
|
||||
};
|
||||
};
|
||||
conf_smc_sse-g3748 {
|
||||
description = "Boot Linux kernel with FDT blob + ramdisk for Supermicro SSE-G3748";
|
||||
kernel = "kernel_ac5x";
|
||||
fdt = "fdt_smc_sse-g3748";
|
||||
ramdisk = "ramdisk_ac5x";
|
||||
hash@1 {
|
||||
algo = "sha1";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
Reference in New Issue
Block a user