? nand.diff ? nand_base.diff Index: nand_base.c =================================================================== RCS file: /home/cvs/mtd/drivers/mtd/nand/nand_base.c,v retrieving revision 1.112 diff -u -r1.112 nand_base.c --- nand_base.c 13 Jul 2004 08:28:21 -0000 1.112 +++ nand_base.c 14 Jul 2004 10:45:55 -0000 @@ -964,34 +964,34 @@ oobofs += mtd->oobsize - hweccbytes * eccsteps; page++; numpages--; - if (!numpages) - break; - + /* Apply delay or wait for ready/busy pin * Do this before the AUTOINCR check, so no problems * arise if a chip which does auto increment * is marked as NOAUTOINCR by the board driver. + * Do this also before returning, so the chip is + * ready for the next command. */ if (!this->dev_ready) udelay (this->chip_delay); else while (!this->dev_ready(mtd)); + + /* All done, return happy */ + if (!numpages) + return 0; + /* Check, if the chip supports auto page increment */ if (!NAND_CANAUTOINCR(this)) this->cmdfunc (mtd, NAND_CMD_READ0, 0x00, page); } - res = 0; /* - * Terminate the read command. This is faster than sending a reset command or - * applying a 20us delay before issuing the next programm sequence. - * This is not a problem for all chips, but I have found a bunch of them. - * FIXME, CHECKME: Does this work on systems, where CE is not driven - * by an GPIO pin ? + * Terminate the read command. We come here in case of an error + * So we must issue a reset command. */ out: - this->select_chip(mtd, -1); - this->select_chip(mtd, chipnr); + this->cmdfunc (mtd, NAND_CMD_RESET, -1, -1); return res; } #endif @@ -1248,14 +1248,6 @@ } else read += mtd->oobblock; - if (read == len) - break; - - /* For subsequent reads align to page boundary. */ - col = 0; - /* Increment page address */ - realpage++; - /* Apply delay or wait for ready/busy pin * Do this before the AUTOINCR check, so no problems * arise if a chip which does auto increment @@ -1266,6 +1258,14 @@ else while (!this->dev_ready(mtd)); + if (read == len) + break; + + /* For subsequent reads align to page boundary. */ + col = 0; + /* Increment page address */ + realpage++; + page = realpage & this->pagemask; /* Check, if we cross a chip boundary */ if (!page) { @@ -1345,19 +1345,21 @@ thislen = min_t(int, thislen, len); this->read_buf(mtd, &buf[i], thislen); i += thislen; + + /* Apply delay or wait for ready/busy pin + * Do this before the AUTOINCR check, so no problems + * arise if a chip which does auto increment + * is marked as NOAUTOINCR by the board driver. + */ + if (!this->dev_ready) + udelay (this->chip_delay); + else + while (!this->dev_ready(mtd)); + /* Read more ? */ if (i < len) { page++; col = 0; - /* Apply delay or wait for ready/busy pin - * Do this before the AUTOINCR check, so no problems - * arise if a chip which does auto increment - * is marked as NOAUTOINCR by the board driver. - */ - if (!this->dev_ready) - udelay (this->chip_delay); - else - while (!this->dev_ready(mtd)); /* Check, if we cross a chip boundary */ if (!(page & this->pagemask)) {