Commit d3864767 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Ralf Baechle

mips/ide: flush dcache also if icache does not snoop dcache

If this is not done then the new just read data which remains in dcache
will not make it into icache on time. Thus the CPU loads invalid data
and executes crap. The result is that the user is not able to execute
anything from its IDE based media while reading plain data is still
working well.

This problem has been reported as Debian #404951
http://bugs.debian.org/404951
http://comments.gmane.org/gmane.linux.ide/45092Signed-off-by: default avatarSebastian Andrzej Siewior <sebastian@breakpoint.cc>
Signed-off-by: default avatarJohn Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/2820/
parent 3c06b12b
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
static inline void __ide_flush_prologue(void) static inline void __ide_flush_prologue(void)
{ {
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (cpu_has_dc_aliases) if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
preempt_disable(); preempt_disable();
#endif #endif
} }
...@@ -31,14 +31,14 @@ static inline void __ide_flush_prologue(void) ...@@ -31,14 +31,14 @@ static inline void __ide_flush_prologue(void)
static inline void __ide_flush_epilogue(void) static inline void __ide_flush_epilogue(void)
{ {
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
if (cpu_has_dc_aliases) if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
preempt_enable(); preempt_enable();
#endif #endif
} }
static inline void __ide_flush_dcache_range(unsigned long addr, unsigned long size) static inline void __ide_flush_dcache_range(unsigned long addr, unsigned long size)
{ {
if (cpu_has_dc_aliases) { if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc) {
unsigned long end = addr + size; unsigned long end = addr + size;
while (addr < end) { while (addr < end) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment