Index: arch/mips/mm/c-r4k.c =================================================================== RCS file: /cvs/linux/arch/mips/mm/c-r4k.c,v retrieving revision 1.3 diff -u -r1.3 c-r4k.c --- arch/mips/mm/c-r4k.c 2001/11/30 13:28:06 1.3 +++ arch/mips/mm/c-r4k.c 2001/12/14 13:17:16 @@ -1158,22 +1158,19 @@ unsigned long end, a; unsigned int flags; - if (size >= dcache_size) { - flush_cache_all(); - } else { - /* Workaround for R4600 bug. See comment above. */ - __save_and_cli(flags); - *(volatile unsigned long *)KSEG1; - - a = addr & ~(dc_lsize - 1); - end = (addr + size) & ~(dc_lsize - 1); - while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ - if (a == end) break; - a += dc_lsize; - } - __restore_flags(flags); + /* Workaround for R4600 bug. See comment above. */ + __save_and_cli(flags); + *(volatile unsigned long *)KSEG1; + + a = addr & ~(dc_lsize - 1); + end = (addr + size) & ~(dc_lsize - 1); + while (1) { + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + if (a == end) break; + a += dc_lsize; } + __restore_flags(flags); + bc_wback_inv(addr, size); } @@ -1182,11 +1179,6 @@ { unsigned long end, a; - if (size >= scache_size) { - flush_cache_all(); - return; - } - a = addr & ~(sc_lsize - 1); end = (addr + size) & ~(sc_lsize - 1); while (1) { @@ -1201,23 +1193,24 @@ { unsigned long end, a; unsigned int flags; + + /* Workaround for R4600 bug. See comment above. */ + __save_and_cli(flags); + *(volatile unsigned long *)KSEG1; + + a = addr & ~(dc_lsize - 1); + end = (addr + size) & ~(dc_lsize - 1); + + flush_dcache_line(a); /* Hit_Writeback_Inv_D */ + flush_dcache_line(end); - if (size >= dcache_size) { - flush_cache_all(); - } else { - /* Workaround for R4600 bug. See comment above. */ - __save_and_cli(flags); - *(volatile unsigned long *)KSEG1; - - a = addr & ~(dc_lsize - 1); - end = (addr + size) & ~(dc_lsize - 1); - while (1) { - flush_dcache_line(a); /* Hit_Writeback_Inv_D */ - if (a == end) break; - a += dc_lsize; - } - __restore_flags(flags); + a+=dc_lsize; + + while (a= scache_size) { - flush_cache_all(); - return; - } - a = addr & ~(sc_lsize - 1); end = (addr + size) & ~(sc_lsize - 1); - while (1) { - flush_scache_line(a); /* Hit_Writeback_Inv_SD */ - if (a == end) break; + + flush_scache_line(a); /* Hit_Writeback_Inv_SD */ + flush_scache_line(end); + + a+=sc_lsize; + + while (a