[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