mtd/drivers/mtd/chips jedec_probe.c,1.55,1.56
ebiederman at lnxi.com
ebiederman at lnxi.com
Fri Sep 17 03:45:09 EDT 2004
Update of /home/cvs/mtd/drivers/mtd/chips
In directory phoenix.infradead.org:/tmp/cvs-serv10962
Modified Files:
jedec_probe.c
Log Message:
- General cleanups
- Avoid an overflowing a small map when interleaving is enabled
Index: jedec_probe.c
===================================================================
RCS file: /home/cvs/mtd/drivers/mtd/chips/jedec_probe.c,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -r1.55 -r1.56
--- jedec_probe.c 13 Sep 2004 17:41:55 -0000 1.55
+++ jedec_probe.c 17 Sep 2004 07:45:05 -0000 1.56
@@ -182,8 +182,8 @@
struct unlock_addr {
- int addr1;
- int addr2;
+ u32 addr1;
+ u32 addr2;
};
@@ -1654,20 +1654,20 @@
{
map_word result;
unsigned long mask;
+ u32 ofs = cfi_build_cmd_addr(0, cfi_interleave(cfi), cfi->device_type);
mask = (1 << (cfi->device_type * 8)) -1;
- result = map_read(map, base);
+ result = map_read(map, base + ofs);
return result.x[0] & mask;
}
static inline u32 jedec_read_id(struct map_info *map, __u32 base,
struct cfi_private *cfi)
{
- int osf;
map_word result;
unsigned long mask;
- osf = cfi->interleave *cfi->device_type;
+ u32 ofs = cfi_build_cmd_addr(1, cfi_interleave(cfi), cfi->device_type);
mask = (1 << (cfi->device_type * 8)) -1;
- result = map_read(map, base + osf);
+ result = map_read(map, base + ofs);
return result.x[0] & mask;
}
@@ -1826,7 +1826,7 @@
DEBUG( MTD_DEBUG_LEVEL3,
"MTD %s(): Check fit 0x%.8x + 0x%.8x = 0x%.8x\n",
__func__, base, 1 << finfo->DevSize, base + (1 << finfo->DevSize) );
- if ( base + cfi->interleave * ( 1 << finfo->DevSize ) > map->size ) {
+ if ( base + cfi_interleave(cfi) * ( 1 << finfo->DevSize ) > map->size ) {
DEBUG( MTD_DEBUG_LEVEL3,
"MTD %s(): 0x%.4x 0x%.4x %dKiB doesn't fit\n",
__func__, finfo->mfr_id, finfo->dev_id,
@@ -1845,10 +1845,10 @@
&& ( unlock_addrs[uaddr].addr1 != cfi->addr_unlock1 ||
unlock_addrs[uaddr].addr2 != cfi->addr_unlock2 ) ) {
DEBUG( MTD_DEBUG_LEVEL3,
- "MTD %s(): 0x%.4lx 0x%.4lx did not match\n",
- __func__,
- unlock_addrs[uaddr].addr1
- unlock_addrs[uaddr].addr2);
+ "MTD %s(): 0x%.4x 0x%.4x did not match\n",
+ __func__,
+ unlock_addrs[uaddr].addr1,
+ unlock_addrs[uaddr].addr2);
goto match_done;
}
@@ -1900,6 +1900,7 @@
{
int i;
enum uaddr uaddr_idx = MTD_UADDR_NOT_SUPPORTED;
+ u32 probe_offset1, probe_offset2;
retry:
if (!cfi->numchips) {
@@ -1921,21 +1922,21 @@
return 0;
}
- if ((base + cfi->addr_unlock1) >= map->size) {
- printk(KERN_NOTICE
- "Probe at addr_unlock1(0x%08x + 0x%08x) past the end of the map(0x%08lx)\n",
- base, cfi->addr_unlock1, map->size -1);
-
- return 0;
+ /* Ensure the unlock addresses we try stay inside the map */
+ probe_offset1 = cfi_build_cmd_addr(
+ cfi->addr_unlock1,
+ cfi_interleave(cfi),
+ cfi->device_type);
+ probe_offset2 = cfi_build_cmd_addr(
+ cfi->addr_unlock1,
+ cfi_interleave(cfi),
+ cfi->device_type);
+ if ( ((base + probe_offset1 + map_bankwidth(map)) >= map->size) ||
+ ((base + probe_offset2 + map_bankwidth(map)) >= map->size))
+ {
+ goto retry;
}
- if ((base + cfi->addr_unlock2) >= map->size) {
- printk(KERN_NOTICE
- "Probe at addr_unlock2(0x%08x + 0x%08x) past the end of the map(0x%08lx)\n",
- base, cfi->addr_unlock2, map->size -1);
- return 0;
- }
-
/* Reset */
jedec_reset(base, map, cfi);
@@ -1955,7 +1956,7 @@
cfi->id = jedec_read_id(map, base, cfi);
DEBUG(MTD_DEBUG_LEVEL3,
"Search for id:(%02x %02x) interleave(%d) type(%d)\n",
- cfi->mfr, cfi->id, cfi->interleave, cfi->device_type);
+ cfi->mfr, cfi->id, cfi_interleave(cfi), cfi->device_type);
for (i=0; i<sizeof(jedec_table)/sizeof(jedec_table[0]); i++) {
if ( jedec_match( base, map, cfi, &jedec_table[i] ) ) {
DEBUG( MTD_DEBUG_LEVEL3,
@@ -2029,7 +2030,7 @@
jedec_reset(base, map, cfi);
printk(KERN_INFO "%s: Found %d x%d devices at 0x%x in %d-bit bank\n",
- map->name, cfi->interleave, cfi->device_type*8, base,
+ map->name, cfi_interleave(cfi), cfi->device_type*8, base,
map->bankwidth*8);
return 1;
More information about the linux-mtd-cvs
mailing list