--- /dev/null
+--- 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,