kernel/jedec.c bug?
Changwoo Ryu
cwryu at debian.org
Wed Feb 21 20:31:51 EST 2001
Hello,
I'm using the MachZ (x86 compatible PC-on-a-chip) evaluation system.
It is equipped with AM29F017 2MB (8bit * 256k) flash, which is
compatible with AM29F016 except the device ID (0x3D). But I failed to
erase a block at flash_earse() function in jedec.c. Here it is:
/* During erase bit 7 is held low and bit 6 toggles, we watch this,
should it stop toggling or go high then the erase is completed,
or this is not really flash ;> */
Last[0] = map->read32(map,(chip->base >> chip->addrshift) + chip->start
+ off);
Last[1] = map->read32(map,(chip->base >> chip->addrshift) + chip->start
+ off);
Last[2] = map->read32(map,(chip->base >> chip->addrshift) + chip->start
+ off);
Count = 3;
while (todo_left != 0)
{
for (J = 0; J != 4; J++)
{
__u8 Byte1 = (Last[(Count-1)%4] >> (J*8)) & 0xFF;
__u8 Byte2 = (Last[(Count-2)%4] >> (J*8)) & 0xFF;
__u8 Byte3 = (Last[(Count-3)%4] >> (J*8)) & 0xFF;
if (todo[J] == 0)
continue;
if ((Byte1 & (1 << 7)) == 0 && Byte1 != Byte2)
{
// printk("Check %x %x %x\n",(short)J,(short)Byte1,(short)Byte2);
continue;
}
if (Byte1 == Byte2)
{
jedec_flash_failed(Byte3);
return -EIO;
}
Last[0], Last[1] and Last[2] for my flash are all "0x084C084C". It's
ok, isn't? Reading 32bit data requires 4 reads (0x08, 0x4C, 0x08,
0x4C) from the 8bit flash. So when the erasure is not completed, the
two 32bit values should be same.
--
Changwoo Ryu
To unsubscribe, send "unsubscribe mtd" to majordomo at infradead.org
More information about the linux-mtd
mailing list