* The PS/2 mux on the BMS2003 board needs 450 ms after power on
  before we can access it; add delay in case we are faster (with no
  CF card inserted)

* Cleanup of some init functions

* Make sure SCC Ethernet is always stopped by the time we boot Linux
  to avoid Linux crashes by early packets coming in.

* Accelerate flash accesses on LWMON board by using buffered writes
diff --git a/board/LEOX/elpt860/elpt860.c b/board/LEOX/elpt860/elpt860.c
index c8bc41a..82a831f 100644
--- a/board/LEOX/elpt860/elpt860.c
+++ b/board/LEOX/elpt860/elpt860.c
@@ -33,7 +33,7 @@
 /*
 ** Note 1: In this file, you have to provide the following functions:
 ** ------
-**              int             board_pre_init(void)
+**              int             board_early_init_f(void)
 **              int             checkboard(void)
 **              long int        initdram(int board_type)
 ** called from 'board_init_f()' into 'common/board.c'
@@ -145,7 +145,7 @@
 /*
  * Very early board init code (fpga boot, etc.)
  */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	volatile immap_t *immr = (immap_t *) CFG_IMMR;
 
diff --git a/board/MAI/AmigaOneG3SE/articiaS.c b/board/MAI/AmigaOneG3SE/articiaS.c
index 9fd6b95..a4dad64 100644
--- a/board/MAI/AmigaOneG3SE/articiaS.c
+++ b/board/MAI/AmigaOneG3SE/articiaS.c
@@ -675,7 +675,7 @@
 	asm volatile ("mtmsr %0"::"r" (msr));
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	unsigned char c_value = 0;
 	unsigned long msr;
diff --git a/board/Marvell/common/bootseq.txt b/board/Marvell/common/bootseq.txt
index 648c2ff..391d49a 100644
--- a/board/Marvell/common/bootseq.txt
+++ b/board/Marvell/common/bootseq.txt
@@ -58,7 +58,7 @@
     call cpu_init_f
     	debug leds
     board_init_f: (common/board.c)
-	board_pre_init:
+	board_early_init_f:
 	    remap gt regs?
 	    map PCI mem/io
 	    map device space
diff --git a/board/Marvell/db64360/db64360.c b/board/Marvell/db64360/db64360.c
index 438700a..7cadafd 100644
--- a/board/Marvell/db64360/db64360.c
+++ b/board/Marvell/db64360/db64360.c
@@ -61,7 +61,7 @@
 
 /* Unfortunately, we cant change it while we are in flash, so we initialize it
  * to the "final" value. This means that any debug_led calls before
- * board_pre_init wont work right (like in cpu_init_f).
+ * board_early_init_f wont work right (like in cpu_init_f).
  * See also my_remap_gt_regs below. (NTL)
  */
 
@@ -237,11 +237,11 @@
 }
 
 /*
- * board_pre_init.
+ * board_early_init_f.
  *
  * set up gal. device mappings, etc.
  */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	uchar sram_boot = 0;
 
diff --git a/board/Marvell/db64460/db64460.c b/board/Marvell/db64460/db64460.c
index 572dc47..85b2331 100644
--- a/board/Marvell/db64460/db64460.c
+++ b/board/Marvell/db64460/db64460.c
@@ -61,7 +61,7 @@
 
 /* Unfortunately, we cant change it while we are in flash, so we initialize it
  * to the "final" value. This means that any debug_led calls before
- * board_pre_init wont work right (like in cpu_init_f).
+ * board_early_init_f wont work right (like in cpu_init_f).
  * See also my_remap_gt_regs below. (NTL)
  */
 
@@ -237,11 +237,11 @@
 }
 
 /*
- * board_pre_init.
+ * board_early_init_f.
  *
  * set up gal. device mappings, etc.
  */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	uchar sram_boot = 0;
 
diff --git a/board/altera/dk1c20/dk1c20.c b/board/altera/dk1c20/dk1c20.c
index 96f1ece..3954486 100644
--- a/board/altera/dk1c20/dk1c20.c
+++ b/board/altera/dk1c20/dk1c20.c
@@ -31,7 +31,7 @@
 	printf ("default_hdlr\n");
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/* init seven segment led display and switch off */
 	sevenseg_set(SEVENSEG_OFF);
diff --git a/board/altera/dk1s10/dk1s10.c b/board/altera/dk1s10/dk1s10.c
index 6d7be2d..832a0b9 100644
--- a/board/altera/dk1s10/dk1s10.c
+++ b/board/altera/dk1s10/dk1s10.c
@@ -31,7 +31,7 @@
 	printf ("default_hdlr\n");
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/* init seven segment led display and switch off */
 	sevenseg_set(SEVENSEG_OFF);
diff --git a/board/bubinga405ep/bubinga405ep.c b/board/bubinga405ep/bubinga405ep.c
index f73b166..0be7965 100644
--- a/board/bubinga405ep/bubinga405ep.c
+++ b/board/bubinga405ep/bubinga405ep.c
@@ -26,7 +26,7 @@
 #include <asm/processor.h>
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	mtdcr (uicsr, 0xFFFFFFFF);      /* clear all ints */
 	mtdcr (uicer, 0x00000000);      /* disable all ints */
diff --git a/board/cpc45/cpc45.c b/board/cpc45/cpc45.c
index 455cc12..f44a59d 100644
--- a/board/cpc45/cpc45.c
+++ b/board/cpc45/cpc45.c
@@ -32,7 +32,7 @@
 	/* We have to clear the initial data area here. Couldn't have done it
 	 * earlier because DRAM had not been initialized.
 	 */
-int board_pre_init(void)
+int board_early_init_f(void)
 {
 
 	/* enable DUAL UART Mode on CPC45 */
diff --git a/board/cradle/cradle.c b/board/cradle/cradle.c
index f599a31..f5c99b1 100644
--- a/board/cradle/cradle.c
+++ b/board/cradle/cradle.c
@@ -170,7 +170,7 @@
 
 int
 /**********************************************************/
-board_post_init (void)
+board_late_init (void)
 /**********************************************************/
 {
 	return (0);
diff --git a/board/cray/L1/L1.c b/board/cray/L1/L1.c
index af0456d..fb28c42 100644
--- a/board/cray/L1/L1.c
+++ b/board/cray/L1/L1.c
@@ -109,7 +109,7 @@
 static void init_sdram (void);
 
 /* ------------------------------------------------------------------------- */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/* Running from ROM: global data is still READONLY */
 	init_sdram ();
diff --git a/board/dave/PPChameleonEVB/PPChameleonEVB.c b/board/dave/PPChameleonEVB/PPChameleonEVB.c
index 61f7031..603bb1e 100644
--- a/board/dave/PPChameleonEVB/PPChameleonEVB.c
+++ b/board/dave/PPChameleonEVB/PPChameleonEVB.c
@@ -51,7 +51,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	out32(GPIO0_OR, CFG_NAND0_CE);                 /* set initial outputs     */
 	out32(GPIO0_OR, CFG_NAND1_CE);                 /* set initial outputs     */
diff --git a/board/ebony/ebony.c b/board/ebony/ebony.c
index bb284ae..a5b3fb6 100644
--- a/board/ebony/ebony.c
+++ b/board/ebony/ebony.c
@@ -32,7 +32,7 @@
 
 long int fixed_sdram (void);
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	uint reg;
 	unsigned char *fpga_base = (unsigned char *) CFG_FPGA_BASE;
diff --git a/board/eltec/mhpc/mhpc.c b/board/eltec/mhpc/mhpc.c
index f084ce3..76f9f37 100644
--- a/board/eltec/mhpc/mhpc.c
+++ b/board/eltec/mhpc/mhpc.c
@@ -104,7 +104,7 @@
 
 /* ------------------------------------------------------------------------- */
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
     volatile immap_t  *im = (immap_t *)CFG_IMMR;
     volatile cpm8xx_t *cp = &(im->im_cpm);
diff --git a/board/ep8260/ep8260.c b/board/ep8260/ep8260.c
index a49c53e..7a2c23f 100644
--- a/board/ep8260/ep8260.c
+++ b/board/ep8260/ep8260.c
@@ -188,7 +188,7 @@
  * Setup CS4 to enable the Board Control/Status registers.
  * Otherwise the smcs won't work.
 */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
     volatile t_ep_regs *regs = (t_ep_regs*)CFG_REGS_BASE;
     volatile immap_t *immap  = (immap_t *)CFG_IMMR;
diff --git a/board/eric/eric.c b/board/eric/eric.c
index 17fe6ac..860e506 100644
--- a/board/eric/eric.c
+++ b/board/eric/eric.c
@@ -31,7 +31,7 @@
 #define IBM405GP_GPIO0_ODR     0xef600718	/* GPIO Open Drain */
 #define IBM405GP_GPIO0_IR      0xef60071c	/* GPIO Input */
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 
    /*-------------------------------------------------------------------------+
diff --git a/board/esd/adciop/adciop.c b/board/esd/adciop/adciop.c
index 0c12e98..93bc843 100644
--- a/board/esd/adciop/adciop.c
+++ b/board/esd/adciop/adciop.c
@@ -31,7 +31,7 @@
 /* ------------------------------------------------------------------------- */
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * Set port pin in escc2 to keep living, and configure user led output
diff --git a/board/esd/ar405/ar405.c b/board/esd/ar405/ar405.c
index d0b06e6..6535a19 100644
--- a/board/esd/ar405/ar405.c
+++ b/board/esd/ar405/ar405.c
@@ -46,7 +46,7 @@
 #include "../common/fpga.c"
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	DECLARE_GLOBAL_DATA_PTR;
 
diff --git a/board/esd/ash405/ash405.c b/board/esd/ash405/ash405.c
index 39b2dfc..22b3828 100644
--- a/board/esd/ash405/ash405.c
+++ b/board/esd/ash405/ash405.c
@@ -50,7 +50,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/canbt/canbt.c b/board/esd/canbt/canbt.c
index ae0e880..ab49249 100644
--- a/board/esd/canbt/canbt.c
+++ b/board/esd/canbt/canbt.c
@@ -48,7 +48,7 @@
 #include "../common/fpga.c"
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	DECLARE_GLOBAL_DATA_PTR;
 
diff --git a/board/esd/cpci405/cpci405.c b/board/esd/cpci405/cpci405.c
index 461e3a5..1b90d05 100644
--- a/board/esd/cpci405/cpci405.c
+++ b/board/esd/cpci405/cpci405.c
@@ -57,7 +57,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 #ifndef CONFIG_CPCI405_VER2
 	int index, len, i;
diff --git a/board/esd/cpci440/cpci440.c b/board/esd/cpci440/cpci440.c
index 66cfe06..20c8303 100644
--- a/board/esd/cpci440/cpci440.c
+++ b/board/esd/cpci440/cpci440.c
@@ -28,7 +28,7 @@
 
 long int fixed_sdram( void );
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	uint reg;
 
diff --git a/board/esd/cpciiser4/cpciiser4.c b/board/esd/cpciiser4/cpciiser4.c
index 725abe9..e90f4ea 100644
--- a/board/esd/cpciiser4/cpciiser4.c
+++ b/board/esd/cpciiser4/cpciiser4.c
@@ -52,7 +52,7 @@
 #include "../common/fpga.c"
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	DECLARE_GLOBAL_DATA_PTR;
 
diff --git a/board/esd/dasa_sim/dasa_sim.c b/board/esd/dasa_sim/dasa_sim.c
index c1b9093..57a971f 100644
--- a/board/esd/dasa_sim/dasa_sim.c
+++ b/board/esd/dasa_sim/dasa_sim.c
@@ -137,7 +137,7 @@
 }
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * Init pci regs
diff --git a/board/esd/dp405/dp405.c b/board/esd/dp405/dp405.c
index 6d99b60..84a4a33 100644
--- a/board/esd/dp405/dp405.c
+++ b/board/esd/dp405/dp405.c
@@ -35,7 +35,7 @@
 int filesize = sizeof(fpgadata);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/du405/du405.c b/board/esd/du405/du405.c
index 7b430ea..6e43bb0 100644
--- a/board/esd/du405/du405.c
+++ b/board/esd/du405/du405.c
@@ -53,7 +53,7 @@
 #include "../common/fpga.c"
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	DECLARE_GLOBAL_DATA_PTR;
 
diff --git a/board/esd/hub405/hub405.c b/board/esd/hub405/hub405.c
index ba8e8e3..d8e3be2 100644
--- a/board/esd/hub405/hub405.c
+++ b/board/esd/hub405/hub405.c
@@ -29,7 +29,7 @@
 /* ------------------------------------------------------------------------- */
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/ocrtc/ocrtc.c b/board/esd/ocrtc/ocrtc.c
index 0600273..dc425ae 100644
--- a/board/esd/ocrtc/ocrtc.c
+++ b/board/esd/ocrtc/ocrtc.c
@@ -29,7 +29,7 @@
 
 /* ------------------------------------------------------------------------- */
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/pci405/pci405.c b/board/esd/pci405/pci405.c
index cc45fa9..44bfe10 100644
--- a/board/esd/pci405/pci405.c
+++ b/board/esd/pci405/pci405.c
@@ -53,7 +53,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	unsigned long cntrl0Reg;
 
diff --git a/board/esd/plu405/plu405.c b/board/esd/plu405/plu405.c
index 2efd56d..ebefa67 100644
--- a/board/esd/plu405/plu405.c
+++ b/board/esd/plu405/plu405.c
@@ -50,7 +50,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/pmc405/pmc405.c b/board/esd/pmc405/pmc405.c
index 5410a56..6d2432c 100644
--- a/board/esd/pmc405/pmc405.c
+++ b/board/esd/pmc405/pmc405.c
@@ -35,7 +35,7 @@
 int filesize = sizeof(fpgadata);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/esd/voh405/voh405.c b/board/esd/voh405/voh405.c
index d951138..d62c570 100644
--- a/board/esd/voh405/voh405.c
+++ b/board/esd/voh405/voh405.c
@@ -50,7 +50,7 @@
 int gunzip(void *, int, unsigned char *, int *);
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	/*
 	 * IRQ 0-15  405GP internally generated; active high; level sensitive
diff --git a/board/evb64260/bootseq.txt b/board/evb64260/bootseq.txt
index 648c2ff..391d49a 100644
--- a/board/evb64260/bootseq.txt
+++ b/board/evb64260/bootseq.txt
@@ -58,7 +58,7 @@
     call cpu_init_f
     	debug leds
     board_init_f: (common/board.c)
-	board_pre_init:
+	board_early_init_f:
 	    remap gt regs?
 	    map PCI mem/io
 	    map device space
diff --git a/board/evb64260/evb64260.c b/board/evb64260/evb64260.c
index 99717be..6a9d164 100644
--- a/board/evb64260/evb64260.c
+++ b/board/evb64260/evb64260.c
@@ -57,7 +57,7 @@
 
 /* Unfortunately, we cant change it while we are in flash, so we initialize it
  * to the "final" value. This means that any debug_led calls before
- * board_pre_init wont work right (like in cpu_init_f).
+ * board_early_init_f wont work right (like in cpu_init_f).
  * See also my_remap_gt_regs below. (NTL)
  */
 
@@ -182,11 +182,11 @@
 }
 
 /*
- * board_pre_init.
+ * board_early_init_f.
  *
  * set up gal. device mappings, etc.
  */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	uchar sram_boot = 0;
 
diff --git a/board/exbitgen/exbitgen.c b/board/exbitgen/exbitgen.c
index f2cd8ca..39a9722 100644
--- a/board/exbitgen/exbitgen.c
+++ b/board/exbitgen/exbitgen.c
@@ -4,7 +4,7 @@
 #include "exbitgen.h"
 
 /* ************************************************************************ */
-int board_pre_init (void)
+int board_early_init_f (void)
 /* ------------------------------------------------------------------------ --
  * Purpose     :
  * Remarks     :
diff --git a/board/ip860/ip860.c b/board/ip860/ip860.c
index d66621c..5b634e4 100644
--- a/board/ip860/ip860.c
+++ b/board/ip860/ip860.c
@@ -85,7 +85,7 @@
 
 
 /* ------------------------------------------------------------------------- */
-int board_pre_init(void)
+int board_early_init_f(void)
 {
     volatile immap_t     *immap  = (immap_t *)CFG_IMMR;
     volatile memctl8xx_t *memctl = &immap->im_memctl;
diff --git a/board/ixdp425/ixdp425.c b/board/ixdp425/ixdp425.c
index 22617b3..1b34f96 100644
--- a/board/ixdp425/ixdp425.c
+++ b/board/ixdp425/ixdp425.c
@@ -40,7 +40,7 @@
 
 int
 /**********************************************************/
-board_post_init (void)
+board_late_init (void)
 /**********************************************************/
 {
 	return (0);
diff --git a/board/lubbock/lubbock.c b/board/lubbock/lubbock.c
index dcb5087..353c722 100644
--- a/board/lubbock/lubbock.c
+++ b/board/lubbock/lubbock.c
@@ -50,10 +50,10 @@
 	return 0;
 }
 
-int board_post_init(void)
+int board_late_init(void)
 {
-   setenv("stdout", "serial");
-   setenv("stderr", "serial");
+	setenv("stdout", "serial");
+	setenv("stderr", "serial");
 	return 0;
 }
 
@@ -71,5 +71,5 @@
 	gd->bd->bi_dram[3].start = PHYS_SDRAM_4;
 	gd->bd->bi_dram[3].size = PHYS_SDRAM_4_SIZE;
 
-   return 0;
+	return 0;
 }
diff --git a/board/lwmon/flash.c b/board/lwmon/flash.c
index 127738a..4004865 100644
--- a/board/lwmon/flash.c
+++ b/board/lwmon/flash.c
@@ -47,6 +47,9 @@
  */
 static ulong flash_get_size (vu_long *addr, flash_info_t *info);
 static int write_data (flash_info_t *info, ulong dest, ulong data);
+#ifdef CFG_FLASH_USE_BUFFER_WRITE
+static int write_data_buf (flash_info_t * info, ulong dest, uchar * cp, int len);
+#endif
 static void flash_get_offsets (ulong base, flash_info_t *info);
 
 /*-----------------------------------------------------------------------
@@ -480,6 +483,17 @@
 	/*
 	 * handle FLASH_WIDTH aligned part
 	 */
+#ifdef CFG_FLASH_USE_BUFFER_WRITE
+	while(cnt >= FLASH_WIDTH) {
+		i = CFG_FLASH_BUFFER_SIZE > cnt ?
+		    (cnt & ~(FLASH_WIDTH - 1)) : CFG_FLASH_BUFFER_SIZE;
+		if((rc = write_data_buf(info, wp, src,i)) != 0)
+			return rc;
+		wp += i;
+		src += i;
+		cnt -=i;
+	}
+#else
 	while (cnt >= FLASH_WIDTH) {
 		data = 0;
 		for (i=0; i<FLASH_WIDTH; ++i) {
@@ -491,6 +505,7 @@
 		wp  += FLASH_WIDTH;
 		cnt -= FLASH_WIDTH;
 	}
+#endif /* CFG_FLASH_USE_BUFFER_WRITE */
 
 	if (cnt == 0) {
 		return (0);
@@ -512,6 +527,28 @@
 }
 
 /*-----------------------------------------------------------------------
+ * Check flash status, returns:
+ * 0 - OK
+ * 1 - timeout
+ */
+static int flash_status_check(vu_long *addr, ulong tout, char * prompt)
+{
+	ulong status;
+	ulong start;
+
+	/* Wait for command completion */
+	start = get_timer (0);
+	while(((status = *addr) & 0x00800080) != 0x00800080) {
+		if (get_timer(start) > tout) {
+			printf("Flash %s timeout at address %p\n", prompt, addr);
+			*addr = 0x00FF00FF;	/* restore read mode */
+			return (1);
+		}
+	}
+	return 0;
+}
+
+/*-----------------------------------------------------------------------
  * Write a word to Flash, returns:
  * 0 - OK
  * 1 - write timeout
@@ -520,8 +557,6 @@
 static int write_data (flash_info_t *info, ulong dest, ulong data)
 {
 	vu_long *addr = (vu_long *)dest;
-	ulong status;
-	ulong start;
 	int flag;
 
 	/* Check if Flash is (sufficiently) erased */
@@ -538,13 +573,8 @@
 	if (flag)
 		enable_interrupts();
 
-	start = get_timer (0);
-
-	while (((status = *addr) & 0x00800080) != 0x00800080) {
-		if (get_timer(start) > CFG_FLASH_WRITE_TOUT) {
-			*addr = 0x00FF00FF;	/* restore read mode */
-			return (1);
-		}
+	if (flash_status_check(addr, CFG_FLASH_WRITE_TOUT, "write") != 0) {
+		return (1);
 	}
 
 	*addr = 0x00FF00FF;	/* restore read mode */
@@ -552,5 +582,46 @@
 	return (0);
 }
 
+#ifdef CFG_FLASH_USE_BUFFER_WRITE
+/*-----------------------------------------------------------------------
+ * Write a buffer to Flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ */
+static int write_data_buf(flash_info_t * info, ulong dest, uchar * cp, int len)
+{
+	vu_long *addr = (vu_long *)dest;
+	int sector;
+	int cnt;
+	int retcode;
+	vu_long * src = (vu_long *)cp;
+	vu_long * dst = (vu_long *)dest;
+
+	/* find sector */
+	for(sector = info->sector_count - 1; sector >= 0; sector--) {
+		if(dest >= info->start[sector])
+			break;
+	}
+
+	*addr = 0x00500050;		/* clear status */
+	*addr = 0x00e800e8;		/* write buffer */
+
+	if((retcode = flash_status_check(addr, CFG_FLASH_BUFFER_WRITE_TOUT,
+					 "write to buffer")) == 0) {
+		cnt = len / FLASH_WIDTH;
+		*addr = (cnt-1) | ((cnt-1) << 16);
+		while(cnt-- > 0) {
+			*dst++ = *src++;
+		}
+		*addr = 0x00d000d0;		/* write buffer confirm */
+		retcode = flash_status_check(addr, CFG_FLASH_BUFFER_WRITE_TOUT,
+						 "buffer write");
+	}
+	*addr = 0x00FF00FF;	/* restore read mode */
+	*addr = 0x00500050;	/* clear status */
+	return retcode;
+}
+#endif /* CFG_USE_FLASH_BUFFER_WRITE */
+
 /*-----------------------------------------------------------------------
  */
diff --git a/board/lwmon/lwmon.c b/board/lwmon/lwmon.c
index 3ec9fa5..6776dbf 100644
--- a/board/lwmon/lwmon.c
+++ b/board/lwmon/lwmon.c
@@ -339,14 +339,14 @@
 #endif
 
 /***********************************************************************
-F* Function:     int board_pre_init (void) P*A*Z*
+F* Function:     int board_early_init_f (void) P*A*Z*
  *
 P* Parameters:   none
 P*
 P* Returnvalue:  int
 P*                - 0 is always returned.
  *
-Z* Intention:    This function is the board_pre_init() method implementation
+Z* Intention:    This function is the board_early_init_f() method implementation
 Z*               for the lwmon board.
 Z*               Disable Ethernet TENA on Port B.
  *
@@ -354,7 +354,7 @@
 C* Coding:       wd@denx.de
 V* Verification: dzu@denx.de
  ***********************************************************************/
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	volatile immap_t *immr = (immap_t *) CFG_IMMR;
 
diff --git a/board/ml2/ml2.c b/board/ml2/ml2.c
index 6cc1bec..ff5f816 100644
--- a/board/ml2/ml2.c
+++ b/board/ml2/ml2.c
@@ -22,7 +22,7 @@
 #include <asm/processor.h>
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	return 0;
 }
diff --git a/board/mpc8260ads/mpc8260ads.c b/board/mpc8260ads/mpc8260ads.c
index 3de0387..67a7523 100644
--- a/board/mpc8260ads/mpc8260ads.c
+++ b/board/mpc8260ads/mpc8260ads.c
@@ -225,7 +225,7 @@
 #endif /* CONFIG_MII */
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	vu_long *bcsr = (vu_long *)CFG_BCSR;
 
diff --git a/board/mpc8266ads/mpc8266ads.c b/board/mpc8266ads/mpc8266ads.c
index e2c98b1..8f7273c 100644
--- a/board/mpc8266ads/mpc8266ads.c
+++ b/board/mpc8266ads/mpc8266ads.c
@@ -232,7 +232,7 @@
 }
 
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
     volatile bcsr_t  *bcsr         = (bcsr_t *)CFG_BCSR;
     volatile pci_ic_t *pci_ic      = (pci_ic_t *) CFG_PCI_INT;
diff --git a/board/mpc8540ads/mpc8540ads.c b/board/mpc8540ads/mpc8540ads.c
index c21cd9e..0644de8 100644
--- a/board/mpc8540ads/mpc8540ads.c
+++ b/board/mpc8540ads/mpc8540ads.c
@@ -47,7 +47,7 @@
 } bcsr_t;
 #endif
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 #if defined(CONFIG_PCI)
     volatile immap_t *immr = (immap_t *)CFG_IMMR;
diff --git a/board/mpc8560ads/mpc8560ads.c b/board/mpc8560ads/mpc8560ads.c
index 5567b69..823ab0d 100644
--- a/board/mpc8560ads/mpc8560ads.c
+++ b/board/mpc8560ads/mpc8560ads.c
@@ -199,7 +199,7 @@
 	volatile unsigned char bcsr5;
 } bcsr_t;
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 #if defined(CONFIG_PCI)
     volatile immap_t *immr = (immap_t *)CFG_IMMR;
diff --git a/board/mpl/mip405/mip405.c b/board/mpl/mip405/mip405.c
index c147175..709e1a4 100644
--- a/board/mpl/mip405/mip405.c
+++ b/board/mpl/mip405/mip405.c
@@ -469,7 +469,7 @@
 	return (0);
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	init_sdram ();
 
diff --git a/board/mpl/pip405/pip405.c b/board/mpl/pip405/pip405.c
index b4715aa..590bd20 100644
--- a/board/mpl/pip405/pip405.c
+++ b/board/mpl/pip405/pip405.c
@@ -176,7 +176,7 @@
 
 #endif
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	unsigned char dataout[1];
 	unsigned char datain[128];
diff --git a/board/netvia/netvia.c b/board/netvia/netvia.c
index db36b22..fb7f770 100644
--- a/board/netvia/netvia.c
+++ b/board/netvia/netvia.c
@@ -356,7 +356,7 @@
 #error Unknown NETVIA board version.
 #endif
 
-int board_pre_init(void)
+int board_early_init_f(void)
 {
 	volatile immap_t *immap = (immap_t *) CFG_IMMR;
 	volatile iop8xx_t *ioport = &immap->im_ioport;
diff --git a/board/oxc/oxc.c b/board/oxc/oxc.c
index 8ac0e79..fa7ff02 100644
--- a/board/oxc/oxc.c
+++ b/board/oxc/oxc.c
@@ -87,7 +87,7 @@
 	pci_mpc824x_init(&hose);
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	*(volatile unsigned char *)(CFG_CPLD_RESET) = 0x89;
 	return 0;
diff --git a/board/pcippc2/pcippc2.c b/board/pcippc2/pcippc2.c
index a0fe39a..231b505 100644
--- a/board/pcippc2/pcippc2.c
+++ b/board/pcippc2/pcippc2.c
@@ -75,7 +75,7 @@
 	return (-1);
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	out32 (REG (CPC0, RSTR), 0xC0000000);
 	iobarrier_rw ();
diff --git a/board/rpxsuper/rpxsuper.c b/board/rpxsuper/rpxsuper.c
index 50b3c5c..b4331f1 100644
--- a/board/rpxsuper/rpxsuper.c
+++ b/board/rpxsuper/rpxsuper.c
@@ -191,7 +191,7 @@
  * Setup CS4 to enable the Board Control/Status registers.
  * Otherwise the smcs won't work.
 */
-int board_pre_init (void)
+int board_early_init_f (void)
 {
     volatile t_rpx_regs *regs = (t_rpx_regs*)CFG_REGS_BASE;
     volatile immap_t *immap  = (immap_t *)CFG_IMMR;
diff --git a/board/siemens/IAD210/IAD210.c b/board/siemens/IAD210/IAD210.c
index 1243887..52cd4e6 100644
--- a/board/siemens/IAD210/IAD210.c
+++ b/board/siemens/IAD210/IAD210.c
@@ -228,7 +228,7 @@
 	iop->iop_pdpar |= 0x0080;	/* set pin as MII_clock */
 }
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 	volatile immap_t *immap = (immap_t *) CFG_IMMR;
 	volatile cpmtimer8xx_t *timers = &immap->im_cpmtimer;
diff --git a/board/tqm8xx/tqm8xx.c b/board/tqm8xx/tqm8xx.c
index 1fbceb5..73bee32 100644
--- a/board/tqm8xx/tqm8xx.c
+++ b/board/tqm8xx/tqm8xx.c
@@ -419,6 +419,14 @@
 	{ BASE_BAUD, 6,  (void*)0xec160000 },
 	{ BASE_BAUD, 10, (void*)0xec170000 },
 };
+
+#ifdef CONFIG_BOARD_EARLY_INIT_R
+int board_early_init_r (void)
+{
+	ps2mult_early_init();
+	return (0);
+}
+#endif
 #endif /* CONFIG_BMS2003 */
 
 #endif /* CONFIG_PS2MULT */
diff --git a/board/w7o/w7o.c b/board/w7o/w7o.c
index 924a449..1e3ceb2 100644
--- a/board/w7o/w7o.c
+++ b/board/w7o/w7o.c
@@ -41,7 +41,7 @@
 
 /* ------------------------------------------------------------------------- */
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
 #if defined(CONFIG_W7OLMG)
 	/*
diff --git a/board/walnut405/walnut405.c b/board/walnut405/walnut405.c
index 1d02ad4..7035599 100644
--- a/board/walnut405/walnut405.c
+++ b/board/walnut405/walnut405.c
@@ -26,7 +26,7 @@
 #include <asm/processor.h>
 #include <spd_sdram.h>
 
-int board_pre_init (void)
+int board_early_init_f (void)
 {
    /*-------------------------------------------------------------------------+
    | Interrupt controller setup for the Walnut board.