Work around for Ethernet problems on Xaeniax board
diff --git a/CHANGELOG b/CHANGELOG
index 693ead4..83344c7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,8 @@
 Changes since U-Boot 1.1.1:
 ======================================================================
 
+* Work around for Ethernet problems on Xaeniax board
+
 * Patch by TsiChung Liew, 23 Sep 2004:
   - add support for MPC8220 CPU
   - Add support for Alaska and Yukon boards
diff --git a/drivers/smc91111.c b/drivers/smc91111.c
index 44ce60b..69cbb17 100644
--- a/drivers/smc91111.c
+++ b/drivers/smc91111.c
@@ -640,8 +640,15 @@
 	}
 
 	/* we have a packet address, so tell the card to use it */
+#ifndef CONFIG_XAENIAX
 	SMC_outb (packet_no, PN_REG);
-
+#else
+	/* On Xaeniax board, we can't use SMC_outb here because that way
+	 * the Allocate MMU command will end up written to the command register
+	 * as well, which will lead to a problem.
+	 */
+	SMC_outl (packet_no << 16, 0);
+#endif
 	/* do not write new ptr value if Write data fifo not empty */
 	while ( saved_ptr & PTR_NOTEMPTY )
 		printf ("Write data fifo not empty!\n");
@@ -702,7 +709,9 @@
 
 		/* release packet */
 		/* no need to release, MMU does that now */
-		/* SMC_outw (MC_FREEPKT, MMU_CMD_REG); */
+#ifdef CONFIG_XAENIAX
+		 SMC_outw (MC_FREEPKT, MMU_CMD_REG);
+#endif
 
 		/* wait for MMU getting ready (low) */
 		while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
@@ -722,7 +731,9 @@
 
 		/* release packet */
 		/* no need to release, MMU does that now */
-		/* SMC_outw (MC_FREEPKT, MMU_CMD_REG); */
+#ifdef CONFIG_XAENIAX
+		SMC_outw (MC_FREEPKT, MMU_CMD_REG);
+#endif
 
 		/* wait for MMU getting ready (low) */
 		while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
@@ -735,7 +746,15 @@
 	}
 
 	/* restore previously saved registers */
+#ifndef CONFIG_XAENIAX
 	SMC_outb( saved_pnr, PN_REG );
+#else
+	/* On Xaeniax board, we can't use SMC_outb here because that way
+	 * the Allocate MMU command will end up written to the command register
+	 * as well, which will lead to a problem.
+	 */
+	SMC_outl(saved_pnr << 16, 0);
+#endif
 	SMC_outw( saved_ptr, PTR_REG );
 
 	return length;
@@ -913,7 +932,15 @@
 		udelay(1); /* Wait until not busy */
 
 	/* restore saved registers */
+#ifndef CONFIG_XAENIAX
 	SMC_outb( saved_pnr, PN_REG );
+#else
+	/* On Xaeniax board, we can't use SMC_outb here because that way
+	 * the Allocate MMU command will end up written to the command register
+	 * as well, which will lead to a problem.
+	 */
+	SMC_outl( saved_pnr << 16, 0);
+#endif
 	SMC_outw( saved_ptr, PTR_REG );
 
 	if (!is_error) {
diff --git a/drivers/smc91111.h b/drivers/smc91111.h
index 0b6dfeb..cf08582 100644
--- a/drivers/smc91111.h
+++ b/drivers/smc91111.h
@@ -85,6 +85,19 @@
 	if (__p & 2) __v >>= 8; \
 	else __v &= 0xff; \
 	__v; })
+#elif defined(CONFIG_XAENIAX)
+#define SMC_inl(r)	(*((volatile dword *)(SMC_BASE_ADDRESS+(r))))
+#define SMC_inw(z)	({ \
+	unsigned int __p = (unsigned int)(SMC_BASE_ADDRESS + (z)); \
+	unsigned int __v = *(volatile unsigned int *)((__p) & ~3); \
+	if (__p & 3) __v >>= 16; \
+	else __v &= 0xffff; \
+	__v; })
+#define SMC_inb(p)	({ \
+	unsigned int ___v = SMC_inw((p) & ~1); \
+	if (p & 1) ___v >>= 8; \
+	else ___v &= 0xff; \
+	___v; })
 #else
 #define	SMC_inl(r) 	(*((volatile dword *)(SMC_BASE_ADDRESS+(r))))
 #define	SMC_inw(r) 	(*((volatile word *)(SMC_BASE_ADDRESS+(r))))
@@ -99,6 +112,15 @@
 #ifdef CONFIG_XSENGINE
 #define	SMC_outl(d,r)	(*((volatile dword *)(SMC_BASE_ADDRESS+(r<<1))) = d)
 #define	SMC_outw(d,r)	(*((volatile word *)(SMC_BASE_ADDRESS+(r<<1))) = d)
+#elif defined (CONFIG_XAENIAX)
+#define SMC_outl(d,r)	(*((volatile dword *)(SMC_BASE_ADDRESS+(r))) = d)
+#define SMC_outw(d,p)	({ \
+	dword __dwo = SMC_inl((p) & ~3); \
+	dword __dwn = (word)(d); \
+	__dwo &= ((p) & 3) ? 0x0000ffff : 0xffff0000; \
+	__dwo |= ((p) & 3) ? __dwn << 16 : __dwn; \
+	SMC_outl(__dwo, (p) & ~3); \
+})
 #else
 #define	SMC_outl(d,r)	(*((volatile dword *)(SMC_BASE_ADDRESS+(r))) = d)
 #define	SMC_outw(d,r)	(*((volatile word *)(SMC_BASE_ADDRESS+(r))) = d)
diff --git a/include/configs/xaeniax.h b/include/configs/xaeniax.h
index a7b695d..9b8a596 100644
--- a/include/configs/xaeniax.h
+++ b/include/configs/xaeniax.h
@@ -181,7 +181,7 @@
  * SMSC91C111 Network Card
  */
 #define CONFIG_DRIVER_SMC91111		1
-#define CONFIG_SMC91111_BASE		0x0C00030  /* chip select 3         */
+#define CONFIG_SMC91111_BASE		0x10000300  /* chip select 3         */
 #define CONFIG_SMC_USE_32_BIT		1          /* 32 bit bus  */
 #undef  CONFIG_SMC_91111_EXT_PHY		   /* we use internal phy   */
 #undef  CONFIG_SHOW_ACTIVITY