mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-26 00:41:17 +00:00
8fe5ad5d33
This change makes the names of Broadcom targets consistent by using the common notation based on SoC/CPU ID (which is used internally anyway), bcmXXXX instead of brcmXXXX. This is even used for target TITLE in make menuconfig already, only the short target name used brcm so far. Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
79 lines
2.5 KiB
Diff
79 lines
2.5 KiB
Diff
From: Jeff Hansen <jhansen@cardaccess-inc.com>
|
|
Subject: [PATCH] kmap_coherent
|
|
|
|
On ASUS WL-500gP there are some "Data bus error"s when executing simple
|
|
commands liks "ps" or "cat /proc/1/cmdline".
|
|
|
|
This fixes OpenWrt ticket #1485: https://dev.openwrt.org/ticket/1485
|
|
---
|
|
--- a/arch/mips/include/asm/cpu-features.h
|
|
+++ b/arch/mips/include/asm/cpu-features.h
|
|
@@ -187,6 +187,9 @@
|
|
#ifndef cpu_has_local_ebase
|
|
#define cpu_has_local_ebase 1
|
|
#endif
|
|
+#ifndef cpu_use_kmap_coherent
|
|
+#define cpu_use_kmap_coherent 1
|
|
+#endif
|
|
|
|
/*
|
|
* I-Cache snoops remote store. This only matters on SMP. Some multiprocessors
|
|
--- a/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
|
|
+++ b/arch/mips/include/asm/mach-bcm47xx/cpu-feature-overrides.h
|
|
@@ -80,4 +80,6 @@
|
|
#define cpu_scache_line_size() 0
|
|
#define cpu_has_vz 0
|
|
|
|
+#define cpu_use_kmap_coherent 0
|
|
+
|
|
#endif /* __ASM_MACH_BCM47XX_CPU_FEATURE_OVERRIDES_H */
|
|
--- a/arch/mips/mm/c-r4k.c
|
|
+++ b/arch/mips/mm/c-r4k.c
|
|
@@ -694,7 +694,7 @@ static inline void local_r4k_flush_cache
|
|
map_coherent = (cpu_has_dc_aliases &&
|
|
page_mapcount(page) &&
|
|
!Page_dcache_dirty(page));
|
|
- if (map_coherent)
|
|
+ if (map_coherent && cpu_use_kmap_coherent)
|
|
vaddr = kmap_coherent(page, addr);
|
|
else
|
|
vaddr = kmap_atomic(page);
|
|
@@ -719,7 +719,7 @@ static inline void local_r4k_flush_cache
|
|
}
|
|
|
|
if (vaddr) {
|
|
- if (map_coherent)
|
|
+ if (map_coherent && cpu_use_kmap_coherent)
|
|
kunmap_coherent();
|
|
else
|
|
kunmap_atomic(vaddr);
|
|
--- a/arch/mips/mm/init.c
|
|
+++ b/arch/mips/mm/init.c
|
|
@@ -170,7 +170,7 @@ void copy_user_highpage(struct page *to,
|
|
void *vfrom, *vto;
|
|
|
|
vto = kmap_atomic(to);
|
|
- if (cpu_has_dc_aliases &&
|
|
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
|
page_mapcount(from) && !Page_dcache_dirty(from)) {
|
|
vfrom = kmap_coherent(from, vaddr);
|
|
copy_page(vto, vfrom);
|
|
@@ -192,7 +192,7 @@ void copy_to_user_page(struct vm_area_st
|
|
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
|
unsigned long len)
|
|
{
|
|
- if (cpu_has_dc_aliases &&
|
|
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
|
page_mapcount(page) && !Page_dcache_dirty(page)) {
|
|
void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
|
memcpy(vto, src, len);
|
|
@@ -210,7 +210,7 @@ void copy_from_user_page(struct vm_area_
|
|
struct page *page, unsigned long vaddr, void *dst, const void *src,
|
|
unsigned long len)
|
|
{
|
|
- if (cpu_has_dc_aliases &&
|
|
+ if (cpu_has_dc_aliases && cpu_use_kmap_coherent &&
|
|
page_mapcount(page) && !Page_dcache_dirty(page)) {
|
|
void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
|
|
memcpy(dst, vfrom, len);
|