[packages] mtd-utils: add a bad block counter to mtd_debug, based on patch from http://dev.laptop.org/~martin/mtd_debug.patch
git-svn-id: svn://svn.openwrt.org/openwrt/packages@28520 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
7d726fc07d
commit
1287858c11
@ -0,0 +1,73 @@
|
||||
--- a/mtd_debug.c
|
||||
+++ b/mtd_debug.c
|
||||
@@ -236,6 +236,7 @@ int showinfo (int fd)
|
||||
int i,err,n;
|
||||
struct mtd_info_user mtd;
|
||||
static struct region_info_user region[1024];
|
||||
+ int iNumOfBadBlocks = 0;
|
||||
|
||||
err = getmeminfo (fd,&mtd);
|
||||
if (err < 0)
|
||||
@@ -328,6 +329,11 @@ int showinfo (int fd)
|
||||
printf ("\nmtd.oobsize = ");
|
||||
printsize (mtd.oobsize);
|
||||
|
||||
+ printf ("\nmtd.badblockscount = ");
|
||||
+ iNumOfBadBlocks = get_bb_number(fd, &mtd);
|
||||
+ if (iNumOfBadBlocks > -1)
|
||||
+ printf ("%d", iNumOfBadBlocks);
|
||||
+
|
||||
printf ("\n"
|
||||
"regions = %d\n"
|
||||
"\n",
|
||||
@@ -347,6 +353,50 @@ int showinfo (int fd)
|
||||
return (0);
|
||||
}
|
||||
|
||||
+int get_bb_number(int fd, struct mtd_info_user *meminfo)
|
||||
+{
|
||||
+ int isNAND = (meminfo->type == MTD_NANDFLASH);
|
||||
+ int ibbCounter = 0;
|
||||
+ /* Last 4 blocks of any MTD device are protected and
|
||||
+ MTD reports them as badblocks. */
|
||||
+ int usablesize = meminfo->size - (4 * meminfo->erasesize);
|
||||
+ erase_info_t erase;
|
||||
+ erase.length = meminfo->erasesize;
|
||||
+
|
||||
+ for (erase.start = 0;
|
||||
+ erase.start < usablesize;
|
||||
+ erase.start += meminfo->erasesize)
|
||||
+ {
|
||||
+ loff_t offset = erase.start;
|
||||
+ int ret = ioctl(fd, MEMGETBADBLOCK, &offset);
|
||||
+
|
||||
+ if (ret > 0)
|
||||
+ {
|
||||
+ ibbCounter++;
|
||||
+ continue;
|
||||
+ }
|
||||
+ else if (ret < 0)
|
||||
+ {
|
||||
+ if (errno == EOPNOTSUPP)
|
||||
+ {
|
||||
+ if (isNAND)
|
||||
+ {
|
||||
+ printf("Bad block check not available");
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ printf("MTD get bad block failed: %s",
|
||||
+ strerror(errno));
|
||||
+ return -1;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return ibbCounter;
|
||||
+}
|
||||
+
|
||||
void showusage (const char *progname)
|
||||
{
|
||||
fprintf (stderr,
|
Loading…
x
Reference in New Issue
Block a user