Merge branch 'master' of git://git.denx.de/u-boot-mpc85xx
diff --git a/board/bf537-stamp/bf537-stamp.c b/board/bf537-stamp/bf537-stamp.c
index cd7a04d..a9b7a68 100644
--- a/board/bf537-stamp/bf537-stamp.c
+++ b/board/bf537-stamp/bf537-stamp.c
@@ -154,6 +154,16 @@
 }
 #endif				/* CONFIG_MISC_INIT_R */
 
+#if defined(CONFIG_BFIN_MAC)
+
+extern int bfin_EMAC_initialize(bd_t *bis);
+
+int board_eth_init(bd_t *bis)
+{
+	return bfin_EMAC_initialize(bis);
+}
+#endif
+
 #ifdef CONFIG_POST
 /* Using sw10-PF5 as the hotkey */
 int post_hotkeys_pressed(void)
diff --git a/board/freescale/mpc8610hpcd/mpc8610hpcd.c b/board/freescale/mpc8610hpcd/mpc8610hpcd.c
index c9dde4d..af79fc2 100644
--- a/board/freescale/mpc8610hpcd/mpc8610hpcd.c
+++ b/board/freescale/mpc8610hpcd/mpc8610hpcd.c
@@ -519,3 +519,13 @@
 
 	return val;
 }
+
+extern int uli526x_initialize(bd_t *);
+
+int board_eth_init(bd_t *bis)
+{
+#if defined(CONFIG_ULI526)
+	uli526x_initialize(bis);
+#endif
+	return 0;
+}
diff --git a/board/sl8245/sl8245.c b/board/sl8245/sl8245.c
index 8647887..c853755 100644
--- a/board/sl8245/sl8245.c
+++ b/board/sl8245/sl8245.c
@@ -66,3 +66,16 @@
 {
 	pci_mpc824x_init(&hose);
 }
+
+extern int skge_initialize(bd_t *bis);
+
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+
+#if defined(CONFIG_SK98)
+	rc = skge_initialize(bis);
+#endif
+	return rc;
+}
+
diff --git a/common/cmd_net.c b/common/cmd_net.c
index 79e910c..af691a4 100644
--- a/common/cmd_net.c
+++ b/common/cmd_net.c
@@ -39,8 +39,8 @@
 
 U_BOOT_CMD(
 	bootp,	3,	1,	do_bootp,
-	"bootp\t- boot image via network using BootP/TFTP protocol\n",
-	"[loadAddress] [bootfilename]\n"
+	"bootp\t- boot image via network using BOOTP/TFTP protocol\n",
+	"[loadAddress] [[hostIPaddr:]bootfilename]\n"
 );
 
 int do_tftpb (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
@@ -62,7 +62,7 @@
 U_BOOT_CMD(
 	rarpboot,	3,	1,	do_rarpb,
 	"rarpboot- boot image via network using RARP/TFTP protocol\n",
-	"[loadAddress] [bootfilename]\n"
+	"[loadAddress] [[hostIPaddr:]bootfilename]\n"
 );
 
 #if defined(CONFIG_CMD_DHCP)
@@ -73,8 +73,8 @@
 
 U_BOOT_CMD(
 	dhcp,	3,	1,	do_dhcp,
-	"dhcp\t- invoke DHCP client to obtain IP/boot params\n",
-	"\n"
+	"dhcp\t- boot image via network using DHCP/TFTP protocol\n",
+	"[loadAddress] [[hostIPaddr:]bootfilename]\n"
 );
 #endif
 
diff --git a/cpu/leon2/cpu.c b/cpu/leon2/cpu.c
index 1c1e24b..5de1c52 100644
--- a/cpu/leon2/cpu.c
+++ b/cpu/leon2/cpu.c
@@ -56,3 +56,12 @@
 }
 
 /* ------------------------------------------------------------------------- */
+
+extern int greth_initialize(bd_t *bis);
+
+#ifdef CONFIG_GRETH
+int cpu_eth_init(bd_t *bis)
+{
+	return greth_initialize(bis);
+}
+#endif
diff --git a/cpu/leon3/cpu.c b/cpu/leon3/cpu.c
index 306a210..1725fdb 100644
--- a/cpu/leon3/cpu.c
+++ b/cpu/leon3/cpu.c
@@ -65,3 +65,11 @@
 }
 
 /* ------------------------------------------------------------------------- */
+extern int greth_initialize(bd_t *bis);
+
+#ifdef CONFIG_GRETH
+int cpu_eth_init(bd_t *bis)
+{
+	return greth_initialize(bis);
+}
+#endif
diff --git a/cpu/mcf523x/cpu.c b/cpu/mcf523x/cpu.c
index f0d954b..8d2152d 100644
--- a/cpu/mcf523x/cpu.c
+++ b/cpu/mcf523x/cpu.c
@@ -107,3 +107,17 @@
 	return (0);
 }
 #endif				/* CONFIG_WATCHDOG */
+
+#if defined(CONFIG_MCFFEC)
+/* Default initializations for MCFFEC controllers.  To override,
+ * create a board-specific function called:
+ * 	int board_eth_init(bd_t *bis)
+ */
+
+extern int mcffec_initialize(bd_t*);
+
+int cpu_eth_init(bd_t *bis)
+{
+	return mcffec_initialize(bis);
+}
+#endif
diff --git a/cpu/mcf52x2/cpu.c b/cpu/mcf52x2/cpu.c
index d5d3d33..2af31cb 100644
--- a/cpu/mcf52x2/cpu.c
+++ b/cpu/mcf52x2/cpu.c
@@ -321,3 +321,18 @@
 	return 0;
 };
 #endif
+
+#if defined(CONFIG_MCFFEC)
+/* Default initializations for MCFFEC controllers.  To override,
+ * create a board-specific function called:
+ * 	int board_eth_init(bd_t *bis)
+ */
+
+extern int mcffec_initialize(bd_t*);
+
+int cpu_eth_init(bd_t *bis)
+{
+	return mcffec_initialize(bis);
+}
+#endif
+
diff --git a/cpu/mcf532x/cpu.c b/cpu/mcf532x/cpu.c
index 61541ab..20d0d5c 100644
--- a/cpu/mcf532x/cpu.c
+++ b/cpu/mcf532x/cpu.c
@@ -129,3 +129,17 @@
 	return (0);
 }
 #endif				/* CONFIG_WATCHDOG */
+
+#if defined(CONFIG_MCFFEC)
+/* Default initializations for MCFFEC controllers.  To override,
+ * create a board-specific function called:
+ * 	int board_eth_init(bd_t *bis)
+ */
+
+extern int mcffec_initialize(bd_t*);
+
+int cpu_eth_init(bd_t *bis)
+{
+	return mcffec_initialize(bis);
+}
+#endif
diff --git a/cpu/mcf5445x/cpu.c b/cpu/mcf5445x/cpu.c
index e601b89..ab342dd 100644
--- a/cpu/mcf5445x/cpu.c
+++ b/cpu/mcf5445x/cpu.c
@@ -95,3 +95,17 @@
 
 	return 0;
 }
+
+#if defined(CONFIG_MCFFEC)
+/* Default initializations for MCFFEC controllers.  To override,
+ * create a board-specific function called:
+ * 	int board_eth_init(bd_t *bis)
+ */
+
+extern int mcffec_initialize(bd_t*);
+
+int cpu_eth_init(bd_t *bis)
+{
+	return mcffec_initialize(bis);
+}
+#endif
diff --git a/cpu/mcf547x_8x/cpu.c b/cpu/mcf547x_8x/cpu.c
index 528bca6..1ba7aa8 100644
--- a/cpu/mcf547x_8x/cpu.c
+++ b/cpu/mcf547x_8x/cpu.c
@@ -141,3 +141,24 @@
 	return (0);
 }
 #endif				/* CONFIG_HW_WATCHDOG */
+
+#if defined(CONFIG_FSLDMAFEC) || defined(CONFIG_MCFFEC)
+/* Default initializations for MCFFEC controllers.  To override,
+ * create a board-specific function called:
+ * 	int board_eth_init(bd_t *bis)
+ */
+
+extern int mcdmafec_initialize(bd_t *bis);
+extern int mcffec_initialize(bd_t*);
+
+int cpu_eth_init(bd_t *bis)
+{
+#if defined(CONFIG_FSLDMAFEC)
+	mcdmafec_initialize(bis);
+#endif
+#if defined(CONFIG_MCFFEC)
+	mcffec_initialize(bis);
+#endif
+	return 0;
+}
+#endif
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c
index fe56949..3ee5d96 100644
--- a/drivers/net/bfin_mac.c
+++ b/drivers/net/bfin_mac.c
@@ -88,7 +88,7 @@
 
 	eth_register(dev);
 
-	return 1;
+	return 0;
 }
 
 static int bfin_EMAC_send(struct eth_device *dev, volatile void *packet,
diff --git a/drivers/net/dm9000x.c b/drivers/net/dm9000x.c
index e7365fe..3a61b80 100644
--- a/drivers/net/dm9000x.c
+++ b/drivers/net/dm9000x.c
@@ -55,8 +55,7 @@
 			These changes are tested with DM9000{A,EP,E} together
 			with a 200MHz Atmel AT91SAM92161 core
 
-TODO: Homerun NIC and longrun NIC are not functional, only internal at the
-      moment.
+TODO: external MII is not functional, only internal at the moment.
 */
 
 #include <common.h>
@@ -68,9 +67,6 @@
 
 /* Board/System/Debug information/definition ---------------- */
 
-#define DM9801_NOISE_FLOOR	0x08
-#define DM9802_NOISE_FLOOR	0x05
-
 /* #define CONFIG_DM9000_DEBUG */
 
 #ifdef CONFIG_DM9000_DEBUG
@@ -90,13 +86,6 @@
 #define DM9000_DMP_PACKET(func,packet,length)
 #endif
 
-enum DM9000_PHY_mode { DM9000_10MHD = 0, DM9000_100MHD =
-	    1, DM9000_10MFD = 4, DM9000_100MFD = 5, DM9000_AUTO =
-	    8, DM9000_1M_HPNA = 0x10
-};
-enum DM9000_NIC_TYPE { FASTETHER_NIC = 0, HOMERUN_NIC = 1, LONGRUN_NIC = 2
-};
-
 /* Structure/enum declaration ------------------------------- */
 typedef struct board_info {
 	u32 runt_length_counter;	/* counter: RX length < 64byte */
@@ -109,7 +98,6 @@
 	u16 dbug_cnt;
 	u8 phy_addr;
 	u8 device_wait_reset;	/* device state */
-	u8 nic_type;		/* NIC type */
 	unsigned char srom[128];
 	void (*outblk)(volatile void *data_ptr, int count);
 	void (*inblk)(void *data_ptr, int count);
@@ -117,10 +105,6 @@
 } board_info_t;
 static board_info_t dm9000_info;
 
-/* For module input parameter */
-static int media_mode = DM9000_AUTO;
-static u8 nfloor = 0;
-
 /* function declaration ------------------------------------- */
 int eth_init(bd_t * bd);
 int eth_send(volatile void *, int);
@@ -260,114 +244,6 @@
 	}
 }
 
-/* Set PHY operationg mode
-*/
-static void
-set_PHY_mode(void)
-{
-	u16 phy_reg4 = 0x01e1, phy_reg0 = 0x1000;
-	if (!(media_mode & DM9000_AUTO)) {
-		switch (media_mode) {
-		case DM9000_10MHD:
-			phy_reg4 = 0x21;
-			phy_reg0 = 0x0000;
-			break;
-		case DM9000_10MFD:
-			phy_reg4 = 0x41;
-			phy_reg0 = 0x1100;
-			break;
-		case DM9000_100MHD:
-			phy_reg4 = 0x81;
-			phy_reg0 = 0x2000;
-			break;
-		case DM9000_100MFD:
-			phy_reg4 = 0x101;
-			phy_reg0 = 0x3100;
-			break;
-		}
-		phy_write(4, phy_reg4);	/* Set PHY media mode */
-		phy_write(0, phy_reg0);	/*  Tmp */
-	}
-	DM9000_iow(DM9000_GPCR, 0x01);	/* Let GPIO0 output */
-	DM9000_iow(DM9000_GPR, 0x00);	/* Enable PHY */
-}
-
-/*
-	Init HomeRun DM9801
-*/
-static void
-program_dm9801(u16 HPNA_rev)
-{
-	__u16 reg16, reg17, reg24, reg25;
-	if (!nfloor)
-		nfloor = DM9801_NOISE_FLOOR;
-	reg16 = phy_read(16);
-	reg17 = phy_read(17);
-	reg24 = phy_read(24);
-	reg25 = phy_read(25);
-	switch (HPNA_rev) {
-	case 0xb900:		/* DM9801 E3 */
-		reg16 |= 0x1000;
-		reg25 = ((reg24 + nfloor) & 0x00ff) | 0xf000;
-		break;
-	case 0xb901:		/* DM9801 E4 */
-		reg25 = ((reg24 + nfloor) & 0x00ff) | 0xc200;
-		reg17 = (reg17 & 0xfff0) + nfloor + 3;
-		break;
-	case 0xb902:		/* DM9801 E5 */
-	case 0xb903:		/* DM9801 E6 */
-	default:
-		reg16 |= 0x1000;
-		reg25 = ((reg24 + nfloor - 3) & 0x00ff) | 0xc200;
-		reg17 = (reg17 & 0xfff0) + nfloor;
-	}
-	phy_write(16, reg16);
-	phy_write(17, reg17);
-	phy_write(25, reg25);
-}
-
-/*
-	Init LongRun DM9802
-*/
-static void
-program_dm9802(void)
-{
-	__u16 reg25;
-	if (!nfloor)
-		nfloor = DM9802_NOISE_FLOOR;
-	reg25 = phy_read(25);
-	reg25 = (reg25 & 0xff00) + nfloor;
-	phy_write(25, reg25);
-}
-
-/* Identify NIC type
-*/
-static void
-identify_nic(void)
-{
-	struct board_info *db = &dm9000_info;
-	u16 phy_reg3;
-	DM9000_iow(DM9000_NCR, NCR_EXT_PHY);
-	phy_reg3 = phy_read(3);
-	switch (phy_reg3 & 0xfff0) {
-	case 0xb900:
-		if (phy_read(31) == 0x4404) {
-			db->nic_type = HOMERUN_NIC;
-			program_dm9801(phy_reg3);
-			DM9000_DBG("found homerun NIC\n");
-		} else {
-			db->nic_type = LONGRUN_NIC;
-			DM9000_DBG("found longrun NIC\n");
-			program_dm9802();
-		}
-		break;
-	default:
-		db->nic_type = FASTETHER_NIC;
-		break;
-	}
-	DM9000_iow(DM9000_NCR, 0);
-}
-
 /* General Purpose dm9000 reset routine */
 static void
 dm9000_reset(void)
@@ -377,12 +253,12 @@
 	/* Reset DM9000,
 	   see DM9000 Application Notes V1.22 Jun 11, 2004 page 29 */
 
-	/* DEBUG: Make all GPIO pins outputs */
-	DM9000_iow(DM9000_GPCR, 0x0F);
+	/* DEBUG: Make all GPIO0 outputs, all others inputs */
+	DM9000_iow(DM9000_GPCR, GPCR_GPIO0_OUT);
 	/* Step 1: Power internal PHY by writing 0 to GPIO0 pin */
 	DM9000_iow(DM9000_GPR, 0);
 	/* Step 2: Software reset */
-	DM9000_iow(DM9000_NCR, 3);
+	DM9000_iow(DM9000_NCR, (NCR_LBK_INT_MAC | NCR_RST));
 
 	do {
 		DM9000_DBG("resetting the DM9000, 1st reset\n");
@@ -390,7 +266,7 @@
 	} while (DM9000_ior(DM9000_NCR) & 1);
 
 	DM9000_iow(DM9000_NCR, 0);
-	DM9000_iow(DM9000_NCR, 3); /* Issue a second reset */
+	DM9000_iow(DM9000_NCR, (NCR_LBK_INT_MAC | NCR_RST)); /* Issue a second reset */
 
 	do {
 		DM9000_DBG("resetting the DM9000, 2nd reset\n");
@@ -416,7 +292,9 @@
 
 	/* RESET device */
 	dm9000_reset();
-	dm9000_probe();
+
+	if (dm9000_probe() < 0)
+		return -1;
 
 	/* Auto-detect 8/16/32 bit mode, ISR Bit 6+7 indicate bus width */
 	io_mode = DM9000_ior(DM9000_ISR) >> 6;
@@ -449,21 +327,12 @@
 		break;
 	}
 
-	/* NIC Type: FASTETHER, HOMERUN, LONGRUN */
-	identify_nic();
-
-	/* GPIO0 on pre-activate PHY */
-	DM9000_iow(DM9000_GPR, 0x00);	/*REG_1F bit0 activate phyxcer */
-
-	/* Set PHY */
-	set_PHY_mode();
-
-	/* Program operating register, only intern phy supported by now */
+	/* Program operating register, only internal phy supported */
 	DM9000_iow(DM9000_NCR, 0x0);
 	/* TX Polling clear */
 	DM9000_iow(DM9000_TCR, 0);
 	/* Less 3Kb, 200us */
-	DM9000_iow(DM9000_BPTR, 0x3f);
+	DM9000_iow(DM9000_BPTR, BPTR_BPHW(3) | BPTR_JPT_600US);
 	/* Flow Control : High/Low Water */
 	DM9000_iow(DM9000_FCTR, FCTR_HWOT(3) | FCTR_LWOT(8));
 	/* SH FIXME: This looks strange! Flow Control */
@@ -473,10 +342,10 @@
 	/* clear TX status */
 	DM9000_iow(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);
 	/* Clear interrupt status */
-	DM9000_iow(DM9000_ISR, 0x0f);
+	DM9000_iow(DM9000_ISR, ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS);
 
 	/* Set Node address */
-#ifndef CONFIG_AT91SAM9261EK
+#if !defined(CONFIG_AT91SAM9261EK)
 	for (i = 0; i < 6; i++)
 		((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);
 #endif
@@ -498,7 +367,9 @@
 	printf("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", bd->bi_enetaddr[0],
 	       bd->bi_enetaddr[1], bd->bi_enetaddr[2], bd->bi_enetaddr[3],
 	       bd->bi_enetaddr[4], bd->bi_enetaddr[5]);
-	for (i = 0, oft = 0x10; i < 6; i++, oft++)
+
+	/* fill device MAC address registers */
+	for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++)
 		DM9000_iow(oft, bd->bi_enetaddr[i]);
 	for (i = 0, oft = 0x16; i < 8; i++, oft++)
 		DM9000_iow(oft, 0xff);
diff --git a/drivers/net/dm9000x.h b/drivers/net/dm9000x.h
index f47ff8c..0d123e2 100644
--- a/drivers/net/dm9000x.h
+++ b/drivers/net/dm9000x.h
@@ -66,6 +66,8 @@
 #define NCR_FCOL		(1<<4)
 #define NCR_FDX			(1<<3)
 #define NCR_LBK			(3<<1)
+#define NCR_LBK_INT_MAC		(1<<1)
+#define NCR_LBK_INT_PHY		(2<<1)
 #define NCR_RST			(1<<0)
 
 #define NSR_SPEED		(1<<7)
@@ -107,13 +109,32 @@
 #define RSR_CE			(1<<1)
 #define RSR_FOE			(1<<0)
 
+#define EPCR_EPOS_PHY		(1<<3)
+#define EPCR_EPOS_EE		(0<<3)
+#define EPCR_ERPRR		(1<<2)
+#define EPCR_ERPRW		(1<<1)
+#define EPCR_ERRE		(1<<0)
+
 #define FCTR_HWOT(ot)	(( ot & 0xf ) << 4 )
 #define FCTR_LWOT(ot)	( ot & 0xf )
 
+#define BPTR_BPHW(x)	((x) << 4)
+#define BPTR_JPT_200US		(0x07)
+#define BPTR_JPT_600US		(0x0f)
+
 #define IMR_PAR			(1<<7)
 #define IMR_ROOM		(1<<3)
 #define IMR_ROM			(1<<2)
 #define IMR_PTM			(1<<1)
 #define IMR_PRM			(1<<0)
 
+#define ISR_ROOS		(1<<3)
+#define ISR_ROS			(1<<2)
+#define ISR_PTS			(1<<1)
+#define ISR_PRS			(1<<0)
+
+#define GPCR_GPIO0_OUT		(1<<0)
+
+#define GPR_PHY_PWROFF		(1<<0)
+
 #endif
diff --git a/drivers/net/fsl_mcdmafec.c b/drivers/net/fsl_mcdmafec.c
index f2bdba6..59524a5 100644
--- a/drivers/net/fsl_mcdmafec.c
+++ b/drivers/net/fsl_mcdmafec.c
@@ -94,7 +94,7 @@
 	 0,			/* phy name */
 	 0,			/* phy name init */
 #ifdef CFG_DMA_USE_INTSRAM
-	 DBUF_LENGTH,		/* RX BD */
+	 (cbd_t *)DBUF_LENGTH,	/* RX BD */
 #else
 	 0,			/* RX BD */
 #endif
@@ -540,15 +540,16 @@
 
 		/* setup Receive and Transmit buffer descriptor */
 #ifdef CFG_DMA_USE_INTSRAM
-		fec_info[i].rxbd = (int)fec_info[i].rxbd + tmp;
-		tmp = fec_info[i].rxbd;
+		fec_info[i].rxbd = (cbd_t *)((u32)fec_info[i].rxbd + tmp);
+		tmp = (u32)fec_info[i].rxbd;
 		fec_info[i].txbd =
-		    (int)fec_info[i].txbd + tmp + (PKTBUFSRX * sizeof(cbd_t));
-		tmp = fec_info[i].txbd;
+		    (cbd_t *)((u32)fec_info[i].txbd + tmp +
+		    (PKTBUFSRX * sizeof(cbd_t)));
+		tmp = (u32)fec_info[i].txbd;
 		fec_info[i].txbuf =
-		    (int)fec_info[i].txbuf + tmp +
-		    (CFG_TX_ETH_BUFFER * sizeof(cbd_t));
-		tmp = fec_info[i].txbuf;
+		    (char *)((u32)fec_info[i].txbuf + tmp +
+		    (CFG_TX_ETH_BUFFER * sizeof(cbd_t)));
+		tmp = (u32)fec_info[i].txbuf;
 #else
 		fec_info[i].rxbd =
 		    (cbd_t *) memalign(CFG_CACHELINE_SIZE,
@@ -582,5 +583,5 @@
 	/* default speed */
 	bis->bi_ethspeed = 10;
 
-	return 1;
+	return 0;
 }
diff --git a/drivers/net/greth.c b/drivers/net/greth.c
index 76ece59..90c5338 100644
--- a/drivers/net/greth.c
+++ b/drivers/net/greth.c
@@ -657,5 +657,5 @@
 	/* set and remember MAC address */
 	greth_set_hwaddr(greth, addr);
 
-	return 1;
+	return 0;
 }
diff --git a/drivers/net/mcffec.c b/drivers/net/mcffec.c
index 58ed5e3..50d6508 100644
--- a/drivers/net/mcffec.c
+++ b/drivers/net/mcffec.c
@@ -66,6 +66,7 @@
 	 0,			/* tx Index */
 	 0,			/* tx buffer */
 	 0,			/* initialized flag */
+	 (struct fec_info_s *)-1,
 	 },
 #endif
 #ifdef CFG_FEC1_IOBASE
@@ -78,12 +79,17 @@
 	 0,			/* duplex and speed */
 	 0,			/* phy name */
 	 0,			/* phy name init */
+#ifdef CFG_FEC_BUF_USE_SRAM
+	 (cbd_t *)DBUF_LENGTH,	/* RX BD */
+#else
 	 0,			/* RX BD */
+#endif
 	 0,			/* TX BD */
 	 0,			/* rx Index */
 	 0,			/* tx Index */
 	 0,			/* tx buffer */
 	 0,			/* initialized flag */
+	 (struct fec_info_s *)-1,
 	 }
 #endif
 };
@@ -168,16 +174,22 @@
 	/* Activate transmit Buffer Descriptor polling */
 	fecp->tdar = 0x01000000;	/* Descriptor polling active    */
 
-	/* FEC fix for MCF5275, FEC unable to initial transmit data packet.
+#ifndef CFG_FEC_BUF_USE_SRAM
+	/*
+	 * FEC unable to initial transmit data packet.
 	 * A nop will ensure the descriptor polling active completed.
+	 * CF Internal RAM has shorter cycle access than DRAM. If use
+	 * DRAM as Buffer descriptor and data, a nop is a must.
+	 * Affect only V2 and V3.
 	 */
-#ifdef CONFIG_M5275
 	__asm__ ("nop");
+
 #endif
 
 #ifdef CFG_UNIFY_CACHE
 	icache_invalid();
 #endif
+
 	j = 0;
 	while ((info->txbd[info->txIdx].cbd_sc & BD_ENET_TX_READY) &&
 	       (j < MCFFEC_TOUT_LOOP)) {
@@ -209,6 +221,8 @@
 	int length;
 
 	for (;;) {
+#ifndef CFG_FEC_BUF_USE_SRAM
+#endif
 #ifdef CFG_UNIFY_CACHE
 		icache_invalid();
 #endif
@@ -553,6 +567,9 @@
 {
 	struct eth_device *dev;
 	int i;
+#ifdef CFG_FEC_BUF_USE_SRAM
+	u32 tmp = CFG_INIT_RAM_ADDR + 0x1000;
+#endif
 
 	for (i = 0; i < sizeof(fec_info) / sizeof(fec_info[0]); i++) {
 
@@ -573,6 +590,18 @@
 		dev->recv = fec_recv;
 
 		/* setup Receive and Transmit buffer descriptor */
+#ifdef CFG_FEC_BUF_USE_SRAM
+		fec_info[i].rxbd = (cbd_t *)((u32)fec_info[i].rxbd + tmp);
+		tmp = (u32)fec_info[i].rxbd;
+		fec_info[i].txbd =
+		    (cbd_t *)((u32)fec_info[i].txbd + tmp +
+		    (PKTBUFSRX * sizeof(cbd_t)));
+		tmp = (u32)fec_info[i].txbd;
+		fec_info[i].txbuf =
+		    (char *)((u32)fec_info[i].txbuf + tmp +
+		    (CFG_TX_ETH_BUFFER * sizeof(cbd_t)));
+		tmp = (u32)fec_info[i].txbuf;
+#else
 		fec_info[i].rxbd =
 		    (cbd_t *) memalign(CFG_CACHELINE_SIZE,
 				       (PKTBUFSRX * sizeof(cbd_t)));
@@ -581,6 +610,8 @@
 				       (TX_BUF_CNT * sizeof(cbd_t)));
 		fec_info[i].txbuf =
 		    (char *)memalign(CFG_CACHELINE_SIZE, DBUF_LENGTH);
+#endif
+
 #ifdef ET_DEBUG
 		printf("rxbd %x txbd %x\n",
 		       (int)fec_info[i].rxbd, (int)fec_info[i].txbd);
@@ -594,10 +625,13 @@
 		miiphy_register(dev->name,
 				mcffec_miiphy_read, mcffec_miiphy_write);
 #endif
+		if (i > 0)
+			fec_info[i - 1].next = &fec_info[i];
 	}
+	fec_info[i - 1].next = &fec_info[0];
 
 	/* default speed */
 	bis->bi_ethspeed = 10;
 
-	return 1;
+	return 0;
 }
diff --git a/drivers/net/sk98lin/Makefile b/drivers/net/sk98lin/Makefile
index 8b83fae..f1bc4a7 100644
--- a/drivers/net/sk98lin/Makefile
+++ b/drivers/net/sk98lin/Makefile
@@ -29,24 +29,12 @@
 
 LIB	:= $(obj)libsk98lin.a
 
-COBJS-y += skge.o
-COBJS-y += skaddr.o
-COBJS-y += skgehwt.o
-COBJS-y += skgeinit.o
-COBJS-y += skgepnmi.o
-COBJS-y += skgesirq.o
-COBJS-y += ski2c.o
-COBJS-y += sklm80.o
-COBJS-y += skqueue.o
-COBJS-y += skrlmt.o
-COBJS-y += sktimer.o
-COBJS-y += skvpd.o
-COBJS-y += skxmac2.o
-COBJS-y += skcsum.o
+COBJS-$(CONFIG_SK98) += skge.o skaddr.o skgehwt.o skgeinit.o skgepnmi.o \
+	skgesirq.o ski2c.o sklm80.o skqueue.o skrlmt.o sktimer.o \
+	skvpd.o skxmac2.o skcsum.o
 #COBJS-y += skproc.o
 
-COBJS-y += uboot_skb.o
-COBJS-y += uboot_drv.o
+COBJS-$(CONFIG_SK98) += uboot_skb.o uboot_drv.o
 
 COBJS	:= $(COBJS-y)
 SRCS	:= $(COBJS:.o=.c)
diff --git a/drivers/net/sk98lin/skaddr.c b/drivers/net/sk98lin/skaddr.c
index ed79c04..8d34f72 100644
--- a/drivers/net/sk98lin/skaddr.c
+++ b/drivers/net/sk98lin/skaddr.c
@@ -220,8 +220,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #ifndef	lint
 static const char SysKonnectFileId[] =
 	"@(#) $Id: skaddr.c,v 1.48 2003/02/12 17:09:37 tschilli Exp $ (C) SysKonnect.";
@@ -1875,5 +1873,3 @@
 #ifdef __cplusplus
 }
 #endif	/* __cplusplus */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skcsum.c b/drivers/net/sk98lin/skcsum.c
index a5dc572..162b67d 100644
--- a/drivers/net/sk98lin/skcsum.c
+++ b/drivers/net/sk98lin/skcsum.c
@@ -72,8 +72,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #ifdef SK_USE_CSUM	/* Check if CSUM is to be used. */
 
 #ifndef lint
@@ -925,5 +923,3 @@
 }	/* SkCsEvent */
 
 #endif	/* SK_USE_CSUM */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skge.c b/drivers/net/sk98lin/skge.c
index e1d7e87..c815480 100644
--- a/drivers/net/sk98lin/skge.c
+++ b/drivers/net/sk98lin/skge.c
@@ -342,8 +342,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #include	"h/skversion.h"
 #if 0
 #include	<linux/module.h>
@@ -4860,5 +4858,3 @@
 } /* DumpLong */
 
 #endif
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skgehwt.c b/drivers/net/sk98lin/skgehwt.c
index f8681a8..ca08eb1 100644
--- a/drivers/net/sk98lin/skgehwt.c
+++ b/drivers/net/sk98lin/skgehwt.c
@@ -75,8 +75,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
 	Event queue and dispatcher
 */
@@ -214,7 +212,4 @@
 	pAC->Hwt.TStop = pAC->Hwt.TStart;
 	SkTimerDone(pAC,Ioc) ;
 }
-
-#endif /* CONFIG_SK98 */
-
 /* End of file */
diff --git a/drivers/net/sk98lin/skgeinit.c b/drivers/net/sk98lin/skgeinit.c
index e49685b..ab740c7 100644
--- a/drivers/net/sk98lin/skgeinit.c
+++ b/drivers/net/sk98lin/skgeinit.c
@@ -395,8 +395,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #include "h/skdrv1st.h"
 #include "h/skdrv2nd.h"
 
@@ -2367,5 +2365,3 @@
 
 	return(0);
 }	/* SkGeInitPort */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skgemib.c b/drivers/net/sk98lin/skgemib.c
index 4a9e9e6..7f62e9c 100644
--- a/drivers/net/sk98lin/skgemib.c
+++ b/drivers/net/sk98lin/skgemib.c
@@ -52,8 +52,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
  * PRIVATE OID handler function prototypes
  */
@@ -1056,5 +1054,3 @@
 		0,
 		SK_PNMI_RO, Vct, 0},
 };
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skgepnmi.c b/drivers/net/sk98lin/skgepnmi.c
index 16fa352..d0e33cb 100644
--- a/drivers/net/sk98lin/skgepnmi.c
+++ b/drivers/net/sk98lin/skgepnmi.c
@@ -434,8 +434,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 static const char SysKonnectFileId[] =
 	"@(#) $Id: skgepnmi.c,v 1.102 2002/12/16 14:03:24 tschilli Exp $"
 	" (C) SysKonnect.";
@@ -8306,5 +8304,3 @@
 	}
 
 } /* CheckVctStatus */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skgesirq.c b/drivers/net/sk98lin/skgesirq.c
index c9763e7..106fe48 100644
--- a/drivers/net/sk98lin/skgesirq.c
+++ b/drivers/net/sk98lin/skgesirq.c
@@ -339,8 +339,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
  *	Special Interrupt handler
  *
@@ -2412,6 +2410,4 @@
 }	/* SkPhyIsrLone */
 #endif /* OTHER_PHY */
 
-#endif /* CONFIG_SK98 */
-
 /* End of File */
diff --git a/drivers/net/sk98lin/ski2c.c b/drivers/net/sk98lin/ski2c.c
index 0c5d9b4..894cc67 100644
--- a/drivers/net/sk98lin/ski2c.c
+++ b/drivers/net/sk98lin/ski2c.c
@@ -230,8 +230,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
  *	I2C Protocol
  */
@@ -1501,5 +1499,3 @@
 }	/* SkI2cEvent*/
 
 #endif	/* !SK_DIAG */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/sklm80.c b/drivers/net/sk98lin/sklm80.c
index 0229877..9f455f7 100644
--- a/drivers/net/sk98lin/sklm80.c
+++ b/drivers/net/sk98lin/sklm80.c
@@ -100,8 +100,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
 	LM80 functions
 */
@@ -288,5 +286,3 @@
 	/* Not completed */
 	return(0);
 }
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skproc.c b/drivers/net/sk98lin/skproc.c
index 94a6a56..9325ee7 100644
--- a/drivers/net/sk98lin/skproc.c
+++ b/drivers/net/sk98lin/skproc.c
@@ -72,8 +72,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #include <linux/proc_fs.h>
 
 #include "h/skdrv1st.h"
@@ -510,5 +508,3 @@
 
 	return strorg;
 }
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skqueue.c b/drivers/net/sk98lin/skqueue.c
index c49baed..de7441e 100644
--- a/drivers/net/sk98lin/skqueue.c
+++ b/drivers/net/sk98lin/skqueue.c
@@ -89,8 +89,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
 	Event queue and dispatcher
 */
@@ -237,6 +235,4 @@
 	return(0) ;
 }
 
-#endif /* CONFIG_SK98 */
-
 /* End of file */
diff --git a/drivers/net/sk98lin/skrlmt.c b/drivers/net/sk98lin/skrlmt.c
index 14a6f40..2e7924d 100644
--- a/drivers/net/sk98lin/skrlmt.c
+++ b/drivers/net/sk98lin/skrlmt.c
@@ -282,8 +282,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #ifndef	lint
 static const char SysKonnectFileId[] =
 	"@(#) $Id: skrlmt.c,v 1.68 2003/01/31 15:26:56 rschmidt Exp $ (C) SysKonnect.";
@@ -3504,5 +3502,3 @@
 #ifdef __cplusplus
 }
 #endif	/* __cplusplus */
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/sktimer.c b/drivers/net/sk98lin/sktimer.c
index 37cd4c9..8363ce4 100644
--- a/drivers/net/sk98lin/sktimer.c
+++ b/drivers/net/sk98lin/sktimer.c
@@ -74,8 +74,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
 	Event queue and dispatcher
 */
@@ -292,6 +290,4 @@
 	}
 }
 
-#endif /* CONFIG_SK98 */
-
 /* End of file */
diff --git a/drivers/net/sk98lin/skvpd.c b/drivers/net/sk98lin/skvpd.c
index 429da82..7935195 100644
--- a/drivers/net/sk98lin/skvpd.c
+++ b/drivers/net/sk98lin/skvpd.c
@@ -162,8 +162,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 /*
 	Please refer skvpd.txt for infomation how to include this module
  */
@@ -1325,5 +1323,3 @@
 
 	(void)VpdUpdate(pAC, IoC);
 }
-
-#endif /* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/skxmac2.c b/drivers/net/sk98lin/skxmac2.c
index 7946000..e0ded42 100644
--- a/drivers/net/sk98lin/skxmac2.c
+++ b/drivers/net/sk98lin/skxmac2.c
@@ -412,8 +412,6 @@
 
 #include <config.h>
 
-#ifdef CONFIG_SK98
-
 #include "h/skdrv1st.h"
 #include "h/skdrv2nd.h"
 
@@ -4391,6 +4389,4 @@
 	return(0);
 }	/* SkGmCableDiagStatus */
 
-#endif /* CONFIG_SK98 */
-
 /* End of file */
diff --git a/drivers/net/sk98lin/uboot_drv.c b/drivers/net/sk98lin/uboot_drv.c
index d02cd1b..205e7d2 100644
--- a/drivers/net/sk98lin/uboot_drv.c
+++ b/drivers/net/sk98lin/uboot_drv.c
@@ -25,9 +25,6 @@
 
 #include <common.h>
 
-#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
-	defined(CONFIG_SK98)
-
 #include "h/skdrv1st.h"
 #include "h/skdrv2nd.h"
 #include "u-boot_compat.h"
@@ -73,7 +70,7 @@
 		eth_register(dev[i]);
 	}
 
-	return numdev;
+	return ((numdev > 0) && (numdev <= SKGE_MAX_CARDS) ? 0 : -1);
 }
 
 
@@ -138,6 +135,3 @@
 
 	return 0;
 }
-
-
-#endif	/* CONFIG_SK98 */
diff --git a/drivers/net/sk98lin/uboot_skb.c b/drivers/net/sk98lin/uboot_skb.c
index 3a487a8..487f01e 100644
--- a/drivers/net/sk98lin/uboot_skb.c
+++ b/drivers/net/sk98lin/uboot_skb.c
@@ -24,9 +24,6 @@
  */
 
 #include <config.h>
-
-#ifdef CONFIG_SK98
-
 #include <common.h>
 #include "u-boot_compat.h"
 
@@ -118,5 +115,3 @@
 {
 	skb->len+=len;
 }
-
-#endif /* CONFIG_SK98 */
diff --git a/net/bootp.c b/net/bootp.c
index 5121caa..64552ac 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -969,6 +969,9 @@
 			return;
 		}
 		break;
+	case BOUND:
+		/* DHCP client bound to address */
+		break;
 	default:
 		puts ("DHCP: INVALID STATE\n");
 		break;
diff --git a/net/bootp.h b/net/bootp.h
index 320cc3b..c2f011c 100644
--- a/net/bootp.h
+++ b/net/bootp.h
@@ -60,7 +60,7 @@
 extern char	BootFile[128];		/* Boot file name			*/
 extern int	BootpTry;
 #ifdef CONFIG_BOOTP_RANDOM_DELAY
-ulong		seed1, seed2;		/* seed for random BOOTP delay		*/
+extern ulong	seed1, seed2;		/* seed for random BOOTP delay		*/
 #endif
 
 
diff --git a/net/eth.c b/net/eth.c
index 8e83b66..4e508a0 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -63,15 +63,9 @@
 extern int rtl8139_initialize(bd_t*);
 extern int rtl8169_initialize(bd_t*);
 extern int scc_initialize(bd_t*);
-extern int skge_initialize(bd_t*);
 extern int tsi108_eth_initialize(bd_t*);
-extern int uli526x_initialize(bd_t *);
 extern int npe_initialize(bd_t *);
 extern int uec_initialize(int);
-extern int bfin_EMAC_initialize(bd_t *);
-extern int greth_initialize(bd_t *);
-extern int mcffec_initialize(bd_t*);
-extern int mcdmafec_initialize(bd_t*);
 extern int at91sam9_eth_initialize(bd_t *);
 
 #ifdef CONFIG_API
@@ -205,9 +199,6 @@
 #if defined(CONFIG_MPC8220_FEC)
 	mpc8220_fec_initialize(bis);
 #endif
-#if defined(CONFIG_SK98)
-	skge_initialize(bis);
-#endif
 #if defined(CONFIG_UEC_ETH1)
 	uec_initialize(0);
 #endif
@@ -257,27 +248,12 @@
 #if defined(CONFIG_TSI108_ETH)
 	tsi108_eth_initialize(bis);
 #endif
-#if defined(CONFIG_ULI526X)
-	uli526x_initialize(bis);
-#endif
 #if defined(CONFIG_RTL8139)
 	rtl8139_initialize(bis);
 #endif
 #if defined(CONFIG_RTL8169)
 	rtl8169_initialize(bis);
 #endif
-#if defined(CONFIG_BF537)
-	bfin_EMAC_initialize(bis);
-#endif
-#if defined(CONFIG_GRETH)
-	greth_initialize(bis);
-#endif
-#if defined(CONFIG_MCFFEC)
-	mcffec_initialize(bis);
-#endif
-#if defined(CONFIG_FSLDMAFEC)
-	mcdmafec_initialize(bis);
-#endif
 #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \
     defined(CONFIG_AT91SAM9263)
 	at91sam9_eth_initialize(bis);