From 351a3d1a648a3fe6a50b9c44d9408f5672e859d7 Mon Sep 17 00:00:00 2001
From: matteo <matteo@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Mon, 17 Sep 2007 12:45:38 +0000
Subject: detect ar7 at runtime in set_except_vector and remove useless
 volatile

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@8824 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 .../ar7/patches-2.6.22/100-board_support.patch     | 46 ++++++++++++----------
 1 file changed, 25 insertions(+), 21 deletions(-)

(limited to 'target/linux/ar7')

diff --git a/target/linux/ar7/patches-2.6.22/100-board_support.patch b/target/linux/ar7/patches-2.6.22/100-board_support.patch
index 0297ef651..c7ea6cc2a 100644
--- a/target/linux/ar7/patches-2.6.22/100-board_support.patch
+++ b/target/linux/ar7/patches-2.6.22/100-board_support.patch
@@ -26,31 +26,35 @@ diff -urN linux-2.6.22/arch/mips/Kconfig linux-2.6.22.new/arch/mips/Kconfig
 diff -urN linux-2.6.22/arch/mips/kernel/traps.c linux-2.6.22.new/arch/mips/kernel/traps.c
 --- linux-2.6.22/arch/mips/kernel/traps.c	2007-07-09 01:32:17.000000000 +0200
 +++ linux-2.6.22.new/arch/mips/kernel/traps.c	2007-07-11 02:32:39.000000000 +0200
-@@ -1075,9 +1075,23 @@ void *set_except_vector(int n, void *addr)
+@@ -1074,11 +1074,23 @@ void *set_except_vector(int n, void *addr)
+ 	unsigned long old_handler = exception_handlers[n];
  
  	exception_handlers[n] = handler;
- 	if (n == 0 && cpu_has_divec) {
-+#ifdef CONFIG_AR7
-+		/* lui k0, 0x0000 */
-+		*(volatile u32 *)(ebase + 0x200) =
-+				0x3c1a0000 | (handler >> 16);
-+		/* ori k0, 0x0000 */
-+		*(volatile u32 *)(ebase + 0x204) =
-+				0x375a0000 | (handler & 0xffff);
-+		/* jr k0 */
-+		*(volatile u32 *)(ebase + 0x208) = 0x03400008;
-+		/* nop */
-+		*(volatile u32 *)(ebase + 0x20C) = 0x00000000;
-+		flush_icache_range(ebase + 0x200, ebase + 0x210);
-+#else
- 		*(volatile u32 *)(ebase + 0x200) = 0x08000000 |
- 		                                 (0x03ffffff & (handler >> 2));
- 		flush_icache_range(ebase + 0x200, ebase + 0x204);
-+#endif
- 	}
+-	if (n == 0 && cpu_has_divec) {
+-		*(volatile u32 *)(ebase + 0x200) = 0x08000000 |
+-		                                 (0x03ffffff & (handler >> 2));
+-		flush_icache_range(ebase + 0x200, ebase + 0x204);
+-	}
++	if (n == 0 && cpu_has_divec)
++		if ((handler ^ (ebase + 4)) & 0xfc000000) {
++			/* lui k0, 0x0000 */
++			*(u32 *)(ebase + 0x200) = 0x3c1a0000 | (handler >> 16);
++			/* ori k0, 0x0000 */
++			*(u32 *)(ebase + 0x204) =
++					0x375a0000 | (handler & 0xffff);
++			/* jr k0 */
++			*(u32 *)(ebase + 0x208) = 0x03400008;
++			/* nop */
++			*(u32 *)(ebase + 0x20C) = 0x00000000;
++			flush_icache_range(ebase + 0x200, ebase + 0x210);
++		} else {
++			*(volatile u32 *)(ebase + 0x200) =
++				0x08000000 | (0x03ffffff & (handler >> 2));
++			flush_icache_range(ebase + 0x200, ebase + 0x204);
++		}
  	return (void *)old_handler;
  }
-
+ 
 diff -urN linux-2.6.22/arch/mips/Makefile linux-2.6.22.new/arch/mips/Makefile
 --- linux-2.6.22/arch/mips/Makefile	2007-07-09 01:32:17.000000000 +0200
 +++ linux-2.6.22.new/arch/mips/Makefile	2007-07-11 02:32:39.000000000 +0200
-- 
cgit v1.2.3