From 7d4856529148f17a73226fee99975ec99f885495 Mon Sep 17 00:00:00 2001
From: Steffen Sledz <sledz@dresearch.de>
Date: Mon, 1 Feb 2010 09:36:37 +0100
Subject: u-boot-2009.03: fix link detection for onboard switch at hipox
 machine

Signed-off-by: Mario Schuknecht <m.schuknecht@dresearch.de>

Acked-by: Steffen Sledz <sledz@dresearch.de>
---
 .../hipox/03-hipox-direct-switch.patch             | 45 ++++++++++++++++++++++
 recipes/u-boot/u-boot_2009.03.bb                   |  1 +
 2 files changed, 46 insertions(+)
 create mode 100644 recipes/u-boot/u-boot-2009.03/hipox/03-hipox-direct-switch.patch

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/u-boot-2009.03/hipox/03-hipox-direct-switch.patch b/recipes/u-boot/u-boot-2009.03/hipox/03-hipox-direct-switch.patch
new file mode 100644
index 0000000000..3a5ac05576
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.03/hipox/03-hipox-direct-switch.patch
@@ -0,0 +1,45 @@
+--- u-boot-2009.03.orig/board/hipox/eth.c	2010-01-29 15:26:12.000000000 +0000
++++ u-boot-2009.03/board/hipox/eth.c	2010-01-29 15:35:01.000000000 +0000
+@@ -1356,8 +1356,11 @@
+ 	}
+ }
+ 
+-int detect_link_speed(void)
++static int detect_link_speed(void)
+ {
++#ifdef CONFIG_HIPOX
++	priv->link_is_1000M = 0;
++#else
+ 	u32 lpa2 = phy_read(priv->phy_id, MII_STAT1000);
+ 
+ 	if (((lpa2 & LPA_1000FULL)) ||
+@@ -1366,18 +1369,26 @@
+ 	} else {
+ 		priv->link_is_1000M = 0;
+ 	}
+-
++#endif
+ 	return 0;
+ }
+ 
+-int is_autoneg_complete(void)
++static int is_autoneg_complete(void)
+ {
++#ifdef CONFIG_HIPOX
++	return 1;
++#else
+     return phy_read(priv->phy_addr, MII_BMSR) & BMSR_ANEGCOMPLETE;
++#endif
+ }
+ 
+-int is_link_ok(void)
++static int is_link_ok(void)
+ {
++#ifdef CONFIG_HIPOX
++	return 1;
++#else
+ 	return phy_read(priv->phy_id, MII_BMSR) & BMSR_LSTATUS;
++#endif
+ }
+ 
+ int eth_init(bd_t *bd)
diff --git a/recipes/u-boot/u-boot_2009.03.bb b/recipes/u-boot/u-boot_2009.03.bb
index a2c0c6fd7c..a70fa6acc7 100644
--- a/recipes/u-boot/u-boot_2009.03.bb
+++ b/recipes/u-boot/u-boot_2009.03.bb
@@ -9,6 +9,7 @@ SRC_URI = "ftp://ftp.denx.de/pub/u-boot/u-boot-${PV}.tar.bz2 "
 SRC_URI_append_hipox = "file://00-hipox.patch;patch=1 \
 	file://01-hipox-fix-gmac-reset.patch;patch=1 \
 	file://02-hipox-enable-mmu.patch;patch=1 \
+	file://03-hipox-direct-switch.patch;patch=1 \
 "
 
 TARGET_LDFLAGS = ""
-- 
cgit v1.2.3


From 36c24b198eb63ac22a6182697514c5ca5250a068 Mon Sep 17 00:00:00 2001
From: Koen Kooi <koen@openembedded.org>
Date: Tue, 2 Feb 2010 15:05:15 +0100
Subject: u-boot git: sync omap3-touchbook patches with AI repo

---
 recipes/u-boot/files/omap3-touchbook/fw_env.config |  2 +-
 recipes/u-boot/u-boot-git/ai-logo.patch            | 12 ++++----
 .../u-boot-git/omap3-touchbook/new-pinmux.patch    | 35 ++++++++++------------
 recipes/u-boot/u-boot-git/spi4.patch               | 18 +++++------
 recipes/u-boot/u-boot_git.bb                       |  2 +-
 5 files changed, 32 insertions(+), 37 deletions(-)

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/files/omap3-touchbook/fw_env.config b/recipes/u-boot/files/omap3-touchbook/fw_env.config
index 4063144d36..a7bfec1ebb 100644
--- a/recipes/u-boot/files/omap3-touchbook/fw_env.config
+++ b/recipes/u-boot/files/omap3-touchbook/fw_env.config
@@ -3,4 +3,4 @@
 # environment sector is assumed present.
 
 # MTD device name	Device offset	Env. size	Flash sector size
-/dev/mtd2		0x0000		0x20000		0x40000
+/dev/mtd2		0x0000		0x20000		0x20000
diff --git a/recipes/u-boot/u-boot-git/ai-logo.patch b/recipes/u-boot/u-boot-git/ai-logo.patch
index 0a8087fc9c..b41ab54a05 100644
--- a/recipes/u-boot/u-boot-git/ai-logo.patch
+++ b/recipes/u-boot/u-boot-git/ai-logo.patch
@@ -21,7 +21,7 @@ diff -Nur a/board/omap3/beagle/beagle.c b/board/omap3/beagle/beagle.c
 +
 +	/* Fill up to the logo */
 +	for (i = 0; i < 2 * (LOGO_SCREEN_WIDTH * ((LOGO_SCREEN_HEIGHT/2) - (height/2))); i += 2) {
-+		*((unsigned short *)(0x80500000 + i)) = LOGO_FILL_COLOUR;
++		*((unsigned short *)(0x85000000 + i)) = LOGO_FILL_COLOUR;
 +	}
 +	offset += i;
 +
@@ -29,10 +29,10 @@ diff -Nur a/board/omap3/beagle/beagle.c b/board/omap3/beagle/beagle.c
 +	for (i = 0; i < height; i++) {
 +		for (k = 0; k < LOGO_SCREEN_WIDTH; k++) {
 +			if(k < (LOGO_SCREEN_WIDTH / 2 - width / 2) || k >= (LOGO_SCREEN_WIDTH / 2 + width / 2))
-+				*((unsigned short *)(0x80500000 + offset + 2*k)) = LOGO_FILL_COLOUR;
++				*((unsigned short *)(0x85000000 + offset + 2*k)) = LOGO_FILL_COLOUR;
 +			else {
 +				HEADER_PIXEL(header_data, pixel);
-+				*((unsigned short *)(0x80500000 + offset + 2*k)) =
++				*((unsigned short *)(0x85000000 + offset + 2*k)) =
 +					((((pixel[0])&0xf8) << 8) |
 +					 (((pixel[1])&0xfc) << 3) |
 +					 (((pixel[2])&0xf8) >> 3));
@@ -44,7 +44,7 @@ diff -Nur a/board/omap3/beagle/beagle.c b/board/omap3/beagle/beagle.c
 +
 +	/* Fill the rest */
 +	for (i = 0; i < 2 * (LOGO_SCREEN_WIDTH * ((LOGO_SCREEN_HEIGHT/2) - (height/2))); i += 2) {
-+		*((unsigned short *)(0x80500000 + offset + i)) = LOGO_FILL_COLOUR;
++		*((unsigned short *)(0x85000000 + offset + i)) = LOGO_FILL_COLOUR;
 +	}	
 +
 +	*((uint *) 0x48310034) = 0xfefffedf;
@@ -123,8 +123,8 @@ diff -Nur a/board/omap3/beagle/beagle.c b/board/omap3/beagle/beagle.c
 +	*((uint *) 0x48050470) = 0x00010007;
 +	*((uint *) 0x48050478) = 0x00ef027f;
 +	*((uint *) 0x4805047c) = 0x02ff03ff;
-+	*((uint *) 0x48050480) = 0x80500000;
-+	*((uint *) 0x48050484) = 0x80500000;
++	*((uint *) 0x48050480) = 0x85000000;
++	*((uint *) 0x48050484) = 0x85000000;
 +	*((uint *) 0x48050488) = 0x00000000;
 +	*((uint *) 0x4805048c) = 0x02ff03ff;
 +	*((uint *) 0x480504a0) = 0x0000008d;
diff --git a/recipes/u-boot/u-boot-git/omap3-touchbook/new-pinmux.patch b/recipes/u-boot/u-boot-git/omap3-touchbook/new-pinmux.patch
index 1c8fa16598..3e6af50565 100644
--- a/recipes/u-boot/u-boot-git/omap3-touchbook/new-pinmux.patch
+++ b/recipes/u-boot/u-boot-git/omap3-touchbook/new-pinmux.patch
@@ -29,26 +29,21 @@ index 00b15cb..36eae5c 100644
   /*Bluetooth*/\
   MUX_VAL(CP(MCBSP3_DX),		(IEN  | PTD | DIS | M1)) /*UART2_CTS*/\
   MUX_VAL(CP(MCBSP3_DR),		(IDIS | PTD | DIS | M1)) /*UART2_RTS*/\
-@@ -229,13 +229,13 @@ const omap3_sysinfo sysinfo = {
-  MUX_VAL(CP(MCBSP4_DR),		(IEN  | PTD | DIS | M1)) /*SSI1_FLAG_RX*/\
-  MUX_VAL(CP(MCBSP4_DX),		(IEN  | PTD | DIS | M1)) /*SSI1_RDY_RX*/\
-  MUX_VAL(CP(MCBSP4_FSX),	(IEN  | PTD | DIS | M1)) /*SSI1_WAKE*/\
-- MUX_VAL(CP(MCBSP1_CLKR),	(IDIS | PTD | DIS | M4)) /*GPIO_156*/\
-- MUX_VAL(CP(MCBSP1_FSR),	(IDIS | PTU | EN  | M4)) /*GPIO_157*/\
-- MUX_VAL(CP(MCBSP1_DX),		(IDIS | PTD | DIS | M4)) /*GPIO_158*/\
-- MUX_VAL(CP(MCBSP1_DR),		(IDIS | PTD | DIS | M4)) /*GPIO_159*/\
-+ MUX_VAL(CP(MCBSP1_CLKR),	(IEN  | PTU | EN  | M1)) /*MCSPI4_CLK*/\
-+ MUX_VAL(CP(MCBSP1_FSR),	(IEN  | PTU | EN  | M4)) /*GPIO_157*/\
-+ MUX_VAL(CP(MCBSP1_DX),		(IEN  | PTD | EN  | M1)) /*MCSPI4_SIMO*/\
-+ MUX_VAL(CP(MCBSP1_DR),		(IEN  | PTD | DIS | M1)) /*MCSPI4_SOMI*/\
-  MUX_VAL(CP(MCBSP_CLKS),	(IEN  | PTU | DIS | M0)) /*McBSP_CLKS*/\
-- MUX_VAL(CP(MCBSP1_FSX),	(IDIS | PTD | DIS | M4)) /*GPIO_161*/\
-- MUX_VAL(CP(MCBSP1_CLKX),	(IDIS | PTD | DIS | M4)) /*GPIO_162*/\
-+ MUX_VAL(CP(MCBSP1_FSX),	(IEN  | PTD | EN  | M1)) /*MCSPI4_CS0*/\
-+ MUX_VAL(CP(MCBSP1_CLKX),	(IEN  | PTD | DIS | M4)) /*GPIO_162*/\
-  /*Serial Interface*/\
-  MUX_VAL(CP(UART3_CTS_RCTX),	(IEN  | PTD | EN  | M0)) /*UART3_CTS_RCTX*/\
-  MUX_VAL(CP(UART3_RTS_SD),	(IDIS | PTD | DIS | M0)) /*UART3_RTS_SD */\
+@@ -229,10 +229,10 @@ const omap3_sysinfo sysinfo = {
+  MUX_VAL(CP(UART1_RTS),		(IDIS | PTD | DIS | M4)) /*GPIO_149*/ \
+  MUX_VAL(CP(UART1_CTS),		(IDIS | PTD | DIS | M4)) /*GPIO_150*/ \
+  MUX_VAL(CP(UART1_RX),		(IEN  | PTD | DIS | M0)) /*UART1_RX*/\
+- MUX_VAL(CP(MCBSP4_CLKX),	(IEN  | PTD | DIS | M1)) /*SSI1_DAT_RX*/\
+- MUX_VAL(CP(MCBSP4_DR),		(IEN  | PTD | DIS | M1)) /*SSI1_FLAG_RX*/\
+- MUX_VAL(CP(MCBSP4_DX),		(IEN  | PTD | DIS | M1)) /*SSI1_RDY_RX*/\
+- MUX_VAL(CP(MCBSP4_FSX),	(IEN  | PTD | DIS | M1)) /*SSI1_WAKE*/\
++ MUX_VAL(CP(MCBSP4_CLKX),	(IEN | PTU | EN  | M4)) /*GPIO_152*/\
++ MUX_VAL(CP(MCBSP4_DR),		(IEN | PTU | EN  | M4)) /*GPIO_153*/\
++ MUX_VAL(CP(MCBSP4_DX),		(IEN | PTU | EN  | M4)) /*GPIO_154*/\
++ MUX_VAL(CP(MCBSP4_FSX),	(IEN | PTU | EN  | M4)) /*GPIO_155*/\
+  MUX_VAL(CP(MCBSP1_CLKR),	(IDIS | PTD | DIS | M4)) /*GPIO_156*/\
+  MUX_VAL(CP(MCBSP1_FSR),	(IDIS | PTU | EN  | M4)) /*GPIO_157*/\
+  MUX_VAL(CP(MCBSP1_DX),		(IDIS | PTD | DIS | M4)) /*GPIO_158*/\
 @@ -255,8 +255,8 @@ const omap3_sysinfo sysinfo = {
   MUX_VAL(CP(HSUSB0_DATA7),	(IEN  | PTD | DIS | M0)) /*HSUSB0_DATA7*/\
   MUX_VAL(CP(I2C1_SCL),		(IEN  | PTU | EN  | M0)) /*I2C1_SCL*/\
diff --git a/recipes/u-boot/u-boot-git/spi4.patch b/recipes/u-boot/u-boot-git/spi4.patch
index bf35964a99..bd284b2ec0 100644
--- a/recipes/u-boot/u-boot-git/spi4.patch
+++ b/recipes/u-boot/u-boot-git/spi4.patch
@@ -1,20 +1,20 @@
 --- a/board/omap3/beagle/beagle.h	2009-02-19 13:30:50.000000000 -0800
 +++ b/board/omap3/beagle/beagle.h	2009-02-19 13:12:16.000000000 -0800
 @@ -229,13 +229,13 @@
-  MUX_VAL(CP(MCBSP4_DR),		(IEN  | PTD | DIS | M1)) /*SSI1_FLAG_RX*/\
-  MUX_VAL(CP(MCBSP4_DX),		(IEN  | PTD | DIS | M1)) /*SSI1_RDY_RX*/\
-  MUX_VAL(CP(MCBSP4_FSX),	(IEN  | PTD | DIS | M1)) /*SSI1_WAKE*/\
-- MUX_VAL(CP(MCBSP1_CLKR),	(IEN  | PTU | EN  | M1)) /*MCSPI4_CLK*/\
-- MUX_VAL(CP(MCBSP1_FSR),	(IEN  | PTU | EN  | M4)) /*GPIO_157*/\
-- MUX_VAL(CP(MCBSP1_DX),		(IEN  | PTD | EN  | M1)) /*MCSPI4_SIMO*/\
-- MUX_VAL(CP(MCBSP1_DR),		(IEN  | PTD | DIS | M1)) /*MCSPI4_SOMI*/\
+  MUX_VAL(CP(MCBSP4_DR),		(IEN | PTU | EN  | M4)) /*GPIO_153*/\
+  MUX_VAL(CP(MCBSP4_DX),		(IEN | PTU | EN  | M4)) /*GPIO_154*/\
+  MUX_VAL(CP(MCBSP4_FSX),	(IEN | PTU | EN  | M4)) /*GPIO_155*/\
+- MUX_VAL(CP(MCBSP1_CLKR),	(IDIS | PTD | DIS | M4)) /*GPIO_156*/\
+- MUX_VAL(CP(MCBSP1_FSR),	(IDIS | PTU | EN  | M4)) /*GPIO_157*/\
+- MUX_VAL(CP(MCBSP1_DX),		(IDIS | PTD | DIS | M4)) /*GPIO_158*/\
+- MUX_VAL(CP(MCBSP1_DR),		(IDIS | PTD | DIS | M4)) /*GPIO_159*/\
 + MUX_VAL(CP(MCBSP1_CLKR),	(IEN | PTU | DIS | M1)) /*MCSPI4_CLK*/\
 + MUX_VAL(CP(MCBSP1_FSR),	(IEN | PTU | EN  | M4)) /*GPIO_157*/\
 + MUX_VAL(CP(MCBSP1_DX),		(IEN | PTU | DIS | M1)) /*MCSPI4_SIMO*/\
 + MUX_VAL(CP(MCBSP1_DR),		(IEN | PTU | EN | M1)) /*MCSPI4_SOMI*/\
   MUX_VAL(CP(MCBSP_CLKS),	(IEN  | PTU | DIS | M0)) /*McBSP_CLKS*/\
-- MUX_VAL(CP(MCBSP1_FSX),	(IEN  | PTD | EN  | M1)) /*MCSPI4_CS0*/\
-- MUX_VAL(CP(MCBSP1_CLKX),	(IEN  | PTD | DIS | M4)) /*GPIO_162*/\
+- MUX_VAL(CP(MCBSP1_FSX),	(IDIS | PTD | DIS | M4)) /*GPIO_161*/\
+- MUX_VAL(CP(MCBSP1_CLKX),	(IDIS | PTD | DIS | M4)) /*GPIO_162*/\
 + MUX_VAL(CP(MCBSP1_FSX),	(IEN | PTU | EN | M1)) /*MCSPI4_CS0*/\
 + MUX_VAL(CP(MCBSP1_CLKX),	(IEN | PTU | EN | M4)) /*GPIO_162*/\
   /*Serial Interface*/\
diff --git a/recipes/u-boot/u-boot_git.bb b/recipes/u-boot/u-boot_git.bb
index 8f21e7f484..6273e044da 100644
--- a/recipes/u-boot/u-boot_git.bb
+++ b/recipes/u-boot/u-boot_git.bb
@@ -1,5 +1,5 @@
 require u-boot.inc
-PR ="r37"
+PR ="r38"
 
 FILESPATHPKG =. "u-boot-git:"
 
-- 
cgit v1.2.3


From 86a69a7aa513ab7b2a53f6f6589646952b1e7ebb Mon Sep 17 00:00:00 2001
From: Steffen Sledz <sledz@dresearch.de>
Date: Tue, 2 Feb 2010 17:00:30 +0100
Subject: u-boot-2009.03: nor flash layout changed for hipox machine

Signed-off-by: Mario Schuknecht <m.schuknecht@dresearch.de>
Acked-by: Steffen Sledz <sledz@dresearch.de>
---
 .../u-boot/u-boot-2009.03/hipox/04-hipox-env.patch | 24 ++++++++++++++++++++++
 recipes/u-boot/u-boot_2009.03.bb                   |  1 +
 2 files changed, 25 insertions(+)
 create mode 100644 recipes/u-boot/u-boot-2009.03/hipox/04-hipox-env.patch

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/u-boot-2009.03/hipox/04-hipox-env.patch b/recipes/u-boot/u-boot-2009.03/hipox/04-hipox-env.patch
new file mode 100644
index 0000000000..57394cb9a0
--- /dev/null
+++ b/recipes/u-boot/u-boot-2009.03/hipox/04-hipox-env.patch
@@ -0,0 +1,24 @@
+--- u-boot-2009.03.orig/include/configs/hipox.h	2010-02-02 10:26:50.000000000 +0000
++++ u-boot-2009.03/include/configs/hipox.h	2010-02-02 12:03:59.000000000 +0000
+@@ -424,8 +424,19 @@
+ #define CONFIG_ENV_SIZE        CONFIG_ENV_SECT_SIZE
+ /* Second parameter block for backup environment */
+ #define CONFIG_ENV_SIZE_REDUND (CONFIG_ENV_SIZE)
+-/* Main environment occupies first parameter block */
+-#define CONFIG_ENV_ADDR        ((CONFIG_SYS_FLASH_BASE)+(NUM_FLASH_MAIN_BLOCKS)*(FLASH_MAIN_BLOCK_SIZE))
++/** Main environment occupies parameter block at offset 32k, 
++ *  there are two 8k blocks in both flashs. 
++ *
++ * Flash AT49BV163DT:
++ *  -      0 - 1F0000: 31 block 64k (10000)
++ *  - 1F0000 - 200000:  8 block  8k ( 2000)
++ *  Flash A29L160ATG:
++ *  -      0 - 1F0000: 31 block 64k (10000)
++ *  - 1F0000 - 1F8000:  1 block 32k ( 8000)
++ *  - 1F8000 - 1FC000:  2 block  8k ( 2000)
++ *  - 1FC000 - 200000:  1 block 16k ( 4000)
++ */
++#define CONFIG_ENV_ADDR        ((CONFIG_SYS_FLASH_BASE)+(NUM_FLASH_MAIN_BLOCKS)*(FLASH_MAIN_BLOCK_SIZE) + (4 * (CONFIG_ENV_SECT_SIZE)))
+ /* Backup environment occupies second parameter block */
+ #define CONFIG_ENV_ADDR_REDUND ((CONFIG_ENV_ADDR)+(CONFIG_ENV_SECT_SIZE))
+ #endif
diff --git a/recipes/u-boot/u-boot_2009.03.bb b/recipes/u-boot/u-boot_2009.03.bb
index a70fa6acc7..c3e9326da0 100644
--- a/recipes/u-boot/u-boot_2009.03.bb
+++ b/recipes/u-boot/u-boot_2009.03.bb
@@ -10,6 +10,7 @@ SRC_URI_append_hipox = "file://00-hipox.patch;patch=1 \
 	file://01-hipox-fix-gmac-reset.patch;patch=1 \
 	file://02-hipox-enable-mmu.patch;patch=1 \
 	file://03-hipox-direct-switch.patch;patch=1 \
+	file://04-hipox-env.patch;patch=1 \
 "
 
 TARGET_LDFLAGS = ""
-- 
cgit v1.2.3


From b977bbd442f3d00c884b68c1307bd9b14fb96446 Mon Sep 17 00:00:00 2001
From: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Date: Wed, 3 Feb 2010 19:20:48 +0100
Subject: packaged-staging.bbclass: removed two few superfluous slashes

${SYSROOT_DESTDIR} ends on a / but there is also a / after the variable
and a slash as the first character of the next variable.
This patch removes the / that is explicitly added so in the generated
code we get // instead of the even sillier looking (and probably more confusing) ///

Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
---
 recipes/u-boot/u-boot_1.1.4.bb | 4 ++++
 1 file changed, 4 insertions(+)

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/u-boot_1.1.4.bb b/recipes/u-boot/u-boot_1.1.4.bb
index df6a357c63..dacd88655f 100644
--- a/recipes/u-boot/u-boot_1.1.4.bb
+++ b/recipes/u-boot/u-boot_1.1.4.bb
@@ -47,6 +47,10 @@ SRC_URI_append_avr32= "\
 	file://fix-mmc-data-timeout.patch;patch=1 \
 "
 
+SRC_URI_append_openrd-client = "\
+        file://0001-OpenRD-Support-Uboot.patch;pach=1 \
+"
+
 EXTRA_OEMAKE_gumstix = "CROSS_COMPILE=${TARGET_PREFIX} GUMSTIX_400MHZ=${GUMSTIX_400MHZ}"
 TARGET_LDFLAGS = ""
 
-- 
cgit v1.2.3


From a91664ce8d94cebc99b69077089773fc1b33e5f0 Mon Sep 17 00:00:00 2001
From: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>
Date: Wed, 3 Feb 2010 21:05:56 +0100
Subject: Revert "packaged-staging.bbclass: removed two few superfluous
 slashes"

Accidently tagged another file to this commit, sorry

This reverts commit b977bbd442f3d00c884b68c1307bd9b14fb96446.
---
 recipes/u-boot/u-boot_1.1.4.bb | 4 ----
 1 file changed, 4 deletions(-)

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/u-boot_1.1.4.bb b/recipes/u-boot/u-boot_1.1.4.bb
index dacd88655f..df6a357c63 100644
--- a/recipes/u-boot/u-boot_1.1.4.bb
+++ b/recipes/u-boot/u-boot_1.1.4.bb
@@ -47,10 +47,6 @@ SRC_URI_append_avr32= "\
 	file://fix-mmc-data-timeout.patch;patch=1 \
 "
 
-SRC_URI_append_openrd-client = "\
-        file://0001-OpenRD-Support-Uboot.patch;pach=1 \
-"
-
 EXTRA_OEMAKE_gumstix = "CROSS_COMPILE=${TARGET_PREFIX} GUMSTIX_400MHZ=${GUMSTIX_400MHZ}"
 TARGET_LDFLAGS = ""
 
-- 
cgit v1.2.3


From afc0667965549d0ac1cc5cd93a30c2aa8e47dc28 Mon Sep 17 00:00:00 2001
From: Steffen Sledz <sledz@dresearch.de>
Date: Mon, 1 Feb 2010 17:02:33 +0100
Subject: oxnas: remove support for oxnas machine

OXNAS machine was only used as prototyp for HIPOX machine and is not
needed any longer. Because of constant build problems support is
finished.

Signed-off-by: Steffen Sledz <sledz@dresearch.de>
---
 recipes/u-boot/u-boot-1.1.2/oxnas.patch | 7257 -------------------------------
 recipes/u-boot/u-boot_1.1.2.bb          |    2 -
 2 files changed, 7259 deletions(-)
 delete mode 100644 recipes/u-boot/u-boot-1.1.2/oxnas.patch

(limited to 'recipes/u-boot')

diff --git a/recipes/u-boot/u-boot-1.1.2/oxnas.patch b/recipes/u-boot/u-boot-1.1.2/oxnas.patch
deleted file mode 100644
index f1fff14822..0000000000
--- a/recipes/u-boot/u-boot-1.1.2/oxnas.patch
+++ /dev/null
@@ -1,7257 +0,0 @@
-diff -Nurd u-boot-1.1.2/board/oxnas/config.mk u-boot-1.1.2-oxe810/board/oxnas/config.mk
---- u-boot-1.1.2/board/oxnas/config.mk	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/config.mk	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,26 @@
-+TEXT_BASE = 0x48d00000
-+CROSS_COMPILE = arm-linux-
-+
-+PLL400 ?= 733333333
-+RPSCLK ?=  25000000
-+
-+NAS_VERSION ?= 810
-+FPGA ?= 0
-+FPGA_ARM_CLK ?= 25000000
-+
-+PROBE_MEM_SIZE ?= 1
-+MEM_SIZE ?= 64	# Memory size in megabytes if probing is not enabled
-+MEM_ODT ?= 150
-+
-+USE_SATA ?= 1
-+USE_SATA_ENV ?= 1
-+USE_FLASH ?= 1
-+
-+LINUX_ROOT_RAIDED ?= 1
-+
-+USE_EXTERNAL_UART ?= 0
-+INTERNAL_UART ?= 2
-+
-+TEST_BRD ?= 0	# Only significant for OX800
-+
-+PLATFORM_CPPFLAGS += -DLINUX_ROOT_RAIDED=$(LINUX_ROOT_RAIDED) -DMEM_ODT=$(MEM_ODT) -DPROBE_MEM_SIZE=$(PROBE_MEM_SIZE) -DNAS_VERSION=$(NAS_VERSION) -DFPGA=$(FPGA) -DFPGA_ARM_CLK=$(FPGA_ARM_CLK) -DINTERNAL_UART=$(INTERNAL_UART) -DUSE_EXTERNAL_UART=$(USE_EXTERNAL_UART) -DMEM_SIZE=$(MEM_SIZE) -DPLL400=$(PLL400) -DRPSCLK=$(RPSCLK) -DTEST_BRD=$(TEST_BRD) -DUSE_SATA=$(USE_SATA) -DUSE_SATA_ENV=$(USE_SATA_ENV) -DUSE_FLASH=$(USE_FLASH)
-diff -Nurd u-boot-1.1.2/board/oxnas/eth.c u-boot-1.1.2-oxe810/board/oxnas/eth.c
---- u-boot-1.1.2/board/oxnas/eth.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/eth.c	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,1666 @@
-+/*
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <common.h>
-+#include <malloc.h>
-+#include <net.h>
-+#include <asm/barrier.h>
-+
-+//#define DEBUG_GMAC_INIT
-+
-+// The number of bytes wasted at the start of a received packet buffer in order
-+// to ensure the IP header will be aligned to a 32-bit boundary
-+static const int ETHER_FRAME_ALIGN_WASTAGE = 2;
-+static const int EXTRA_RX_SKB_SPACE = 32;   // Otherwise GMAC spans over >1 skb
-+static const int ETHER_MTU  = 1500;
-+
-+static const u32 MAC_BASE_OFFSET = 0x0000;
-+static const u32 DMA_BASE_OFFSET = 0x1000;
-+
-+static const int NUM_TX_DMA_DESCRIPTORS = 1;
-+static const int NUM_RX_DMA_DESCRIPTORS = 32;
-+
-+/* Generic MII registers. */
-+#define MII_BMCR            0x00	/* Basic mode control register */
-+#define MII_BMSR            0x01	/* Basic mode status register  */
-+#define MII_PHYSID1         0x02	/* PHYS ID 1                   */
-+#define MII_PHYSID2         0x03	/* PHYS ID 2                   */
-+#define MII_ADVERTISE       0x04	/* Advertisement control reg   */
-+#define MII_LPA             0x05	/* Link partner ability reg    */
-+#define MII_EXPANSION       0x06	/* Expansion register          */
-+#define MII_CTRL1000        0x09	/* 1000BASE-T control          */
-+#define MII_STAT1000        0x0a	/* 1000BASE-T status           */
-+#define MII_ESTATUS         0x0f	/* Extended Status */
-+
-+/* Basic mode control register. */
-+#define BMCR_RESV          0x003f  /* Unused...                   */
-+#define BMCR_SPEED1000		0x0040  /* MSB of Speed (1000)         */
-+#define BMCR_CTST          0x0080  /* Collision test              */
-+#define BMCR_FULLDPLX      0x0100  /* Full duplex                 */
-+#define BMCR_ANRESTART     0x0200  /* Auto negotiation restart    */
-+#define BMCR_ISOLATE       0x0400  /* Disconnect DP83840 from MII */
-+#define BMCR_PDOWN         0x0800  /* Powerdown the DP83840       */
-+#define BMCR_ANENABLE      0x1000  /* Enable auto negotiation     */
-+#define BMCR_SPEED100      0x2000  /* Select 100Mbps              */
-+#define BMCR_LOOPBACK      0x4000  /* TXD loopback bits           */
-+#define BMCR_RESET         0x8000  /* Reset the DP83840           */
-+
-+/* Basic mode status register. */
-+#define BMSR_ERCAP         0x0001  /* Ext-reg capability          */
-+#define BMSR_JCD           0x0002  /* Jabber detected             */
-+#define BMSR_LSTATUS       0x0004  /* Link status                 */
-+#define BMSR_ANEGCAPABLE   0x0008  /* Able to do auto-negotiation */
-+#define BMSR_RFAULT        0x0010  /* Remote fault detected       */
-+#define BMSR_ANEGCOMPLETE  0x0020  /* Auto-negotiation complete   */
-+#define BMSR_RESV          0x00c0  /* Unused...                   */
-+#define BMSR_ESTATEN		0x0100	/* Extended Status in R15 */
-+#define BMSR_100FULL2		0x0200	/* Can do 100BASE-T2 HDX */
-+#define BMSR_100HALF2		0x0400	/* Can do 100BASE-T2 FDX */
-+#define BMSR_10HALF        0x0800  /* Can do 10mbps, half-duplex  */
-+#define BMSR_10FULL        0x1000  /* Can do 10mbps, full-duplex  */
-+#define BMSR_100HALF       0x2000  /* Can do 100mbps, half-duplex */
-+#define BMSR_100FULL       0x4000  /* Can do 100mbps, full-duplex */
-+#define BMSR_100BASE4      0x8000  /* Can do 100mbps, 4k packets  */
-+
-+/* 1000BASE-T Status register */
-+#define LPA_1000LOCALRXOK	0x2000  /* Link partner local receiver status */
-+#define LPA_1000REMRXOK  	0x1000  /* Link partner remote receiver status */
-+#define LPA_1000FULL     	0x0800  /* Link partner 1000BASE-T full duplex */
-+#define LPA_1000HALF     	0x0400  /* Link partner 1000BASE-T half duplex */
-+#define PHY_TYPE_NONE					0
-+#define PHY_TYPE_MICREL_KS8721BL		0x00221619
-+#define PHY_TYPE_VITESSE_VSC8201XVZ	0x000fc413
-+#define PHY_TYPE_REALTEK_RTL8211BGR	0x001cc912
-+#define PHY_TYPE_LSI_ET1011C			0x0282f013
-+
-+/* Specific PHY values */
-+#define VSC8201_MII_ACSR			0x1c	// Vitesse VCS8201 gigabit PHY Auxillary Control and Status register
-+#define VSC8201_MII_ACSR_MDPPS_BIT	2		// Mode/Duplex Pin Priority Select
-+
-+#define ET1011C_MII_CONFIG	0x16
-+#define ET1011C_MII_CONFIG_IFMODESEL	0
-+#define ET1011C_MII_CONFIG_IFMODESEL_NUM_BITS	3
-+#define ET1011C_MII_CONFIG_SYSCLKEN	4
-+#define ET1011C_MII_CONFIG_TXCLKEN		5
-+#define ET1011C_MII_CONFIG_TBI_RATESEL	8
-+#define ET1011C_MII_CONFIG_CRS_TX_EN	15
-+
-+#define ET1011C_MII_CONFIG_IFMODESEL_GMII_MII		0
-+#define ET1011C_MII_CONFIG_IFMODESEL_TBI			1
-+#define ET1011C_MII_CONFIG_IFMODESEL_GMII_MII_GTX	2
-+
-+#define ET1011C_MII_LED2 0x1c
-+#define ET1011C_MII_LED2_LED_TXRX		12
-+#define ET1011C_MII_LED2_LED_NUM_BITS	4
-+
-+#define ET1011C_MII_LED2_LED_TXRX_ON		0xe
-+#define ET1011C_MII_LED2_LED_TXRX_ACTIVITY	0x7
-+
-+// Some typedefs to cope with std Linux types
-+typedef void sk_buff_t;
-+
-+// The in-memory descriptor structures
-+typedef struct gmac_dma_desc
-+{
-+    /** The encoded status field of the GMAC descriptor */
-+    u32 status;
-+    /** The encoded length field of GMAC descriptor */
-+    u32 length;
-+    /** Buffer 1 pointer field of GMAC descriptor */
-+    u32 buffer1;
-+    /** Buffer 2 pointer or next descriptor pointer field of GMAC descriptor */
-+    u32 buffer2;
-+    /** Not used for U-Boot */
-+    u32 skb;
-+} __attribute ((packed)) gmac_dma_desc_t;
-+
-+typedef struct gmac_desc_list_info
-+{
-+    gmac_dma_desc_t* base_ptr;
-+    int              num_descriptors;
-+    int              empty_count;
-+    int              full_count;
-+    int              r_index;
-+    int              w_index;
-+} gmac_desc_list_info_t;
-+
-+// Private data structure for the GMAC driver
-+typedef struct gmac_priv
-+{
-+    /** Base address of GMAC MAC registers */
-+    u32                     macBase;
-+    /** Base address of GMAC DMA registers */
-+    u32                     dmaBase;
-+
-+    /** The number of descriptors in the gmac_dma_desc_t array holding both the
-+     *  TX and RX descriptors. The TX descriptors reside at the start of the
-+     *  array */
-+    unsigned                total_num_descriptors;
-+
-+    /** The address of the start of the descriptor array */
-+    gmac_dma_desc_t        *desc_base_addr;
-+
-+    /** Descriptor list management */
-+    gmac_desc_list_info_t   tx_gmac_desc_list_info;
-+    gmac_desc_list_info_t   rx_gmac_desc_list_info;
-+
-+	/** PHY info */
-+	u32						 phy_type;
-+	u32						 phy_addr;
-+	int						 phy_id;
-+	int						 link_is_1000M;
-+} gmac_priv_t;
-+
-+/**
-+ * MAC register indices
-+ */
-+typedef enum gmac_mac_regs {
-+    MAC_CONFIG_REG       = 0,
-+    MAC_FRAME_FILTER_REG = 1,
-+    MAC_HASH_HIGH_REG    = 2,
-+    MAC_HASH_LOW_REG     = 3,
-+    MAC_GMII_ADR_REG     = 4,
-+    MAC_GMII_DATA_REG    = 5,
-+    MAC_FLOW_CNTL_REG    = 6,
-+    MAC_VLAN_TAG_REG     = 7,
-+    MAC_VERSION_REG      = 8,
-+    MAC_ADR0_HIGH_REG    = 16,
-+    MAC_ADR0_LOW_REG     = 17,
-+    MAC_ADR1_HIGH_REG    = 18,
-+    MAC_ADR1_LOW_REG     = 19,
-+    MAC_ADR2_HIGH_REG    = 20,
-+    MAC_ADR2_LOW_REG     = 21,
-+    MAC_ADR3_HIGH_REG    = 22,
-+    MAC_ADR3_LOW_REG     = 23,
-+    MAC_ADR4_HIGH_REG    = 24,
-+    MAC_ADR4_LOW_REG     = 25,
-+    MAC_ADR5_HIGH_REG    = 26,
-+    MAC_ADR5_LOW_REG     = 27,
-+    MAC_ADR6_HIGH_REG    = 28,
-+    MAC_ADR6_LOW_REG     = 29,
-+    MAC_ADR7_HIGH_REG    = 30,
-+    MAC_ADR7_LOW_REG     = 31,
-+    MAC_ADR8_HIGH_REG    = 32,
-+    MAC_ADR8_LOW_REG     = 33,
-+    MAC_ADR9_HIGH_REG    = 34,
-+    MAC_ADR9_LOW_REG     = 35,
-+    MAC_ADR10_HIGH_REG   = 36,
-+    MAC_ADR10_LOW_REG    = 37,
-+    MAC_ADR11_HIGH_REG   = 38,
-+    MAC_ADR11_LOW_REG    = 39,
-+    MAC_ADR12_HIGH_REG   = 40,
-+    MAC_ADR12_LOW_REG    = 41,
-+    MAC_ADR13_HIGH_REG   = 42,
-+    MAC_ADR13_LOW_REG    = 43,
-+    MAC_ADR14_HIGH_REG   = 44,
-+    MAC_ADR14_LOW_REG    = 45,
-+    MAC_ADR15_HIGH_REG   = 46,
-+    MAC_ADR15_LOW_REG    = 47
-+} gmac_mac_regs_t;
-+
-+
-+/**
-+ * MAC register field definitions
-+ */
-+typedef enum gmac_config_reg {
-+    MAC_CONFIG_WD_BIT  = 23,
-+    MAC_CONFIG_JD_BIT  = 22,
-+    MAC_CONFIG_BE_BIT  = 21,
-+    MAC_CONFIG_JE_BIT  = 20,
-+    MAC_CONFIG_IFG_BIT = 17,
-+    MAC_CONFIG_PS_BIT  = 15,
-+    MAC_CONFIG_DO_BIT  = 13,
-+    MAC_CONFIG_LM_BIT  = 12,
-+    MAC_CONFIG_DM_BIT  = 11,
-+    MAC_CONFIG_IPC_BIT = 10,
-+    MAC_CONFIG_DR_BIT  = 9,
-+    MAC_CONFIG_ACS_BIT = 7,
-+    MAC_CONFIG_BL_BIT  = 5,
-+    MAC_CONFIG_DC_BIT  = 4,
-+    MAC_CONFIG_TE_BIT  = 3,
-+    MAC_CONFIG_RE_BIT  = 2
-+} gmac_config_reg_t;
-+
-+#define MAC_CONFIG_IFG_NUM_BITS 3
-+#define MAC_CONFIG_BL_NUM_BITS 2
-+
-+typedef enum gmac_frame_filter_reg {
-+    MAC_FRAME_FILTER_RA_BIT   = 31,
-+    MAC_FRAME_FILTER_SAF_BIT  = 9,
-+    MAC_FRAME_FILTER_SAIF_BIT = 8,
-+    MAC_FRAME_FILTER_PCF_BIT  = 6,
-+    MAC_FRAME_FILTER_DBF_BIT  = 5,
-+    MAC_FRAME_FILTER_PM_BIT   = 4,
-+    MAC_FRAME_FILTER_DAIF_BIT = 3,
-+    MAC_FRAME_FILTER_HMC_BIT  = 2,
-+    MAC_FRAME_FILTER_HUC_BIT  = 1,
-+    MAC_FRAME_FILTER_PR_BIT   = 0
-+} gmac_frame_filter_reg_t;
-+
-+#define MAC_FRAME_FILTER_PCF_NUM_BITS 2
-+
-+typedef enum gmac_hash_table_high_reg {
-+    MAC_HASH_HIGH_HTH_BIT = 0
-+} gmac_hash_table_high_reg_t;
-+
-+typedef enum gmac_hash_table_low_reg {
-+    MAC_HASH_LOW_HTL_BIT = 0
-+} gmac_hash_table_low_reg_t;
-+
-+typedef enum gmac_gmii_address_reg {
-+    MAC_GMII_ADR_PA_BIT = 11,
-+    MAC_GMII_ADR_GR_BIT = 6,
-+    MAC_GMII_ADR_CR_BIT = 2,
-+    MAC_GMII_ADR_GW_BIT = 1,
-+    MAC_GMII_ADR_GB_BIT = 0
-+} gmac_gmii_address_reg_t;
-+
-+#define MAC_GMII_ADR_PA_NUM_BITS 5
-+#define MAC_GMII_ADR_GR_NUM_BITS 5
-+#define MAC_GMII_ADR_CR_NUM_BITS 3
-+
-+typedef enum gmac_gmii_data_reg {
-+    MAC_GMII_DATA_GD_BIT = 0
-+} gmac_gmii_data_reg_t;
-+
-+#define MAC_GMII_DATA_GD_NUM_BITS 16
-+
-+typedef enum gmac_flow_control_reg {
-+    MAC_FLOW_CNTL_PT_BIT      = 16,
-+    MAC_FLOW_CNTL_PLT_BIT     = 4,
-+    MAC_FLOW_CNTL_UP_BIT      = 3,
-+    MAC_FLOW_CNTL_RFE_BIT     = 2,
-+    MAC_FLOW_CNTL_TFE_BIT     = 1,
-+    MAC_FLOW_CNTL_FCB_BPA_BIT = 0
-+} gmac_flow_control_reg_t;
-+
-+#define MAC_FLOW_CNTL_PT_NUM_BITS 16
-+#define MAC_FLOW_CNTL_PLT_NUM_BITS 2
-+
-+typedef enum gmac_vlan_tag_reg {
-+    MAC_VLAN_TAG_LV_BIT = 0
-+} gmac_vlan_tag_reg_t;
-+
-+#define MAC_VLAN_TAG_LV_NUM_BITS 16
-+
-+typedef enum gmac_version_reg {
-+    MAC_VERSION_UD_BIT = 8,
-+    MAC_VERSION_SD_BIT = 0
-+} gmac_version_reg_t;
-+
-+#define MAC_VERSION_UD_NUM_BITS 8
-+#define MAC_VERSION_SD_NUM_BITS 8
-+
-+typedef enum gmac_mac_adr_0_high_reg {
-+    MAC_ADR0_HIGH_MO_BIT = 31,
-+    MAC_ADR0_HIGH_A_BIT  = 0
-+} gmac_mac_adr_0_high_reg_t;
-+
-+#define MAC_ADR0_HIGH_A_NUM_BITS 16
-+
-+typedef enum gmac_mac_adr_0_low_reg {
-+    MAC_ADR0_LOW_A_BIT = 0
-+} gmac_mac_adr_0_low_reg_t;
-+
-+typedef enum gmac_mac_adr_1_high_reg {
-+    MAC_ADR1_HIGH_AE_BIT  = 31,
-+    MAC_ADR1_HIGH_SA_BIT  = 30,
-+    MAC_ADR1_HIGH_MBC_BIT = 24,
-+    MAC_ADR1_HIGH_A_BIT   = 0
-+} gmac_mac_adr_1_high_reg_t;
-+
-+#define MAC_ADR1_HIGH_MBC_NUM_BITS 6
-+#define MAC_ADR1_HIGH_A_NUM_BITS 16
-+
-+typedef enum gmac_mac_adr_1_low_reg {
-+    MAC_ADR1_LOW_A_BIT = 0
-+} gmac_mac_adr_1_low_reg_t;
-+
-+
-+/**
-+ * MMC register indices - registers accessed via the MAC accessor functions
-+ */
-+typedef enum gmac_mmc_regs {
-+    MMC_CONTROL_REG = 64,
-+    MMC_RX_INT_REG  = 65,
-+    MMC_TX_INT_REG  = 66,
-+    MMC_RX_MASK_REG = 67,
-+    MMC_TX_MASK_REG = 68
-+} gmac_mmc_regs_t;
-+
-+/**
-+ * DMA register indices
-+ */
-+typedef enum gmac_dma_regs {
-+    DMA_BUS_MODE_REG        = 0,
-+    DMA_TX_POLL_REG         = 1,
-+    DMA_RX_POLL_REG         = 2,
-+    DMA_RX_DESC_ADR_REG     = 3,
-+    DMA_TX_DESC_ADR_REG     = 4,
-+    DMA_STATUS_REG          = 5,
-+    DMA_OP_MODE_REG         = 6,
-+    DMA_INT_ENABLE_REG      = 7,
-+    DMA_MISSED_OVERFLOW_REG = 8,
-+    DMA_CUR_TX_DESC_REG     = 18,
-+    DMA_CUR_RX_DESC_REG     = 19,
-+    DMA_CUR_TX_ADR_REG      = 20,
-+    DMA_CUR_RX_ADR_REG      = 21
-+} gmac_dma_regs_t;
-+
-+/**
-+ * DMA register field definitions
-+ */
-+
-+typedef enum gmac_dma_bus_mode_reg {
-+    DMA_BUS_MODE_FB_BIT  = 16,
-+    DMA_BUS_MODE_PR_BIT  = 14,
-+    DMA_BUS_MODE_PBL_BIT = 8,
-+    DMA_BUS_MODE_DSL_BIT = 2,
-+    DMA_BUS_MODE_DA_BIT  = 1,
-+    DMA_BUS_MODE_SWR_BIT = 0
-+} gmac_dma_bus_mode_reg_t;
-+
-+#define DMA_BUS_MODE_PR_NUM_BITS 2
-+#define DMA_BUS_MODE_PBL_NUM_BITS 6
-+#define DMA_BUS_MODE_DSL_NUM_BITS 5
-+
-+typedef enum gmac_dma_tx_poll_demand_reg {
-+    DMA_TX_POLL_TPD_BIT = 0
-+} gmac_dma_tx_poll_demand_reg_t;
-+
-+typedef enum gmac_dma_rx_poll_demand_reg {
-+    DMA_RX_POLL_RPD_BIT = 0
-+} gmac_dma_rx_poll_demand_reg_t;
-+
-+typedef enum gmac_dma_rx_desc_list_adr_reg {
-+    DMA_RX_DESC_ADR_SRL_BIT = 0
-+} gmac_dma_rx_desc_list_adr_reg_t;
-+
-+typedef enum gmac_dma_tx_desc_list_adr_reg {
-+    DMA_TX_DESC_ADR_STL_BIT = 0
-+} gmac_dma_tx_desc_list_adr_reg_t;
-+
-+typedef enum gmac_dma_status_reg {
-+    DMA_STATUS_GPI_BIT = 28,
-+    DMA_STATUS_GMI_BIT = 27,
-+    DMA_STATUS_GLI_BIT = 26,
-+    DMA_STATUS_EB_BIT  = 23,
-+    DMA_STATUS_TS_BIT  = 20,
-+    DMA_STATUS_RS_BIT  = 17,
-+    DMA_STATUS_NIS_BIT = 16,
-+    DMA_STATUS_AIS_BIT = 15,
-+    DMA_STATUS_ERI_BIT = 14,
-+    DMA_STATUS_FBE_BIT = 13,
-+    DMA_STATUS_ETI_BIT = 10,
-+    DMA_STATUS_RWT_BIT = 9,
-+    DMA_STATUS_RPS_BIT = 8,
-+    DMA_STATUS_RU_BIT  = 7,
-+    DMA_STATUS_RI_BIT  = 6,
-+    DMA_STATUS_UNF_BIT = 5,
-+    DMA_STATUS_OVF_BIT = 4,
-+    DMA_STATUS_TJT_BIT = 3,
-+    DMA_STATUS_TU_BIT  = 2,
-+    DMA_STATUS_TPS_BIT = 1,
-+    DMA_STATUS_TI_BIT  = 0
-+} gmac_dma_status_reg_t;
-+
-+#define DMA_STATUS_EB_NUM_BITS 3
-+#define DMA_STATUS_TS_NUM_BITS 3
-+#define DMA_STATUS_RS_NUM_BITS 3
-+
-+typedef enum gmac_dma_op_mode_reg {
-+    DMA_OP_MODE_SF_BIT  = 21,
-+    DMA_OP_MODE_FTF_BIT = 20,
-+    DMA_OP_MODE_TTC_BIT = 14,
-+    DMA_OP_MODE_ST_BIT  = 13,
-+    DMA_OP_MODE_RFD_BIT = 11,
-+    DMA_OP_MODE_RFA_BIT = 9,
-+    DMA_OP_MODE_EFC_BIT = 8,
-+    DMA_OP_MODE_FEF_BIT = 7,
-+    DMA_OP_MODE_FUF_BIT = 6,
-+    DMA_OP_MODE_RTC_BIT = 3,
-+    DMA_OP_MODE_OSF_BIT = 2,
-+    DMA_OP_MODE_SR_BIT  = 1
-+} gmac_dma_op_mode_reg_t;
-+
-+#define DMA_OP_MODE_TTC_NUM_BITS 3
-+#define DMA_OP_MODE_RFD_NUM_BITS 2
-+#define DMA_OP_MODE_RFA_NUM_BITS 2
-+#define DMA_OP_MODE_RTC_NUM_BITS 2
-+
-+typedef enum gmac_dma_intr_enable_reg {
-+    DMA_INT_ENABLE_NI_BIT  = 16,
-+    DMA_INT_ENABLE_AI_BIT  = 15,
-+    DMA_INT_ENABLE_ERE_BIT = 14,
-+    DMA_INT_ENABLE_FBE_BIT = 13,
-+    DMA_INT_ENABLE_ETE_BIT = 10,
-+    DMA_INT_ENABLE_RW_BIT  = 9,
-+    DMA_INT_ENABLE_RS_BIT  = 8,
-+    DMA_INT_ENABLE_RU_BIT  = 7,
-+    DMA_INT_ENABLE_RI_BIT  = 6,
-+    DMA_INT_ENABLE_UN_BIT  = 5,
-+    DMA_INT_ENABLE_OV_BIT  = 4,
-+    DMA_INT_ENABLE_TJ_BIT  = 3,
-+    DMA_INT_ENABLE_TU_BIT  = 2,
-+    DMA_INT_ENABLE_TS_BIT  = 1,
-+    DMA_INT_ENABLE_TI_BIT  = 0
-+} gmac_dma_intr_enable_reg_t;
-+
-+typedef enum gmac_dma_missed_overflow_reg {
-+    DMA_MISSED_OVERFLOW_OFOC_BIT  = 28,    // Overflow bit for FIFO Overflow Counter
-+    DMA_MISSED_OVERFLOW_AMFC_BIT  = 17,    // Application Missed Frames Count
-+    DMA_MISSED_OVERFLOW_OAMFO_BIT = 16,    // Overflow bit for Application Missed Frames Count
-+    DMA_MISSED_OVERFLOW_CMFC_BIT  = 0      // Controller Missed Frames Count
-+} gmac_dma_missed_overflow_reg_t;
-+
-+#define DMA_MISSED_OVERFLOW_OAMFO_NUM_BITS 11
-+#define DMA_MISSED_OVERFLOW_CMFC_NUM_BITS 16
-+
-+typedef enum gmac_dma_current_tx_desc_reg {
-+    DMA_CUR_TX_DESC_A_BIT = 0
-+} gmac_dma_current_tx_desc_reg_t;
-+
-+typedef enum gmac_dma_current_rx_desc_reg {
-+    DMA_CUR_RX_DESC_A_BIT = 0
-+} gmac_dma_current_rx_desc_reg_t;
-+
-+typedef enum gmac_dma_current_tx_adr_reg {
-+    DMA_CUR_TX_ADR_A_BIT = 0
-+} gmac_dma_current_tx_adr_reg_t;
-+
-+typedef enum gmac_dma_current_rx_adr_reg {
-+    DMA_CUR_RX_ADR_A_BIT = 0
-+} gmac_dma_current_rx_adr_reg_t;
-+
-+/**
-+ * Descriptor support
-+ */
-+/** Descriptor status word field definitions */
-+typedef enum desc_status {
-+  descOwnByDma          = 0x80000000,   /* descriptor is owned by DMA engine  */
-+
-+  descFrameLengthMask   = 0x3FFF0000,   /* Receive descriptor frame length */
-+  descFrameLengthShift  = 16,
-+
-+  descError             = 0x00008000,   /* Error summary bit  - OR of the following bits:    v  */
-+
-+  descRxTruncated       = 0x00004000,   /* Rx - no more descriptors for receive frame        E  */
-+
-+  descRxLengthError     = 0x00001000,   /* Rx - frame size not matching with length field */
-+  descRxDamaged         = 0x00000800,   /* Rx - frame was damaged due to buffer overflow     E  */
-+  descRxFirst           = 0x00000200,   /* Rx - first descriptor of the frame                   */
-+  descRxLast            = 0x00000100,   /* Rx - last descriptor of the frame                    */
-+  descRxLongFrame       = 0x00000080,   /* Rx - frame is longer than 1518 bytes              E  */
-+  descRxCollision       = 0x00000040,   /* Rx - late collision occurred during reception     E  */
-+  descRxFrameEther      = 0x00000020,   /* Rx - Frame type - Ethernet, otherwise 802.3          */
-+  descRxWatchdog        = 0x00000010,   /* Rx - watchdog timer expired during reception      E  */
-+  descRxMiiError        = 0x00000008,   /* Rx - error reported by MII interface              E  */
-+  descRxDribbling       = 0x00000004,   /* Rx - frame contains noninteger multiple of 8 bits    */
-+  descRxCrc             = 0x00000002,   /* Rx - CRC error                                    E  */
-+
-+  descTxTimeout         = 0x00004000,   /* Tx - Transmit jabber timeout                      E  */
-+  descTxLostCarrier     = 0x00000800,   /* Tx - carrier lost during tramsmission             E  */
-+  descTxNoCarrier       = 0x00000400,   /* Tx - no carrier signal from the tranceiver        E  */
-+  descTxLateCollision   = 0x00000200,   /* Tx - transmission aborted due to collision        E  */
-+  descTxExcCollisions   = 0x00000100,   /* Tx - transmission aborted after 16 collisions     E  */
-+  descTxVLANFrame       = 0x00000080,   /* Tx - VLAN-type frame                                 */
-+  descTxCollMask        = 0x00000078,   /* Tx - Collision count                                 */
-+  descTxCollShift       = 3,
-+  descTxExcDeferral     = 0x00000004,   /* Tx - excessive deferral                           E  */
-+  descTxUnderflow       = 0x00000002,   /* Tx - late data arrival from the memory            E  */
-+  descTxDeferred        = 0x00000001,   /* Tx - frame transmision deferred                      */
-+} desc_status_t;
-+
-+/** Descriptor length word field definitions */
-+typedef enum desc_length {
-+  descTxIntEnable       = 0x80000000,   /* Tx - interrupt on completion                         */
-+  descTxLast            = 0x40000000,   /* Tx - Last segment of the frame                       */
-+  descTxFirst           = 0x20000000,   /* Tx - First segment of the frame                      */
-+  descTxDisableCrc      = 0x04000000,   /* Tx - Add CRC disabled (first segment only)           */
-+
-+  descEndOfRing         = 0x02000000,   /* End of descriptors ring                              */
-+  descChain             = 0x01000000,   /* Second buffer address is chain address               */
-+  descTxDisablePadd     = 0x00800000,   /* disable padding, added by - reyaz */
-+
-+  descSize2Mask         = 0x003FF800,   /* Buffer 2 size                                        */
-+  descSize2Shift        = 11,
-+  descSize1Mask         = 0x000007FF,   /* Buffer 1 size                                        */
-+  descSize1Shift        = 0,
-+} desc_length_t;
-+
-+typedef enum rx_desc_status {
-+    RX_DESC_STATUS_OWN_BIT  = 31,
-+    RX_DESC_STATUS_AFM_BIT  = 30,
-+    RX_DESC_STATUS_FL_BIT   = 16,
-+    RX_DESC_STATUS_ES_BIT   = 15,
-+    RX_DESC_STATUS_DE_BIT   = 14,
-+    RX_DESC_STATUS_SAF_BIT  = 13,
-+    RX_DESC_STATUS_LE_BIT   = 12,
-+    RX_DESC_STATUS_OE_BIT   = 11,
-+    RX_DESC_STATUS_IPC_BIT  = 10,
-+    RX_DESC_STATUS_FS_BIT   = 9,
-+    RX_DESC_STATUS_LS_BIT   = 8,
-+    RX_DESC_STATUS_VLAN_BIT = 7,
-+    RX_DESC_STATUS_LC_BIT   = 6,
-+    RX_DESC_STATUS_FT_BIT   = 5,
-+    RX_DESC_STATUS_RWT_BIT  = 4,
-+    RX_DESC_STATUS_RE_BIT   = 3,
-+    RX_DESC_STATUS_DRE_BIT  = 2,
-+    RX_DESC_STATUS_CE_BIT   = 1,
-+    RX_DESC_STATUS_MAC_BIT  = 0
-+} rx_desc_status_t;
-+
-+#define RX_DESC_STATUS_FL_NUM_BITS 14
-+
-+typedef enum rx_desc_length {
-+    RX_DESC_LENGTH_DIC_BIT  = 31,
-+    RX_DESC_LENGTH_RER_BIT  = 25,
-+    RX_DESC_LENGTH_RCH_BIT  = 24,
-+    RX_DESC_LENGTH_RBS2_BIT = 11,
-+    RX_DESC_LENGTH_RBS1_BIT = 0,
-+} rx_desc_length_t;
-+
-+#define RX_DESC_LENGTH_RBS2_NUM_BITS 11
-+#define RX_DESC_LENGTH_RBS1_NUM_BITS 11
-+
-+typedef enum tx_desc_status {
-+    TX_DESC_STATUS_OWN_BIT  = 31,
-+    TX_DESC_STATUS_ES_BIT   = 15,
-+    TX_DESC_STATUS_JT_BIT   = 14,
-+    TX_DESC_STATUS_FF_BIT   = 13,
-+    TX_DESC_STATUS_LOC_BIT  = 11,
-+    TX_DESC_STATUS_NC_BIT   = 10,
-+    TX_DESC_STATUS_LC_BIT   = 9,
-+    TX_DESC_STATUS_EC_BIT   = 8,
-+    TX_DESC_STATUS_VF_BIT   = 7,
-+    TX_DESC_STATUS_CC_BIT   = 3,
-+    TX_DESC_STATUS_ED_BIT   = 2,
-+    TX_DESC_STATUS_UF_BIT   = 1,
-+    TX_DESC_STATUS_DB_BIT   = 0
-+} tx_desc_status_t;
-+
-+#define TX_DESC_STATUS_CC_NUM_BITS 4
-+
-+typedef enum tx_desc_length {
-+    TX_DESC_LENGTH_IC_BIT   = 31,
-+    TX_DESC_LENGTH_LS_BIT   = 30,
-+    TX_DESC_LENGTH_FS_BIT   = 29,
-+    TX_DESC_LENGTH_DC_BIT   = 26,
-+    TX_DESC_LENGTH_TER_BIT  = 25,
-+    TX_DESC_LENGTH_TCH_BIT  = 24,
-+    TX_DESC_LENGTH_DP_BIT   = 23,
-+    TX_DESC_LENGTH_TBS2_BIT = 11,
-+    TX_DESC_LENGTH_TBS1_BIT = 0
-+} tx_desc_length_t;
-+
-+#define TX_DESC_LENGTH_TBS2_NUM_BITS 11
-+#define TX_DESC_LENGTH_TBS1_NUM_BITS 11
-+
-+/** Return the number of descriptors available for the CPU to fill with new
-+ *  packet info */
-+static inline int available_for_write(gmac_desc_list_info_t* desc_list)
-+{
-+    return desc_list->empty_count;
-+}
-+
-+/** Return non-zero if there is a descriptor available with a packet with which
-+ *  the GMAC DMA has finished */
-+static inline int tx_available_for_read(gmac_desc_list_info_t* desc_list)
-+{
-+    return desc_list->full_count &&
-+           !((desc_list->base_ptr + desc_list->r_index)->status & (1UL << TX_DESC_STATUS_OWN_BIT));
-+}
-+
-+/** Return non-zero if there is a descriptor available with a packet with which
-+ *  the GMAC DMA has finished */
-+static inline int rx_available_for_read(gmac_desc_list_info_t* desc_list)
-+{
-+    return desc_list->full_count &&
-+           !((desc_list->base_ptr + desc_list->r_index)->status & (1UL << RX_DESC_STATUS_OWN_BIT));
-+}
-+
-+/**
-+ * @param A u32 containing the status from a received frame's DMA descriptor
-+ * @return An int which is non-zero if a valid received frame is fully contained
-+ *  within the descriptor from whence the status came
-+ */
-+static inline int is_rx_valid(u32 status)
-+{
-+    return !(status & descError)  &&
-+           (status & descRxFirst) &&
-+           (status & descRxLast);
-+}
-+
-+static inline int is_rx_dribbling(u32 status)
-+{
-+    return status & descRxDribbling;
-+}
-+
-+static inline u32 get_rx_length(u32 status)
-+{
-+    return (status & descFrameLengthMask) >> descFrameLengthShift;
-+}
-+
-+static inline int is_rx_collision_error(u32 status)
-+{
-+    return status & (descRxDamaged | descRxCollision);
-+}
-+
-+static inline int is_rx_crc_error(u32 status)
-+{
-+    return status & descRxCrc;
-+}
-+
-+static inline int is_rx_frame_error(u32 status)
-+{
-+    return status & descRxDribbling;
-+}
-+
-+static inline int is_rx_length_error(u32 status)
-+{
-+    return status & descRxLengthError;
-+}
-+
-+static inline int is_rx_long_frame(u32 status)
-+{
-+    return status & descRxLongFrame;
-+}
-+
-+static inline int is_tx_valid(u32 status)
-+{
-+    return !(status & descError);
-+}
-+
-+static inline int is_tx_collision_error(u32 status)
-+{
-+    return (status & descTxCollMask) >> descTxCollShift;
-+}
-+
-+static inline int is_tx_aborted(u32 status)
-+{
-+    return status & (descTxLateCollision | descTxExcCollisions);
-+}
-+
-+static inline int is_tx_carrier_error(u32 status)
-+{
-+    return status & (descTxLostCarrier | descTxNoCarrier);
-+}
-+
-+/**
-+ * GMAC private metadata
-+ */
-+static gmac_priv_t priv_data;
-+static gmac_priv_t* priv = &priv_data;
-+
-+/**
-+ * Descriptor list management
-+ */
-+
-+static void init_rx_descriptor(
-+    gmac_dma_desc_t* desc,
-+    int              end_of_ring,
-+    int              disable_ioc)
-+{
-+    desc->status = 0;
-+    desc->length = 0;
-+    if (disable_ioc) {
-+        desc->length |= (1UL << RX_DESC_LENGTH_DIC_BIT);
-+    }
-+    if (end_of_ring) {
-+        desc->length |= (1UL << RX_DESC_LENGTH_RER_BIT);
-+    }
-+    desc->buffer1 = 0;
-+    desc->buffer2 = 0;
-+    desc->skb = 0;
-+}
-+
-+static void init_tx_descriptor(
-+    gmac_dma_desc_t* desc,
-+    int              end_of_ring,
-+    int              enable_ioc,
-+    int              disable_crc,
-+    int              disable_padding)
-+{
-+    desc->status = 0;
-+    desc->length = 0;
-+    if (enable_ioc) {
-+        desc->length |= (1UL << TX_DESC_LENGTH_IC_BIT);
-+    }
-+    if (disable_crc) {
-+        desc->length |= (1UL << TX_DESC_LENGTH_DC_BIT);
-+    }
-+    if (disable_padding) {
-+        desc->length |= (1UL << TX_DESC_LENGTH_DP_BIT);
-+    }
-+    if (end_of_ring) {
-+        desc->length |= (1UL << TX_DESC_LENGTH_TER_BIT);
-+    }
-+    desc->buffer1 = 0;
-+    desc->buffer2 = 0;
-+    desc->skb = 0;
-+}
-+
-+static void init_rx_desc_list(
-+    gmac_desc_list_info_t* desc_list,
-+    gmac_dma_desc_t*       base_ptr,
-+    int                    num_descriptors)
-+{
-+    int i;
-+    
-+    desc_list->base_ptr = base_ptr;
-+    desc_list->num_descriptors = num_descriptors;
-+    desc_list->empty_count = num_descriptors;
-+    desc_list->full_count = 0;
-+    desc_list->r_index = 0;
-+    desc_list->w_index = 0;
-+
-+    for (i=0; i < (num_descriptors - 1); i++) {
-+        init_rx_descriptor(base_ptr + i, 0, 0);
-+    }
-+    init_rx_descriptor(base_ptr + i, 1, 0);
-+}
-+
-+static void init_tx_desc_list(
-+    gmac_desc_list_info_t* desc_list,
-+    gmac_dma_desc_t*       base_ptr,
-+    int                    num_descriptors)
-+{
-+    int i;
-+    
-+    desc_list->base_ptr = base_ptr;
-+    desc_list->num_descriptors = num_descriptors;
-+    desc_list->empty_count = num_descriptors;
-+    desc_list->full_count = 0;
-+    desc_list->r_index = 0;
-+    desc_list->w_index = 0;
-+
-+    for (i=0; i < (num_descriptors - 1); i++) {
-+        init_tx_descriptor(base_ptr + i, 0, 1, 0, 0);
-+    }
-+    init_tx_descriptor(base_ptr + i, 1, 1, 0, 0);
-+}
-+
-+static void rx_take_ownership(gmac_desc_list_info_t* desc_list)
-+{
-+    int i;
-+    for (i=0; i < desc_list->num_descriptors; i++) {
-+        (desc_list->base_ptr + i)->status &= ~(1UL << RX_DESC_STATUS_OWN_BIT);
-+    }
-+}
-+
-+static void tx_take_ownership(gmac_desc_list_info_t* desc_list)
-+{
-+    int i;
-+    for (i=0; i < desc_list->num_descriptors; i++) {
-+        (desc_list->base_ptr + i)->status &= ~(1UL << TX_DESC_STATUS_OWN_BIT);
-+    }
-+}
-+
-+static int set_tx_descriptor(
-+    gmac_priv_t* priv,
-+    dma_addr_t   dma_address,
-+    u32          length,
-+    sk_buff_t*   skb)
-+{
-+    int index;
-+    gmac_dma_desc_t* tx;
-+
-+    // Are sufficicent descriptors available for writing by the CPU?
-+    if (!available_for_write(&priv->tx_gmac_desc_list_info)) {
-+        return -1;
-+    }
-+
-+    // Get the index of the next TX descriptor available for writing by the CPU
-+    index = priv->tx_gmac_desc_list_info.w_index;
-+
-+    // Get a pointer to the next TX descriptor available for writing by the CPU
-+    tx = priv->tx_gmac_desc_list_info.base_ptr + index;
-+
-+    // Initialise the TX descriptor length field for the passed single buffer,
-+    // without destroying any fields we wish to be persistent
-+
-+    // No chained second buffer
-+    tx->length &= ~(1UL << TX_DESC_LENGTH_TCH_BIT);
-+    // Single descriptor holds entire packet
-+    tx->length |= ((1UL << TX_DESC_LENGTH_LS_BIT) | (1UL << TX_DESC_LENGTH_FS_BIT));
-+    // Zero the second buffer length field
-+    tx->length &= ~(((1UL << TX_DESC_LENGTH_TBS2_NUM_BITS) - 1) << TX_DESC_LENGTH_TBS2_BIT);
-+    // Zero the first buffer length field
-+    tx->length &= ~(((1UL << TX_DESC_LENGTH_TBS1_NUM_BITS) - 1) << TX_DESC_LENGTH_TBS1_BIT);
-+    // Fill in the first buffer length
-+    tx->length |= (length << TX_DESC_LENGTH_TBS1_BIT);
-+
-+    // Initialise the first buffer pointer to the single passed buffer
-+    tx->buffer1 = dma_address;
-+
-+    // Remember the socket buffer associated with the single passed buffer
-+    tx->skb = (u32)skb;
-+
-+    // Update the index of the next descriptor available for writing by the CPU
-+    priv->tx_gmac_desc_list_info.w_index = (tx->length & (1UL << TX_DESC_LENGTH_TER_BIT)) ? 0 : index + 1;
-+
-+    // make sure all memory updates are complete before releasing the GMAC on the data.
-+    wmb();
-+    
-+    // Hand TX descriptor to the GMAC DMA by setting the status bit.
-+    tx->status = (1UL << TX_DESC_STATUS_OWN_BIT);
-+
-+    // Account for the number of descriptors used to hold the new packet
-+    --priv->tx_gmac_desc_list_info.empty_count;
-+    ++priv->tx_gmac_desc_list_info.full_count;
-+
-+    return index;
-+}
-+
-+static int get_tx_descriptor(
-+    gmac_priv_t* priv,
-+    u32*         status,
-+    dma_addr_t*  dma_address,
-+    u32*         length,
-+    sk_buff_t**  skb)
-+{
-+    int index;
-+    gmac_dma_desc_t *tx;
-+
-+    // Is there at least one descriptor with which the GMAC DMA has finished?
-+    if (!tx_available_for_read(&priv->tx_gmac_desc_list_info)) {
-+        return -1;
-+    }
-+
-+    // Get the index of the descriptor released the longest time ago by the
-+    // GMAC DMA 
-+    index = priv->tx_gmac_desc_list_info.r_index;
-+
-+    // Get a pointer to the descriptor released the longest time ago by the
-+    // GMAC DMA 
-+    tx = priv->tx_gmac_desc_list_info.base_ptr + index;
-+
-+    // Extract the status field
-+    if (status) {
-+        *status = tx->status;
-+    }
-+
-+    // Extract the length field - only cope with the first buffer associated
-+    // with the descriptor
-+    if (length) {
-+        *length = (tx->length >> TX_DESC_LENGTH_TBS1_BIT) &
-+                  ((1UL << TX_DESC_LENGTH_TBS1_NUM_BITS) - 1);
-+    }
-+
-+    // Extract the pointer to the buffer containing the packet - only cope with
-+    // the first buffer associated with the descriptor
-+    if (dma_address) {
-+        *dma_address = tx->buffer1;
-+    }
-+
-+    // Extract the pointer to the socket buffer associated with the packet
-+    if (skb) {
-+        *skb = (sk_buff_t*)(tx->skb);
-+    }
-+
-+    // Update the index of the next descriptor with which the GMAC DMA may have
-+    // finished
-+    priv->tx_gmac_desc_list_info.r_index = (tx->length & (1UL << TX_DESC_LENGTH_TER_BIT)) ? 0 : index + 1;
-+
-+    // Account for the number of descriptors freed to hold new packets
-+    ++priv->tx_gmac_desc_list_info.empty_count;
-+    --priv->tx_gmac_desc_list_info.full_count;
-+
-+    return index;
-+}
-+
-+int set_rx_descriptor(
-+    gmac_priv_t* priv,
-+    dma_addr_t   dma_address,
-+    u32          length,
-+    sk_buff_t*   skb)
-+{
-+    int index;
-+    gmac_dma_desc_t* rx;
-+    int num_descriptors_required;
-+
-+    // Currently only support using a single descriptor to describe each packet
-+    // queued with the GMAc DMA
-+    num_descriptors_required = 1;
-+
-+    // Are sufficicent descriptors available for writing by the CPU?
-+    if (available_for_write(&priv->rx_gmac_desc_list_info) < num_descriptors_required) {
-+        index = -1;
-+    } else {
-+        // Get the index of the next RX descriptor available for writing by the CPU
-+        index = priv->rx_gmac_desc_list_info.w_index;
-+
-+        // Get a pointer to the next RX descriptor available for writing by the CPU
-+        rx = priv->rx_gmac_desc_list_info.base_ptr + index;
-+
-+        // Initialise the RX descriptor length field for the passed single buffer,
-+        // without destroying any fields we wish to be persistent
-+
-+        // No chained second buffer
-+        rx->length &= ~(1UL << RX_DESC_LENGTH_RCH_BIT);
-+        // Zero the second buffer length field
-+        rx->length &= ~(((1UL << RX_DESC_LENGTH_RBS2_NUM_BITS) - 1) << RX_DESC_LENGTH_RBS2_BIT);
-+        // Zero the first buffer length field
-+        rx->length &= ~(((1UL << RX_DESC_LENGTH_RBS1_NUM_BITS) - 1) << RX_DESC_LENGTH_RBS1_BIT);
-+        // Fill in the first buffer length
-+        rx->length |= (length << RX_DESC_LENGTH_RBS1_BIT);
-+
-+        // Initialise the first buffer pointer to the single passed buffer
-+        rx->buffer1 = dma_address;
-+
-+        // Remember the socket buffer associated with the single passed buffer
-+        rx->skb = (u32)skb;
-+        
-+        wmb();
-+        
-+        // Initialise RX descriptor status to be owned by the GMAC DMA
-+        rx->status = (1UL << RX_DESC_STATUS_OWN_BIT);
-+
-+        // Update the index of the next descriptor available for writing by the CPU
-+        priv->rx_gmac_desc_list_info.w_index = (rx->length & (1UL << RX_DESC_LENGTH_RER_BIT)) ? 0 : index + 1;
-+
-+        // Account for the number of descriptors used to hold the new packet
-+        priv->rx_gmac_desc_list_info.empty_count -= num_descriptors_required;
-+        priv->rx_gmac_desc_list_info.full_count  += num_descriptors_required;
-+    }
-+
-+    return index;
-+}
-+
-+int get_rx_descriptor(
-+    gmac_priv_t* priv,
-+    u32*         status,
-+    dma_addr_t*  dma_address,
-+    u32*         length,
-+    sk_buff_t**  skb)
-+{
-+    int index;
-+    gmac_dma_desc_t *rx;
-+    int num_descriptors_required;
-+
-+    // Is there at least one descriptor with which the GMAC DMA has finished?
-+    if (!rx_available_for_read(&priv->rx_gmac_desc_list_info)) {
-+        return -1;
-+    }
-+
-+    // Currently can only cope with packets entirely contained within a single
-+    // descriptor
-+    num_descriptors_required = 1;
-+
-+    // Get the index of the descriptor released the longest time ago by the
-+    // GMAC DMA 
-+    index = priv->rx_gmac_desc_list_info.r_index;
-+
-+    // Get a pointer to the descriptor released the longest time ago by the
-+    // GMAC DMA 
-+    rx = priv->rx_gmac_desc_list_info.base_ptr + index;
-+
-+    // Extract the status field
-+    if (status) {
-+        *status = rx->status;
-+    }
-+
-+    // Extract the length field - only cope with the first buffer associated
-+    // with the descriptor
-+    if (length) {
-+        *length = (rx->length >> RX_DESC_LENGTH_RBS1_BIT) &
-+                  ((1UL << RX_DESC_LENGTH_RBS1_NUM_BITS) - 1);
-+    }
-+
-+    // Extract the pointer to the buffer containing the packet - only cope with
-+    // the first buffer associated with the descriptor
-+    if (dma_address) {
-+        *dma_address = rx->buffer1;
-+    }
-+
-+    // Extract the pointer to the socket buffer associated with the packet
-+    if (skb) {
-+        *skb = (sk_buff_t*)(rx->skb);
-+    }
-+
-+    wmb();
-+    // Update the index of the next descriptor with which the GMAC DMA may have
-+    // finished
-+    priv->rx_gmac_desc_list_info.r_index = (rx->length & (1UL << RX_DESC_LENGTH_RER_BIT)) ? 0 : index + 1;
-+
-+    // Account for the number of descriptors freed to hold new packets
-+    priv->rx_gmac_desc_list_info.empty_count += num_descriptors_required;
-+    priv->rx_gmac_desc_list_info.full_count  -= num_descriptors_required;
-+
-+    return index;
-+}
-+
-+/**
-+ * GMAC register access functions
-+ */
-+
-+/**
-+ * MAC register access functions
-+ */
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the MAC register to access
-+ */
-+static inline u32 mac_reg_read(gmac_priv_t* priv, int reg_num)
-+{
-+    return *(volatile u32*)(priv->macBase + (reg_num << 2));
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the MAC register to access
-+ */
-+static inline void mac_reg_write(gmac_priv_t* priv, int reg_num, u32 value)
-+{
-+    *(volatile u32*)(priv->macBase + (reg_num << 2)) = value;
-+   
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the MAC register to access
-+ * @param bits_to_clear A u32 specifying which bits of the specified register to
-+ *  clear. A set bit in this parameter will cause the matching bit in the
-+ *  register to be cleared
-+ */
-+static inline void mac_reg_clear_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_clear)
-+{
-+    mac_reg_write(priv, reg_num, mac_reg_read(priv, reg_num) & ~bits_to_clear);
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the MAC register to access
-+ * @param bits_to_set A u32 specifying which bits of the specified register to
-+ *  set. A set bit in this parameter will cause the matching bit in the register
-+ *  to be set
-+ */
-+static inline void mac_reg_set_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_set)
-+{
-+    mac_reg_write(priv, reg_num, mac_reg_read(priv, reg_num) | bits_to_set);
-+}
-+
-+
-+/**
-+ * DMA register access functions
-+ */
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the DMA register to access
-+ */
-+static inline u32 dma_reg_read(gmac_priv_t* priv, int reg_num)
-+{
-+    return *(volatile u32*)(priv->dmaBase + (reg_num << 2));
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the DMA register to access
-+ */
-+static inline void dma_reg_write(gmac_priv_t* priv, int reg_num, u32 value)
-+{
-+    *(volatile u32*)(priv->dmaBase + (reg_num << 2)) = value;
-+    wmb();
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the DMA register to access
-+ * @param bits_to_clear A u32 specifying which bits of the specified register to
-+ *  clear. A set bit in this parameter will cause the matching bit in the
-+ *  register to be cleared
-+ * @return An u32 containing the new value written to the register
-+ */
-+static inline u32 dma_reg_clear_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_clear)
-+{
-+    u32 new_value = dma_reg_read(priv, reg_num) & ~bits_to_clear;
-+    dma_reg_write(priv, reg_num, new_value);
-+    return new_value;
-+}
-+
-+/**
-+ * @param priv A gmac_priv_t* pointing to private device data
-+ * @param reg_num An int specifying the index of the DMA register to access
-+ * @param bits_to_set A u32 specifying which bits of the specified register to
-+ *  set. A set bit in this parameter will cause the matching bit in the register
-+ *  to be set
-+ * @return An u32 containing the new value written to the register
-+ */
-+static inline u32 dma_reg_set_mask(gmac_priv_t* priv, int reg_num, u32 bits_to_set)
-+{
-+    u32 new_value = dma_reg_read(priv, reg_num) | bits_to_set;
-+    dma_reg_write(priv, reg_num, new_value);
-+    return new_value;
-+}
-+
-+static void eth_down(void)
-+{
-+    // Stop transmitter, take ownership of all tx descriptors
-+    dma_reg_clear_mask(priv, DMA_OP_MODE_REG, DMA_OP_MODE_ST_BIT);
-+    if (priv->desc_base_addr) {
-+        tx_take_ownership(&priv->tx_gmac_desc_list_info);
-+    }
-+
-+    // Stop receiver, take ownership of all rx descriptors
-+    dma_reg_clear_mask(priv, DMA_OP_MODE_REG, DMA_OP_MODE_SR_BIT);
-+    if (priv->desc_base_addr) {
-+        rx_take_ownership(&priv->rx_gmac_desc_list_info);
-+    }
-+
-+    // Free descriptor resources. The TX descriptor will not have a packet
-+    // buffer attached, as this is provided by the stack when transmission is
-+    // required and ownership is not retained by the descriptor, as the stack
-+    // waits for transmission to complete via polling
-+    if (priv->desc_base_addr) {
-+        // Free receive descriptors, accounting for buffer offset used to
-+        // ensure IP header alignment
-+        while (1) {
-+            dma_addr_t dma_address;
-+            if (get_rx_descriptor(priv, 0, &dma_address, 0, 0) < 0) {
-+                break;
-+            }
-+            free((void*)(dma_address - ETHER_FRAME_ALIGN_WASTAGE));
-+        }
-+
-+        // Free DMA descriptors' storage
-+        free(priv->desc_base_addr);
-+
-+        // Remember that we've freed the descriptors memory
-+        priv->desc_base_addr = 0;
-+    }
-+}
-+
-+/*
-+ * Reads a register from the MII Management serial interface
-+ */
-+int phy_read(int phyaddr, int phyreg)
-+{
-+    int data = 0;
-+    u32 addr = (phyaddr << MAC_GMII_ADR_PA_BIT) |
-+               (phyreg << MAC_GMII_ADR_GR_BIT) |
-+               (5 << MAC_GMII_ADR_CR_BIT) |
-+               (1UL << MAC_GMII_ADR_GB_BIT);
-+
-+    mac_reg_write(priv, MAC_GMII_ADR_REG, addr);
-+
-+    for (;;) {
-+        if (!(mac_reg_read(priv, MAC_GMII_ADR_REG) & (1UL << MAC_GMII_ADR_GB_BIT))) {
-+            // Successfully read from PHY
-+            data = mac_reg_read(priv, MAC_GMII_DATA_REG) & 0xFFFF;
-+            break;
-+        }
-+    }
-+
-+#ifdef DEBUG_GMAC_INIT
-+    printf("phy_read() phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", phyaddr, phyreg, data);
-+#endif // DEBUG_GMAC_INIT
-+
-+    return data;
-+}
-+
-+/*
-+ * Writes a register to the MII Management serial interface
-+ */
-+void phy_write(int phyaddr, int phyreg, int phydata)
-+{
-+    u32 addr = (phyaddr << MAC_GMII_ADR_PA_BIT) |
-+               (phyreg << MAC_GMII_ADR_GR_BIT) |
-+               (5 << MAC_GMII_ADR_CR_BIT) |
-+               (1UL << MAC_GMII_ADR_GW_BIT) |
-+               (1UL << MAC_GMII_ADR_GB_BIT);
-+
-+    mac_reg_write(priv, MAC_GMII_DATA_REG, phydata);
-+    mac_reg_write(priv, MAC_GMII_ADR_REG, addr);
-+
-+    for (;;) {
-+        if (!(mac_reg_read(priv, MAC_GMII_ADR_REG) & (1UL << MAC_GMII_ADR_GB_BIT))) {
-+            break;
-+        }
-+    }
-+
-+#ifdef DEBUG_GMAC_INIT
-+    printf("phy_write() phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", phyaddr, phyreg, phydata);
-+#endif // DEBUG_GMAC_INIT
-+}
-+
-+/*
-+ * Finds and reports the PHY address
-+ */
-+int phy_detect(void)
-+{
-+	int found = 0;
-+    int phyaddr;
-+
-+    // Scan all 32 PHY addresses if necessary
-+    priv->phy_type = 0;
-+    for (phyaddr = 1; phyaddr < 33; ++phyaddr) {
-+        unsigned int id1, id2;
-+
-+        // Read the PHY identifiers
-+        id1 = phy_read(phyaddr & 31, MII_PHYSID1);
-+        id2 = phy_read(phyaddr & 31, MII_PHYSID2);
-+
-+#ifdef DEBUG_GMAC_INIT
-+        printf("phy_detect() PHY adr = %u -> phy_id1=0x%x, phy_id2=0x%x\n", phyaddr, id1, id2);
-+#endif // DEBUG_GMAC_INIT
-+
-+        // Make sure it is a valid identifier
-+        if (id1 != 0x0000 && id1 != 0xffff && id1 != 0x8000 &&
-+            id2 != 0x0000 && id2 != 0xffff && id2 != 0x8000) {
-+#ifdef DEBUG_GMAC_INIT
-+            printf("phy_detect() Found PHY at address = %u\n", phyaddr);
-+#endif // DEBUG_GMAC_INIT
-+
-+            priv->phy_id   = phyaddr & 31;
-+            priv->phy_type = id1 << 16 | id2;
-+            priv->phy_addr = phyaddr;
-+
-+			found = 1;
-+            break;
-+        }
-+    }
-+
-+	return found;
-+}
-+
-+void start_phy_reset(void)
-+{
-+    // Ask the PHY to reset
-+    phy_write(priv->phy_addr, MII_BMCR, BMCR_RESET);
-+}
-+
-+int is_phy_reset_complete(void)
-+{
-+    int complete = 0;
-+    int bmcr;
-+
-+    // Read back the status until it indicates reset, or we timeout
-+    bmcr = phy_read(priv->phy_addr, MII_BMCR);
-+    if (!(bmcr & BMCR_RESET)) {
-+        complete = 1;
-+    }
-+
-+    return complete;
-+}
-+
-+void set_phy_type_rgmii(void)
-+{
-+	// Use sysctrl to switch MAC link lines into either (G)MII or RGMII mode
-+    *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_RGMII);
-+}
-+
-+void phy_initialise(void)
-+{
-+	switch (priv->phy_type) {
-+		case PHY_TYPE_VITESSE_VSC8201XVZ:
-+			{
-+				// Allow s/w to override mode/duplex pin settings
-+				u32 acsr = phy_read(priv->phy_id, VSC8201_MII_ACSR);
-+
-+				printf("PHY is Vitesse VSC8201XVZ\n");
-+				acsr |= (1UL << VSC8201_MII_ACSR_MDPPS_BIT);
-+				phy_write(priv->phy_id, VSC8201_MII_ACSR, acsr);
-+			}
-+			break;
-+		case PHY_TYPE_REALTEK_RTL8211BGR:
-+			printf("PHY is Realtek RTL8211BGR\n");
-+			set_phy_type_rgmii();
-+			break;
-+		case PHY_TYPE_LSI_ET1011C:
-+			{
-+				u32 phy_reg;
-+
-+				printf("PHY is LSI ET1011C\n");
-+
-+				// Configure clocks
-+				phy_reg = phy_read(priv->phy_id, ET1011C_MII_CONFIG);
-+				phy_reg &= ~(((1UL << ET1011C_MII_CONFIG_IFMODESEL_NUM_BITS) - 1) << ET1011C_MII_CONFIG_IFMODESEL);
-+				phy_reg |= (ET1011C_MII_CONFIG_IFMODESEL_GMII_MII << ET1011C_MII_CONFIG_IFMODESEL);
-+				phy_reg |= ((1UL << ET1011C_MII_CONFIG_SYSCLKEN) |
-+                              (1UL << ET1011C_MII_CONFIG_TXCLKEN) |
-+							   (1UL << ET1011C_MII_CONFIG_TBI_RATESEL) |
-+							   (1UL << ET1011C_MII_CONFIG_CRS_TX_EN));
-+				phy_write(priv->phy_id, ET1011C_MII_CONFIG, phy_reg);
-+
-+				// Enable Tx/Rx LED
-+				phy_reg = phy_read(priv->phy_id, ET1011C_MII_LED2);
-+				phy_reg &= ~(((1UL << ET1011C_MII_LED2_LED_NUM_BITS) - 1) << ET1011C_MII_LED2_LED_TXRX);
-+				phy_reg |= (ET1011C_MII_LED2_LED_TXRX_ACTIVITY << ET1011C_MII_LED2_LED_TXRX);
-+				phy_write(priv->phy_id, ET1011C_MII_LED2, phy_reg);
-+			}
-+			break;
-+	}
-+}
-+
-+int detect_link_speed(void)
-+{
-+	u32 lpa2 = phy_read(priv->phy_id, MII_STAT1000);
-+
-+	if (((lpa2 & LPA_1000FULL)) ||
-+		((lpa2 & LPA_1000HALF))) {
-+		priv->link_is_1000M = 1;
-+	} else {
-+		priv->link_is_1000M = 0;
-+	}
-+
-+	return 0;
-+}
-+
-+int is_autoneg_complete(void)
-+{
-+    return phy_read(priv->phy_addr, MII_BMSR) & BMSR_ANEGCOMPLETE;
-+}
-+
-+int is_link_ok(void)
-+{
-+	return phy_read(priv->phy_id, MII_BMSR) & BMSR_LSTATUS;
-+}
-+
-+int eth_init(bd_t *bd)
-+{
-+    u32  version;
-+    u32  reg_contents;
-+    u8  *mac_addr;
-+    int  desc;
-+
-+    // Set hardware device base addresses
-+    priv->macBase = (MAC_BASE_PA + MAC_BASE_OFFSET);
-+    priv->dmaBase = (MAC_BASE_PA + DMA_BASE_OFFSET);
-+
-+#ifdef DEBUG_GMAC_INIT
-+    printf("eth_init(): About to reset MAC core\n");
-+#endif // DEBUG_GMAC_INIT
-+    // Ensure the MAC block is properly reset
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_MAC_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_MAC_BIT);
-+
-+    // Enable the clock to the MAC block
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_MAC_BIT);
-+
-+    version = mac_reg_read(priv, MAC_VERSION_REG);
-+#ifdef DEBUG_GMAC_INIT
-+    printf("eth_init(): GMAC Synopsis version = 0x%x, vendor version = 0x%x\n", version & 0xff, (version >> 8) & 0xff);
-+#endif // DEBUG_GMAC_INIT
-+
-+    // Use simple mux for 25/125 Mhz clock switching
-+    *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_SIMPLE_MAX);
-+
-+    // Enable GMII_GTXCLK to follow GMII_REFCLK - required for gigabit PHY
-+    *(volatile u32*)SYS_CTRL_GMAC_CTRL |= (1UL << SYS_CTRL_GMAC_CKEN_GTX);
-+
-+    // Disable all GMAC interrupts
-+    dma_reg_write(priv, DMA_INT_ENABLE_REG, 0);
-+
-+    // Reset the entire GMAC
-+    dma_reg_write(priv, DMA_BUS_MODE_REG, 1UL << DMA_BUS_MODE_SWR_BIT);
-+
-+    // Wait for the reset operation to complete
-+	printf("Wait GMAC to reset");
-+    while (dma_reg_read(priv, DMA_BUS_MODE_REG) & (1UL << DMA_BUS_MODE_SWR_BIT)) {
-+		udelay(250000);
-+		printf(".");
-+    }
-+	printf("\n");
-+
-+	// Attempt to discover link speed from the PHY
-+	if (!phy_detect()) {
-+		printf("No PHY found\n");
-+	} else {
-+		// Ensure the PHY is in a sensible state by resetting it
-+		start_phy_reset();
-+
-+		// Read back the status until it indicates reset, or we timeout
-+		printf("Wait for PHY reset");
-+		while (!is_phy_reset_complete()) {
-+			udelay(250000);
-+			printf(".");
-+		}
-+		printf("\n");
-+
-+		// Setup the PHY based on its type
-+		phy_initialise();
-+
-+		printf("Wait for link to come up");
-+		while (!is_link_ok()) {
-+			udelay(250000);
-+			printf(".");
-+		}
-+		printf("Link up\n");
-+
-+		// Wait for PHY to have completed autonegotiation
-+		printf("Wait for auto-negotiation to complete");
-+		while (!is_autoneg_complete()) {
-+			udelay(250000);
-+			printf(".");
-+		}
-+		printf("\n");
-+
-+		// Interrogate the PHY for the link speed
-+		if (detect_link_speed()) {
-+			printf("Failed to detect link speed\n");
-+		} else {
-+			printf("Link is %s\n", priv->link_is_1000M ? "1000M" : "10M/100M");
-+		}
-+	}
-+
-+    // Form the MAC config register contents
-+    reg_contents = 0;
-+	if (!priv->link_is_1000M) {
-+		reg_contents |= (1UL << MAC_CONFIG_PS_BIT); // Gigabit
-+	}
-+    reg_contents |= (1UL << MAC_CONFIG_DM_BIT); // Full duplex
-+    reg_contents |= ((1UL << MAC_CONFIG_TE_BIT) |
-+                     (1UL << MAC_CONFIG_RE_BIT));
-+    mac_reg_write(priv, MAC_CONFIG_REG, reg_contents);
-+
-+    // Form the MAC frame filter register contents
-+    reg_contents = 0;
-+    mac_reg_write(priv, MAC_FRAME_FILTER_REG, reg_contents);
-+
-+    // Form the hash table registers contents
-+    mac_reg_write(priv, MAC_HASH_HIGH_REG, 0);
-+    mac_reg_write(priv, MAC_HASH_LOW_REG, 0);
-+
-+    // Form the MAC flow control register contents
-+    reg_contents = 0;
-+    reg_contents |= ((1UL << MAC_FLOW_CNTL_RFE_BIT) |
-+                     (1UL << MAC_FLOW_CNTL_TFE_BIT));
-+    mac_reg_write(priv, MAC_FLOW_CNTL_REG, reg_contents);
-+
-+    // Form the MAC VLAN tag register contents
-+    reg_contents = 0;
-+    mac_reg_write(priv, MAC_VLAN_TAG_REG, reg_contents);
-+
-+    // Form the MAC addr0 high and low registers contents from the character
-+    // string representation from the environment
-+    mac_addr = getenv("ethaddr");
-+#ifdef DEBUG_GMAC_INIT
-+    printf("eth_init(): Mac addr = %s\n", mac_addr);
-+#endif // DEBUG_GMAC_INIT
-+    reg_contents  =  simple_strtoul(mac_addr+0, 0, 16);
-+    reg_contents |= (simple_strtoul(mac_addr+3, 0, 16) << 8);
-+    reg_contents |= (simple_strtoul(mac_addr+6, 0, 16) << 16);
-+    reg_contents |= (simple_strtoul(mac_addr+9, 0, 16) << 24);
-+    mac_reg_write(priv, MAC_ADR0_LOW_REG, reg_contents);
-+    reg_contents  =  simple_strtoul(mac_addr+12, 0, 16);
-+    reg_contents |= (simple_strtoul(mac_addr+15, 0, 16) << 8);
-+    mac_reg_write(priv, MAC_ADR0_HIGH_REG, reg_contents);
-+
-+    // Disable all MMC interrupt sources
-+    mac_reg_write(priv, MMC_RX_MASK_REG, ~0UL);
-+    mac_reg_write(priv, MMC_TX_MASK_REG, ~0UL);
-+
-+    // Remember how large the unified descriptor array is to be
-+    priv->total_num_descriptors = NUM_RX_DMA_DESCRIPTORS + NUM_TX_DMA_DESCRIPTORS;
-+
-+    // Need a consistent DMA mapping covering all the memory occupied by DMA
-+    // unified descriptor array, as both CPU and DMA engine will be reading and
-+    // writing descriptor fields.
-+    priv->desc_base_addr = (gmac_dma_desc_t*)malloc(sizeof(gmac_dma_desc_t) * priv->total_num_descriptors);
-+    if (!priv->desc_base_addr) {
-+       printf("eth_init(): Failed to allocate memory for DMA descriptors\n");
-+        goto err_out;
-+    }
-+
-+    // Initialise the structures managing the TX descriptor list
-+    init_tx_desc_list(&priv->tx_gmac_desc_list_info,
-+                      priv->desc_base_addr,
-+                      NUM_TX_DMA_DESCRIPTORS);
-+
-+    // Initialise the structures managing the RX descriptor list
-+    init_rx_desc_list(&priv->rx_gmac_desc_list_info,
-+                      priv->desc_base_addr + NUM_TX_DMA_DESCRIPTORS,
-+                      priv->total_num_descriptors - NUM_TX_DMA_DESCRIPTORS);
-+
-+    // Prepare receive descriptors
-+    desc = 0;
-+    while (available_for_write(&priv->rx_gmac_desc_list_info)) {
-+        // Allocate a new buffer for the descriptor which is large enough for
-+        // any packet received from the link
-+        dma_addr_t dma_address = (dma_addr_t)malloc(ETHER_MTU + ETHER_FRAME_ALIGN_WASTAGE + EXTRA_RX_SKB_SPACE);
-+        if (!dma_address) {
-+            printf("eth_init(): No memory for socket buffer\n");
-+            break;
-+        }
-+
-+        desc = set_rx_descriptor(priv,
-+                                 dma_address + ETHER_FRAME_ALIGN_WASTAGE,
-+                                 ETHER_MTU + EXTRA_RX_SKB_SPACE,
-+                                 0);
-+
-+        if (desc < 0) {
-+            // Release the buffer
-+            free((void*)dma_address);
-+
-+            printf("eth_init(): Error, no RX descriptor available\n");
-+            goto err_out;
-+        }
-+    }
-+
-+    // Initialise the GMAC DMA bus mode register
-+    dma_reg_write(priv, DMA_BUS_MODE_REG, ((0UL << DMA_BUS_MODE_FB_BIT)   |
-+                                           (0UL << DMA_BUS_MODE_PR_BIT)   |
-+                                           (32UL << DMA_BUS_MODE_PBL_BIT) | // AHB burst size
-+                                           (1UL << DMA_BUS_MODE_DSL_BIT)  | 
-+                                           (0UL << DMA_BUS_MODE_DA_BIT)));
-+
-+    // Write the address of the start of the tx descriptor array
-+    dma_reg_write(priv, DMA_TX_DESC_ADR_REG, (u32)priv->desc_base_addr);
-+
-+    // Write the address of the start of the rx descriptor array
-+    dma_reg_write(priv, DMA_RX_DESC_ADR_REG,
-+        (u32)(priv->desc_base_addr + priv->tx_gmac_desc_list_info.num_descriptors));
-+
-+    // Clear any pending interrupt requests
-+    dma_reg_write(priv, DMA_STATUS_REG, dma_reg_read(priv, DMA_STATUS_REG));
-+
-+    // Initialise the GMAC DMA operation mode register, starting both the
-+    // transmitter and receiver
-+    dma_reg_write(priv, DMA_OP_MODE_REG, ((1UL << DMA_OP_MODE_SF_BIT)  |    // Store and forward
-+                                          (0UL << DMA_OP_MODE_TTC_BIT) |    // Tx threshold
-+                                          (1UL << DMA_OP_MODE_ST_BIT)  |    // Enable transmitter
-+                                          (0UL << DMA_OP_MODE_RTC_BIT) |    // Rx threshold
-+                                          (1UL << DMA_OP_MODE_SR_BIT)));    // Enable receiver
-+
-+    // Success
-+    return 1;
-+
-+err_out:
-+    eth_down();
-+
-+    return 0;
-+}
-+
-+void eth_halt(void)
-+{
-+    eth_down();
-+
-+    // Disable the clock to the MAC block
-+    *(volatile u32*)(SYS_CTRL_CKEN_CLR_CTRL) = (1UL << SYS_CTRL_CKEN_MAC_BIT);
-+}
-+
-+int eth_rx(void)
-+{
-+    static const int MAX_LOOPS = 2000;   // 2 seconds
-+
-+    int length = 0;
-+    dma_addr_t dma_address;
-+    u32 desc_status;
-+    int loops = 0;
-+
-+    // Look for the first available received packet
-+    while (loops++ < MAX_LOOPS) {
-+        if (get_rx_descriptor(priv, &desc_status, &dma_address, 0, 0) >= 0) {
-+            if (is_rx_valid(desc_status)) {
-+                // Get the length of the packet within the buffer
-+                length = get_rx_length(desc_status);
-+
-+                // Pass packet up the network stack - will block until processing is
-+                // completed
-+                NetReceive((uchar*)dma_address, length);
-+            } else {
-+                printf("eth_rx() Received packet has bad desc_status = 0x%08x\n", desc_status);
-+            }
-+
-+            // Re-initialise the RX descriptor with its buffer - relies on always
-+            // setting an RX descriptor directly after getting it
-+            if (set_rx_descriptor(priv, dma_address, ETHER_MTU + EXTRA_RX_SKB_SPACE, 0) < 0) {
-+                 printf("eth_rx(): Failed to set RX descriptor\n");
-+            }
-+
-+            break;
-+        }
-+
-+        // Wait a bit before trying again to get a descriptor
-+        udelay(1000);   // 1mS
-+    }
-+
-+    return length;
-+}
-+
-+int eth_send(volatile void *packet, int length)
-+{
-+    // Transmit the new packet
-+    while (1) {
-+        // Get the TX descriptor
-+        if (set_tx_descriptor(priv, (dma_addr_t)packet, length, 0) >= 0) {
-+            // Tell the GMAC to poll for the updated descriptor
-+            dma_reg_write(priv, DMA_TX_POLL_REG, 0);
-+            break;
-+        }
-+
-+        // Wait a bit before trying again to get a descriptor
-+        udelay(1000);   // 1mS
-+    }
-+
-+    // Wait for the packet buffer to be finished with
-+    while (get_tx_descriptor(priv, 0, 0, 0, 0) < 0) {
-+        // Wait a bit before examining the descriptor again
-+        udelay(1000);   // 1mS
-+    }
-+
-+    return length;
-+}
-+
-diff -Nurd u-boot-1.1.2/board/oxnas/ide-810.c u-boot-1.1.2-oxe810/board/oxnas/ide-810.c
---- u-boot-1.1.2/board/oxnas/ide-810.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/ide-810.c	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,892 @@
-+/*
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,`
-+ * MA 02111-1307 USA
-+ */
-+#include <common.h>
-+
-+#define SATA_DMA_CHANNEL 0
-+
-+#define DMA_CTRL_STATUS      (0x0)
-+#define DMA_BASE_SRC_ADR     (0x4)
-+#define DMA_BASE_DST_ADR     (0x8)
-+#define DMA_BYTE_CNT         (0xC)
-+#define DMA_CURRENT_SRC_ADR  (0x10)
-+#define DMA_CURRENT_DST_ADR  (0x14)
-+#define DMA_CURRENT_BYTE_CNT (0x18)
-+#define DMA_INTR_ID          (0x1C)
-+#define DMA_INTR_CLEAR_REG   (DMA_CURRENT_SRC_ADR)
-+
-+#define DMA_CALC_REG_ADR(channel, register) ((volatile u32*)(DMA_BASE_PA + ((channel) << 5) + (register)))
-+
-+#define DMA_CTRL_STATUS_FAIR_SHARE_ARB            (1 << 0)
-+#define DMA_CTRL_STATUS_IN_PROGRESS               (1 << 1)
-+#define DMA_CTRL_STATUS_SRC_DREQ_MASK             (0x0000003C)
-+#define DMA_CTRL_STATUS_SRC_DREQ_SHIFT            (2)
-+#define DMA_CTRL_STATUS_DEST_DREQ_MASK            (0x000003C0)
-+#define DMA_CTRL_STATUS_DEST_DREQ_SHIFT           (6)
-+#define DMA_CTRL_STATUS_INTR                      (1 << 10)
-+#define DMA_CTRL_STATUS_NXT_FREE                  (1 << 11)
-+#define DMA_CTRL_STATUS_RESET                     (1 << 12)
-+#define DMA_CTRL_STATUS_DIR_MASK                  (0x00006000)
-+#define DMA_CTRL_STATUS_DIR_SHIFT                 (13)
-+#define DMA_CTRL_STATUS_SRC_ADR_MODE              (1 << 15)
-+#define DMA_CTRL_STATUS_DEST_ADR_MODE             (1 << 16)
-+#define DMA_CTRL_STATUS_TRANSFER_MODE_A           (1 << 17)
-+#define DMA_CTRL_STATUS_TRANSFER_MODE_B           (1 << 18)
-+#define DMA_CTRL_STATUS_SRC_WIDTH_MASK            (0x00380000)
-+#define DMA_CTRL_STATUS_SRC_WIDTH_SHIFT           (19)
-+#define DMA_CTRL_STATUS_DEST_WIDTH_MASK           (0x01C00000)
-+#define DMA_CTRL_STATUS_DEST_WIDTH_SHIFT          (22)
-+#define DMA_CTRL_STATUS_PAUSE                     (1 << 25)
-+#define DMA_CTRL_STATUS_INTERRUPT_ENABLE          (1 << 26)
-+#define DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED      (1 << 27)
-+#define DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED (1 << 28)
-+#define DMA_CTRL_STATUS_STARVE_LOW_PRIORITY       (1 << 29)
-+#define DMA_CTRL_STATUS_INTR_CLEAR_ENABLE         (1 << 30)
-+
-+#define DMA_BYTE_CNT_MASK        ((1 << 21) - 1)
-+#define DMA_BYTE_CNT_WR_EOT_MASK (1 << 30)
-+#define DMA_BYTE_CNT_RD_EOT_MASK (1 << 31)
-+
-+#define MAKE_FIELD(value, num_bits, bit_num) (((value) & ((1 << (num_bits)) - 1)) << (bit_num))
-+
-+typedef enum oxnas_dma_mode {
-+    OXNAS_DMA_MODE_FIXED,
-+    OXNAS_DMA_MODE_INC
-+} oxnas_dma_mode_t;
-+
-+typedef enum oxnas_dma_direction {
-+    OXNAS_DMA_TO_DEVICE,
-+    OXNAS_DMA_FROM_DEVICE
-+} oxnas_dma_direction_t;
-+
-+/* The available buses to which the DMA controller is attached */
-+typedef enum oxnas_dma_transfer_bus
-+{
-+    OXNAS_DMA_SIDE_A,
-+    OXNAS_DMA_SIDE_B
-+} oxnas_dma_transfer_bus_t;
-+
-+/* Direction of data flow between the DMA controller's pair of interfaces */
-+typedef enum oxnas_dma_transfer_direction
-+{
-+    OXNAS_DMA_A_TO_A,
-+    OXNAS_DMA_B_TO_A,
-+    OXNAS_DMA_A_TO_B,
-+    OXNAS_DMA_B_TO_B
-+} oxnas_dma_transfer_direction_t;
-+
-+/* The available data widths */
-+typedef enum oxnas_dma_transfer_width
-+{
-+    OXNAS_DMA_TRANSFER_WIDTH_8BITS,
-+    OXNAS_DMA_TRANSFER_WIDTH_16BITS,
-+    OXNAS_DMA_TRANSFER_WIDTH_32BITS
-+} oxnas_dma_transfer_width_t;
-+
-+/* The mode of the DMA transfer */
-+typedef enum oxnas_dma_transfer_mode
-+{
-+    OXNAS_DMA_TRANSFER_MODE_SINGLE,
-+    OXNAS_DMA_TRANSFER_MODE_BURST
-+} oxnas_dma_transfer_mode_t;
-+
-+/* The available transfer targets */
-+typedef enum oxnas_dma_dreq
-+{
-+    OXNAS_DMA_DREQ_SATA   = 0,
-+    OXNAS_DMA_DREQ_MEMORY = 15
-+} oxnas_dma_dreq_t;
-+
-+typedef struct oxnas_dma_device_settings {
-+    unsigned long address_;
-+    unsigned      fifo_size_;   // Chained transfers must take account of FIFO offset at end of previous transfer
-+    unsigned char dreq_;
-+    unsigned      read_eot_:1;
-+    unsigned      read_final_eot_:1;
-+    unsigned      write_eot_:1;
-+    unsigned      write_final_eot_:1;
-+    unsigned      bus_:1;
-+    unsigned      width_:2;
-+    unsigned      transfer_mode_:1;
-+    unsigned      address_mode_:1;
-+    unsigned      address_really_fixed_:1;
-+} oxnas_dma_device_settings_t;
-+
-+static const int MAX_NO_ERROR_LOOPS  = 100000;  /* 1 second in units of 10uS */
-+static const int MAX_DMA_XFER_LOOPS  = 300000;  /* 30 seconds in units of 100uS */
-+static const int MAX_DMA_ABORT_LOOPS = 10000;   /* 0.1 second in units of 10uS */
-+static const int MAX_SRC_READ_LOOPS  = 10000;   /* 0.1 second in units of 10uS */
-+static const int MAX_SRC_WRITE_LOOPS = 10000;   /* 0.1 second in units of 10uS */
-+static const int MAX_NOT_BUSY_LOOPS  = 10000;   /* 1 second in units of 100uS */
-+
-+/* The internal SATA drive on which we should attempt to find partitions */
-+static volatile u32* sata_regs_base[2] = 
-+{
-+    (volatile u32*)SATA_0_REGS_BASE,
-+    (volatile u32*)SATA_1_REGS_BASE,
-+    
-+};
-+static u32 wr_sata_orb1[2] = { 0, 0 };
-+static u32 wr_sata_orb2[2] = { 0, 0 };
-+static u32 wr_sata_orb3[2] = { 0, 0 };
-+static u32 wr_sata_orb4[2] = { 0, 0 };
-+
-+static oxnas_dma_device_settings_t oxnas_sata_dma_settings = {
-+    .address_              = SATA_DATA_BASE_PA,
-+    .fifo_size_            = 16,
-+    .dreq_                 = OXNAS_DMA_DREQ_SATA,
-+    .read_eot_             = 0,
-+    .read_final_eot_       = 1,
-+    .write_eot_            = 0,
-+    .write_final_eot_      = 1,
-+    .bus_                  = OXNAS_DMA_SIDE_A,
-+    .width_                = OXNAS_DMA_TRANSFER_WIDTH_32BITS,
-+    .transfer_mode_        = OXNAS_DMA_TRANSFER_MODE_BURST,
-+    .address_mode_         = OXNAS_DMA_MODE_FIXED,
-+    .address_really_fixed_ = 0
-+};
-+
-+oxnas_dma_device_settings_t oxnas_ram_dma_settings = {
-+    .address_              = 0,
-+    .fifo_size_            = 0,
-+    .dreq_                 = OXNAS_DMA_DREQ_MEMORY,
-+    .read_eot_             = 1,
-+    .read_final_eot_       = 1,
-+    .write_eot_            = 1,
-+    .write_final_eot_      = 1,
-+    .bus_                  = OXNAS_DMA_SIDE_B,
-+    .width_                = OXNAS_DMA_TRANSFER_WIDTH_32BITS,
-+    .transfer_mode_        = OXNAS_DMA_TRANSFER_MODE_BURST,
-+    .address_mode_         = OXNAS_DMA_MODE_FIXED,
-+    .address_really_fixed_ = 1
-+};
-+
-+static void xfer_wr_shadow_to_orbs(int device)
-+{
-+    *(sata_regs_base[device] + SATA_ORB1_OFF) = wr_sata_orb1[device];
-+    *(sata_regs_base[device] + SATA_ORB2_OFF) = wr_sata_orb2[device];
-+    *(sata_regs_base[device] + SATA_ORB3_OFF) = wr_sata_orb3[device];
-+    *(sata_regs_base[device] + SATA_ORB4_OFF) = wr_sata_orb4[device];
-+}
-+
-+static inline void device_select(int device)
-+{
-+    /* master/slave has no meaning to SATA core */
-+}
-+
-+static int disk_present[CFG_IDE_MAXDEVICE];
-+
-+#include <ata.h>
-+
-+unsigned char oxnas_sata_inb(int device, int port)
-+{
-+    unsigned char val = 0;
-+
-+    /* Only permit accesses to disks found to be present during ide_preinit() */
-+    if (!disk_present[device]) {
-+        return ATA_STAT_FAULT;
-+    }
-+
-+    device_select(device);
-+
-+    switch (port) {
-+        case ATA_PORT_CTL:
-+            val = (*(sata_regs_base[device] + SATA_ORB4_OFF) & (0xFFUL << SATA_CTL_BIT)) >> SATA_CTL_BIT;
-+            break;
-+        case ATA_PORT_FEATURE:
-+            val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_FEATURE_BIT)) >> SATA_FEATURE_BIT;
-+            break;
-+        case ATA_PORT_NSECT:
-+            val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_NSECT_BIT)) >> SATA_NSECT_BIT;
-+            break;
-+        case ATA_PORT_LBAL:
-+            val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAL_BIT)) >> SATA_LBAL_BIT;
-+            break;
-+        case ATA_PORT_LBAM:
-+            val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAM_BIT)) >> SATA_LBAM_BIT;
-+            break;
-+        case ATA_PORT_LBAH:
-+            val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_LBAH_BIT)) >> SATA_LBAH_BIT;
-+            break;
-+        case ATA_PORT_DEVICE:
-+            val = (*(sata_regs_base[device] + SATA_ORB3_OFF) & (0xFFUL << SATA_HOB_LBAH_BIT)) >> SATA_HOB_LBAH_BIT;
-+            val |= (*(sata_regs_base[device] + SATA_ORB1_OFF) & (0xFFUL << SATA_DEVICE_BIT)) >> SATA_DEVICE_BIT;
-+            break;
-+        case ATA_PORT_COMMAND:
-+            val = (*(sata_regs_base[device] + SATA_ORB2_OFF) & (0xFFUL << SATA_COMMAND_BIT)) >> SATA_COMMAND_BIT;
-+            val |= ATA_STAT_DRQ ;
-+            break;
-+        default:
-+            printf("ide_inb() Unknown port = %d\n", port);
-+            break;
-+    }
-+
-+//    printf("inb: %d:%01x => %02x\n", device, port, val);
-+
-+    return val;
-+}
-+
-+/**
-+ * Possible that ATA status will not become no-error, so must have timeout
-+ * @returns An int which is zero on error
-+ */
-+static inline int wait_no_error(int device)
-+{
-+    int status = 0;
-+
-+	/* Check for ATA core error */
-+	if (*(sata_regs_base[device] + SATA_INT_STATUS_OFF) & (1 << SATA_INT_STATUS_ERROR_BIT)) {
-+		printf("wait_no_error() SATA core flagged error\n");
-+	} else {
-+		int loops = MAX_NO_ERROR_LOOPS;
-+		do {
-+			/* Check for ATA device error */
-+			if (!(oxnas_sata_inb(device, ATA_PORT_COMMAND) & (1 << ATA_STATUS_ERR_BIT))) {
-+				status = 1;
-+				break;
-+			}
-+			udelay(10);
-+		} while (--loops);
-+
-+		if (!loops) {
-+			printf("wait_no_error() Timed out of wait for SATA no-error condition\n");
-+		}
-+	}
-+
-+    return status;
-+}
-+
-+/**
-+ * Expect SATA command to always finish, perhaps with error
-+ * @returns An int which is zero on error
-+ */
-+static inline int wait_sata_command_not_busy(int device)
-+{
-+    /* Wait for data to be available */
-+    int status = 0;
-+    int loops = MAX_NOT_BUSY_LOOPS;
-+    do {
-+        if (!(*(sata_regs_base[device] + SATA_COMMAND_OFF) & (1 << SATA_CMD_BUSY_BIT) )) {
-+            status = 1;
-+            break;
-+        }
-+        udelay(100);
-+    } while (--loops);
-+
-+    if (!loops) {
-+        printf("wait_sata_command_not_busy() Timed out of wait for SATA command to finish\n");
-+    }
-+
-+    return status;
-+}
-+
-+void oxnas_sata_outb(int device, int port, unsigned char val)
-+{
-+    typedef enum send_method {
-+        SEND_NONE,
-+        SEND_SIMPLE,
-+        SEND_CMD,
-+        SEND_CTL,
-+    } send_method_t;
-+
-+    /* Only permit accesses to disks found to be present during ide_preinit() */
-+    if (!disk_present[device]) {
-+        return;
-+    }
-+    
-+//    printf("outb: %d:%01x <= %02x\n", device, port, val);
-+
-+    device_select(device);
-+
-+    send_method_t send_regs = SEND_NONE;
-+    switch (port) {
-+        case ATA_PORT_CTL:
-+            wr_sata_orb4[device] &= ~(0xFFUL << SATA_CTL_BIT);
-+            wr_sata_orb4[device] |= (val << SATA_CTL_BIT);
-+            send_regs = SEND_CTL;
-+            break;
-+        case ATA_PORT_FEATURE:
-+            wr_sata_orb2[device] &= ~(0xFFUL << SATA_FEATURE_BIT);
-+            wr_sata_orb2[device] |= (val << SATA_FEATURE_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_NSECT:
-+            wr_sata_orb2[device] &= ~(0xFFUL << SATA_NSECT_BIT);
-+            wr_sata_orb2[device] |= (val << SATA_NSECT_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_LBAL:
-+            wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAL_BIT);
-+            wr_sata_orb3[device] |= (val << SATA_LBAL_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_LBAM:
-+            wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAM_BIT);
-+            wr_sata_orb3[device] |= (val << SATA_LBAM_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_LBAH:
-+            wr_sata_orb3[device] &= ~(0xFFUL << SATA_LBAH_BIT);
-+            wr_sata_orb3[device] |= (val << SATA_LBAH_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_DEVICE:
-+            wr_sata_orb1[device] &= ~(0xFFUL << SATA_DEVICE_BIT);
-+            wr_sata_orb1[device] |= ((val & 0xf0) << SATA_DEVICE_BIT);
-+            wr_sata_orb3[device] &= ~(0xFFUL << SATA_HOB_LBAH_BIT);
-+            wr_sata_orb3[device] |= ((val & 0x0f) << SATA_HOB_LBAH_BIT);
-+            send_regs = SEND_SIMPLE;
-+            break;
-+        case ATA_PORT_COMMAND:
-+            wr_sata_orb2[device] &= ~(0xFFUL << SATA_COMMAND_BIT);
-+            wr_sata_orb2[device] |= (val << SATA_COMMAND_BIT);
-+            send_regs = SEND_CMD;
-+            break;
-+        default:
-+            printf("ide_outb() Unknown port = %d\n", port);
-+    }
-+
-+    u32 command;
-+    switch (send_regs) {
-+        case SEND_CMD:
-+            wait_sata_command_not_busy(device);
-+            command = *(sata_regs_base[device] + SATA_COMMAND_OFF);
-+            command &= ~SATA_OPCODE_MASK;
-+            command |= SATA_CMD_WRITE_TO_ORB_REGS;
-+            xfer_wr_shadow_to_orbs(device);
-+            wait_sata_command_not_busy(device);
-+            *(sata_regs_base[device] + SATA_COMMAND_OFF) = command;
-+            if (!wait_no_error(device)) {
-+                printf("oxnas_sata_outb() Wait for ATA no-error timed-out\n");
-+            }
-+            break;
-+        case SEND_CTL:
-+            wait_sata_command_not_busy(device);
-+            command = *(sata_regs_base[device] + SATA_COMMAND_OFF);
-+            command &= ~SATA_OPCODE_MASK;
-+            command |= SATA_CMD_WRITE_TO_ORB_REGS_NO_COMMAND;
-+            xfer_wr_shadow_to_orbs(device);
-+            wait_sata_command_not_busy(device);
-+            *(sata_regs_base[device] + SATA_COMMAND_OFF) = command;
-+            if (!wait_no_error(device)) {
-+                printf("oxnas_sata_outb() Wait for ATA no-error timed-out\n");
-+            }
-+            break;
-+        default:
-+            break;
-+    }
-+}
-+
-+static u32 encode_start(u32 ctrl_status)
-+{
-+    return ctrl_status & ~DMA_CTRL_STATUS_PAUSE;
-+}
-+
-+static void dma_start(void)
-+{
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) =
-+        encode_start(*(DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS)));
-+}
-+
-+static unsigned long encode_control_status(
-+    oxnas_dma_device_settings_t* src_settings,
-+    oxnas_dma_device_settings_t* dst_settings)
-+{
-+    unsigned long ctrl_status;
-+    oxnas_dma_transfer_direction_t direction;
-+
-+    ctrl_status  = DMA_CTRL_STATUS_PAUSE;                                       // Paused
-+    ctrl_status |= DMA_CTRL_STATUS_FAIR_SHARE_ARB;                              // High priority
-+    ctrl_status |= (src_settings->dreq_ << DMA_CTRL_STATUS_SRC_DREQ_SHIFT);     // Dreq
-+    ctrl_status |= (dst_settings->dreq_ << DMA_CTRL_STATUS_DEST_DREQ_SHIFT);    // Dreq
-+    ctrl_status &= ~DMA_CTRL_STATUS_RESET;                                      // !RESET
-+
-+    // Use new interrupt clearing register
-+    ctrl_status |= DMA_CTRL_STATUS_INTR_CLEAR_ENABLE;
-+
-+    // Setup the transfer direction and burst/single mode for the two DMA busses
-+    if (src_settings->bus_ == OXNAS_DMA_SIDE_A) {
-+        // Set the burst/single mode for bus A based on src device's settings
-+        if (src_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) {
-+            ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_A;
-+        } else {
-+            ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_A;
-+        }
-+
-+        if (dst_settings->bus_ == OXNAS_DMA_SIDE_A) {
-+            direction = OXNAS_DMA_A_TO_A;
-+        } else {
-+            direction = OXNAS_DMA_A_TO_B;
-+
-+            // Set the burst/single mode for bus B based on dst device's settings
-+            if (dst_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) {
-+                ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_B;
-+            } else {
-+                ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_B;
-+            }
-+        }
-+    } else {
-+        // Set the burst/single mode for bus B based on src device's settings
-+        if (src_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) {
-+            ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_B;
-+        } else {
-+            ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_B;
-+        }
-+
-+        if (dst_settings->bus_ == OXNAS_DMA_SIDE_A) {
-+            direction = OXNAS_DMA_B_TO_A;
-+            
-+            // Set the burst/single mode for bus A based on dst device's settings
-+            if (dst_settings->transfer_mode_ == OXNAS_DMA_TRANSFER_MODE_BURST) {
-+                ctrl_status |= DMA_CTRL_STATUS_TRANSFER_MODE_A;
-+            } else {
-+                ctrl_status &= ~DMA_CTRL_STATUS_TRANSFER_MODE_A;
-+            }
-+        } else {
-+            direction = OXNAS_DMA_B_TO_B;
-+        }
-+    }
-+    ctrl_status |= (direction << DMA_CTRL_STATUS_DIR_SHIFT);
-+
-+    // Setup source address mode fixed or increment
-+    if (src_settings->address_mode_ == OXNAS_DMA_MODE_FIXED) {
-+        // Fixed address
-+        ctrl_status &= ~(DMA_CTRL_STATUS_SRC_ADR_MODE);
-+        
-+        // Set up whether fixed address is _really_ fixed
-+        if (src_settings->address_really_fixed_) {
-+            ctrl_status |= DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
-+        } else {
-+            ctrl_status &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
-+        }        
-+    } else {
-+        // Incrementing address
-+        ctrl_status |= DMA_CTRL_STATUS_SRC_ADR_MODE;
-+        ctrl_status &= ~DMA_CTRL_STATUS_SOURCE_ADDRESS_FIXED;
-+    }
-+
-+    // Setup destination address mode fixed or increment
-+    if (dst_settings->address_mode_ == OXNAS_DMA_MODE_FIXED) {
-+        // Fixed address
-+        ctrl_status &= ~(DMA_CTRL_STATUS_DEST_ADR_MODE);
-+        
-+        // Set up whether fixed address is _really_ fixed
-+        if (dst_settings->address_really_fixed_) {
-+            ctrl_status |= DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
-+        } else {
-+            ctrl_status &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
-+        }
-+    } else {
-+        // Incrementing address
-+        ctrl_status |= DMA_CTRL_STATUS_DEST_ADR_MODE;
-+        ctrl_status &= ~DMA_CTRL_STATUS_DESTINATION_ADDRESS_FIXED;
-+    }
-+
-+    // Set up the width of the transfers on the DMA buses
-+    ctrl_status |= (src_settings->width_ << DMA_CTRL_STATUS_SRC_WIDTH_SHIFT);
-+    ctrl_status |= (dst_settings->width_ << DMA_CTRL_STATUS_DEST_WIDTH_SHIFT);
-+
-+    // Setup the priority arbitration scheme
-+    ctrl_status &= ~DMA_CTRL_STATUS_STARVE_LOW_PRIORITY;    // !Starve low priority
-+
-+    return ctrl_status;
-+}
-+
-+static u32 encode_final_eot(
-+    oxnas_dma_device_settings_t* src_settings,
-+    oxnas_dma_device_settings_t* dst_settings,
-+    unsigned long length)
-+{
-+    // Write the length, with EOT configuration for a final transfer
-+    unsigned long encoded = length;
-+    if (dst_settings->write_final_eot_) {
-+        encoded |= DMA_BYTE_CNT_WR_EOT_MASK;
-+    } else {
-+        encoded &= ~DMA_BYTE_CNT_WR_EOT_MASK;
-+    }
-+    if (src_settings->read_final_eot_) {
-+        encoded |= DMA_BYTE_CNT_RD_EOT_MASK;
-+    } else {
-+        encoded &= ~DMA_BYTE_CNT_RD_EOT_MASK;
-+    }
-+    return encoded;
-+}
-+
-+static void dma_start_write(ulong* buffer, int num_bytes)
-+{
-+    // Assemble complete memory settings
-+    oxnas_dma_device_settings_t mem_settings = oxnas_ram_dma_settings;
-+    mem_settings.address_ = (unsigned long)buffer;
-+    mem_settings.address_mode_ = OXNAS_DMA_MODE_INC;
-+
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS)  = encode_control_status(&mem_settings, &oxnas_sata_dma_settings);
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_SRC_ADR) = mem_settings.address_;
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_DST_ADR) = oxnas_sata_dma_settings.address_;
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BYTE_CNT)     = encode_final_eot(&mem_settings, &oxnas_sata_dma_settings, num_bytes);
-+
-+    dma_start();
-+}
-+
-+static void dma_start_read(ulong* buffer, int num_bytes)
-+{
-+    // Assemble complete memory settings
-+    oxnas_dma_device_settings_t mem_settings = oxnas_ram_dma_settings;
-+    mem_settings.address_ = (unsigned long)buffer;
-+    mem_settings.address_mode_ = OXNAS_DMA_MODE_INC;
-+
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS)  = encode_control_status(&oxnas_sata_dma_settings, &mem_settings);
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_SRC_ADR) = oxnas_sata_dma_settings.address_;
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BASE_DST_ADR) = mem_settings.address_;
-+    *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_BYTE_CNT)     = encode_final_eot(&oxnas_sata_dma_settings, &mem_settings, num_bytes);
-+
-+    dma_start();
-+}
-+
-+static inline int dma_busy(void)
-+{
-+    return (*DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS)) & DMA_CTRL_STATUS_IN_PROGRESS;
-+}
-+
-+static int wait_dma_not_busy(int device)
-+{
-+    unsigned int cleanup_required = 0;
-+
-+	/* Poll for DMA completion */
-+	int loops = MAX_DMA_XFER_LOOPS;
-+	do {
-+		if (!dma_busy()) {
-+			break;
-+		}
-+		udelay(100);
-+	} while (--loops);
-+
-+	if (!loops) {
-+		printf("wait_dma_not_busy() Timed out of wait for DMA not busy\n");
-+		cleanup_required = 1;
-+	}
-+
-+    if (cleanup_required) {
-+        /* Abort DMA to make sure it has finished. */
-+        unsigned long ctrl_status = *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS);
-+        ctrl_status |= DMA_CTRL_STATUS_RESET;
-+        *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = ctrl_status;
-+
-+        // Wait for the channel to become idle - should be quick as should
-+        // finish after the next AHB single or burst transfer
-+        loops = MAX_DMA_ABORT_LOOPS;
-+        do {
-+            if (!(*DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) & DMA_CTRL_STATUS_IN_PROGRESS)) {
-+                break;
-+            }
-+            udelay(10);
-+        } while (--loops);
-+
-+        if (!loops) {
-+            printf("wait_dma_not_busy() Timed out of wait for DMA channel abort\n");
-+        } else {
-+			/* Successfully cleanup the DMA channel */
-+			cleanup_required = 0;
-+		}
-+
-+        // Deassert reset for the channel
-+        ctrl_status = *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS);
-+        ctrl_status &= ~DMA_CTRL_STATUS_RESET;
-+        *DMA_CALC_REG_ADR(SATA_DMA_CHANNEL, DMA_CTRL_STATUS) = ctrl_status;
-+    }
-+
-+	return !cleanup_required;
-+}
-+
-+/**
-+ * Possible that ATA status will not become not-busy, so must have timeout
-+ */
-+static unsigned int wait_not_busy(int device, unsigned long timeout_secs)
-+{
-+    int busy = 1;
-+    unsigned long loops = (timeout_secs * 1000) / 50;
-+    do {
-+        // Test the ATA status register BUSY flag
-+        if (!((*(sata_regs_base[device] + SATA_ORB2_OFF) >> SATA_COMMAND_BIT) & (1UL << ATA_STATUS_BSY_BIT))) {
-+            /* Not busy, so stop polling */
-+            busy = 0;
-+            break;
-+        }
-+
-+        // Wait for 50mS before sampling ATA status register again
-+        udelay(50000);
-+    } while (--loops);
-+
-+    return busy;
-+}
-+
-+void oxnas_sata_output_data(int device, ulong *sect_buf, int words)
-+{
-+    /* Only permit accesses to disks found to be present during ide_preinit() */
-+    if (!disk_present[device]) {
-+        return;
-+    }
-+
-+    /* Select the required internal SATA drive */
-+    device_select(device);
-+
-+    /* Start the DMA channel sending data from the passed buffer to the SATA core */
-+    dma_start_write(sect_buf, words << 2);
-+
-+	/* Don't know why we need this delay, but without it the wait for DMA not 
-+	   busy times soemtimes out, e.g. when saving environment to second disk */
-+	udelay(1000);
-+
-+    /* Wait for DMA to finish */
-+    if (!wait_dma_not_busy(device)) {
-+		printf("Timed out of wait for DMA channel for SATA device %d to have in-progress clear\n", device);
-+	}
-+
-+	/* Sata core should finish after DMA */
-+	if (wait_not_busy(device, 30)) {
-+		printf("Timed out of wait for SATA device %d to have BUSY clear\n", device);
-+	}
-+	if (!wait_no_error(device)) {
-+		printf("oxnas_sata_output_data() Wait for ATA no-error timed-out\n");
-+	}
-+}
-+
-+void oxnas_sata_input_data(int device, ulong *sect_buf, int words)
-+{
-+    /* Only permit accesses to disks found to be present during ide_preinit() */
-+    if (!disk_present[device]) {
-+        return;
-+    }
-+
-+    /* Select the required internal SATA drive */
-+    device_select(device);
-+
-+    /* Start the DMA channel receiving data from the SATA core into the passed buffer */
-+    dma_start_read(sect_buf, words << 2);
-+
-+	/* Sata core should finish before DMA */
-+	if (wait_not_busy(device, 30)) {
-+		printf("Timed out of wait for SATA device %d to have BUSY clear\n", device);
-+	}
-+	if (!wait_no_error(device)) {
-+		printf("oxnas_sata_output_data() Wait for ATA no-error timed-out\n");
-+	}
-+
-+    /* Wait for DMA to finish */
-+    if (!wait_dma_not_busy(device)) {
-+		printf("Timed out of wait for DMA channel for SATA device %d to have in-progress clear\n", device);
-+	}
-+}
-+
-+static u32 scr_read(int device, unsigned int sc_reg)
-+{
-+    /* Setup adr of required register. std regs start eight into async region */    
-+    *(sata_regs_base[device] + SATA_LINK_RD_ADDR) = sc_reg*4 + SATA_STD_ASYNC_REGS_OFF;
-+
-+    /* Wait for data to be available */
-+    int loops = MAX_SRC_READ_LOOPS;
-+    do {
-+        if (*(sata_regs_base[device] + SATA_LINK_CONTROL) & 1UL) {
-+            break;
-+        }
-+        udelay(10);
-+    } while (--loops);
-+
-+    if (!loops) {
-+        printf("scr_read() Timed out of wait for read completion\n");
-+    }
-+
-+    /* Read the data from the async register */
-+    return *(sata_regs_base[device] + SATA_LINK_DATA);
-+}
-+
-+static void scr_write(int device, unsigned int sc_reg, u32 val)
-+{
-+    /* Setup the data for the write */
-+    *(sata_regs_base[device] + SATA_LINK_DATA) = val;
-+
-+    /* Setup adr of required register. std regs start eight into async region */    
-+    *(sata_regs_base[device] + SATA_LINK_WR_ADDR) = sc_reg*4 + SATA_STD_ASYNC_REGS_OFF;
-+
-+    /* Wait for data to be written */
-+    int loops = MAX_SRC_WRITE_LOOPS;
-+    do {
-+        if (*(sata_regs_base[device] + SATA_LINK_CONTROL) & 1UL) {
-+            break;
-+        }
-+        udelay(10);
-+    } while (--loops);
-+
-+    if (!loops) {
-+        printf("scr_write() Timed out of wait for write completion\n");
-+    }
-+}
-+
-+#define PHY_LOOP_COUNT  25  /* Wait for upto 5 seconds for PHY to be found */
-+static int phy_reset(int device)
-+{
-+#ifdef FPGA
-+    /* The FPGA thinks it can do 3G when infact only 1.5G is possible, so limit
-+    it to Gen-1 SATA (1.5G) */ 
-+    scr_write(device, SATA_SCR_CONTROL, 0x311);  /* Issue phy wake & core reset */
-+    scr_read(device, SATA_SCR_STATUS);           /* Dummy read; flush */
-+    udelay(1000);
-+    scr_write(device, SATA_SCR_CONTROL, 0x310);  /* Issue phy wake & clear core reset */
-+#else
-+    scr_write(device, SATA_SCR_CONTROL, 0x301);  /* Issue phy wake & core reset */
-+    scr_read(device, SATA_SCR_STATUS);           /* Dummy read; flush */
-+    udelay(1000);
-+    scr_write(device, SATA_SCR_CONTROL, 0x300);  /* Issue phy wake & clear core reset */
-+#endif
-+    /* Wait for upto 5 seconds for PHY to become ready */
-+    int phy_status = 0;
-+    int loops = 0;
-+    do {
-+        udelay(200000);
-+        if ((scr_read(device, SATA_SCR_STATUS) & 0xf) != 1) {
-+            phy_status = 1;
-+            break;
-+        }
-+        printf("No SATA PHY found\n");
-+    } while (++loops < PHY_LOOP_COUNT);
-+
-+    if (phy_status) {
-+        udelay(500000); /* wait half a second */
-+    }
-+    return phy_status;
-+}
-+
-+#define FIS_LOOP_COUNT  25  /* Wait for upto 5 seconds for FIS to be received */
-+static int wait_FIS(int device)
-+{
-+    int status = 0;
-+    int loops = 0;
-+
-+    do {
-+        udelay(200000);
-+        if 	(oxnas_sata_inb(device, ATA_PORT_NSECT) > 0) {
-+            status = 1;
-+            break;
-+        }
-+    } while (++loops < FIS_LOOP_COUNT);
-+
-+    return status;
-+}
-+
-+int ide_preinit(void)
-+{
-+    int num_disks_found = 0;
-+
-+    /* Initialise records of which disks are present to all present */
-+    int i;
-+    for (i=0; i < CFG_IDE_MAXDEVICE; i++) {
-+        disk_present[i] = 1;
-+    }
-+
-+//udelay(1000000);
-+    /* Enable clocks to SATA and DMA cores */
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_SATA_BIT);
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_DMA_BIT);
-+    
-+    /* Block reset SATA and DMA cores */
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_BIT) |
-+                                              (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) |
-+                                              (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT) |
-+                                              (1UL << SYS_CTRL_RSTEN_DMA_BIT);
-+    udelay(50);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT);
-+    udelay(50);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) |
-+                                              (1UL << SYS_CTRL_RSTEN_SATA_BIT);
-+    udelay(50);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_DMA_BIT);
-+    udelay(50);
-+//udelay(1000000);
-+
-+    /* disable and clear core interrupts */
-+    *((unsigned long*)SATA_HOST_REGS_BASE + SATA_INT_ENABLE_CLR_OFF) = ~0UL;
-+    *((unsigned long*)SATA_HOST_REGS_BASE + SATA_INT_CLR_OFF) = ~0UL;
-+
-+    int device;
-+    for (device = 0; device < CFG_IDE_MAXDEVICE; device++) {
-+        int found = 0;
-+        int retries = 1;
-+
-+        /* Disable SATA interrupts */
-+        *(sata_regs_base[device] + SATA_INT_ENABLE_CLR_OFF) = ~0UL;
-+
-+        /* Clear any pending SATA interrupts */
-+        *(sata_regs_base[device] + SATA_INT_CLR_OFF) = ~0UL;
-+
-+        do {
-+            /* clear sector count register for FIS detection */
-+            oxnas_sata_outb(device, ATA_PORT_NSECT, 0);
-+    
-+            /* Get the PHY working */
-+            if (!phy_reset(device)) {
-+                printf("SATA PHY not ready for device %d\n", device);
-+                break;
-+            }
-+
-+            if (!wait_FIS(device)) {
-+                printf("No FIS received from device %d\n", device);
-+            } else {
-+                if ((scr_read(device, SATA_SCR_STATUS) & 0xf) == 0x3) {
-+                    if (wait_not_busy(device, 30)) {
-+                        printf("Timed out of wait for SATA device %d to have BUSY clear\n", device);
-+                    } else {
-+                        ++num_disks_found;
-+                        found = 1;
-+                    }
-+                } else {
-+                    printf("No SATA device %d found, PHY status = 0x%08x\n",
-+                            device, scr_read(device, SATA_SCR_STATUS));
-+                }
-+                break;
-+            }
-+        } while (retries--) ;
-+
-+        /* Record whether disk is present, so won't attempt to access it later */
-+        disk_present[device] = found;
-+    }
-+
-+    /* post disk detection clean-up */
-+    for (device = 0; device < CFG_IDE_MAXDEVICE; device++) {
-+        if ( disk_present[device] ) {
-+            /* set as ata-5 (28-bit) */
-+            *(sata_regs_base[device] + SATA_DRIVE_CONTROL_OFF) = 0UL;
-+            
-+            /* clear phy/link errors */
-+            scr_write(device, SATA_SCR_ERROR, ~0);
-+            
-+            /* clear host errors */
-+            *(sata_regs_base[device] + SATA_CONTROL_OFF) |= SATA_SCTL_CLR_ERR;
-+            
-+            /* clear interrupt register as this clears the error bit in the IDE 
-+            status register */
-+            *(sata_regs_base[device] + SATA_INT_CLR_OFF) = ~0UL;
-+        }
-+    }    
-+    
-+
-+    return !num_disks_found;
-+}
-+
-diff -Nurd u-boot-1.1.2/board/oxnas/Makefile u-boot-1.1.2-oxe810/board/oxnas/Makefile
---- u-boot-1.1.2/board/oxnas/Makefile	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/Makefile	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,51 @@
-+#
-+# (C) Copyright 2000-2004
-+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
-+#
-+# (C) Copyright 2004
-+# ARM Ltd.
-+# Philippe Robin, <philippe.robin@arm.com>
-+#
-+# See file CREDITS for list of people who contributed to this
-+# project.
-+#
-+# This program is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU General Public License as
-+# published by the Free Software Foundation; either version 2 of
-+# the License, or (at your option) any later version.
-+#
-+# This program is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+# MA 02111-1307 USA
-+#
-+
-+include $(TOPDIR)/config.mk
-+
-+LIB	= lib$(BOARD).a
-+
-+OBJS	:= oxnas.o eth.o ide-$(NAS_VERSION).o
-+SOBJS	:= platform-$(NAS_VERSION).o
-+
-+$(LIB):	$(OBJS) $(SOBJS)
-+	$(AR) crv $@ $^
-+
-+clean:
-+	rm -f $(SOBJS) $(OBJS)
-+
-+distclean:	clean
-+	rm -f $(LIB) core *.bak .depend
-+
-+#########################################################################
-+
-+.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c)
-+		$(CC) -M $(CPPFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@
-+
-+-include .depend
-+
-+#########################################################################
-diff -Nurd u-boot-1.1.2/board/oxnas/oxnas.c u-boot-1.1.2-oxe810/board/oxnas/oxnas.c
---- u-boot-1.1.2/board/oxnas/oxnas.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/oxnas.c	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,280 @@
-+/*
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <common.h>
-+
-+#if defined(CONFIG_SHOW_BOOT_PROGRESS)
-+void show_boot_progress(int progress)
-+{
-+    printf("Boot reached stage %d\n", progress);
-+}
-+#endif
-+
-+static inline void delay(unsigned long loops)
-+{
-+    __asm__ volatile ("1:\n"
-+        "subs %0, %1, #1\n"
-+        "bne 1b":"=r" (loops):"0" (loops));
-+}
-+
-+/*
-+ * Miscellaneous platform dependent initialisations
-+ */
-+
-+/** Expected Intel 28F320B3T CFI info */
-+//    mfr_id:			MANUFACTURER_INTEL, -> 0x0089
-+//    dev_id:			I28F320B3T,         -> 0x8896
-+//    name:			"Intel 28F320B3T",
-+//    DevSize:		SIZE_4MiB,              -> 22
-+//    CmdSet:			P_ID_INTEL_STD,     -> 0x0003
-+//    NumEraseRegions:	2,
-+//    regions: {                            -> #define ERASEINFO(size,blocks) (size<<8)|(blocks-1)
-+//        ERASEINFO(0x10000, 63),
-+//        ERASEINFO(0x02000, 8),
-+//    }
-+
-+#define FLASH_WORD_SIZE unsigned short
-+
-+int board_init(void)
-+{
-+    DECLARE_GLOBAL_DATA_PTR;
-+
-+    gd->bd->bi_arch_number = MACH_TYPE_OXNAS;
-+    gd->bd->bi_boot_params = PHYS_SDRAM_1_PA + 0x100;
-+    gd->flags = 0;
-+
-+    icache_enable();
-+
-+    /* Block reset Static core */
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_STATIC_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_STATIC_BIT);
-+
-+    /* Enable clock to Static core */
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_STATIC_BIT);
-+
-+#ifdef CONFIG_OXNAS_ENABLE_PCI
-+    /* Block reset PCI core */
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_PCI_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_PCI_BIT);
-+
-+    /* Enable clock to PCI core */
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_PCI_BIT);
-+#endif // CONFIG_OXNAS_ENABLE_PCI
-+
-+#ifdef CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION
-+    /* Assert manual static bus PCI arbitration request */
-+    *(volatile u32*)SYS_CTRL_PCI_CTRL1 |= (1UL << SYS_CTRL_PCI_CTRL1_PCI_STATIC_RQ_BIT);
-+#endif // CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION
-+
-+#ifdef CONFIG_OXNAS_FEEDBACK_PCI_CLKS
-+    /* Set PCI feedback clk GPIO pin as an output */
-+    *(volatile u32*)GPIO_1_SET_OE |= 0x800;
-+
-+    /* Enable PCI feedback clk onto GPIO pin */
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 |= 0x00000800;
-+#endif // CONFIG_OXNAS_FEEDBACK_PCI_CLKS
-+
-+#ifndef CFG_NO_FLASH
-+    /* Enable static bus onto GPIOs, only CS0 as CS1 conflicts with UART2 */
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 |= 0x002FF000;
-+
-+    /* Setup the static bus CS0 to access FLASH */
-+    *(volatile u32*)STATIC_CONTROL_BANK0 = STATIC_BUS_FLASH_CONFIG;
-+#endif // !CFG_NO_FLASH
-+
-+    /* Set 33MHz PCI clock */
-+    *(volatile u32*)SYS_CTRL_CKCTRL_CTRL_ADDR = 5;
-+    /* Enable full speed RPS clock */
-+    *(volatile u32*)SYS_CTRL_CKCTRL_CTRL_ADDR &= ~(1UL << SYS_CTRL_CKCTRL_SLOW_BIT);
-+
-+#if (USE_EXTERNAL_UART == 0)
-+#ifdef CONFIG_OXNAS_UART1
-+    /* Block reset UART1 */
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART1_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART1_BIT);
-+
-+    /* Setup pin mux'ing for first internal UART */
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x80000000;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0  &= ~0x80000000;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |=  0x80000000; // Route UART1 SOUT onto external pins
-+
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_1 &= ~0x00000001;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_1  &= ~0x00000001;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_1 |=  0x00000001; // Route UART1 SIN onto external pins
-+
-+    *(volatile u32*)GPIO_1_SET_OE |= 0x80000000;                // Make UART1 SOUT an o/p
-+    *(volatile u32*)GPIO_2_CLR_OE |= 0x00000001;                // Make UART1 SIN an i/p
-+#endif // CONFIG_OXNAS_UART1
-+
-+#ifdef CONFIG_OXNAS_UART2
-+    // Block reset UART2
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART2_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART2_BIT);
-+
-+    /* Setup pin mux'ing for second internal UART */
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x00500000;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0  &= ~0x00500000;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |=  0x00500000; // Route UART2 SOUT and SIN onto external pins
-+
-+    *(volatile u32*)GPIO_1_SET_OE |= 0x00100000;                // Make UART2 SOUT an o/p
-+    *(volatile u32*)GPIO_1_CLR_OE |= 0x00400000;                // Make UART2 SIN an i/p
-+#endif // CONFIG_OXNAS_UART2
-+
-+#ifdef CONFIG_OXNAS_UART3
-+    // Block reset UART3
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART3_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART3_BIT);
-+
-+    // Route UART3 SIN/SOUT onto external pin
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 &= ~0x000000C0;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0  &= ~0x000000C0;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 |=  0x000000C0;
-+
-+    // Setup GPIO line directions for UART3 SIN/SOUT
-+    *(volatile u32*)GPIO_1_SET_OE   |= 0x00000080;
-+    *(volatile u32*)GPIO_1_CLR_OE |= 0x00000040;
-+#endif // CONFIG_ARCH_OXNAS_UART3
-+
-+#ifdef CONFIG_OXNAS_UART4
-+    // Block reset UART4
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL = (1UL << SYS_CTRL_RSTEN_UART4_BIT);
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_UART4_BIT);
-+
-+    // Enable UART4 to override PCI functions onto GPIOs
-+    *(volatile u32*)SYS_CTRL_UART_CTRL |= (1UL << SYS_CTRL_UART4_NOT_PCI_MODE);
-+#endif // CONFIG_OXNAS_UART4
-+#endif // !USE_EXTERNAL_UART
-+
-+    return 0;
-+}
-+
-+int board_late_init()
-+{
-+    return 0;
-+}
-+
-+int misc_init_r(void)
-+{
-+    return 0;
-+}
-+
-+int dram_init(void)
-+{
-+#ifdef PROBE_MEM_SIZE
-+	/* Determine the amount of SDRAM the DDR controller is configured for */
-+	volatile unsigned long * const ddr_config_reg_adr = (volatile unsigned long *)(0x45800000);
-+	static const int DDR_SIZE_BIT = 17;
-+	static const int DDR_SIZE_NUM_BITS = 4;
-+	static const unsigned long DDR_SIZE_MASK = (((1UL << DDR_SIZE_NUM_BITS) - 1) << DDR_SIZE_BIT);
-+
-+	unsigned long ddr_config_reg = *ddr_config_reg_adr;
-+	int ddr_size_pow2 = (ddr_config_reg & DDR_SIZE_MASK) >> DDR_SIZE_BIT;
-+
-+    DECLARE_GLOBAL_DATA_PTR;
-+
-+    gd->bd->bi_dram[0].size  = (1 << ddr_size_pow2) * 1024 * 1024;
-+
-+	if ((gd->bd->bi_dram[0].size >> 20) == 256) {
-+		/* Do we really have 256M, or are we working around the DDR controller's
-+		 * problem with 128M size? */
-+		volatile unsigned long * const PROBE_ADR_1 = (volatile unsigned long * const)PHYS_SDRAM_1_PA;
-+		volatile unsigned long * const PROBE_ADR_2 = (volatile unsigned long * const)(PHYS_SDRAM_1_PA + (128*1024*1024));
-+		static const unsigned long PROBE_VAL_1 = 0xdeadbeef;
-+		static const unsigned long PROBE_VAL_2 = 0x12345678;
-+
-+		*PROBE_ADR_1 = PROBE_VAL_1;
-+		*PROBE_ADR_2 = PROBE_VAL_2;
-+		if (*PROBE_ADR_1 != PROBE_VAL_1) {
-+			gd->bd->bi_dram[0].size  = 128*1024*1024;
-+		}
-+	}
-+#else // PROBE_MEM_SIZE
-+    gd->bd->bi_dram[0].size = MEM_SIZE;
-+#endif // PROBE_MEM_SIZE
-+
-+    gd->bd->bi_dram[0].start = PHYS_SDRAM_1_PA;
-+
-+	gd->bd->bi_sramstart = CFG_SRAM_BASE;
-+	gd->bd->bi_sramsize = CFG_SRAM_SIZE;
-+
-+    return 0;
-+}
-+
-+int reset_cpu(void)
-+{
-+    printf("Resetting Oxsemi NAS...");
-+
-+    // Assert reset to cores as per power on defaults
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL =
-+        (1UL << SYS_CTRL_RSTEN_COPRO_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_USBHS_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_USBHSPHY_BIT) |
-+        (1UL << SYS_CTRL_RSTEN_MAC_BIT)      |
-+        (1UL << SYS_CTRL_RSTEN_PCI_BIT)      |
-+        (1UL << SYS_CTRL_RSTEN_DMA_BIT)      |
-+        (1UL << SYS_CTRL_RSTEN_DPE_BIT)      |
-+        (1UL << SYS_CTRL_RSTEN_SATA_BIT)     |
-+        (1UL << SYS_CTRL_RSTEN_SATA_LINK_BIT) |
-+        (1UL << SYS_CTRL_RSTEN_SATA_PHY_BIT) |
-+        (1UL << SYS_CTRL_RSTEN_STATIC_BIT)   |
-+        (1UL << SYS_CTRL_RSTEN_UART1_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_UART2_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_MISC_BIT)     |
-+        (1UL << SYS_CTRL_RSTEN_I2S_BIT)      |
-+        (1UL << SYS_CTRL_RSTEN_AHB_MON_BIT)  |
-+        (1UL << SYS_CTRL_RSTEN_UART3_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_UART4_BIT)    |
-+        (1UL << SYS_CTRL_RSTEN_SGDMA_BIT);
-+
-+    // Release reset to cores as per power on defaults
-+    *(volatile u32*)SYS_CTRL_RSTEN_CLR_CTRL = (1UL << SYS_CTRL_RSTEN_GPIO_BIT);
-+
-+    // Disable clocks to cores as per power-on defaults
-+    *(volatile u32*)SYS_CTRL_CKEN_CLR_CTRL =
-+        (1UL << SYS_CTRL_CKEN_COPRO_BIT) |
-+        (1UL << SYS_CTRL_CKEN_DMA_BIT)   |
-+        (1UL << SYS_CTRL_CKEN_DPE_BIT)   |
-+        (1UL << SYS_CTRL_CKEN_SATA_BIT)  |
-+        (1UL << SYS_CTRL_CKEN_I2S_BIT)   |
-+        (1UL << SYS_CTRL_CKEN_USBHS_BIT) |
-+        (1UL << SYS_CTRL_CKEN_MAC_BIT)   |
-+        (1UL << SYS_CTRL_CKEN_STATIC_BIT);
-+
-+    // Enable clocks to cores as per power-on defaults
-+    *(volatile u32*)SYS_CTRL_CKEN_SET_CTRL = (1UL << SYS_CTRL_CKEN_PCI_BIT);
-+
-+    // Set sys-control pin mux'ing as per power-on defaults
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_0 = 0x800UL;
-+    *(volatile u32*)SYS_CTRL_GPIO_PRIMSEL_CTRL_1 = 0x0UL;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_0  = 0x0UL;
-+    *(volatile u32*)SYS_CTRL_GPIO_SECSEL_CTRL_1  = 0x0UL;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_0 = 0x0UL;
-+    *(volatile u32*)SYS_CTRL_GPIO_TERTSEL_CTRL_1 = 0x0UL;
-+
-+    // No need to save any state, as the ROM loader can determine whether reset
-+    // is due to power cycling or programatic action, just hit the (self-
-+    // clearing) CPU reset bit of the block reset register
-+    *(volatile u32*)SYS_CTRL_RSTEN_SET_CTRL =  (1UL << SYS_CTRL_RSTEN_ARM_BIT);
-+
-+	return 0;
-+}
-diff -Nurd u-boot-1.1.2/board/oxnas/platform-800.S u-boot-1.1.2-oxe810/board/oxnas/platform-800.S
---- u-boot-1.1.2/board/oxnas/platform-800.S	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/platform-800.S	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,254 @@
-+/*
-+ * Board specific setup info
-+ *
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <config.h>
-+#include <version.h>
-+
-+/* use estimate of processor speed to calculate number of cycles delay */
-+/* delay count is nominal (PLL200 frequency x delay time) / loop count 
-+ * expressing 200us as 200/1000000 and re-arranging gives the expression below
-+ */
-+ 
-+#define DELAY_200US   ((NOMINAL_ARMCLK / (5 * 1000000)) * 200) 
-+/* this is 8 cycles of ? so choose 8 resulting in 40 cycles */
-+#define DELAY_1S   ((DELAY_200US) * 5000)
-+#define DELAY_8       8
-+#define DELAY_200     200
-+
-+.globl platformsetup
-+platformsetup:
-+/* register allocations
-+ * r0 - delay counter and scratch
-+ * r1 - address register
-+ * r2 - data register
-+ * r3 - index to table pointer
-+ * r4 - iteration counter.
-+ * 
-+ * r5 - hold return address.
-+ * lr - (R14) link register
-+ * pc - (R15) program counter.
-+ */
-+
-+#ifdef INITIALISE_SDRAM
-+/*
-+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM.
-+ * Controller function is linked to execute in SDRAM must be in ROM if not
-+ * there. Check for wrong place.
-+ */
-+	adrl r0, platformsetup		/* Relative location of function start.*/
-+	ldr  r1, _platformsetup
-+	cmp  r0, r1
-+	moveq pc, lr
-+#else
-+	mov pc, lr
-+#endif
-+
-+	/* Establish a working setup for the SDRAM */
-+	mov r6, lr
-+
-+#ifdef OXNAS_OVERCLOCK
-+	/* Delay so the broken JTAG can get control */
-+	ldr r0, =DELAY_1S
-+	bl delay
-+
-+	/* Configure the PLL to run faster */
-+	ldr r1, =SYS_CTRL_PLLSYS_CTRL
-+	ldr r2, =SYS_CTRL_PLLSYS_KEY_CTRL
-+
-+	/* 0xBEADFACE -> PLL_KEY */
-+	/* Bypass PLL */
-+	ldr r3, [r1]
-+	ldr r5, =0x20000
-+	orr r3, r3, r5
-+	ldr r4, =0xbeadface
-+	str r4, [r2]
-+	str r3, [r1]
-+
-+	/* 0xBEADFACE -> PLL_KEY */
-+	/* Set m,p and s for PLL at 400MHz */
-+	ldr r5, =0xffff0000
-+	and r3, r3, r5
-+	ldr r5, =OXNAS_OVERCLOCK
-+	orr r3, r3, r5
-+	str r4, [r2]
-+	str r3, [r1]
-+
-+	/* Wait at least 300uS */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+	ldr r0, =DELAY_200US
-+	bl delay
-+
-+	/* 0xBEADFACE -> PLL_KEY */
-+	/* Disable PLL bypass */
-+	ldr r5, =0xfffdffff
-+	and r3, r3, r5
-+	str r4, [r2]
-+	str r3, [r1]
-+#endif // OXNAS_OVERCLOCK
-+
-+	/* Assert reset to the DDR core */
-+	ldr r0, =SYS_CTRL_RSTEN_SET_CTRL
-+	ldr r1, =1
-+	ldr r2, =SYS_CTRL_RSTEN_DDR_BIT
-+	mov r1, r1, LSL r2
-+	str r1, [r0]
-+
-+	/* Deassert reset to the DDR core */
-+	ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL
-+	str r1, [r0]
-+
-+	/* Turn on the DDR core clock */
-+	ldr r0, =SYS_CTRL_CKEN_SET_CTRL
-+	ldr r1, =1
-+	ldr r2, =SYS_CTRL_CKEN_DDR_BIT
-+	mov r1, r1, LSL r2
-+	str r1, [r0]
-+
-+	/* Start using the initialisation value list */
-+	adrl r3, init_table
-+
-+	/* Copy next 6 entries from DDR init table*/
-+	ldr r4, =6
-+loop0:
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loop0
-+
-+	/* Delay for 200uS while DRAM controller stabilises. */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+
-+#if !TEST_BRD
-+	/* Copy next entry */
-+	ldr r4, =1
-+loopx:	
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loopx
-+
-+	/* Delay for 200uS while DRAM controller stabilises. */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+#endif // TEST_BRD
-+
-+	/* Copy next entry */
-+	ldr r4, =1
-+loop1:	
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loop1
-+
-+	/* Delay for 200uS while DRAM controller stabilises. */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+
-+	/* Copy next entry */
-+	ldr r4, =1
-+loop2:	
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loop2
-+
-+	/* Delay for 200uS while DRAM controller stabilises. */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+
-+	/* Copy next entry */
-+	ldr r4, =1
-+loop3:	
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loop3
-+
-+	/* Delay for 200uS while DRAM controller stabilises. */
-+	ldr r0, =DELAY_200US
-+	bl delay
-+
-+	/* Copy next 5 entries */
-+	ldr r4, =5
-+loop4:	
-+	ldmia r3!, {r1, r2}
-+	str r2, [r1]
-+	subs r4, r4, #1
-+	bne loop4
-+
-+	/* SDRAM initialised so now exit. */
-+	mov lr, r6
-+	mov pc, lr
-+
-+/*
-+ *  delay()
-+ *
-+ *  uses 1 + r0 * 5 cycles
-+ */
-+delay:
-+	nop
-+	nop
-+	nop
-+	subs r0, r0, #1
-+	bne delay
-+	mov pc, lr
-+
-+_platformsetup:
-+	.word platformsetup
-+
-+init_table:
-+	/* Table of address, data for loading into the DRAM controller */
-+    	/* Configure for a single DDR device */
-+	.word 0x4500002C, 0x08
-+	.word 0x45000038, 0x400
-+	.word 0x45800000, 0x80100000
-+	.word 0x45800004, 0x8000ffff	// Enable DDR core and all clients
-+	.word 0x45800024, 0x1e4
-+	.word 0x45800014, 0xe0000001	// DLL to automatic with starting value=1
-+/* 200uS delay */
-+#if !TEST_BRD
-+	.word 0x45800014, 0xa0000003	// DLL to automatic with offset value=3
-+/* 200uS delay */
-+#endif // TEST_BRD
-+#if (MEM_SIZE == 32)
-+	.word 0x45800000, 0x801B030C
-+#else
-+	.word 0x45800000, 0x801D030C
-+#endif // MEM_SIZE
-+/* 200uS delay */
-+	.word 0x4580000c, 0x80280400
-+/* 200uS delay */
-+	.word 0x4580000c, 0x80210000
-+/* 200uS delay */
-+	.word 0x4580000c, 0x80200063
-+	.word 0x45800028, 0x0000001f	// Enable all arbiter features
-+	.word 0x45800018, 0x00000000	// Disable all monitoring
-+	.word 0x45800010, 0xffffffff	// Disable all read buffering, due to h/w bug
-+	.word 0x4580002C, 0x00000000	// Do NOT disable HPROT, ie want write coherency
-+
-+.ltorg
-+
-diff -Nurd u-boot-1.1.2/board/oxnas/platform-810.S u-boot-1.1.2-oxe810/board/oxnas/platform-810.S
---- u-boot-1.1.2/board/oxnas/platform-810.S	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/platform-810.S	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,477 @@
-+/*
-+ * Board specific setup info
-+ *
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <config.h>
-+#include <version.h>
-+
-+/* use estimate of processor speed to calculate number of cycles delay */
-+/* delay count is nominal (PLL200 frequency x delay time) / loop count 
-+ * expressing 200us as 200/1000000 and re-arranging gives the expression below
-+ */
-+ 
-+#define DELAY_200US   ((NOMINAL_ARMCLK  / (5 * 1000000)) * 200)  
-+#define DELAY_300US   ((NOMINAL_ARMCLK  / (5 * 1000000)) * 300)  
-+/* this is 8 cycles of ? so choose 8 resulting in 40 cycles */
-+#define DELAY_1S   ((DELAY_200US) * 5000)
-+#define DELAY_8       8
-+#define DELAY_200     200
-+
-+
-+.globl platformsetup
-+platformsetup:
-+/* register allocations
-+ * r0 - delay counter and scratch
-+ * r1 - address register
-+ * r2 - data register
-+ * r3 - index to table pointer
-+ * r4 - iteration counter.
-+ * 
-+ * r5 - hold return address.
-+ * lr - (R14) link register
-+ * pc - (R15) program counter.
-+ */
-+
-+#ifdef INITIALISE_SDRAM
-+/*
-+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM.
-+ * Controller function is linked to execute in SDRAM must be in ROM if not
-+ * there. Check for wrong place.
-+ */
-+    adrl r0, platformsetup      /* Relative location of function start.*/
-+    ldr  r1, _platformsetup
-+    cmp  r0, r1
-+    moveq pc, lr
-+#else
-+    mov pc, lr
-+#endif
-+
-+#if (FPGA == 1)
-+    /* Establish a working setup for the SDRAM */
-+    mov r6, lr
-+
-+    /* Assert reset to the DDR core */
-+    ldr r0, =SYS_CTRL_RSTEN_SET_CTRL
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_RSTEN_DDR_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+
-+    /* Deassert reset to the DDR core */
-+    ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL
-+    str r1, [r0]
-+
-+    /* Turn on the DDR core clock */
-+    ldr r0, =SYS_CTRL_CKEN_SET_CTRL
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_CKEN_DDR_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+
-+    /* Start using the initialisation value list */
-+    adrl r3, init_table
-+
-+    /* Copy first 6 entries */
-+    ldr r4, =6
-+loop0:
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne loop0
-+
-+    /* Delay for 200uS while DRAM controller stabilises. */
-+    ldr r0, =DELAY_200US
-+    bl delay
-+
-+    /* Copy next 4 entries */
-+    ldr r4, =4
-+loop1:  
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne loop1
-+
-+    /* Wait at least 200 clock cycles. */
-+    ldr r0, =DELAY_200
-+    bl delay
-+
-+    /* Copy next 2 entries */
-+    ldr r4, =2
-+loop2:  
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne loop2
-+
-+    /* Wait at least 8 clock  cycles. */
-+    ldr r0, =DELAY_8
-+    bl delay
-+
-+    /* Copy next 9 entries */
-+    ldr r4, =9
-+loop3:  
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne loop3
-+
-+    /* SDRAM initialised so now exit. */
-+    mov lr, r6
-+    mov pc, lr
-+
-+/*
-+ *  delay()
-+ *
-+ *  uses 1 + r0 * 5 cycles
-+ */
-+delay:
-+    nop
-+    nop
-+    nop
-+    subs r0, r0, #1
-+    bne delay
-+    mov pc, lr
-+
-+_platformsetup:
-+    .word platformsetup
-+#else // ASIC, (DDR-2)
-+/*
-+ * Check that not in SDRAM execution. Suicide if re-initialise DRAM.
-+ * Controller function is linked to execute in SDRAM must be in ROM if not
-+ * there. Check for wrong place.
-+ */
-+    /* Establish a working setup for the SDRAM */
-+    mov r6, lr
-+
-+#ifdef OVERCLOCK
-+    /* 
-+      change clock speed on chip 
-+    */
-+    
-+    /* read SYS_CTRL_PLLSYS_CTRL into r3*/
-+    mov r5, #0x45000000
-+    ldr r3, [r5, #72]
-+    
-+    /* load the value at dllkey (0xbeadface) into r7 */
-+    adrl r7, dllkey
-+    ldr r7, [r7]
-+    
-+    /* pll_sys |= 0x20000; */
-+    orr r3, r3, #131072 /* 0x20000 */
-+    
-+    /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */
-+    str r7, [r5, #108]
-+
-+    /* write pll_sys (bypass pll)*/
-+    str r3, [r5, #72]
-+    
-+    /* pll_sys &= 0xff000000; */
-+    mov r4, r3, lsr #16
-+    mov r4, r4, lsl #16
-+    
-+    /* pll_sys |= 0x00F00061  */
-+    orr r4, r4, #15728640   /* 0xf00000 */
-+    orr r4, r4, #97 /* 0x61 */
-+#if 0
-+    orr r4, r4, #7864320    /* 0x780000 */
-+    orr r4, r4, #96 /* 0x60 */
-+#endif
-+    
-+    /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */
-+    str r7, [r5, #108]
-+
-+    /* write pll_sys (with new pll speeds) */    
-+    str r4, [r5, #72]
-+
-+    /* delay 300us */
-+    ldr r0, =DELAY_300US
-+    bl delay
-+
-+    /* clear bypass pll bit */
-+    bic r4, r4, #131072 /* 0x20000 */
-+
-+    /* write 0xbeadface into SYS_CTRL_PLLSYS_KEY_CTRL */
-+    str r7, [r5, #108]
-+
-+    /* write pll_sys (with new pll speeds and pll un-bypassed) */    
-+    str r4, [r5, #72]
-+#endif /* OVERCLOCK */
-+  
-+    /* Turn on the DDR core and phy clocks */
-+    ldr r0, =SYS_CTRL_CKEN_SET_CTRL
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_CKEN_DDR_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_CKEN_DDR_PHY_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+
-+    /* Assert reset to the DDR core and phy */
-+    ldr r0, =SYS_CTRL_RSTEN_SET_CTRL
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_RSTEN_DDR_PHY_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_RSTEN_DDR_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+
-+    /* Deassert reset to the DDR core and phy*/
-+    ldr r0, =SYS_CTRL_RSTEN_CLR_CTRL
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_RSTEN_DDR_PHY_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+    ldr r1, =1
-+    ldr r2, =SYS_CTRL_RSTEN_DDR_BIT
-+    mov r1, r1, LSL r2
-+    str r1, [r0]
-+
-+    /* Start using the initialisation value list */
-+    adrl r3, init_table
-+
-+    /* Copy first 14 entries of DDR core setup (section A)*/
-+    ldr r4, =14
-+loop0:
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne loop0
-+
-+    /* Delay for 200uS while DDR controller stabilises. */
-+    ldr r0, =DELAY_200US
-+    bl delay
-+
-+    /* Copy next 13 entries of DDR device commands (section B)*/
-+    ldr r4, =13
-+loop1:
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+
-+    /* Wait at least 200 clock cycles between ram chip command writes */
-+    ldr r0, =DELAY_200
-+    bl delay
-+
-+    subs r4, r4, #1
-+    bne loop1
-+
-+    /* Copy final DDR controller setup to set memory size/banks (section C)*/
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+
-+#if (PROBE_MEM_SIZE == 1)
-+    /* Load the probe values into SDRAM */
-+    adrl r3, probe_table
-+    mov r4, #4
-+.globl pl1
-+pl1:
-+    ldmia r3!, {r1, r2}
-+    str r2, [r1]
-+    subs r4, r4, #1
-+    bne pl1
-+
-+    /* Get the current contents of the DDR controller core's config register */
-+    adrl r1, ddr_config_reg
-+    ldr r1, [r1]
-+    ldr r1, [r1]
-+
-+    /* Zero the number of banks field - bit 23*/
-+    mov r2, #1
-+    bic r1, r1, r2, lsl #23
-+
-+    /* Zero the size field - bits 17-20 inclusive */
-+    mov r2, #15
-+    bic r1, r1, r2, lsl #17
-+
-+    /* First probe location tells us the SDRAM size */
-+    adrl r3, probe_table
-+    ldr r0, [r3]
-+    ldr r0, [r0]
-+
-+    /* Is size 64MB? */
-+    ldr r2, [r3, #28]	/* Get probe value 4 */
-+    cmp r0, r2
-+    moveq r4, #6
-+    orreq r1, r1, r4, lsl #17
-+    beq pl2
-+
-+    /* Is 128M or 256M so set banks to 8 */
-+    mov r4, #1
-+    orr r1, r1, r4, lsl #23
-+
-+    /* Is size 128MB? */
-+    ldr r2, [r3, #20]	/* Get probe value 3 */
-+    cmp r0, r2
-+//    moveq r4, #7
-+    moveq r4, #8	/* DDR controller does not work at 128M, use 256M instead
-+    orreq r1, r1, r4, lsl #17
-+    beq pl2
-+
-+    /* Must be 256MB, or something is very wrong */
-+    mov r4, #8
-+    orr r1, r1, r4, lsl #17
-+
-+pl2:
-+    /* Write the revised contents to the DDR controller core's config register */
-+    adrl r2, ddr_config_reg
-+    ldr r2, [r2]
-+    str r1, [r2]
-+#endif
-+
-+    /* SDRAM setup complete */
-+    mov lr, r6
-+    mov pc, lr
-+
-+/*
-+ *  delay()
-+ *
-+ *  uses 1 + r0 * 5 cycles
-+ */
-+delay:
-+    nop
-+    nop
-+    nop
-+    subs r0, r0, #1
-+    bne delay
-+    mov pc, lr
-+
-+_platformsetup:
-+    .word platformsetup
-+#endif
-+
-+
-+init_table:
-+#if (FPGA == 1)
-+    /* Table of address, data for loading into the DRAM controller on FPGA */
-+    .word 0x45800000, 0x000d0000    // Enable the DDR in SDR mode and width 32 bits
-+    .word 0x45800034, 0x04442032    // SDR mode timings - #0
-+    .word 0x45800038, 0x570A0907    // SDR mode timings - #1
-+    .word 0x4580003C, 0x00000002    // SDR mode timings - #2
-+    .word 0x45800004, 0x80000000    // Enable DDR core, but not clients yet
-+    .word 0x45800014, 0x80000001    // Enable CK and set DLL mode to manual
-+/* 200uS delay */
-+    .word 0x4580000c, 0x80200000    // Assert CKE for all further commands
-+    .word 0x4580000c, 0x80280400    // Issue precharge to all banks
-+    .word 0x4580000c, 0x80200000    // NOP, as only DDR has real command here
-+    .word 0x4580000c, 0x80200022    // Set burst length 4, sequential CAS 2
-+/* 200uS delay */
-+    .word 0x4580000c, 0x80280400    // Issue precharge to all banks
-+    .word 0x4580000c, 0x80240000    // Issue auto-refresh command, CKE not asserted
-+/* 200uS delay */
-+    .word 0x4580000c, 0x80240000    // Issue auto-refresh command, CKE not asserted
-+    .word 0x4580000c, 0x80200000    // Assert CKE for all further commands
-+    .word 0x4580000c, 0x80200022        // Set burst length 4, sequential CAS 2
-+    .word 0x45800000, 0x000d0186    // SDR, size and width and refresh rate, assuming
-+                        // 25Mhz clk to SDR, divide down to get 15.625uS
-+                    // refresh rate
-+    .word 0x45800024, 0x00000124    // Set I/O drive strengths
-+    .word 0x45800028, 0x0000001f    // Enable all arbiter features
-+    .word 0x45800018, 0x00000000    // Disable all monitoring
-+    .word 0x45800010, 0xFFFFFFFF    // Disable all read buffering
-+    .word 0x45800004, 0x800000ff    // Enable all client interfaces
-+#else   // ASIC DDR-2
-+    // SECTION A - DDR controller core configuration
-+    .word 0x45800000, 0x802d0591    // enable in ddr-2 mode 16 bit wide
-+    .word 0x45800034, 0x04442032    // ddr-2 mode timings 
-+    .word 0x45800038, 0x870f0b25    // ddr-2 mode timings
-+    .word 0x4580003c, 0x00000a23    // ddr-2 mode timings
-+    .word 0x45800054, 0x00072000    // phy-3 settings
-+    .word 0x45800050, 0x00022828    // phy-2 settings, start
-+    .word 0x45800050, 0x00032828    // phy-2 settings, on
-+    .word 0x45800028, 0x0000001f    // Enable all arbiter features
-+    .word 0x45800018, 0x00000000    // Disable all monitoring
-+    .word 0x45800010, 0xffff0000    // Enable all read buffering
-+    .word 0x4580002c, 0x00ff00fd    // no burst accl, no hprot on arm data
-+    .word 0x45800040, 0x00000000    // enable burst and read cache
-+    .word 0x45800044, 0xffff0000    // enable write behind prot, disable timeout     
-+    .word 0x45800004, 0x8000ffff    // Enable all client interfaces
-+/* 200uS delay after configuring DDR controller core */
-+
-+    // SECTION B - Memory device configuration
-+    .word 0x4580000c, 0x807c0000    // exit something or other
-+    .word 0x4580000c, 0x803c0000    // nop - wake up
-+    .word 0x4580000c, 0x80280400    // precharge all
-+    .word 0x4580000c, 0x80220000    // emr2
-+    .word 0x4580000c, 0x80230000    // emr3
-+
-+#if (MEM_ODT == 150)
-+    .word 0x4580000c, 0x80210042    // enable dll, odt to 150
-+#elif (MEM_ODT == 75)
-+    .word 0x4580000c, 0x80210006    // enable dll, odt to 75
-+#elif (MEM_ODT == 50)
-+    .word 0x4580000c, 0x80210046    // enable dll, odt to 50
-+#else
-+#error Unsupported memory on-die termination, set MEM_ODT to 50, 75, or 150
-+#endif
-+
-+    .word 0x4580000c, 0x80200733    // set WR CL BL and reset dll
-+    .word 0x4580000c, 0x80280400    // precharge all
-+    .word 0x4580000c, 0x80240000    // auto refresh
-+    .word 0x4580000c, 0x80240000    // auto refresh
-+    .word 0x4580000c, 0x80200733    // set WR CL BL and reset dll
-+
-+#if (MEM_ODT == 150)
-+    .word 0x4580000c, 0x802103c2    // enable OCD
-+    .word 0x4580000c, 0x80210042    // disable OCD
-+#elif (MEM_ODT == 75)
-+    .word 0x4580000c, 0x80210386    // enable OCD
-+    .word 0x4580000c, 0x80210006    // disable OCD
-+#elif (MEM_ODT == 50)
-+    .word 0x4580000c, 0x802103c6    // enable OCD
-+    .word 0x4580000c, 0x80210046    // disable OCD
-+#else
-+#error Unsupported memory on-die termination, set MEM_ODT to 50, 75, or 150
-+#endif
-+
-+    // SECTION C - Final memory size/bank configuration
-+#if (PROBE_MEM_SIZE == 1)
-+    .word 0x45800000, 0x80b10591    // 256M, 8 banks, 1425 clocks for 7.8us refresh.
-+#elif (MEM_SIZE == 64)
-+    .word 0x45800000, 0x802d0591    // 64M,  4 banks, 1425 clocks for 7.8us refresh.
-+#elif (MEM_SIZE == 128)
-+    .word 0x45800000, 0x80af0591    // 128M, 8 banks, 1425 clocks for 7.8us refresh.
-+#elif (MEM_SIZE == 256)
-+    .word 0x45800000, 0x80b10591    // 256M, 8 banks, 1425 clocks for 7.8us refresh.
-+#else
-+#error Unsupported memory size, set MEM_SIZE to 64, 128 or 256
-+#endif
-+
-+#endif  // FPGA or ASIC
-+dllkey:
-+    .word 0xbeadface
-+
-+ddr_config_reg:
-+    .word 0x45800000
-+
-+probe_table:
-+    .word 0x48000000, 0x12345678
-+    .word 0x48000040, 0xdeadbeef
-+    .word 0x50000000, 0xfafafafa
-+    .word 0x50000040, 0xabcdef01
-+
-+.ltorg
-+
-diff -Nurd u-boot-1.1.2/board/oxnas/u-boot.lds u-boot-1.1.2-oxe810/board/oxnas/u-boot.lds
---- u-boot-1.1.2/board/oxnas/u-boot.lds	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/board/oxnas/u-boot.lds	2008-06-11 17:55:18.000000000 +0200
-@@ -0,0 +1,50 @@
-+/*
-+ * (C) Copyright 2002
-+ * Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
-+OUTPUT_ARCH(arm)
-+ENTRY(_start)
-+SECTIONS
-+{
-+	. = 0x00000000;
-+	. = ALIGN(4);
-+	.text	:
-+	{
-+	  cpu/arm926ejs/start.o	(.text)
-+	  *(.text)
-+	}
-+	.rodata : { *(.rodata) }
-+	. = ALIGN(4);
-+	.data : { *(.data) }
-+	. = ALIGN(4);
-+	.got : { *(.got) }
-+
-+	__u_boot_cmd_start = .;
-+	.u_boot_cmd : { *(.u_boot_cmd) }
-+	__u_boot_cmd_end = .;
-+
-+	. = ALIGN(4);
-+	__bss_start = .;
-+	.bss : { *(.bss) }
-+	_end = .;
-+}
-diff -Nurd u-boot-1.1.2/common/cmd_ext2.c u-boot-1.1.2-oxe810/common/cmd_ext2.c
---- u-boot-1.1.2/common/cmd_ext2.c	2004-12-16 18:34:53.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/cmd_ext2.c	2008-06-11 17:55:30.000000000 +0200
-@@ -223,7 +223,7 @@
- 	PRINTF("Using device %s%d, partition %d\n", argv[1], dev, part);
- 
- 	if (part != 0) {
--		if (get_partition_info (&dev_desc[dev], part, &info)) {
-+		if (get_partition_info (dev_desc, part, &info)) {
- 			printf ("** Bad partition %d **\n", part);
- 			return(1);
- 		}
-diff -Nurd u-boot-1.1.2/common/cmd_ide.c u-boot-1.1.2-oxe810/common/cmd_ide.c
---- u-boot-1.1.2/common/cmd_ide.c	2004-12-31 10:32:50.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/cmd_ide.c	2008-06-11 17:55:30.000000000 +0200
-@@ -193,6 +193,13 @@
- static void set_pcmcia_timing (int pmode);
- #endif
- 
-+#ifdef CONFIG_OXNAS
-+extern unsigned char oxnas_sata_inb(int dev, int port);
-+extern void oxnas_sata_outb(int dev, int port, unsigned char val);
-+extern void oxnas_sata_output_data(int dev, ulong *sect_buf, int words);
-+extern void oxnas_sata_input_data(int dev, ulong *sect_buf, int words);
-+#endif // CONFIG_OXNAS
-+
- /* ------------------------------------------------------------------------- */
- 
- int do_ide (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-@@ -491,175 +498,103 @@
- 	return rcode;
- }
- 
--/* ------------------------------------------------------------------------- */
- 
--void ide_init (void)
-+static int ide_probe(int device)
- {
-+    int found = 0;
-+
-+    /* Select device */
-+    udelay(100000);	    /* 100 ms */
-+    ide_outb(device, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(device));
-+    udelay(100000);     /* 100 ms */
- 
--#ifdef CONFIG_IDE_8xx_DIRECT
--	DECLARE_GLOBAL_DATA_PTR;
--	volatile immap_t *immr = (immap_t *)CFG_IMMR;
--	volatile pcmconf8xx_t *pcmp = &(immr->im_pcmcia);
--#endif
- 	unsigned char c;
--	int i, bus;
--#ifdef CONFIG_AMIGAONEG3SE
--	unsigned int max_bus_scan;
--	unsigned int ata_reset_time;
--	char *s;
-+    int i = 0;
-+    do {
-+        udelay(10000);  /* 10 ms */
-+
-+        c = ide_inb(device, ATA_STATUS);
-+        if (++i > (ATA_RESET_TIME * 100)) {
-+            PRINTF("ide_probe() timeout\n");
-+            ide_led((LED_IDE1 | LED_IDE2), 0);  /* LED's off */
-+            return found;
-+        }
-+        if ((i >= 100) && ((i%100) == 0)) {
-+            putc ('.');
-+        }
-+    } while (c & ATA_STAT_BUSY);
-+
-+    if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
-+        PRINTF("ide_probe() status = 0x%02X ", c);
-+#ifndef CONFIG_ATAPI    /* ATAPI Devices do not set DRDY */
-+    } else  if ((c & ATA_STAT_READY) == 0) {
-+        PRINTF("ide_probe() status = 0x%02X ", c);
- #endif
--#ifdef CONFIG_IDE_8xx_PCCARD
--	extern int pcmcia_on (void);
--	extern int ide_devices_found; /* Initialized in check_ide_device() */
--#endif	/* CONFIG_IDE_8xx_PCCARD */
-+    } else {
-+        found = 1;
-+    }
- 
--#ifdef CONFIG_IDE_PREINIT
--	extern int ide_preinit (void);
--	WATCHDOG_RESET();
-+    return found;
-+}
- 
--	if (ide_preinit ()) {
--		puts ("ide_preinit failed\n");
-+void ide_init(void)
-+{
-+	static int ide_init_called = 0;
-+	int i, bus;
-+
-+	if (ide_init_called) {
- 		return;
- 	}
--#endif	/* CONFIG_IDE_PREINIT */
--
--#ifdef CONFIG_IDE_8xx_PCCARD
--	extern int pcmcia_on (void);
--	extern int ide_devices_found; /* Initialized in check_ide_device() */
-+	ide_init_called = 1;
- 
-+#ifdef CONFIG_IDE_PREINIT
-+	extern int ide_preinit(void);
- 	WATCHDOG_RESET();
- 
--	ide_devices_found = 0;
--	/* initialize the PCMCIA IDE adapter card */
--	pcmcia_on();
--	if (!ide_devices_found)
-+    printf("Initialising disks\n");
-+	if (ide_preinit()) {
-+		puts ("ide_preinit failed\n");
- 		return;
--	udelay (1000000);	/* 1 s */
--#endif	/* CONFIG_IDE_8xx_PCCARD */
-+	}
-+#endif	/* CONFIG_IDE_PREINIT */
- 
- 	WATCHDOG_RESET();
- 
--#ifdef CONFIG_IDE_8xx_DIRECT
--	/* Initialize PIO timing tables */
--	for (i=0; i <= IDE_MAX_PIO_MODE; ++i) {
--	    pio_config_clk[i].t_setup  = PCMCIA_MK_CLKS(pio_config_ns[i].t_setup,
--							    gd->bus_clk);
--	    pio_config_clk[i].t_length = PCMCIA_MK_CLKS(pio_config_ns[i].t_length,
--							    gd->bus_clk);
--	    pio_config_clk[i].t_hold   = PCMCIA_MK_CLKS(pio_config_ns[i].t_hold,
--							    gd->bus_clk);
--	    PRINTF ("PIO Mode %d: setup=%2d ns/%d clk"
--		    "  len=%3d ns/%d clk"
--		    "  hold=%2d ns/%d clk\n",
--		    i,
--		    pio_config_ns[i].t_setup,  pio_config_clk[i].t_setup,
--		    pio_config_ns[i].t_length, pio_config_clk[i].t_length,
--		    pio_config_ns[i].t_hold,   pio_config_clk[i].t_hold);
--	}
--#endif /* CONFIG_IDE_8xx_DIRECT */
--
- 	/* Reset the IDE just to be sure.
- 	 * Light LED's to show
- 	 */
--	ide_led ((LED_IDE1 | LED_IDE2), 1);		/* LED's on	*/
--	ide_reset (); /* ATAPI Drives seems to need a proper IDE Reset */
--
--#ifdef CONFIG_IDE_8xx_DIRECT
--	/* PCMCIA / IDE initialization for common mem space */
--	pcmp->pcmc_pgcrb = 0;
--
--	/* start in PIO mode 0 - most relaxed timings */
--	pio_mode = 0;
--	set_pcmcia_timing (pio_mode);
--#endif /* CONFIG_IDE_8xx_DIRECT */
-+	ide_led((LED_IDE1 | LED_IDE2), 1);		/* LED's on	*/
-+	ide_reset(); /* ATAPI Drives seems to need a proper IDE Reset */
- 
- 	/*
- 	 * Wait for IDE to get ready.
- 	 * According to spec, this can take up to 31 seconds!
- 	 */
--#ifndef CONFIG_AMIGAONEG3SE
--	for (bus=0; bus<CFG_IDE_MAXBUS; ++bus) {
--		int dev = bus * (CFG_IDE_MAXDEVICE / CFG_IDE_MAXBUS);
--#else
--	s = getenv("ide_maxbus");
--	if (s)
--	    max_bus_scan = simple_strtol(s, NULL, 10);
--	else
--	    max_bus_scan = CFG_IDE_MAXBUS;
--
--	for (bus=0; bus<max_bus_scan; ++bus) {
--		int dev = bus * (CFG_IDE_MAXDEVICE / max_bus_scan);
--#endif
--
--#ifdef CONFIG_IDE_8xx_PCCARD
--		/* Skip non-ide devices from probing */
--		if ((ide_devices_found & (1 << bus)) == 0) {
--			ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
--			continue;
--		}
--#endif
--		printf ("Bus %d: ", bus);
--
--		ide_bus_ok[bus] = 0;
--
--		/* Select device
--		 */
--		udelay (100000);		/* 100 ms */
--		ide_outb (dev, ATA_DEV_HD, ATA_LBA | ATA_DEVICE(dev));
--		udelay (100000);		/* 100 ms */
--#ifdef CONFIG_AMIGAONEG3SE
--		ata_reset_time = ATA_RESET_TIME;
--		s = getenv("ide_reset_timeout");
--		if (s) ata_reset_time = 2*simple_strtol(s, NULL, 10);
--#endif
--		i = 0;
--		do {
--			udelay (10000);		/* 10 ms */
--
--			c = ide_inb (dev, ATA_STATUS);
--			i++;
--#ifdef CONFIG_AMIGAONEG3SE
--			if (i > (ata_reset_time * 100)) {
--#else
--			if (i > (ATA_RESET_TIME * 100)) {
--#endif
--				puts ("** Timeout **\n");
--				ide_led ((LED_IDE1 | LED_IDE2), 0); /* LED's off */
--#ifdef CONFIG_AMIGAONEG3SE
--				/* If this is the second bus, the first one was OK */
--				if (bus != 0) {
--				    ide_bus_ok[bus] = 0;
--				    goto skip_bus;
--				}
--#endif
--				return;
--			}
--			if ((i >= 100) && ((i%100)==0)) {
--				putc ('.');
--			}
--		} while (c & ATA_STAT_BUSY);
-+    printf("Detecting SATA busses:\n");
-+    for (bus=0; bus < CFG_IDE_MAXBUS; ++bus) {
-+        printf("Bus %d: ", bus);
- 
--		if (c & (ATA_STAT_BUSY | ATA_STAT_FAULT)) {
--			puts ("not available  ");
--			PRINTF ("Status = 0x%02X ", c);
--#ifndef CONFIG_ATAPI /* ATAPI Devices do not set DRDY */
--		} else  if ((c & ATA_STAT_READY) == 0) {
--			puts ("not available  ");
--			PRINTF ("Status = 0x%02X ", c);
--#endif
--		} else {
--			puts ("OK ");
--			ide_bus_ok[bus] = 1;
--		}
--		WATCHDOG_RESET();
--	}
-+        /* Try to discover if bus is present by probing first device on bus */
-+        int device = bus * (CFG_IDE_MAXDEVICE / CFG_IDE_MAXBUS);
-+        ide_bus_ok[bus] = ide_probe(device);
-+        if (ide_bus_ok[bus]) {
-+            puts("Found first device OK\n");
-+        } else {
-+            WATCHDOG_RESET();
-+        
-+            /* Try second device on bus */
-+            ide_bus_ok[bus] = ide_probe(++device);
-+            if (ide_bus_ok[bus]) {
-+                puts("Found second device OK\n");
-+            } else {
-+                puts("No devices found\n");
-+            }
-+        }
- 
--#ifdef CONFIG_AMIGAONEG3SE
--      skip_bus:
--#endif
--	putc ('\n');
-+        WATCHDOG_RESET();
-+    }
- 
--	ide_led ((LED_IDE1 | LED_IDE2), 0);	/* LED's off	*/
-+	ide_led((LED_IDE1 | LED_IDE2), 0);	/* LED's off	*/
- 
- 	curr_device = -1;
- 	for (i=0; i<CFG_IDE_MAXDEVICE; ++i) {
-@@ -675,13 +610,12 @@
- 		ide_dev_desc[i].block_read=ide_read;
- 		if (!ide_bus_ok[IDE_BUS(i)])
- 			continue;
--		ide_led (led, 1);		/* LED on	*/
-+		ide_led(led, 1);		/* LED on	*/
- 		ide_ident(&ide_dev_desc[i]);
--		ide_led (led, 0);		/* LED off	*/
-+		ide_led(led, 0);		/* LED off	*/
- 		dev_print(&ide_dev_desc[i]);
--/*		ide_print (i); */
- 		if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
--			init_part (&ide_dev_desc[i]);			/* initialize partition type */
-+			init_part(&ide_dev_desc[i]);    /* initialize partition type */
- 			if (curr_device < 0)
- 				curr_device = i;
- 		}
-@@ -689,6 +623,11 @@
- 	WATCHDOG_RESET();
- }
- 
-+int is_device_present(int device_number)
-+{
-+    return ide_dev_desc[device_number].part_type != PART_TYPE_UNKNOWN;
-+}
-+
- /* ------------------------------------------------------------------------- */
- 
- block_dev_desc_t * ide_get_dev(int dev)
-@@ -798,6 +737,11 @@
- 	EIEIO;
- 	*((uchar *)(ATA_CURR_BASE(dev)+port)) = val;
- }
-+#elif defined(CONFIG_OXNAS)
-+static void __inline__ ide_outb(int dev, int port, unsigned char val)
-+{
-+    oxnas_sata_outb(dev, port, val);
-+}
- #else	/* ! __PPC__ */
- static void __inline__
- ide_outb(int dev, int port, unsigned char val)
-@@ -819,6 +763,11 @@
- 		dev, port, (ATA_CURR_BASE(dev)+port), val);
- 	return (val);
- }
-+#elif defined(CONFIG_OXNAS)
-+static unsigned char __inline__ ide_inb(int dev, int port)
-+{
-+    return oxnas_sata_inb(dev, port);
-+}
- #else	/* ! __PPC__ */
- static unsigned char __inline__
- ide_inb(int dev, int port)
-@@ -921,6 +870,11 @@
- 	}
- #endif	/* CONFIG_HMI10 */
- }
-+#elif defined(CONFIG_OXNAS)
-+static void output_data(int dev, ulong *sect_buf, int words)
-+{
-+    oxnas_sata_output_data(dev, sect_buf, words);
-+}
- #else	/* ! __PPC__ */
- static void
- output_data(int dev, ulong *sect_buf, int words)
-@@ -968,6 +922,11 @@
- 	}
- #endif	/* CONFIG_HMI10 */
- }
-+#elif defined(CONFIG_OXNAS)
-+static void input_data(int dev, ulong *sect_buf, int words)
-+{
-+    oxnas_sata_input_data(dev, sect_buf, words);
-+}
- #else	/* ! __PPC__ */
- static void
- input_data(int dev, ulong *sect_buf, int words)
-@@ -1001,10 +960,36 @@
- 
- /* -------------------------------------------------------------------------
-  */
-+#ifdef CONFIG_OXNAS
-+static void byte_swap_and_trim(char* buf)
-+{
-+    char *src = buf;
-+
-+    // Swap bytes in 16-bit words
-+    while ((*src != '\0') && (*(src+1) != '\0')) {
-+        char tmp = *(src+1);
-+        *(src+1) = *src;
-+        *src = tmp;
-+        src += 2;
-+    }
-+
-+    // Trim leading spaces
-+    src = buf;
-+    while (*src == ' ') {
-+        ++src;
-+    }
-+    if (src != buf) {
-+        memcpy(buf, src, strlen(src));
-+        buf[strlen(buf) - (src-buf)] = '\0';
-+    }
-+}
-+#endif // CONFIG_OXNAS
-+
- static void ide_ident (block_dev_desc_t *dev_desc)
- {
- 	ulong iobuf[ATA_SECTORWORDS];
- 	unsigned char c;
-+    unsigned int i;
- 	hd_driveid_t *iop = (hd_driveid_t *)iobuf;
- 
- #ifdef CONFIG_AMIGAONEG3SE
-@@ -1023,6 +1008,10 @@
- 	device=dev_desc->dev;
- 	printf ("  Device %d: ", device);
- 
-+    for ( i=0; i < ATA_SECTORWORDS; ++i) {
-+        iobuf[i] = 0;
-+    }
-+    
- #ifdef CONFIG_AMIGAONEG3SE
- 	s = getenv("ide_maxbus");
- 	if (s) {
-@@ -1110,20 +1099,22 @@
- 
- 	input_swap_data (device, iobuf, ATA_SECTORWORDS);
- 
--	ident_cpy (dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision));
--	ident_cpy (dev_desc->vendor, iop->model, sizeof(dev_desc->vendor));
--	ident_cpy (dev_desc->product, iop->serial_no, sizeof(dev_desc->product));
-+	ident_cpy(dev_desc->revision, iop->fw_rev, sizeof(dev_desc->revision));
-+	ident_cpy(dev_desc->vendor, iop->model, sizeof(dev_desc->vendor));
-+	ident_cpy(dev_desc->product, iop->serial_no, sizeof(dev_desc->product));
-+
- #ifdef __LITTLE_ENDIAN
- 	/*
--	 * firmware revision and model number have Big Endian Byte
-+	 * firmware revision, model number and product have Big Endian Byte
- 	 * order in Word. Convert both to little endian.
- 	 *
- 	 * See CF+ and CompactFlash Specification Revision 2.0:
- 	 * 6.2.1.6: Identfy Drive, Table 39 for more details
- 	 */
- 
--	strswab (dev_desc->revision);
--	strswab (dev_desc->vendor);
-+	byte_swap_and_trim(dev_desc->revision);
-+	byte_swap_and_trim(dev_desc->vendor);
-+	byte_swap_and_trim(dev_desc->product);
- #endif /* __LITTLE_ENDIAN */
- 
- 	if ((iop->config & 0x0080)==0x0080)
-diff -Nurd u-boot-1.1.2/common/cmd_ledfail.c u-boot-1.1.2-oxe810/common/cmd_ledfail.c
---- u-boot-1.1.2/common/cmd_ledfail.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/cmd_ledfail.c	2008-06-11 17:55:30.000000000 +0200
-@@ -0,0 +1,58 @@
-+
-+#include <common.h>
-+#include <command.h>
-+
-+#if (CONFIG_COMMANDS & CFG_CMD_LEDFAIL)
-+#define FAILURE_LED (1 << (34-32))
-+
-+#define GPIO_B	0x44100000
-+#define WARN_GPIO_OUT_REG			(GPIO_B + 0x10)
-+#define WARN_GPIO_OUT_ENABLE_SET	(GPIO_B + 0x1C)
-+#define WARN_GPIO_OUT_ENABLE_CLR	(GPIO_B + 0x20)
-+
-+static void ledfail_light(void)
-+{
-+	printf("Light LED\n");
-+	/* Light the failure LED - assumes active low drive */
-+	u_int32_t led_state = *((volatile u_int32_t *)WARN_GPIO_OUT_REG);
-+	led_state = led_state & ~FAILURE_LED;
-+	*((volatile u_int32_t *)WARN_GPIO_OUT_REG) = led_state;
-+
-+	/* Enable GPIO for output */
-+	*((volatile u_int32_t *)WARN_GPIO_OUT_ENABLE_SET) = FAILURE_LED;
-+}
-+
-+static void ledfail_extinguish(void)
-+{
-+	printf("Extinguish LED\n");
-+	/* Extinguish the failure LED - assumes active low drive */
-+	u_int32_t led_state = *((volatile u_int32_t *)WARN_GPIO_OUT_REG);
-+	led_state = led_state | FAILURE_LED;
-+	*((volatile u_int32_t *)WARN_GPIO_OUT_REG) = led_state;
-+
-+    /* Clear the failure bit output enable in GPIO's */
-+	*((volatile u_int32_t *)WARN_GPIO_OUT_ENABLE_CLR) = FAILURE_LED;
-+}
-+
-+int do_ledfail(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-+{
-+	if (argc != 2) {
-+		printf ("Usage:\n%s\n", cmdtp->usage);
-+		return 1;
-+	}
-+
-+	ulong arg = simple_strtoul(argv[1], NULL, 10);
-+	switch (arg) {
-+		case 0:
-+			ledfail_extinguish();
-+			break;
-+		case 1:
-+			ledfail_light();
-+			break;
-+	}
-+
-+	return 0;
-+}
-+
-+U_BOOT_CMD(ledfail, 2, 2, do_ledfail, "ledfail - Extinguish (0) or light (1) failure LED\n", NULL);
-+#endif	/* CFG_CMD_LEDFAIL */
-diff -Nurd u-boot-1.1.2/common/cmd_mem.c u-boot-1.1.2-oxe810/common/cmd_mem.c
---- u-boot-1.1.2/common/cmd_mem.c	2004-12-16 18:42:39.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/cmd_mem.c	2008-06-11 17:55:30.000000000 +0200
-@@ -731,13 +731,17 @@
- 	if (argc > 1) {
- 		start = (ulong *)simple_strtoul(argv[1], NULL, 16);
- 	} else {
--		start = (ulong *)CFG_MEMTEST_START;
-+		DECLARE_GLOBAL_DATA_PTR;
-+
-+		start = (ulong *)(gd->bd->bi_dram[0].start);
- 	}
- 
- 	if (argc > 2) {
- 		end = (ulong *)simple_strtoul(argv[2], NULL, 16);
- 	} else {
--		end = (ulong *)(CFG_MEMTEST_END);
-+		DECLARE_GLOBAL_DATA_PTR;
-+
-+		end = (ulong *)(start + gd->bd->bi_dram[0].size);
- 	}
- 
- 	if (argc > 3) {
-diff -Nurd u-boot-1.1.2/common/cmd_nvedit.c u-boot-1.1.2-oxe810/common/cmd_nvedit.c
---- u-boot-1.1.2/common/cmd_nvedit.c	2004-09-30 00:55:14.000000000 +0200
-+++ u-boot-1.1.2-oxe810/common/cmd_nvedit.c	2008-06-11 17:55:30.000000000 +0200
-@@ -55,8 +55,9 @@
-     !defined(CFG_ENV_IS_IN_FLASH)	&& \
-     !defined(CFG_ENV_IS_IN_DATAFLASH)	&& \
-     !defined(CFG_ENV_IS_IN_NAND)	&& \
-+    !defined(CFG_ENV_IS_IN_DISK)	&& \
-     !defined(CFG_ENV_IS_NOWHERE)
--# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|NOWHERE}
-+# error Define one of CFG_ENV_IS_IN_{NVRAM|EEPROM|FLASH|DATAFLASH|DISK|NOWHERE}
- #endif
- 
- #define XMK_STR(x)	#x
-@@ -483,7 +484,7 @@
-  * or NULL if not found
-  */
- 
--char *getenv (uchar *name)
-+char *getenv (const uchar *name)
- {
- 	int i, nxt;
- 
-@@ -530,7 +531,9 @@
- 	return (-1);
- }
- 
--#if defined(CFG_ENV_IS_IN_NVRAM) || defined(CFG_ENV_IS_IN_EEPROM) || \
-+#if defined(CFG_ENV_IS_IN_NVRAM) || \
-+    defined(CFG_ENV_IS_IN_EEPROM) || \
-+    defined(CFG_ENV_IS_IN_DISK) || \
-     ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == \
-       (CFG_CMD_ENV|CFG_CMD_FLASH))
- int do_saveenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
-@@ -586,7 +589,9 @@
- 	"    - delete environment variable 'name'\n"
- );
- 
--#if defined(CFG_ENV_IS_IN_NVRAM) || defined(CFG_ENV_IS_IN_EEPROM) || \
-+#if defined(CFG_ENV_IS_IN_NVRAM) || \
-+    defined(CFG_ENV_IS_IN_EEPROM) || \
-+    defined(CFG_ENV_IS_IN_DISK) || \
-     ((CONFIG_COMMANDS & (CFG_CMD_ENV|CFG_CMD_FLASH)) == \
-       (CFG_CMD_ENV|CFG_CMD_FLASH))
- U_BOOT_CMD(
-diff -Nurd u-boot-1.1.2/common/env_common.c u-boot-1.1.2-oxe810/common/env_common.c
---- u-boot-1.1.2/common/env_common.c	2004-06-09 16:58:14.000000000 +0200
-+++ u-boot-1.1.2-oxe810/common/env_common.c	2008-06-11 17:55:30.000000000 +0200
-@@ -42,7 +42,7 @@
- 	extern void disable_nvram(void);
- #endif
- 
--#undef DEBUG_ENV
-+//#undef DEBUG_ENV
- #ifdef DEBUG_ENV
- #define DEBUGF(fmt,args...) printf(fmt ,##args)
- #else
-diff -Nurd u-boot-1.1.2/common/env_disk.c u-boot-1.1.2-oxe810/common/env_disk.c
---- u-boot-1.1.2/common/env_disk.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/env_disk.c	2008-06-11 17:55:30.000000000 +0200
-@@ -0,0 +1,152 @@
-+/*
-+ * (C) Copyright 2006
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+#include <common.h>
-+
-+#if defined(CFG_ENV_IS_IN_DISK)
-+
-+#include <command.h>
-+#include <environment.h>
-+#include <ide.h>
-+
-+extern int is_device_present(int device_number);
-+
-+/* Point to the environment as held in SRAM */
-+env_t *env_ptr = NULL;
-+
-+char *env_name_spec = "Disk";
-+
-+/* The default environment compiled into U-Boot */
-+extern uchar default_environment[];
-+
-+uchar env_get_char_spec(int index)
-+{
-+    DECLARE_GLOBAL_DATA_PTR;
-+
-+    return *((uchar *)(gd->env_addr + index));
-+}
-+
-+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
-+
-+void env_relocate_spec(void)
-+{
-+    /* Compute the CRC of the environment in SRAM, copied from disk at boot */
-+    env_t *sram_env = (env_t*)CFG_ENV_ADDR;
-+    ulong  crc = crc32(0, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data));
-+
-+    /* Copy the SRAM environment and CRC to the working environment */
-+    memcpy(env_ptr->data, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data));
-+    env_ptr->crc = crc;
-+}
-+
-+int saveenv(void)
-+{
-+    /* Compute the CRC of the working environment */
-+    env_ptr->crc = crc32(0, env_ptr->data, CFG_ENV_SIZE - offsetof(env_t, data));
-+
-+    /* Copy the working environment to the reserved area on each disk device */
-+    int status = 1;
-+    int i;
-+    for (i=0; i < CFG_IDE_MAXDEVICE; ++i) {
-+        if (!is_device_present(i)) {
-+            continue;
-+        }
-+
-+		/* Write environment to the main environment area on disk */
-+        unsigned long written = ide_write(i, CFG_ENV_DISK_SECTOR, CFG_ENV_SIZE/512, (ulong*)env_ptr);
-+        if (written != CFG_ENV_SIZE/512) {
-+			printf("Saving environment to disk %d primary image failed\n", i);
-+            status = 0;
-+        } else {
-+			/* Write environment to the redundant environment area on disk */
-+			written = ide_write(i, CFG_ENV_DISK_REDUNDANT_SECTOR, CFG_ENV_SIZE/512, (ulong*)env_ptr);
-+			if (written != CFG_ENV_SIZE/512) {
-+				printf("Saving environment to disk %d secondary image failed\n", i);
-+				status = 0;
-+			}
-+		}
-+    }
-+
-+    return status;
-+}
-+
-+static int check_sram_env_integrity(void)
-+{
-+    DECLARE_GLOBAL_DATA_PTR;
-+
-+	env_t *sram_env = (env_t*)CFG_ENV_ADDR;
-+	ulong crc = crc32(0, sram_env->data, CFG_ENV_SIZE - offsetof(env_t, data));
-+
-+	if (crc == sram_env->crc) {
-+		gd->env_addr  = (ulong)sram_env->data;
-+		gd->env_valid = 1;
-+	}
-+
-+	return gd->env_valid;
-+}
-+
-+int env_init(void)
-+{
-+    DECLARE_GLOBAL_DATA_PTR;
-+
-+	/* Have not yet found a valid environment */
-+	gd->env_valid = 0;
-+
-+	/* Need SATA available to load environment from alternate disk locations */
-+	ide_init();
-+
-+	int i;
-+    for (i=0; i < CFG_IDE_MAXDEVICE; ++i) {
-+        if (!is_device_present(i)) {
-+            continue;
-+        }
-+
-+		/* Read environment from the primary environment area on disk */
-+        unsigned long read = ide_read(i, CFG_ENV_DISK_SECTOR, CFG_ENV_SIZE/512, (ulong*)CFG_ENV_ADDR);
-+        if (read == CFG_ENV_SIZE/512) {
-+			/* Check integrity of primary environment data */
-+			if (check_sram_env_integrity()) {
-+				printf("Environment successfully read from disk %d primary image\n", i);
-+				break;
-+			}
-+        }
-+
-+		/* Read environment from the secondary environment area on disk */
-+		read = ide_read(i, CFG_ENV_DISK_REDUNDANT_SECTOR, CFG_ENV_SIZE/512, (ulong*)CFG_ENV_ADDR);
-+		if (read == CFG_ENV_SIZE/512) {
-+			/* Check integrity of secondary environment data */
-+			if (check_sram_env_integrity()) {
-+				printf("Environment successfully read from disk %d secondary image\n", i);
-+				break;
-+			}
-+		}
-+	}
-+
-+	if (!gd->env_valid) {
-+		printf("Failed to read valid environment from disk, using built-in default\n");
-+        gd->env_addr  = (ulong)default_environment;
-+        gd->env_valid = 0;
-+	}
-+
-+    return 0;
-+}
-+#endif // CFG_ENV_IS_IN_DISK
-diff -Nurd u-boot-1.1.2/common/main.c u-boot-1.1.2-oxe810/common/main.c
---- u-boot-1.1.2/common/main.c	2004-04-23 22:32:06.000000000 +0200
-+++ u-boot-1.1.2-oxe810/common/main.c	2008-06-11 17:55:30.000000000 +0200
-@@ -182,7 +182,7 @@
- 			else {
- 				for (i = 0; i < presskey_max - 1; i ++)
- 					presskey [i] = presskey [i + 1];
--
-+do_recovery
- 				presskey [i] = getc();
- 			}
- 		}
-@@ -369,6 +369,149 @@
- 	install_auto_complete();
- #endif
- 
-+
-+#if defined(CONFIG_OXNAS)
-+	/* Set the memory size given to Linux */
-+	{
-+		DECLARE_GLOBAL_DATA_PTR;
-+
-+		/* Get a copy of the bootargs string from the runtime environment */
-+		char tempBuf[1024];
-+		char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs"));
-+
-+		/* Find the extent of memory token in the bootargs string */
-+		char* mem_token = strstr(cmd_string, "mem=");
-+		char* mem_token_end = mem_token;
-+		while ((*mem_token_end != ' ') &&
-+			   (*mem_token_end != '\0')) {
-+			++mem_token_end;
-+		}
-+
-+		if ((*mem_token_end == '\0') && (mem_token != mem_token_end)) {
-+			/* Memory token is last in bootargs string */
-+			if (mem_token != cmd_string) {
-+				/* Is not the only token, so erase token and previous space" */
-+				*(mem_token-1) = '\0';
-+			} else {
-+				/* Is the only token, so no previous space to erase */
-+				*mem_token = '\0';
-+			}
-+		} else {
-+			/* Memory token is at intermediate location in bootargs string */
-+			if (*mem_token_end == ' ') {
-+				++mem_token_end;
-+			}
-+
-+			/* Form the bootargs string without the memory token present */
-+			strcpy(mem_token, mem_token_end);
-+		}
-+
-+		/* How many MB of SDRAM are present */
-+		int megabytes = gd->bd->bi_dram[0].size >> 20;
-+
-+		/* Append the memory token to the bootargs string */
-+		switch (megabytes) {
-+			case 64:
-+				cmd_string = strcat(cmd_string, " mem=64M");
-+				break;
-+			case 128:
-+				cmd_string = strcat(cmd_string, " mem=128M");
-+				break;
-+			case 256:
-+				cmd_string = strcat(cmd_string, " mem=256M");
-+				break;
-+			default:
-+				printf("Unsupported memory size, defaulting to 64M\n");
-+				cmd_string = strcat(cmd_string, " mem=64M");
-+		}
-+
-+		/* Save the revised bootargs string to the runtime environment */
-+		setenv("bootargs", cmd_string);
-+	}
-+
-+/* Upgrade, recovery and power button monitor code
-+*/
-+    int do_recovery = 0; /* default no recovery */
-+
-+    /* Read the upgrade flag from disk into memory */
-+    ide_init();
-+    run_command("ide read 48700000 ff 1", 0);
-+
-+    char upgrade_mode = *(volatile char*)0x48700000;
-+    char recovery_mode = *(volatile char*)0x48700001;
-+    char controlled_pd_mode = *(volatile char*)0x48700002;
-+
-+	if (recovery_mode == RECOVERY_MAGIC) {
-+		do_recovery = 1; /* perform recovery */
-+	} 
-+
-+	if (controlled_pd_mode == CONTROLLED_POWER_DOWN_MAGIC) {
-+		/* System in controlled pwer down mode */
-+
-+		/* Read the SRAM location for normal boot flag */
-+		char sram_data = *(volatile char*)(CFG_SRAM_BASE + CFG_SRAM_SIZE - POWER_ON_FLAG_SRAM_OFFSET);
-+		char tempBuf[1024];
-+		char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs"));
-+
-+		if (sram_data == CONTROLLED_POWER_UP_MAGIC) {
-+			/* The system has to remain in power down state */
-+
-+			/* Set appropriate boot args */
-+			cmd_string = strcat(cmd_string, " powermode=controlledpup");
-+			printf("Controlled Power UP requested\n");
-+		} else {
-+			/* The system is moving to power up state from power down state */
-+			cmd_string = strcat(cmd_string, " powermode=controlledpdown");
-+			printf("Controlled Power DOWN requested\n");
-+		}
-+		setenv("bootargs", cmd_string);
-+	}
-+
-+    /* branch off inot recovery or upadate */
-+    if (upgrade_mode == UPGRADE_MAGIC) {
-+        /* Script to select first disk */
-+        parse_string_outer("set select0 ide dev 0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script to select second disk */
-+        parse_string_outer("set select1 ide dev 1", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script for loading 256KB of upgrade rootfs image from hidden sectors */
-+        parse_string_outer("set loadf ide read 48700000 1770 200", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script for loading 2MB of upgrade kernel image from hidden sectors */
-+        parse_string_outer("set loadk ide read 48800000 1970 1000", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script to light failure LED */
-+        parse_string_outer("set lightled ledfail 1", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script to extinguish failure LED */
-+        parse_string_outer("set extinguishled ledfail 0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Script for booting Linux kernel image with mkimage-wrapped initrd */
-+        parse_string_outer("set boot bootm 48800000 48700000", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Set Linux bootargs to use rootfs in initial ramdisk */
-+        parse_string_outer("set bootargs mem=32M console=ttyS0,115200 root=/dev/ram0", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+
-+        /* Validate, load and boot the first validate set of initrd and kernel 
-+           Theres alot of combos here due to disk/backup/fk arrangments, it'll
-+           no doubt work on the first or second one though. */
-+        parse_string_outer("run          select0 loadf          loadk                boot || "
-+                           "run lightled select1 loadf          loadk  extinguishled boot || "
-+                           "run lightled select0 loadf  select1 loadk  extinguishled boot || "
-+                           "run lightled select1 loadf  select0 loadk  extinguishled boot || "
-+						    "run lightled ", FLAG_PARSE_SEMICOLON | FLAG_EXIT_FROM_LOOP);
-+    } else if (do_recovery) {
-+		printf ("\nRecovery mode selected\n");
-+
-+		char tempBuf[1024];
-+		char* cmd_string = strcpy(&tempBuf[0], getenv("bootargs"));
-+		cmd_string = strcat(cmd_string, " adminmode=recovery");
-+		setenv("bootargs", cmd_string);
-+    } 
-+
-+#endif // CONFIG_OXNAS
-+
- #ifdef CONFIG_PREBOOT
- 	if ((p = getenv ("preboot")) != NULL) {
- # ifdef CONFIG_AUTOBOOT_KEYED
-diff -Nurd u-boot-1.1.2/common/Makefile u-boot-1.1.2-oxe810/common/Makefile
---- u-boot-1.1.2/common/Makefile	2004-12-16 18:35:57.000000000 +0100
-+++ u-boot-1.1.2-oxe810/common/Makefile	2008-06-11 17:55:30.000000000 +0200
-@@ -40,9 +40,10 @@
- 	  cmd_nand.o cmd_net.o cmd_nvedit.o \
- 	  cmd_pci.o cmd_pcmcia.o cmd_portio.o \
- 	  cmd_reginfo.o cmd_reiser.o cmd_scsi.o cmd_spi.o cmd_universe.o cmd_usb.o cmd_vfd.o \
-+	  cmd_ledfail.o \
- 	  command.o console.o devices.o dlmalloc.o docecc.o \
- 	  environment.o env_common.o \
--	  env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o exports.o \
-+	  env_nand.o env_dataflash.o env_flash.o env_eeprom.o env_nvram.o env_nowhere.o env_disk.o exports.o \
- 	  flash.o fpga.o \
- 	  hush.o kgdb.o lcd.o lists.o lynxkdi.o \
- 	  memsize.o miiphybb.o miiphyutil.o \
-diff -Nurd u-boot-1.1.2/cpu/arm926ejs/config.mk u-boot-1.1.2-oxe810/cpu/arm926ejs/config.mk
---- u-boot-1.1.2/cpu/arm926ejs/config.mk	2003-08-30 00:00:47.000000000 +0200
-+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/config.mk	2008-06-11 17:55:03.000000000 +0200
-@@ -21,7 +21,6 @@
- # MA 02111-1307 USA
- #
- 
--PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8 \
--	-mshort-load-bytes -msoft-float
-+PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8
- 
--PLATFORM_CPPFLAGS += -mapcs-32 -march=armv4
-+PLATFORM_CPPFLAGS += -march=armv5te
-diff -Nurd u-boot-1.1.2/cpu/arm926ejs/interrupts.c u-boot-1.1.2-oxe810/cpu/arm926ejs/interrupts.c
---- u-boot-1.1.2/cpu/arm926ejs/interrupts.c	2004-03-23 22:43:08.000000000 +0100
-+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/interrupts.c	2008-06-11 17:55:03.000000000 +0200
-@@ -41,7 +41,12 @@
- #include <asm/proc-armv/ptrace.h>
- 
- extern void reset_cpu(ulong addr);
-+
-+#ifdef CONFIG_OXNAS
-+#define TIMER_LOAD_VAL 0xffffUL
-+#else // CONFIG_OXNAS
- #define TIMER_LOAD_VAL 0xffffffff
-+#endif // CONFIG_OXNAS
- 
- /* macro to read the 32 bit timer */
- #ifdef CONFIG_OMAP
-@@ -53,6 +58,9 @@
- #ifdef CONFIG_VERSATILE
- #define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
- #endif
-+#ifdef CONFIG_OXNAS
-+#define READ_TIMER ((*(volatile ushort *)(CFG_TIMERBASE+4)) & 0xFFFFUL)  /* RPS timer value register has only 16 defined bits */
-+#endif
- 
- #ifdef CONFIG_USE_IRQ
- /* enable IRQ interrupts */
-@@ -212,6 +220,16 @@
- 	*(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD;	/* TimerValue */
- 	*(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
- #endif	/* CONFIG_VERSATILE */
-+#ifdef CONFIG_OXNAS
-+    // Setup timer 1 load value
-+    *(volatile ulong*)(CFG_TIMERBASE + 0) = TIMER_LOAD_VAL;
-+
-+    // Setup timer 1 prescaler, periodic operation and start it
-+    *(volatile ulong*)(CFG_TIMERBASE + 8) =
-+        (TIMER_PRESCALE_ENUM << TIMER_PRESCALE_BIT) |
-+        (TIMER_MODE_PERIODIC << TIMER_MODE_BIT) |
-+        (TIMER_ENABLE_ENABLE << TIMER_ENABLE_BIT);
-+#endif	/* CONFIG_OXNAS */
- 
- 	/* init the timestamp and lastdec value */
- 	reset_timer_masked();
-diff -Nurd u-boot-1.1.2/cpu/arm926ejs/start.S u-boot-1.1.2-oxe810/cpu/arm926ejs/start.S
---- u-boot-1.1.2/cpu/arm926ejs/start.S	2004-06-09 02:11:01.000000000 +0200
-+++ u-boot-1.1.2-oxe810/cpu/arm926ejs/start.S	2008-06-11 17:55:03.000000000 +0200
-@@ -94,6 +94,11 @@
- _TEXT_BASE:
- 	.word	TEXT_BASE
- 
-+#ifdef CONFIG_OXNAS
-+_EXCEPTION_BASE:
-+	.word	EXCEPTION_BASE
-+#endif
-+
- .globl _armboot_start
- _armboot_start:
- 	.word _start
-@@ -135,6 +140,18 @@
- 	orr	r0,r0,#0xd3
- 	msr	cpsr,r0
- 
-+#ifdef CONFIG_OXNAS
-+	/*
-+	 * Copy exception table to relocated address in internal SRAM
-+	 */
-+	adr	r0, _start				/* Address of exception table in flash */
-+	ldr	r1, _EXCEPTION_BASE		/* Relocated address of exception table */
-+	ldmia	r0!, {r3-r10}		/* Copy exception table and jump values from */
-+	stmia	r1!, {r3-r10}		/* FLASH to relocated address */
-+	ldmia	r0!, {r3-r10}
-+	stmia	r1!, {r3-r10}
-+#endif
-+
- 	/*
- 	 * we do sys-critical inits only at reboot,
- 	 * not when booting from ram!
-@@ -143,21 +160,21 @@
- 	bl	cpu_init_crit
- #endif
- 
--relocate:				/* relocate U-Boot to RAM	    */
--	adr	r0, _start		/* r0 <- current position of code   */
--	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
--	cmp     r0, r1                  /* don't reloc during debug         */
--	beq     stack_setup
-+relocate:					/* relocate U-Boot to RAM */
-+	adr	r0, _start			/* current position of code */
-+	ldr	r1, _TEXT_BASE		/* relocated position of code */
-+	cmp	r0, r1
-+	beq	stack_setup
- 
- 	ldr	r2, _armboot_start
- 	ldr	r3, _bss_start
--	sub	r2, r3, r2		/* r2 <- size of armboot            */
--	add	r2, r0, r2		/* r2 <- source end address         */
-+	sub	r2, r3, r2			/* r2 <- size of armboot */
-+	add	r2, r0, r2			/* r2 <- source end address */
- 
- copy_loop:
--	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
--	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
--	cmp	r0, r2			/* until source end addreee [r2]    */
-+	ldmia	r0!, {r3-r10}	/* copy from source address [r0] */
-+	stmia	r1!, {r3-r10}	/* copy to   target address [r1] */
-+	cmp	r0, r2				/* until source end addreee [r2] */
- 	ble	copy_loop
- 
- 	/* Set up the stack						    */
-@@ -212,7 +229,7 @@
- 	mrc	p15, 0, r0, c1, c0, 0
- 	bic	r0, r0, #0x00002300	/* clear bits 13, 9:8 (--V- --RS) */
- 	bic	r0, r0, #0x00000087	/* clear bits 7, 2:0 (B--- -CAM) */
--	orr	r0, r0, #0x00000002	/* set bit 2 (A) Align */
-+	orr	r0, r0, #0x00000002	/* set bit 1 (A) Align */
- 	orr	r0, r0, #0x00001000	/* set bit 12 (I) I-Cache */
- 	mcr	p15, 0, r0, c1, c0, 0
- 
-@@ -391,6 +408,7 @@
- 
- #endif
- 
-+#ifndef CONFIG_OXNAS
- 	.align	5
- .globl reset_cpu
- reset_cpu:
-@@ -405,3 +423,4 @@
- 
- rstctl1:
- 	.word	0xfffece10
-+#endif // !CONFIG_OXNAS
-diff -Nurd u-boot-1.1.2/drivers/cfi_flash.c u-boot-1.1.2-oxe810/drivers/cfi_flash.c
---- u-boot-1.1.2/drivers/cfi_flash.c	2004-12-18 23:35:45.000000000 +0100
-+++ u-boot-1.1.2-oxe810/drivers/cfi_flash.c	2008-06-11 17:55:31.000000000 +0200
-@@ -1056,7 +1056,11 @@
- 			}
- 			tmp = flash_read_long (info, 0,
- 					       FLASH_OFFSET_ERASE_REGIONS +
-+#ifdef FORCE_TOP_BOOT_FLASH
-+					       (num_erase_regions - 1 - i) * 4);
-+#else
- 					       i * 4);
-+#endif
- 			erase_region_size =
- 				(tmp & 0xffff) ? ((tmp & 0xffff) * 256) : 128;
- 			tmp >>= 16;
-@@ -1104,6 +1108,7 @@
- 	cfiptr_t ctladdr;
- 	cfiptr_t cptr;
- 	int flag;
-+	ulong start;
- 
- 	ctladdr.cp = flash_make_addr (info, 0, 0);
- 	cptr.cp = (uchar *) dest;
-@@ -1151,6 +1156,15 @@
- 		break;
- 	case FLASH_CFI_16BIT:
- 		cptr.wp[0] = cword.w;
-+		/* Wait for write to complete */
-+		start = get_timer (0);
-+		while (cptr.wp[0] != cword.w) {
-+			printf(".");
-+			if (get_timer (start) > info->erase_blk_tout * CFG_HZ) {
-+				printf ("Flash write timeout!");;
-+			}
-+		}
-+		printf("\n");
- 		break;
- 	case FLASH_CFI_32BIT:
- 		cptr.lp[0] = cword.l;
-diff -Nurd u-boot-1.1.2/drivers/ns16550.c u-boot-1.1.2-oxe810/drivers/ns16550.c
---- u-boot-1.1.2/drivers/ns16550.c	2004-06-07 01:13:57.000000000 +0200
-+++ u-boot-1.1.2-oxe810/drivers/ns16550.c	2008-06-11 17:55:31.000000000 +0200
-@@ -14,8 +14,25 @@
- #define MCRVAL (MCR_DTR | MCR_RTS)			/* RTS/DTR */
- #define FCRVAL (FCR_FIFO_EN | FCR_RXSR | FCR_TXSR)	/* Clear & enable FIFOs */
- 
-+#ifdef USE_UART_FRACTIONAL_DIVIDER
-+static int oxnas_fractional_divider(NS16550_t com_port, int baud_divisor)
-+{
-+	// Baud rate is passed around x16
-+	int real_divisor = baud_divisor >> 4;
-+	// Top three bits of 8-bit dlf register hold the number of eigths
-+	// for the fractional part of the divide ratio
-+	com_port->dlf = (unsigned char)(((baud_divisor - (real_divisor << 4)) << 4) & 0xFF);
-+	// Return the x1 divider for the normal divider register
-+	return real_divisor;
-+}
-+#endif // USE_UART_FRACTIONAL_DIVIDER
-+
- void NS16550_init (NS16550_t com_port, int baud_divisor)
- {
-+#ifdef USE_UART_FRACTIONAL_DIVIDER
-+	baud_divisor = oxnas_fractional_divider(com_port, baud_divisor);
-+#endif // USE_UART_FRACTIONAL_DIVIDER
-+
- 	com_port->ier = 0x00;
- #ifdef CONFIG_OMAP1510
- 	com_port->mdr1 = 0x7;	/* mode select reset TL16C750*/
-@@ -33,6 +50,10 @@
- 
- void NS16550_reinit (NS16550_t com_port, int baud_divisor)
- {
-+#ifdef USE_UART_FRACTIONAL_DIVIDER
-+	baud_divisor = oxnas_fractional_divider(com_port, baud_divisor);
-+#endif // USE_UART_FRACTIONAL_DIVIDER
-+
- 	com_port->ier = 0x00;
- 	com_port->lcr = LCR_BKSE;
- 	com_port->dll = baud_divisor & 0xff;
-diff -Nurd u-boot-1.1.2/drivers/serial.c u-boot-1.1.2-oxe810/drivers/serial.c
---- u-boot-1.1.2/drivers/serial.c	2003-08-30 00:00:47.000000000 +0200
-+++ u-boot-1.1.2-oxe810/drivers/serial.c	2008-06-11 17:55:31.000000000 +0200
-@@ -59,7 +59,13 @@
- 		return (26);		/* return 26 for base divisor */
- 	}
- #endif
--	return (CFG_NS16550_CLK / 16 / gd->baudrate);
-+
-+#ifdef USE_UART_FRACTIONAL_DIVIDER
-+	return (((CFG_NS16550_CLK << 4) / gd->baudrate) + 8) >> 4;	
-+#endif // USE_UART_FRACTIONAL_DIVIDER
-+
-+    // Round to nearest integer
-+    return (((CFG_NS16550_CLK / gd->baudrate) + 8 ) / 16);
- }
- 
- int serial_init (void)
-diff -Nurd u-boot-1.1.2/examples/Makefile u-boot-1.1.2-oxe810/examples/Makefile
---- u-boot-1.1.2/examples/Makefile	2004-10-10 23:27:33.000000000 +0200
-+++ u-boot-1.1.2-oxe810/examples/Makefile	2008-06-11 17:55:30.000000000 +0200
-@@ -30,7 +30,8 @@
- endif
- 
- ifeq ($(ARCH),arm)
--LOAD_ADDR = 0xc100000
-+#LOAD_ADDR = 0xc100000
-+LOAD_ADDR = 0x4C004000
- endif
- 
- ifeq ($(ARCH),mips)
-@@ -58,6 +59,11 @@
- SREC	= hello_world.srec
- BIN	= hello_world.bin hello_world
- 
-+ifeq ($(ARCH),arm)
-+SREC   += mem_test.srec
-+BIN    += mem_test.bin mem_test
-+endif
-+
- ifeq ($(ARCH),i386)
- SREC   += 82559_eeprom.srec
- BIN    += 82559_eeprom.bin 82559_eeprom
-@@ -115,10 +121,10 @@
- 	$(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) \
- 		-o $@ -e $(<:.o=) $< $(LIB) \
- 		-L$(gcclibdir) -lgcc
--%.srec:	%
-+%.srec:	%.o
- 	$(OBJCOPY) -O srec $< $@ 2>/dev/null
- 
--%.bin:	%
-+%.bin:	%.o
- 	$(OBJCOPY) -O binary $< $@ 2>/dev/null
- 
- #########################################################################
-diff -Nurd u-boot-1.1.2/examples/mem_test.c u-boot-1.1.2-oxe810/examples/mem_test.c
---- u-boot-1.1.2/examples/mem_test.c	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/examples/mem_test.c	2008-06-11 17:55:30.000000000 +0200
-@@ -0,0 +1,1322 @@
-+/*
-+ * (C) Copyright 2006
-+ * Oxford Semiconductor Ltd, www.oxsemi.com
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/********************* OPTIONS ********************************************************/
-+
-+#define ARM
-+/*
-+#define QUIET
-+#define SHORT
-+*/
-+
-+/********************* TEST DEFINITIONS ********************************************************/
-+
-+
-+#define NUM_PATTYPES 5
-+#define PATTYPE_A5     0
-+#define PATTYPE_5A     1
-+#define PATTYPE_NO_FF  2
-+#define PATTYPE_INCR   3
-+#define PATTYPE_DECR   4
-+
-+/* Number of words in a block (to ensure that neither data not ~data is 0xFFxx) */
-+
-+#ifdef SHORT
-+    #define BLOCKWORDS (254*4)
-+    #define BLOCKSIZE  (256*4)
-+#else
-+    #define BLOCKWORDS (254*256*4)
-+    #define BLOCKSIZE  (256*256*4)
-+#endif
-+
-+#ifdef ARM
-+    #include <common.h>
-+    #include <exports.h>
-+
-+    #define SDRAM_BASE  0x48000000
-+    #define SDRAM_TOP   0x49000000
-+    #define SDRAM_BLOCK 0x10000
-+//    #define SDRAM_WRITE(ADDR, DATA) printf("Write 0x%08x to 0x%08x\n", (DATA), (ADDR));
-+//    #define SDRAM_READ(ADDR, VAR) printf("Read from 0x%08x\n", (ADDR));
-+//    #define SDRAM_WRITE(ADDR, DATA) printf("Write 0x%08x to 0x%08x\n", (DATA), (ADDR)); (*((volatile unsigned int *)(ADDR)) = (DATA))
-+//    #define SDRAM_READ(ADDR, VAR)  printf("Read from 0x%08x\n", (ADDR)); (*(VAR) = *((volatile unsigned int *)(ADDR)))
-+    #define SDRAM_WRITE(ADDR, DATA) (*((volatile unsigned int *)(ADDR)) = (DATA))
-+    #define SDRAM_READ(ADDR, VAR)  (*(VAR) = *((volatile unsigned int *)(ADDR)))
-+#else
-+    #include <stdio.h>
-+    #include <stdlib.h>
-+    /* Not so much space - just 2 blocks from addr 0... */
-+    #define SDRAM_BASE  0
-+    #define SDRAM_TOP   (2 * BLOCKSIZE)
-+    #define SDRAM_BLOCK 0x10000
-+    #ifdef QUIET
-+        #define SDRAM_WRITE(ADDR, DATA)      array[ADDR] = (DATA)
-+        #define SDRAM_READ(ADDR, VAR)        *((volatile unsigned int *)(VAR)) = array[ADDR]
-+    #else
-+        #define SDRAM_WRITE(ADDR, DATA)      printf("WRITE(%08x)=%08x\n", ADDR, DATA); array[ADDR] = (DATA)
-+        #define SDRAM_READ(ADDR, VAR)        printf("READ (%08x)=%08x\n", ADDR, array[ADDR]); *((volatile unsigned int *)(VAR)) = array[ADDR]
-+    #endif
-+    unsigned volatile int array[SDRAM_TOP];
-+#endif
-+
-+
-+#define SYSCTRL_PRIMSEL_LO      0x4500000C
-+#define SYSCTRL_SECSEL_LO       0x45000014
-+#define SYSCTRL_TERSEL_LO       0x4500008C
-+#define SYSCTRL_PRIMSEL_HI      0x45000010
-+#define SYSCTRL_SECSEL_HI       0x45000018
-+#define SYSCTRL_TERSEL_HI       0x45000090
-+
-+/* GPIO */
-+#define GPIOB_IO_VAL       0x44100000
-+#define GPIOB_OE_VAL       0x44100004
-+#define GPIOB_SET_OE       0x4410001C
-+#define GPIOB_CLEAR_OE     0x44100020
-+#define GPIOB_OUTPUT_VAL   0x44100010
-+#define GPIOB_SET_OUTPUT   0x44100014
-+#define GPIOB_CLEAR_OUTPUT 0x44100018
-+#define GPIOB_BIT_34       0x00000004
-+
-+void configure_caches(void);
-+void report_err(unsigned int address, unsigned int bad_data, unsigned int correct_data, unsigned int iteration);
-+
-+/********************* TYPES.H ********************************************************/
-+
-+typedef unsigned int    UINT,  *PUINT;
-+/*
-+#ifndef __MY_BASIC_TYPES_H
-+#define __MY_BASIC_TYPES_H
-+
-+typedef signed char     CHAR,  *PCHAR;
-+typedef unsigned char   BYTE,   UCHAR,  *PBYTE, *PUCHAR;
-+typedef signed short    SHORT, *PSHORT;
-+typedef unsigned short  WORD,   USHORT, *PWORD, *PUSHORT;
-+typedef signed long     LONG,  *PLONG;
-+typedef unsigned long   DWORD, *PDWORD;
-+typedef int             BOOL,  *PBOOL;
-+typedef unsigned int    UINT,  *PUINT;
-+typedef void            VOID,  *PVOID;
-+
-+typedef float           SINGLE,*PSINGLE;
-+typedef double          DOUBLE,*PDOUBLE;
-+
-+
-+#define FALSE 0
-+#define TRUE  1
-+
-+#endif
-+*/
-+
-+/********************* CHIP.H ********************************************************/
-+
-+// Address Map
-+#define BOOT_ROM_BASE       0x00000000
-+#define USBHS_BASE          0x00200000
-+#define GMAC_BASE           0x00400000
-+#define PCI_BASE            0x00600000
-+#define PCI_DATA_BASE       0x00800000
-+#define STATIC0_BASE        0x01000000
-+#define STATIC1_BASE        0x01400000
-+#define STATIC2_BASE        0x01800000
-+#define STATIC_BASE         0x01C00000
-+#define SATA_DATA_BASE      0x02000000
-+#define DPE_DATA_BASE       0x03000000
-+#define GPIOA_BASE          0x04000000
-+#define GPIOB_BASE          0x04100000
-+#define UARTA_BASE          0x04200000
-+#define UARTB_BASE          0x04300000
-+#define I2C_MASTER_BASE     0x04400000
-+#define AUDIO_BASE          0x04500000
-+#define FAN_BASE            0x04600000
-+#define PWM_BASE            0x04700000
-+#define IR_RX_BASE          0x04800000
-+#define UARTC_BASE          0x04900000
-+#define UARTD_BASE          0x04A00000
-+#define SYS_CTRL_BASE       0x05000000
-+#define RPSA_BASE           0x05300000
-+#define  ARM_RPS_BASE  RPSA_BASE 
-+#define RPSC_BASE           0x05400000
-+#define AHB_MON_BASE        0x05500000
-+#define DMA_BASE            0x05600000
-+#define DPE_BASE            0x05700000
-+#define IBIW_BASE           0x05780000
-+#define DDR_BASE            0x05800000
-+#define SATA0_BASE          0x05900000
-+#define SATA1_BASE          0x05980000
-+#define DMA_CHKSUM_BASE     0x05A00000
-+#define COPRO_BASE          0x05B00000
-+#define SGDMA_BASE          0x05C00000
-+#define DDR_DATA_BASE       0x08000000
-+#define SRAM_BASE           0x0C000000
-+#define SRAM0_BASE          0x0C000000
-+#define SRAM1_BASE          0x0C002000
-+#define SRAM2_BASE          0x0C004000
-+#define SRAM3_BASE          0x0C006000
-+
-+// Virtual peripheral for TB sync
-+#define TB_SYNC_BASE        0x05F00100
-+
-+
-+/********************* DMA.H ********************************************************/
-+
-+
-+// DMA Control register settings
-+
-+#define DMA_FAIR_SHARE                  (1<<0)
-+#define DMA_IN_PROGRESS                 (1<<1)
-+
-+#define DMA_SDREQ_SATA                  (0<<2)
-+#define DMA_SDREQ_DPE_OUT               (2<<2)
-+#define DMA_SDREQ_UARTA_RX              (4<<2)
-+#define DMA_SDREQ_AUDIO_RX              (6<<2)
-+#define DMA_SDREQ_MEM                   (0xF<<2)
-+
-+#define DMA_DDREQ_SATA                  (0<<6)
-+#define DMA_DDREQ_DPE_IN                (1<<6)
-+#define DMA_DDREQ_UARTA_TX              (3<<6)
-+#define DMA_DDREQ_AUDIO_TX              (5<<6)
-+#define DMA_DDREQ_MEM                   (0xF<<6)
-+
-+#define DMA_INTERRUPT                   (1 << 10)
-+#define DMA_NEXT_FREE                   (1 << 11)
-+#define DMA_CH_RESET                    (1 << 12)
-+
-+#define DMA_DIR_ATOA                    (0 << 13)
-+#define DMA_DIR_BTOA                    (1 << 13)
-+#define DMA_DIR_ATOB                    (2 << 13)
-+#define DMA_DIR_BTOB                    (3 << 13)
-+
-+#define DMA_BURST_A                     (1 << 17)
-+#define DMA_BURST_B                     (1 << 18)
-+
-+#define DMA_SWIDTH_8                    (0 << 19)
-+#define DMA_SWIDTH_16                   (1 << 19)
-+#define DMA_SWIDTH_32                   (2 << 19)
-+
-+#define DMA_DWIDTH_8                    (0 << 22)
-+#define DMA_DWIDTH_16                   (1 << 22)
-+#define DMA_DWIDTH_32                   (2 << 22)
-+
-+#define DMA_PAUSE                       (1 << 25)
-+#define DMA_INT_ENABLE                  (1 << 26)
-+#define DMA_STARVE_LO_PRIORITY          (1 << 29)
-+#define DMA_NEW_INT_CLEAR               (1 << 30)
-+
-+#define DMA_FIXED_SADDR                 ((0 << 15) | (1 << 27))
-+#define DMA_INCR_SADDR                  ((1 << 15) | (0 << 27))
-+#define DMA_SEMI_FIXED_SADDR            ((0 << 15) | (0 << 27))
-+
-+#define DMA_FIXED_DADDR                 ((0 << 16) | (1 << 28))
-+#define DMA_INCR_DADDR                  ((1 << 16) | (0 << 28))
-+#define DMA_SEMI_FIXED_DADDR            ((0 << 16) | (0 << 28))
-+
-+#define DMA_BASE_CTRL                   (DMA_BURST_A | DMA_BURST_B | DMA_INT_ENABLE | DMA_NEW_INT_CLEAR)
-+
-+// Common base setups
-+
-+#define DMA_CTRL_A32TOA32               ( DMA_BASE_CTRL | DMA_DIR_ATOA | DMA_SWIDTH_32 | DMA_DWIDTH_32 )
-+#define DMA_CTRL_B32TOA32               ( DMA_BASE_CTRL | DMA_DIR_BTOA | DMA_SWIDTH_32 | DMA_DWIDTH_32 )
-+#define DMA_CTRL_A32TOB32               ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_32 | DMA_DWIDTH_32 )
-+#define DMA_CTRL_B32TOB32               ( DMA_BASE_CTRL | DMA_DIR_BTOB | DMA_SWIDTH_32 | DMA_DWIDTH_32 )
-+
-+#define DMA_CTRL_A8TOB32                ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_8  | DMA_DWIDTH_32 )
-+#define DMA_CTRL_B32TOA8                ( DMA_BASE_CTRL | DMA_DIR_BTOA | DMA_SWIDTH_32 | DMA_DWIDTH_8  )
-+#define DMA_CTRL_A32TOB8                ( DMA_BASE_CTRL | DMA_DIR_ATOB | DMA_SWIDTH_32 | DMA_DWIDTH_8  )
-+
-+// Most likely transactions
-+
-+#define DMA_CTRL_MEM_TO_MEM_AA          ( DMA_CTRL_A32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_MEM_AB          ( DMA_CTRL_A32TOB32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_MEM_BB          ( DMA_CTRL_B32TOB32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_MEM_BA          ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_MEM             ( DMA_CTRL_MEM_TO_MEM_AB ) 
-+
-+//DMA A-A
-+#define DMA_CTRL_SATA_TO_MEM_AA         ( DMA_CTRL_A32TOA32 | DMA_SDREQ_SATA     | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_SATA_AA         ( DMA_CTRL_A32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_SATA     | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+
-+#define DMA_CTRL_SATA_TO_MEM            ( DMA_CTRL_A32TOB32 | DMA_SDREQ_SATA     | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_SATA            ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_SATA     | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_SATA_TO_DPE            ( DMA_CTRL_A32TOA32 | DMA_SDREQ_SATA     | DMA_DDREQ_DPE_IN   | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_DPE_TO_SATA            ( DMA_CTRL_A32TOA32 | DMA_SDREQ_DPE_OUT  | DMA_DDREQ_SATA     | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_DPE             ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_DPE_IN   | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_DPE_TO_MEM             ( DMA_CTRL_A32TOB32 | DMA_SDREQ_DPE_OUT  | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_PCI_TO_MEM             ( DMA_CTRL_A32TOB32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+
-+#define DMA_CTRL_MEM_TO_PCI             ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_MEM      | DMA_INCR_SADDR       | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_AUDIO           ( DMA_CTRL_B32TOA32 | DMA_SDREQ_MEM      | DMA_DDREQ_AUDIO_TX | DMA_INCR_SADDR       | DMA_FIXED_DADDR )
-+#define DMA_CTRL_AUDIO_TO_MEM           ( DMA_CTRL_A32TOB32 | DMA_SDREQ_AUDIO_RX | DMA_DDREQ_MEM      | DMA_FIXED_SADDR      | DMA_INCR_DADDR )
-+#define DMA_CTRL_MEM_TO_UART            ( DMA_CTRL_B32TOA8  | DMA_SDREQ_MEM      | DMA_DDREQ_UARTA_TX | DMA_INCR_SADDR       | DMA_FIXED_DADDR )
-+#define DMA_CTRL_UART_TO_MEM            ( DMA_CTRL_A8TOB32  | DMA_SDREQ_UARTA_RX | DMA_DDREQ_MEM      | DMA_FIXED_SADDR      | DMA_INCR_DADDR )
-+
-+// Byte count register flags
-+
-+#define DMA_HBURST_EN                   (1<<28)
-+#define DMA_WR_BUFFERABLE               (1<<29)
-+#define DMA_WR_EOT                      (1<<30)
-+#define DMA_RD_EOT                      (1<<31)
-+
-+
-+// Pause the DMA channel specified
-+void PauseDMA( UINT channel );
-+
-+// UnPause the DMA channel specified
-+void UnPauseDMA( UINT channel );
-+
-+// Configure a DMA
-+void SetupDMA( UINT channel,
-+               UINT src_addr,
-+               UINT dest_addr,
-+               UINT byte_count,
-+               UINT control,
-+               UINT flags );
-+
-+// Wait while the given DMA channel is busy
-+void WaitWhileDMABusy( UINT channel );
-+
-+// Perform a memory to memory copy
-+void DMAMemCopy ( UINT channel,
-+                  UINT src_addr,
-+                  UINT dest_addr,
-+                  UINT byte_count );
-+
-+
-+/****************************** MAIN ***********************************************/
-+#ifdef ARM
-+int mem_test(int argc, char* argv[])
-+#else
-+int main(int argc, char* argv[])
-+#endif
-+{
-+    unsigned int i;
-+    unsigned int iteration;
-+    unsigned int block_base;
-+    unsigned int datapattern;
-+    unsigned int correct_data;
-+    unsigned volatile int read_data;
-+    unsigned int pattype, starting_pattype;
-+    unsigned int end_addr;
-+    unsigned int row, col, bank;
-+
-+#ifdef ARM
-+    /* Print the ABI version */
-+    app_startup(argv);
-+    printf ("Example expects ABI version %d\n", XF_VERSION);
-+    printf ("Actual U-Boot ABI version %d\n", (int)get_version());
-+
-+    printf("GPIO34 is output, low\n");
-+    * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34;
-+    * (volatile unsigned int *) GPIOB_SET_OE       = GPIOB_BIT_34;
-+#endif
-+
-+//    configure_caches();
-+//printf("Caches enabled\n");
-+
-+    /* ******************************************************************* */
-+    printf("DMA TEST.\n" );
-+    /* ******************************************************************* */
-+
-+
-+    #define DMA0_CTRL_STAT    0x45A00000
-+    #define DMA0_SRC_BASE     0x45A00004
-+    #define DMA0_DEST_BASE    0x45A00008
-+    #define DMA0_BYTE_COUNT   0x45A0000C
-+    #define DMA0_CURRENT_BYTE 0x45A00018
-+
-+    printf("Test to top of 1st SDRAM" );
-+    #define BLOCK_BYTES 0x20000
-+    #define SDRAM_STOP SDRAM_TOP
-+
-+    for (iteration=0; 1; iteration++) {
-+
-+        if ((iteration % 5)==0)
-+            printf("Iteration %d\n", iteration );
-+
-+//        printf("Write pattern into first block.\n" );
-+        end_addr = SDRAM_BASE + BLOCK_BYTES;
-+        for (i=SDRAM_BASE; i < end_addr; i=i+4) {
-+            SDRAM_WRITE( i, i);
-+        }
-+
-+//        printf("Clear last block and a few blocks more - easy to see on LA.\n" );
-+        end_addr = SDRAM_BASE + (BLOCK_BYTES << 3);
-+        for (i=SDRAM_STOP - BLOCK_BYTES; i < end_addr; i=i+4) {
-+            SDRAM_WRITE( i, 0);
-+        }
-+
-+        end_addr = SDRAM_STOP - BLOCK_BYTES;
-+        for (i=SDRAM_BASE; i < end_addr; i=i+BLOCK_BYTES) {
-+
-+//            printf("DMA transfer from %08x to %08x.\n", i, i + BLOCK_BYTES );
-+#ifdef ARM
-+            DMAMemCopy ( 0, i, i + BLOCK_BYTES, BLOCK_BYTES );
-+#endif
-+//            printf("...pending.\n" );
-+#ifdef ARM
-+            WaitWhileDMABusy( 0 );
-+#endif
-+//            printf("...complete.\n" );
-+        }
-+
-+//        printf("Verify pattern in last block.\n" );
-+        end_addr = SDRAM_STOP;
-+        correct_data = SDRAM_BASE;
-+        for (i=SDRAM_STOP - BLOCK_BYTES; i < end_addr; i=i+4) {
-+            SDRAM_READ( i, &read_data);
-+            if (read_data != correct_data)
-+            {
-+            /* Expand out the report_err function to avoid the stack operations. */
-+            #ifdef ARM
-+                /* ASSERT GPIO */
-+                * (volatile unsigned int *) GPIOB_SET_OUTPUT = GPIOB_BIT_34;
-+            #endif
-+
-+                /* REPORT ERROR */
-+                printf("Wrong on [%08x]= %08x should be %08x on iteration %d\n", i, read_data, correct_data, iteration );
-+
-+                /* WRITE TO ANOTHER LOCATION */
-+                SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+                /* READ AGAIN */
-+                SDRAM_READ(i, &read_data);
-+                if (read_data != correct_data)
-+                    printf("Again 1  [%08x]= %08x should be %08x\n", i, read_data, correct_data );
-+
-+                /* WRITE TO ANOTHER LOCATION */
-+                SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+                /* READ AGAIN */
-+                SDRAM_READ(i, &read_data);
-+                if (read_data != correct_data)
-+                    printf("Again 2  [%08x]= %08x should be %08x\n", i, read_data, correct_data );
-+
-+                /* WRITE TO ANOTHER LOCATION */
-+                SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+                /* READ AGAIN */
-+                SDRAM_READ(i, &read_data);
-+                if (read_data != correct_data)
-+                    printf("Again 3  [%08x]= %08x should be %08x\n", i, read_data, correct_data );
-+
-+                row = (((i >> 26) & 0x1) << 13) | (((i >> 23) & 0x3) << 11) | ((i >> 10) & 0x7FF); /* [26], [24:23], [20:10]*/
-+                col = (((i >> 27) & 0x1) << 10) | (((i >> 25) & 0x1) << 9) | (((i >> 22) & 0x1) << 8); /* [27], [25], [22]... */
-+                col |= (((i >> 6) & 0xF) << 4) | (((i >> 21) & 0x1) << 3) | (((i >> 1) & 0x3) << 1); /* ...[9:8], [21], [3:2], '0' */
-+                col |= 0x800; /* bit 11 set for auto-precharge */
-+                bank = (i >> 4) & 0x3; /* [5:4] */
-+                printf("Bank   %08x\n", bank );
-+                printf("Row    %08x\n", row );
-+                printf("Column %08x\n", col );
-+            #ifdef ARM
-+                /* DEASSERT GPIO */
-+                * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34;
-+            #endif
-+            }
-+
-+
-+            correct_data += 4;
-+        }
-+    }
-+
-+
-+    /* ******************************************************************* */
-+    printf("MEM_TEST2\n");
-+    /* ******************************************************************* */
-+
-+
-+    pattype=0;
-+    iteration=0;
-+
-+    for (;;) { 
-+        /* FOR EACH 64Kword==256KB BLOCK IN 16Mword=64MB (2 OFF 16M16) MEMORY... */
-+
-+#ifdef SHORT
-+        if ((iteration % 5)==0)
-+            printf("Iteration %d\n", iteration );
-+#else
-+        if ((iteration % 1000)==0)
-+            printf("Iteration %d\n", iteration );
-+#endif
-+
-+        /* WRITE DATA BLOCKS */
-+        starting_pattype = pattype; /* Record for later */
-+
-+        for (block_base=SDRAM_BASE; block_base < SDRAM_TOP; block_base=block_base + BLOCKSIZE) {
-+	    switch (pattype) {
-+	    case PATTYPE_A5 :
-+                /* Write alternating 1s and 0s... */
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_WRITE( i, 0xaa55aa55);
-+                }
-+                break;
-+	    case PATTYPE_5A :
-+                /* Write alternating 1s and 0s (inverse of above)... */
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_WRITE( i, 0x55aa55aa);
-+                }
-+                break;
-+	    case PATTYPE_NO_FF : 
-+                /* Write data=address with bit[n+16]=~bit[n]... */
-+                datapattern = 0x0100FEFF;
-+                /* In range 0x0100...0xFEFF so that
-+                    a. temp[15:8] is never 0xFF
-+                    b. Inverse of temp[15:8] is never 0xFF
-+                */
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_WRITE( i, datapattern);
-+                    datapattern = datapattern + 0xFFFF;
-+                }
-+                break;
-+	    case PATTYPE_INCR : 
-+                /* Write data=address... */
-+                end_addr = block_base + BLOCKSIZE;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_WRITE( i, i);
-+                }
-+                break;
-+	    case PATTYPE_DECR : 
-+                /* Write data=~address... */
-+                end_addr = block_base + BLOCKSIZE;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_WRITE( i, ~i);
-+                }
-+                break;
-+            }
-+        }
-+
-+        /* VERIFY DATA BLOCKS */
-+        pattype = starting_pattype; /* Reset to same as for writes */
-+
-+        for (block_base=SDRAM_BASE; block_base < SDRAM_TOP; block_base=block_base + BLOCKSIZE) {
-+	    switch (pattype) {
-+	    case PATTYPE_A5 :
-+                correct_data = 0xaa55aa55;
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_READ( i, &read_data);
-+                    if (read_data != correct_data)
-+                        report_err(i, read_data, correct_data, iteration);
-+                }
-+                break;
-+	    case PATTYPE_5A :
-+                correct_data = 0x55aa55aa;
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_READ( i, &read_data);
-+                    if (read_data != correct_data)
-+                        report_err(i, read_data, correct_data, iteration);
-+                }
-+                break;
-+	    case PATTYPE_NO_FF :
-+                correct_data = 0x0100FEFF;
-+                end_addr = block_base + BLOCKWORDS;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_READ( i, &read_data);
-+                    if (read_data != correct_data)
-+                        report_err(i, read_data, correct_data, iteration);
-+                    correct_data = correct_data + 0xFFFF;
-+                }
-+                break;
-+	    case PATTYPE_INCR :
-+                end_addr = block_base + BLOCKSIZE;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_READ( i, &read_data);
-+                    if (read_data != i)
-+                        report_err(i, read_data, i, iteration);
-+                }
-+                break;
-+	    case PATTYPE_DECR :
-+                end_addr = block_base + BLOCKSIZE;
-+                for (i=block_base; i < end_addr; i=i+4) {
-+                    SDRAM_READ( i, &read_data);
-+                    if (read_data != ~i)
-+                        report_err(i, read_data, ~i, iteration);
-+                }
-+                break;
-+            }
-+        }
-+
-+	pattype = pattype + 1;
-+	if (pattype >= NUM_PATTYPES) { pattype = 0; }
-+        ++iteration;
-+    }
-+
-+    return 0;
-+}
-+
-+/********************* REPORT ERROR FUNC ********************************************************/
-+
-+void report_err(unsigned int address, unsigned int bad_data, unsigned int correct_data, unsigned int iteration)
-+{
-+    volatile unsigned int readvalue;
-+
-+#ifdef ARM
-+    /* ASSERT GPIO */
-+    * (volatile unsigned int *) GPIOB_SET_OUTPUT = GPIOB_BIT_34;
-+#endif
-+
-+    /* REPORT ERROR */
-+    printf("Wrong on [%08x]= %08x should be %08x on iteration %d\n", address, bad_data, correct_data, iteration );
-+
-+    /* WRITE TO ANOTHER LOCATION */
-+    SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+    /* READ AGAIN */
-+    SDRAM_READ(address, &readvalue);
-+    if (readvalue != correct_data)
-+        printf("Again 1  [%08x]= %08x should be %08x\n", address, readvalue, correct_data );
-+
-+    /* WRITE TO ANOTHER LOCATION */
-+    SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+    /* READ AGAIN */
-+    SDRAM_READ(address, &readvalue);
-+    if (readvalue != correct_data)
-+        printf("Again 2  [%08x]= %08x should be %08x\n", address, readvalue, correct_data );
-+
-+    /* WRITE TO ANOTHER LOCATION */
-+    SDRAM_WRITE(SDRAM_BASE, 0xFFFFFFFF);
-+
-+    /* READ AGAIN */
-+    SDRAM_READ(address, &readvalue);
-+    if (readvalue != correct_data)
-+        printf("Again 3  [%08x]= %08x should be %08x\n", address, readvalue, correct_data );
-+
-+#ifdef ARM
-+    /* DEASSERT GPIO */
-+    * (volatile unsigned int *) GPIOB_CLEAR_OUTPUT = GPIOB_BIT_34;
-+#endif
-+
-+} /* end of report_err */
-+
-+
-+
-+
-+/********************* DMA.C FUNCTIONS ********************************************************/
-+
-+void ResetDMA( UINT channel ) {
-+    
-+    // Clear and abort the dma channel
-+    
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    dma[0] =  (1 << 12);
-+    dma[0] &=  ~(1 << 12);
-+}
-+
-+
-+
-+
-+void PauseDMA( UINT channel ) {
-+    
-+    // Pause the DMA channel specified
-+    
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    UINT  rd;
-+    
-+    rd = dma[0];
-+    
-+    rd |= DMA_PAUSE;
-+    
-+    dma[0] = rd;
-+}
-+
-+
-+
-+
-+void UnPauseDMA( UINT channel ) {
-+    
-+    // UnPause the DMA channel specified
-+    
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    UINT  rd;
-+    
-+    rd = dma[0];
-+    
-+    rd &= ~DMA_PAUSE;
-+    
-+    dma[0] = rd;
-+}
-+
-+
-+
-+
-+void SetupDMA( UINT channel,
-+               UINT src_addr,
-+               UINT dest_addr,
-+               UINT byte_count,
-+               UINT control,
-+               UINT flags ) {
-+
-+    // Configure a DMA
-+    
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    
-+    dma[0] = control;
-+    dma[1] = src_addr;
-+    dma[2] = dest_addr;
-+    dma[3] = byte_count | (flags & 0xF0000000);
-+}
-+
-+// EXAMPLE:
-+//
-+// DMA 2kB from SRAM to SATA core with a write EOT set, and HBURST enabled, using DMA channel 2
-+// Then wait for the DMA to complete
-+//
-+//   SetupDMA ( 2 , 0x4C001100, BASE_SATA, 2048, DMA_CTRL_MEM_TO_SATA, WR_EOT | DMA_HBURST_EN );
-+//   WaitWhileDMABusy( 2 );
-+
-+int DMABusy(UINT channel)
-+{
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    return (dma[0] & DMA_IN_PROGRESS ? 1 : 0);
-+}
-+
-+
-+void WaitWhileDMABusy( UINT channel ) // Wait while the given DMA channel is busy
-+{
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    while (dma[0] & DMA_IN_PROGRESS) ; // Do Nothing
-+}
-+
-+void DMAClearIRQ(UINT channel) 
-+{
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    dma[4] = 1; // write any value to offset 0x10 (16 / 4 => 4) 
-+
-+}
-+
-+void DMAMemCopy ( UINT channel,
-+                  UINT src_addr,
-+                  UINT dest_addr,
-+                  UINT byte_count ) {
-+    
-+    // Perform a memory to memory copy
-+    
-+    volatile PUINT dma = (PUINT) (DMA_BASE + (channel << 5));
-+    
-+    // Choose fastest configuration possible for required transfer
-+    
-+    if (src_addr < SRAM_BASE) {
-+        if (dest_addr < SRAM_BASE) {
-+            dma[0] = DMA_CTRL_MEM_TO_MEM_AA; // Src and Dest must use A
-+        } else {
-+            dma[0] = DMA_CTRL_MEM_TO_MEM_AB; // Src must use A
-+        }
-+    } else {
-+        if (dest_addr < SRAM_BASE) {
-+            dma[0] = DMA_CTRL_MEM_TO_MEM_BA; // Dest must use A
-+        } else {
-+            dma[0] = DMA_CTRL_MEM_TO_MEM_AB; // No restriction
-+        }
-+    }
-+    
-+    dma[1] = src_addr;
-+    dma[2] = dest_addr;
-+    dma[3] = byte_count | DMA_WR_BUFFERABLE | DMA_HBURST_EN;
-+    
-+    WaitWhileDMABusy( channel );
-+}
-+ 
-+
-+
-+
-+
-+
-+
-+#define CP15R1_M_ENABLE 0x0001 // MMU Enable
-+#define CP15R1_A_ENABLE 0x0002 // Address alignment fault enable
-+#define CP15R1_C_ENABLE 0x0004 // (data) cache enable
-+#define CP15R1_W_ENABLE 0x0008 // write buffer enable
-+#define CP15R1_PROG32   0x0010 // PROG32
-+#define CP15R1_DATA32   0x0020 // DATA32
-+#define CP15R1_L_ENABLE 0x0040 // Late abort on earlier CPUs
-+#define CP15R1_BIGEND   0x0080 // Big-endian (=1), little-endian (=0)
-+#define CP15R1_SYSTEM   0x0100 // System bit, modifies MMU protections
-+#define CP15R1_ROM      0x0200 // ROM bit, modifies MMU protections
-+#define CP15R1_F        0x0400 // Should Be Zero
-+#define CP15R1_Z_ENABLE 0x0800 // Branch prediction enable on 810
-+#define CP15R1_I_ENABLE 0x1000 // Instruction cache enable
-+#define CP15R1_RESERVED 0x00000078
-+#define CP15R2_RESERVED 0xFFFFC000
-+
-+#define NUM_DOMAINS 16
-+
-+#define DAV_NO_ACCESS 0
-+#define DAV_CLIENT    1
-+#define DAV_RESERVED  2
-+#define DAV_MANAGER   3
-+#define NUM_DOMAIN_ACCESS_VALUES 4
-+
-+#define AP_LEVEL_0 0
-+#define AP_LEVEL_1 0
-+#define AP_LEVEL_2 0
-+#define AP_LEVEL_3 0
-+#define NUM_ACCESS_PERMISSIONS 4
-+
-+#define FAULT_ID 0
-+
-+#define FLD_COURSE_ID  1
-+#define FLD_SECTION_ID 2
-+#define FLD_FINE_ID    3
-+
-+#define FD_USER_DATA_BIT 2
-+
-+#define FD_USER_DATA_NUM_BITS 30
-+
-+#define SD_BUFFERABLE_BIT 2
-+#define SD_CACHEABLE_BIT  3
-+#define SD_IMP_BIT        4
-+#define SD_DOMAIN_BIT     5
-+#define SD_AP_BIT         10
-+#define SD_ADDRESS_BIT    20
-+
-+#define SD_DOMAIN_NUM_BITS  4
-+#define SD_AP_NUM_BITS      2
-+
-+void CoPro15Regs_SetCP15Reg1(const unsigned long mask) {
-+    asm volatile(
-+        "MOV  r0, %0;"
-+        "MRC  p15, 0, r1, c1, c0, 0;"
-+        "ORR  r1,r1,r0;"
-+        "MCR  p15, 0, r1, c1, c0, 0;"
-+        :
-+        : "r" (mask | CP15R1_RESERVED)
-+        : "r0","r1");
-+}
-+
-+void CoPro15Regs_ClearCP15Reg1(const unsigned long mask) {
-+    asm volatile(
-+        "MOV  r0, %0;"
-+        "MRC  p15, 0, r1, c1, c0, 0;"
-+        "BIC  r1,r1,r0;"
-+        "MCR  p15, 0, r1, c1, c0, 0;"
-+        :
-+        : "r" (mask)
-+        : "r0","r1");
-+}
-+
-+unsigned long CoPro15Regs_GetCP15Reg1(const unsigned long mask) {
-+    unsigned long value;
-+    asm volatile(
-+        "MRC  p15, 0, r1, c1, c0, 0;"
-+        "MOV  r0, %1;"
-+        "BIC  %0,r1,r0; "
-+        : "=r" (value)
-+        : "r" (mask)
-+        : "r0","r1");
-+    return value;
-+}
-+
-+unsigned long CoPro15Regs_GetCP15Reg2(void) {
-+    unsigned long value;
-+    asm volatile(
-+        "MRC  p15, 0, r0, c2, c0, 0;"
-+        "MOV  %0, r0;"
-+        : "=r" (value)
-+        :
-+        : "r0");
-+    return value & CP15R2_RESERVED;
-+}
-+
-+unsigned long CoPro15Regs_GetCP15Reg3(void) {
-+    unsigned long value;
-+    asm volatile(
-+        "MRC  p15, 0, r0, c3, c0, 0;"
-+        "MOV  %0, r0;"
-+        : "=r" (value)
-+        :
-+        : "r0");
-+    return value;
-+}
-+
-+void CoPro15Regs_SetCP15Reg3(unsigned long value) {
-+    asm volatile(
-+        "MOV  r0, %0;"
-+        "MCR  p15, 0, r0, c3, c0, 0;"
-+        :
-+        : "r" (value)
-+        : "r0");
-+}
-+
-+void CoPro15Regs_SetCP15Reg2(unsigned long value) {
-+    asm volatile(
-+        "MOV  r0, %0;"
-+        "MCR  p15, 0, r0, c2, c0, 0;"
-+        :
-+        : "r" (value & CP15R2_RESERVED)
-+        : "r0");
-+}
-+
-+void Cache_CleanDataCache(void)
-+{
-+    // Clean the data cache - usually precedes a data cache invalidation.
-+    // Forces the data cache content to be written to main memory - only
-+    // required if using write-back data cache
-+    asm volatile(
-+        "MOV  r3,pc;"
-+        "LDR  r1, =0;"
-+        "  MOV  r4,pc;"
-+        "  LDR  r0, =0;"
-+        "    ORR  r2, r1, r0;"
-+        "    MCR  p15, 0, r2, c7, c10, 2 ;"     // I (BHC) think that this should be c10, 2 not c14, 1 -- See ARM ARM
-+        "    ADD  r0, r0, #0x10;"
-+        "    CMP  r0,#0x40;"
-+        "  BXNE  r4;"
-+        "  ADD  r1, r1, #0x04000000;"
-+        "  CMP  r1, #0x0;"
-+        "BXNE  r3;"
-+        :
-+        :
-+        : "r0","r1","r2","r3","r4");
-+}
-+
-+void Cache_DrainWriteBuffer(void)
-+{
-+    // Forces the write buffer to update to main memory
-+    asm volatile(
-+        "LDR  r1, =0;"
-+        "MCR  p15, 0, r1, c7, c10, 4 ;"
-+        :
-+        :
-+        : "r1");
-+}
-+
-+void Cache_FlushPrefetchBuffer(void)
-+{
-+    // Forces the CPU to flush the instruction prefetch buffer
-+    asm volatile(
-+        "LDR  r1, =0;"
-+        "MCR  p15, 0, r1, c7, c5, 4 ;"
-+        :
-+        :
-+        : "r1");
-+}
-+
-+void Cache_InvalidateDataCache(void)
-+{
-+    asm volatile(
-+        "LDR  r1, =0;"
-+        "MCR  p15, 0, r1, c7, c6, 0;"
-+        :
-+        :
-+        : "r1");
-+}
-+
-+void Cache_InvalidateInstructionCache(void)
-+{
-+    asm volatile(
-+        "LDR  r1, =0;"
-+        "MCR  p15, 0, r1, c7, c5, 0;"
-+        :
-+        :
-+        : "r1");
-+}
-+
-+void Cache_InstOn(void)
-+{
-+    // Invalidate the instruction cache, in case there's anything
-+    // left from when it was last enabled
-+    Cache_InvalidateInstructionCache();
-+
-+    // Enable the instruction cache
-+    CoPro15Regs_SetCP15Reg1(CP15R1_I_ENABLE);
-+}
-+
-+void Cache_InstOff(void)
-+{
-+    // Disable the instruction cache
-+    CoPro15Regs_ClearCP15Reg1(CP15R1_I_ENABLE);
-+}
-+
-+void Cache_DataOn(void)
-+{
-+    // Invalidate the data cache, in case there's anything left from when
-+    // it was last enabled
-+    Cache_InvalidateDataCache();
-+
-+    // Enable the data cache
-+    CoPro15Regs_SetCP15Reg1(CP15R1_C_ENABLE);
-+}
-+
-+void Cache_DataOff(void)
-+{
-+    // Ensure all data in data cache or write buffer is written to memory
-+    Cache_CleanDataCache();
-+    Cache_DrainWriteBuffer();
-+
-+    // Disable the data cache
-+    CoPro15Regs_ClearCP15Reg1(CP15R1_C_ENABLE);
-+}
-+
-+void Cache_WriteBufferOn(void)
-+{
-+    // Enable the write buffer
-+    CoPro15Regs_SetCP15Reg1(CP15R1_W_ENABLE);
-+}
-+
-+void Cache_WriteBufferOff(void)
-+{
-+    // Ensure all data in the write buffer is written to memory
-+    Cache_DrainWriteBuffer();
-+
-+    // Disable the write buffer
-+    CoPro15Regs_ClearCP15Reg1(CP15R1_W_ENABLE);
-+}
-+
-+int MMU_SetDomainAccessValue(
-+    int domainNumber,
-+    int value) {
-+    int status = 0;
-+    if ((value < NUM_DOMAIN_ACCESS_VALUES) && (domainNumber < NUM_DOMAINS))
-+    {
-+        // Insert the 2-bit domain field into the slot for the specified domain
-+        unsigned long registerContents = CoPro15Regs_GetCP15Reg3();
-+        registerContents &= ~(3UL << (2*domainNumber));
-+        registerContents |= ((unsigned long)value << (2*domainNumber));
-+        CoPro15Regs_SetCP15Reg3(registerContents);
-+        status = 1;
-+    }
-+    return status;
-+}
-+
-+void MMU_SetAlignmentChecked(int alignmentChecked) {
-+    alignmentChecked ? CoPro15Regs_SetCP15Reg1(CP15R1_A_ENABLE) : CoPro15Regs_ClearCP15Reg1(CP15R1_A_ENABLE);
-+}
-+
-+void MMU_SetEnabled(int enabled) {
-+    enabled ? CoPro15Regs_SetCP15Reg1(CP15R1_M_ENABLE) : CoPro15Regs_ClearCP15Reg1(CP15R1_M_ENABLE);
-+}
-+void MMU_InvalidateDataTLB(void)
-+{
-+    asm volatile(
-+        "MCR  p15, 0, r0, c8, c6, 0;"
-+        :
-+        :
-+        : "r0");
-+}
-+
-+void MMU_InvalidateInstructionTLB(void)
-+{
-+    asm volatile(
-+        "MCR  p15, 0, r0, c8, c5, 0;"
-+        :
-+        :
-+        : "r0");
-+}
-+
-+void MMU_SetROMPermission(int rOM_Permitted) {
-+    rOM_Permitted ? CoPro15Regs_SetCP15Reg1(CP15R1_ROM) : CoPro15Regs_ClearCP15Reg1(CP15R1_ROM);
-+}
-+
-+void MMU_SetSystemPermission(int systemPermitted) {
-+    systemPermitted ? CoPro15Regs_SetCP15Reg1(CP15R1_SYSTEM) : CoPro15Regs_ClearCP15Reg1(CP15R1_SYSTEM);
-+}
-+
-+void MMU_SetTranslationTableBaseAddress(unsigned long *baseAddress) {
-+    CoPro15Regs_SetCP15Reg2((unsigned long)baseAddress);
-+}
-+
-+unsigned long SetBit(
-+    unsigned long source,
-+    int           state,
-+    int           offset)
-+{
-+    source = state ? (source | (1UL << offset)) :
-+                     (source & ~(1UL << offset));
-+    return source;
-+}
-+
-+unsigned long SetField(
-+    unsigned long source,
-+    unsigned long newFieldContents,
-+    int           offset,
-+    int           length)
-+{
-+    unsigned long mask = (1UL << length) - 1;
-+    source &= ~(mask << offset);
-+    source |= ((newFieldContents & mask) << offset);
-+    return source;
-+}
-+
-+unsigned long FD_SetUserData(
-+    unsigned long userData,
-+    unsigned long descriptor)
-+{
-+    return SetField(descriptor, userData, FD_USER_DATA_BIT, FD_USER_DATA_NUM_BITS);
-+}
-+
-+unsigned long FLPT_CreateFaultDescriptor(unsigned long userData)
-+{
-+    unsigned long descriptor = FAULT_ID;
-+    descriptor = FD_SetUserData(userData, descriptor);
-+    return descriptor;
-+}
-+
-+void FLPT_InsertFaultDescriptor(
-+    unsigned long *tableBaseAdr,
-+    int            index,
-+    unsigned long  descriptor)
-+{
-+    *(tableBaseAdr + index) = descriptor;
-+}
-+
-+unsigned long SD_SetAccessPermission(
-+    int           ap,
-+    unsigned long descriptor)
-+{
-+    return SetField(descriptor, ap, SD_AP_BIT, SD_AP_NUM_BITS);
-+}
-+
-+unsigned long SD_SetBaseAddress(
-+    unsigned long baseAddress,
-+    unsigned long descriptor)
-+{
-+    unsigned long mask = ~0UL << SD_ADDRESS_BIT;
-+    baseAddress &= mask;
-+    descriptor &= ~mask;
-+    descriptor |= baseAddress;
-+    return descriptor;
-+}
-+
-+unsigned long SD_SetBufferable(
-+    int           bufferable,
-+    unsigned long descriptor)
-+{
-+    return SetBit(descriptor, bufferable, SD_BUFFERABLE_BIT);
-+}
-+
-+unsigned long SD_SetCacheable(
-+    int           cacheable,
-+    unsigned long descriptor)
-+{
-+    return SetBit(descriptor, cacheable, SD_CACHEABLE_BIT);
-+}
-+
-+unsigned long SD_SetDomain(
-+    int           domain,
-+    unsigned long descriptor)
-+{
-+    return SetField(descriptor, domain, SD_DOMAIN_BIT, SD_DOMAIN_NUM_BITS);
-+}
-+
-+unsigned long SD_SetImplementationDefined(
-+    unsigned long implementationDefined,
-+    unsigned long descriptor)
-+{
-+    return SetBit(descriptor, implementationDefined, SD_IMP_BIT);
-+}
-+
-+unsigned long FLPT_CreateSectionDescriptor(
-+    unsigned long baseAddress,
-+    unsigned char domain,
-+    int           implementationDefined,
-+    int           ap,
-+    int           bufferable,
-+    int           cacheable)
-+{
-+    unsigned long descriptor = FLD_SECTION_ID;
-+    descriptor = SD_SetAccessPermission(ap, descriptor);
-+    descriptor = SD_SetBaseAddress(baseAddress, descriptor);
-+    descriptor = SD_SetBufferable(bufferable, descriptor);
-+    descriptor = SD_SetCacheable(cacheable, descriptor);
-+    descriptor = SD_SetDomain(domain, descriptor);
-+    descriptor = SD_SetImplementationDefined(implementationDefined, descriptor);
-+    return descriptor;
-+}
-+
-+void FLPT_InsertSectionDescriptor(
-+    unsigned long *tableBaseAdr,
-+    int            index,
-+    unsigned long  descriptor)
-+{
-+    *(tableBaseAdr + index) = descriptor;
-+}
-+
-+void FLPT_Zeroise(
-+    unsigned long *base_adr,
-+    int            numberOfdescriptors) {
-+    unsigned long faultDescriptor = FLPT_CreateFaultDescriptor(0);
-+    int i;
-+    for (i=0; i < numberOfdescriptors; i++) {
-+        FLPT_InsertFaultDescriptor(base_adr, i, faultDescriptor);
-+    }
-+}
-+
-+void configure_caches(void)
-+{
-+    // Disable caches
-+//    Cache_DataOff();
-+printf("1");
-+    Cache_InstOff();
-+//    Cache_WriteBufferOff();
-+
-+    // Disable MMU
-+printf("2");
-+    MMU_SetEnabled(0);
-+printf("3");
-+    MMU_InvalidateDataTLB();
-+printf("4");
-+    MMU_InvalidateInstructionTLB();
-+
-+    // Setup the MMU
-+printf("5");
-+    MMU_SetAlignmentChecked(1);
-+printf("6");
-+    MMU_SetROMPermission(0);
-+printf("7");
-+    MMU_SetSystemPermission(1);
-+
-+    // Allow client access to all protection domains
-+    int i;
-+    for (i=0; i < NUM_DOMAINS; i++) {
-+        MMU_SetDomainAccessValue(i, DAV_CLIENT);
-+    }
-+printf("8");
-+
-+    // Allocate first level page table, which we'll populate only with section
-+    // descriptors, which cover 1MB each. Table must be aligned to a 16KB
-+    // boundary.
-+    // We'll put it 4KB into the SRAM and it will occupy:
-+    //   64 entries for SDRAM
-+    //   1  entry for SRAM
-+    //   16 entries for APB bridge A
-+    //   16 entries for APB bridge B
-+    // The largest memory address we need to map is that of the SRAM at
-+    // 0x4c000000 -> (4c000000/2^20)*4 = offset 1300h from table start ->
-+    // require at least 1300h/4 +1 entries in table = 1217
-+    unsigned long *firstLevelPageTableBaseAdr = (unsigned long*)SRAM_BASE;
-+    FLPT_Zeroise(firstLevelPageTableBaseAdr, 4096);
-+printf("9");
-+
-+    // Map entire adr space uncached, unbuffered, read/write, virtual == physical
-+    unsigned megabytesPresent = 4096;
-+    unsigned index = 0;
-+    for (i=0; i < megabytesPresent; i++) {
-+        FLPT_InsertSectionDescriptor(
-+            firstLevelPageTableBaseAdr,
-+            index,
-+            FLPT_CreateSectionDescriptor(
-+                index * 1024 * 1024,    // Base address
-+                0,                      // Domain number
-+                0,                      // Implementation defined
-+                AP_LEVEL_1,             // Access permissions
-+                0,                      // Bufferable
-+                0));                    // Cacheable
-+
-+        ++index;
-+    }
-+printf("10");
-+
-+    // Map SDRAM as cached and buffered, read/write, virtual == physical
-+    megabytesPresent = 64;
-+    index = PHYS_SDRAM_1_PA / (1024 * 1024);
-+    for (i=0; i < megabytesPresent; i++) {
-+        FLPT_InsertSectionDescriptor(
-+            firstLevelPageTableBaseAdr,
-+            index,
-+            FLPT_CreateSectionDescriptor(
-+                index * 1024 * 1024,    // Base address
-+                0,                      // Domain number
-+                0,                      // Implementation defined
-+                AP_LEVEL_1,             // Access permissions
-+                1,                      // Bufferable
-+                1));                    // Cacheable
-+
-+        ++index;
-+    }
-+printf("11");
-+
-+    // Map SRAM as cached and buffered, read/write, virtual == physical
-+    megabytesPresent = 1;   // Actually only 32KB
-+    index = SRAM_BASE / (1024 * 1024);
-+    for (i=0; i < megabytesPresent; i++) {
-+        FLPT_InsertSectionDescriptor(
-+            firstLevelPageTableBaseAdr,
-+            index,
-+            FLPT_CreateSectionDescriptor(
-+                index * 1024 * 1024,    // Base address
-+                0,                      // Domain number
-+                0,                      // Implementation defined
-+                AP_LEVEL_1,             // Access permissions
-+                1,                      // Bufferable
-+                1));                    // Cacheable
-+
-+        ++index;
-+    }
-+printf("12");
-+
-+    // Map APB bridge A address space as uncached, unbuffered, read/write,
-+    // virtual == physical
-+    megabytesPresent = 16;
-+    index = APB_BRIDGE_A_BASE_PA / (1024 * 1024);
-+    for (i=0; i < megabytesPresent; i++) {
-+        FLPT_InsertSectionDescriptor(
-+            firstLevelPageTableBaseAdr,
-+            index,
-+            FLPT_CreateSectionDescriptor(
-+                index * 1024 * 1024,    // Base address
-+                0,                      // Domain number
-+                0,                      // Implementation defined
-+                AP_LEVEL_1,             // Access permissions
-+                0,                      // Bufferable
-+                0));                    // Cacheable
-+
-+        ++index;
-+    }
-+printf("13");
-+
-+    // Map APB bridge B address space as uncached, unbuffered, read/write,
-+    // virtual == physical
-+    megabytesPresent = 16;
-+    index = APB_BRIDGE_B_BASE_PA / (1024 * 1024);
-+    for (i=0; i < megabytesPresent; i++) {
-+        FLPT_InsertSectionDescriptor(
-+            firstLevelPageTableBaseAdr,
-+            index,
-+            FLPT_CreateSectionDescriptor(
-+                index * 1024 * 1024,    // Base address
-+                0,                      // Domain number
-+                0,                      // Implementation defined
-+                AP_LEVEL_1,             // Access permissions
-+                0,                      // Bufferable
-+                0));                    // Cacheable
-+
-+        ++index;
-+    }
-+printf("14");
-+
-+    // Load base address of first level page table
-+    MMU_SetTranslationTableBaseAddress(firstLevelPageTableBaseAdr);
-+printf("15");
-+
-+    // Enable MMU
-+    MMU_SetEnabled(1);
-+printf("16");
-+
-+    // Enable caches
-+    Cache_DataOn();
-+printf("17");
-+    Cache_InstOn();
-+printf("18");
-+    Cache_WriteBufferOn();
-+printf("19");
-+}
-+
-diff -Nurd u-boot-1.1.2/include/asm-arm/barrier.h u-boot-1.1.2-oxe810/include/asm-arm/barrier.h
---- u-boot-1.1.2/include/asm-arm/barrier.h	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/asm-arm/barrier.h	2008-06-11 17:55:08.000000000 +0200
-@@ -0,0 +1,25 @@
-+#if !defined(__BARRIER_H__)
-+#define __BARRIER_H__
-+
-+static inline void rmb(void)
-+{
-+    asm volatile ("" : : : "memory");
-+}
-+
-+/*
-+ * wmb() Would normally need to ensure shared memory regions are marked as
-+ *       non-cacheable and non-bufferable, then the work to be done by wmb() is
-+ *       to ensure the compiler and any possible CPU out of order writes are
-+ *       flushed to memory, however we have no data cache and as far as I'm
-+ *       aware we can't use the MMU to set page properties, so in our case wmb()
-+ *       must cause the compiler to flush.
-+ */
-+
-+static inline void wmb(void)
-+{
-+    // Cause the compiler to flush any registers containing pending write data
-+    // to memory
-+    asm volatile ("" : : : "memory");
-+
-+}
-+#endif        //  #if !defined(__BARRIER_H__)
-diff -Nurd u-boot-1.1.2/include/asm-arm/global_data.h u-boot-1.1.2-oxe810/include/asm-arm/global_data.h
---- u-boot-1.1.2/include/asm-arm/global_data.h	2003-10-10 12:05:43.000000000 +0200
-+++ u-boot-1.1.2-oxe810/include/asm-arm/global_data.h	2008-06-11 17:55:08.000000000 +0200
-@@ -61,6 +61,7 @@
- #define	GD_FLG_DEVINIT	0x00002		/* Devices have been initialized	*/
- #define	GD_FLG_SILENT	0x00004		/* Silent mode				*/
- 
--#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")
-+#define DECLARE_GLOBAL_DATA_PTR     register gd_t* volatile gd asm ("r8");
- 
- #endif /* __ASM_GBL_DATA_H */
-+
-diff -Nurd u-boot-1.1.2/include/asm-arm/mach-types.h u-boot-1.1.2-oxe810/include/asm-arm/mach-types.h
---- u-boot-1.1.2/include/asm-arm/mach-types.h	2004-10-10 20:41:14.000000000 +0200
-+++ u-boot-1.1.2-oxe810/include/asm-arm/mach-types.h	2008-06-11 17:55:08.000000000 +0200
-@@ -624,6 +624,7 @@
- #define MACH_TYPE_RMS100               611
- #define MACH_TYPE_KB9200               612
- #define MACH_TYPE_SX1                  613
-+#define MACH_TYPE_OXNAS                1152
- 
- #ifdef CONFIG_ARCH_EBSA110
- # ifdef machine_arch_type
-@@ -7945,6 +7946,18 @@
- # define machine_is_sx1()	(0)
- #endif
- 
-+#ifdef CONFIG_MACH_OXNAS
-+# ifdef machine_arch_type
-+#  undef machine_arch_type
-+#  define machine_arch_type	__machine_arch_type
-+# else
-+#  define machine_arch_type	MACH_TYPE_OXNAS
-+# endif
-+# define machine_is_oxnas()	(machine_arch_type == MACH_TYPE_OXNAS)
-+#else
-+# define machine_is_oxnas()	(0)
-+#endif
-+
- /*
-  * These have not yet been registered
-  */
-diff -Nurd u-boot-1.1.2/include/asm-arm/u-boot.h u-boot-1.1.2-oxe810/include/asm-arm/u-boot.h
---- u-boot-1.1.2/include/asm-arm/u-boot.h	2002-11-03 01:33:10.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/asm-arm/u-boot.h	2008-06-11 17:55:08.000000000 +0200
-@@ -41,6 +41,8 @@
- 	ulong start;
- 	ulong size;
-     } 			bi_dram[CONFIG_NR_DRAM_BANKS];
-+	unsigned long	bi_sramstart;	/* start of SRAM memory */
-+	unsigned long	bi_sramsize;	/* size	 of SRAM memory */
- } bd_t;
- 
- #define bi_env_data bi_env->data
-diff -Nurd u-boot-1.1.2/include/ata.h u-boot-1.1.2-oxe810/include/ata.h
---- u-boot-1.1.2/include/ata.h	2004-03-14 23:25:50.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/ata.h	2008-06-11 17:55:11.000000000 +0200
-@@ -80,7 +80,12 @@
- /*
-  * Device / Head Register Bits
-  */
-+#ifdef CONFIG_OXNAS
-+#define ATA_DEVICE(x) (0)
-+#else
- #define ATA_DEVICE(x)	((x & 1)<<4)
-+#endif // CONFIG_OXNAS
-+
- #define ATA_LBA		0xE0
- 
- /*
-diff -Nurd u-boot-1.1.2/include/cmd_confdefs.h u-boot-1.1.2-oxe810/include/cmd_confdefs.h
---- u-boot-1.1.2/include/cmd_confdefs.h	2004-12-16 18:59:53.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/cmd_confdefs.h	2008-06-11 17:55:11.000000000 +0200
-@@ -92,6 +92,7 @@
- #define CFG_CMD_XIMG	0x0400000000000000ULL	/* Load part of Multi Image	*/
- #define CFG_CMD_UNIVERSE 0x0800000000000000ULL	/* Tundra Universe Support      */
- #define CFG_CMD_EXT2    0x1000000000000000ULL	/* EXT2 Support                 */
-+#define CFG_CMD_LEDFAIL 0x2000000000000000ULL	/* OXNAS Failure LED support */
- 
- #define CFG_CMD_ALL	0xFFFFFFFFFFFFFFFFULL	/* ALL commands			*/
- 
-diff -Nurd u-boot-1.1.2/include/common.h u-boot-1.1.2-oxe810/include/common.h
---- u-boot-1.1.2/include/common.h	2004-12-13 10:49:01.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/common.h	2008-06-11 17:55:11.000000000 +0200
-@@ -204,7 +204,7 @@
- /* common/cmd_nvedit.c */
- int	env_init     (void);
- void	env_relocate (void);
--char	*getenv	     (uchar *);
-+char	*getenv	     (const uchar *);
- int	getenv_r     (uchar *name, uchar *buf, unsigned len);
- int	saveenv	     (void);
- #ifdef CONFIG_PPC		/* ARM version to be fixed! */
-diff -Nurd u-boot-1.1.2/include/configs/oxnas.h u-boot-1.1.2-oxe810/include/configs/oxnas.h
---- u-boot-1.1.2/include/configs/oxnas.h	1970-01-01 01:00:00.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/configs/oxnas.h	2008-06-12 13:57:57.000000000 +0200
-@@ -0,0 +1,593 @@
-+/*
-+ * (C) Copyright 2005
-+ * Oxford Semiconductor Ltd
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+#ifndef __CONFIG_H
-+#define __CONFIG_H
-+
-+#define readb(p)  (*(volatile u8 *)(p))
-+#define readl(p)  (*(volatile u32 *)(p))
-+#define writeb(v, p) (*(volatile u8 *)(p)= (v))
-+#define writel(v, p) (*(volatile u32*)(p)=(v))
-+
-+#define CFG_FLASH_EMPTY_INFO
-+
-+/**
-+ * Architecture
-+ */
-+#define CONFIG_ARM926EJS    1
-+#define CONFIG_OXNAS        1
-+#define CONFIG_OXNAS_ENABLE_PCI         /* Enables PCI clock and takes out of reset - needed if require access to static bus */
-+#define CONFIG_OXNAS_FEEDBACK_PCI_CLKS  /* Feedback PCI clock out 3 to drive PCI core clock - needed if require access to static bus */
-+#define CONFIG_OXNAS_MANUAL_STATIC_ARBITRATION
-+#if (USE_SATA == 1)
-+#define CONFIG_OXNAS_USE_SATA           /* Define to include support for SATA disks */
-+#if (USE_SATA_ENV == 1)
-+#define ENV_ON_SATA                     /* Define to have the U-Boot env. stored on SATA disk */
-+#endif // USE_SATA_ENV
-+#endif // USE_SATA
-+#if (USE_FLASH == 0)
-+#define CFG_NO_FLASH                    /* Define to NOT include flash support on static bus*/
-+#endif //USE_FLASH
-+
-+/* Won't be using any interrupts */
-+#undef CONFIG_USE_IRQ
-+
-+/* Everything, incl board info, in Hz */
-+#undef CFG_CLKS_IN_HZ
-+
-+#define CFG_HUSH_PARSER		1
-+#define CFG_PROMPT_HUSH_PS2	"> "
-+
-+/* Miscellaneous configurable options */
-+#define CFG_LONGHELP				/* undef to save memory		*/
-+#ifdef CFG_HUSH_PARSER
-+#define CFG_PROMPT		"$ "		/* Monitor Command Prompt */
-+#else
-+#define CFG_PROMPT		"# "		/* Monitor Command Prompt */
-+#endif
-+#define CFG_CBSIZE      256             /* Console I/O Buffer Size  */
-+
-+/* Print Buffer Size */
-+#define CFG_PBSIZE      ((CFG_CBSIZE)+sizeof(CFG_PROMPT)+16)
-+#define CFG_MAXARGS     16              /* max number of command args   */
-+#define CFG_BARGSIZE    (CFG_CBSIZE)    /* Boot Argument Buffer Size    */
-+
-+#define CONFIG_CMDLINE_TAG          1   /* enable passing of ATAGs  */
-+#define CONFIG_SETUP_MEMORY_TAGS    1
-+#define CONFIG_MISC_INIT_R          1   /* call misc_init_r during start up */
-+#define CONFIG_INITRD_TAG           1   /* allow initrd tag to be generated */
-+
-+/* May want to do some setup prior to relocation */
-+#define CONFIG_INIT_CRITICAL
-+
-+/* ARM specific late initialisation */
-+#define BOARD_LATE_INIT
-+
-+/**
-+ * Stack sizes
-+ *
-+ * The stack sizes are set up in start.S using the settings below
-+ */
-+#define CONFIG_STACKSIZE        (128*1024)  /* regular stack */
-+#ifdef CONFIG_USE_IRQ
-+#define CONFIG_STACKSIZE_IRQ    (4*1024)    /* IRQ stack */
-+#define CONFIG_STACKSIZE_FIQ    (4*1024)    /* FIQ stack */
-+#endif
-+
-+/**
-+ * RAM
-+ */
-+#define CONFIG_NR_DRAM_BANKS    1           /* We have 1 bank of SDRAM */
-+#define PHYS_SDRAM_1_PA         0x48000000  /* SDRAM Bank #1 */
-+#if (NAS_VERSION == 810)
-+#define PHYS_SDRAM_1_MAX_SIZE	 (256 * 1024 * 1024)
-+#endif // NAS_VERSION
-+#define CFG_SRAM_BASE           ((PHYS_SDRAM_1_PA) + (PHYS_SDRAM_1_MAX_SIZE))
-+#if (NAS_VERSION == 810)
-+#define CFG_SRAM_SIZE			 (128 * 1024)
-+#endif // NAS_VERSION
-+
-+#define INITIALISE_SDRAM
-+
-+/* Default location from which bootm etc will load */
-+#define CFG_LOAD_ADDR   (PHYS_SDRAM_1_PA)
-+
-+/**
-+ * Core addresses
-+ */
-+#define MAC_BASE_PA             0x40400000
-+#define STATIC_CS0_BASE_PA      0x41000000
-+#define STATIC_CS1_BASE_PA      0x41400000
-+#define STATIC_CS2_BASE_PA      0x41800000
-+#define STATIC_CONTROL_BASE_PA  0x41C00000
-+#define SATA_DATA_BASE_PA       0x42000000
-+
-+#define APB_BRIDGE_A_BASE_PA    0x44000000
-+#define APB_BRIDGE_B_BASE_PA    0x45000000
-+
-+#define GPIO_1_PA               ((APB_BRIDGE_A_BASE_PA) + 0x0)
-+#define GPIO_2_PA               ((APB_BRIDGE_A_BASE_PA) + 0x100000)
-+
-+#define SYS_CONTROL_BASE_PA     ((APB_BRIDGE_B_BASE_PA) + 0x0)
-+#define DMA_BASE_PA             ((APB_BRIDGE_B_BASE_PA) + 0x600000)
-+#define RPS_BASE                ((APB_BRIDGE_B_BASE_PA) + 0x300000)
-+
-+/* Static bus registers */
-+#define STATIC_CONTROL_VERSION  ((STATIC_CONTROL_BASE_PA) + 0x0)
-+#define STATIC_CONTROL_BANK0    ((STATIC_CONTROL_BASE_PA) + 0x4)
-+#define STATIC_CONTROL_BANK1    ((STATIC_CONTROL_BASE_PA) + 0x8)
-+#define STATIC_CONTROL_BANK2    ((STATIC_CONTROL_BASE_PA) + 0xC)
-+
-+/* Clock to the ARM/DDR */
-+#if (FPGA == 0)
-+#define NOMINAL_ARMCLK  ((PLL400) / 2)
-+#define NOMINAL_SYSCLK  ((PLL400) / 4)
-+#else // !FPGA
-+#define NOMINAL_ARMCLK  (FPGA_ARM_CLK)
-+#define NOMINAL_SYSCLK  ((PLL400) / 4)
-+#endif // !FPGA
-+
-+/**
-+ * Timer
-+ */
-+#define CFG_TIMERBASE            ((RPS_BASE) + 0x200)
-+#define TIMER_PRESCALE_BIT       2
-+#define TIMER_PRESCALE_1_ENUM    0
-+#define TIMER_PRESCALE_16_ENUM   1
-+#define TIMER_PRESCALE_256_ENUM  2
-+#define TIMER_MODE_BIT           6
-+#define TIMER_MODE_FREE_RUNNING  0
-+#define TIMER_MODE_PERIODIC      1
-+#define TIMER_ENABLE_BIT         7
-+#define TIMER_ENABLE_DISABLE     0
-+#define TIMER_ENABLE_ENABLE      1
-+
-+#define TIMER_PRESCALE_ENUM      (TIMER_PRESCALE_256_ENUM)
-+#define CFG_HZ                   ((RPSCLK) / 256)
-+
-+/**
-+ * GPIO
-+ */
-+#define GPIO_1_OE       ((GPIO_1_PA) + 0x4)
-+#define GPIO_1_SET_OE   ((GPIO_1_PA) + 0x1C)
-+#define GPIO_1_CLR_OE   ((GPIO_1_PA) + 0x20)
-+
-+#define GPIO_2_OE       ((GPIO_2_PA) + 0x4)
-+#define GPIO_2_SET_OE   ((GPIO_2_PA) + 0x1C)
-+#define GPIO_2_CLR_OE   ((GPIO_2_PA) + 0x20)
-+
-+/**
-+ * Serial Configuration
-+ */
-+#define EXT_UART_BASE       0x28000000
-+
-+#define UART_1_BASE (APB_BRIDGE_A_BASE_PA + 0x200000)
-+#define UART_2_BASE (APB_BRIDGE_A_BASE_PA + 0x300000)
-+#define UART_3_BASE (APB_BRIDGE_A_BASE_PA + 0x900000) 
-+#define UART_4_BASE (APB_BRIDGE_A_BASE_PA + 0xA00000) 
-+
-+#define CFG_NS16550          1
-+#define CFG_NS16550_SERIAL   1
-+#define CFG_NS16550_REG_SIZE 1
-+
-+#if (USE_EXTERNAL_UART != 0)
-+#define CFG_NS16550_CLK      16000000
-+#define CFG_NS16550_COM1     (EXT_UART_BASE)
-+#else // USE_EXTERNAL_UART
-+#define CFG_NS16550_CLK      (NOMINAL_SYSCLK)
-+#define USE_UART_FRACTIONAL_DIVIDER
-+#if (INTERNAL_UART == 1)
-+#define CONFIG_OXNAS_UART1
-+#define CFG_NS16550_COM1     (UART_1_BASE)
-+#elif (INTERNAL_UART == 2)
-+#define CONFIG_OXNAS_UART2
-+#define CFG_NS16550_COM1     (UART_2_BASE)
-+#elif (INTERNAL_UART == 3)
-+#define CONFIG_OXNAS_UART3
-+#define CFG_NS16550_COM1     (UART_3_BASE)
-+#else
-+#define CONFIG_OXNAS_UART4
-+#define CFG_NS16550_COM1     (UART_4_BASE)
-+#endif // CONFIG_OXNAS_UART
-+#endif // USE_EXTERNAL_UART
-+
-+#define CONFIG_CONS_INDEX    1
-+#define CONFIG_BAUDRATE      115200
-+#define CFG_BAUDRATE_TABLE   { 9600, 19200, 38400, 57600, 115200 }
-+
-+/**
-+ * Monitor commands
-+ */
-+#define BASE_COMMANDS (CFG_CMD_IMI    | \
-+                       CFG_CMD_IMLS   | \
-+                       CFG_CMD_BDI    | \
-+                       CFG_CMD_NET    | \
-+                       CFG_CMD_PING   | \
-+                       CFG_CMD_ENV    | \
-+                       CFG_CMD_RUN    | \
-+                       CFG_CMD_MEMORY)
-+
-+#ifdef CFG_NO_FLASH
-+#define FLASH_COMMANDS (BASE_COMMANDS)
-+#else
-+#define FLASH_COMMANDS (BASE_COMMANDS | CFG_CMD_FLASH)
-+#endif // CFG_NO_FLASH
-+
-+#ifdef CONFIG_OXNAS_USE_SATA
-+#define SATA_COMMANDS (FLASH_COMMANDS | CFG_CMD_IDE | CFG_CMD_EXT2 | CFG_CMD_LEDFAIL)
-+#else
-+#define SATA_COMMANDS (FLASH_COMMANDS)
-+#endif // CONFIG_OXNAS_USE_SATA
-+
-+#define CONFIG_COMMANDS SATA_COMMANDS
-+
-+/* This must be included AFTER the definition of CONFIG_COMMANDS */
-+#include <cmd_confdefs.h>
-+
-+/**
-+ * Booting
-+ */
-+#if (LINUX_ROOT_RAIDED == 1)
-+#define LINUX_ROOT_DEVICE "root=/dev/md1"
-+#else
-+#define LINUX_ROOT_DEVICE "root=/dev/sda1"
-+#endif
-+#define CONFIG_BOOTARGS LINUX_ROOT_DEVICE " console=ttyS0,115200 elevator=cfq gmac.mac_adr=0x00,0x30,0xe0,0x00,0x00,0x01"
-+
-+#ifdef CONFIG_OXNAS_USE_SATA
-+#define CONFIG_BOOTDELAY	2
-+#define CONFIG_BOOTCOMMAND	"run select0 load boot || run select0 load2 boot || run lightled select1 load extinguishled boot || run lightled select1 load2 extinguishled boot || lightled"
-+#define CONFIG_EXTRA_ENV_SETTINGS \
-+    "select0=ide dev 0\0" \
-+    "select1=ide dev 1\0" \
-+    "load=ide read 0x48500000 12c 1644\0" \
-+    "load2=ide read 0x48500000 2a6e 1644\0" \
-+	"lightled=ledfail 1\0" \
-+	"extinguishled=ledfail 0\0" \
-+    "boot=bootm 48500000\0"
-+#else // CONFIG_OXNAS_USE_SATA
-+#define CONFIG_BOOTDELAY	15
-+#define CONFIG_BOOTCOMMAND	"bootm 0x41020000"
-+#endif // CONFIG_OXNAS_USE_SATA
-+
-+//#define CONFIG_SHOW_BOOT_PROGRESS   1
-+
-+/**
-+ * Networking
-+ */
-+#define CONFIG_ETHADDR      00:30:e0:00:00:01
-+#define CONFIG_NETMASK      255.255.0.0
-+#define CONFIG_IPADDR       172.31.0.128
-+#define CONFIG_SERVERIP     172.31.0.100
-+#define CONFIG_BOOTFILE     "uImage"
-+#define CFG_AUTOLOAD        "n"
-+#define CONFIG_NET_RETRY_COUNT 30
-+
-+/**
-+ * Flash support
-+ */
-+#ifndef CFG_NO_FLASH
-+
-+#define FORCE_TOP_BOOT_FLASH	1
-+
-+#define CFG_FLASH_CFI			1
-+#define CFG_FLASH_CFI_DRIVER	1
-+
-+#define NUM_FLASH_MAIN_BLOCKS   63          /* For Intel 28F320B3T */
-+#define NUM_FLASH_PARAM_BLOCKS  8           /* For Intel 28F320B3T */
-+#define FLASH_MAIN_BLOCK_SIZE   (64*1024)   /* For Intel 28F320B3T family */
-+#define FLASH_PARAM_BLOCK_SIZE  (8*1024)    /* For Intel 28F320B3T family */
-+
-+/* Assuming counts main blocks and parameter blocks, as the Intel/AMD detection */
-+/* I'm intending to copy would seem to indicate */
-+#define CFG_MAX_FLASH_SECT      (NUM_FLASH_MAIN_BLOCKS + NUM_FLASH_PARAM_BLOCKS)
-+
-+#define CFG_MAX_FLASH_BANKS     1           /* Assume counts flash devices */
-+#define FLASH_BASE_OFF          0
-+#define CFG_FLASH_BASE          ((STATIC_CS0_BASE_PA) + (FLASH_BASE_OFF))
-+#define PHYS_FLASH_1            (CFG_FLASH_BASE)
-+
-+#define CFG_FLASH_ERASE_TOUT    (20*CFG_HZ)	/* Timeout for Flash Erase */
-+#define CFG_FLASH_WRITE_TOUT    (20*CFG_HZ)	/* Timeout for Flash Write */
-+#define CFG_FLASH_WRITE_ATTEMPTS 5
-+
-+#define STATIC_BUS_FLASH_CONFIG 0x4f1f3f3f  /* Slow ASIC settings */
-+
-+#endif // !CFG_NO_FLASH
-+
-+/**
-+ * Environment organization
-+ */
-+#ifdef ENV_ON_SATA
-+
-+/* Environment on SATA disk */
-+#define SIZE_TO_SECTORS(x) ((x) / 512)
-+#define CFG_ENV_IS_IN_DISK
-+#define CFG_ENV_SIZE			(8*1024)
-+#define ENVIRONMENT_OFFSET		((CFG_SRAM_SIZE) - (CFG_ENV_SIZE) - 1024)
-+#define CFG_ENV_ADDR			((CFG_SRAM_BASE) + (ENVIRONMENT_OFFSET))
-+#define ROM_LOADER_LOAD_START_SECTOR 1
-+#define CFG_ENV_DISK_SECTOR 	((ROM_LOADER_LOAD_START_SECTOR) + SIZE_TO_SECTORS(ENVIRONMENT_OFFSET))
-+#define ROM_LOADER_LOAD_REDUNDANT_START_SECTOR 10608
-+#define CFG_ENV_DISK_REDUNDANT_SECTOR ((ROM_LOADER_LOAD_REDUNDANT_START_SECTOR) + SIZE_TO_SECTORS(ENVIRONMENT_OFFSET))
-+
-+#else
-+/** Flash based environment
-+ *
-+ *  It appears that all flash env start/size info. has to be pre-defined. How
-+ *  this is supposed to work when the flash detection code could cope with all
-+ *  sorts of different flash is hard to see.
-+ *  It appears from the README that with bottom/top boot flashes with smaller
-+ *  parameter blocks available, the environment code will only use a single
-+ *  one of these smaller sectors for the environment, i.e. CFG_ENV_SECT_SIZE
-+ *  is the size of the environment. I hope this isn't really true. The defines
-+ *  below may well not work if this is the truth
-+ */
-+#define CFG_ENV_IS_IN_FLASH
-+/* Environment in flash device parameter blocks */
-+#define CFG_ENV_SECT_SIZE   (8*1024)
-+/* First parameter block for environment */
-+#define CFG_ENV_SIZE        CFG_ENV_SECT_SIZE
-+/* Second parameter block for backup environment */
-+#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE)
-+/* Main environment occupies first parameter block */
-+#define CFG_ENV_ADDR        ((CFG_FLASH_BASE)+((NUM_FLASH_MAIN_BLOCKS)*(FLASH_MAIN_BLOCK_SIZE)))
-+/* Backup environment occupies second parameter block */
-+#define CFG_ENV_ADDR_REDUND ((CFG_ENV_ADDR)+(CFG_ENV_SIZE))
-+
-+#endif // ENV_ON_SATA
-+
-+#define CONFIG_ENV_OVERWRITE
-+
-+/* Magic number that indicates rebooting into upgrade mode */
-+#define UPGRADE_MAGIC 0x31	/* ASCII '1' */
-+
-+/* Magic number that indicates user recovery on reboot */
-+/* Also defined in oxnas_user_recovery.agent */
-+#define RECOVERY_MAGIC 0x31    /* ASCII '1' */
-+
-+/* Magic number that indicates controlled power down on reboot */
-+/* Also defined in controlled_power_down.sh in init.d */
-+#define CONTROLLED_POWER_DOWN_MAGIC 0x31  /* ASCII '1' */
-+
-+/* This flag is set in SRAM location by Co Proc */
-+#define CONTROLLED_POWER_UP_MAGIC  0x31 /* ASCII '1' */
-+/* 9k + a quad from top */
-+/* Be carefule on changing the location of this flag
-+ * u-boot has other things to write in SRAM too
-+ */
-+#define POWER_ON_FLAG_SRAM_OFFSET 	9220
-+
-+/* Size of malloc() pool */
-+#define CFG_MALLOC_LEN      (CFG_ENV_SIZE + 128*1024)
-+#define CFG_GBL_DATA_SIZE   128 /* size in bytes reserved for initial data */
-+
-+/**
-+ * ASM startup control
-+ */
-+/* Start of address within SRAM of loader's exception table. */
-+/* ROM-based exception table will redirect to here */
-+#define EXCEPTION_BASE  (CFG_SRAM_BASE)
-+
-+/**
-+ * Disk related stuff
-+ */
-+#define CONFIG_LBA48
-+#define CONFIG_DOS_PARTITION
-+#define CFG_IDE_MAXDEVICE   2
-+#define CFG_IDE_MAXBUS      1
-+#define CONFIG_IDE_PREINIT
-+#undef CONFIG_IDE_RESET
-+#undef CONFIG_IDE_LED
-+#define CFG_ATA_DATA_OFFSET 0
-+#define CFG_ATA_REG_OFFSET  0
-+#define CFG_ATA_ALT_OFFSET  0
-+
-+/**
-+ * System block reset and clock control
-+ */
-+#define SYS_CTRL_USB11_CTRL           (SYS_CONTROL_BASE_PA + 0x00)
-+#define SYS_CTRL_PCI_CTRL0            (SYS_CONTROL_BASE_PA + 0x04)
-+#define SYS_CTRL_PCI_CTRL1            (SYS_CONTROL_BASE_PA + 0x08)
-+#define SYS_CTRL_GPIO_PRIMSEL_CTRL_0  (SYS_CONTROL_BASE_PA + 0x0C)
-+#define SYS_CTRL_GPIO_PRIMSEL_CTRL_1  (SYS_CONTROL_BASE_PA + 0x10)
-+#define SYS_CTRL_GPIO_SECSEL_CTRL_0   (SYS_CONTROL_BASE_PA + 0x14)
-+#define SYS_CTRL_GPIO_SECSEL_CTRL_1   (SYS_CONTROL_BASE_PA + 0x18)
-+#define SYS_CTRL_GPIO_TERTSEL_CTRL_0  (SYS_CONTROL_BASE_PA + 0x8C)
-+#define SYS_CTRL_GPIO_TERTSEL_CTRL_1  (SYS_CONTROL_BASE_PA + 0x90)
-+#define SYS_CTRL_USB11_STAT           (SYS_CONTROL_BASE_PA + 0x1c)
-+#define SYS_CTRL_PCI_STAT             (SYS_CONTROL_BASE_PA + 0x20)
-+#define SYS_CTRL_CKEN_SET_CTRL        (SYS_CONTROL_BASE_PA + 0x2C)
-+#define SYS_CTRL_CKEN_CLR_CTRL        (SYS_CONTROL_BASE_PA + 0x30)
-+#define SYS_CTRL_RSTEN_SET_CTRL       (SYS_CONTROL_BASE_PA + 0x34)
-+#define SYS_CTRL_RSTEN_CLR_CTRL       (SYS_CONTROL_BASE_PA + 0x38)
-+#define SYS_CTRL_PLLSYS_CTRL          (SYS_CONTROL_BASE_PA + 0x48)
-+#define SYS_CTRL_PLLSYS_KEY_CTRL      (SYS_CONTROL_BASE_PA + 0x6C)
-+#define SYS_CTRL_GMAC_CTRL            (SYS_CONTROL_BASE_PA + 0x78)
-+#define SYS_CTRL_UART_CTRL            (SYS_CONTROL_BASE_PA + 0x94)
-+
-+#define SYS_CTRL_CKEN_COPRO_BIT  0
-+#define SYS_CTRL_CKEN_DMA_BIT    1
-+#define SYS_CTRL_CKEN_DPE_BIT    2
-+#define SYS_CTRL_CKEN_DDR_BIT    3
-+#define SYS_CTRL_CKEN_SATA_BIT   4
-+#define SYS_CTRL_CKEN_I2S_BIT    5
-+#define SYS_CTRL_CKEN_USBHS_BIT  6
-+#define SYS_CTRL_CKEN_MAC_BIT    7
-+#define SYS_CTRL_CKEN_PCI_BIT    8
-+#define SYS_CTRL_CKEN_STATIC_BIT 9
-+#define SYS_CTRL_CKEN_DDR_PHY_BIT 10
-+
-+#define SYS_CTRL_RSTEN_ARM_BIT          0
-+#define SYS_CTRL_RSTEN_COPRO_BIT        1
-+#define SYS_CTRL_RSTEN_USBHS_BIT        4
-+#define SYS_CTRL_RSTEN_USBHSPHY_BIT     5
-+#define SYS_CTRL_RSTEN_MAC_BIT          6
-+#define SYS_CTRL_RSTEN_PCI_BIT          7
-+#define SYS_CTRL_RSTEN_DMA_BIT          8
-+#define SYS_CTRL_RSTEN_DPE_BIT          9
-+#define SYS_CTRL_RSTEN_DDR_BIT          10
-+#define SYS_CTRL_RSTEN_SATA_BIT         11
-+#define SYS_CTRL_RSTEN_SATA_LINK_BIT    12
-+#define SYS_CTRL_RSTEN_SATA_PHY_BIT     13
-+#define SYS_CTRL_RSTEN_STATIC_BIT       15
-+#define SYS_CTRL_RSTEN_GPIO_BIT         16
-+#define SYS_CTRL_RSTEN_UART1_BIT        17
-+#define SYS_CTRL_RSTEN_UART2_BIT        18
-+#define SYS_CTRL_RSTEN_MISC_BIT         19
-+#define SYS_CTRL_RSTEN_I2S_BIT          20
-+#define SYS_CTRL_RSTEN_AHB_MON_BIT      21
-+#define SYS_CTRL_RSTEN_UART3_BIT        22
-+#define SYS_CTRL_RSTEN_UART4_BIT        23
-+#define SYS_CTRL_RSTEN_SGDMA_BIT        24
-+#define SYS_CTRL_RSTEN_DDR_PHY_BIT      25
-+#define SYS_CTRL_RSTEN_BUS_BIT          31
-+
-+#define SYS_CTRL_GMAC_RGMII         2
-+#define SYS_CTRL_GMAC_SIMPLE_MAX    1
-+#define SYS_CTRL_GMAC_CKEN_GTX      0
-+
-+#define SYS_CTRL_CKCTRL_CTRL_ADDR     (SYS_CONTROL_BASE_PA + 0x64)
-+
-+#define SYS_CTRL_CKCTRL_PCI_DIV_BIT 0
-+#define SYS_CTRL_CKCTRL_SLOW_BIT    8
-+
-+#define SYS_CTRL_UART2_DEQ_EN       0
-+#define SYS_CTRL_UART3_DEQ_EN       1
-+#define SYS_CTRL_UART3_IQ_EN        2
-+#define SYS_CTRL_UART4_IQ_EN        3
-+#define SYS_CTRL_UART4_NOT_PCI_MODE 4
-+
-+#define SYS_CTRL_PCI_CTRL1_PCI_STATIC_RQ_BIT 11
-+
-+/**
-+ * SATA related definitions
-+ */
-+#define ATA_PORT_CTL        0
-+#define ATA_PORT_FEATURE    1
-+#define ATA_PORT_NSECT      2
-+#define ATA_PORT_LBAL       3
-+#define ATA_PORT_LBAM       4
-+#define ATA_PORT_LBAH       5
-+#define ATA_PORT_DEVICE     6
-+#define ATA_PORT_COMMAND    7
-+
-+#define SATA_0_REGS_BASE    (APB_BRIDGE_B_BASE_PA + 0x900000)
-+#define SATA_1_REGS_BASE    (APB_BRIDGE_B_BASE_PA + 0x910000)
-+#define SATA_HOST_REGS_BASE (APB_BRIDGE_B_BASE_PA + 0x9e0000)
-+
-+/* The offsets to the SATA registers */
-+#define SATA_ORB1_OFF           0
-+#define SATA_ORB2_OFF           1
-+#define SATA_ORB3_OFF           2
-+#define SATA_ORB4_OFF           3
-+#define SATA_ORB5_OFF           4
-+
-+#define SATA_FIS_ACCESS         11
-+#define SATA_INT_STATUS_OFF     12  /* Read only */
-+#define SATA_INT_CLR_OFF        12  /* Write only */
-+#define SATA_INT_ENABLE_OFF     13  /* Read only */
-+#define SATA_INT_ENABLE_SET_OFF 13  /* Write only */
-+#define SATA_INT_ENABLE_CLR_OFF 14  /* Write only */
-+#define SATA_VERSION_OFF        15
-+#define SATA_CONTROL_OFF        23
-+#define SATA_COMMAND_OFF        24
-+#define SATA_PORT_CONTROL_OFF   25
-+#define SATA_DRIVE_CONTROL_OFF  26
-+
-+/* The offsets to the link registers that are access in an asynchronous manner */
-+#define SATA_LINK_DATA     28
-+#define SATA_LINK_RD_ADDR  29
-+#define SATA_LINK_WR_ADDR  30
-+#define SATA_LINK_CONTROL  31
-+
-+/* SATA interrupt status register fields */
-+#define SATA_INT_STATUS_EOC_RAW_BIT     ( 0 + 16) 
-+#define SATA_INT_STATUS_ERROR_BIT       ( 2 + 16)
-+#define SATA_INT_STATUS_EOADT_RAW_BIT   ( 1 + 16)
-+
-+/* SATA core command register commands */
-+#define SATA_CMD_WRITE_TO_ORB_REGS              2
-+#define SATA_CMD_WRITE_TO_ORB_REGS_NO_COMMAND   4
-+
-+#define SATA_CMD_BUSY_BIT 7
-+
-+#define SATA_SCTL_CLR_ERR 0x00000316UL
-+
-+#define SATA_OPCODE_MASK 0x3
-+
-+#define SATA_LBAL_BIT    0
-+#define SATA_LBAM_BIT    8
-+#define SATA_LBAH_BIT    16
-+#define SATA_HOB_LBAH_BIT 24
-+#define SATA_DEVICE_BIT  24
-+#define SATA_NSECT_BIT   0
-+#define SATA_FEATURE_BIT 16
-+#define SATA_COMMAND_BIT 24
-+#define SATA_CTL_BIT     24
-+
-+/* ATA status (7) register field definitions */
-+#define ATA_STATUS_BSY_BIT     7
-+#define ATA_STATUS_DRDY_BIT    6
-+#define ATA_STATUS_DF_BIT      5
-+#define ATA_STATUS_DRQ_BIT     3
-+#define ATA_STATUS_ERR_BIT     0
-+
-+/* ATA device (6) register field definitions */
-+#define ATA_DEVICE_FIXED_MASK 0xA0
-+#define ATA_DEVICE_DRV_BIT 4
-+#define ATA_DEVICE_DRV_NUM_BITS 1
-+#define ATA_DEVICE_LBA_BIT 6
-+
-+/* ATA control (0) register field definitions */
-+#define ATA_CTL_SRST_BIT   2
-+
-+/* ATA Command register initiated commands */
-+#define ATA_CMD_INIT    0x91
-+#define ATA_CMD_IDENT   0xEC
-+
-+#define SATA_STD_ASYNC_REGS_OFF 0x20
-+#define SATA_SCR_STATUS      0
-+#define SATA_SCR_ERROR       1
-+#define SATA_SCR_CONTROL     2
-+#define SATA_SCR_ACTIVE      3
-+#define SATA_SCR_NOTIFICAION 4
-+
-+#define SATA_BURST_BUF_FORCE_EOT_BIT        0
-+#define SATA_BURST_BUF_DATA_INJ_ENABLE_BIT  1
-+#define SATA_BURST_BUF_DIR_BIT              2
-+#define SATA_BURST_BUF_DATA_INJ_END_BIT     3
-+#define SATA_BURST_BUF_FIFO_DIS_BIT         4
-+#define SATA_BURST_BUF_DIS_DREQ_BIT         5
-+#define SATA_BURST_BUF_DREQ_BIT             6
-+
-+/* Button on GPIO 32 */
-+#define RECOVERY_BUTTON         (0x00000001 << 0)
-+#define RECOVERY_PRISEL_REG     SYS_CTRL_GPIO_PRIMSEL_CTRL_1
-+#define RECOVERY_SECSEL_REG     SYS_CTRL_GPIO_SECSEL_CTRL_1
-+#define RECOVERY_TERSEL_REG     SYS_CTRL_GPIO_TERTSEL_CTRL_1
-+#define RECOVERY_CLR_OE_REG     GPIO_2_CLR_OE
-+#define RECOVERY_DEBOUNCE_REG   GPIO_2_INPUT_DEBOUNCE_ENABLE
-+#define RECOVERY_DATA           GPIO_2_PA
-+
-+#endif // CONFIG_H
-diff -Nurd u-boot-1.1.2/include/_exports.h u-boot-1.1.2-oxe810/include/_exports.h
---- u-boot-1.1.2/include/_exports.h	2003-09-12 17:35:33.000000000 +0200
-+++ u-boot-1.1.2-oxe810/include/_exports.h	2008-06-11 17:55:11.000000000 +0200
-@@ -12,6 +12,7 @@
- EXPORT_FUNC(get_timer)
- EXPORT_FUNC(vprintf)
- EXPORT_FUNC(do_reset)
-+EXPORT_FUNC(raise)
- #if (CONFIG_COMMANDS & CFG_CMD_I2C)
- EXPORT_FUNC(i2c_write)
- EXPORT_FUNC(i2c_read)
-diff -Nurd u-boot-1.1.2/include/flash.h u-boot-1.1.2-oxe810/include/flash.h
---- u-boot-1.1.2/include/flash.h	2004-12-16 19:01:48.000000000 +0100
-+++ u-boot-1.1.2-oxe810/include/flash.h	2008-06-11 17:55:11.000000000 +0200
-@@ -207,6 +207,7 @@
- #define ATM_ID_BV1614	0x000000C0	/* 49BV1614  ID */
- #define ATM_ID_BV1614A	0x000000C8	/* 49BV1614A ID */
- #define ATM_ID_BV6416	0x000000D6	/* 49BV6416  ID */
-+#define ATM_ID_BV322    0x000000c9      /* 49BV322A  ID */
- 
- #define FUJI_ID_29F800BA  0x22582258	/* MBM29F800BA ID  (8M) */
- #define FUJI_ID_29F800TA  0x22D622D6	/* MBM29F800TA ID  (8M) */
-@@ -405,6 +406,7 @@
- #define FLASH_MAN_INTEL 0x00300000
- #define FLASH_MAN_MT	0x00400000
- #define FLASH_MAN_SHARP 0x00500000
-+#define FLASH_MAN_ATM   0x00070000      /* Atmel */
- 
- 
- #define FLASH_TYPEMASK	0x0000FFFF	/* extract FLASH type	information	*/
-diff -Nurd u-boot-1.1.2/include/ns16550.h u-boot-1.1.2-oxe810/include/ns16550.h
---- u-boot-1.1.2/include/ns16550.h	2004-06-07 01:13:57.000000000 +0200
-+++ u-boot-1.1.2-oxe810/include/ns16550.h	2008-06-11 17:55:11.000000000 +0200
-@@ -19,6 +19,10 @@
- 	unsigned char lsr;		/* 5 */
- 	unsigned char msr;		/* 6 */
- 	unsigned char scr;		/* 7 */
-+#if defined(CONFIG_OXNAS)
-+	unsigned char ext;		/* 8 */
-+	unsigned char dlf;		/* 9 */
-+#endif
- #if defined(CONFIG_OMAP730)
- 	unsigned char mdr1;		/* 8 */
- 	unsigned char reg9;		/* 9 */
-diff -Nurd u-boot-1.1.2/lib_arm/board.c u-boot-1.1.2-oxe810/lib_arm/board.c
---- u-boot-1.1.2/lib_arm/board.c	2004-08-02 00:48:22.000000000 +0200
-+++ u-boot-1.1.2-oxe810/lib_arm/board.c	2008-06-11 17:55:06.000000000 +0200
-@@ -39,6 +39,9 @@
- #include "../drivers/lan91c96.h"
- #endif
- 
-+DECLARE_GLOBAL_DATA_PTR
-+
-+
- #if (CONFIG_COMMANDS & CFG_CMD_NAND)
- void nand_init (void);
- #endif
-@@ -106,7 +109,6 @@
- 
- static int init_baudrate (void)
- {
--	DECLARE_GLOBAL_DATA_PTR;
- 
- 	uchar tmp[64];	/* long enough for environment variables */
- 	int i = getenv_r ("baudrate", tmp, sizeof (tmp));
-@@ -142,16 +144,18 @@
-  */
- static int display_dram_config (void)
- {
--	DECLARE_GLOBAL_DATA_PTR;
- 	int i;
- 
- 	puts ("RAM Configuration:\n");
- 
- 	for(i=0; i<CONFIG_NR_DRAM_BANKS; i++) {
--		printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
-+		printf ("\tBank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
- 		print_size (gd->bd->bi_dram[i].size, "\n");
- 	}
- 
-+	puts("SRAM Configuration:\n");
-+	printf("\t%dKB at 0x%08x\n", gd->bd->bi_sramsize >> 10, gd->bd->bi_sramstart);
-+
- 	return (0);
- }
- 
-@@ -191,6 +195,12 @@
- 	cpu_init,		/* basic cpu dependent setup */
- 	board_init,		/* basic board dependent setup */
- 	interrupt_init,		/* set up exceptions */
-+#ifdef CONFIG_OXNAS
-+	/* Need early console to see SATA env. load messages */
-+	init_baudrate,		/* initialze baudrate settings */
-+	serial_init,		/* serial communications setup */
-+	console_init_f,		/* stage 1 init of console */
-+#endif // CONFIG_OXNAS
- 	env_init,		/* initialize environment */
- 	init_baudrate,		/* initialze baudrate settings */
- 	serial_init,		/* serial communications setup */
-@@ -206,7 +216,6 @@
- 
- void start_armboot (void)
- {
--	DECLARE_GLOBAL_DATA_PTR;
- 
- 	ulong size;
- 	init_fnc_t **init_fnc_ptr;
-@@ -232,9 +241,11 @@
- 		}
- 	}
- 
-+#ifndef CFG_NO_FLASH
- 	/* configure available FLASH banks */
- 	size = flash_init ();
- 	display_flash_config (size);
-+#endif // CFG_NO_FLASH
- 
- #ifdef CONFIG_VFD
- #	ifndef PAGE_SIZE
-@@ -354,6 +365,12 @@
- {
- 	puts ("### ERROR ### Please RESET the board ###\n");
- 	for (;;);
-+}
-+
-+void raise (int n)
-+{
-+	puts ("### ERROR ### Please RESET the board ###\n");
-+	for (;;);
- }
- 
- #ifdef CONFIG_MODEM_SUPPORT
-diff -Nurd u-boot-1.1.2/MAKEALL u-boot-1.1.2-oxe810/MAKEALL
---- u-boot-1.1.2/MAKEALL	2004-12-31 10:32:48.000000000 +0100
-+++ u-boot-1.1.2-oxe810/MAKEALL	2008-06-11 17:55:31.000000000 +0200
-@@ -154,7 +154,7 @@
- 	lpd7a400	mx1ads		mx1fs2		omap1510inn	\
- 	omap1610h2	omap1610inn	omap730p2	scb9328		\
- 	smdk2400	smdk2410	trab		VCMA9		\
--	versatile							\
-+	versatile	oxnas	\
- "
- 
- #########################################################################
-diff -Nurd u-boot-1.1.2/Makefile u-boot-1.1.2-oxe810/Makefile
---- u-boot-1.1.2/Makefile	2004-12-19 10:58:11.000000000 +0100
-+++ u-boot-1.1.2-oxe810/Makefile	2008-06-11 17:55:31.000000000 +0200
-@@ -1296,6 +1296,9 @@
- SX1_config :		unconfig
- 	@./mkconfig $(@:_config=) arm arm925t sx1
- 
-+oxnas_config :	unconfig
-+	@./mkconfig $(@:_config=) arm arm926ejs oxnas
-+
- # TRAB default configuration:	8 MB Flash, 32 MB RAM
- trab_config \
- trab_bigram_config \
-@@ -1561,11 +1564,12 @@
- clean:
- 	find . -type f \
- 		\( -name 'core' -o -name '*.bak' -o -name '*~' \
--		-o -name '*.o'  -o -name '*.a'  \) -print \
-+		-o -name '*.o'  -o -name '*.a' -o -name '.depend' \) -print \
- 		| xargs rm -f
- 	rm -f examples/hello_world examples/timer \
- 	      examples/eepro100_eeprom examples/sched \
--	      examples/mem_to_mem_idma2intr examples/82559_eeprom
-+	      examples/mem_to_mem_idma2intr examples/82559_eeprom \
-+              examples/mem_test
- 	rm -f tools/img2srec tools/mkimage tools/envcrc tools/gen_eth_addr
- 	rm -f tools/mpc86x_clk tools/ncb
- 	rm -f tools/easylogo/easylogo tools/bmp_logo
-diff -Nurd u-boot-1.1.2/net/net.c u-boot-1.1.2-oxe810/net/net.c
---- u-boot-1.1.2/net/net.c	2004-10-12 00:51:14.000000000 +0200
-+++ u-boot-1.1.2-oxe810/net/net.c	2008-06-11 17:55:11.000000000 +0200
-@@ -225,7 +225,7 @@
- 		return;
- 
- 	t = get_timer(0);
--
-+	
- 	/* check for arp timeout */
- 	if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ) {
- 		NetArpWaitTry++;
-@@ -235,6 +235,7 @@
- 			NetArpWaitTry = 0;
- 			NetStartAgain();
- 		} else {
-+			puts ("\nARP Resend request\n");
- 			NetArpWaitTimerStart = t;
- 			ArpRequest();
- 		}
-@@ -738,7 +739,7 @@
- #if defined(CONFIG_NET_MULTI)
- 	printf ("Using %s device\n", eth_get_name());
- #endif	/* CONFIG_NET_MULTI */
--	NetSetTimeout (10 * CFG_HZ, PingTimeout);
-+	NetSetTimeout (30 * CFG_HZ, PingTimeout);
- 	NetSetHandler (PingHandler);
- 
- 	PingSend();
-@@ -1384,7 +1385,7 @@
- 				 */
- 				/* XXX point to ip packet */
- 				(*packetHandler)((uchar *)ip, 0, 0, 0);
--				break;
-+				return;/**break; BHC Changed to remove second invocation of ping handler below */
- #endif
- 			default:
- 				return;
-@@ -1492,10 +1493,11 @@
- NetCksum(uchar * ptr, int len)
- {
- 	ulong	xsum;
-+	ushort *s = ptr;
- 
- 	xsum = 0;
- 	while (len-- > 0)
--		xsum += *((ushort *)ptr)++;
-+		xsum += *s++;
- 	xsum = (xsum & 0xffff) + (xsum >> 16);
- 	xsum = (xsum & 0xffff) + (xsum >> 16);
- 	return (xsum & 0xffff);
-diff -Nurd u-boot-1.1.2/net/tftp.c u-boot-1.1.2-oxe810/net/tftp.c
---- u-boot-1.1.2/net/tftp.c	2004-04-15 23:48:55.000000000 +0200
-+++ u-boot-1.1.2-oxe810/net/tftp.c	2008-06-11 17:55:11.000000000 +0200
-@@ -106,6 +106,7 @@
- 	volatile uchar *	pkt;
- 	volatile uchar *	xp;
- 	int			len = 0;
-+	volatile ushort *	s;
- 
- 	/*
- 	 *	We will always be sending some sort of packet, so
-@@ -117,7 +118,9 @@
- 
- 	case STATE_RRQ:
- 		xp = pkt;
--		*((ushort *)pkt)++ = htons(TFTP_RRQ);
-+		s = (ushort *)pkt;
-+		*s++ = htons(TFTP_RRQ);
-+		pkt = (uchar *)s;
- 		strcpy ((char *)pkt, tftp_filename);
- 		pkt += strlen(tftp_filename) + 1;
- 		strcpy ((char *)pkt, "octet");
-@@ -135,15 +138,19 @@
- 	case STATE_DATA:
- 	case STATE_OACK:
- 		xp = pkt;
--		*((ushort *)pkt)++ = htons(TFTP_ACK);
--		*((ushort *)pkt)++ = htons(TftpBlock);
-+		s = (ushort *)pkt;
-+		*s++ = htons(TFTP_ACK);
-+		*s++ = htons(TftpBlock);
-+		pkt = (uchar *)s;
- 		len = pkt - xp;
- 		break;
- 
- 	case STATE_TOO_LARGE:
- 		xp = pkt;
--		*((ushort *)pkt)++ = htons(TFTP_ERROR);
--		*((ushort *)pkt)++ = htons(3);
-+		s = (ushort *)pkt;
-+		*s++ = htons(TFTP_ERROR);
-+		*s++ = htons(3);
-+		pkt = (uchar *)s;
- 		strcpy ((char *)pkt, "File too large");
- 		pkt += 14 /*strlen("File too large")*/ + 1;
- 		len = pkt - xp;
-@@ -151,8 +158,10 @@
- 
- 	case STATE_BAD_MAGIC:
- 		xp = pkt;
--		*((ushort *)pkt)++ = htons(TFTP_ERROR);
--		*((ushort *)pkt)++ = htons(2);
-+		s = (ushort *)pkt;
-+		*s++ = htons(TFTP_ERROR);
-+		*s++ = htons(2);
-+		pkt = (uchar *)s;
- 		strcpy ((char *)pkt, "File has bad magic");
- 		pkt += 18 /*strlen("File has bad magic")*/ + 1;
- 		len = pkt - xp;
-@@ -167,6 +176,7 @@
- TftpHandler (uchar * pkt, unsigned dest, unsigned src, unsigned len)
- {
- 	ushort proto;
-+	ushort *s;
- 
- 	if (dest != TftpOurPort) {
- 		return;
-@@ -180,7 +190,9 @@
- 	}
- 	len -= 2;
- 	/* warning: don't use increment (++) in ntohs() macros!! */
--	proto = *((ushort *)pkt)++;
-+	s = (ushort *)pkt;
-+	proto = *s++;
-+	pkt = (uchar *)s;
- 	switch (ntohs(proto)) {
- 
- 	case TFTP_RRQ:
diff --git a/recipes/u-boot/u-boot_1.1.2.bb b/recipes/u-boot/u-boot_1.1.2.bb
index c83e31f532..8287d35a1d 100644
--- a/recipes/u-boot/u-boot_1.1.2.bb
+++ b/recipes/u-boot/u-boot_1.1.2.bb
@@ -13,7 +13,6 @@ SRC_URI_append_mnci   = "file://mnci.patch;patch=1 \
                          file://command-names.patch;patch=1"
 
 SRC_URI_append_magicbox  = "file://u-boot-emetec.patch;patch=1 "
-SRC_URI_append_oxnas     = "file://oxnas.patch;patch=1 "
 
 
 # TODO: SRC_URI_append_rt3000
@@ -23,7 +22,6 @@ TARGET_LDFLAGS = ""
 UBOOT_MACHINE_mnci   = "mnci_config"
 UBOOT_MACHINE_vibren = "pxa255_idp_config"
 UBOOT_MACHINE_magicbox = "EMETEC405_config"
-UBOOT_MACHINE_oxnas  = "oxnas_config"
 
 inherit base
 
-- 
cgit v1.2.3