mtd-utils: add a bad block counter to mtd_debug, based on patch from http://dev.lapto...
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 22 Oct 2011 14:16:45 +0000 (14:16 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 22 Oct 2011 14:16:45 +0000 (14:16 +0000)
SVN-Revision: 28520

utils/mtd-utils/patches/100-mtd-debug-add-bad-block-counter.patch [new file with mode: 0644]

diff --git a/utils/mtd-utils/patches/100-mtd-debug-add-bad-block-counter.patch b/utils/mtd-utils/patches/100-mtd-debug-add-bad-block-counter.patch
new file mode 100644 (file)
index 0000000..191a7d0
--- /dev/null
@@ -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,