/* old function */ static int __init memsize(void) { u32 size = (64 << 20); volatile u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4); u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end)); while (addr > kernel_end) { *addr = (u32)addr; size >>= 1; addr -= size >> 2; } do { addr += size >> 2; if (*addr != (u32)addr) break; size <<= 1; } while (size < (64 << 20)); return size; } /* new one without volatile */ int __init memsize(void) { u32 size = (64 << 20); u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4); u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end)); u32 *tmpaddr = addr; while (tmpaddr > kernel_end) { *tmpaddr = (u32)tmpaddr; size >>= 1; tmpaddr -= size >> 2; } do { tmpaddr += size >> 2; if (*tmpaddr != (u32)tmpaddr) break; size <<= 1; } while (size < (64 << 20)); writel(tmpaddr, &addr); return size; } /* the diff Index: target/linux/ar7/files/arch/mips/ar7/memory.c =================================================================== --- target/linux/ar7/files/arch/mips/ar7/memory.c (revisione 10748) +++ target/linux/ar7/files/arch/mips/ar7/memory.c (copia locale) @@ -37,22 +37,25 @@ static int __init memsize(void) { u32 size = (64 << 20); - volatile u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4); + u32 *addr = (u32 *)KSEG1ADDR(0x14000000 + size - 4); u32 *kernel_end = (u32 *)KSEG1ADDR(CPHYSADDR((u32)&_end)); + u32 *tmpaddr = addr; - while (addr > kernel_end) { - *addr = (u32)addr; + while (tmpaddr > kernel_end) { + *tmpaddr = (u32)tmpaddr; size >>= 1; - addr -= size >> 2; + tmpaddr -= size >> 2; } do { - addr += size >> 2; - if (*addr != (u32)addr) + tmpaddr += size >> 2; + if (*tmpaddr != (u32)tmpaddr) break; size <<= 1; } while (size < (64 << 20)); + writel(tmpaddr, &addr); + return size; } */