NXFFS: When dumping the MTD content, don't abort on a read error. For NAND, the read error probably just means that an uncorrectable ECC was encountered

This commit is contained in:
Gregory Nutt
2013-12-01 20:17:09 -06:00
parent 5c1f0946c2
commit 5b9d07e5c0
4 changed files with 38 additions and 17 deletions
+3
View File
@@ -6146,4 +6146,7 @@
* drivers/mtd/mtd_nand* and arch/arm/src/sama5/sam_nand.c: NAND
accesses now work (at least with software ECC and now DMA). Still
lots of testing to be done (2013-11-30).
* fs/nxffs/nxffs_dump.c: Do not abort on a read error. Just not
the error and continue. Otherwise, we would not be able to dump
NAND FLASH (2013-11-30).
+10 -2
View File
@@ -2529,6 +2529,10 @@ Configurations
Since you will not be able to re-enable the watchdog later, you may
need to set CONFIG_SAMA5_WDT=y in the NuttX configuration file.
4. If you put norboot on the Serial FLASH, you can automatically
boot to NOR on reset. See the section "Creating and Using NORBOOT"
above.
STATUS:
See the To-Do list below
@@ -2852,7 +2856,8 @@ To-Do List
initializing .bss and .data.
4) Neither USB OHCI nor EHCI support Isochronous endpoints. Interrupt
endpoint support in the EHCI driver is untested.
endpoint support in the EHCI driver is untested (but works in similar
EHCI drivers).
5) HSCMI TX DMA support is currently commented out.
@@ -2874,8 +2879,11 @@ To-Do List
layers and other features of the LCDC.
10) I have a Camera, but there is still no ISI driver. I am not sure what to
do with the camera. NuttX needs something liek V4L to provide the
do with the camera. NuttX needs something like V4L to provide the
definition for what a camera driver is supposed to do.
I will probably develop a test harness for ISI, but it is of only
minimal value with no OS infrastructure to deal with images and video.
11) GMAC has only been tested on a 10/100Base-T network. I don't have a
1000Base-T network to support additional testing.
+24 -14
View File
@@ -1,7 +1,7 @@
/****************************************************************************
* fs/nxffs/nxffs_dump.c
*
* Copyright (C) 2011 Gregory Nutt. All rights reserved.
* Copyright (C) 2011, 2013 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* References: Linux/Documentation/filesystems/romfs.txt
@@ -138,7 +138,7 @@ static inline ssize_t nxffs_analyzeinode(FAR struct nxffs_blkinfo_s *blkinfo,
return ERROR;
}
/* Can we verify the inode? We need to have the inode name in the same
* block to do that (or get access to the next block)
@@ -169,7 +169,7 @@ static inline ssize_t nxffs_analyzeinode(FAR struct nxffs_blkinfo_s *blkinfo,
nextblock = blkinfo->offset + blkinfo->geo.blocksize;
if (noffs > nextblock)
{
/* Not than we cannot verify the inode header */
/* Note than we cannot verify the inode header */
if (blkinfo->verbose)
{
@@ -281,6 +281,7 @@ static inline ssize_t nxffs_analyzedata(FAR struct nxffs_blkinfo_s *blkinfo,
{
fdbg(g_format, blkinfo->block, offset, "DATA ", "OK ", datlen);
}
return SIZEOF_NXFFS_DATA_HDR + datlen;
}
#endif
@@ -322,6 +323,7 @@ static inline void nxffs_analyze(FAR struct nxffs_blkinfo_s *blkinfo)
fdbg(g_format, blkinfo->block, 0, "BLOCK", "ERASED ",
blkinfo->geo.blocksize);
}
return;
}
#if 0 /* Too much output, to little information */
@@ -365,6 +367,7 @@ static inline void nxffs_analyze(FAR struct nxffs_blkinfo_s *blkinfo)
{
i = hdrndx + nbytes - 1;
}
inndx = 0;
}
}
@@ -381,6 +384,7 @@ static inline void nxffs_analyze(FAR struct nxffs_blkinfo_s *blkinfo)
{
i = hdrndx + nbytes - 1;
}
datndx = 0;
}
}
@@ -427,7 +431,7 @@ int nxffs_dump(FAR struct mtd_dev_s *mtd, bool verbose)
if (ret < 0)
{
fdbg("ERROR: MTD ioctl(MTDIOC_GEOMETRY) failed: %d\n", -ret);
goto errout;
return ret;
}
/* Save the verbose output indication */
@@ -440,8 +444,7 @@ int nxffs_dump(FAR struct mtd_dev_s *mtd, bool verbose)
if (!blkinfo.buffer)
{
fdbg("ERROR: Failed to allocate block cache\n");
ret = -ENOMEM;
goto errout;
return -ENOMEM;
}
/* Now read every block on the device */
@@ -459,20 +462,27 @@ int nxffs_dump(FAR struct mtd_dev_s *mtd, bool verbose)
ret = MTD_BREAD(mtd, blkinfo.block, 1, blkinfo.buffer);
if (ret < 0)
{
fdbg("ERROR: Failed to read block %d\n", blkinfo.block);
goto errout_with_block;
/* A read error is probably fatal on all media but NAND.
* On NAND, the read error probably just signifies a block
* with an uncorrectable ECC failure. So, to handle NAND,
* just report the read error and continue.
*/
fdbg(g_format, blkinfo.block, 0, "BLOCK", "RD FAIL",
blkinfo.geo.blocksize);
}
else
{
/* Analyze the block that we just read */
/* Analyze the block */
nxffs_analyze(&blkinfo);
nxffs_analyze(&blkinfo);
}
}
fdbg("%d blocks analyzed\n", blkinfo.nblocks);
errout_with_block:
kfree(blkinfo.buffer);
errout:
return ret;
return OK;
#else
return -ENOSYS;
+1 -1
View File
@@ -415,7 +415,7 @@ int nxffs_limits(FAR struct nxffs_volume_s *volume)
return OK;
}
// No? Then it is some other failure that we do not know how to handle
/* No? Then it is some other failure that we do not know how to handle */
fdbg("ERROR: nxffs_getc failed: %d\n", -ch);
return ch;