All of lore.kernel.org
 help / color / mirror / Atom feed
From: <bogus@does.not.exist.com>
To: u-boot@lists.denx.de
Subject: No subject
Date: Fri, 23 Jan 2009 10:48:37 -0000	[thread overview]
Message-ID: <mailman.80.1260286457.8188.u-boot@lists.denx.de> (raw)

Added a new config option CONFIG_NAND_READ_CMD_NO_WAIT. Not defined on any
platform (except my local da830evm), this enables the main point of the
patch - processing, usually ECC and looping constructs, while waiting for
the NAND to load its cache.

Without the new config option, the code should behave as before and the
patch simply layers the code a little better. However, it still allows
page_reads to control there own command sequences, saving time most notably
in the oob_first page read. The nand_wait_cache_load function optimises
away to nothing.

[This option should allow boards that define there own cmdfunc, rather than
defining a new page_read function, to continue as is for now. The cost is
that the pre-fetch read optimisations are not automatically made available]

With the new option, read commands can be sent to the NAND, but processing
can continue until the data is actually required. It can easily take longer
to process ECCs than the NAND takes to load its cache, so the cache load
time overhead disappears into a parallel operation.

nand_wait_cache_load never falls back to a udelay. Significant time should
have passed and a fixed delay is not acceptable. Either the ready/busy pin
is probed, or the NAND status register is directly read (as in write and
erase operations currently).

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 7171bdd..78725d1 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -90,6 +90,26 @@
 #define CONFIG_SYS_NAND_RESET_CNT 200000
 #endif
 
+/* NAND Read States */
+#define NAND_RSTATE_INIT	0
+#define NAND_RSTATE_LAST	(1 << 31) /* Don't pre-request next page */
+
+#define nand_rstate_is_init(x)	((x & ~NAND_RSTATE_LAST) == NAND_RSTATE_INIT)
+#define nand_rstate_is_last(x)	(x & NAND_RSTATE_LAST)
+
+/* Is the device a Large Page device? */
+#ifdef CONFIG_NAND_NO_SMALL_PAGE
+#define nand_is_lp_device(mtd)	1
+#else
+#define nand_is_lp_device(mtd)	(mtd->writesize > 512)
+#endif
+
+#ifdef CONFIG_NAND_READ_CMD_NO_WAIT
+#define read_waits	0
+#else
+#define read_waits	1
+#endif
+
 /* Define default oob placement schemes for large and small page devices */
 static struct nand_ecclayout nand_oob_8 = {
 	.eccbytes = 3,
@@ -143,6 +163,8 @@ static int nand_do_write_oob(struct mtd_info *mtd, loff_t to,
 
 static int nand_wait(struct mtd_info *mtd, struct nand_chip *this);
 
+static int nand_wait_cache_load(struct mtd_info *mtd, struct nand_chip *this);
+
 /*
  * For devices which display every fart in the system on a separate LED. Is
  * compiled away when LED support is disabled.
@@ -385,6 +407,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
 	if (chip->options & NAND_BUSWIDTH_16) {
 		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE,
 			      page);
+		nand_wait_cache_load(mtd, chip);
 		bad = cpu_to_le16(chip->read_word(mtd));
 		if (chip->badblockpos & 0x1)
 			bad >>= 8;
@@ -392,6 +415,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
 			res = 1;
 	} else {
 		chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos, page);
+		nand_wait_cache_load(mtd, chip);
 		if (chip->read_byte(mtd) != 0xff)
 			res = 1;
 	}
@@ -534,8 +558,9 @@ void nand_wait_ready(struct mtd_info *mtd)
  * Send command to NAND device. This function is used for small page
  * devices (256/512 Bytes per page)
  */
-static void nand_command(struct mtd_info *mtd, unsigned int command,
-			 int column, int page_addr)
+static void __attribute__((unused)) nand_command(struct mtd_info *mtd,
+						 unsigned int command,
+						 int column, int page_addr)
 {
 	register struct nand_chip *chip = mtd->priv;
 	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
@@ -644,6 +669,8 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
 {
 	register struct nand_chip *chip = mtd->priv;
 	uint32_t rst_sts_cnt = CONFIG_SYS_NAND_RESET_CNT;
+	void (*cmd_ctrl)(struct mtd_info *mtd, int cmd, unsigned int ctrl);
+	cmd_ctrl = chip->cmd_ctrl;
 
 	/* Emulate NAND_CMD_READOOB */
 	if (command == NAND_CMD_READOOB) {
@@ -663,21 +690,21 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
 			/* Adjust columns for 16 bit buswidth */
 			if (chip->options & NAND_BUSWIDTH_16)
 				column >>= 1;
-			chip->cmd_ctrl(mtd, column, ctrl);
+			cmd_ctrl(mtd, column, ctrl);
 			ctrl &= ~NAND_CTRL_CHANGE;
-			chip->cmd_ctrl(mtd, column >> 8, ctrl);
+			cmd_ctrl(mtd, column >> 8, ctrl);
 		}
 		if (page_addr != -1) {
-			chip->cmd_ctrl(mtd, page_addr, ctrl);
-			chip->cmd_ctrl(mtd, page_addr >> 8,
+			cmd_ctrl(mtd, page_addr, ctrl);
+			cmd_ctrl(mtd, page_addr >> 8,
 				       NAND_NCE | NAND_ALE);
 			/* One more address cycle for devices > 128MiB */
 			if (chip->chipsize > (128 << 20))
-				chip->cmd_ctrl(mtd, page_addr >> 16,
-					       NAND_NCE | NAND_ALE);
+				cmd_ctrl(mtd, page_addr >> 16,
+					 NAND_NCE | NAND_ALE);
 		}
 	}
-	chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
+	cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE | NAND_CTRL_CHANGE);
 
 	/*
 	 * program and erase have their own busy handlers
@@ -710,29 +737,31 @@ static void nand_command_lp(struct mtd_info *mtd, unsigned int command,
 		if (chip->dev_ready)
 			break;
 		udelay(chip->chip_delay);
-		chip->cmd_ctrl(mtd, NAND_CMD_STATUS,
-			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
-		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
-			       NAND_NCE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_STATUS,
+			 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_NONE,
+			 NAND_NCE | NAND_CTRL_CHANGE);
 		while (!(chip->read_byte(mtd) & NAND_STATUS_READY) &&
 			(rst_sts_cnt--));
 		return;
 
 	case NAND_CMD_RNDOUT:
 		/* No ready / busy check necessary */
-		chip->cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART,
-			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
-		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
-			       NAND_NCE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_RNDOUTSTART,
+			 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_NONE,
+			 NAND_NCE | NAND_CTRL_CHANGE);
 		return;
 
 	case NAND_CMD_READ0:
-		chip->cmd_ctrl(mtd, NAND_CMD_READSTART,
-			       NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
-		chip->cmd_ctrl(mtd, NAND_CMD_NONE,
-			       NAND_NCE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_READSTART,
+			 NAND_NCE | NAND_CLE | NAND_CTRL_CHANGE);
+		cmd_ctrl(mtd, NAND_CMD_NONE,
+			 NAND_NCE | NAND_CTRL_CHANGE);
+		if (!read_waits)
+			return;
 
-		/* This applies to read commands */
+		/* read falls through if reading should wait */
 	default:
 		/*
 		 * If we don't have access to the busy pin, we apply the given
@@ -866,11 +895,6 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *this)
 	reset_timer();
 
 	while (1) {
-		if (get_timer(0) > timeo) {
-			printf("Timeout!");
-			return 0x01;
-		}
-
 		if (this->dev_ready) {
 			if (this->dev_ready(mtd))
 				break;
@@ -878,7 +902,13 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *this)
 			if (this->read_byte(mtd) & NAND_STATUS_READY)
 				break;
 		}
+
+		if (get_timer(0) > timeo) {
+			printf("Timeout!");
+			return 0x01;
+		}
 	}
+
 #ifdef PPCHAMELON_NAND_TIMER_HACK
 	reset_timer();
 	while (get_timer(0) < 10);
@@ -889,19 +919,53 @@ static int nand_wait(struct mtd_info *mtd, struct nand_chip *this)
 #endif
 
 /**
+ * Wait for cache ready after read request.
+ *
+ * Returns to read state before returning.
+ *
+ * @mtd:	mtd info structure
+ * @chip:	nand chip info structure
+ */
+static int nand_wait_cache_load(struct mtd_info *mtd, struct nand_chip *chip)
+{
+	if (nand_is_lp_device(mtd) && !read_waits) {
+		int state = nand_wait(mtd, chip);
+		chip->cmd_ctrl(mtd, NAND_CMD_READSTART, NAND_CTRL_CLE |
+							NAND_CTRL_CHANGE);
+		chip->cmd_ctrl(mtd, NAND_CMD_NONE, NAND_NCE |
+						   NAND_CTRL_CHANGE);
+		return state;
+	} else
+		return 0;
+}
+
+/**
  * nand_read_page_raw - [Intern] read raw page data without ecc
  * @mtd:	mtd info structure
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
- *
- * Not for syndrome calculating ecc controllers, which use a special oob layout
+ * @rstate:	read state
  */
 static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
-			      uint8_t *buf, int page)
+			      uint8_t *buf, int page, uint32_t *rstate)
 {
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+		(*rstate)++;
+	}
+
+	nand_wait_cache_load(mtd, chip);
+
 	chip->read_buf(mtd, buf, mtd->writesize);
 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
+
+	if (!nand_rstate_is_last(*rstate)) {
+		if (!NAND_CANAUTOINCR(chip) ||
+		    ((page + 1) & NAND_BLOCK_MASK(chip)) == 0)
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page + 1);
+	}
+
 	return 0;
 }
 
@@ -911,17 +975,25 @@ static int nand_read_page_raw(struct mtd_info *mtd, struct nand_chip *chip,
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
+ * @rstate:	read state
  *
  * We need a special oob layout and handling even when OOB isn't used.
  */
 static int nand_read_page_raw_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
-			      uint8_t *buf, int page)
+				       uint8_t *buf, int page, uint32_t *rstate)
 {
 	int eccsize = chip->ecc.size;
 	int eccbytes = chip->ecc.bytes;
 	uint8_t *oob = chip->oob_poi;
 	int steps, size;
 
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+		(*rstate)++;
+	}
+
+	nand_wait_cache_load(mtd, chip);
+
 	for (steps = chip->ecc.steps; steps > 0; steps--) {
 		chip->read_buf(mtd, buf, eccsize);
 		buf += eccsize;
@@ -944,6 +1016,12 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd, struct nand_chip *c
 	if (size)
 		chip->read_buf(mtd, oob, size);
 
+	if (!nand_rstate_is_last(*rstate)) {
+		if (!NAND_CANAUTOINCR(chip) ||
+			((page + 1) & NAND_BLOCK_MASK(chip)) == 0)
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page + 1);
+	}
+
 	return 0;
 }
 
@@ -953,9 +1031,10 @@ static int nand_read_page_raw_syndrome(struct mtd_info *mtd, struct nand_chip *c
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
+ * @rstate:	read state
  */
 static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
-				uint8_t *buf, int page)
+				uint8_t *buf, int page, uint32_t *rstate)
 {
 	int i, eccsize = chip->ecc.size;
 	int eccbytes = chip->ecc.bytes;
@@ -965,7 +1044,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
 	uint8_t *ecc_code = chip->buffers->ecccode;
 	uint32_t *eccpos = chip->ecc.layout->eccpos;
 
-	chip->ecc.read_page_raw(mtd, chip, buf, page);
+	chip->ecc.read_page_raw(mtd, chip, buf, page, rstate);
 
 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
@@ -995,8 +1074,12 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
  * @data_offs:	offset of requested data within the page
  * @readlen:	data length
  * @bufpoi:	buffer to store read data
+ * @page:	page to read
+ * @rstate:	page read state
  */
-static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint32_t data_offs, uint32_t readlen, uint8_t *bufpoi)
+static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip,
+			     uint32_t data_offs, uint32_t readlen,
+			     uint8_t *bufpoi, int page, uint32_t *rstate)
 {
 	int start_step, end_step, num_steps;
 	uint32_t *eccpos = chip->ecc.layout->eccpos;
@@ -1005,6 +1088,11 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint3
 	int datafrag_len, eccfrag_len, aligned_len, aligned_pos;
 	int busw = (chip->options & NAND_BUSWIDTH_16) ? 2 : 1;
 
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+		(*rstate)++;
+	}
+
 	/* Column address wihin the page aligned to ECC size (256bytes). */
 	start_step = data_offs / chip->ecc.size;
 	end_step = (data_offs + readlen - 1) / chip->ecc.size;
@@ -1015,6 +1103,9 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint3
 	eccfrag_len = num_steps * chip->ecc.bytes;
 
 	data_col_addr = start_step * chip->ecc.size;
+
+	nand_wait_cache_load(mtd, chip);
+
 	/* If we read not a page aligned data */
 	if (data_col_addr != 0)
 		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, data_col_addr, -1);
@@ -1053,6 +1144,12 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint3
 		chip->read_buf(mtd, &chip->oob_poi[aligned_pos], aligned_len);
 	}
 
+	if (!nand_rstate_is_last(*rstate)) {
+		if (!NAND_CANAUTOINCR(chip) ||
+		    ((page + 1) & NAND_BLOCK_MASK(chip)) == 0)
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page + 1);
+	}
+
 	for (i = 0; i < eccfrag_len; i++)
 		chip->buffers->ecccode[i] = chip->oob_poi[eccpos[i + start_step * chip->ecc.bytes]];
 
@@ -1075,11 +1172,12 @@ static int nand_read_subpage(struct mtd_info *mtd, struct nand_chip *chip, uint3
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
+ * @rstate:	page read state
  *
  * Not for syndrome calculating ecc controllers which need a special oob layout
  */
 static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
-				uint8_t *buf, int page)
+				uint8_t *buf, int page, uint32_t *rstate)
 {
 	int i, eccsize = chip->ecc.size;
 	int eccbytes = chip->ecc.bytes;
@@ -1089,6 +1187,13 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
 	uint8_t *ecc_code = chip->buffers->ecccode;
 	uint32_t *eccpos = chip->ecc.layout->eccpos;
 
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+		(*rstate)++;
+	}
+
+	nand_wait_cache_load(mtd, chip);
+
 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
 		chip->ecc.hwctl(mtd, NAND_ECC_READ);
 		chip->read_buf(mtd, p, eccsize);
@@ -1096,6 +1201,12 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
 	}
 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
 
+	if (!nand_rstate_is_last(*rstate)) {
+		if (!NAND_CANAUTOINCR(chip) ||
+		    ((page + 1) & NAND_BLOCK_MASK(chip)) == 0)
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page + 1);
+	}
+
 	for (i = 0; i < chip->ecc.total; i++)
 		ecc_code[i] = chip->oob_poi[eccpos[i]];
 
@@ -1120,6 +1231,7 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
+ * @rstate:	page read state
  *
  * Hardware ECC for large page chips, require OOB to be read first.
  * For this ECC mode, the write_page method is re-used from ECC_HW.
@@ -1129,23 +1241,39 @@ static int nand_read_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip,
  * overwriting the NAND manufacturer bad block markings.
  */
 static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
-	struct nand_chip *chip, uint8_t *buf, int page)
+					  struct nand_chip *chip, uint8_t *buf,
+					  int page, uint32_t *rstate)
 {
 	int i, eccsize = chip->ecc.size;
 	int eccbytes = chip->ecc.bytes;
 	int eccsteps = chip->ecc.steps;
 	uint8_t *p = buf;
 	uint8_t *ecc_code = chip->buffers->ecccode;
-	uint32_t *eccpos = chip->ecc.layout->eccpos;
 	uint8_t *ecc_calc = chip->buffers->ecccalc;
+	uint8_t * const oob_poi = chip->oob_poi;
+	uint8_t *ecc_p;
+	uint32_t eccpos;
 
-	/* Read the OOB area first */
-	chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
-	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
-	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
+		(*rstate)++;
+	}
 
-	for (i = 0; i < chip->ecc.total; i++)
-		ecc_code[i] = chip->oob_poi[eccpos[i]];
+	nand_wait_cache_load(mtd, chip);
+
+	chip->read_buf(mtd, oob_poi, mtd->oobsize);
+
+	/* Read from start of page  */
+	if (nand_is_lp_device(mtd))
+		chip->cmdfunc(mtd, NAND_CMD_RNDOUT, 0, -1);
+	else
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+
+	/* extract ECC codes while we wait */
+	ecc_p = ecc_code;
+	eccpos = chip->ecc.layout->eccpos[0];
+	for (i = chip->ecc.total; i > 0; i--)
+		*ecc_p++ = oob_poi[eccpos++];
 
 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
 		int stat;
@@ -1154,6 +1282,10 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
 		chip->read_buf(mtd, p, eccsize);
 		chip->ecc.calculate(mtd, p, &ecc_calc[i]);
 
+		/* kick off new read if next page required */
+		if (eccsteps == 1 && !nand_rstate_is_last(*rstate))
+			chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page + 1);
+
 		stat = chip->ecc.correct(mtd, p, &ecc_code[i], NULL);
 		if (stat < 0)
 			mtd->ecc_stats.failed++;
@@ -1169,12 +1301,13 @@ static int nand_read_page_hwecc_oob_first(struct mtd_info *mtd,
  * @chip:	nand chip info structure
  * @buf:	buffer to store read data
  * @page:	page number to read
+ * @rstate:	page read state
  *
  * The hw generator calculates the error syndrome automatically. Therefor
  * we need a special oob layout and handling.
  */
 static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
-				   uint8_t *buf, int page)
+				   uint8_t *buf, int page, uint32_t *rstate)
 {
 	int i, eccsize = chip->ecc.size;
 	int eccbytes = chip->ecc.bytes;
@@ -1182,6 +1315,13 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 	uint8_t *p = buf;
 	uint8_t *oob = chip->oob_poi;
 
+	if (nand_rstate_is_init(*rstate)) {
+		chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+		(*rstate)++;
+	}
+
+	nand_wait_cache_load(mtd, chip);
+
 	for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) {
 		int stat;
 
@@ -1215,6 +1355,12 @@ static int nand_read_page_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 	if (i)
 		chip->read_buf(mtd, oob, i);
 
+	if (!nand_rstate_is_last(*rstate)) {
+		if (!NAND_CANAUTOINCR(chip) ||
+		    ((page + 1) & NAND_BLOCK_MASK(chip)) == 0)
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page + 1);
+	}
+
 	return 0;
 }
 
@@ -1281,12 +1427,11 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 	int chipnr, page, realpage, col, bytes, aligned;
 	struct nand_chip *chip = mtd->priv;
 	struct mtd_ecc_stats stats;
-	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
-	int sndcmd = 1;
 	int ret = 0;
 	uint32_t readlen = ops->len;
 	uint32_t oobreadlen = ops->ooblen;
 	uint8_t *bufpoi, *oob, *buf;
+	uint32_t rstate = NAND_RSTATE_INIT;
 
 	stats = mtd->ecc_stats;
 
@@ -1309,20 +1454,22 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 		if (realpage != chip->pagebuf || oob) {
 			bufpoi = aligned ? buf : chip->buffers->databuf;
 
-			if (likely(sndcmd)) {
-				chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
-				sndcmd = 0;
-			}
+			/* Last read from this chip? */
+			if (((readlen - bytes) == 0) ||
+			    (((realpage + 1) & (chip->pagemask)) == 0))
+				rstate |= NAND_RSTATE_LAST;
 
 			/* Now read the page into the buffer */
 			if (unlikely(ops->mode == MTD_OOB_RAW))
 				ret = chip->ecc.read_page_raw(mtd, chip,
-						bufpoi, page);
+						bufpoi, page, &rstate);
 			else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
-				ret = chip->ecc.read_subpage(mtd, chip, col, bytes, bufpoi);
+				ret = chip->ecc.read_subpage(mtd, chip, col,
+							     bytes, bufpoi,
+							     page, &rstate);
 			else
 				ret = chip->ecc.read_page(mtd, chip, bufpoi,
-						page);
+							  page, &rstate);
 			if (ret < 0)
 				break;
 
@@ -1385,12 +1532,6 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 			chip->select_chip(mtd, -1);
 			chip->select_chip(mtd, chipnr);
 		}
-
-		/* Check, if the chip supports auto page increment
-		 * or if we have hit a block boundary.
-		 */
-		if (!NAND_CANAUTOINCR(chip) || !(page & blkcheck))
-			sndcmd = 1;
 	}
 
 	ops->retlen = ops->len - (size_t) readlen;
@@ -1455,6 +1596,7 @@ static int nand_read_oob_std(struct mtd_info *mtd, struct nand_chip *chip,
 {
 	if (sndcmd) {
 		chip->cmdfunc(mtd, NAND_CMD_READOOB, 0, page);
+		nand_wait_cache_load(mtd, chip);
 		sndcmd = 0;
 	}
 	chip->read_buf(mtd, chip->oob_poi, mtd->oobsize);
@@ -1480,13 +1622,16 @@ static int nand_read_oob_syndrome(struct mtd_info *mtd, struct nand_chip *chip,
 	int i, toread, sndrnd = 0, pos;
 
 	chip->cmdfunc(mtd, NAND_CMD_READ0, chip->ecc.size, page);
+	nand_wait_cache_load(mtd, chip);
 	for (i = 0; i < chip->ecc.steps; i++) {
 		if (sndrnd) {
 			pos = eccsize + i * (eccsize + chunk);
-			if (mtd->writesize > 512)
+			if (nand_is_lp_device(mtd))
 				chip->cmdfunc(mtd, NAND_CMD_RNDOUT, pos, -1);
-			else
+			else {
 				chip->cmdfunc(mtd, NAND_CMD_READ0, pos, page);
+				nand_wait_cache_load(mtd, chip);
+			}
 		} else
 			sndrnd = 1;
 		toread = min_t(int, length, chunk);
@@ -1552,7 +1697,7 @@ static int nand_write_oob_syndrome(struct mtd_info *mtd,
 	chip->cmdfunc(mtd, NAND_CMD_SEQIN, pos, page);
 	for (i = 0; i < steps; i++) {
 		if (sndcmd) {
-			if (mtd->writesize <= 512) {
+			if (!nand_is_lp_device(mtd)) {
 				uint32_t fill = 0xFFFFFFFF;
 
 				len = eccsize;
@@ -1921,6 +2066,7 @@ static int nand_write_page(struct mtd_info *mtd, struct nand_chip *chip,
 #ifdef CONFIG_MTD_NAND_VERIFY_WRITE
 	/* Send command to read back the data */
 	chip->cmdfunc(mtd, NAND_CMD_READ0, 0, page);
+	nand_wait_cache_load(mtd, chip);
 
 	if (chip->verify_buf(mtd, buf, mtd->writesize))
 		return -EIO;
@@ -2560,7 +2706,11 @@ static void nand_set_defaults(struct nand_chip *chip, int busw)
 
 	/* check, if a user supplied command function given */
 	if (chip->cmdfunc == NULL)
+#ifdef CONFIG_NAND_NO_SMALL_PAGE
+		chip->cmdfunc = nand_command_lp;
+#else
 		chip->cmdfunc = nand_command;
+#endif
 
 	/* check, if a user supplied wait function given */
 	if (chip->waitfunc == NULL)
@@ -2722,7 +2872,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 		chip->chip_shift = ffs((unsigned)(chip->chipsize >> 32)) + 31;
 
 	/* Set the bad block position */
-	chip->badblockpos = mtd->writesize > 512 ?
+	chip->badblockpos = nand_is_lp_device(mtd) ?
 		NAND_LARGE_BADBLOCK_POS : NAND_SMALL_BADBLOCK_POS;
 
 	/* Get chip options, preserve non chip based options */
@@ -2746,9 +2896,15 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
 	else
 		chip->erase_cmd = single_erase_cmd;
 
+#ifdef CONFIG_NAND_NO_SMALL_PAGE
+	if (mtd->writesize <= 512)
+		/* no support for small page devices */
+		return ERR_PTR(-ENODEV);
+#else
 	/* Do not replace user supplied command function ! */
-	if (mtd->writesize > 512 && chip->cmdfunc == nand_command)
+	if (nand_is_lp_device(mtd) && chip->cmdfunc == nand_command)
 		chip->cmdfunc = nand_command_lp;
+#endif
 
 	MTDDEBUG (MTD_DEBUG_LEVEL0, "NAND device: Manufacturer ID:"
 	          " 0x%02x, Chip ID: 0x%02x (%s %s)\n", *maf_id, dev_id,
diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 94ad0c0..3d632ee 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -181,7 +181,13 @@ typedef enum {
 	(NAND_NO_PADDING | NAND_CACHEPRG | NAND_COPYBACK)
 
 /* Macros to identify the above */
+#ifdef CONFIG_NAND_NO_SMALL_PAGE
+#define NAND_CANAUTOINCR(chip) 0
+#else
 #define NAND_CANAUTOINCR(chip) (!(chip->options & NAND_NO_AUTOINCR))
+#endif
+#define NAND_BLOCK_MASK(chip) \
+	((1 << (chip->phys_erase_shift - chip->page_shift)) - 1)
 #define NAND_MUST_PAD(chip) (!(chip->options & NAND_NO_PADDING))
 #define NAND_HAS_CACHEPROG(chip) ((chip->options & NAND_CACHEPRG))
 #define NAND_HAS_COPYBACK(chip) ((chip->options & NAND_COPYBACK))
@@ -269,17 +275,20 @@ struct nand_ecc_ctrl {
 					   uint8_t *calc_ecc);
 	int			(*read_page_raw)(struct mtd_info *mtd,
 						 struct nand_chip *chip,
-						 uint8_t *buf, int page);
+						 uint8_t *buf, int page,
+						 uint32_t *rstate);
 	void			(*write_page_raw)(struct mtd_info *mtd,
 						  struct nand_chip *chip,
 						  const uint8_t *buf);
 	int			(*read_page)(struct mtd_info *mtd,
 					     struct nand_chip *chip,
-					     uint8_t *buf, int page);
+					     uint8_t *buf, int page,
+					     uint32_t *rstate);
 	int			(*read_subpage)(struct mtd_info *mtd,
 					     struct nand_chip *chip,
 					     uint32_t offs, uint32_t len,
-					     uint8_t *buf);
+					     uint8_t *buf, int page,
+					     uint32_t *rstate);
 	void			(*write_page)(struct mtd_info *mtd,
 					      struct nand_chip *chip,
 					      const uint8_t *buf);

             reply	other threads:[~2009-01-23 10:48 UTC|newest]

Thread overview: 735+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-01-23 10:48 bogus [this message]
  -- strict thread matches above, loose matches on Subject: below --
2023-08-31  7:20 No subject Peter Yin
2022-06-21  9:06 ventas
2020-11-25 10:16 Manuel Reis
2020-05-08  9:43 Patrick Wildt
2019-08-21 15:45 Ivan Mikhaylov
2019-03-19 14:41 Maxim Levitsky
2019-03-20 11:03 ` Felipe Franciosi
2019-03-20 19:08   ` Maxim Levitsky
2019-03-21 16:12     ` Stefan Hajnoczi
2019-03-21 16:21       ` Keith Busch
2019-03-21 16:41         ` Felipe Franciosi
2019-03-21 17:04           ` Maxim Levitsky
2019-03-22  7:54             ` Felipe Franciosi
2019-03-22 10:32               ` Maxim Levitsky
2019-03-22 15:30               ` Keith Busch
2019-03-25 15:44                 ` Felipe Franciosi
2019-03-16 11:17 Bharath Vedartham
2018-10-05 13:39 Christoph Hellwig
2018-08-02 10:48 TU PHUNG VAN
2018-07-06 21:16 Santosh Shilimkar
2018-07-06 21:16 ` Santosh Shilimkar
2018-07-06 21:16 ` Santosh Shilimkar
2018-07-06 21:18   ` Santosh Shilimkar
2018-07-06  5:52 inventsekar
2018-06-23 21:08 David Lechner
2018-05-08  6:10 Vishnu Gopinath
2018-05-04 20:06 Bjorn Helgaas
2018-04-20  8:02 Christoph Hellwig
2018-04-20  8:02 ` Christoph Hellwig
2018-04-16  1:22 Andrew Worsley
2018-02-25  0:39 J Freyensee
2018-02-02  6:54 Jianchao Wang
2017-11-30 10:25 Mary Cuevas
2017-09-13 18:15 unmesh rathi
2017-08-22  1:38 Nicholas Piggin
2017-06-26 13:16 [PATCH] arm64: use readq() instead of readl() to read 64bit entry_point Luc Van Oostenryck
2017-07-03 23:46 ` No subject Khuong Dinh
2017-06-06  7:19 From Lori J. Robinson
2017-06-04 11:59 Yury Norov
     [not found] <CAMj-D2DO_CfvD77izsGfggoKP45HSC9aD6auUPAYC9Yeq_aX7w@mail.gmail.com>
2017-05-04 16:44 ` gengdongjiu
2017-04-21 23:23 Sandeep Mann
2017-04-21  4:59 wendyqzx at gmail.com
2017-04-16 15:11 wendyqzx at gmail.com
2017-04-09 10:46 76564 at max.arc.nasa.gov
2017-02-07  0:22 Scott Bauer
2017-02-07  0:46 ` Jens Axboe
2017-01-31  7:58 Andy Gross
2017-01-09 11:33 [PATCH v2 0/7] uapi: export all headers under uapi directories Arnd Bergmann
2017-01-13 10:46 ` [PATCH v3 0/8] " Nicolas Dichtel
2017-01-13 10:46   ` [PATCH v3 1/8] arm: put types.h in uapi Nicolas Dichtel
2017-01-13 15:36     ` No subject David Howells
2017-01-13 10:46   ` [PATCH v3 4/8] x86: stop exporting msr-index.h to userland Nicolas Dichtel
2017-01-13 15:43     ` No subject David Howells
2016-12-01 10:00 Ramana Radhakrishnan
2016-11-19 18:31 bogus
2016-11-19 18:31 bogus
2016-11-19 18:31 bogus
2016-11-19 18:31 bogus
2016-11-11  3:38 Chunyan Zhang
2016-09-30 14:37 Maxime Ripard
2016-07-10  9:24 Neil Armstrong
2016-07-10  9:24 ` Neil Armstrong
2016-06-13  6:24 bogus
2016-06-13  6:24 bogus
2016-04-22  8:25 Daniel Lezcano
2016-04-22  8:27 ` Daniel Lezcano
2016-04-11  7:51 Paul Walmsley
2016-03-07 17:52 nunojsa
2016-02-09  7:29 bogus
2015-12-13 21:57 何旦洁
2015-11-16 16:13 bogus
2015-10-27  0:44 xuyiping
     [not found] <E1ZqY3A-0004Mt-KH@feisty.vs19.net>
2015-10-26  3:21 ` Jiada Wang
2015-10-21  6:17 Rock Lee
2015-10-12 17:26 bogus
2015-09-18 17:23 Shraddha Barke
2015-09-18  4:49 Shraddha Barke
2015-09-01 14:14 Mika Penttilä
2015-09-01 15:22 ` Fabio Estevam
2015-07-22 14:05 Chunfeng Yun
2015-07-15  9:32 Yuan Yao
2015-05-18 20:00 raghu MG
2015-04-21 10:18 Ard Biesheuvel
2015-03-30  4:56 Woody Wu
2015-02-26 16:56 Jorge Ramirez-Ortiz
2015-02-18 16:14 Lee Jones
2015-01-27 16:49 Grzegorz Dwornicki
2014-11-10  6:39 Libo Chen
2014-11-10  3:11 Libo Chen
2014-10-28 14:13 Mark Rutland
2014-09-22 19:41 Santosh Shilimkar
2014-09-22  7:45 Jingchang Lu
2014-09-13 19:40 bogus
2014-09-13 19:40 bogus
2014-09-13 19:40 bogus
2014-09-13 19:40 bogus
2014-09-13 19:40 bogus
2014-08-29 14:22 Ravi Raj
2014-08-29 14:47 ` Valdis.Kletnieks at vt.edu
2014-08-29 14:58   ` Ravi Raj
2014-08-29 15:32     ` No subject Valdis.Kletnieks at vt.edu
2014-08-29 15:34     ` Valdis.Kletnieks at vt.edu
2014-07-09 17:49 Sebastian Andrzej Siewior
2014-06-27  8:01 bogus
2014-06-27  8:01 bogus
2014-06-27  8:01 bogus
2014-06-27  8:01 bogus
2014-05-30  7:51 bogus
2014-05-30  7:51 bogus
2014-05-30  7:51 bogus
2014-05-24  1:21 Loc Ho
2014-05-12 16:40 Santosh Shilimkar
2014-05-12 16:38 Santosh Shilimkar
2014-05-12  4:37 Sivakumar V
2014-04-21  2:59 Amber Thrall
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-03-03  8:42 bogus
2014-02-22 15:53 Hans de Goede
2014-01-21  4:09 John Tobias
2014-01-16 16:11 Loc Ho
2014-01-16 16:09 Loc Ho
2014-01-13 10:32 Lothar Waßmann
2014-01-13 10:29 Lothar Waßmann
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-16 11:38 bogus
2013-12-12  7:30 Loc Ho
2013-11-01  7:04 Xiubo Li
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-10-15 19:54 bogus
2013-09-24  3:13 Rohit Vaswani
2013-09-15  9:49 bogus
2013-09-15  9:49 bogus
2013-09-15  9:49 bogus
2013-09-02 17:01 Drasko DRASKOVIC
2013-08-24  9:29 Haojian Zhuang
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-08-18  1:03 bogus
2013-07-30  4:09 PV Juliet
2013-07-26 10:05 Haojian Zhuang
2013-06-28  5:49 Wang, Yalin
2013-06-19 10:57 Ben Dooks
2013-04-24 18:07 Viral Mehta
2013-04-12  7:08 Callum Hutchinson
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-09 14:12 bogus
2013-04-03 10:31 bogus
2013-04-03 10:31 bogus
2013-04-03 10:31 bogus
2013-04-03 10:31 bogus
2013-02-25  7:24 Prasad Lakshman
2013-02-15  5:48 Kaushal Billore
2013-02-06 22:30 Jimmy Pan
2013-01-16 21:46 bogus
2013-01-16 21:46 bogus
2012-12-29  9:17 steve.zhan
2012-12-05 13:48 Niroj Pokhrel
2012-11-19 11:41 唐忠诚
2012-11-11 14:16 Sammy Chan
2012-11-08  9:33 bogus
2012-11-08  8:07 Abhimanyu Kapur
2012-11-02 10:46 Pritam Bankar
2012-10-15  9:24 Niroj Pokhrel
2012-10-14 10:05 Alexey Dobriyan
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-10-11  5:38 bogus
2012-08-27  6:40 Simon Horman
2012-08-13 10:09 Vivek Panwar
2012-08-06 10:43 =?gb18030?B?wObC5A==?=
2012-07-30 19:04 siddhesh phadke
2012-06-21 18:26 Paul Walmsley
2012-06-06 10:33 Sascha Hauer
2012-05-25 15:26 bogus
2012-05-25 15:26 bogus
2012-05-18 12:27 Sascha Hauer
2012-04-09 17:56 Martynov Semen
2012-04-10  2:26 ` Vladimir Murzin
2012-04-10  4:03   ` Martynov Semen
2012-04-10  4:48   ` Martynov Semen
2012-04-10 16:08     ` Vladimir Murzin
2012-04-10 17:00       ` Semen Martynov
2012-04-05  7:54 bogus
2012-04-05  7:54 bogus
2012-03-20 18:28 John Szakmeister
2012-02-27  5:00 bogus
2012-02-27  5:00 bogus
2012-02-27  5:00 bogus
2012-01-15  8:24 bogus
2011-12-30 17:16 Philip Anil-QBW348
2011-12-28 14:01 Shawn Guo
2011-12-16  2:18 Swapnil Gaikwad
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-05 12:53 bogus
2011-12-02 16:01 Will Deacon
2011-11-28  2:35 Jett.Zhou
2011-11-21 15:22 Jimmy Pan
2011-11-17 20:02 bogus
2011-11-17 20:02 bogus
2011-11-17 20:02 bogus
2011-11-17 20:02 bogus
2011-11-17 20:02 bogus
2011-11-12 14:39 bogus
2011-11-12 14:39 bogus
2011-09-23  3:42 毕春雷
2011-09-19  1:45 Saleem Abdulrasool
2011-09-15  2:03 Jongpill Lee
2011-08-05  3:08 bogus
2011-08-05  3:08 bogus
2011-08-05  3:08 bogus
2011-08-05  3:08 bogus
2011-08-05  3:08 bogus
2011-07-21 11:12 Padmavathi Venna
2011-06-27 20:47 John Ogness
2011-06-27 20:47 Jongpill Lee
2011-06-16 11:41 Venkateswarlu P
2011-06-14 12:20 Venkateswarlu P
2011-06-13 17:29 Andre Silva
2011-06-05 18:33 Hector Oron
2011-06-04 23:16 bogus
2011-06-04 23:16 bogus
2011-05-17  9:28 Javier Martin
2011-05-13 19:35 Vadim Bendebury
2011-04-07  5:55 bogus
2011-04-07  5:55 bogus
2011-04-07  5:55 bogus
2011-04-07  5:55 bogus
2011-04-07  5:55 bogus
2011-03-22 18:13 nijil yes
2011-03-01 14:02 Javier Martin
2011-02-26  6:20 Aldyth Maharsha
2011-01-13  9:13 Uwe Kleine-König
2011-01-05 11:39 davidgg
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-19 23:59 bogus
2010-12-03  1:08 tarek attia
2010-10-08  6:02 Daein Moon
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-24 14:53 bogus
2010-09-09  3:33 tarek attia
2010-08-30  5:02 auto595907
2010-08-23 14:32 auto595907
2010-07-23 10:05 bogus
2010-06-24 13:48 Uwe Kleine-König
2010-06-07 17:58 Dave Hylands
2010-05-18 10:38 Marek Szyprowski
2010-04-17 21:43 nelakurthi koteswararao
2010-03-25 17:02 bogus
2010-03-25 17:02 bogus
2010-02-25  9:36 Thomas Weber
2009-11-19 13:58 Vimal Singh
2009-09-17  9:37 Marc Kleine-Budde
2009-09-07 14:07 Somshekar ChandrashekarKadam
2009-08-25 10:34 Syed Rafiuddin
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-27 19:01 bogus
2009-02-15  8:49 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-23 10:48 bogus
2009-01-04 17:33 bogus
2009-01-04 17:33 bogus
2008-12-07 21:22 bogus
2008-11-21  1:22 bogus
2008-10-23 17:17 bogus
2008-10-23 17:17 bogus
2008-10-23 17:17 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-10-14 11:50 bogus
2008-09-15 17:22 bogus
2008-09-15 17:22 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-08-19 20:18 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-29  0:03 bogus
2008-07-28  4:41 bogus
2008-07-14 13:16 bogus
2008-07-14 13:16 bogus
2008-07-14 13:16 bogus
2008-07-14 13:16 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-04-23 14:39 bogus
2008-03-17 22:01 bogus
2007-12-01  7:52 bogus
2007-12-01  7:52 bogus
2007-10-06 20:13 bogus
2007-10-06 20:13 bogus
2007-10-06 20:13 bogus
2007-07-23 18:04 bogus
2007-07-23 18:04 bogus
2007-06-23 20:07 bogus
2007-02-14  8:32 bogus
2007-02-14  8:32 bogus
2007-02-14  8:32 bogus
2007-02-14  8:32 bogus
2007-02-06  7:08 bogus
2007-02-06  7:08 bogus
2007-02-06  7:08 bogus
2007-02-06  7:08 bogus
2007-02-01  7:54 kou.ishizaki
2007-02-04  4:37 ` No Subject Benjamin Herrenschmidt
2007-02-04  4:37   ` Benjamin Herrenschmidt
2006-10-09 23:13 (no subject) albox
2006-10-09 23:31 ` No Subject Tobin Davis
2006-08-17  1:58 No subject bogus
2006-08-17  1:58 bogus
2006-08-17  1:58 bogus
2006-08-17  1:58 bogus
2006-08-17  1:58 bogus
2006-08-17  1:58 bogus
2006-08-17  1:58 bogus
     [not found] <Pine.LNX.4.33.0111200151170.1364-100000@home.apu.edu>
2005-05-19  6:23 ` SACAH
2005-05-19  6:23 ` Chen, Zhen Y (Zhen)
2005-05-19  6:23 ` Gyimesi Attila
2005-05-19  6:23 ` Minesh Khatri
2005-05-19  6:24 ` Bryan Call
2005-05-19  6:24 ` Kirby Dotson
2005-05-19  6:24 ` Zaffar Khalid
2005-05-19  6:24 ` cst01074
2005-05-19  6:24 ` spreckel
2005-05-19  6:24 ` jmp
2005-05-19  6:25 ` no subject firase kaled
2005-05-19  6:25 ` No subject andreas
2005-05-19  6:25 ` Rudolf Marek
2005-05-19  6:25 ` Tomáš Thiemel
2004-12-14 16:49 Andi Kleen
2004-12-15 23:50 ` No Subject Alan Cox
2004-07-16 16:54 Hermann Gottschalk
2004-07-16 16:59 ` No Subject Jesse Stockall
2004-02-22 17:51 redzic fadil
2004-02-22 20:54 ` No Subject Ludootje
     [not found] <Pine.GSO.4.58.0401251223440.20527@waterleaf.sonytel.be>
2004-01-25 13:02 ` Benjamin Herrenschmidt
2003-02-21 13:43 News Admin
2003-02-21 15:01 ` No Subject Alan Cox
2002-08-05 13:08 Christos Kartsaklis
2002-08-05 14:53 ` No Subject Alan Cox
2002-08-03 19:26 Pawel Kot
2002-08-03 21:45 ` No Subject Alan Cox
2002-08-03 21:58   ` Bartlomiej Zolnierkiewicz
2002-08-03 22:16     ` Bartlomiej Zolnierkiewicz
2002-08-03 23:38       ` Alan Cox
2002-08-03 22:53         ` Bartlomiej Zolnierkiewicz
2002-08-04 13:28           ` Henning P. Schmiedehausen
2002-08-04 15:40             ` Daniela Engert
2002-08-03 23:27         ` Petr Vandrovec
2001-08-24 22:16 abraxas2
2000-11-19 20:02 jingai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=mailman.80.1260286457.8188.u-boot@lists.denx.de \
    --to=bogus@does.not.exist.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.