public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* Problems with cfi_cmdset_0002 and Atmel AT49BV642D
@ 2007-05-08  8:44 Michael König
  2007-05-08 11:49 ` Vitaly Wool
  2007-05-09 13:34 ` Michael König
  0 siblings, 2 replies; 13+ messages in thread
From: Michael König @ 2007-05-08  8:44 UTC (permalink / raw)
  To: linux-mtd

Hello there,

as a short introduction (I'll be more precise later):
We built our own Linux device utilizing the ETRAX 100LX microcontroller and 
using the SDK provided by Axis. As a Flash chip we chose the Atmel 
AT49BV642D.

With the Linux 2.4 based SDK that includes cfi_cmdset_0002.c v1.62 
2003/01/24 the Flash worked fine although it wasn't correctly recognised by 
the CFI probe (the Atmel patches weren't there yet), but it seems that 
JEDEC seems to fix that up. Excerpt from dmesg on Linux 2.4:

 Amd/Fujitsu Extended Query Table v1.0 at 0x0041
cse0: JEDEC Device ID is 0xD6. Assuming broken CFI table.
cse0: Swapping erase regions for broken CFI table.
number of CFI chips: 1
cfi_cmdset_0002: Disabling fast programming due to code brokenness.

I'm not totally sure what the last line means exactly, but Flash operations 
seem to work fine nontheless.


The new SDK from Axis is based on Linux 2.6 and includes cfi_cmdset_0002.c 
v1.122 2005/11/07. In this case the Flash is correctly recognised thanks to 
the Atmel patches (I also made sure that fixup_convert_atmel_pri() gets 
called and the AT49BV642D is identified as a bottom boot device):

cse0: Probing a 0x04000000 bytes large window at 0xe0000000.
cse0: Found 1 x16 devices at 0x0 in 16-bit bank
cse0: Found an alias at 0x800000 for the chip at 0x0
cse0: Found an alias at 0x1000000 for the chip at 0x0
cse0: Found an alias at 0x1800000 for the chip at 0x0
cse0: Found an alias at 0x2000000 for the chip at 0x0
cse0: Found an alias at 0x2800000 for the chip at 0x0
cse0: Found an alias at 0x3000000 for the chip at 0x0
cse0: Found an alias at 0x3800000 for the chip at 0x0
 Amd/Fujitsu Extended Query Table at 0x0041
number of CFI chips: 1
cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.


The system boots fine and reading isn't a problem either, but it seems that 
no data is actually written to the Flash. When creating a new file on JFFS2 
I get an error message like this:

Node totlen on flash (0xffffffff) != totlen from node ref (0x00000044)

I guess the magic number 0x1985 isn't checked, otherwise it might even fail 
before checking the totlen.

At first I thought that the problem is just with do_write_buffer(), but 
Axis have a bootblocktool that lets you write data to a specific partition 
that is classified as a mtdchar device. While I don't get error messages in 
this case, the written data simply cannot be read back, so I guess there 
must be a problem with do_write_one_word() as well.

I noticed that do_write_buffer() seems to use some kind of burst mode, but 
I wasn't able to find that command sequence (0xAA, 0x55, 0x25) in neither 
the documentation for the AT49BV642D nor an AMD one (Am29DL640D) I looked 
at for comparison.

Since the AT49BV642D is a successor of the AT49BV6416 I tried activating 
fixup_use_atmel_lock() for it as well, but that didn't help either.

All the tests were performed on the same device and once I switch from 
Linux 2.6 back to 2.4 everything works fine, so I doubt that there is a 
problem with the Flash itself.

Does anybody have an idea what might be the cause of this problem?

Thanks in advance!

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-08  8:44 Problems with cfi_cmdset_0002 and Atmel AT49BV642D Michael König
@ 2007-05-08 11:49 ` Vitaly Wool
  2007-05-08 13:04   ` Michael König
  2007-05-09 13:34 ` Michael König
  1 sibling, 1 reply; 13+ messages in thread
From: Vitaly Wool @ 2007-05-08 11:49 UTC (permalink / raw)
  To: Michael König; +Cc: linux-mtd

Hi Michael,
> cse0: Probing a 0x04000000 bytes large window at 0xe0000000.
> cse0: Found 1 x16 devices at 0x0 in 16-bit bank
> cse0: Found an alias at 0x800000 for the chip at 0x0
> cse0: Found an alias at 0x1000000 for the chip at 0x0
> cse0: Found an alias at 0x1800000 for the chip at 0x0
> cse0: Found an alias at 0x2000000 for the chip at 0x0
> cse0: Found an alias at 0x2800000 for the chip at 0x0
> cse0: Found an alias at 0x3000000 for the chip at 0x0
> cse0: Found an alias at 0x3800000 for the chip at 0x0

that's b/c you're supplying too large a window, but that's harmless AFAICS.

> The system boots fine and reading isn't a problem either, but it seems that
> no data is actually written to the Flash. When creating a new file on JFFS2
> I get an error message like this:
>
> Node totlen on flash (0xffffffff) != totlen from node ref (0x00000044)

I'd check if you have the right width set up first.

Vitaly

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-08 11:49 ` Vitaly Wool
@ 2007-05-08 13:04   ` Michael König
  0 siblings, 0 replies; 13+ messages in thread
From: Michael König @ 2007-05-08 13:04 UTC (permalink / raw)
  To: Vitaly Wool; +Cc: linux-mtd

Hello Vitaly

>> cse0: Probing a 0x04000000 bytes large window at 0xe0000000.
>
> that's b/c you're supplying too large a window, but that's harmless
> AFAICS.

Strange, I don't think I'm supplying that window size anywhere, so it must 
be some preset range by Axis. I just took a look at the output of a device 
with a smaller Flash and it was the same window.

>> Node totlen on flash (0xffffffff) != totlen from node ref (0x00000044)
>
> I'd check if you have the right width set up first.

Both kernelconfig files have the following settings for the Flash:
CONFIG_ETRAX_FLASH_BUSWIDTH=2
CONFIG_ETRAX_FLASH1_SIZE=8

The kernelconfig for Linux 2.6 also adds CONFIG_ETRAX_NANDFLASH_BUSWIDTH, 
which was set to 1. I didn't think it would matter, since we don't have 
NAND Flashes, just NOR ones. I set it to 2 as well, just to see what 
happens, but I still have the same behaviour.

To be totally sure, I changed the FLASH_BUSWIDTH to 1 and still have the 
same effects. It's a bit strange, I didn't expect it to work at all.

It still bugs me that I cannot find the command sequence that is used in 
do_write_buffer() in my Atmel documentation.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-08  8:44 Problems with cfi_cmdset_0002 and Atmel AT49BV642D Michael König
  2007-05-08 11:49 ` Vitaly Wool
@ 2007-05-09 13:34 ` Michael König
  2007-05-09 13:46   ` Hans-Christian Egtvedt
  1 sibling, 1 reply; 13+ messages in thread
From: Michael König @ 2007-05-09 13:34 UTC (permalink / raw)
  To: linux-mtd

Hello again,

first of all, going through the GIT archive I found out that the 
cfi_cmdset_0002.c in the latest Axis SDK must be the one from 2006-09-22, 
since the last Atmel changes are present but the newest SST additions 
aren't.

Through some testing I found out that do_write_one_word() works just fine, 
and the main problem seems to be do_write_buffer().
To make it work without changing too much, I simply added a call to 
do_write_one_word() in the beginning of do_write_buffer() and then return. 
I'm sure it's less efficient that way, but I wanted to get it to work first.

Since the problem obviously is in do_write_buffer(), I wonder how this 
command sequence works:

cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, 
cfi->device_type, NULL);
cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, 
cfi->device_type, NULL);
//cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, 
cfi->device_type, NULL);
/* Write Buffer Load */
map_write(map, CMD(0x25), cmd_adr);

I wasn't able to find that sequence either in the documentation of my Atmel 
chip, or in AMD or Spansion ones.
Is this some undocumented command sequence that isn't implemented by Atmel?
Why isn't the bypass mode used anymore?

Thanks in advance for any insights that might clear up this issue.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-09 13:34 ` Michael König
@ 2007-05-09 13:46   ` Hans-Christian Egtvedt
  2007-05-10  6:53     ` Michael König
  0 siblings, 1 reply; 13+ messages in thread
From: Hans-Christian Egtvedt @ 2007-05-09 13:46 UTC (permalink / raw)
  To: linux-mtd

On Wed, 2007-05-09 at 15:34 +0200, Michael König wrote:
> first of all, going through the GIT archive I found out that the 
> cfi_cmdset_0002.c in the latest Axis SDK must be the one from 2006-09-22, 
> since the last Atmel changes are present but the newest SST additions 
> aren't.
> 
> Through some testing I found out that do_write_one_word() works just fine, 
> and the main problem seems to be do_write_buffer().
> To make it work without changing too much, I simply added a call to 
> do_write_one_word() in the beginning of do_write_buffer() and then return. 
> I'm sure it's less efficient that way, but I wanted to get it to work first.

Hmmm, AT49BV642D should not use the do_write_buffer() function at all.
There should be a fixup for this in the kernel.

Is there a "fixup_convert_atmel_pri" function which

<quote>
	/* burst write mode not supported */
	cfi->cfiq->BufWriteTimeoutTyp = 0;
	cfi->cfiq->BufWriteTimeoutMax = 0;
</quote>

This will disable using the "cfi_amdstd_write_buffers" function.

> Since the problem obviously is in do_write_buffer(), I wonder how this 
> command sequence works:
> 
> cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi, 
> cfi->device_type, NULL);
> cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi, 
> cfi->device_type, NULL);
> //cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi, 
> cfi->device_type, NULL);
> /* Write Buffer Load */
> map_write(map, CMD(0x25), cmd_adr);

This is the standard "Word program" command, take a look on page 11 in
the datasheet.

> I wasn't able to find that sequence either in the documentation of my Atmel 
> chip, or in AMD or Spansion ones.
> Is this some undocumented command sequence that isn't implemented by Atmel?
> Why isn't the bypass mode used anymore?

The Atmel device has a dual-word write function, but AFAIK AMD
(Spansion) devices can write a lot more with a single command. Thus
AT49BV642D can not use the default AMD command for buffer writes.

> Thanks in advance for any insights that might clear up this issue.

Sorry for a bit incomplete answer, but this flash device is working on
the ATNGW100 kit from Atmel. So it should work for you as well.

-- 
With kind regards,

Hans-Christian Egtvedt

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-09 13:46   ` Hans-Christian Egtvedt
@ 2007-05-10  6:53     ` Michael König
  2007-05-10  7:15       ` Hans-Christian Egtvedt
  0 siblings, 1 reply; 13+ messages in thread
From: Michael König @ 2007-05-10  6:53 UTC (permalink / raw)
  To: Hans-Christian Egtvedt, linux-mtd

Hello Hans-Christian...

> Is there a "fixup_convert_atmel_pri" function which

The function fixup_convert_atmel_pri() is present and is being called as 
confirmed by a printk() I added to it.

> <quote>
> 	/* burst write mode not supported */
> 	cfi->cfiq->BufWriteTimeoutTyp = 0;
> 	cfi->cfiq->BufWriteTimeoutMax = 0;
> </quote>

I'm not sure what version of cfi_cmdset_0002.c you have, but those lines 
are nowhere to be found in my copy and neither are they in the current GIT 
revision:
<http://git.infradead.org/?p=mtd-2.6.git;a=blob_plain;f=drivers/mtd/chips/cfi_cmdset_0002.c>

> This will disable using the "cfi_amdstd_write_buffers" function.

To give it a try I removed my changes and added those two lines to 
fixup_convert_atmel_pri(), but cfi_amdstd_write_buffers() and thus 
do_write_buffer() are still being called.

>> cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
>> cfi->device_type, NULL);
>> cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
>> cfi->device_type, NULL);
>> //cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi,
>> cfi->device_type, NULL);
>> /* Write Buffer Load */
>> map_write(map, CMD(0x25), cmd_adr);
>
> This is the standard "Word program" command, take a look on page 11 in
> the datasheet.

It would be if 0xA0 was present, but that's commented out in 
do_write_buffer() and replaced by 0x25. That's a sequence I cannot find in 
the Atmel documentation (and neither in the AMD/Spansion ones for that 
matter), but as you point out do_write_buffer() shouldn't get called for 
Atmel chips anyway.

> The Atmel device has a dual-word write function, but AFAIK AMD
> (Spansion) devices can write a lot more with a single command. Thus
> AT49BV642D can not use the default AMD command for buffer writes.

The funny thing is that do_write_buffer() never seems to write more than 
two words (in my case 4 bytes), so I don't understand why the bypass mode 
isn't used anymore like in a previous incarnation of the code.

> Sorry for a bit incomplete answer, but this flash device is working on
> the ATNGW100 kit from Atmel. So it should work for you as well.

You've certainly helped me to know for certain that do_write_buffer() 
shouldn't get called for Ateml chips. But it confuses me that Atmel seems 
to have a different code base than the GIT repository.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10  6:53     ` Michael König
@ 2007-05-10  7:15       ` Hans-Christian Egtvedt
  2007-05-10  7:41         ` Michael König
  2007-05-10  8:27         ` Haavard Skinnemoen
  0 siblings, 2 replies; 13+ messages in thread
From: Hans-Christian Egtvedt @ 2007-05-10  7:15 UTC (permalink / raw)
  To: Michael König; +Cc: linux-mtd

On Thu, 2007-05-10 at 08:53 +0200, Michael König wrote:
> Hello Hans-Christian...
> 
> > Is there a "fixup_convert_atmel_pri" function which
> 
> The function fixup_convert_atmel_pri() is present and is being called as 
> confirmed by a printk() I added to it.
> 
> > <quote>
> > 	/* burst write mode not supported */
> > 	cfi->cfiq->BufWriteTimeoutTyp = 0;
> > 	cfi->cfiq->BufWriteTimeoutMax = 0;
> > </quote>
> 
> I'm not sure what version of cfi_cmdset_0002.c you have, but those lines 
> are nowhere to be found in my copy and neither are they in the current GIT 
> revision:
> <http://git.infradead.org/?p=mtd-2.6.git;a=blob_plain;f=drivers/mtd/chips/cfi_cmdset_0002.c>

This is from the AVR32 GIT repository at
git://www.atmel.no/~hskinnemoen/linux/kernel/avr32.git

/* Atmel chips don't use the same PRI format as AMD chips */
static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
{
	struct map_info *map = mtd->priv;
	struct cfi_private *cfi = map->fldrv_priv;
	struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
	struct cfi_pri_atmel atmel_pri;

	memcpy(&atmel_pri, extp, sizeof(atmel_pri));
	memset((char *)extp + 5, 0, sizeof(*extp) - 5);

	if (atmel_pri.Features & 0x02)
		extp->EraseSuspend = 2;

	if (atmel_pri.BottomBoot)
		extp->TopBottom = 2;
	else
		extp->TopBottom = 3;

	/* burst write mode not supported */
	cfi->cfiq->BufWriteTimeoutTyp = 0;
	cfi->cfiq->BufWriteTimeoutMax = 0;
}

It should have been pushed upstream, I will prod my co-worker.

> > This will disable using the "cfi_amdstd_write_buffers" function.
> 
> To give it a try I removed my changes and added those two lines to 
> fixup_convert_atmel_pri(), but cfi_amdstd_write_buffers() and thus 
> do_write_buffer() are still being called.

Strange... because it should never get added in the
fixup_use_write_buffers() function. Could you check the ordering in
cfi_fixup_table[]?

fixup_convert_atmel_pri must be set _before_ fixup_use_write_buffers. I
think that might be bogus upstream as well :(

> >> cfi_send_gen_cmd(0xAA, cfi->addr_unlock1, chip->start, map, cfi,
> >> cfi->device_type, NULL);
> >> cfi_send_gen_cmd(0x55, cfi->addr_unlock2, chip->start, map, cfi,
> >> cfi->device_type, NULL);
> >> //cfi_send_gen_cmd(0xA0, cfi->addr_unlock1, chip->start, map, cfi,
> >> cfi->device_type, NULL);
> >> /* Write Buffer Load */
> >> map_write(map, CMD(0x25), cmd_adr);
> >
> > This is the standard "Word program" command, take a look on page 11 in
> > the datasheet.
> 
> It would be if 0xA0 was present, but that's commented out in 
> do_write_buffer() and replaced by 0x25. That's a sequence I cannot find in 
> the Atmel documentation (and neither in the AMD/Spansion ones for that 
> matter), but as you point out do_write_buffer() shouldn't get called for 
> Atmel chips anyway.

I know, this is why the fixup for Atmel devices was added in the first
place.

> > The Atmel device has a dual-word write function, but AFAIK AMD
> > (Spansion) devices can write a lot more with a single command. Thus
> > AT49BV642D can not use the default AMD command for buffer writes.
> 
> The funny thing is that do_write_buffer() never seems to write more than 
> two words (in my case 4 bytes), so I don't understand why the bypass mode 
> isn't used anymore like in a previous incarnation of the code.

Hmmm... interesting, perhaps we can add the dual word write support for
the Atmel device but have a fixup which sets the last command according
to the device.

> > Sorry for a bit incomplete answer, but this flash device is working on
> > the ATNGW100 kit from Atmel. So it should work for you as well.
> 
> You've certainly helped me to know for certain that do_write_buffer() 
> shouldn't get called for Ateml chips. But it confuses me that Atmel seems 
> to have a different code base than the GIT repository.

We use GIT repository internally and push to the externally available
repository, and we do have some branches with drivers which are still in
review for submitting upstream.

But changes like these should have been posted earlier.

-- 
With kind regards,

Hans-Christian Egtvedt, siv.ing. (M.Sc.)
Applications Engineer - AVR32 System Solutions - Atmel Norway

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10  7:15       ` Hans-Christian Egtvedt
@ 2007-05-10  7:41         ` Michael König
  2007-05-10  8:27         ` Haavard Skinnemoen
  1 sibling, 0 replies; 13+ messages in thread
From: Michael König @ 2007-05-10  7:41 UTC (permalink / raw)
  To: Hans-Christian Egtvedt; +Cc: linux-mtd

Hello Hans-Christian...

> This is from the AVR32 GIT repository at
> git://www.atmel.no/~hskinnemoen/linux/kernel/avr32.git

That's the same fixup_convert_atmel_pri() apart from the two additional 
lines you mentioned earlier.

> Strange... because it should never get added in the
> fixup_use_write_buffers() function. Could you check the ordering in
> cfi_fixup_table[]?
> fixup_convert_atmel_pri must be set _before_ fixup_use_write_buffers. I
> think that might be bogus upstream as well :(

Good call, those entries are the other way round:

static struct cfi_fixup cfi_fixup_table[] = {
#ifdef AMD_BOOTLOC_BUG
	{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
#endif
	{ CFI_MFR_AMD, 0x0050, fixup_use_secsi, NULL, },
	{ CFI_MFR_AMD, 0x0053, fixup_use_secsi, NULL, },
	{ CFI_MFR_AMD, 0x0055, fixup_use_secsi, NULL, },
	{ CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },
	{ CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },
	{ CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },
#if !FORCE_WORD_WRITE
	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
#endif
	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
	{ 0, 0, NULL, NULL }
};

I moved "fixup_convert_atmel_pri" above "fixup_use_write_buffers" and now 
it works like expected.

>> The funny thing is that do_write_buffer() never seems to write more than
>> two words (in my case 4 bytes), so I don't understand why the bypass
>> mode  isn't used anymore like in a previous incarnation of the code.
>
> Hmmm... interesting, perhaps we can add the dual word write support for
> the Atmel device but have a fixup which sets the last command according
> to the device.

At least my traces show that do_write_buffer() seems to be always called 
with two words. I guess you'll have to do your own testing to confirm that.

> But changes like these should have been posted earlier.

Hopefully those changes will be posted soon, before someone else runs into 
the same problem.

Thanks for your help; now I have a clean solution rather than my crude hack.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10  7:15       ` Hans-Christian Egtvedt
  2007-05-10  7:41         ` Michael König
@ 2007-05-10  8:27         ` Haavard Skinnemoen
  2007-05-10 10:13           ` Michael König
  1 sibling, 1 reply; 13+ messages in thread
From: Haavard Skinnemoen @ 2007-05-10  8:27 UTC (permalink / raw)
  To: Hans-Christian Egtvedt; +Cc: linux-mtd, Michael König

On Thu, 10 May 2007 09:15:48 +0200
Hans-Christian Egtvedt <hcegtvedt@atmel.com> wrote:

> This is from the AVR32 GIT repository at
> git://www.atmel.no/~hskinnemoen/linux/kernel/avr32.git

[...]

> It should have been pushed upstream, I will prod my co-worker.

No, only the avr32-arch branch from that repository containts stuff
that is pushed upstream directly. Anything that is not completely
AVR32-specific is sent as patches to the appropriate maintainers for
review.

So if you have the patch available, now would probably be a good time
to post it ;-)

Haavard

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10  8:27         ` Haavard Skinnemoen
@ 2007-05-10 10:13           ` Michael König
  2007-05-10 10:24             ` Hans-Christian Egtvedt
                               ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Michael König @ 2007-05-10 10:13 UTC (permalink / raw)
  To: Haavard Skinnemoen, Hans-Christian Egtvedt; +Cc: linux-mtd

[-- Attachment #1: Type: text/plain, Size: 1165 bytes --]

> So if you have the patch available, now would probably be a good time
> to post it ;-)

Unfortunately I don't have any experience with GIT and also don't have the 
time to set it up right now, but I'm attaching a "diff -p" for the changes 
to the latest cfi_cmdset_0002.c in the repository.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

ipcas GmbH
Wetterkreuz 17
91058 Erlangen, Germany
Tel.: +49 9131 7677-31
Fax: +49 9131 7677-78
mailto:Michael.Koenig@ipcas.de

Geschäftsführer: Dipl.-Ing. S. Sutiono
Sitz der Gesellschaft: Erlangen
Registergericht: Fürth, HBR 3676
WEEE-Reg.-Nr. DE 77202473

Hinweis: Diese E-Mail und etwaige Anlagen können Betriebs- oder
Geschäftsgeheimnisse, dem Anwaltsgeheimnis unterliegen oder sonstige
vertrauliche Informationen enthalten. Sollten Sie diese E-Mail
irrtümlich erhalten haben, ist Ihnen der Status dieser E-Mail bekannt.
Bitte benachrichtigen Sie uns in diesem Fall sofort durch Antwort-Mail
und löschen Sie diese E-Mail nebst etwaigen Anlagen von Ihrem System.
Ebenso dürfen Sie diese E-Mail oder seine Anlagen
nicht kopieren oder an Dritte weitergeben. Vielen Dank.

[-- Attachment #2: cfi_cmdset_0002.diff --]
[-- Type: application/octet-stream, Size: 1381 bytes --]

*** a/drivers/mtd/chips/cfi_cmdset_0002.c	2007-05-10 04:06:58.000000000 -0400
--- b/drivers/mtd/chips/cfi_cmdset_0002.c	2007-05-10 04:53:03.000000000 -0400
*************** static void fixup_convert_atmel_pri(stru
*** 185,190 ****
--- 185,194 ----
  		extp->TopBottom = 2;
  	else
  		extp->TopBottom = 3;
+ 
+ 	/* burst write mode not supported */
+ 	cfi->cfiq->BufWriteTimeoutTyp = 0;
+ 	cfi->cfiq->BufWriteTimeoutMax = 0;
  }
  
  static void fixup_use_secsi(struct mtd_info *mtd, void *param)
*************** static struct cfi_fixup cfi_fixup_table[
*** 226,235 ****
  	{ CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },
  	{ CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },
  	{ CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },
  #if !FORCE_WORD_WRITE
  	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
  #endif
- 	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
  	{ 0, 0, NULL, NULL }
  };
  static struct cfi_fixup jedec_fixup_table[] = {
--- 230,239 ----
  	{ CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },
  	{ CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },
  	{ CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },
+ 	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
  #if !FORCE_WORD_WRITE
  	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
  #endif
  	{ 0, 0, NULL, NULL }
  };
  static struct cfi_fixup jedec_fixup_table[] = {

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10 10:13           ` Michael König
@ 2007-05-10 10:24             ` Hans-Christian Egtvedt
  2007-05-10 10:41             ` Haavard Skinnemoen
  2007-08-06 13:41             ` Ricard Wanderlof
  2 siblings, 0 replies; 13+ messages in thread
From: Hans-Christian Egtvedt @ 2007-05-10 10:24 UTC (permalink / raw)
  To: Michael König; +Cc: linux-mtd, Haavard Skinnemoen

On Thu, 2007-05-10 at 12:13 +0200, Michael König wrote:
> > So if you have the patch available, now would probably be a good time
> > to post it ;-)
> 
> Unfortunately I don't have any experience with GIT and also don't have the 
> time to set it up right now, but I'm attaching a "diff -p" for the changes 
> to the latest cfi_cmdset_0002.c in the repository.

Ah, very similar to the patch I posted against 2.6.20. The email is held
for approval for some reason, but this patch will do the same. Only
difference is that I put fixup_convert_atmel_pri on the top, since none
of the other fixups should read anything from an Atmel device CFI
information before it has been corrected.

-- 
With kind regards,

Hans-Christian Egtvedt, siv.ing. (M.Sc.)
Applications Engineer - AVR32 System Solutions - Atmel Norway

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10 10:13           ` Michael König
  2007-05-10 10:24             ` Hans-Christian Egtvedt
@ 2007-05-10 10:41             ` Haavard Skinnemoen
  2007-08-06 13:41             ` Ricard Wanderlof
  2 siblings, 0 replies; 13+ messages in thread
From: Haavard Skinnemoen @ 2007-05-10 10:41 UTC (permalink / raw)
  To: Michael König; +Cc: linux-mtd, Hans-Christian Egtvedt

On Thu, 10 May 2007 12:13:05 +0200
Michael König <Michael.Koenig@ipcas.de> wrote:

> > So if you have the patch available, now would probably be a good time
> > to post it ;-)  
> 
> Unfortunately I don't have any experience with GIT and also don't have the 
> time to set it up right now, but I'm attaching a "diff -p" for the changes 
> to the latest cfi_cmdset_0002.c in the repository.

Sorry, that comment was meant for Hans-Christian. But your patch looks
good too :-)

Haavard

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: Problems with cfi_cmdset_0002 and Atmel AT49BV642D
  2007-05-10 10:13           ` Michael König
  2007-05-10 10:24             ` Hans-Christian Egtvedt
  2007-05-10 10:41             ` Haavard Skinnemoen
@ 2007-08-06 13:41             ` Ricard Wanderlof
  2 siblings, 0 replies; 13+ messages in thread
From: Ricard Wanderlof @ 2007-08-06 13:41 UTC (permalink / raw)
  To: Linux mtd


On Thu, 10 May 2007, Michael König wrote:

>> So if you have the patch available, now would probably be a good time
>> to post it ;-)
>
> Unfortunately I don't have any experience with GIT and also don't have the 
> time to set it up right now, but I'm attaching a "diff -p" for the changes to 
> the latest cfi_cmdset_0002.c in the repository.

This was a long time ago, is there any reason the supplied patch was never 
committed?

/Ricard

(for reference, since it was a while ago, the patch follows below)

--------------8<------------------

From Michael.Koenig@ipcas.de Thu May 10 10:44:49 2007
Date: Thu, 10 May 2007 10:42:53 +0200
From: "[UTF-8] Michael König" <Michael.Koenig@ipcas.de>
To: dev-etrax@axis.com
Subject: Atmel Flash Fix: cfi_cmdset_0002.c (was: MTD problems)

     [ The following text is in the "utf-8" character set. ]
     [ Your display is set for the "ISO-8859-1" character set.  ]
     [ Some characters may be displayed incorrectly. ]

Hello again,

with the help of Hans-Christian Egtvedt from Atmel (thanks!) I was able to
track down my issues with the Atmel Flash.

On Atmel Flashes the do_write_buffer() function is not supposed to be
called, and it seems that some patches to make sure of that weren't applied
to the code in the Linux kernel GIT.

The following changes have to be applied to this file:
drivers/mtd/chips/cfi_cmdset_0002.c


Two lines (not counting the comment) are added to fixup_convert_atmel_pri():

static void fixup_convert_atmel_pri(struct mtd_info *mtd, void *param)
{
 	struct map_info *map = mtd->priv;
 	struct cfi_private *cfi = map->fldrv_priv;
 	struct cfi_pri_amdstd *extp = cfi->cmdset_priv;
 	struct cfi_pri_atmel atmel_pri;

 	memcpy(&atmel_pri, extp, sizeof(atmel_pri));
 	memset((char *)extp + 5, 0, sizeof(*extp) - 5);

 	if (atmel_pri.Features & 0x02)
 		extp->EraseSuspend = 2;

 	if (atmel_pri.BottomBoot)
 		extp->TopBottom = 2;
 	else
 		extp->TopBottom = 3;

 	/* burst write mode not supported */
 	cfi->cfiq->BufWriteTimeoutTyp = 0;
 	cfi->cfiq->BufWriteTimeoutMax = 0;
}


In the cfi_fixup_table[] "fixup_convert_atmel_pri" has to appear before
"fixup_use_write_buffers":

static struct cfi_fixup cfi_fixup_table[] = {
#ifdef AMD_BOOTLOC_BUG
 	{ CFI_MFR_AMD, CFI_ID_ANY, fixup_amd_bootblock, NULL },
#endif
 	{ CFI_MFR_AMD, 0x0050, fixup_use_secsi, NULL, },
 	{ CFI_MFR_AMD, 0x0053, fixup_use_secsi, NULL, },
 	{ CFI_MFR_AMD, 0x0055, fixup_use_secsi, NULL, },
 	{ CFI_MFR_AMD, 0x0056, fixup_use_secsi, NULL, },
 	{ CFI_MFR_AMD, 0x005C, fixup_use_secsi, NULL, },
 	{ CFI_MFR_AMD, 0x005F, fixup_use_secsi, NULL, },
 	{ CFI_MFR_ATMEL, CFI_ID_ANY, fixup_convert_atmel_pri, NULL },
#if !FORCE_WORD_WRITE
 	{ CFI_MFR_ANY, CFI_ID_ANY, fixup_use_write_buffers, NULL, },
#endif
 	{ 0, 0, NULL, NULL }
};


Now Atmel Flash chips should work correctly with the latest SDK, at least my
AT49BV642D does.

-- 
Mit freundlichen Grüßen
Best regards
Michael König

-------------8<---------

--
Ricard Wolf Wanderlöf                           ricardw(at)axis.com
Axis Communications AB, Lund, Sweden            www.axis.com
Phone +46 46 272 2016                           Fax +46 46 13 61 30

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2007-08-06 13:40 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-08  8:44 Problems with cfi_cmdset_0002 and Atmel AT49BV642D Michael König
2007-05-08 11:49 ` Vitaly Wool
2007-05-08 13:04   ` Michael König
2007-05-09 13:34 ` Michael König
2007-05-09 13:46   ` Hans-Christian Egtvedt
2007-05-10  6:53     ` Michael König
2007-05-10  7:15       ` Hans-Christian Egtvedt
2007-05-10  7:41         ` Michael König
2007-05-10  8:27         ` Haavard Skinnemoen
2007-05-10 10:13           ` Michael König
2007-05-10 10:24             ` Hans-Christian Egtvedt
2007-05-10 10:41             ` Haavard Skinnemoen
2007-08-06 13:41             ` Ricard Wanderlof

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox