* Patches by David Müller, 14 Nov 2003:
  - board/mpl/common/common_util.c
    * implement support for BZIP2 compressed images
    * various cleanups (printf -> puts, ...)
  - board/mpl/common/flash.c
    * report correct errors to upper layers
    * check the erase fail and VPP low bits in status reg
  - board/mpl/vcma9/cmd_vcma9.c
  - board/mpl/vcma9/flash.c
    * various cleanups (printf -> puts, ...)
  - common/cmd_usb.c
    * fix typo in comment
  - cpu/arm920t/usb_ohci.c
    * support for S3C2410 is missing in #if line
  - drivers/cs8900.c
    * reinit some registers in case of error (cable missing, ...)
  - fs/fat/fat.c
    * support for USB/MMC devices is missing in #if line
  - include/configs/MIP405.h
  - include/configs/PIP405.h
    * enable BZIP2 support
    * enlarge malloc space to 1MiB because of BZIP2 support
  - include/configs/VCMA9.h
    * enable BZIP2 support
    * enlarge malloc space to 1MiB because of BZIP2 support
    * enable USB support
  - lib_arm/armlinux.c
    * change calling convention of ARM Linux kernel as
      described on http://www.arm.linux.org.uk/developer/booting.php

* Patch by Thomas Lange, 14 Nov 2003:
  Split dbau1x00 into dbau1000, dbau1100 and dbau1500 configs to
  support all these AMD boards.

* Patch by Thomas Lange, 14 Nov 2003:
  Workaround for mips au1x00 physical memory accesses (the au1x00
  uses a 36 bit bus internally and cannot access physical memory
  directly. Use the uncached SDRAM address instead of the physical
  one.)
diff --git a/CHANGELOG b/CHANGELOG
index 9969b54..7e066ce 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,46 @@
 Changes since U-Boot 1.0.0:
 ======================================================================
 
+* Patches by David Müller, 14 Nov 2003:
+  - board/mpl/common/common_util.c
+    * implement support for BZIP2 compressed images
+    * various cleanups (printf -> puts, ...)
+  - board/mpl/common/flash.c
+    * report correct errors to upper layers
+    * check the erase fail and VPP low bits in status reg
+  - board/mpl/vcma9/cmd_vcma9.c
+  - board/mpl/vcma9/flash.c
+    * various cleanups (printf -> puts, ...)
+  - common/cmd_usb.c
+    * fix typo in comment
+  - cpu/arm920t/usb_ohci.c
+    * support for S3C2410 is missing in #if line
+  - drivers/cs8900.c
+    * reinit some registers in case of error (cable missing, ...)
+  - fs/fat/fat.c
+    * support for USB/MMC devices is missing in #if line
+  - include/configs/MIP405.h
+  - include/configs/PIP405.h
+    * enable BZIP2 support
+    * enlarge malloc space to 1MiB because of BZIP2 support
+  - include/configs/VCMA9.h
+    * enable BZIP2 support
+    * enlarge malloc space to 1MiB because of BZIP2 support
+    * enable USB support
+  - lib_arm/armlinux.c
+    * change calling convention of ARM Linux kernel as
+      described on http://www.arm.linux.org.uk/developer/booting.php
+
+* Patch by Thomas Lange, 14 Nov 2003:
+  Split dbau1x00 into dbau1000, dbau1100 and dbau1500 configs to
+  support all these AMD boards.
+
+* Patch by Thomas Lange, 14 Nov 2003:
+  Workaround for mips au1x00 physical memory accesses (the au1x00
+  uses a 36 bit bus internally and cannot access physical memory
+  directly. Use the uncached SDRAM address instead of the physical
+  one.)
+
 * Patch by Xue Ligong (Joe), 13 Nov 2003:
   add Realtek 8019 ethernet driver
 
diff --git a/MAKEALL b/MAKEALL
index 2494b56..d77c17d 100644
--- a/MAKEALL
+++ b/MAKEALL
@@ -157,7 +157,7 @@
 
 LIST_mips5kc="purple"
 
-LIST_au1x00="dbau1x00"
+LIST_au1x00="dbau1000 dbau1100 dbau1500"
 
 LIST_mips="${LIST_mips4kc} ${LIST_mips5kc} ${LIST_au1x00}"
 
diff --git a/Makefile b/Makefile
index a4462f8..08ac056 100644
--- a/Makefile
+++ b/Makefile
@@ -987,10 +987,22 @@
 
 
 #########################################################################
-## MIPS32 AU1000
+## MIPS32 AU1X00
 #########################################################################
-dbau1x00_config		: 	unconfig
-	@./mkconfig $(@:_config=) mips mips dbau1x00
+dbau1000_config		: 	unconfig
+	@ >include/config.h
+	@echo "#define CONFIG_DBAU1000 1" >>include/config.h
+	@./mkconfig -a dbau1x00 mips mips dbau1x00
+
+dbau1100_config		: 	unconfig
+	@ >include/config.h
+	@echo "#define CONFIG_DBAU1100 1" >>include/config.h
+	@./mkconfig -a dbau1x00 mips mips dbau1x00
+
+dbau1500_config		: 	unconfig
+	@ >include/config.h
+	@echo "#define CONFIG_DBAU1500 1" >>include/config.h
+	@./mkconfig -a dbau1x00 mips mips dbau1x00
 
 #########################################################################
 #########################################################################
diff --git a/board/dbau1x00/dbau1x00.c b/board/dbau1x00/dbau1x00.c
index 3b6fcec..8fcbd81 100644
--- a/board/dbau1x00/dbau1x00.c
+++ b/board/dbau1x00/dbau1x00.c
@@ -39,6 +39,13 @@
 /* In cpu/mips/cpu.c */
 void write_one_tlb( int index, u32 pagemask, u32 hi, u32 low0, u32 low1 );
 
+#ifdef CONFIG_DBAU1100
+#warning "FIXME Check that bcsr is the same as dbau1000 board!"
+#endif
+#ifdef CONFIG_DBAU1500
+#warning "FIXME Check that bcsr is the same as dbau1000 board!"
+#endif
+
 int checkboard (void)
 {
 	u16 status;
@@ -51,14 +58,24 @@
 
 	proc_id = read_32bit_cp0_register(CP0_PRID);
 
-	switch(proc_id>>24){
+	switch (proc_id >> 24) {
 	case 0:
-	  puts("Board: Merlot (DbAu1000)\n");
-	  printf("CPU: Au1000 396 MHz, id: 0x%02x, rev: 0x%02x\n",
-		 (proc_id>>8)&0xFF,proc_id&0xFF);
-	  break;
+		puts ("Board: Merlot (DbAu1000)\n");
+		printf ("CPU: Au1000 396 MHz, id: 0x%02x, rev: 0x%02x\n",
+			(proc_id >> 8) & 0xFF, proc_id & 0xFF);
+		break;
+	case 1:
+		puts ("Board: DbAu1500\n");
+		printf ("CPU: Au1500, id: 0x%02x, rev: 0x%02x\n",
+			(proc_id >> 8) & 0xFF, proc_id & 0xFF);
+		break;
+	case 2:
+		puts ("Board: DbAu1100\n");
+		printf ("CPU: Au1100, id: 0x%02x, rev: 0x%02x\n",
+			(proc_id >> 8) & 0xFF, proc_id & 0xFF);
+		break;
 	default:
-	  printf("Unsupported cpu %d, proc_id=0x%x\n",proc_id>>24,proc_id);
+		printf ("Unsupported cpu %d, proc_id=0x%x\n", proc_id >> 24, proc_id);
 	}
 #ifdef CONFIG_IDE_PCMCIA
 	/* Enable 3.3 V on slot 0 ( VCC )
diff --git a/board/mpl/common/common_util.c b/board/mpl/common/common_util.c
index 30dcdad..17871d2 100644
--- a/board/mpl/common/common_util.c
+++ b/board/mpl/common/common_util.c
@@ -31,6 +31,8 @@
 #include <i2c.h>
 #include <devices.h>
 #include <pci.h>
+#include <malloc.h>
+#include <bzlib.h>
 
 #ifdef CONFIG_PIP405
 #include "../pip405/pip405.h"
@@ -41,73 +43,73 @@
 #include <405gp_pci.h>
 #endif
 
-extern int  gunzip (void *, int, unsigned char *, int *);
-extern int mem_test(unsigned long start, unsigned long ramsize, int quiet);
+extern int gunzip(void *, int, uchar *, int *);
+extern int mem_test(ulong start, ulong ramsize, int quiet);
 
-#define I2C_BACKUP_ADDR 0x7C00 /* 0x200 bytes for backup */
-#if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
-#define IMAGE_SIZE 0x80000
-#elif defined(CONFIG_VCMA9)
-#define IMAGE_SIZE 0x40000		/* ugly, but it works for now */
-#endif
+#define I2C_BACKUP_ADDR 0x7C00		/* 0x200 bytes for backup */
+#define IMAGE_SIZE CFG_MONITOR_LEN	/* ugly, but it works for now */
 
 extern flash_info_t flash_info[];	/* info for FLASH chips */
 
 static image_header_t header;
 
 
-int mpl_prg(unsigned long src,unsigned long size)
+static int 
+mpl_prg(uchar *src, ulong size)
 {
-	unsigned long start;
+	ulong start;
 	flash_info_t *info;
-	int i,rc;
+	int i, rc;
 #if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
 	char *copystr = (char *)src;
-	unsigned long *magic = (unsigned long *)src;
+	ulong *magic = (ulong *)src;
 #endif
 
 	info = &flash_info[0];
 
 #if defined(CONFIG_PIP405) || defined(CONFIG_MIP405)
-	if(ntohl(magic[0]) != IH_MAGIC) {
-		printf("Bad Magic number\n");
+	if (ntohl(magic[0]) != IH_MAGIC) {
+		puts("Bad Magic number\n");
 		return -1;
 	}
 	/* some more checks before we delete the Flash... */
 	/* Checking the ISO_STRING prevents to program a
 	 * wrong Firmware Image into the flash.
 	 */
-	i=4; /* skip Magic number */
-	while(1) {
-		if(strncmp(&copystr[i],"MEV-",4)==0)
+	i = 4; /* skip Magic number */
+	while (1) {
+		if (strncmp(&copystr[i], "MEV-", 4) == 0)
 			break;
-		if(i++>=0x100) {
-			printf("Firmware Image for unknown Target\n");
+		if (i++ >= 0x100) {
+			puts("Firmware Image for unknown Target\n");
 			return -1;
 		}
 	}
 	/* we have the ISO STRING, check */
-	if(strncmp(&copystr[i],CONFIG_ISO_STRING,sizeof(CONFIG_ISO_STRING)-1)!=0) {
-		printf("Wrong Firmware Image: %s\n",&copystr[i]);
+	if (strncmp(&copystr[i], CONFIG_ISO_STRING, sizeof(CONFIG_ISO_STRING)-1) != 0) {
+		printf("Wrong Firmware Image: %s\n", &copystr[i]);
 		return -1;
 	}
 	start = 0 - size;
-	for(i=info->sector_count-1;i>0;i--)
-	{
+	for (i = info->sector_count-1; i > 0; i--) {
 		info->protect[i] = 0; /* unprotect this sector */
-		if(start>=info->start[i])
-		break;
+		if (start >= info->start[i])
+			break;
 	}
 	/* set-up flash location */
 	/* now erase flash */
 	printf("Erasing at %lx (sector %d) (start %lx)\n",
 				start,i,info->start[i]);
-	flash_erase (info, i, info->sector_count-1);
+	if ((rc = flash_erase (info, i, info->sector_count-1)) != 0) {
+		puts("ERROR ");
+		flash_perror(rc);
+		return (1);
+	}
+	
 
 #elif defined(CONFIG_VCMA9)
 	start = 0;
-	for (i = 0; i <info->sector_count; i++)
-	{
+	for (i = 0; i <info->sector_count; i++) {
 		info->protect[i] = 0; /* unprotect this sector */
 		if (size < info->start[i])
 		    break;
@@ -116,73 +118,113 @@
 	/* now erase flash */
 	printf("Erasing at %lx (sector %d) (start %lx)\n",
 				start,0,info->start[0]);
-	flash_erase (info, 0, i);
+	if ((rc = flash_erase (info, 0, i)) != 0) {
+		puts("ERROR ");
+		flash_perror(rc);
+		return (1);
+	}
 
 #endif
 	printf("flash erased, programming from 0x%lx 0x%lx Bytes\n",src,size);
-	if ((rc = flash_write ((uchar *)src, start, size)) != 0) {
-		puts ("ERROR ");
-		flash_perror (rc);
+	if ((rc = flash_write (src, start, size)) != 0) {
+		puts("ERROR ");
+		flash_perror(rc);
 		return (1);
 	}
-	puts ("OK programming done\n");
+	puts("OK programming done\n");
 	return 0;
 }
 
 
-int mpl_prg_image(unsigned long ld_addr)
+static int 
+mpl_prg_image(uchar *ld_addr)
 {
-	unsigned long data,len,checksum;
-	image_header_t *hdr=&header;
+	unsigned long len, checksum;
+	uchar *data;
+	image_header_t *hdr = &header;
+	int rc;
+	
 	/* Copy header so we can blank CRC field for re-calculation */
 	memcpy (&header, (char *)ld_addr, sizeof(image_header_t));
 	if (ntohl(hdr->ih_magic)  != IH_MAGIC) {
-		printf ("Bad Magic Number\n");
+		puts("Bad Magic Number\n");
 		return 1;
 	}
 	print_image_hdr(hdr);
 	if (hdr->ih_os  != IH_OS_U_BOOT) {
-		printf ("No U-Boot Image\n");
+		puts("No U-Boot Image\n");
 		return 1;
 	}
 	if (hdr->ih_type  != IH_TYPE_FIRMWARE) {
-		printf ("No Firmware Image\n");
+		puts("No Firmware Image\n");
 		return 1;
 	}
-	data = (ulong)&header;
+	data = (uchar *)&header;
 	len  = sizeof(image_header_t);
 	checksum = ntohl(hdr->ih_hcrc);
 	hdr->ih_hcrc = 0;
 	if (crc32 (0, (char *)data, len) != checksum) {
-		printf ("Bad Header Checksum\n");
+		puts("Bad Header Checksum\n");
 		return 1;
 	}
 	data = ld_addr + sizeof(image_header_t);
 	len  = ntohl(hdr->ih_size);
-	printf ("Verifying Checksum ... ");
+	puts("Verifying Checksum ... ");
 	if (crc32 (0, (char *)data, len) != ntohl(hdr->ih_dcrc)) {
-		printf ("Bad Data CRC\n");
+		puts("Bad Data CRC\n");
 		return 1;
 	}
-	switch (hdr->ih_comp) {
-	case IH_COMP_NONE:
-		break;
-	case IH_COMP_GZIP:
-		printf ("  Uncompressing  ... ");
-		if (gunzip ((void *)(data+0x100000), 0x400000,
-			    (uchar *)data, (int *)&len) != 0) {
-			printf ("GUNZIP ERROR\n");
+	puts("OK\n");
+
+	if (hdr->ih_comp != IH_COMP_NONE) {
+		uchar *buf;
+		/* reserve space for uncompressed image */
+		if ((buf = malloc(IMAGE_SIZE)) == NULL) {
+		    	puts("Insufficient space for decompression\n");
 			return 1;
 		}
-		data+=0x100000;
-		break;
-	default:
-		printf ("   Unimplemented compression type %d\n", hdr->ih_comp);
-		return 1;
+				 
+		switch (hdr->ih_comp) {
+		case IH_COMP_GZIP:
+			puts("Uncompressing (GZIP) ... ");
+			rc = gunzip ((void *)(buf), IMAGE_SIZE, data, (int *)&len);
+			if (rc != 0) {
+				puts("GUNZIP ERROR\n");
+				free(buf);
+				return 1;
+			}
+			puts("OK\n");
+			break;
+#if CONFIG_BZIP2
+		case IH_COMP_BZIP2:
+			puts("Uncompressing (BZIP2) ... ");
+			{
+			uint retlen = IMAGE_SIZE;
+			rc = BZ2_bzBuffToBuffDecompress ((char *)(buf), &retlen,
+				(char *)data, len, 0, 0);
+			len = retlen;
+			}
+			if (rc != BZ_OK) {
+				printf ("BUNZIP2 ERROR: %d\n", rc);
+				free(buf);
+				return 1;
+			}
+			puts("OK\n");
+			break;
+#endif
+		default:
+			printf ("Unimplemented compression type %d\n", hdr->ih_comp);
+			free(buf);
+			return 1;
+		}
+		
+		rc = mpl_prg(buf, len);
+		free(buf);
+	} else {
+		rc = mpl_prg(data, len);
 	}
-
-	printf ("  OK\n");
-	return(mpl_prg(data,len));
+	
+	return(rc);
 }
 
 
@@ -199,20 +241,20 @@
 	get_backup_values(&back);
 	if(!overwrite) {
 		if(strncmp(back.signature,"MPL\0",4)==0) {
-			printf("Not possible to write Backup\n");
+			puts("Not possible to write Backup\n");
 			return;
 		}
 	}
 	memcpy(back.signature,"MPL\0",4);
 	i = getenv_r("serial#",back.serial_name,16);
 	if(i < 0) {
-		printf("Not possible to write Backup\n");
+		puts("Not possible to write Backup\n");
 		return;
 	}
 	back.serial_name[16]=0;
 	i = getenv_r("ethaddr",back.eth_addr,20);
 	if(i < 0) {
-		printf("Not possible to write Backup\n");
+		puts("Not possible to write Backup\n");
 		return;
 	}
 	back.eth_addr[20]=0;
@@ -334,7 +376,7 @@
 		}
 		else {
 			copy_old_env(oldsizes[i]);
-			printf ("INFO:  old environment ajusted, use saveenv\n");
+			puts("INFO:  old environment ajusted, use saveenv\n");
 		}
 	}
 	else {
@@ -353,23 +395,23 @@
 void show_stdio_dev(void)
 {
 	/* Print information */
-	printf ("In:    ");
+	puts("In:    ");
 	if (stdio_devices[stdin] == NULL) {
-		printf ("No input devices available!\n");
+		puts("No input devices available!\n");
 	} else {
 		printf ("%s\n", stdio_devices[stdin]->name);
 	}
 
-	printf ("Out:   ");
+	puts("Out:   ");
 	if (stdio_devices[stdout] == NULL) {
-		printf ("No output devices available!\n");
+		puts("No output devices available!\n");
 	} else {
 		printf ("%s\n", stdio_devices[stdout]->name);
 	}
 
-	printf ("Err:   ");
+	puts("Err:   ");
 	if (stdio_devices[stderr] == NULL) {
-		printf ("No error devices available!\n");
+		puts("No error devices available!\n");
 	} else {
 		printf ("%s\n", stdio_devices[stderr]->name);
 	}
@@ -390,7 +432,7 @@
 		if (strcmp(argv[2], "floppy") == 0) {
  			char *local_args[3];
 			extern int do_fdcboot (cmd_tbl_t *, int, int, char *[]);
-			printf ("\nupdating bootloader image from floppy\n");
+			puts("\nupdating bootloader image from floppy\n");
 			local_args[0] = argv[0];
 	    		if(argc==4) {
 				local_args[1] = argv[3];
@@ -415,12 +457,12 @@
 				ld_addr=load_addr;
 			}
 			printf ("\nupdating bootloader image from memory at %lX\n",ld_addr);
-			result=mpl_prg_image(ld_addr);
+			result=mpl_prg_image((uchar *)ld_addr);
 			return result;
 		}
 		if (strcmp(argv[2], "mps") == 0) {
-			printf ("\nupdating bootloader image from MPS\n");
-			result=mpl_prg(src,size);
+			puts("\nupdating bootloader image from MPS\n");
+			result=mpl_prg((uchar *)src,size);
 			return result;
 		}
 	}
diff --git a/board/mpl/common/flash.c b/board/mpl/common/flash.c
index e56e307..5f50200 100644
--- a/board/mpl/common/flash.c
+++ b/board/mpl/common/flash.c
@@ -543,7 +543,7 @@
 	while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) {
 		if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
 			printf ("Timeout\n");
-			return -1;
+			return ERR_TIMOUT;
 		}
 		/* show that we're waiting */
 		if ((now - last) > 1000) {  /* every second */
@@ -551,12 +551,12 @@
 			last = now;
 		}
 	}
-	return 0;
+	return ERR_OK;
 }
 
 int intel_wait_for_DQ7(flash_info_t *info, int sect)
 {
-	ulong start, now, last;
+	ulong start, now, last, status;
 	volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[sect]);
 
 	start = get_timer (0);
@@ -564,7 +564,7 @@
 	while ((addr[0] & (FLASH_WORD_SIZE)0x00800080) != (FLASH_WORD_SIZE)0x00800080) {
 		if ((now = get_timer(start)) > CFG_FLASH_ERASE_TOUT) {
 			printf ("Timeout\n");
-			return -1;
+			return ERR_TIMOUT;
 		}
 		/* show that we're waiting */
 		if ((now - last) > 1000) {  /* every second */
@@ -572,8 +572,11 @@
 			last = now;
 		}
 	}
-	addr[0]=(FLASH_WORD_SIZE)0x00500050;
-	return 0;
+	status = addr[0] & (FLASH_WORD_SIZE)0x00280028;
+	/* clear status register */
+	addr[0] = (FLASH_WORD_SIZE)0x00500050;
+	/* check status for block erase fail and VPP low */
+	return (status == 0 ? ERR_OK : ERR_NOT_ERASED);
 }
 
 /*-----------------------------------------------------------------------
@@ -584,7 +587,7 @@
 	volatile FLASH_WORD_SIZE *addr = (FLASH_WORD_SIZE *)(info->start[0]);
 	volatile FLASH_WORD_SIZE *addr2;
 	int flag, prot, sect, l_sect;
-	int i;
+	int i, rcode = 0;
 
 
 	if ((s_first < 0) || (s_first > s_last)) {
@@ -634,7 +637,7 @@
 				addr2[0] = (FLASH_WORD_SIZE)0x00500050;  /* block erase */
 				for (i=0; i<50; i++)
 					udelay(1000);  /* wait 1 ms */
-				wait_for_DQ7(info, sect);
+				rcode |= wait_for_DQ7(info, sect);
 			}
 			else {
 				if((info->flash_id & FLASH_VENDMASK) == FLASH_MAN_INTEL){
@@ -643,7 +646,7 @@
 					intel_wait_for_DQ7(info, sect);
 					addr2[0] = (FLASH_WORD_SIZE)0x00200020;  /* sector erase */
 					addr2[0] = (FLASH_WORD_SIZE)0x00D000D0;  /* sector erase */
-					intel_wait_for_DQ7(info, sect);
+					rcode |= intel_wait_for_DQ7(info, sect);
 				}
 				else {
 					addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
@@ -652,7 +655,7 @@
 					addr[ADDR0] = (FLASH_WORD_SIZE)0x00AA00AA;
 					addr[ADDR1] = (FLASH_WORD_SIZE)0x00550055;
 					addr2[0] = (FLASH_WORD_SIZE)0x00300030;  /* sector erase */
-					wait_for_DQ7(info, sect);
+					rcode |= wait_for_DQ7(info, sect);
 				}
 			}
 			l_sect = sect;
@@ -688,8 +691,10 @@
 	addr = (FLASH_WORD_SIZE *)info->start[0];
 	addr[0] = (FLASH_WORD_SIZE)0x00F000F0;	/* reset bank */
 
-	printf (" done\n");
-	return 0;
+	if (!rcode)
+	    printf (" done\n");
+
+	return rcode;
 }
 
 
diff --git a/board/mpl/vcma9/cmd_vcma9.c b/board/mpl/vcma9/cmd_vcma9.c
index 8df642d..44b4112 100644
--- a/board/mpl/vcma9/cmd_vcma9.c
+++ b/board/mpl/vcma9/cmd_vcma9.c
@@ -61,7 +61,7 @@
 	 	return 0;
    	}
 #if defined(CONFIG_DRIVER_CS8900)
-	if (strcmp(argv[1], "cs8900_eeprom") == 0) {
+	if (strcmp(argv[1], "cs8900") == 0) {
 		if (strcmp(argv[2], "read") == 0) {
 			uchar addr; ushort data;
 
@@ -102,12 +102,12 @@
 				/* write checksum word */
 				cs8900_e2prom_write(addr, (0 - csum) << 8);
 			} else {
-				printf("\nplease defined 'ethaddr'\n");
+				puts("\nplease defined 'ethaddr'\n");
 			}
 		} else if (strcmp(argv[2], "dump") == 0) {
 			uchar addr = 0, endaddr, csum; ushort data;
 
-			printf("Dump of CS8900 config device: ");
+			puts("Dump of CS8900 config device: ");
 			cs8900_e2prom_read(addr, &data);
 			if ((data & 0xE000) == 0xA000) {
 				endaddr = (data & 0x00FF) / 2;
@@ -119,9 +119,9 @@
 				}
 				printf("\nChecksum: %s", (csum == 0) ? "ok" : "wrong");
 			} else {
-				printf("no valid config found");
+				puts("no valid config found");
 			}
-			printf("\n");
+			puts("\n");
 		}
 
 		return 0;
diff --git a/board/mpl/vcma9/config.mk b/board/mpl/vcma9/config.mk
index 942d42e..3698c24 100644
--- a/board/mpl/vcma9/config.mk
+++ b/board/mpl/vcma9/config.mk
@@ -21,4 +21,4 @@
 
 
 #TEXT_BASE = 0x30F80000
-TEXT_BASE = 0x33F80000
+TEXT_BASE = 0x33F00000
diff --git a/board/mpl/vcma9/flash.c b/board/mpl/vcma9/flash.c
index 829396b..35cf260 100644
--- a/board/mpl/vcma9/flash.c
+++ b/board/mpl/vcma9/flash.c
@@ -133,23 +133,23 @@
     switch (info->flash_id & FLASH_VENDMASK)
     {
     case (AMD_MANUFACT & FLASH_VENDMASK):
-	printf("AMD: ");
+	puts("AMD: ");
 	break;
     default:
-	printf("Unknown Vendor ");
+	puts("Unknown Vendor ");
 	break;
     }
 
     switch (info->flash_id & FLASH_TYPEMASK)
     {
     case (AMD_ID_LV400B & FLASH_TYPEMASK):
-	printf("1x Amd29LV400BB (4Mbit)\n");
+	puts("1x Amd29LV400BB (4Mbit)\n");
 	break;
     case (AMD_ID_LV800B & FLASH_TYPEMASK):
-	printf("1x Amd29LV800BB (8Mbit)\n");
+	puts("1x Amd29LV800BB (8Mbit)\n");
 	break;
     default:
-	printf("Unknown Chip Type\n");
+	puts("Unknown Chip Type\n");
 	goto Done;
 	break;
     }
@@ -157,17 +157,17 @@
     printf("  Size: %ld MB in %d Sectors\n",
 	   info->size >> 20, info->sector_count);
 
-    printf("  Sector Start Addresses:");
+    puts("  Sector Start Addresses:");
     for (i = 0; i < info->sector_count; i++)
     {
 	if ((i % 5) == 0)
 	{
-	    printf ("\n   ");
+	    puts("\n   ");
 	}
 	printf (" %08lX%s", info->start[i],
 		info->protect[i] ? " (RO)" : "     ");
     }
-    printf ("\n");
+    puts("\n");
 
 Done:
 }
@@ -272,16 +272,16 @@
 		goto outahere;
 	    }
 
-	    printf("ok.\n");
+	    puts("ok.\n");
 	}
 	else /* it was protected */
 	{
-	    printf("protected!\n");
+	    puts("protected!\n");
 	}
     }
 
     if (ctrlc())
-      printf("User Interrupt!\n");
+      puts("User Interrupt!\n");
 
 outahere:
     /* allow flash to settle - wait 10 ms */
diff --git a/board/mpl/vcma9/vcma9.c b/board/mpl/vcma9/vcma9.c
index 4664488..db98553 100644
--- a/board/mpl/vcma9/vcma9.c
+++ b/board/mpl/vcma9/vcma9.c
@@ -327,13 +327,13 @@
 /***************************************************************************
  * some helping routines
  */
-
+#if !CONFIG_USB_KEYBOARD
 int overwrite_console(void)
 {
 	/* return TRUE if console should be overwritten */
 	return 0;
 }
-
+#endif
 
 /************************************************************************
 * Print VCMA9 Info
diff --git a/common/cmd_usb.c b/common/cmd_usb.c
index 26b39d0..150b106 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -41,7 +41,7 @@
 #endif
 static int usb_stor_curr_dev=-1; /* current device */
 
-/* somme display routines (info command) */
+/* some display routines (info command) */
 char * usb_get_class_desc(unsigned char dclass)
 {
 	switch(dclass) {
diff --git a/cpu/arm920t/usb_ohci.c b/cpu/arm920t/usb_ohci.c
index a040c13..6f4a9f7 100644
--- a/cpu/arm920t/usb_ohci.c
+++ b/cpu/arm920t/usb_ohci.c
@@ -34,11 +34,16 @@
  */
 
 #include <common.h>
-/* #include <pci.h> no PCI on the S3C2400 */
+/* #include <pci.h> no PCI on the S3C24X0 */
 
 #ifdef CONFIG_USB_OHCI
 
+#if defined(CONFIG_S3C2400)
 #include <s3c2400.h>
+#elif defined(CONFIG_S3C2410)
+#include <s3c2410.h>
+#endif
+
 #include <malloc.h>
 #include <usb.h>
 #include "usb_ohci.h"
diff --git a/cpu/mips/au1x00_eth.c b/cpu/mips/au1x00_eth.c
index c23712b..ae51b75 100644
--- a/cpu/mips/au1x00_eth.c
+++ b/cpu/mips/au1x00_eth.c
@@ -31,12 +31,24 @@
 /* We all use switches, right? ;-) */
 #endif
 
+/* I assume ethernet behaves like au1000 */
+
 #ifdef CONFIG_AU1000
 /* Base address differ between cpu:s */
 #define ETH0_BASE AU1000_ETH0_BASE
 #define MAC0_ENABLE AU1000_MAC0_ENABLE
 #else
-#error "Au1100 and Au1500 not supported"
+#ifdef CONFIG_AU1100
+#define ETH0_BASE AU1100_ETH0_BASE
+#define MAC0_ENABLE AU1100_MAC0_ENABLE
+#else
+#ifdef CONFIG_AU1500
+#define ETH0_BASE AU1500_ETH0_BASE
+#define MAC0_ENABLE AU1500_MAC0_ENABLE
+#else
+#error "No valid cpu set"
+#endif
+#endif
 #endif
 
 #include <common.h>
@@ -175,6 +187,7 @@
 	}
 
 	/* Put mac addr in little endian */
+	/* FIXME Check this for little endian mode */
 #define ea eth_get_dev()->enetaddr
 	*mac_addr_high  =	(ea[5] <<  8) | (ea[4]	    ) ;
 	*mac_addr_low   =	(ea[3] << 24) | (ea[2] << 16) |
diff --git a/drivers/cs8900.c b/drivers/cs8900.c
index d35332c..082434c 100644
--- a/drivers/cs8900.c
+++ b/drivers/cs8900.c
@@ -45,6 +45,7 @@
 
 #if (CONFIG_COMMANDS & CFG_CMD_NET)
 
+#undef DEBUG
 
 /* packet page register access functions */
 
@@ -99,6 +100,20 @@
 		/*NOP*/;
 }
 
+static void eth_reginit (void)
+{
+	/* receive only error free packets addressed to this card */
+	put_reg (PP_RxCTL, PP_RxCTL_IA | PP_RxCTL_Broadcast | PP_RxCTL_RxOK);
+	/* do not generate any interrupts on receive operations */
+	put_reg (PP_RxCFG, 0);
+	/* do not generate any interrupts on transmit operations */
+	put_reg (PP_TxCFG, 0);
+	/* do not generate any interrupts on buffer operations */
+	put_reg (PP_BufCFG, 0);
+	/* enable transmitter/receiver mode */
+	put_reg (PP_LineCTL, PP_LineCTL_Rx | PP_LineCTL_Tx);
+}
+
 void cs8900_get_enetaddr (uchar * addr)
 {
 	int i;
@@ -181,21 +196,7 @@
 	put_reg (PP_IA + 2, bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8));
 	put_reg (PP_IA + 4, bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8));
 
-	/* receive only error free packets addressed to this card */
-	put_reg (PP_RxCTL, PP_RxCTL_IA | PP_RxCTL_Broadcast | PP_RxCTL_RxOK);
-
-	/* do not generate any interrupts on receive operations */
-	put_reg (PP_RxCFG, 0);
-
-	/* do not generate any interrupts on transmit operations */
-	put_reg (PP_TxCFG, 0);
-
-	/* do not generate any interrupts on buffer operations */
-	put_reg (PP_BufCFG, 0);
-
-	/* enable transmitter/receiver mode */
-	put_reg (PP_LineCTL, PP_LineCTL_Rx | PP_LineCTL_Tx);
-
+	eth_reginit ();
 	return 0;
 }
 
@@ -215,9 +216,10 @@
 	status = CS8900_RTDATA;		/* stat */
 	rxlen = CS8900_RTDATA;		/* len */
 
+#ifdef DEBUG
 	if (rxlen > PKTSIZE_ALIGN + PKTALIGN)
 		printf ("packet too big!\n");
-
+#endif
 	for (addr = (unsigned short *) NetRxPackets[0], i = rxlen >> 1; i > 0;
 		 i--)
 		*addr++ = CS8900_RTDATA;
@@ -245,10 +247,13 @@
 	/* Test to see if the chip has allocated memory for the packet */
 	if ((get_reg (PP_BusSTAT) & PP_BusSTAT_TxRDY) == 0) {
 		/* Oops... this should not happen! */
+#ifdef DEBUG
 		printf ("cs: unable to send packet; retrying...\n");
+#endif
 		for (tmo = get_timer (0) + 5 * CFG_HZ; get_timer (0) < tmo;)
 			/*NOP*/;
 		eth_reset ();
+		eth_reginit ();
 		goto retry;
 	}
 
@@ -266,7 +271,9 @@
 
 	/* nothing */ ;
 	if ((s & (PP_TER_CRS | PP_TER_TxOK)) != PP_TER_TxOK) {
+#ifdef DEBUG
 		printf ("\ntransmission error %#x\n", s);
+#endif
 	}
 
 	return 0;
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 29eea45..f02c404 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -962,7 +962,8 @@
 		printf("No current device\n");
 		return 1;
 	}
-#if (CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI)
+#if (CONFIG_COMMANDS & CFG_CMD_IDE) || (CONFIG_COMMANDS & CFG_CMD_SCSI) || \
+    (CONFIG_COMMANDS & CFG_CMD_USB) || (CONFIG_MMC)
 	printf("Interface:  ");
 	switch(cur_dev->if_type) {
 		case IF_TYPE_IDE :	printf("IDE"); break;
diff --git a/include/asm-mips/addrspace.h b/include/asm-mips/addrspace.h
index 0d1bf32..1fd00cc 100644
--- a/include/asm-mips/addrspace.h
+++ b/include/asm-mips/addrspace.h
@@ -40,6 +40,18 @@
 #define PHYSADDR(a)		((a) & 0x1fffffff)
 #endif
 
+/* 
+ * Returns the uncached address of a sdram address 
+ */
+#ifndef __ASSEMBLY__
+#ifdef CONFIG_AU1X00
+/* We use a 36 bit physical address map here and
+   cannot access physical memory directly from core */
+#define UNCACHED_SDRAM(a) (((unsigned long)(a)) | 0x20000000)
+#else	/* !CONFIG_AU1X00 */
+#define UNCACHED_SDRAM(a) PHYSADDR(a) 
+#endif	/* CONFIG_AU1X00 */
+#endif	/* __ASSEMBLY__ */
 /*
  * Map an address to a certain kernel segment
  */
diff --git a/include/configs/MIP405.h b/include/configs/MIP405.h
index 61a799d..9c21745 100644
--- a/include/configs/MIP405.h
+++ b/include/configs/MIP405.h
@@ -218,7 +218,7 @@
 #define CFG_FLASH_BASE		0xFFF80000
 #define CFG_MONITOR_BASE	CFG_FLASH_BASE
 #define CFG_MONITOR_LEN		(512 * 1024)	/* Reserve 512 kB for Monitor	*/
-#define CFG_MALLOC_LEN		(128 * 1024)	/* Reserve 128 kB for malloc()	*/
+#define CFG_MALLOC_LEN		(1024 * 1024)	/* Reserve 1024 kB for malloc()	*/
 
 /*
  * For booting Linux, the board info and command line data
@@ -394,6 +394,11 @@
 #endif
 
 /************************************************************
+ * support BZIP2 compression
+ ************************************************************/
+#define CONFIG_BZIP2		1
+
+/************************************************************
  * Ident
  ************************************************************/
 
diff --git a/include/configs/PIP405.h b/include/configs/PIP405.h
index b9107cc..2cd5726 100644
--- a/include/configs/PIP405.h
+++ b/include/configs/PIP405.h
@@ -204,7 +204,7 @@
 #define CFG_FLASH_BASE		0xFFF80000
 #define CFG_MONITOR_BASE	CFG_FLASH_BASE
 #define CFG_MONITOR_LEN		(512 * 1024)	/* Reserve 512 kB for Monitor	*/
-#define CFG_MALLOC_LEN		(128 * 1024)	/* Reserve 128 kB for malloc()	*/
+#define CFG_MALLOC_LEN		(1024 * 1024)	/* Reserve 1024 kB for malloc()	*/
 
 /*
  * For booting Linux, the board info and command line data
@@ -371,6 +371,11 @@
 #endif
 
 /************************************************************
+ * support BZIP2 compression
+ ************************************************************/
+#define CONFIG_BZIP2		1
+
+/************************************************************
  * Ident
  ************************************************************/
 #define VERSION_TAG "released"
diff --git a/include/configs/VCMA9.h b/include/configs/VCMA9.h
index 8a09da6..9ca80ab 100644
--- a/include/configs/VCMA9.h
+++ b/include/configs/VCMA9.h
@@ -42,6 +42,7 @@
 #define CONFIG_ARM920T		1	/* This is an ARM920T Core	*/
 #define	CONFIG_S3C2410		1	/* in a SAMSUNG S3C2410 SoC     */
 #define CONFIG_VCMA9		1	/* on a MPL VCMA9 Board  */
+#define LITTLEENDIAN		1	/* used by usb_ohci.c		*/
 
 /* input clock of PLL */
 #define CONFIG_SYS_CLK_FREQ	12000000/* VCMA9 has 12MHz input clock	*/
@@ -63,10 +64,13 @@
 			/*CFG_CMD_NAND	 |*/ \
 			CFG_CMD_EEPROM	 | \
 			CFG_CMD_I2C	 | \
-			/*CFG_CMD_USB	 |*/ \
+			CFG_CMD_USB	 | \
 			CFG_CMD_REGINFO  | \
+			CFG_CMD_FAT	 | \
 			CFG_CMD_DATE	 | \
 			CFG_CMD_ELF	 | \
+			CFG_CMD_DHCP	 | \
+			CFG_CMD_PING	 | \
 			CFG_CMD_BSP)
 
 /* this must be included after the definiton of CONFIG_COMMANDS */
@@ -96,11 +100,11 @@
 /*
  * Size of malloc() pool
  */
-#define CONFIG_MALLOC_SIZE	(CFG_ENV_SIZE + 128*1024)
-#define CFG_GBL_DATA_SIZE	128	/* size in bytes reserved for initial data */
+/*#define CONFIG_MALLOC_SIZE	(CFG_ENV_SIZE + 128*1024)*/
+#define CFG_GBL_DATA_SIZE	128		/* size in bytes reserved for initial data */
 
 #define CFG_MONITOR_LEN		(256 * 1024)
-#define CFG_MALLOC_LEN		(128 * 1024)
+#define CFG_MALLOC_LEN		(1024 * 1024)	/* BUNZIP2 needs a lot of RAM */
 
 /*
  * Hardware drivers
@@ -119,14 +123,13 @@
 /************************************************************
  * USB support
  ************************************************************/
-#if 0
-#define CONFIG_USB_OHCI
-#define CONFIG_USB_KEYBOARD
-#define CONFIG_USB_STORAGE
+#define CONFIG_USB_OHCI		1
+#define CONFIG_USB_KEYBOARD	1
+#define CONFIG_USB_STORAGE	1
+#define CONFIG_DOS_PARTITION	1
 
 /* Enable needed helper functions */
 #define CFG_DEVICE_DEREGISTER		/* needs device_deregister */
-#endif
 
 /************************************************************
  * RTC
@@ -139,7 +142,11 @@
 
 #define CONFIG_BAUDRATE		9600
 
-#define CONFIG_BOOTDELAY	3
+#define CONFIG_BOOTDELAY	5
+/* autoboot (do NOT change this set environment variable "bootdelay" to -1 instead) */
+#define CONFIG_BOOT_RETRY_TIME	-10	/* feature is avaiable but not enabled */
+#define CONFIG_ZERO_BOOTDELAY_CHECK  	/* check console even if bootdelay = 0 */
+
 #define CONFIG_NETMASK          255.255.255.0
 #define CONFIG_IPADDR		10.0.0.110
 #define CONFIG_SERVERIP		10.0.0.1
@@ -176,6 +183,9 @@
 /* valid baudrates */
 #define CFG_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200 }
 
+/* support BZIP2 compression */
+#define CONFIG_BZIP2		1
+
 /************************************************************
  * Ident
  ************************************************************/
diff --git a/include/configs/dbau1x00.h b/include/configs/dbau1x00.h
index 7aa90b7..6f647f2 100644
--- a/include/configs/dbau1x00.h
+++ b/include/configs/dbau1x00.h
@@ -32,9 +32,20 @@
 #define CONFIG_DBAU1X00		1
 #define CONFIG_AU1X00           1  /* alchemy series cpu */
 
+#ifdef CONFIG_DBAU1000
 /* Also known as Merlot */
-#define CONFIG_DBAU1000         1  /* board, Hardcoded for now */
-#define CONFIG_AU1000           1  /* cpu, Hardcoded for now */
+#define CONFIG_AU1000           1
+#else
+#ifdef CONFIG_DBAU1100
+#define CONFIG_AU1100           1
+#else
+#ifdef CONFIG_DBAU1500
+#define CONFIG_AU1500           1
+#else  
+#error "No valid board set"
+#endif
+#endif
+#endif
 
 #define CONFIG_ETHADDR          DE:AD:BE:EF:01:01    /* Ethernet address */
 
diff --git a/lib_arm/armlinux.c b/lib_arm/armlinux.c
index 0b3d01e..19680b5 100644
--- a/lib_arm/armlinux.c
+++ b/lib_arm/armlinux.c
@@ -83,7 +83,7 @@
 	ulong len = 0, checksum;
 	ulong initrd_start, initrd_end;
 	ulong data;
-	void (*theKernel) (int zero, int arch);
+	void (*theKernel)(int zero, int arch, uint params);
 	image_header_t *hdr = &header;
 	bd_t *bd = gd->bd;
 
@@ -91,7 +91,7 @@
 	char *commandline = getenv ("bootargs");
 #endif
 
-	theKernel = (void (*)(int, int)) ntohl (hdr->ih_ep);
+	theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);
 
 	/*
 	 * Check if there is an initrd image
@@ -244,7 +244,7 @@
 
 	cleanup_before_linux ();
 
-	theKernel (0, bd->bi_arch_number);
+	theKernel (0, bd->bi_arch_number, bd->bi_boot_params);
 }
 
 
diff --git a/lib_mips/mips_linux.c b/lib_mips/mips_linux.c
index 0f01198..18eafe1 100644
--- a/lib_mips/mips_linux.c
+++ b/lib_mips/mips_linux.c
@@ -182,7 +182,7 @@
 		(ulong) theKernel);
 #endif
 
-	linux_params_init (PHYSADDR (gd->bd->bi_boot_params), commandline);
+	linux_params_init (UNCACHED_SDRAM (gd->bd->bi_boot_params), commandline);
 
 #ifdef CONFIG_MEMSIZE_IN_BYTES
 	sprintf (env_buf, "%lu", gd->ram_size);
@@ -198,7 +198,7 @@
 
 	linux_env_set ("memsize", env_buf);
 
-	sprintf (env_buf, "0x%08X", (uint) PHYSADDR (initrd_start));
+	sprintf (env_buf, "0x%08X", (uint) UNCACHED_SDRAM (initrd_start));
 	linux_env_set ("initrd_start", env_buf);
 
 	sprintf (env_buf, "0x%X", (uint) (initrd_end - initrd_start));