diff -ruN linux-2.4.30-010/arch/mips/ar7/cmdline.c linux-2.4.30-011/arch/mips/ar7/cmdline.c
--- linux-2.4.30-010/arch/mips/ar7/cmdline.c	2005-11-07 16:10:29.000000000 +0100
+++ linux-2.4.30-011/arch/mips/ar7/cmdline.c	2005-11-07 16:21:44.000000000 +0100
@@ -32,6 +32,9 @@
 #define prom_argv(index) ((char *)(((int *)(int)_prom_argv)[(index)]))
 
 char arcs_cmdline[CL_SIZE];
+#ifdef CONFIG_CMDLINE_BOOL
+char __initdata cfg_cmdline[] = CONFIG_CMDLINE;
+#endif
 
 char * __init prom_getcmdline(void)
 {
@@ -41,20 +44,41 @@
 
 void  __init prom_init_cmdline(void)
 {
-	char *cp;
+	char *cp, *end;
 	int actr;
+	char *env_cmdline = prom_getenv("kernel_args");
+	size_t len;
 
 	actr = 1; /* Always ignore argv[0] */
 
-	cp = &(arcs_cmdline[0]);
+	cp = end = &(arcs_cmdline[0]);
+	end += sizeof(arcs_cmdline);
+
+	if (env_cmdline) {
+		len = strlen(env_cmdline);
+		if (len > end - cp - 1)
+			len = end - cp - 1;
+		strncpy(cp, env_cmdline, len);
+		cp += len;
+		*cp++ = ' ';
+	}
 #ifdef CONFIG_CMDLINE_BOOL
-	strcpy(cp, CONFIG_CMDLINE);
-	cp += strlen(CONFIG_CMDLINE);
-	*cp++ = ' ';
+	else {
+		len = strlen(cfg_cmdline);
+		if (len > end - cp - 1)
+			len = end - cp - 1;
+		strncpy(cp, cfg_cmdline, len);
+		cp += len;
+		*cp++ = ' ';
+	}
 #endif
+
 	while(actr < prom_argc) {
-		strcpy(cp, prom_argv(actr));
-		cp += strlen(prom_argv(actr));
+		len = strlen(prom_argv(actr));
+		if (len > end - cp - 1)
+			break;
+		strncpy(cp, prom_argv(actr), len);
+		cp += len;
 		*cp++ = ' ';
 		actr++;
 	}
diff -ruN linux-2.4.30-010/arch/mips/ar7/memory.c linux-2.4.30-011/arch/mips/ar7/memory.c
--- linux-2.4.30-010/arch/mips/ar7/memory.c	2005-11-07 16:10:29.000000000 +0100
+++ linux-2.4.30-011/arch/mips/ar7/memory.c	2005-11-07 20:50:31.000000000 +0100
@@ -19,10 +19,8 @@
  *
  * ########################################################################
  *
- * PROM library functions for acquiring/using memory descriptors given to
- * us from the YAMON.
- *
  */
+
 #include <linux/config.h>
 #include <linux/init.h>
 #include <linux/mm.h>
@@ -32,23 +30,16 @@
 #include <asm/page.h>
 #include <asm/mips-boards/prom.h>
 
-enum yamon_memtypes {
-	yamon_dontuse,
-	yamon_prom,
-	yamon_free,
-};
-struct prom_pmemblock mdesc[PROM_MAX_PMEMBLOCKS];
-
-/* References to section boundaries */
-extern char _end;
-
-#define PFN_ALIGN(x)    (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
+extern char _ftext;
+extern int preserve_adam2;
 
-
-struct prom_pmemblock * __init prom_getmdesc(void)
+void __init prom_meminit(void)
 {
 	char *memsize_str;
-	unsigned int memsize;
+	unsigned long memsize, adam2size;
+
+	/* assume block before kernel is used by bootloader */
+	adam2size = __pa(&_ftext) - PHYS_OFFSET;
 
 	memsize_str = prom_getenv("memsize");
 	if (!memsize_str) {
@@ -57,75 +48,56 @@
 		memsize = simple_strtol(memsize_str, NULL, 0);
 	}
 
-	memset(mdesc, 0, sizeof(mdesc));
-
-	mdesc[0].type = yamon_dontuse;
-	mdesc[0].base = 0x00000000;
-	mdesc[0].size = CONFIG_AR7_MEMORY;
-
-	mdesc[1].type = yamon_prom;
-	mdesc[1].base = CONFIG_AR7_MEMORY;
-	mdesc[1].size = 0x00020000;
-
-	mdesc[2].type = yamon_free;
-	mdesc[2].base = CONFIG_AR7_MEMORY + 0x00020000;
-	mdesc[2].size = (memsize + CONFIG_AR7_MEMORY) - mdesc[2].base;
-
-	return &mdesc[0];
-}
-
-static int __init prom_memtype_classify (unsigned int type)
-{
-	switch (type) {
-		case yamon_free:
-			return BOOT_MEM_RAM;
-		case yamon_prom:
-			return BOOT_MEM_ROM_DATA;
-		default:
-			return BOOT_MEM_RESERVED;
-	}
-}
-
-void __init prom_meminit(void)
-{
-	struct prom_pmemblock *p;
-
-	p = prom_getmdesc();
-
-	while (p->size) {
-		long type;
-		unsigned long base, size;
-
-		type = prom_memtype_classify (p->type);
-		base = p->base;
-		size = p->size;
-
-		add_memory_region(base, size, type);
-		p++;
-	}
+#if 0
+	add_memory_region(0x00000000, PHYS_OFFSET, BOOT_MEM_RESERVED);
+#endif
+	add_memory_region(PHYS_OFFSET, adam2size, BOOT_MEM_ROM_DATA);
+	add_memory_region(PHYS_OFFSET+adam2size, memsize-adam2size,
+			  BOOT_MEM_RAM);
 }
 
-void __init prom_free_prom_memory (void)
+unsigned long __init prom_free_prom_memory (void)
 {
-#if 0
 	int i;
 	unsigned long freed = 0;
 	unsigned long addr;
 
-	for (i = 0; i < boot_mem_map.nr_map; i++) {
-		if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
-			continue;
+	if (preserve_adam2) {
+		char *firstfree_str = prom_getenv("firstfreeaddress");
+		unsigned long firstfree = 0;
+
+		if (firstfree_str)
+			firstfree = simple_strtol(firstfree_str, NULL, 0);
+
+		if (firstfree && firstfree < (unsigned long)&_ftext) {
+			printk("Preserving ADAM2 memory.\n");
+		} else if (firstfree) {
+			printk("Can't preserve ADAM2 memory, "
+			       "firstfreeaddress = %08lx.\n", firstfree);
+			preserve_adam2 = 0;
+		} else {
+			printk("Can't preserve ADAM2 memory, "
+			       "firstfreeaddress unknown!\n");
+			preserve_adam2 = 0;
+		}
+	}
+
+	if (!preserve_adam2) {
+		for (i = 0; i < boot_mem_map.nr_map; i++) {
+			if (boot_mem_map.map[i].type != BOOT_MEM_ROM_DATA)
+				continue;
 
-		addr = boot_mem_map.map[i].addr;
-		while (addr < boot_mem_map.map[i].addr
+			addr = boot_mem_map.map[i].addr;
+			while (addr < boot_mem_map.map[i].addr
 				+ boot_mem_map.map[i].size) {
-			ClearPageReserved(virt_to_page(__va(addr)));
-			set_page_count(virt_to_page(__va(addr)), 1);
-			free_page((unsigned long)__va(addr));
-			addr += PAGE_SIZE;
-			freed += PAGE_SIZE;
+				ClearPageReserved(virt_to_page(__va(addr)));
+				set_page_count(virt_to_page(__va(addr)), 1);
+				free_page((unsigned long)__va(addr));
+				addr += PAGE_SIZE;
+				freed += PAGE_SIZE;
+			}
 		}
+		printk("Freeing prom memory: %ldkb freed\n", freed >> 10);
 	}
-	printk("Freeing prom memory: %ldkb freed\n", freed >> 10);
-#endif
+	return freed >> PAGE_SHIFT;
 }
diff -ruN linux-2.4.30-010/arch/mips/ar7/promlib.c linux-2.4.30-011/arch/mips/ar7/promlib.c
--- linux-2.4.30-010/arch/mips/ar7/promlib.c	2005-11-07 16:20:43.000000000 +0100
+++ linux-2.4.30-011/arch/mips/ar7/promlib.c	2005-11-07 16:21:44.000000000 +0100
@@ -23,7 +23,9 @@
 
 #define AVALANCHE_YAMON_FUNCTION_BASE (KSEG1ADDR(0x10000500))
 #define AVALANCHE_YAMON_PROM_PRINT_COUNT_ADDR \
-          (AVALANCHE_YAMON_FUNCTION_BASE + 0x4)
+          (AVALANCHE_YAMON_FUNCTION_BASE + 1 * 0x4)
+#define AVALANCHE_YAMON_PROM_EXIT \
+          (AVALANCHE_YAMON_FUNCTION_BASE + 8 * 0x4)
 
 void prom_putchar(char c)
 {
@@ -35,3 +37,12 @@
 	prom_print_str(1, buf, 1);
 	return;
 }
+
+void adam2_exit(int retval)
+{
+	void (*yamon_exit)(int retval) =
+	  (void *)(*(uint32_t *)AVALANCHE_YAMON_PROM_EXIT);
+
+	yamon_exit(retval);
+	return;
+}
diff -ruN linux-2.4.30-010/arch/mips/ar7/reset.c linux-2.4.30-011/arch/mips/ar7/reset.c
--- linux-2.4.30-010/arch/mips/ar7/reset.c	2005-11-07 16:10:29.000000000 +0100
+++ linux-2.4.30-011/arch/mips/ar7/reset.c	2005-11-07 16:21:44.000000000 +0100
@@ -19,13 +19,22 @@
  *
  * ########################################################################
  *
- * Reset the MIPS boards.
+ * Reset the AR7 boards.
  *
  */
-#include <linux/config.h>
 
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/string.h>
+#include <linux/types.h>
+
+#include <asm/mipsregs.h>
 #include <asm/reboot.h>
-#include <asm/mips-boards/generic.h>
+#include <asm/addrspace.h>
+
+int preserve_adam2 = 1;
+
+extern void adam2_exit(int retval);
 
 static void ar7_machine_restart(char *command);
 static void ar7_machine_halt(void);
@@ -33,7 +42,7 @@
 
 static void ar7_machine_restart(char *command)
 {
-	volatile unsigned int *softres_reg = (void *)(KSEG1ADDR(0x08611600 + 0x4));
+	volatile uint32_t *softres_reg = (void *)(KSEG1ADDR(0x08611600 + 0x4));
 
 	*softres_reg = 1;
 }
@@ -41,11 +50,33 @@
 static void ar7_machine_halt(void)
 {
 
+	if (preserve_adam2) {
+		set_c0_status(ST0_BEV);
+		adam2_exit(0);
+	} else {
+		/* I'd like to have Alt-SysRq-b work in this state.
+		 * What's missing here? The timer interrupt is still running.
+		 * Why doesn't the UART work anymore? */
+		while(1) {
+		  __asm__(".set\tmips3\n\t"
+			  "wait\n\t"
+			  ".set\tmips0");
+		}
+	}
 }
 
 static void ar7_machine_power_off(void)
 {
+	volatile uint32_t *power_reg = (void *)(KSEG1ADDR(0x08610A00));
+	uint32_t power_state = *power_reg;
+
+	/* add something to turn LEDs off? */
+
+	power_state &= ~(3 << 30);
+	power_state |=  (3 << 30); /* power down */
+	*power_reg = power_state;
 
+	printk("after power down?\n");
 }
 
 void ar7_reboot_setup(void)
@@ -54,3 +85,14 @@
 	_machine_halt = ar7_machine_halt;
 	_machine_power_off = ar7_machine_power_off;
 }
+
+static int __init ar7_do_preserve_adam2(char *s)
+{
+	if (!strcmp(s, "no") || !strcmp(s, "0"))
+		preserve_adam2 = 0;
+	else
+	  	preserve_adam2 = 1;
+        return 1;
+}
+
+__setup("adam2=", ar7_do_preserve_adam2);
diff -ruN linux-2.4.30-010/arch/mips/kernel/setup.c linux-2.4.30-011/arch/mips/kernel/setup.c
--- linux-2.4.30-010/arch/mips/kernel/setup.c	2005-11-07 16:10:29.000000000 +0100
+++ linux-2.4.30-011/arch/mips/kernel/setup.c	2005-11-08 07:17:29.000000000 +0100
@@ -38,6 +38,7 @@
 #include <asm/io.h>
 #include <asm/ptrace.h>
 #include <asm/system.h>
+#include <asm/addrspace.h>
 
 struct cpuinfo_mips cpu_data[NR_CPUS];
 EXPORT_SYMBOL(cpu_data);
@@ -88,7 +89,7 @@
 struct boot_mem_map boot_mem_map;
 
 unsigned char aux_device_present;
-extern char _ftext, _etext, _fdata, _edata, _end;
+extern char _ftext, _etext, _fdata, _edata, _fbss, _end;
 
 static char command_line[CL_SIZE];
        char saved_command_line[CL_SIZE];
@@ -116,6 +117,7 @@
 
 static struct resource code_resource = { "Kernel code" };
 static struct resource data_resource = { "Kernel data" };
+static struct resource  bss_resource = { "Kernel bss" };
 
 asmlinkage void __init
 init_arch(int argc, char **argv, char **envp, int *prom_vec)
@@ -235,11 +237,7 @@
 #define PFN_DOWN(x)	((x) >> PAGE_SHIFT)
 #define PFN_PHYS(x)	((x) << PAGE_SHIFT)
 
-#ifdef CONFIG_AR7
-#define MAXMEM		HIGHMEM_START + CONFIG_AR7_MEMORY
-#else
 #define MAXMEM		HIGHMEM_START
-#endif
 #define MAXMEM_PFN	PFN_DOWN(MAXMEM)
 
 static inline void bootmem_init(void)
@@ -276,7 +274,7 @@
 	for (i = 0; i < boot_mem_map.nr_map; i++) {
 		unsigned long start, end;
 
-		if (boot_mem_map.map[i].type != BOOT_MEM_RAM)
+		if (boot_mem_map.map[i].type == BOOT_MEM_RESERVED)
 			continue;
 
 		start = PFN_UP(boot_mem_map.map[i].addr);
@@ -324,12 +322,8 @@
 #endif
 
 	/* Initialize the boot-time allocator with low memory only.  */
-#ifdef CONFIG_AR7
-	bootmap_size = init_bootmem_node(NODE_DATA(0), start_pfn,
-			CONFIG_AR7_MEMORY >> PAGE_SHIFT, max_low_pfn);
-#else
-	bootmap_size = init_bootmem(first_usable_pfn, max_low_pfn);
-#endif
+	bootmap_size = init_bootmem_node(NODE_DATA(0), first_usable_pfn,
+					 PFN_UP(PHYS_OFFSET), max_low_pfn);
 
 	/*
 	 * Register fully available low RAM pages with the bootmem allocator.
@@ -380,11 +374,12 @@
 			continue;
 
 		/* Register lowmem ranges */
-		free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
+		free_bootmem_node(NODE_DATA(0), PFN_PHYS(curr_pfn),
+				  size<<PAGE_SHIFT);
 	}
 
 	/* Reserve the bootmap memory.  */
-	reserve_bootmem(PFN_PHYS(first_usable_pfn), bootmap_size);
+	reserve_bootmem_node(NODE_DATA(0), PFN_PHYS(first_usable_pfn), bootmap_size);
 
 #ifdef CONFIG_BLK_DEV_INITRD
 	/* Board specific code should have set up initrd_start and initrd_end */
@@ -418,6 +413,8 @@
 	code_resource.end = virt_to_bus(&_etext) - 1;
 	data_resource.start = virt_to_bus(&_fdata);
 	data_resource.end = virt_to_bus(&_edata) - 1;
+	bss_resource.start = virt_to_bus(&_fbss);
+	bss_resource.end = virt_to_bus(&_end) - 1;
 
 	/*
 	 * Request address space for all standard RAM.
@@ -457,6 +454,7 @@
 		 */
 		request_resource(res, &code_resource);
 		request_resource(res, &data_resource);
+		request_resource(res, &bss_resource);
 	}
 }
 
diff -ruN linux-2.4.30-010/arch/mips/mm/init.c linux-2.4.30-011/arch/mips/mm/init.c
--- linux-2.4.30-010/arch/mips/mm/init.c	2005-11-07 16:10:29.000000000 +0100
+++ linux-2.4.30-011/arch/mips/mm/init.c	2005-11-07 17:20:36.000000000 +0100
@@ -235,10 +235,13 @@
 #endif
 }
 
+#define START_PFN (NODE_DATA(0)->bdata->node_boot_start >> PAGE_SHIFT)
+#define MAX_LOW_PFN (NODE_DATA(0)->bdata->node_low_pfn)
+
 void __init paging_init(void)
 {
 	unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
-	unsigned long max_dma, high, low;
+	unsigned long max_dma, high, low, start;
 
 	pagetable_init();
 
@@ -247,10 +250,8 @@
 #endif
 
 	max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-	low = max_low_pfn;
-#ifdef CONFIG_AR7
-	low = NODE_DATA(0)->bdata->node_low_pfn - (CONFIG_AR7_MEMORY >> PAGE_SHIFT);
-#endif
+	start = START_PFN;
+	low = MAX_LOW_PFN - start;
 	high = highend_pfn;
 
 #ifdef CONFIG_ISA
@@ -273,11 +274,8 @@
 		zones_size[ZONE_HIGHMEM] = high - low;
 #endif
 
-#ifdef CONFIG_AR7
-	free_area_init_node(0, NODE_DATA(0), 0, zones_size, CONFIG_AR7_MEMORY, 0);
-#else
-	free_area_init(zones_size);
-#endif
+	free_area_init_node(0, NODE_DATA(0), 0, zones_size,
+			    start << PAGE_SHIFT, 0);
 }
 
 #define PFN_UP(x)	(((x) + PAGE_SIZE - 1) >> PAGE_SHIFT)
@@ -290,7 +288,7 @@
 	for (i = 0; i < boot_mem_map.nr_map; i++) {
 		unsigned long addr, end;
 
-		if (boot_mem_map.map[i].type != BOOT_MEM_RAM)
+		if (boot_mem_map.map[i].type == BOOT_MEM_RESERVED)
 			/* not usable memory */
 			continue;
 
@@ -305,10 +303,6 @@
 	return 0;
 }
 
-#ifdef CONFIG_AR7
-#define START_PFN (NODE_DATA(0)->bdata->node_boot_start >> PAGE_SHIFT)
-#define MAX_LOW_PFN (NODE_DATA(0)->bdata->node_low_pfn)
-#endif
 void __init mem_init(void)
 {
 	unsigned long codesize, reservedpages, datasize, initsize;
@@ -324,28 +318,17 @@
 	max_mapnr = num_physpages = highend_pfn;
 	num_mappedpages = max_low_pfn;
 #else
-	max_mapnr = num_mappedpages = num_physpages = max_low_pfn;
+	max_mapnr = num_mappedpages = num_physpages = MAX_LOW_PFN - START_PFN;
 #endif
 	
-#ifdef CONFIG_AR7
-	max_mapnr = num_mappedpages = num_physpages = MAX_LOW_PFN - START_PFN;
 	high_memory = (void *) __va(MAX_LOW_PFN * PAGE_SIZE);
 	
-#if 0
-	/* WTF? */
-	free_bootmem_node(NODE_DATA(0), (CONFIG_AR7_MEMORY+PAGE_SIZE), (__pa(&_ftext))-(CONFIG_AR7_MEMORY+PAGE_SIZE));
-#endif
 	totalram_pages += free_all_bootmem_node(NODE_DATA(0));
-#else
-	high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);
-	totalram_pages += free_all_bootmem();
-#endif
-
 	totalram_pages -= setup_zero_pages();	/* Setup zeroed pages.  */
 
 	reservedpages = ram = 0;
-	for (tmp = 0; tmp < max_low_pfn; tmp++)
-		if (page_is_ram(tmp)) {
+	for (tmp = 0; tmp < max_mapnr; tmp++)
+		if (page_is_ram(START_PFN + tmp)) {
 			ram++;
 			if (PageReserved(mem_map+tmp))
 				reservedpages++;
@@ -400,13 +383,13 @@
 #endif
 
 extern char __init_begin, __init_end;
-extern void prom_free_prom_memory(void) __init;
+extern unsigned long prom_free_prom_memory(void) __init;
 
 void free_initmem(void)
 {
 	unsigned long addr;
 
-	prom_free_prom_memory ();
+	totalram_pages += prom_free_prom_memory ();
 
 	addr = (unsigned long) &__init_begin;
 	while (addr < (unsigned long) &__init_end) {
diff -ruN linux-2.4.30-010/include/asm-mips/addrspace.h linux-2.4.30-011/include/asm-mips/addrspace.h
--- linux-2.4.30-010/include/asm-mips/addrspace.h	2002-11-29 00:53:15.000000000 +0100
+++ linux-2.4.30-011/include/asm-mips/addrspace.h	2005-11-08 06:29:04.000000000 +0100
@@ -11,6 +11,8 @@
 #ifndef __ASM_MIPS_ADDRSPACE_H
 #define __ASM_MIPS_ADDRSPACE_H
 
+#include <linux/config.h>
+
 /*
  *  Configure language
  */
@@ -102,4 +104,11 @@
 #define XKPHYS_TO_PHYS(p)		((p) & TO_PHYS_MASK)
 #define PHYS_TO_XKPHYS(cm,a)		(0x8000000000000000 | ((cm)<<59) | (a))
 
+#ifdef CONFIG_AR7_MEMORY
+#define PHYS_OFFSET	((unsigned long)(CONFIG_AR7_MEMORY))
+#else
+#define PHYS_OFFSET	(0)
+#endif
+#define PHYS_PFN_OFFSET	(PHYS_OFFSET >> PAGE_SHIFT)
+
 #endif /* __ASM_MIPS_ADDRSPACE_H */
diff -ruN linux-2.4.30-010/include/asm-mips/io.h linux-2.4.30-011/include/asm-mips/io.h
--- linux-2.4.30-010/include/asm-mips/io.h	2005-11-07 16:10:30.000000000 +0100
+++ linux-2.4.30-011/include/asm-mips/io.h	2005-11-08 06:53:59.000000000 +0100
@@ -61,13 +61,9 @@
  * Change "struct page" to physical address.
  */
 #ifdef CONFIG_64BIT_PHYS_ADDR
-#define page_to_phys(page)	((u64)(page - mem_map) << PAGE_SHIFT)
+#define page_to_phys(page)	(((u64)(page - mem_map) << PAGE_SHIFT) + PHYS_OFFSET)
 #else
-#ifdef CONFIG_AR7
-#define page_to_phys(page)	(((page - mem_map) << PAGE_SHIFT) + CONFIG_AR7_MEMORY)
-#else 
-#define page_to_phys(page)	((page - mem_map) << PAGE_SHIFT)
-#endif
+#define page_to_phys(page)	(((page - mem_map) << PAGE_SHIFT) + PHYS_OFFSET)
 #endif
 
 #define IO_SPACE_LIMIT 0xffff
diff -ruN linux-2.4.30-010/include/asm-mips/mips-boards/prom.h linux-2.4.30-011/include/asm-mips/mips-boards/prom.h
--- linux-2.4.30-010/include/asm-mips/mips-boards/prom.h	2001-09-09 19:43:02.000000000 +0200
+++ linux-2.4.30-011/include/asm-mips/mips-boards/prom.h	2005-11-07 16:21:44.000000000 +0100
@@ -33,7 +33,7 @@
 extern void prom_init_cmdline(void);
 extern void prom_meminit(void);
 extern void prom_fixup_mem_map(unsigned long start_mem, unsigned long end_mem);
-extern void prom_free_prom_memory (void);
+extern unsigned long prom_free_prom_memory (void);
 extern void mips_display_message(const char *str);
 extern void mips_display_word(unsigned int num);
 extern int get_ethernet_addr(char *ethernet_addr);
diff -ruN linux-2.4.30-010/include/asm-mips/page.h linux-2.4.30-011/include/asm-mips/page.h
--- linux-2.4.30-010/include/asm-mips/page.h	2005-11-07 16:10:30.000000000 +0100
+++ linux-2.4.30-011/include/asm-mips/page.h	2005-11-08 06:51:07.000000000 +0100
@@ -12,6 +12,7 @@
 
 #include <linux/config.h>
 #include <asm/break.h>
+#include <asm/addrspace.h>
 
 #ifdef __KERNEL__
 
@@ -129,11 +130,7 @@
 
 #define __pa(x)		((unsigned long) (x) - PAGE_OFFSET)
 #define __va(x)		((void *)((unsigned long) (x) + PAGE_OFFSET))
-#ifdef CONFIG_AR7
-#define virt_to_page(kaddr)	phys_to_page(__pa(kaddr))
-#else
-#define virt_to_page(kaddr)	(mem_map + (__pa(kaddr) >> PAGE_SHIFT))
-#endif
+#define virt_to_page(kaddr)	(mem_map + ((__pa(kaddr)-PHYS_OFFSET) >> PAGE_SHIFT))
 #define VALID_PAGE(page)	((page - mem_map) < max_mapnr)
 
 #define VM_DATA_DEFAULT_FLAGS  (VM_READ | VM_WRITE | VM_EXEC | \
diff -ruN linux-2.4.30-010/include/asm-mips/pgtable-32.h linux-2.4.30-011/include/asm-mips/pgtable-32.h
--- linux-2.4.30-010/include/asm-mips/pgtable-32.h	2005-11-07 16:10:30.000000000 +0100
+++ linux-2.4.30-011/include/asm-mips/pgtable-32.h	2005-11-08 06:53:58.000000000 +0100
@@ -108,18 +108,7 @@
  * and a page entry and page directory to the page they refer to.
  */
 
-#if defined(CONFIG_AR7)
-#define mk_pte(page, pgprot)						\
-({									\
-	pte_t   __pte;							\
-									\
-	pte_val(__pte) = ((phys_t)(page - mem_map) << (PAGE_SHIFT) |	\
-		CONFIG_AR7_MEMORY) |					\
-	pgprot_val(pgprot);						\
-									\
-	__pte;								\
-})
-#elif defined(CONFIG_CPU_VR41XX)
+#if defined(CONFIG_CPU_VR41XX)
 #define mk_pte(page, pgprot)                                            \
 ({                                                                      \
         pte_t   __pte;                                                  \
@@ -134,8 +123,8 @@
 ({									\
 	pte_t   __pte;							\
 									\
-	pte_val(__pte) = ((phys_t)(page - mem_map) << PAGE_SHIFT) | \
-	                 pgprot_val(pgprot);				\
+	pte_val(__pte) = (((phys_t)(page - mem_map) << PAGE_SHIFT) +    \
+			  PHYS_OFFSET) | pgprot_val(pgprot);            \
 									\
 	__pte;								\
 })
@@ -187,15 +176,12 @@
 		set_pte(ptep, __pte(0));
 }
 
-#if defined(CONFIG_AR7)
-#define phys_to_page(phys)	(mem_map + (((phys)-CONFIG_AR7_MEMORY) >> PAGE_SHIFT))
-#define pte_page(x)		phys_to_page(pte_val(x))
-#elif defined(CONFIG_CPU_VR41XX)
+#if defined(CONFIG_CPU_VR41XX)
 #define pte_page(x)  (mem_map+((unsigned long)(((x).pte_low >> (PAGE_SHIFT+2)))))
 #define __mk_pte(page_nr,pgprot) __pte(((page_nr) << (PAGE_SHIFT+2)) | pgprot_val(pgprot))
 #else
-#define pte_page(x)  (mem_map+((unsigned long)(((x).pte_low >> PAGE_SHIFT))))
-#define __mk_pte(page_nr,pgprot) __pte(((page_nr) << PAGE_SHIFT) | pgprot_val(pgprot))
+#define pte_page(x)  (mem_map+((unsigned long)((((x).pte_low-PHYS_OFFSET) >> PAGE_SHIFT))))
+#define __mk_pte(page_nr,pgprot) __pte((((page_nr) << PAGE_SHIFT)+PHYS_OFFSET)|pgprot_val(pgprot))
 #endif
 
 #endif
diff -ruN linux-2.4.30-010/include/asm-mips/serial.h linux-2.4.30-011/include/asm-mips/serial.h
--- linux-2.4.30-010/include/asm-mips/serial.h	2005-11-07 16:10:30.000000000 +0100
+++ linux-2.4.30-011/include/asm-mips/serial.h	2005-11-08 06:54:24.000000000 +0100
@@ -67,6 +67,7 @@
 
 #ifdef CONFIG_AR7
 #include <asm/ar7/ar7.h>
+#include <asm/ar7/avalanche_intc.h>
 #define AR7_SERIAL_PORT_DEFNS  \
 	{ 0, AR7_BASE_BAUD, AR7_UART0_REGS_BASE, LNXINTNUM(AVALANCHE_UART0_INT), STD_COM_FLAGS }, \
 	{ 0, AR7_BASE_BAUD, AR7_UART1_REGS_BASE, LNXINTNUM(AVALANCHE_UART1_INT), STD_COM_FLAGS }, 
