cfi_cmdset_0002.c do_write_oneword(...) problem
Vladimir Doukhanine
vdoukhan at cbnco.com
Thu Feb 13 16:51:47 EST 2003
Todd,
The hack like yours didnât make MTD write work.
But it works if I have
Something like:
printk(KERN_DEBUG);
or
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(0);
in the very beginning of the subroutine.
Please let me know if you find out what is the cause of the problem.
Thanks,
Vlad
On Wed, 12 Feb 2003 14:50:27 -0700, Todd Fischer <todd.fischer at cadenux.com>
wrote:
> Vlad,
>
> I am also using the AMD L640DU chip (same internals as 641, just
> different
> packaging). The do_write_oneword() routine in cfi_cmdset_0002.c didn't
> work
> for me. I put in the following very ugly temporary patch to test where
> in
> the code the problem was occurring. This hack does allow JFFS2 / MTD to
> work fine for me. However, this hack is architecture specific (I am
> running
> on an ARM7), so you may need to make appropriate changes for your
> environment. Also notice that I am not using the fast programming method
> supported by the chip. The purpose of the hack was to narrow down where
> in
> the code it was failing, it is not a fix to the problem.
>
> I have the added complexity that the ARM7 interrupt table is located in
> the
> same flash part I am using for JFFS2, so I have to disable interrupts
> whenever I put the flash chip in a non "read array" mode. The
> cfi_cmdset_0002.c code has many places where the flash chip is left if
> CFI
> mode and erase-more-sectors mode, (thus hiding the interrupt vector
> table)
> which I had to modify. I hope there are no more silicon vendors dumb
> enough
> to put interrupt vector tables in flash!
>
>
> #if 1
> /* short cut that works */
> {
> volatile unsigned short *addr1;
> unsigned short *block_addr;
>
> addr1 = (unsigned short *)chip->start;
> addr1[0x555] = 0xAA;
> addr1[0x2aa] = 0x55;
> addr1[0x555] = 0xA0;
> block_addr = (unsigned short *)adr;
> *block_addr = datum;
> }
> #else
> /* original code that looks like it should work, but doesn't */
>
> if (fast) { /* Unlock bypass */
> cfi_send_gen_cmd(0xA0, 0, chip->start, map, cfi, cfi->device_type,
> NULL);
> }
> else {
> cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
> CFI_DEVICETYPE_X8, NULL);
> cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
> CFI_DEVICETYPE_X8, NULL);
> cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi,
> CFI_DEVICETYPE_X8, NULL);
> }
>
> cfi_write(map, datum, adr);
>
> #endif
>
> You might try a similar change to see if your problem goes away. If so,
> I
> bet we are experiencing the same issue.
>
> When I get to the bottom of what is causing the problem, I will let you
> know
> what I found.
>
> Todd Fischer
> Cadenux
> www.cadenux.com
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
More information about the linux-mtd
mailing list