<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>diff</title>
<meta name="Generator" content="Vim/9.0">
<meta name="plugin-version" content="vim9.0_v2">
<meta name="settings" content="whole_filler,use_css,no_foldcolumn,prevent_copy=,use_input_for_pc=none">
<meta name="colorscheme" content="none">
<style>
<!--
pre { font-family: monospace; color: #ffffff; background-color: #000000; }
body { font-family: monospace; color: #ffffff; background-color: #000000; }
* { font-size: 1em; }
.Folded { color: #00ffff; background-color: #808080; padding-bottom: 1px; font-weight: bold; }
.PreProc { color: #8080ff; font-weight: bold; }
.Type { color: #00ff00; font-weight: bold; }
.Statement { color: #ffff00; font-weight: bold; }
.Comment { color: #00ffff; font-weight: bold; }
.Constant { color: #ff40ff; font-weight: bold; }
.DiffText { background-color: #ff6060; padding-bottom: 1px; font-weight: bold; }
.DiffAdd { background-color: #8080ff; padding-bottom: 1px; }
.DiffChange { background-color: #ff40ff; padding-bottom: 1px; }
.DiffDelete { color: #8080ff; background-color: #00ffff; padding-bottom: 1px; font-weight: bold; }
-->
<!--
table { table-layout: fixed; }
html, body, table, tbody { width: 100%; margin: 0; padding: 0; }
table, td, th { border: 1px solid; }
td { vertical-align: top; }
th, td { width: 50.0%; }
td div { overflow: auto; }
-->
</style>
</head>
<body>
<table id='vimCodeElement'>
<tr>
<th>drivers/net/ethernet/stmicro/stmmac/dwmac5_sfty.c</th>
<th>drivers/net/ethernet/stmicro/stmmac/dwxgmac2_sfty.c</th>
</tr><tr>
<td><div>
<pre>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MAC_DPP_FSM_INT_STATUS             </span><span class="Constant DiffText">0x0000014</span><span class="Constant DiffChange">0</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MAC_FSM_CONTROL                    </span><span class="Constant DiffText">0x0000014</span><span class="Constant DiffChange">8</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MTL_ECC_CONTROL                    </span><span class="Constant DiffText">0x00000c</span><span class="Constant DiffChange">c0</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffText">#define MEEAO                            BIT(</span><span class="Constant DiffText">8</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define TSOEE                            BIT(</span><span class="Constant DiffText">4</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define MRXPEE                           BIT(</span><span class="Constant DiffText">3</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define MESTEE                           BIT(</span><span class="Constant DiffText">2</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define MRXEE                            BIT(</span><span class="Constant DiffText">1</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define MTXEE                            BIT(</span><span class="Constant DiffText">0</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MTL_SAFETY_INT_STATUS              </span><span class="Constant DiffText">0x00000c</span><span class="Constant DiffChange">c4</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffText">#define MCSIS                            BIT(</span><span class="Constant DiffText">31</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MEUIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">1</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MECIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MTL_ECC_INT_ENABLE         </span><span class="Constant DiffText">0x00000c</span><span class="Constant DiffChange">c8</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">RPCEIE     </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">12</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">ECEIE      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">8</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">RXCEIE     </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">4</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">TXCEIE     </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MTL_ECC_INT_STATUS         </span><span class="Constant DiffText">0x00000c</span><span class="Constant DiffChange">cc</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffText">#define MTL_DPP_CONTROL                  </span><span class="Constant DiffText">0x00000ce0</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffText">#define EPSI                             BIT(</span><span class="Constant DiffText">2</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define OPE                              BIT(</span><span class="Constant DiffText">1</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffText">#define EDPP                             BIT(</span><span class="Constant DiffText">0</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">DMA_SAFETY_INT_STATUS              </span><span class="Constant DiffText">0x00001080</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MSUIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">29</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">MSCIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">28</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">DEUIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">1</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">DECIS      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">DMA_ECC_INT_ENABLE         </span><span class="Constant DiffText">0x00001084</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">TCEIE      </span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">DMA_ECC_INT_STATUS         </span><span class="Constant DiffText">0x00001088</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_error_desc {                                                                                                                                                 </span>
        <span class="Type">bool</span> valid;
        <span class="Type">const</span> <span class="Type">char</span> *desc;
        <span class="Type">const</span> <span class="Type">char</span> *detailed_desc;
};

<span class="PreProc">#define STAT_OFF(field)           offsetof(</span><span class="Type">struct</span><span class="PreProc"> stmmac_safety_stats, field)</span>

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_log_error(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev, u32 value, </span><span class="Type DiffChange">bool</span><span class="DiffChange"> corr,                                                                                                </span>
                               <span class="Type">const</span> <span class="Type">char</span> *module_name,
<span class="DiffChange">                              </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_error_desc *desc,                                                                                                       </span>
                               <span class="Type">unsigned</span> <span class="Type">long</span> field_offset,
                               <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        <span class="Type">unsigned</span> <span class="Type">long</span> loc, mask;
        u8 *bptr = (u8 *)stats;
        <span class="Type">unsigned</span> <span class="Type">long</span> *ptr;
<span class="Folded">+--  8 lines: ptr = (unsigned long *)(bptr + field_offset);----------------------------------------------------------------------------------------------------------------</span>

                <span class="Comment">/*</span><span class="Comment"> Update counters </span><span class="Comment">*/</span>
                ptr[loc]++;
        }
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5_error_desc dwmac5</span><span class="DiffChange">_mac_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                             </span>
        { <span class="Constant">true</span>, <span class="Constant">"ATPES"</span>, <span class="Constant">"Application Transmit Interface Parity Check Error"</span> },
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">true</span>, <span class="Constant">"TPES"</span>, <span class="Constant">"TSO Data Path Parity Check Error"</span> },
<span class="DiffChange">       { </span><span class="Constant DiffChange">true</span><span class="DiffChange">, </span><span class="Constant DiffChange">"</span><span class="Constant DiffText">RDPES"</span><span class="DiffText">, </span><span class="Constant DiffText">"Read Descriptor</span><span class="Constant DiffChange"> Parity Check Error"</span><span class="DiffChange"> },                                                                                                           </span>
<span class="DiffChange">       { </span><span class="Constant DiffChange">true</span><span class="DiffChange">, </span><span class="Constant DiffChange">"MPES"</span><span class="DiffChange">, </span><span class="Constant DiffChange">"MTL Data Path Parity Check Error"</span><span class="DiffChange"> },                                                                                                              </span>
        { <span class="Constant">true</span>, <span class="Constant">"MTSPES"</span>, <span class="Constant">"MTL TX Status Data Path Parity Check Error"</span> },
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">true</span>, <span class="Constant">"ARPES"</span>, <span class="Constant">"Application Receive Interface Data Path Parity Check Error"</span> },
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">true</span>, <span class="Constant">"CWPES"</span>, <span class="Constant">"CSR Write Data Path Parity Check Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ASRPES"</span>, <span class="Constant">"AXI Slave Read Data Path Parity Check Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TTES"</span>, <span class="Constant">"TX FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"RTES"</span>, <span class="Constant">"RX FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"CTES"</span>, <span class="Constant">"CSR FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ATES"</span>, <span class="Constant">"APP FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"PTES"</span>, <span class="Constant">"PTP FSM Timeout Error"</span> },
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"T125ES"</span><span class="DiffText">, </span><span class="Constant DiffText">"TX125 FSM Timeout Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                                     </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"R125ES"</span><span class="DiffText">, </span><span class="Constant DiffText">"RX125 FSM Timeout Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                                     </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"RVCTES"</span><span class="DiffText">, </span><span class="Constant DiffText">"REV MDC FSM Timeout Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                                   </span>
        { <span class="Constant">true</span>, <span class="Constant">"MSTTES"</span>, <span class="Constant">"Master Read/Write Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"SLVTES"</span>, <span class="Constant">"Slave Read/Write Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ATITES"</span>, <span class="Constant">"Application Timeout on ATI Interface Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ARITES"</span>, <span class="Constant">"Application Timeout on ARI Interface Error"</span> },
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">false</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"UNKNOWN"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Unknown Error"</span><span class="DiffAdd"> }, </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 20 </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                    </span>
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">false</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"UNKNOWN"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Unknown Error"</span><span class="DiffAdd"> }, </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 21 </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                    </span>
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">false</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"UNKNOWN"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Unknown Error"</span><span class="DiffAdd"> }, </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 22 </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                    </span>
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">false</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"UNKNOWN"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Unknown Error"</span><span class="DiffAdd"> }, </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 23 </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                    </span>
        { <span class="Constant">true</span>, <span class="Constant">"FSMPES"</span>, <span class="Constant">"FSM State Parity Error"</span> },
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">false</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"UNKNOWN"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Unknown Error"</span><span class="DiffAdd"> }, </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 25 </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                    </span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 26 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 27 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 31 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                    </span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_mac_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                                 </span>
                                    <span class="Type">void</span> __iomem *ioaddr, <span class="Type">bool</span> correctable,
                                    <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + MAC_DPP_FSM_INT_STATUS);</span><span class="DiffChange">                                                                                                                    </span>
<span class="DiffChange">       writel(value, ioaddr + MAC_DPP_FSM_INT_STATUS);</span><span class="DiffChange">                                                                                                                    </span>

<span class="DiffChange">       dw</span><span class="DiffText">mac5_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"MAC"</span><span class="DiffText">, dwmac5</span><span class="DiffChange">_mac_errors,                                                                                               </span>
<span class="DiffChange">                       STAT_OFF(mac_errors), stats);</span><span class="DiffChange">                                                                                                                      </span>
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5_error_desc dwmac5</span><span class="DiffChange">_mtl_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                             </span>
        { <span class="Constant">true</span>, <span class="Constant">"TXCES"</span>, <span class="Constant">"MTL TX Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TXAMS"</span>, <span class="Constant">"MTL TX Memory Address Mismatch Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TXUES"</span>, <span class="Constant">"MTL TX Memory Error"</span> },
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 3 </span><span class="Comment">*/</span>
        { <span class="Constant">true</span>, <span class="Constant">"RXCES"</span>, <span class="Constant">"MTL RX Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"RXAMS"</span>, <span class="Constant">"MTL RX Memory Address Mismatch Error"</span> },
<span class="Folded">+-- 22 lines: { true, "RXUES", "MTL RX Memory Error" },--------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 31 </span><span class="Comment">*/</span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_mtl_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                                 </span>
                                    <span class="Type">void</span> __iomem *ioaddr, <span class="Type">bool</span> correctable,
                                    <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + MTL_ECC_INT_STATUS);</span><span class="DiffChange">                                                                                                                        </span>
<span class="DiffChange">       writel(value, ioaddr + MTL_ECC_INT_STATUS);</span><span class="DiffChange">                                                                                                                        </span>

<span class="DiffChange">       dw</span><span class="DiffText">mac5_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"MTL"</span><span class="DiffText">, dwmac5_mtl_errors</span><span class="DiffChange">,                                                                                               </span>
<span class="DiffChange">                       STAT_OFF(mtl_errors), stats);</span><span class="DiffChange">                                                                                                                      </span>
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5_error_desc dwmac5</span><span class="DiffChange">_dma_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                             </span>
        { <span class="Constant">true</span>, <span class="Constant">"TCES"</span>, <span class="Constant">"DMA TSO Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TAMS"</span>, <span class="Constant">"DMA TSO Memory Address Mismatch Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TUES"</span>, <span class="Constant">"DMA TSO Memory Error"</span> },
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 3 </span><span class="Comment">*/</span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 4 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                     </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 5 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                     </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 6 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                     </span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 7 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 8 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 9 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 10 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 11 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 12 </span><span class="Comment">*/</span>
<span class="Folded">+-- 15 lines: { false, "UNKNOWN", "Unknown Error" }, 13 -------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 31 </span><span class="Comment">*/</span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_dma_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                                 </span>
<span class="DiffChange">                                 </span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr, </span><span class="Type DiffChange">bool</span><span class="DiffChange"> correctable,                                                                                                  </span>
<span class="DiffChange">                                 </span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats)                                                                                                       </span>
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + DMA_ECC_INT_STATUS);</span><span class="DiffChange">                                                                                                                        </span>
<span class="DiffChange">       writel(value, ioaddr + DMA_ECC_INT_STATUS);</span><span class="DiffChange">                                                                                                                        </span>

<span class="DiffChange">       dw</span><span class="DiffText">mac5_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"DMA"</span><span class="DiffText">, dwmac5</span><span class="DiffChange">_dma_errors,                                                                                               </span>
<span class="DiffChange">                       STAT_OFF(dma_errors), stats);</span><span class="DiffChange">                                                                                                                      </span>
}

<span class="Type DiffText">int</span><span class="DiffText"> dwmac5</span><span class="DiffChange">_safety_feat_irq_status(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                                 </span>
<span class="DiffChange">                                 </span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr,                                                                                                                    </span>
<span class="DiffChange">                                 </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">int</span><span class="DiffChange"> asp,                                                                                                                        </span>
<span class="DiffChange">                                 </span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats)                                                                                                       </span>
{
        <span class="Type">bool</span> err, corr;
        u32 mtl, dma;
        <span class="Type">int</span> ret = <span class="Constant">0</span>;

        <span class="Statement">if</span> (!asp)
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;

<span class="DiffChange">       mtl = readl(ioaddr + MTL_SAFETY_INT_STATUS);</span><span class="DiffChange">                                                                                                                       </span>
<span class="DiffChange">       dma = readl(ioaddr + DMA_SAFETY_INT_STATUS);</span><span class="DiffChange">                                                                                                                       </span>

<span class="DiffChange">       err = (mtl & </span><span class="DiffText">MCSIS) || (dma & </span><span class="DiffChange">MCSIS);                                                                                                                              </span>
        corr = <span class="Constant">false</span>;
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_mac_err(ndev, ioaddr, corr, stats);                                                                                                          </span>
                ret |= !corr;
        }

<span class="DiffChange">       err = (mtl & (</span><span class="DiffText">MEUIS | MECIS)) || (dma & (MSUIS | </span><span class="DiffChange">MSCIS));                                                                                                          </span>
<span class="DiffChange">       corr = (mtl & </span><span class="DiffText">MECIS) || (dma & </span><span class="DiffChange">MSCIS);                                                                                                                             </span>
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_mtl_err(ndev, ioaddr, corr, stats);                                                                                                          </span>
                ret |= !corr;
        }

<span class="DiffChange">       err = dma & (</span><span class="DiffText">DEUIS | </span><span class="DiffChange">DECIS);                                                                                                                                       </span>
<span class="DiffChange">       corr = dma & DECIS;</span><span class="DiffChange">                                                                                                                                                </span>
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">mac5</span><span class="DiffChange">_handle_dma_err(ndev, ioaddr, corr, stats);                                                                                                          </span>
                ret |= !corr;
        }

        <span class="Statement">return</span> ret;
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_error {                                                                                                                                         </span>
<span class="DiffChange">       </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">mac5</span><span class="DiffChange">_error_desc *desc;                                                                                                                              </span>
<span class="DiffChange">} dw</span><span class="DiffText">mac5</span><span class="DiffChange">_all_errors[] = {                                                                                                                                                  </span>
<span class="DiffChange">       { dw</span><span class="DiffText">mac5</span><span class="DiffChange">_mac_errors },                                                                                                                                             </span>
<span class="DiffChange">       { dw</span><span class="DiffText">mac5</span><span class="DiffChange">_mtl_errors },                                                                                                                                             </span>
<span class="DiffChange">       { dw</span><span class="DiffText">mac5</span><span class="DiffChange">_dma_errors },                                                                                                                                             </span>
};

<span class="Type DiffText">int</span><span class="DiffText"> dwmac5</span><span class="DiffChange">_safety_feat_dump(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats,                                                                                                             </span>
<span class="DiffChange">                           </span><span class="Type DiffChange">int</span><span class="DiffChange"> index, </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">long</span><span class="DiffChange"> *count,                                                                                                               </span>
<span class="DiffChange">                           </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">char</span><span class="DiffChange"> **desc)                                                                                                                             </span>
{
        <span class="Type">int</span> module = index / <span class="Constant">32</span>, offset = index % <span class="Constant">32</span>;
        <span class="Type">unsigned</span> <span class="Type">long</span> *ptr = (<span class="Type">unsigned</span> <span class="Type">long</span> *)stats;

<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (module >= ARRAY_SIZE(dw</span><span class="DiffText">mac5</span><span class="DiffChange">_all_errors))                                                                                                                       </span>
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;
<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (!dw</span><span class="DiffText">mac5</span><span class="DiffChange">_all_errors[module].desc[offset].valid)                                                                                                                 </span>
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;
        <span class="Statement">if</span> (count)
                *count = *(ptr + index);
        <span class="Statement">if</span> (desc)
<span class="DiffChange">               *desc = dw</span><span class="DiffText">mac5</span><span class="DiffChange">_all_errors[module].desc[offset].desc;                                                                                                       </span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type DiffText">int</span><span class="DiffText"> dwmac5</span><span class="DiffChange">_safety_feat_config(</span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr, </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">int</span><span class="DiffChange"> asp,                                                                                                      </span>
<span class="DiffChange">                       </span><span class="DiffText">      </span><span class="Type DiffText">struct</span><span class="DiffText"> stmmac_safety_feature_cfg *safety_feat</span><span class="DiffChange">_cfg)                                                                                           </span>
{
<span class="DiffAdd">  </span><span class="Type DiffAdd">struct</span><span class="DiffAdd"> stmmac_safety_feature_cfg all_safety_feats = {                                                                                                              </span>
<span class="DiffAdd">          .tsoee = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                                </span>
<span class="DiffAdd">          .mrxpee = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                               </span>
<span class="DiffAdd">          .mestee = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                               </span>
<span class="DiffAdd">          .mrxee = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                                </span>
<span class="DiffAdd">          .mtxee = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                                </span>
<span class="DiffAdd">          .epsi = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                                 </span>
<span class="DiffAdd">          .edpp = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                                 </span>
<span class="DiffAdd">          .prtyen = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                               </span>
<span class="DiffAdd">          .tmouten = </span><span class="Constant DiffAdd">1</span><span class="DiffAdd">,                                                                                                                                              </span>
<span class="DiffAdd">  };</span><span class="DiffAdd">                                                                                                                                                                 </span>
        u32 value;

        <span class="Statement">if</span> (!asp)
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;

<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (!safety_feat_cfg)                                                                                                                                              </span>
<span class="DiffAdd">          safety_feat_cfg = &all_safety_feats;</span><span class="DiffAdd">                                                                                                                       </span>
<span class="DiffAdd"> </span><span class="DiffAdd">                                                                                                                                                                          </span>
        <span class="Comment">/*</span><span class="Comment"> 1. Enable Safety Features </span><span class="Comment">*/</span>
<span class="DiffChange">       </span><span class="DiffText">value = readl(ioaddr + </span><span class="DiffChange">MTL_ECC_CONTROL);                                                                                                                           </span>
<span class="DiffAdd">  value |= MEEAO; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> MTL ECC Error Addr Status Override </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                           </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->tsoee)                                                                                                                                        </span>
<span class="DiffAdd">          value |= TSOEE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> TSO ECC </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                              </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->mrxpee)                                                                                                                                       </span>
<span class="DiffAdd">          value |= MRXPEE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> MTL RX Parser ECC </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                   </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->mestee)                                                                                                                                       </span>
<span class="DiffAdd">          value |= MESTEE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> MTL EST ECC </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                         </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->mrxee)                                                                                                                                        </span>
<span class="DiffAdd">          value |= MRXEE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> MTL RX FIFO ECC </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                      </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->mtxee)                                                                                                                                        </span>
<span class="DiffAdd">          value |= MTXEE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> MTL TX FIFO ECC </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                      </span>
<span class="DiffAdd">  writel(value, ioaddr + MTL_ECC_CONTROL);</span><span class="DiffAdd">                                                                                                                           </span>

        <span class="Comment">/*</span><span class="Comment"> 2. Enable MTL Safety Interrupts </span><span class="Comment">*/</span>
<span class="DiffChange">       value = readl(ioaddr + MTL_ECC_INT_ENABLE);</span><span class="DiffChange">                                                                                                                        </span>
<span class="DiffChange">       value |= RPCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> RX Parser Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                          </span>
<span class="DiffChange">       value |= ECEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> EST Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                 </span>
<span class="DiffChange">       value |= RXCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> RX Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                 </span>
<span class="DiffChange">       value |= TXCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> TX Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                 </span>
<span class="DiffChange">       writel(value, ioaddr + MTL_ECC_INT_ENABLE);</span><span class="DiffChange">                                                                                                                        </span>

        <span class="Comment">/*</span><span class="Comment"> 3. Enable DMA Safety Interrupts </span><span class="Comment">*/</span>
<span class="DiffChange">       value = readl(ioaddr + DMA_ECC_INT_ENABLE);</span><span class="DiffChange">                                                                                                                        </span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>

<span class="DiffChange">       value |= TCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> TSO Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                 </span>
<span class="DiffChange">       writel(value, ioaddr + DMA_ECC_INT_ENABLE);</span><span class="DiffChange">                                                                                                                        </span>


<span class="DiffChange">       </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> </span><span class="Comment DiffText">Only ECC Protection for External Memory feature is selected</span><span class="DiffChange">                                                                                                     </span>
<span class="Comment DiffChange">        *</span><span class="DiffChange">                                                                                                                                                                 </span>
<span class="Comment">   </span><span class="Comment">*/</span>
<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (asp </span><span class="DiffText"><= </span><span class="Constant DiffText">0x1</span><span class="DiffChange">)                                                                                                                                                    </span>
                <span class="Statement">return</span> <span class="Constant">0</span>;

<span class="DiffChange">       </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> </span><span class="Comment DiffText">5</span><span class="Comment DiffChange">. Enable Parity and Timeout for FSM </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange">       value = readl(ioaddr + MAC_FSM_CONTROL);</span><span class="DiffChange">                                                                                                                           </span>
<span class="DiffText"> </span><span class="Statement DiffText">if</span><span class="DiffText"> (safety_feat_cfg->prtyen)</span><span class="DiffChange">                                                                                                                                       </span>
<span class="DiffChange">       </span><span class="DiffText">    value |= </span><span class="DiffChange">PRTYEN; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> FSM Parity Feature </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                  </span>
<span class="DiffText"> </span><span class="Statement DiffText">if</span><span class="DiffText"> (safety_feat_cfg->tmouten)</span><span class="DiffChange">                                                                                                                                      </span>
<span class="DiffChange">       </span><span class="DiffText">    value |= </span><span class="DiffChange">TMOUTEN; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> FSM Timeout Feature </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                </span>
<span class="DiffChange">       writel(value, ioaddr + MAC_FSM_CONTROL);</span><span class="DiffChange">                                                                                                                           </span>
<span class="DiffAdd"> </span><span class="DiffAdd">                                                                                                                                                                          </span>
<span class="DiffAdd">  </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> 4. Enable Data Parity Protection </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                             </span>
<span class="DiffAdd">  value = readl(ioaddr + MTL_DPP_CONTROL);</span><span class="DiffAdd">                                                                                                                           </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->edpp)                                                                                                                                         </span>
<span class="DiffAdd">          value |= EDPP;</span><span class="DiffAdd">                                                                                                                                             </span>
<span class="DiffAdd">  writel(value, ioaddr + MTL_DPP_CONTROL);</span><span class="DiffAdd">                                                                                                                           </span>
<span class="DiffAdd"> </span><span class="DiffAdd">                                                                                                                                                                          </span>
<span class="DiffAdd">  </span><span class="Comment DiffAdd">/*</span><span class="DiffAdd">                                                                                                                                                                 </span>
<span class="Comment DiffAdd">   * All the Automotive Safety features are selected without the "Parity</span><span class="DiffAdd">                                                                                             </span>
<span class="Comment DiffAdd">   * Port Enable for external interface" feature.</span><span class="DiffAdd">                                                                                                                    </span>
<span class="Comment DiffAdd">   </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                                                                                                </span>
<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (asp <= </span><span class="Constant DiffAdd">0x2</span><span class="DiffAdd">)                                                                                                                                                    </span>
<span class="DiffAdd">          </span><span class="Statement DiffAdd">return</span><span class="DiffAdd"> </span><span class="Constant DiffAdd">0</span><span class="DiffAdd">;                                                                                                                                                  </span>

<span class="DiffAdd">  </span><span class="Statement DiffAdd">if</span><span class="DiffAdd"> (safety_feat_cfg->epsi)                                                                                                                                         </span>
<span class="DiffAdd">          value |= EPSI;</span><span class="DiffAdd">                                                                                                                                             </span>
<span class="DiffAdd">  writel(value, ioaddr + MTL_DPP_CONTROL);</span><span class="DiffAdd">                                                                                                                           </span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
}
</pre>
</div></td>
<td><div>
<pre>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MAC_DPP_FSM_INT_STATUS       </span><span class="Constant DiffText">0x0000015</span><span class="Constant DiffChange">0</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MAC_FSM_CONTROL              </span><span class="Constant DiffText">0x0000015</span><span class="Constant DiffChange">8</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MTL_ECC_CONTROL              </span><span class="Constant DiffText">0x000010</span><span class="Constant DiffChange">c0</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MTL_SAFETY_INT_STATUS        </span><span class="Constant DiffText">0x000010</span><span class="Constant DiffChange">c4</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MEUIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">1</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MECIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MTL_ECC_INT_ENABLE   </span><span class="Constant DiffText">0x000010</span><span class="Constant DiffChange">c8</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_RPCEIE</span><span class="PreProc DiffChange">                 BIT(</span><span class="Constant DiffChange">12</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_ECEIE</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">8</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_RXCEIE</span><span class="PreProc DiffChange">                 BIT(</span><span class="Constant DiffChange">4</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_TXCEIE</span><span class="PreProc DiffChange">                 BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MTL_ECC_INT_STATUS   </span><span class="Constant DiffText">0x000010</span><span class="Constant DiffChange">cc</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_DMA_SAFETY_INT_STATUS        </span><span class="Constant DiffText">0x00003064</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffText">#define XGMAC_MCSIS                      BIT(</span><span class="Constant DiffText">31</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MSUIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">29</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_MSCIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">28</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                            </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_DEUIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">1</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_DECIS</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_DMA_ECC_INT_ENABLE   </span><span class="Constant DiffText">0x00003068</span><span class="DiffChange">                                                                                                                         </span>
<span class="PreProc DiffText">#define XGMAC_DCEIE                      BIT(</span><span class="Constant DiffText">1</span><span class="PreProc DiffText">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_TCEIE</span><span class="PreProc DiffChange">                  BIT(</span><span class="Constant DiffChange">0</span><span class="PreProc DiffChange">)</span><span class="DiffChange">                                                                                                                             </span>
<span class="PreProc DiffChange">#define </span><span class="PreProc DiffText">XGMAC_DMA_ECC_INT_STATUS   </span><span class="Constant DiffText">0x0000306c</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_error_desc {                                                                                                                                               </span>
        <span class="Type">bool</span> valid;
        <span class="Type">const</span> <span class="Type">char</span> *desc;
        <span class="Type">const</span> <span class="Type">char</span> *detailed_desc;
};

<span class="PreProc">#define STAT_OFF(field)           offsetof(</span><span class="Type">struct</span><span class="PreProc"> stmmac_safety_stats, field)</span>

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_log_error(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev, u32 value, </span><span class="Type DiffChange">bool</span><span class="DiffChange"> corr,                                                                                              </span>
                               <span class="Type">const</span> <span class="Type">char</span> *module_name,
<span class="DiffChange">                              </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_error_desc *desc,                                                                                                     </span>
                               <span class="Type">unsigned</span> <span class="Type">long</span> field_offset,
                               <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        <span class="Type">unsigned</span> <span class="Type">long</span> loc, mask;
        u8 *bptr = (u8 *)stats;
        <span class="Type">unsigned</span> <span class="Type">long</span> *ptr;
<span class="Folded">+--  8 lines: ptr = (unsigned long *)(bptr + field_offset);----------------------------------------------------------------------------------------------------------------</span>

                <span class="Comment">/*</span><span class="Comment"> Update counters </span><span class="Comment">*/</span>
                ptr[loc]++;
        }
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3_error_desc dwxgmac3</span><span class="DiffChange">_mac_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                         </span>
        { <span class="Constant">true</span>, <span class="Constant">"ATPES"</span>, <span class="Constant">"Application Transmit Interface Parity Check Error"</span> },
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">true</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"DPES"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"Descriptor Cache Data Path Parity Check Error"</span><span class="DiffAdd"> },                                                                                                 </span>
        { <span class="Constant">true</span>, <span class="Constant">"TPES"</span>, <span class="Constant">"TSO Data Path Parity Check Error"</span> },
<span class="DiffChange">       { </span><span class="Constant DiffChange">true</span><span class="DiffChange">, </span><span class="Constant DiffChange">"</span><span class="Constant DiffText">TSOPES"</span><span class="DiffText">, </span><span class="Constant DiffText">"TSO Header Data Path</span><span class="Constant DiffChange"> Parity Check Error"</span><span class="DiffChange"> },                                                                                                     </span>
<span class="DiffChange">       { </span><span class="Constant DiffChange">true</span><span class="DiffChange">, </span><span class="Constant DiffChange">"M</span><span class="Constant DiffText">T</span><span class="Constant DiffChange">PES"</span><span class="DiffChange">, </span><span class="Constant DiffChange">"MTL Data Path Parity Check Error"</span><span class="DiffChange"> },                                                                                                             </span>
        { <span class="Constant">true</span>, <span class="Constant">"MTSPES"</span>, <span class="Constant">"MTL TX Status Data Path Parity Check Error"</span> },
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">true</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MTBUPES"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MAC TBU Data Path Parity Check Error"</span><span class="DiffAdd"> },                                                                                                       </span>
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">true</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MTFCPES"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MAC TFC Data Path Parity Check Error"</span><span class="DiffAdd"> },                                                                                                       </span>
        { <span class="Constant">true</span>, <span class="Constant">"ARPES"</span>, <span class="Constant">"Application Receive Interface Data Path Parity Check Error"</span> },
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">true</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MRWCPES"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MTL RWC Data Path Parity Check Error"</span><span class="DiffAdd"> },                                                                                                       </span>
<span class="DiffAdd">  { </span><span class="Constant DiffAdd">true</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MRRCPES"</span><span class="DiffAdd">, </span><span class="Constant DiffAdd">"MTL RCC Data Path Parity Check Error"</span><span class="DiffAdd"> },                                                                                                       </span>
        { <span class="Constant">true</span>, <span class="Constant">"CWPES"</span>, <span class="Constant">"CSR Write Data Path Parity Check Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ASRPES"</span>, <span class="Constant">"AXI Slave Read Data Path Parity Check Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TTES"</span>, <span class="Constant">"TX FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"RTES"</span>, <span class="Constant">"RX FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"CTES"</span>, <span class="Constant">"CSR FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ATES"</span>, <span class="Constant">"APP FSM Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"PTES"</span>, <span class="Constant">"PTP FSM Timeout Error"</span> },
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 18 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                    </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 19 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                    </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">false</span><span class="DiffText">, </span><span class="Constant DiffText">"UNKNOWN"</span><span class="DiffText">, </span><span class="Constant DiffText">"Unknown Error"</span><span class="DiffText"> }, </span><span class="Comment DiffText">/*</span><span class="Comment DiffText"> 20 </span><span class="Comment DiffText">*/</span><span class="DiffChange">                                                                                                                    </span>
        { <span class="Constant">true</span>, <span class="Constant">"MSTTES"</span>, <span class="Constant">"Master Read/Write Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"SLVTES"</span>, <span class="Constant">"Slave Read/Write Timeout Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ATITES"</span>, <span class="Constant">"Application Timeout on ATI Interface Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"ARITES"</span>, <span class="Constant">"Application Timeout on ARI Interface Error"</span> },
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">true</span>, <span class="Constant">"FSMPES"</span>, <span class="Constant">"FSM State Parity Error"</span> },
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 26 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 27 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"CPI"</span><span class="DiffText">, </span><span class="Constant DiffText">"Control Register Parity Check Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                            </span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_mac_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                               </span>
                                    <span class="Type">void</span> __iomem *ioaddr, <span class="Type">bool</span> correctable,
                                    <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MAC_DPP_FSM_INT_STATUS);                                                                                                              </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MAC_DPP_FSM_INT_STATUS);                                                                                                              </span>

<span class="DiffChange">       dw</span><span class="DiffText">xgmac3_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"MAC"</span><span class="DiffText">, dwxgmac3</span><span class="DiffChange">_mac_errors,                                                                                           </span>
<span class="DiffChange">                       </span><span class="DiffText">   </span><span class="DiffChange">STAT_OFF(mac_errors), stats);                                                                                                                   </span>
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3_error_desc dwxgmac3</span><span class="DiffChange">_mtl_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                         </span>
        { <span class="Constant">true</span>, <span class="Constant">"TXCES"</span>, <span class="Constant">"MTL TX Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TXAMS"</span>, <span class="Constant">"MTL TX Memory Address Mismatch Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TXUES"</span>, <span class="Constant">"MTL TX Memory Error"</span> },
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 3 </span><span class="Comment">*/</span>
        { <span class="Constant">true</span>, <span class="Constant">"RXCES"</span>, <span class="Constant">"MTL RX Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"RXAMS"</span>, <span class="Constant">"MTL RX Memory Address Mismatch Error"</span> },
<span class="Folded">+-- 22 lines: { true, "RXUES", "MTL RX Memory Error" },--------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 31 </span><span class="Comment">*/</span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_mtl_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                               </span>
                                    <span class="Type">void</span> __iomem *ioaddr, <span class="Type">bool</span> correctable,
                                    <span class="Type">struct</span> stmmac_safety_stats *stats)
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MTL_ECC_INT_STATUS);                                                                                                                  </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MTL_ECC_INT_STATUS);                                                                                                                  </span>

<span class="DiffChange">       dw</span><span class="DiffText">xgmac3_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"MTL"</span><span class="DiffChange">,                                                                                                                </span>
<span class="DiffChange">                       </span><span class="DiffText">   dwxgmac3_mtl_errors, </span><span class="DiffChange">STAT_OFF(mtl_errors), stats);                                                                                              </span>
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3_error_desc dwxgmac3</span><span class="DiffChange">_dma_errors[</span><span class="Constant DiffChange">32</span><span class="DiffChange">]= {                                                                                                         </span>
        { <span class="Constant">true</span>, <span class="Constant">"TCES"</span>, <span class="Constant">"DMA TSO Memory Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TAMS"</span>, <span class="Constant">"DMA TSO Memory Address Mismatch Error"</span> },
        { <span class="Constant">true</span>, <span class="Constant">"TUES"</span>, <span class="Constant">"DMA TSO Memory Error"</span> },
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 3 </span><span class="Comment">*/</span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"DCES"</span><span class="DiffText">, </span><span class="Constant DiffText">"DMA DCACHE Memory Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                                       </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"DAMS"</span><span class="DiffText">, </span><span class="Constant DiffText">"DMA DCACHE Address Mismatch Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                             </span>
<span class="DiffChange">       { </span><span class="Constant DiffText">true</span><span class="DiffText">, </span><span class="Constant DiffText">"DUES"</span><span class="DiffText">, </span><span class="Constant DiffText">"DMA DCACHE Memory Error"</span><span class="DiffText"> },</span><span class="DiffChange">                                                                                                                       </span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 7 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 8 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 9 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 10 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 11 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 12 </span><span class="Comment">*/</span>
<span class="Folded">+-- 15 lines: { false, "UNKNOWN", "Unknown Error" }, 13 -------------------------------------------------------------------------------------------------------------------</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 28 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 29 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 30 </span><span class="Comment">*/</span>
        { <span class="Constant">false</span>, <span class="Constant">"UNKNOWN"</span>, <span class="Constant">"Unknown Error"</span> }, <span class="Comment">/*</span><span class="Comment"> 31 </span><span class="Comment">*/</span>
};

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">void</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_dma_err(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                               </span>
<span class="DiffChange">                                 </span><span class="DiffText">  </span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr, </span><span class="Type DiffChange">bool</span><span class="DiffChange"> correctable,                                                                                                </span>
<span class="DiffChange">                                 </span><span class="DiffText">  </span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats)                                                                                                     </span>
{
        u32 value;

<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DMA_ECC_INT_STATUS);                                                                                                                  </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DMA_ECC_INT_STATUS);                                                                                                                  </span>

<span class="DiffChange">       dw</span><span class="DiffText">xgmac3_log_error(ndev, value, correctable, </span><span class="Constant DiffText">"DMA"</span><span class="DiffText">, dwxgmac3</span><span class="DiffChange">_dma_errors,                                                                                           </span>
<span class="DiffChange">                       </span><span class="DiffText">   </span><span class="DiffChange">STAT_OFF(dma_errors), stats);                                                                                                                   </span>
}

<span class="Type DiffText">static</span><span class="DiffText"> </span><span class="Type DiffText">int</span><span class="DiffText"> dwxgmac3</span><span class="DiffChange">_safety_feat_irq_status(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> net_device *ndev,                                                                                                        </span>
<span class="DiffChange">                               </span><span class="DiffText">     </span><span class="DiffChange">  </span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr,                                                                                                           </span>
<span class="DiffChange">                               </span><span class="DiffText">     </span><span class="DiffChange">  </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">int</span><span class="DiffChange"> asp,                                                                                                               </span>
<span class="DiffChange">                               </span><span class="DiffText">     </span><span class="DiffChange">  </span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats)                                                                                              </span>
{
        <span class="Type">bool</span> err, corr;
        u32 mtl, dma;
        <span class="Type">int</span> ret = <span class="Constant">0</span>;

        <span class="Statement">if</span> (!asp)
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;

<span class="DiffChange">       mtl = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MTL_SAFETY_INT_STATUS);                                                                                                                 </span>
<span class="DiffChange">       dma = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DMA_SAFETY_INT_STATUS);                                                                                                                 </span>

<span class="DiffChange">       err = (mtl & </span><span class="DiffText">XGMAC_MCSIS) || (dma & XGMAC_</span><span class="DiffChange">MCSIS);                                                                                                                  </span>
        corr = <span class="Constant">false</span>;
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_mac_err(ndev, ioaddr, corr, stats);                                                                                                        </span>
                ret |= !corr;
        }

<span class="DiffChange">       err = (mtl & (</span><span class="DiffText">XGMAC_MEUIS | XGMAC_MECIS)) || (dma & (XGMAC_MSUIS | XGMAC_</span><span class="DiffChange">MSCIS));                                                                                  </span>
<span class="DiffChange">       corr = (mtl & </span><span class="DiffText">XGMAC_MECIS) || (dma & XGMAC_</span><span class="DiffChange">MSCIS);                                                                                                                 </span>
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_mtl_err(ndev, ioaddr, corr, stats);                                                                                                        </span>
                ret |= !corr;
        }

<span class="DiffChange">       err = dma & (</span><span class="DiffText">XGMAC_DEUIS | XGMAC_</span><span class="DiffChange">DECIS);                                                                                                                           </span>
<span class="DiffChange">       corr = dma & </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DECIS;                                                                                                                                          </span>
        <span class="Statement">if</span> (err) {
<span class="DiffChange">               dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_handle_dma_err(ndev, ioaddr, corr, stats);                                                                                                        </span>
                ret |= !corr;
        }

        <span class="Statement">return</span> ret;
}

<span class="Type DiffChange">static</span><span class="DiffChange"> </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_error {                                                                                                                                       </span>
<span class="DiffChange">       </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">struct</span><span class="DiffChange"> dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_error_desc *desc;                                                                                                                            </span>
<span class="DiffChange">} dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_all_errors[] = {                                                                                                                                                </span>
<span class="DiffChange">       { dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_mac_errors },                                                                                                                                           </span>
<span class="DiffChange">       { dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_mtl_errors },                                                                                                                                           </span>
<span class="DiffChange">       { dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_dma_errors },                                                                                                                                           </span>
};

<span class="Type DiffText">static</span><span class="DiffText"> </span><span class="Type DiffText">int</span><span class="DiffText"> dwxgmac3</span><span class="DiffChange">_safety_feat_dump(</span><span class="Type DiffChange">struct</span><span class="DiffChange"> stmmac_safety_stats *stats,                                                                                                    </span>
<span class="DiffChange">                       </span><span class="DiffText">     </span><span class="DiffChange">    </span><span class="Type DiffChange">int</span><span class="DiffChange"> index, </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">long</span><span class="DiffChange"> *count,                                                                                                      </span>
<span class="DiffChange">                       </span><span class="DiffText">     </span><span class="DiffChange">    </span><span class="Type DiffChange">const</span><span class="DiffChange"> </span><span class="Type DiffChange">char</span><span class="DiffChange"> **desc)                                                                                                                    </span>
{
        <span class="Type">int</span> module = index / <span class="Constant">32</span>, offset = index % <span class="Constant">32</span>;
        <span class="Type">unsigned</span> <span class="Type">long</span> *ptr = (<span class="Type">unsigned</span> <span class="Type">long</span> *)stats;

<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (module >= ARRAY_SIZE(dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_all_errors))                                                                                                                     </span>
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;
<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (!dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_all_errors[module].desc[offset].valid)                                                                                                               </span>
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;
        <span class="Statement">if</span> (count)
                *count = *(ptr + index);
        <span class="Statement">if</span> (desc)
<span class="DiffChange">               *desc = dw</span><span class="DiffText">xgmac3</span><span class="DiffChange">_all_errors[module].desc[offset].desc;                                                                                                     </span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
}

<span class="Type DiffText">static</span><span class="DiffText"> </span><span class="Type DiffText">int</span><span class="DiffText"> dwxgmac3</span><span class="DiffChange">_safety_feat_config(</span><span class="Type DiffChange">void</span><span class="DiffChange"> __iomem *ioaddr, </span><span class="Type DiffChange">unsigned</span><span class="DiffChange"> </span><span class="Type DiffChange">int</span><span class="DiffChange"> asp,                                                                                             </span>
<span class="DiffChange">                       </span><span class="DiffText">           </span><span class="Type DiffText">struct</span><span class="DiffText"> stmmac_safety_feature_cfg *safety</span><span class="DiffChange">_cfg)                                                                                       </span>
{
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        u32 value;

        <span class="Statement">if</span> (!asp)
                <span class="Statement">return</span> -<span class="Constant">EINVAL</span>;

<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        <span class="Comment">/*</span><span class="Comment"> 1. Enable Safety Features </span><span class="Comment">*/</span>
<span class="DiffChange">       </span><span class="DiffText">writel(</span><span class="Constant DiffText">0x0</span><span class="DiffText">, ioaddr + XGMAC_</span><span class="DiffChange">MTL_ECC_CONTROL);                                                                                                                       </span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>

        <span class="Comment">/*</span><span class="Comment"> 2. Enable MTL Safety Interrupts </span><span class="Comment">*/</span>
<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MTL_ECC_INT_ENABLE);                                                                                                                  </span>
<span class="DiffChange">       value |= </span><span class="DiffText">XGMAC_</span><span class="DiffChange">RPCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> RX Parser Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                    </span>
<span class="DiffChange">       value |= </span><span class="DiffText">XGMAC_</span><span class="DiffChange">ECEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> EST Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                           </span>
<span class="DiffChange">       value |= </span><span class="DiffText">XGMAC_</span><span class="DiffChange">RXCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> RX Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                           </span>
<span class="DiffChange">       value |= </span><span class="DiffText">XGMAC_</span><span class="DiffChange">TXCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> TX Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                           </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MTL_ECC_INT_ENABLE);                                                                                                                  </span>

        <span class="Comment">/*</span><span class="Comment"> 3. Enable DMA Safety Interrupts </span><span class="Comment">*/</span>
<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DMA_ECC_INT_ENABLE);                                                                                                                  </span>
<span class="DiffAdd">  value |= XGMAC_DCEIE; </span><span class="Comment DiffAdd">/*</span><span class="Comment DiffAdd"> Descriptor Cache Memory Correctable Error </span><span class="Comment DiffAdd">*/</span><span class="DiffAdd">                                                                                              </span>

<span class="DiffChange">       value |= </span><span class="DiffText">XGMAC_</span><span class="DiffChange">TCEIE; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> TSO Memory Correctable Error </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                           </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">DMA_ECC_INT_ENABLE);                                                                                                                  </span>


<span class="DiffChange">       </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> </span><span class="Comment DiffText">0x2: Without ECC or Parity Ports on External Application Interface</span><span class="DiffChange">                                                                                              </span>
<span class="Comment DiffChange">        *</span><span class="Comment DiffText"> 0x4: Only ECC Protection for External Memory feature is selected</span><span class="DiffChange">                                                                                                </span>
<span class="Comment">   </span><span class="Comment">*/</span>
<span class="DiffChange">       </span><span class="Statement DiffChange">if</span><span class="DiffChange"> (asp </span><span class="DiffText">== </span><span class="Constant DiffText">0x2</span><span class="DiffText"> || asp == </span><span class="Constant DiffText">0x4</span><span class="DiffChange">)                                                                                                                                      </span>
                <span class="Statement">return</span> <span class="Constant">0</span>;

<span class="DiffChange">       </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> </span><span class="Comment DiffText">4</span><span class="Comment DiffChange">. Enable Parity and Timeout for FSM </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                         </span>
<span class="DiffChange">       value = readl(ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MAC_FSM_CONTROL);                                                                                                                     </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange">       </span><span class="DiffText">value |= XGMAC_</span><span class="DiffChange">PRTYEN; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> FSM Parity Feature </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                    </span>
<span class="DiffChange"> </span><span class="DiffChange">                                                                                                                                                                          </span>
<span class="DiffChange">       </span><span class="DiffText">value |= XGMAC_</span><span class="DiffChange">TMOUTEN; </span><span class="Comment DiffChange">/*</span><span class="Comment DiffChange"> FSM Timeout Feature </span><span class="Comment DiffChange">*/</span><span class="DiffChange">                                                                                                                  </span>
<span class="DiffChange">       writel(value, ioaddr + </span><span class="DiffText">XGMAC_</span><span class="DiffChange">MAC_FSM_CONTROL);                                                                                                                     </span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>

<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
<span class="DiffDelete">---------------------------------------------------------------------------------------------------------------------------------------------------------------------------</span>
        <span class="Statement">return</span> <span class="Constant">0</span>;
}
</pre>
</div></td>
</tr>
</table>
</body>
</html>
<!-- vim: set foldmethod=manual : -->