Re: [PATCH] AT91RM9200 NAND support

Thomas Gleixner
2006-06-20T11:53:46Z

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.
*/