[PATCH] AT91RM9200 NAND support

Thomas Gleixner tglx at linutronix.de
Tue Jun 20 07:55:00 EDT 2006


On Tue, 2006-06-20 at 13:42 +0200, Savin Zlobec wrote:
> >Well, we read the manufacturer ID. When we get 98H, how should we know
> >that this is a Samsung part ? And I doubt that this is a quad bit flip.
> > 
> What bothers me is that MTD from 2.6.17 reads manufacturer ID = 0xec,  and
> the latest git MTD reads 0x98. The chip on my board is Samsung.

Thats indeed strange. Whats the exact part number ?

> >Can you please remove the nand_wait_ready() call in nand_command() and
> >test the following patch ? It disables the ready busy pin and uses the
> >chip_delay. Please check, whether the 20us are correct. You can safely
> >set it to 50 without breaking stuff.
> >
> It doesn't work with 20us nor with 50us.

Ok, revert the patch. I really need to know which code path triggers
this behaviour. Can you apply the patch below and compile the kernel
with CONFIG_DEBUG_INFO.

When the chip is not in READY state on entry of nand_command() debug
info is printed. Please decode the kernel addresses of "Last caller" and
"Current caller" with 

addr2line -e vmlinux 0xNNNNNNNNN

Thanks

	tglx

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 77406fc..b6e08ea 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -430,6 +430,9 @@ static void nand_wait_ready(struct mtd_i
 	led_trigger_event(nand_led_trigger, LED_OFF);
 }
 
+static void *last_caller;
+static int last_command;
+
 /**
  * nand_command - [DEFAULT] Send command to NAND device
  * @mtd:	MTD device structure
@@ -446,6 +449,20 @@ static void nand_command(struct mtd_info
 	register struct nand_chip *chip = mtd->priv;
 	int ctrl = NAND_CTRL_CLE | NAND_CTRL_CHANGE;
 
+	if (command != NAND_CMD_RESET && command != NAND_CMD_STATUS &&
+	    chip->dev_ready && !chip->dev_ready(mtd)) {
+
+		printk("Chip not ready in nand_command():\n");
+		printk("Last caller: %p\n", last_caller);
+		printk("Last command: 0x%02x\n", last_command);
+		printk("Current caller: %p\n", __builtin_return_address(0););
+		printk("Current command: 0x%02x\n", command);
+
+		nand_wait_ready(mtd);
+	}
+	last_caller = __builtin_return_address(0);
+	last_command = command;
+
 	/*
 	 * Write out the command to the device.
 	 */

 






More information about the linux-mtd mailing list