diff -x CVS -w -ur u-boot-1.1.4/MAKEALL uboot-grocx/MAKEALL
--- u-boot-1.1.4/MAKEALL	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/MAKEALL	2007-09-20 14:56:05.000000000 +0200
@@ -179,7 +179,9 @@
 	cp946es		cp966		lpd7a400	mp2usb		\
 	mx1ads		mx1fs2		omap1510inn	omap1610h2	\
 	omap1610inn	omap730p2	scb9328		smdk2400	\
-	smdk2410	trab		VCMA9		versatile	\
+	smdk2410	star_dorado	star_virgo	star_dorado2	\
+	star_equuleus							\
+	trab		VCMA9		versatile			\
 	versatileab	versatilepb	voiceblue
 "
 
diff -x CVS -w -ur u-boot-1.1.4/Makefile uboot-grocx/Makefile
--- u-boot-1.1.4/Makefile	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/Makefile	2007-09-20 15:05:57.000000000 +0200
@@ -121,6 +121,8 @@
 LIBS += drivers/sk98lin/libsk98lin.a
 LIBS += post/libpost.a post/cpu/libcpu.a
 LIBS += common/libcommon.a
+LIBS += $(BOARDLIBS)
+
 .PHONY : $(LIBS)
 
 # Add GCC lib
@@ -130,11 +132,13 @@
 # The "tools" are needed early, so put this first
 # Don't include stuff already done in $(LIBS)
 SUBDIRS	= tools \
-	  examples \
 	  post \
 	  post/cpu
 .PHONY : $(SUBDIRS)
 
+#	  examples \
+#
+
 #########################################################################
 #########################################################################
 
@@ -1419,6 +1423,14 @@
 mp2usb_config	:	unconfig
 	@./mkconfig $(@:_config=) arm arm920t mp2usb NULL at91rm9200
 
+grocx_scutum_config		:	unconfig
+	@./mkconfig $(@:_config=) arm arm926ejs scutum vitesse grocx
+
+grocx_scutum_spi_config	:	unconfig
+	@./mkconfig $(@:_config=) arm arm926ejs scutum vitesse grocx
+
+grocx_epon_config	:	unconfig
+	@./mkconfig $(@:_config=) arm arm926ejs scutum vitesse grocx
 
 ########################################################################
 ## ARM Integrator boards - see doc/README-integrator for more info.
@@ -1818,7 +1824,7 @@
 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 \
Only in u-boot-1.1.4/board/MAI/bios_emulator/scitech/lib/debug/linux/gcc: glibc.so
Only in u-boot-1.1.4/board/MAI/bios_emulator/scitech/lib/debug/linux/gcc: libc.so
Only in u-boot-1.1.4/board/MAI/bios_emulator/scitech/lib/release/linux/gcc: glibc.so
Only in u-boot-1.1.4/board/MAI/bios_emulator/scitech/lib/release/linux/gcc: libc.so
Only in u-boot-1.1.4/board/MAI/bios_emulator/scitech/src/pm/os2: dossctl.obj
Only in uboot-grocx/board: star_cetusplus
Only in uboot-grocx/board: vitesse
diff -x CVS -w -ur u-boot-1.1.4/common/cmd_flash.c uboot-grocx/common/cmd_flash.c
--- u-boot-1.1.4/common/cmd_flash.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/common/cmd_flash.c	2007-09-20 14:59:32.000000000 +0200
@@ -232,15 +232,15 @@
 
 			if (addr_first > end)
 				continue;
-			if (addr_last < info->start[sect])
-				continue;
-
 			if (addr_first == info->start[sect]) {
 				s_first[bank] = sect;
 			}
-			if (addr_last  == end) {
+			if (addr_last > end)
+				continue;
+			if (addr_last <= end) {
 				s_last[bank]  = sect;
 			}
+			break;
 		}
 		if (s_first[bank] >= 0) {
 			if (s_last[bank] < 0) {
diff -x CVS -w -ur u-boot-1.1.4/common/env_flash.c uboot-grocx/common/env_flash.c
--- u-boot-1.1.4/common/env_flash.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/common/env_flash.c	2007-09-20 14:59:31.000000000 +0200
@@ -190,6 +190,7 @@
 				up_data, saved_data);
 	}
 #endif
+#if 0
 	puts ("Erasing Flash...");
 	debug (" %08lX ... %08lX ...",
 		(ulong)flash_addr_new, end_addr_new);
@@ -197,6 +198,7 @@
 	if (flash_sect_erase ((ulong)flash_addr_new, end_addr_new)) {
 		goto Done;
 	}
+#endif
 
 	puts ("Writing to Flash... ");
 	debug (" %08lX ... %08lX ...",
@@ -332,9 +334,11 @@
 	if (flash_sect_protect (0, flash_sect_addr, end_addr))
 		return 1;
 
+#if 0
 	puts ("Erasing Flash...");
 	if (flash_sect_erase (flash_sect_addr, end_addr))
 		return 1;
+#endif
 
 	puts ("Writing to Flash... ");
 	rc = flash_write((char *)env_buffer, flash_sect_addr, len);
diff -x CVS -w -ur u-boot-1.1.4/common/flash.c uboot-grocx/common/flash.c
--- u-boot-1.1.4/common/flash.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/common/flash.c	2007-09-20 14:59:28.000000000 +0200
@@ -167,6 +167,8 @@
 		}
 	}
 
+	flash_sect_erase(addr, end);
+
 	/* finally write data to flash */
 	for (info = info_first; info <= info_last && cnt>0; ++info) {
 		ulong len;
diff -x CVS -w -ur u-boot-1.1.4/common/main.c uboot-grocx/common/main.c
--- u-boot-1.1.4/common/main.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/common/main.c	2007-09-20 14:59:29.000000000 +0200
@@ -491,6 +491,8 @@
 
 		if (len == -1)
 			puts ("<INTERRUPT>\n");
+		else if (len == 0)
+			continue;
 		else
 			rc = run_command (lastcommand, flag);
 
diff -x CVS -w -ur u-boot-1.1.4/config.mk uboot-grocx/config.mk
--- u-boot-1.1.4/config.mk	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/config.mk	2007-09-20 14:56:05.000000000 +0200
@@ -22,6 +22,7 @@
 #
 
 #########################################################################
+#CROSS_COMPILE = arm-linux-
 
 # clean the slate ...
 PLATFORM_RELFLAGS =
@@ -120,6 +121,7 @@
 
 CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)		\
 	-D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE)		\
+	-DALLOC_MEM_END=$(ALLOC_MEM_END)		\
 	-I$(TOPDIR)/include				\
 	-fno-builtin -ffreestanding -nostdinc -isystem	\
 	$(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
@@ -176,7 +178,7 @@
 export	CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE \
 	AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP \
 	MAKE
-export	TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
+export	TEXT_BASE MEM_END PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
 
 #########################################################################
 
Only in uboot-grocx/cpu/arm926ejs: cetusplus
diff -x CVS -w -ur u-boot-1.1.4/cpu/arm926ejs/cpu.c uboot-grocx/cpu/arm926ejs/cpu.c
--- u-boot-1.1.4/cpu/arm926ejs/cpu.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/cpu/arm926ejs/cpu.c	2007-09-20 15:08:28.000000000 +0200
@@ -93,9 +93,16 @@
 #ifdef CONFIG_USE_IRQ
 	DECLARE_GLOBAL_DATA_PTR;
 
+#ifdef CONFIG_GROCX
+	IRQ_STACK_START = _armboot_alloc_mem_end - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;
+#else
 	IRQ_STACK_START = _armboot_start - CFG_MALLOC_LEN - CFG_GBL_DATA_SIZE - 4;
+#endif
 	FIQ_STACK_START = IRQ_STACK_START - CONFIG_STACKSIZE_IRQ;
 #endif
+#ifdef CONFIG_GROCX
+	//icache_enable();
+#endif
 	return 0;
 }
 
Only in uboot-grocx/cpu/arm926ejs: grocx
diff -x CVS -w -ur u-boot-1.1.4/cpu/arm926ejs/interrupts.c uboot-grocx/cpu/arm926ejs/interrupts.c
--- u-boot-1.1.4/cpu/arm926ejs/interrupts.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/cpu/arm926ejs/interrupts.c	2007-09-20 15:08:28.000000000 +0200
@@ -38,16 +38,7 @@
 #include <common.h>
 #include <arm926ejs.h>
 #include <asm/proc-armv/ptrace.h>
-
-#define TIMER_LOAD_VAL 0xffffffff
-
-/* macro to read the 32 bit timer */
-#ifdef CONFIG_OMAP
-#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+8))
-#endif
-#ifdef CONFIG_VERSATILE
-#define READ_TIMER (*(volatile ulong *)(CFG_TIMERBASE+4))
-#endif
+#include <asm/arch/star_intc.h>
 
 #ifdef CONFIG_USE_IRQ
 /* enable IRQ interrupts */
@@ -175,159 +166,26 @@
 	bad_mode ();
 }
 
-void do_irq (struct pt_regs *pt_regs)
-{
-	printf ("interrupt request\n");
-	show_regs (pt_regs);
-	bad_mode ();
-}
-
-#ifdef CONFIG_INTEGRATOR
-
-	/* Timer functionality supplied by Integrator board (AP or CP) */
-
-#else
-
-static ulong timestamp;
-static ulong lastdec;
-
-/* nothing really to do with interrupts, just starts up a counter. */
-int interrupt_init (void)
-{
-#ifdef CONFIG_OMAP
-	int32_t val;
-
-	/* Start the decrementer ticking down from 0xffffffff */
-	*((int32_t *) (CFG_TIMERBASE + LOAD_TIM)) = TIMER_LOAD_VAL;
-	val = MPUTIM_ST | MPUTIM_AR | MPUTIM_CLOCK_ENABLE | (CFG_PVT << MPUTIM_PTV_BIT);
-	*((int32_t *) (CFG_TIMERBASE + CNTL_TIMER)) = val;
-#endif	/* CONFIG_OMAP */
-
-#ifdef CONFIG_VERSATILE
-	*(volatile ulong *)(CFG_TIMERBASE + 0) = CFG_TIMER_RELOAD;	/* TimerLoad */
-	*(volatile ulong *)(CFG_TIMERBASE + 4) = CFG_TIMER_RELOAD;	/* TimerValue */
-	*(volatile ulong *)(CFG_TIMERBASE + 8) = 0x8C;
-#endif	/* CONFIG_VERSATILE */
-
-	/* init the timestamp and lastdec value */
-	reset_timer_masked();
-
-	return (0);
-}
-
-/*
- * timer without interrupts
- */
-
-void reset_timer (void)
-{
-	reset_timer_masked ();
-}
-
-ulong get_timer (ulong base)
-{
-	return get_timer_masked () - base;
-}
-
-void set_timer (ulong t)
-{
-	timestamp = t;
-}
-
-/* delay x useconds AND perserve advance timstamp value */
-void udelay (unsigned long usec)
-{
-	ulong tmo, tmp;
-
-	if(usec >= 1000){		/* if "big" number, spread normalization to seconds */
-		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
-		tmo *= CFG_HZ;		/* find number of "ticks" to wait to achieve target */
-		tmo /= 1000;		/* finish normalize. */
-	}else{				/* else small number, don't kill it prior to HZ multiply */
-		tmo = usec * CFG_HZ;
-		tmo /= (1000*1000);
-	}
-
-	tmp = get_timer (0);		/* get current timestamp */
-	if( (tmo + tmp + 1) < tmp )	/* if setting this fordward will roll time stamp */
-		reset_timer_masked ();	/* reset "advancing" timestamp to 0, set lastdec value */
-	else
-		tmo += tmp;		/* else, set advancing stamp wake up time */
-
-	while (get_timer_masked () < tmo)/* loop till event */
-		/*NOP*/;
-}
-
-void reset_timer_masked (void)
-{
-	/* reset time */
-	lastdec = READ_TIMER;  /* capure current decrementer value time */
-	timestamp = 0;	       /* start "advancing" time stamp from 0 */
-}
-
-ulong get_timer_masked (void)
-{
-	ulong now = READ_TIMER;		/* current tick value */
-
-	if (lastdec >= now) {		/* normal mode (non roll) */
-		/* normal mode */
-		timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
-	} else {			/* we have overflow of the count down timer */
-		/* nts = ts + ld + (TLV - now)
-		 * ts=old stamp, ld=time that passed before passing through -1
-		 * (TLV-now) amount of time after passing though -1
-		 * nts = new "advancing time stamp"...it could also roll and cause problems.
-		 */
-		timestamp += lastdec + TIMER_LOAD_VAL - now;
-	}
-	lastdec = now;
-
-	return timestamp;
-}
+#if defined(CONFIG_GROCX) && defined(CONFIG_USE_IRQ)
+extern void timer2_isr(void);
+extern void timer1_isr(void);
+#endif
 
-/* waits specified delay value and resets timestamp */
-void udelay_masked (unsigned long usec)
+void do_irq (struct pt_regs *pt_regs)
 {
-	ulong tmo;
-	ulong endtime;
-	signed long diff;
+#if defined(CONFIG_GROCX) && defined(CONFIG_USE_IRQ)
+	u32 irq_status = INTC_IRQ_STATUS_REG;
 
-	if (usec >= 1000) {		/* if "big" number, spread normalization to seconds */
-		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
-		tmo *= CFG_HZ;		/* find number of "ticks" to wait to achieve target */
-		tmo /= 1000;		/* finish normalize. */
-	} else {			/* else small number, don't kill it prior to HZ multiply */
-		tmo = usec * CFG_HZ;
-		tmo /= (1000*1000);
+	if (irq_status & (0x1 << INTC_TIMER1_BIT_INDEX)) {
+		timer1_isr();
 	}
-
-	endtime = get_timer_masked () + tmo;
-
-	do {
-		ulong now = get_timer_masked ();
-		diff = endtime - now;
-	} while (diff >= 0);
+	if (irq_status & (0x1 << INTC_TIMER2_BIT_INDEX)) {
+		timer2_isr();
 }
-
-/*
- * This function is derived from PowerPC code (read timebase as long long).
- * On ARM it just returns the timer value.
- */
-unsigned long long get_ticks(void)
-{
-	return get_timer(0);
-}
-
-/*
- * This function is derived from PowerPC code (timebase clock frequency).
- * On ARM it returns the number of timer ticks per second.
- */
-ulong get_tbclk (void)
-{
-	ulong tbclk;
-
-	tbclk = CFG_HZ;
-	return tbclk;
+	return;
+#endif
+	printf ("interrupt request\n");
+	show_regs (pt_regs);
+	bad_mode ();
 }
 
-#endif /* CONFIG_INTEGRATOR */
diff -x CVS -w -ur u-boot-1.1.4/cpu/arm926ejs/start.S uboot-grocx/cpu/arm926ejs/start.S
--- u-boot-1.1.4/cpu/arm926ejs/start.S	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/cpu/arm926ejs/start.S	2008-04-22 20:01:49.000000000 +0200
@@ -98,6 +98,12 @@
 _armboot_start:
 	.word _start
 
+#if defined(CONFIG_GROCX)
+.globl _armboot_alloc_mem_end
+_armboot_alloc_mem_end:
+	.word ALLOC_MEM_END
+#endif
+
 /*
  * These are defined in the board-specific linker script.
  */
@@ -146,9 +152,17 @@
 #ifndef CONFIG_SKIP_RELOCATE_UBOOT
 relocate:				/* relocate U-Boot to RAM	    */
 	adr	r0, _start		/* r0 <- current position of code   */
+#if defined(CONFIG_GROCX)
+	ldr	r1, =0x20000000
+	ldr	r2, =0x76000000
+	ldr	r2, [r2]
+	cmp	r2, #0x1
+	beq     stack_setup		/* Skip reloc if already in RAM */
+#else
 	ldr	r1, _TEXT_BASE		/* test if we run from flash or RAM */
 	cmp     r0, r1                  /* don't reloc during debug         */
 	beq     stack_setup
+#endif
 
 	ldr	r2, _armboot_start
 	ldr	r3, _bss_start
@@ -160,11 +170,23 @@
 	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
 	cmp	r0, r2			/* until source end addreee [r2]    */
 	ble	copy_loop
+
+#if defined(CONFIG_GROCX)
+	// after copying u-boot
+	// remap DRAM from 0x20000000 to 0x00000000
+	ldr	r0, =0x76000000
+	mov	r1, #1
+	str	r1, [r0]
+#endif
 #endif	/* CONFIG_SKIP_RELOCATE_UBOOT */
 
 	/* Set up the stack						    */
 stack_setup:
+#if defined(CONFIG_GROCX)
+	ldr	r0, _armboot_alloc_mem_end
+#else
 	ldr	r0, _TEXT_BASE		/* upper 128 KiB: relocated uboot   */
+#endif
 	sub	r0, r0, #CFG_MALLOC_LEN	/* malloc area                      */
 	sub	r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
 #ifdef CONFIG_USE_IRQ
@@ -271,7 +293,7 @@
 	sub	sp, sp, #S_FRAME_SIZE
 	stmia	sp, {r0 - r12}	@ Save user registers (now in svc mode) r0-r12
 
-	ldr	r2, _armboot_start
+	ldr	r2, _armboot_alloc_mem_end
 	sub	r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
 	sub	r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
 	@ get values for "aborted" pc and cpsr (into parm regs)
@@ -305,7 +327,7 @@
 	.endm
 
 	.macro get_bad_stack
-	ldr	r13, _armboot_start		@ setup our mode stack
+	ldr	r13, _armboot_alloc_mem_end	@ setup our mode stack
 	sub	r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
 	sub	r13, r13, #(CFG_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack
 
@@ -393,24 +415,3 @@
 
 #endif
 
-# ifdef CONFIG_INTEGRATOR
-
-	/* Satisfied by Integrator routine (AP or CP) */
-
-#else
-
-	.align	5
-.globl reset_cpu
-reset_cpu:
-	ldr	r1, rstctl1	/* get clkm1 reset ctl */
-	mov	r3, #0x0
-	strh	r3, [r1]	/* clear it */
-	mov	r3, #0x8
-	strh	r3, [r1]	/* force dsp+arm reset */
-_loop_forever:
-	b	_loop_forever
-
-rstctl1:
-	.word	0xfffece10
-
-#endif /* #ifdef CONFIG_INTEGRATOR */
diff -x CVS -w -ur u-boot-1.1.4/drivers/dataflash.c uboot-grocx/drivers/dataflash.c
--- u-boot-1.1.4_dist/drivers/dataflash.c	2005-12-16 17:39:27.000000000 +0100
+++ u-boot-1.1.4/drivers/dataflash.c	2008-10-28 22:12:08.000000000 +0100
@@ -26,17 +26,15 @@
 AT91S_DATAFLASH_INFO dataflash_info[CFG_MAX_DATAFLASH_BANKS];
 static AT91S_DataFlash DataFlashInst;
 
-int cs[][CFG_MAX_DATAFLASH_BANKS] = {
-	{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */
-	{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3}
+int cs[CFG_MAX_DATAFLASH_BANKS][2] = {
+    {CFG_DATAFLASH_LOGIC_ADDR_CS0, 0},	/* Logical adress, CS */
 };
 
 /*define the area offsets*/
 dataflash_protect_t area_list[NB_DATAFLASH_AREA] = {
-	{0, 0x7fff, FLAG_PROTECT_SET},			/* ROM code */
-	{0x8000, 0x1ffff, FLAG_PROTECT_SET},		/* u-boot code */
-	{0x20000, 0x27fff, FLAG_PROTECT_CLEAR},		/* u-boot environment */
-	{0x28000, 0x1fffff, FLAG_PROTECT_CLEAR},	/* data area size to tune */
+	{    0x0,  0x4ffff, FLAG_PROTECT_CLEAR},	/* u-boot code */
+	{0x50000,  0x5ffff, FLAG_PROTECT_CLEAR},	/* u-boot environment */
+	{0x60000, 0x7fffff, FLAG_PROTECT_CLEAR},	/* data */
 };
 
 extern void AT91F_SpiInit (void);
@@ -63,48 +61,38 @@
 		dfcode = AT91F_DataflashProbe (cs[i][1], &dataflash_info[i].Desc);
 
 		switch (dfcode) {
-		case AT45DB161:
-			dataflash_info[i].Device.pages_number = 4096;
-			dataflash_info[i].Device.pages_size = 528;
-			dataflash_info[i].Device.page_offset = 10;
-			dataflash_info[i].Device.byte_mask = 0x300;
-			dataflash_info[i].Device.cs = cs[i][1];
-			dataflash_info[i].Desc.DataFlash_state = IDLE;
-			dataflash_info[i].logical_address = cs[i][0];
-			dataflash_info[i].id = dfcode;
-			break;
-
-		case AT45DB321:
-			dataflash_info[i].Device.pages_number = 8192;
-			dataflash_info[i].Device.pages_size = 528;
-			dataflash_info[i].Device.page_offset = 10;
-			dataflash_info[i].Device.byte_mask = 0x300;
-			dataflash_info[i].Device.cs = cs[i][1];
-			dataflash_info[i].Desc.DataFlash_state = IDLE;
-			dataflash_info[i].logical_address = cs[i][0];
-			dataflash_info[i].id = dfcode;
-			break;
-
-		case AT45DB642:
-			dataflash_info[i].Device.pages_number = 8192;
-			dataflash_info[i].Device.pages_size = 1056;
-			dataflash_info[i].Device.page_offset = 11;
-			dataflash_info[i].Device.byte_mask = 0x700;
-			dataflash_info[i].Device.cs = cs[i][1];
-			dataflash_info[i].Desc.DataFlash_state = IDLE;
-			dataflash_info[i].logical_address = cs[i][0];
-			dataflash_info[i].id = dfcode;
-			break;
-		case AT45DB128:
-			dataflash_info[i].Device.pages_number = 16384;
-			dataflash_info[i].Device.pages_size = 1056;
-			dataflash_info[i].Device.page_offset = 11;
-			dataflash_info[i].Device.byte_mask = 0x700;
-			dataflash_info[i].Device.cs = cs[i][1];
-			dataflash_info[i].Desc.DataFlash_state = IDLE;
-			dataflash_info[i].logical_address = cs[i][0];
-			dataflash_info[i].id = dfcode;
-			break;
+                case GENERIC_M25P32:
+                    dataflash_info[i].Device.pages_number = 16*1024;
+                    dataflash_info[i].Device.pages_size = 256;
+                    dataflash_info[i].Device.page_offset = 0;
+                    dataflash_info[i].Device.byte_mask = 0x0;
+                    dataflash_info[i].Device.cs = cs[i][0];
+                    dataflash_info[i].Desc.DataFlash_state = IDLE;
+                    dataflash_info[i].logical_address = cs[i][0];
+                    dataflash_info[i].id = dfcode;
+                    break;
+
+                case GENERIC_M25P64:
+                    dataflash_info[i].Device.pages_number = 32*1024;
+                    dataflash_info[i].Device.pages_size = 256;
+                    dataflash_info[i].Device.page_offset = 0;
+                    dataflash_info[i].Device.byte_mask = 0x0;
+                    dataflash_info[i].Device.cs = cs[i][0];
+                    dataflash_info[i].Desc.DataFlash_state = IDLE;
+                    dataflash_info[i].logical_address = cs[i][0];
+                    dataflash_info[i].id = dfcode;
+                    break;
+
+                case GENERIC_M25P128:
+                    dataflash_info[i].Device.pages_number = 64*1024;
+                    dataflash_info[i].Device.pages_size = 256;
+                    dataflash_info[i].Device.page_offset = 0;
+                    dataflash_info[i].Device.byte_mask = 0x0;
+                    dataflash_info[i].Device.cs = cs[i][0];
+                    dataflash_info[i].Desc.DataFlash_state = IDLE;
+                    dataflash_info[i].logical_address = cs[i][0];
+                    dataflash_info[i].id = dfcode;
+                    break;
 
 		default:
 			break;
@@ -131,24 +119,7 @@
 
 	for (i = 0; i < CFG_MAX_DATAFLASH_BANKS; i++) {
 		if (dataflash_info[i].id != 0) {
-			printf ("DataFlash:");
-			switch (dataflash_info[i].id) {
-			case AT45DB161:
-				printf ("AT45DB161\n");
-				break;
-
-			case AT45DB321:
-				printf ("AT45DB321\n");
-				break;
-
-			case AT45DB642:
-				printf ("AT45DB642\n");
-				break;
-			case AT45DB128:
-				printf ("AT45DB128\n");
-				break;
-			}
-
+                        printf ("DataFlash: Device Id %x\n", dataflash_info[i].id);
 			printf ("Nb pages: %6d\n"
 				"Page Size: %6d\n"
 				"Size=%8d bytes\n"
diff -x CVS -w -ur u-boot-1.1.4/drivers/e1000.c uboot-grocx/drivers/e1000.c
--- u-boot-1.1.4/drivers/e1000.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/drivers/e1000.c	2007-09-20 15:06:02.000000000 +0200
@@ -51,7 +51,11 @@
 
 #undef	virt_to_bus
 #define	virt_to_bus(x)	((unsigned long)x)
+#if defined(CONFIG_GROCX)
+#define bus_to_phys(devno, a)	(a)
+#else
 #define bus_to_phys(devno, a)	pci_mem_to_phys(devno, a)
+#endif
 #define mdelay(n)       udelay((n)*1000)
 
 #define E1000_DEFAULT_PBA    0x00000030
diff -x CVS -w -ur u-boot-1.1.4/drivers/eepro100.c uboot-grocx/drivers/eepro100.c
--- u-boot-1.1.4/drivers/eepro100.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/drivers/eepro100.c	2007-09-20 15:05:59.000000000 +0200
@@ -249,7 +249,7 @@
 static int eepro100_recv (struct eth_device *dev);
 static void eepro100_halt (struct eth_device *dev);
 
-#if defined(CONFIG_E500) || defined(CONFIG_DB64360) || defined(CONFIG_DB64460)
+#if defined(CONFIG_E500) || defined(CONFIG_DB64360) || defined(CONFIG_DB64460) || defined(CONFIG_GROCX)
 #define bus_to_phys(a) (a)
 #define phys_to_bus(a) (a)
 #else
diff -x CVS -w -ur u-boot-1.1.4/drivers/pci.c uboot-grocx/drivers/pci.c
--- u-boot-1.1.4/drivers/pci.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/drivers/pci.c	2007-09-20 15:05:58.000000000 +0200
@@ -341,7 +341,7 @@
 	}
 
 	/* Configure Cache Line Size Register */
-	pci_hose_write_config_byte (hose, dev, PCI_CACHE_LINE_SIZE, 0x08);
+	pci_hose_write_config_byte (hose, dev, PCI_CACHE_LINE_SIZE, 0x10);
 
 	/* Configure Latency Timer */
 	pci_hose_write_config_byte (hose, dev, PCI_LATENCY_TIMER, 0x80);
@@ -440,6 +440,10 @@
 		if (PCI_FUNC(dev) && !found_multi)
 			continue;
 
+#ifdef CONFIG_GROCX
+		udelay(1000);
+#endif
+
 		pci_hose_read_config_byte(hose, dev, PCI_HEADER_TYPE, &header_type);
 
 		pci_hose_read_config_word(hose, dev, PCI_VENDOR_ID, &vendor);
@@ -452,6 +456,9 @@
 			debug ("PCI Scan: Found Bus %d, Device %d, Function %d\n",
 				PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) );
 
+			printf("PCI Scan: Found Bus %d, Device %d, Function %d\n",
+				PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev) );
+
 			pci_hose_read_config_word(hose, dev, PCI_DEVICE_ID, &device);
 			pci_hose_read_config_word(hose, dev, PCI_CLASS_DEVICE, &class);
 
@@ -476,9 +483,13 @@
 
 			    pci_hose_read_config_byte(hose, dev, PCI_INTERRUPT_LINE,
 						      &int_line);
-			    printf("        %02x  %02x  %04x  %04x  %04x  %02x\n",
-				   PCI_BUS(dev), PCI_DEV(dev), vendor, device, class,
-				   int_line);
+
+				printf("==== PCI Device List Start ====\n");
+				printf("bus:%02x device:%02x function:%02x\n",
+					PCI_BUS(dev), PCI_DEV(dev), PCI_FUNC(dev));
+				printf("    vendor:%04x device_id:%04x class:%04x interrupt:%02x\n",
+					vendor, device, class, int_line);
+				printf("==== PCI Device List End ====\n");
 			}
 #endif
 		}
diff -x CVS -w -ur u-boot-1.1.4/drivers/rtl8139.c uboot-grocx/drivers/rtl8139.c
--- u-boot-1.1.4/drivers/rtl8139.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/drivers/rtl8139.c	2007-09-20 15:06:01.000000000 +0200
@@ -72,6 +72,9 @@
 */
 
 #include <common.h>
+#if defined(CONFIG_GROCX)
+#define __io
+#endif
 #include <malloc.h>
 #include <net.h>
 #include <asm/io.h>
@@ -104,8 +107,13 @@
 #undef DEBUG_RX
 
 #define currticks()	get_timer(0)
+#if defined(CONFIG_GROCX)
+#define bus_to_phys(a)	(a)
+#define phys_to_bus(a)	(a)
+#else
 #define bus_to_phys(a)	pci_mem_to_phys((pci_dev_t)dev->priv, a)
 #define phys_to_bus(a)	pci_phys_to_mem((pci_dev_t)dev->priv, a)
+#endif
 
 /* Symbolic offsets to registers. */
 enum RTL8139_registers {
@@ -479,7 +487,11 @@
 #endif
 
 	ring_offs = cur_rx % RX_BUF_LEN;
+#if defined(CONFIG_GROCX)
+	rx_status = *(unsigned int*)((rx_ring + ring_offs));
+#else
 	rx_status = *(unsigned int*)KSEG1ADDR((rx_ring + ring_offs));
+#endif
 	rx_size = rx_status >> 16;
 	rx_status &= 0xffff;
 
Only in uboot-grocx/include/asm-arm: arch-cetusplus
Only in uboot-grocx/include/asm-arm: arch-grocx
diff -x CVS -w -ur u-boot-1.1.4/include/asm-arm/io.h uboot-grocx/include/asm-arm/io.h
--- u-boot-1.1.4/include/asm-arm/io.h	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/include/asm-arm/io.h	2007-09-20 15:06:16.000000000 +0200
@@ -29,6 +29,10 @@
 #include <asm/arch/hardware.h>
 #endif	/* XXX###XXX */
 
+#if defined(CONFIG_GROCX)
+#define __mem_pci
+#endif
+
 /*
  * Generic virtual read/write.  Note that we don't support half-word
  * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
diff -x CVS -w -ur u-boot-1.1.4/include/asm-arm/mach-types.h uboot-grocx/include/asm-arm/mach-types.h
--- u-boot-1.1.4/include/asm-arm/mach-types.h	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/include/asm-arm/mach-types.h	2007-09-20 15:06:16.000000000 +0200
@@ -736,6 +736,8 @@
 #define MACH_TYPE_LN2410SBC            725
 #define MACH_TYPE_CB3RUFC              726
 #define MACH_TYPE_MP2USB               727
+#define MACH_TYPE_GROCX                1474
+#define MACH_TYPE_VSC5605EV            1956
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -9401,6 +9402,42 @@
 # define machine_is_mp2usb()	(0)
 #endif
 
+#ifdef CONFIG_MACH_STAR91XX
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type	__machine_arch_type
+# else
+#  define machine_arch_type	MACH_TYPE_STAR91XX
+# endif
+# define machine_is_adsportal()	(machine_arch_type == MACH_TYPE_ADSPORTAL)
+#else
+# define machine_is_adsportal()	(0)
+#endif
+
+#ifdef CONFIG_MACH_GROCX
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type	__machine_arch_type
+# else
+#  define machine_arch_type	MACH_TYPE_GROCX
+# endif
+# define machine_is_grocx()	(machine_arch_type == MACH_TYPE_GROCX)
+#else
+# define machine_is_grocx()	(0)
+#endif
+
+#ifdef CONFIG_MACH_VSC5605EV
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type	__machine_arch_type
+# else
+#  define machine_arch_type	MACH_TYPE_VSC5605EV
+# endif
+# define machine_is_vsc5605ev()	(machine_arch_type == MACH_TYPE_VSC5605EV)
+#else
+# define machine_is_vsc5605ev()	(0)
+#endif
+
 /*
  * These have not yet been registered
  */
diff -x CVS -w -ur u-boot-1.1.4/include/asm-arm/u-boot-arm.h uboot-grocx/include/asm-arm/u-boot-arm.h
--- u-boot-1.1.4/include/asm-arm/u-boot-arm.h	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/include/asm-arm/u-boot-arm.h	2007-09-20 15:06:16.000000000 +0200
@@ -31,6 +31,7 @@
 
 /* for the following variables, see start.S */
 extern ulong _armboot_start;	/* code start */
+extern ulong _armboot_alloc_mem_end;	/* free alloc mem end */
 extern ulong _bss_start;	/* code + data end == BSS start */
 extern ulong _bss_end;		/* BSS end */
 extern ulong IRQ_STACK_START;	/* top of IRQ stack */
@@ -58,5 +59,7 @@
 void	reset_timer_masked	(void);
 ulong	get_timer_masked	(void);
 void	udelay_masked		(unsigned long usec);
-
+#if defined(CONFIG_GROCX) && defined(CONFIG_USE_IRQ)
+ulong	get_sys_time		(void);
+#endif
 #endif	/* _U_BOOT_ARM_H_ */
Only in uboot-grocx/include/configs: grocx_scutum.h
diff -x CVS -w -ur u-boot-1.1.4/include/dataflash.h uboot-grocx/include/dataflash.h
--- u-boot-1.1.4/include/dataflash.h	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/include/dataflash.h	2007-09-20 14:56:46.000000000 +0200
@@ -107,6 +107,11 @@
 #define AT45DB642	0x3c
 #define AT45DB128	0x10
 
+#define GENERIC_M25P16	 (0x2015)
+#define GENERIC_M25P32	 (0x2016)
+#define GENERIC_M25P64	 (0x2017)
+#define GENERIC_M25P128 (0x2018)
+
 #define AT91C_DATAFLASH_TIMEOUT		10000	/* For AT91F_DataFlashWaitReady */
 
 /* DataFlash return value */
diff -x CVS -w -ur u-boot-1.1.4/include/flash.h uboot-grocx/include/flash.h
--- u-boot-1.1.4/include/flash.h	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/include/flash.h	2007-09-20 14:56:49.000000000 +0200
@@ -129,7 +129,7 @@
 #define TOSH_MANUFACT	0x00980098	/* TOSHIBA manuf. ID in D23..D16, D7..D0 */
 #define MT2_MANUFACT	0x002C002C	/* alternate MICRON manufacturer ID*/
 #define EXCEL_MANUFACT	0x004A004A	/* Excel Semiconductor			*/
-
+#define EON_MANUFACT	0x007F007F	/* EON					*/
 					/* Micron Technologies (INTEL compat.)	*/
 #define MT_ID_28F400_T	0x44704470	/* 28F400B3 ID ( 4 M, top boot sector)	*/
 #define MT_ID_28F400_B	0x44714471	/* 28F400B3 ID ( 4 M, bottom boot sect) */
@@ -182,6 +182,10 @@
 #define MX_ID_LV320T	0x22A722A7	/* 29LV320T by Macronix, AMD compatible */
 #define AMD_ID_LV320B	0x22F922F9	/* 29LV320B ID (32 M, bottom boot sect) */
 #define MX_ID_LV320B	0x22A822A8	/* 29LV320B by Macronix, AMD compatible */
+#define MX_ID_LV640BT	0x22C922C9	/* 29LV640BT by Macronix, AMD compatible */
+#define MX_ID_LV640BB	0x22CB22CB	/* 29LV640BB by Macronix, AMD compatible */
+
+#define EON_ID_LV640H	0x227E227E	/* 29LV640H by EON, AMD compatible	*/
 
 #define AMD_ID_DL322T	0x22552255	/* 29DL322T ID (32 M, top boot sector)	*/
 #define AMD_ID_DL322B	0x22562256	/* 29DL322B ID (32 M, bottom boot sect) */
@@ -286,6 +290,11 @@
 #define TOSH_ID_FVT160	0xC2		/* TC58FVT160 ID (16 M, top )		*/
 #define TOSH_ID_FVB160	0x43		/* TC58FVT160 ID (16 M, bottom )	*/
 
+#define AMD_ID_AM29LV128M	0x007E1200	/* AMD AM29LV128M		*/
+#define SPANSION_ID_S29GL064A	0x007E1001	/* Spansion S29GL064A		*/
+#define SPANSION_ID_S29GL064AR4 0x007E1000 /* Spansion S29GL064AR4		*/
+#define MX_ID_29LV640BT		0x000000C9	/* MX 29LV640BT			*/
+
 /*-----------------------------------------------------------------------
  * Internal FLASH identification codes
  *
@@ -391,6 +399,9 @@
 #define FLASH_AMLV256U	0x00AA		/* AMD 29LV256M	   ( 256M = 16M x 16 )	*/
 #define FLASH_MXLV320B	0x00AB		/* MX  29LV320MB   ( 32M = 2M x 16 )	*/
 #define FLASH_MXLV320T	0x00AC		/* MX  29LV320MT   ( 32M = 2M x 16 )	*/
+#define FLASH_MXLV640BT	0x00C9		/* MX  29LV640BT   ( 64M = 4M x 16 )	*/
+#define FLASH_MXLV640BB	0x00CB		/* MX  29LV640BB   ( 64M = 4M x 16 )	*/
+#define FLASH_ENLV640H	0x007E		/* EON 29LV640H    ( 64M = 4M x 16 )	*/
 #define FLASH_28F256L18T 0x00B0		/* Intel 28F256L18T 256M = 128K x 255 + 32k x 4 */
 #define FLASH_AMDL163T	0x00B2		/* AMD AM29DL163T (2M x 16 )			*/
 #define FLASH_AMDL163B	0x00B3
@@ -406,6 +417,10 @@
 #define FLASH_MT28S4M16LC 0x00E1	/* Micron MT28S4M16LC			*/
 #define FLASH_S29GL064M 0x00F0		/* Spansion S29GL064M-R6		*/
 
+#define FLASH_S29GL064A		0x7E10	/* Spansion S29GL064A			*/
+#define FLASH_AM29LV128M	0x7E12	/* AMD AM29LV128M			*/
+#define FLASH_MX29LV640BT	0x00C9	/* MX 29LV640BT				*/
+
 #define FLASH_UNKNOWN	0xFFFF		/* unknown flash type			*/
 
 
@@ -423,7 +438,7 @@
 #define FLASH_MAN_MT	0x00400000
 #define FLASH_MAN_SHARP 0x00500000
 #define FLASH_MAN_ATM	0x00600000
-
+#define FLASH_MAN_EON	0x00700000
 
 #define FLASH_TYPEMASK	0x0000FFFF	/* extract FLASH type	information	*/
 #define FLASH_VENDMASK	0xFFFF0000	/* extract FLASH vendor information	*/
diff -x CVS -w -ur u-boot-1.1.4/lib_arm/armlinux.c uboot-grocx/lib_arm/armlinux.c
--- u-boot-1.1.4/lib_arm/armlinux.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/lib_arm/armlinux.c	2008-04-25 16:22:10.000000000 +0200
@@ -378,12 +378,18 @@
 #endif /* CONFIG_VFD || CONFIG_LCD */
 
 #ifdef CONFIG_SERIAL_TAG
+static void get_board_serial(struct tag_serialnr *serialnr)
+{
+    const char *serial = getenv("board_serial");
+    serialnr->low = serialnr->high = 0;
+    if(serial)
+        serialnr->low = simple_strtoul(serial, NULL, 10);
+}
+
 void setup_serial_tag (struct tag **tmp)
 {
 	struct tag *params = *tmp;
 	struct tag_serialnr serialnr;
-	void get_board_serial(struct tag_serialnr *serialnr);
-
 	get_board_serial(&serialnr);
 	params->hdr.tag = ATAG_SERIAL;
 	params->hdr.size = tag_size (tag_serialnr);
diff -x CVS -w -ur u-boot-1.1.4/lib_arm/board.c uboot-grocx/lib_arm/board.c
--- u-boot-1.1.4/lib_arm/board.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/lib_arm/board.c	2008-04-25 23:21:10.000000000 +0200
@@ -122,6 +122,20 @@
 	printf ("\n\n%s\n\n", version_string);
 	printf ("U-Boot code: %08lX -> %08lX  BSS: -> %08lX\n",
 		_armboot_start, _bss_start, _bss_end);
+#ifdef CONFIG_GROCX
+	{
+		extern u32 PLL_clock;
+		extern u32 CPU_clock;
+		extern u32 AHB_clock;
+		extern u32 APB_clock;
+
+		printf("PLL clock at %dMHz\n", PLL_clock / 1000000);
+		printf("CPU clock at %dMHz\n", CPU_clock / 1000000);
+		printf("AHB clock at %dMHz\n", AHB_clock / 1000000);
+		printf("APB clock at %dMHz\n", APB_clock / 1000000);
+	}
+#endif
+
 #ifdef CONFIG_MODEM_SUPPORT
 	puts ("Modem Support enabled\n");
 #endif
@@ -130,6 +144,10 @@
 	printf ("FIQ Stack: %08lx\n", FIQ_STACK_START);
 #endif
 
+#ifdef CONFIG_PCI
+	pci_init();
+#endif
+
 	return (0);
 }
 
@@ -173,6 +191,33 @@
  * can relocate the monitor code to RAM.
  */
 
+#if defined(CONFIG_GROCX)
+static void gen_mac(unsigned char *mac)
+{
+    static unsigned char base[6] = { CONFIG_ETHADDR_BASE };
+    const char *serial = getenv("board_serial");
+    unsigned long serialnr = 1;
+    unsigned long fixup;
+
+    if(serial)
+        serialnr = simple_strtoul(serial, NULL, 10);
+
+    fixup = 
+        (base[2] << 24) +
+        (base[3] << 16) +
+        (base[4] <<  8) +
+        (base[5] <<  0) ;
+    fixup += (serialnr-1) * 8; /* 8 Mac addrs/board */
+
+    mac[0] = base[0];
+    mac[1] = base[1];
+    mac[2] = 0xff & (fixup >> 24);
+    mac[3] = 0xff & (fixup >> 16);
+    mac[4] = 0xff & (fixup >>  8);
+    mac[5] = 0xff & (fixup >>  0);
+}
+#endif  /* GROCX */
+
 /*
  * All attempts to come up with a "common" initialization sequence
  * that works for all boards and architectures failed: some of the
@@ -216,7 +261,7 @@
 #endif
 
 	/* Pointer is writable since we allocated a register for it */
-	gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
+	gd = (gd_t*)(_armboot_alloc_mem_end - CFG_MALLOC_LEN - sizeof(gd_t));
 	/* compiler optimization barrier needed for GCC >= 3.4 */
 	__asm__ __volatile__("": : :"memory");
 
@@ -226,6 +271,13 @@
 
 	monitor_flash_len = _bss_start - _armboot_start;
 
+#ifdef CONFIG_GROCX
+	{
+		extern void grocx_early_init(void);
+		grocx_early_init();
+	}
+#endif
+
 	for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
 		if ((*init_fnc_ptr)() != 0) {
 			hang ();
@@ -263,7 +315,7 @@
 #endif /* CONFIG_LCD */
 
 	/* armboot_start is defined in the board-specific linker script */
-	mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);
+	mem_malloc_init (_armboot_alloc_mem_end - CFG_MALLOC_LEN);
 
 #if (CONFIG_COMMANDS & CFG_CMD_NAND)
 	puts ("NAND:");
@@ -286,6 +338,18 @@
 	/* IP Address */
 	gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
 
+#if defined(CONFIG_GROCX)
+        if(getenv("board_serial")) {
+            unsigned char mac[6];
+            unsigned char mace[32];
+            gen_mac(mac);
+            sprintf(mace, "%02x:%02x:%02x:%02x:%02x:%02x",
+                    mac[0],mac[1],mac[2],
+                    mac[3],mac[4],mac[5]);
+            setenv("ethaddr", mace);
+        }
+#endif /* defined(CONFIG_GROCX) */
+
 	/* MAC Address */
 	{
 		int i;
@@ -351,6 +415,13 @@
 #endif
 	eth_initialize(gd->bd);
 #endif
+#if defined(CONFIG_GROCX) && defined(CONFIG_USE_IRQ)
+	{
+		extern void vtss_config_start(void);
+		vtss_config_start();
+	}
+#endif
+
 	/* main_loop() can return to retry autoboot, if so just run it again. */
 	for (;;) {
 		main_loop ();
diff -x CVS -w -ur u-boot-1.1.4/net/eth.c uboot-grocx/net/eth.c
--- u-boot-1.1.4/net/eth.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/net/eth.c	2007-09-20 15:08:11.000000000 +0200
@@ -53,7 +53,9 @@
 extern int scc_initialize(bd_t*);
 extern int skge_initialize(bd_t*);
 extern int tsec_initialize(bd_t*, int, char *);
-
+#ifdef CONFIG_GROCX
+extern int star_gsw_initialize(bd_t*);
+#endif
 static struct eth_device *eth_devices, *eth_current;
 
 struct eth_device *eth_get_dev(void)
@@ -231,6 +233,9 @@
 #if defined(CONFIG_RTL8169)
 	rtl8169_initialize(bis);
 #endif
+#if defined(CONFIG_GROCX) && defined(CONFIG_STAR_GSW)
+	star_gsw_initialize(bis);
+#endif
 
 	if (!eth_devices) {
 		puts ("No ethernet found.\n");
diff -x CVS -w -ur u-boot-1.1.4/net/net.c uboot-grocx/net/net.c
--- u-boot-1.1.4/net/net.c	2005-12-16 17:39:27.000000000 +0100
+++ uboot-grocx/net/net.c	2007-09-20 14:59:08.000000000 +0200
@@ -1375,7 +1375,7 @@
 #ifdef ET_DEBUG
 		printf("len=%d, v=%02x\n", len, ip->ip_hl_v & 0xff);
 #endif
-		if ((ip->ip_hl_v & 0xf0) != 0x40) {
+		if ((ip->ip_hl_v & 0xff) != 0x45) {
 			return;
 		}
 		if (ip->ip_off & htons(0x1fff)) { /* Can't deal w/ fragments */
