Hi. In the r2300.c ,in some functions ( like the r3k_cache_size and so on ), the CONFIG register is modified. To return this register to initial state, the save_and_cli(flags) and the restore_flags(flags) functions are used. The restore_flags do not modify whole STATUS register, but only the Interrupt Enable bit. So we should use the read_32bit_cp0_register and the write_32bit_cp0_register functions instead ( like it was in linux-2.4.1 ). And also, this patch adds R3081E CPU support to the ld_mmu_r2300() function. diff -u -r1.12 r2300.c --- arch/mips/mm/r2300.c 2001/05/31 14:27:32 1.12 +++ arch/mips/mm/r2300.c 2001/06/06 17:10:47 @@ -125,7 +125,7 @@ p = (volatile unsigned long *) KSEG0; - save_and_cli(flags); + flags = read_32bit_cp0_register(CP0_STATUS); /* isolate cache space */ write_32bit_cp0_register(CP0_STATUS, (ca_flags|flags)&~ST0_IEC); @@ -147,7 +147,7 @@ if (size > 0x40000) size = 0; } - restore_flags(flags); + write_32bit_cp0_register(CP0_STATUS, flags); return size * sizeof(*p); } @@ -170,7 +170,7 @@ if (size > icache_size) size = icache_size; - save_and_cli(flags); + flags = read_32bit_cp0_register(CP0_STATUS); /* isolate cache space */ write_32bit_cp0_register(CP0_STATUS, (ST0_ISC|ST0_SWC|flags)&~ST0_IEC); @@ -212,7 +212,7 @@ p += 0x080; } - restore_flags(flags); + write_32bit_cp0_register(CP0_STATUS,flags); } static void r3k_flush_dcache_range(unsigned long start, unsigned long end) @@ -224,7 +224,7 @@ if (size > dcache_size) size = dcache_size; - save_and_cli(flags); + flags = read_32bit_cp0_register(CP0_STATUS); /* isolate cache space */ write_32bit_cp0_register(CP0_STATUS, (ST0_ISC|flags)&~ST0_IEC); @@ -266,7 +266,7 @@ p += 0x080; } - restore_flags(flags); + write_32bit_cp0_register(CP0_STATUS,flags); } static inline unsigned long get_phys_page (unsigned long addr, @@ -714,6 +714,7 @@ case CPU_R3000: case CPU_R3000A: case CPU_R3081: + case CPU_R3081E: r3k_probe_cache();