[MTD] NAND: Check command timeout
Check timeout while we wait for the command to finish. No worry about a false result. This prevents deadlocking when detecting an unknown number of chips and is useful for removable media too. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
dfd6129440
commit
3b88775c75
|
@ -59,7 +59,7 @@
|
||||||
* The AG-AND chips have nice features for speed improvement,
|
* The AG-AND chips have nice features for speed improvement,
|
||||||
* which are not supported yet. Read / program 4 pages in one go.
|
* which are not supported yet. Read / program 4 pages in one go.
|
||||||
*
|
*
|
||||||
* $Id: nand_base.c,v 1.133 2005/02/16 09:39:35 gleixner Exp $
|
* $Id: nand_base.c,v 1.134 2005/02/22 21:56:46 gleixner Exp $
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
@ -509,6 +509,22 @@ static int nand_block_checkbad (struct mtd_info *mtd, loff_t ofs, int getchip, i
|
||||||
return nand_isbad_bbt (mtd, ofs, allowbbt);
|
return nand_isbad_bbt (mtd, ofs, allowbbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for the ready pin, after a command
|
||||||
|
* The timeout is catched later.
|
||||||
|
*/
|
||||||
|
static void nand_wait_ready(struct mtd_info *mtd)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
unsigned long timeo = jiffies + 2;
|
||||||
|
|
||||||
|
/* wait until command is processed or timeout occures */
|
||||||
|
do {
|
||||||
|
if (this->dev_ready(mtd))
|
||||||
|
return;
|
||||||
|
} while (time_before(jiffies, timeo));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nand_command - [DEFAULT] Send command to NAND device
|
* nand_command - [DEFAULT] Send command to NAND device
|
||||||
* @mtd: MTD device structure
|
* @mtd: MTD device structure
|
||||||
|
@ -604,12 +620,11 @@ static void nand_command (struct mtd_info *mtd, unsigned command, int column, in
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Apply this short delay always to ensure that we do wait tWB in
|
/* Apply this short delay always to ensure that we do wait tWB in
|
||||||
* any case on any machine. */
|
* any case on any machine. */
|
||||||
ndelay (100);
|
ndelay (100);
|
||||||
/* wait until command is processed */
|
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -724,8 +739,8 @@ static void nand_command_lp (struct mtd_info *mtd, unsigned command, int column,
|
||||||
/* Apply this short delay always to ensure that we do wait tWB in
|
/* Apply this short delay always to ensure that we do wait tWB in
|
||||||
* any case on any machine. */
|
* any case on any machine. */
|
||||||
ndelay (100);
|
ndelay (100);
|
||||||
/* wait until command is processed */
|
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1011,7 +1026,7 @@ static int nand_verify_pages (struct mtd_info *mtd, struct nand_chip *this, int
|
||||||
if (!this->dev_ready)
|
if (!this->dev_ready)
|
||||||
udelay (this->chip_delay);
|
udelay (this->chip_delay);
|
||||||
else
|
else
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
|
|
||||||
/* All done, return happy */
|
/* All done, return happy */
|
||||||
if (!numpages)
|
if (!numpages)
|
||||||
|
@ -1302,7 +1317,7 @@ int nand_do_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,
|
||||||
if (!this->dev_ready)
|
if (!this->dev_ready)
|
||||||
udelay (this->chip_delay);
|
udelay (this->chip_delay);
|
||||||
else
|
else
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
|
|
||||||
if (read == len)
|
if (read == len)
|
||||||
break;
|
break;
|
||||||
|
@ -1401,7 +1416,7 @@ static int nand_read_oob (struct mtd_info *mtd, loff_t from, size_t len, size_t
|
||||||
if (!this->dev_ready)
|
if (!this->dev_ready)
|
||||||
udelay (this->chip_delay);
|
udelay (this->chip_delay);
|
||||||
else
|
else
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
|
|
||||||
/* Read more ? */
|
/* Read more ? */
|
||||||
if (i < len) {
|
if (i < len) {
|
||||||
|
@ -1481,7 +1496,7 @@ int nand_read_raw (struct mtd_info *mtd, uint8_t *buf, loff_t from, size_t len,
|
||||||
if (!this->dev_ready)
|
if (!this->dev_ready)
|
||||||
udelay (this->chip_delay);
|
udelay (this->chip_delay);
|
||||||
else
|
else
|
||||||
while (!this->dev_ready(mtd));
|
nand_wait_ready(mtd);
|
||||||
|
|
||||||
/* Check, if the chip supports auto page increment */
|
/* Check, if the chip supports auto page increment */
|
||||||
if (!NAND_CANAUTOINCR(this) || !(page & blockcheck))
|
if (!NAND_CANAUTOINCR(this) || !(page & blockcheck))
|
||||||
|
|
Loading…
Reference in New Issue