mtd/drivers/mtd/nand nand_bbt.c,1.31,1.32

gleixner at infradead.org gleixner at infradead.org
Tue Jun 14 11:39:57 EDT 2005


Update of /home/cvs/mtd/drivers/mtd/nand
In directory phoenix.infradead.org:/tmp/cvs-serv21983

Modified Files:
	nand_bbt.c 
Log Message:
Make the bad block table search functional again

Index: nand_bbt.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/nand/nand_bbt.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- nand_bbt.c	16 Feb 2005 17:09:36 -0000	1.31
+++ nand_bbt.c	14 Jun 2005 15:39:53 -0000	1.32
@@ -80,14 +80,14 @@
 	int i, end = 0;
 	uint8_t *p = buf;
 
+	end = paglen + td->offs;
 	if (td->options & NAND_BBT_SCANEMPTY) {
-		end = paglen + td->offs;
 		for (i = 0; i < end; i++) {
 			if (p[i] != 0xff)
 				return -1;
 		}
-		p += end;
 	}	
+	p += end;
 	
 	/* Compare the pattern */
 	for (i = 0; i < td->len; i++) {
@@ -106,6 +106,32 @@
 	return 0;
 }
 
+/** 
+ * check_short_pattern - [GENERIC] check if a pattern is in the buffer
+ * @buf:	the buffer to search
+ * @len:	the length of buffer to search
+ * @paglen:	the pagelength
+ * @td:		search pattern descriptor
+ *
+ * Check for a pattern at the given place. Used to search bad block
+ * tables and good / bad block identifiers. Same as check_pattern, but 
+ * no optional empty check and the pattern is expected to start
+ * at offset 0.
+ *
+*/
+static int check_short_pattern (uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td)
+{
+	int i;
+	uint8_t *p = buf;
+
+	/* Compare the pattern */
+	for (i = 0; i < td->len; i++) {
+		if (p[i] != td->pattern[i])
+			return -1;
+	}
+	return 0;
+}
+
 /**
  * read_bbt - [GENERIC] Read the bad block table starting from page
  * @mtd:	MTD device structure
@@ -316,18 +342,24 @@
 							readlen, &retlen, &buf[0]);
 				if (ret)
 					return ret;
-			}
-			if (check_pattern (&buf[j * scanlen], scanlen, mtd->oobblock, bd)) {
-				this->bbt[i >> 3] |= 0x03 << (i & 0x6);
-				printk (KERN_WARNING "Bad eraseblock %d at 0x%08x\n", 
-					i >> 1, (unsigned int) from);
-				break;
+
+				if (check_short_pattern (&buf[j * scanlen], scanlen, mtd->oobblock, bd)) {
+					this->bbt[i >> 3] |= 0x03 << (i & 0x6);
+					printk (KERN_WARNING "Bad eraseblock %d at 0x%08x\n", 
+						i >> 1, (unsigned int) from);
+					break;
+			} else {
+				if (check_pattern (&buf[j * scanlen], scanlen, mtd->oobblock, bd)) {
+					this->bbt[i >> 3] |= 0x03 << (i & 0x6);
+					printk (KERN_WARNING "Bad eraseblock %d at 0x%08x\n", 
+						i >> 1, (unsigned int) from);
+					break;
+				}
 			}
 		}
 		i += 2;
 		from += (1 << this->bbt_erase_shift);
 	}
-
 	return 0;
 }
 





More information about the linux-mtd-cvs mailing list