Commit 1f6d4258 authored by wdenk's avatar wdenk

Work around for Ethernet problems on Xaeniax board

parent 983fda83
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
Changes since U-Boot 1.1.1: Changes since U-Boot 1.1.1:
====================================================================== ======================================================================
* Work around for Ethernet problems on Xaeniax board
* Patch by TsiChung Liew, 23 Sep 2004: * Patch by TsiChung Liew, 23 Sep 2004:
- add support for MPC8220 CPU - add support for MPC8220 CPU
- Add support for Alaska and Yukon boards - Add support for Alaska and Yukon boards
......
...@@ -640,8 +640,15 @@ again: ...@@ -640,8 +640,15 @@ again:
} }
/* we have a packet address, so tell the card to use it */ /* we have a packet address, so tell the card to use it */
#ifndef CONFIG_XAENIAX
SMC_outb (packet_no, PN_REG); 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 */ /* do not write new ptr value if Write data fifo not empty */
while ( saved_ptr & PTR_NOTEMPTY ) while ( saved_ptr & PTR_NOTEMPTY )
printf ("Write data fifo not empty!\n"); printf ("Write data fifo not empty!\n");
...@@ -702,7 +709,9 @@ again: ...@@ -702,7 +709,9 @@ again:
/* release packet */ /* release packet */
/* no need to release, MMU does that now */ /* 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) */ /* wait for MMU getting ready (low) */
while (SMC_inw (MMU_CMD_REG) & MC_BUSY) { while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
...@@ -722,7 +731,9 @@ again: ...@@ -722,7 +731,9 @@ again:
/* release packet */ /* release packet */
/* no need to release, MMU does that now */ /* 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) */ /* wait for MMU getting ready (low) */
while (SMC_inw (MMU_CMD_REG) & MC_BUSY) { while (SMC_inw (MMU_CMD_REG) & MC_BUSY) {
...@@ -735,7 +746,15 @@ again: ...@@ -735,7 +746,15 @@ again:
} }
/* restore previously saved registers */ /* restore previously saved registers */
#ifndef CONFIG_XAENIAX
SMC_outb( saved_pnr, PN_REG ); 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 ); SMC_outw( saved_ptr, PTR_REG );
return length; return length;
...@@ -913,7 +932,15 @@ static int smc_rcv() ...@@ -913,7 +932,15 @@ static int smc_rcv()
udelay(1); /* Wait until not busy */ udelay(1); /* Wait until not busy */
/* restore saved registers */ /* restore saved registers */
#ifndef CONFIG_XAENIAX
SMC_outb( saved_pnr, PN_REG ); 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 ); SMC_outw( saved_ptr, PTR_REG );
if (!is_error) { if (!is_error) {
......
...@@ -85,6 +85,19 @@ typedef unsigned long int dword; ...@@ -85,6 +85,19 @@ typedef unsigned long int dword;
if (__p & 2) __v >>= 8; \ if (__p & 2) __v >>= 8; \
else __v &= 0xff; \ else __v &= 0xff; \
__v; }) __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 #else
#define SMC_inl(r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r)))) #define SMC_inl(r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r))))
#define SMC_inw(r) (*((volatile word *)(SMC_BASE_ADDRESS+(r)))) #define SMC_inw(r) (*((volatile word *)(SMC_BASE_ADDRESS+(r))))
...@@ -99,6 +112,15 @@ typedef unsigned long int dword; ...@@ -99,6 +112,15 @@ typedef unsigned long int dword;
#ifdef CONFIG_XSENGINE #ifdef CONFIG_XSENGINE
#define SMC_outl(d,r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r<<1))) = d) #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) #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 #else
#define SMC_outl(d,r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r))) = d) #define SMC_outl(d,r) (*((volatile dword *)(SMC_BASE_ADDRESS+(r))) = d)
#define SMC_outw(d,r) (*((volatile word *)(SMC_BASE_ADDRESS+(r))) = d) #define SMC_outw(d,r) (*((volatile word *)(SMC_BASE_ADDRESS+(r))) = d)
......
...@@ -181,7 +181,7 @@ ...@@ -181,7 +181,7 @@
* SMSC91C111 Network Card * SMSC91C111 Network Card
*/ */
#define CONFIG_DRIVER_SMC91111 1 #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 */ #define CONFIG_SMC_USE_32_BIT 1 /* 32 bit bus */
#undef CONFIG_SMC_91111_EXT_PHY /* we use internal phy */ #undef CONFIG_SMC_91111_EXT_PHY /* we use internal phy */
#undef CONFIG_SHOW_ACTIVITY #undef CONFIG_SHOW_ACTIVITY
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment