From 1f6d4258c25bc41ce8404d3485ace1989f796a2f Mon Sep 17 00:00:00 2001 From: wdenk Date: Tue, 2 Nov 2004 13:00:33 +0000 Subject: Work around for Ethernet problems on Xaeniax board --- CHANGELOG | 2 ++ drivers/smc91111.c | 33 ++++++++++++++++++++++++++++++--- drivers/smc91111.h | 22 ++++++++++++++++++++++ include/configs/xaeniax.h | 2 +- 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 693ead40c3..83344c711c 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 44ce60b1f0..69cbb1713d 100644 --- a/drivers/smc91111.c +++ b/drivers/smc91111.c @@ -640,8 +640,15 @@ again: } /* 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 @@ again: /* 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 @@ again: /* 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 @@ again: } /* 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 @@ static int smc_rcv() 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 0b6dfeb0d4..cf08582fbf 100644 --- a/drivers/smc91111.h +++ b/drivers/smc91111.h @@ -85,6 +85,19 @@ typedef unsigned long int dword; 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 @@ typedef unsigned long int dword; #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 a7b695dda7..9b8a596920 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 -- cgit v1.2.3