<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: MQX FFS Error handling in case of NANDFLASHERR_ERASE_FAILED in MQX Software Solutions</title>
    <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-FFS-Error-handling-in-case-of-NANDFLASHERR-ERASE-FAILED/m-p/556958#M16503</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Stefan:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think this is an issue in FFS, block erase command returned value should be checked against ERROR_DDI_NAND_ERASE_FAILED. I will report this issue to developers.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you very much for your input.&lt;/P&gt;&lt;P&gt;Have a nice weekend.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Daniel&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 26 Aug 2016 09:09:44 GMT</pubDate>
    <dc:creator>danielchen</dc:creator>
    <dc:date>2016-08-26T09:09:44Z</dc:date>
    <item>
      <title>MQX FFS Error handling in case of NANDFLASHERR_ERASE_FAILED</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-FFS-Error-handling-in-case-of-NANDFLASHERR-ERASE-FAILED/m-p/556957#M16502</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;While investigating about the error handling capabilities of the FFS wear level layer in MQX 4.2.0.2 I stumble about an issue.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The theoretical case is as follows:&lt;/P&gt;&lt;P&gt;If the FFS wants to erase a block it will turn to the BSP NFC driver implementation in mqx/io/nandflash/nfc/nfc.c : nfc_erase_block() function. In case the NAND chip failed to execute successfully the Erase Block command, this function returns NANDFLASHERR_ERASE_FAILED.&lt;/P&gt;&lt;P&gt;I noticed that the FFS is transforming NANDFLASHERR_* codes to its own error codes in ffs/source/wearleveling/rtos/mqx/errcode.cpp : os_err_code_to_wl().&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For NANDFLASHERR_ERASE_FAILED the conversion is done to ERROR_DDI_NAND_ERASE_FAILED.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wonder why can't find any usage of this particular error code - using grep on FFS sources.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Even not on place where I would expected it!&lt;/P&gt;&lt;P&gt;E.g. in&amp;nbsp;Mapper::getBlock() (file:&amp;nbsp;ffs/source/wearleveling/ddi/mapper/mapper.cpp) :&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* As well as setting the bit, erase physical block. */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Block &lt;SPAN class="token function"&gt;block&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;*&lt;/SPAN&gt;pu32PhysBlkAddr&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;!&lt;/SPAN&gt;block&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;isErased&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** If the erase fails, then loop again and try again with another block. We have
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** already marked the bad block as used in the phy map, so we just need to mark the
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ** block itself as bad. 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rtCode &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; block&lt;SPAN class="punctuation token"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token function"&gt;erase&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="keyword token"&gt;if&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;rtCode &lt;SPAN class="operator token"&gt;==&lt;/SPAN&gt; ERROR_DDI_NAND_HAL_WRITE_FAILED&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="comment token"&gt;/* This will mark the block used in the phymap again, but not a big deal. */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="token function"&gt;handleNewBadBlock&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;block&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;/* Endif */&lt;/SPAN&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt; &lt;SPAN class="comment token"&gt;/* Endif */&lt;/SPAN&gt;&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;In the above snippet at line 10 the result of the block erase command is returned and instead of checking against ERROR_DDI_NAND_ERASE_FAILED, the check is made with&amp;nbsp;ERROR_DDI_NAND_HAL_WRITE_FAILED and will result in marking the block as bad.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I failed to find any path of execution that block.erase() returns ERROR_DDI_NAND_HAL_WRITE_FAILED.&lt;/P&gt;&lt;P&gt;So, I'm fearing about a block gets never marked as bad block by FFS.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best Regards,&lt;/P&gt;&lt;P&gt;Stefan&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 24 Aug 2016 13:11:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-FFS-Error-handling-in-case-of-NANDFLASHERR-ERASE-FAILED/m-p/556957#M16502</guid>
      <dc:creator>stefanhaase</dc:creator>
      <dc:date>2016-08-24T13:11:44Z</dc:date>
    </item>
    <item>
      <title>Re: MQX FFS Error handling in case of NANDFLASHERR_ERASE_FAILED</title>
      <link>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-FFS-Error-handling-in-case-of-NANDFLASHERR-ERASE-FAILED/m-p/556958#M16503</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Stefan:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I think this is an issue in FFS, block erase command returned value should be checked against ERROR_DDI_NAND_ERASE_FAILED. I will report this issue to developers.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you very much for your input.&lt;/P&gt;&lt;P&gt;Have a nice weekend.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;Daniel&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 26 Aug 2016 09:09:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/MQX-Software-Solutions/MQX-FFS-Error-handling-in-case-of-NANDFLASHERR-ERASE-FAILED/m-p/556958#M16503</guid>
      <dc:creator>danielchen</dc:creator>
      <dc:date>2016-08-26T09:09:44Z</dc:date>
    </item>
  </channel>
</rss>

