mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	Refresh patches.
Remove upstreamed patches:
- backport/096-mips-math-emu-Write-protect-delay-slot-emulation-pages.patch
- pending/510-f2fs-fix-sanity_check_raw_super-on-big-endian-machines.patch
- brcm2708/950-0415-qmi_wwan-apply-SET_DTR-quirk-to-the-SIMCOM-shared-de.patch
Compile-tested: ar71xx, ath79, brcm2708/bcm27{08,10}, octeon, x86/64
Runtime-tested: ar71xx, ath79, brcm2708/bcm27{08,10}, octeon, x86/64
Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
		
	
			
		
			
				
	
	
		
			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);
 |