Patchwork [2/3] mtd: nand: remove autoincrement 'sndcmd' code

login
register
mail settings
Submitter Brian Norris
Date May 2, 2012, 12:12 a.m.
Message ID <1335917575-14953-2-git-send-email-computersforpeace@gmail.com>
Download mbox | patch
Permalink /patch/156274/
State Accepted
Commit c00a0991d14dce8d714becc49ec8ae5db9c8ac98
Headers show

Comments

Brian Norris - May 2, 2012, 12:12 a.m.
The NAND_NO_AUTOINCR option is always set, so we will kill the option and make
"no autoincrement" the default behavior for nand_base.c. Thus, we should remove
the code which decides whether or not to send the NAND_CMD_READ0 command.
Instead, we unconditionally send the command.

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
---
 drivers/mtd/nand/nand_base.c |   43 +++++------------------------------------
 1 files changed, 6 insertions(+), 37 deletions(-)
Shmulik Ladkani - May 3, 2012, 6:17 a.m.
Hi Brian,

Sorry for the late response.
(I'm following the posts, but obviously can't take a deep look
immediately)

On Tue,  1 May 2012 17:12:54 -0700 Brian Norris <computersforpeace@gmail.com> wrote:
> @@ -1842,20 +1823,15 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
>  
>  	while (1) {
>  		if (ops->mode == MTD_OPS_RAW)
> -			sndcmd = chip->ecc.read_oob_raw(mtd, chip, page, sndcmd);
> +			chip->ecc.read_oob_raw(mtd, chip, page, 1);
>  		else
> -			sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd);
> +			chip->ecc.read_oob(mtd, chip, page, 1);


Since '1' is always passed as 'sndcmd' argument, how about killing the
'sndcmd' parameter of of these interfaces:

	int (*read_oob_raw)(struct mtd_info *mtd, struct nand_chip *chip,
			int page, int sndcmd);
	int (*read_oob)(struct mtd_info *mtd, struct nand_chip *chip, int page,
			int sndcmd);

Looks as a simplification.
At least for current code which always passes '1'.
(Don't know if we might need the 'sndcmd' ability in the future)

I can come up with a patch, but currently I have very limited testing
capabilities.

Regards,
Shmulik
Artem Bityutskiy - May 3, 2012, 10:39 a.m.
On Thu, 2012-05-03 at 09:17 +0300, Shmulik Ladkani wrote:
> I can come up with a patch, but currently I have very limited testing
> capabilities.

It looks like the patch would be simple enough and compile-test would
suffice. And if you send it out, there is a chance someone tests it.

Patch

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 640f1f8..6246b0f 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -1477,8 +1477,6 @@  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;
@@ -1509,10 +1507,7 @@  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;
-			}
+			chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
 
 			/*
 			 * Now read the page into the buffer.  Absent an error,
@@ -1564,13 +1559,7 @@  static int nand_do_read_ops(struct mtd_info *mtd, loff_t from,
 			}
 
 			if (!(chip->options & NAND_NO_READRDY)) {
-				/*
-				 * 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.
-				 */
+				/* Apply delay or wait for ready/busy pin */
 				if (!chip->dev_ready)
 					udelay(chip->chip_delay);
 				else
@@ -1600,13 +1589,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;
@@ -1800,10 +1782,9 @@  static int nand_write_oob_syndrome(struct mtd_info *mtd,
 static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
 			    struct mtd_oob_ops *ops)
 {
-	int page, realpage, chipnr, sndcmd = 1;
+	int page, realpage, chipnr;
 	struct nand_chip *chip = mtd->priv;
 	struct mtd_ecc_stats stats;
-	int blkcheck = (1 << (chip->phys_erase_shift - chip->page_shift)) - 1;
 	int readlen = ops->ooblen;
 	int len;
 	uint8_t *buf = ops->oobbuf;
@@ -1842,20 +1823,15 @@  static int nand_do_read_oob(struct mtd_info *mtd, loff_t from,
 
 	while (1) {
 		if (ops->mode == MTD_OPS_RAW)
-			sndcmd = chip->ecc.read_oob_raw(mtd, chip, page, sndcmd);
+			chip->ecc.read_oob_raw(mtd, chip, page, 1);
 		else
-			sndcmd = chip->ecc.read_oob(mtd, chip, page, sndcmd);
+			chip->ecc.read_oob(mtd, chip, page, 1);
 
 		len = min(len, readlen);
 		buf = nand_transfer_oob(chip, buf, ops, len);
 
 		if (!(chip->options & NAND_NO_READRDY)) {
-			/*
-			 * 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.
-			 */
+			/* Apply delay or wait for ready/busy pin */
 			if (!chip->dev_ready)
 				udelay(chip->chip_delay);
 			else
@@ -1876,13 +1852,6 @@  static int nand_do_read_oob(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->oobretlen = ops->ooblen;